예전 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 사이트가면 예제도 있고 설명도 있으니 참고 하면 되겠다.