ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • spring boot mybatis
    카테고리 없음 2023. 4. 21. 15:27
    예전 si 할 때는 mybatis 를 많이 썼는데 요즘은 jpa 하이버네이트를 자주 쓰기에 별루 신경 쓰지 않았다. 나중에 혹시 쓸일이 있다면 쓰겠는데 그닥 쓸일은 없을 거 같지만... 그래도 혹시나 쓸일이 생기면 써야지.. Spring 에서는 지원하지 않고 mybatis가 만든 spring-boot-starter가 있다. 그걸 이용해서 사용하면 된다. 메이븐을 통해 디펜더시를 받자.
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>1.1.1</version>
    </dependency>
    
    저기 안에는 mybatis autoconfiguration 도 디펜더시 하고 있다. 그럼 한번 살펴보자. 일단 config부터 보자.
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <typeAliases>
            <package name="me.wonwoo.mybatis.domain"/>
        </typeAliases>
        <mappers>
            <mapper resource="mapper/AccountMapper.xml"/>
        </mappers>
    </configuration>
    
    package는 필자의 도메인 클래스 패키지를 넣어고 sql이 있는 mapper 경로도 지정해줬다. 해당 클래스를 로딩하려면 application.properties 에 설정을 해야한다.
    mybatis.config-location=classpath:mybatisConfig.xml
    
    mybatis.config-location 라는 프로퍼티에 해당하는 해당하는 경로를 넣어 주면 된다. 일단 이렇게 설정은 다 되었다. mybatis 또한 쉽게 설정 가능하다. 아래는 도메인 클래스이다.
    @Data
    public class Account {
      private Long id;
    
      private String name;
    
      private String email;
    }
    
    일반적인 도메인 클래스이다. id와 name, email을 담고 있다. 다음은 mapper를 살펴보자.
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <mapper namespace="me.wonwoo.mybatis.mapper.AccountMapper">
        <select id="findByname" resultType="Account">
            select * from ACCOUNT where name = #{name}
        </select>
    
        <select id="findByemail" resultType="Account">
            select * from ACCOUNT where EMAIL = #{email}
        </select>
    </mapper>
    
    실질적으로 sql이 있다. namespace를 저렇게 한 이유는 아래에서 설명 하겠다. 다음으로는 repository를 보자.
    @Repository
    public class AccountDao {
    
      @Autowired
      private SqlSession sqlSession;
    
      public Account findByname(String name) {
        return this.sqlSession.selectOne("me.wonwoo.mybatis.mapper.AccountMapper.findByname", name);
      }
    }
    
    SqlSession을 Autowired 받으면 된다. 다 알겠지만 me.wonwoo.mybatis.mapper.AccountMapper는 생략해도 된다. 테스트를 해보면 잘 될것이다. 다음은 mybatis에서 @Mapper라는 어노테이션을 지원해주는데 위보다 좀 더 간편하게 사용할 수 있다.
    @Mapper
    public interface AccountMapper {
      Account findByemail(String email);
    }
    
    현재 필자가 AccountMapper 클래스의 패지지가 me.wonwoo.mybatis.mapper 아래 있어서 namespace를 저렇게 지정한 이유이다. namespace 명과 해당하는 경로가 일치해야 동작한다. me.wonwoo.mybatis.mapper.AccountMapper.findByemail 와 maaper.xml에 설정한 namespace + id가 일치해야 한다는 것이다. namespace + id를 합치면 me.wonwoo.mybatis.mapper.AccountMapper.findByemail 이와 같이 같은 패키지명이 나온다. 마이바티스에서 지원하는 마지막방법이다. 이건 spring의 @Query 어노테이션과 비슷하다. 거의 똑같은거 같다.
    @Mapper
    public interface AccountMapper {
    
      @Select("SELECT * FROM ACCOUNT WHERE id = #{id}")
      Account findById(@Param("id") Long id);
    }
    
    @Query와 다른 점이 있다면 @Query같은 경우에는 서버를 기동시에라도 발리데이션을 체크해 에러를 내뱉지만 마이바티스의 @Select인 경우에는 실제 런타임시 에러를 내뱉는다. @Query가 좀더 낫다. 뿐만아니라 위에 설명 했던 것들 모두 sql syntax 맞지 않을 경우에는 런타임시 밖에 체크가 되지 않는다. 나중에 통계 데이터나 엄청엄청 복잡한 SQL 아닌 이상은 쓸일이 없을 거 같지만 그래도 한번 알아보는 시간을 가졌다. mybatis 사이트가면 예제도 있고 설명도 있으니 참고 하면 되겠다.

    댓글

Designed by Tistory.