이번 시간에는 mybatis의 동작을 이해하기위해 mybatis 공식 홈페이지를 참고해 정리를 해보려고 한다.
먼저 개발자가 mybatis사용에 있어 알고있어야 할 요소들과 생명주기에 대해서 정리를 해보려고 한다.
가장 먼저 소개할 요소는 SqlSession이다. SqlSession은 데이터베이스에 SQL명령어를 실행하기 위한 메소드들을 가지고있는 Interface이다. SqlSession Interface docs
SqlSession의 메소드들을 확인해보면 다양한 방식으로 정의된 insert, select, update부터 rollback()
, getConnection()
, commit()
과 같은 mybatis를 이용해 데이터베이스를 조작하고 정보를 얻기위한 다양한 메소드들이 정의되어있다.
이런 SqlSession을 생성하기위해 우리는 SqlSessionFactory를 사용하게되며, 이에 대한 내용은 SqlSessionFactory파트에서 다루도록 하겠다.
Sql의 수행의 경우, 아래와 같은 예시로 이루어진다.
1. SqlSession의 메소드에 전달될 mapping statement을 xml에 작성
<mapper namespace="org.daou.example.MovieMapper">
<select id="selectMovie" resultType="Movie">
select * from Movie where movie_no = #{movieNo}
</select>
</mapper>
2-A. mapping statement을 파라미터로 받는 메소드를 활용해 xml의 매핑구문을 명시
Movie = (Movie) session.selectOne("org.daou.example.MovieMapper.selectMovie", 1);
2-B. mapper 인터페이스를 사용하는 방법
MoviMapper mapper = session.getMapper(MovieMapper.class);
Movie movie = mapper.selectMovie(1);
위의 방식은 xml내 mapping statement를 사용하는 방식들이며, @Select
, @Update
, @Repository
등의 annotation을 통해 Interface를 생성하고 repository로 사용하는 방식 또한 존재한다.
SqlSessionFactory는 이름에서 알 수 있듯 SqlSession을 만들기 위한 클래스이다.
openSession()
을 사용해 SqlSession을 가져올 수 있으며 autoCommit의 사용유무와 ExecutorType과 Transactional Level에 따른 메소드가 오버로딩 되어 있다. SqlSessionFactory docs
데이터베이스로부터 Connection 인스턴스를 가지고오기위한 정보를 담고 있다. mybaits의 DataSource는 표준 JDBC DataSource 인터페이스를 사용한다.
스프링에서는 Configuration의 형태로 입력을 받으며 아래와 같은 정보들을 포함한다.
Closeable
을 확장한 것을 확인할 수 있다.(Spring boot를 사용 할 경우, SqlSession을 개발자가 관리하지 않고 Context에 책임을 위임할 수 있다.) SqlSessionFacotoryBean
의 형태로 관리한다.실제로 mybatis의 내부에서 사용되는 Class들은 더 많고 다양하지만, 개발자에게 인터페이스로 제공되는 내용들에서는 위의 내용들이 중요하다고 생각이 되어 정리를 해보았다.
다음 시간에는 Spring에서 mybatis를 위해 어떤 기능을 제공하는지, BATCH의 수행 등에 대해서 정리하도록 하겠다.