Mybatis의 구성요소

강민석·2022년 8월 7일
0

DB

목록 보기
2/4

이번 시간에는 mybatis의 동작을 이해하기위해 mybatis 공식 홈페이지를 참고해 정리를 해보려고 한다.

개발자가 알아야할 요소

먼저 개발자가 mybatis사용에 있어 알고있어야 할 요소들과 생명주기에 대해서 정리를 해보려고 한다.

SqlSession

가장 먼저 소개할 요소는 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

SqlSessionFactory는 이름에서 알 수 있듯 SqlSession을 만들기 위한 클래스이다.

openSession()을 사용해 SqlSession을 가져올 수 있으며 autoCommit의 사용유무와 ExecutorType과 Transactional Level에 따른 메소드가 오버로딩 되어 있다. SqlSessionFactory docs

DataSource

데이터베이스로부터 Connection 인스턴스를 가지고오기위한 정보를 담고 있다. mybaits의 DataSource는 표준 JDBC DataSource 인터페이스를 사용한다.

스프링에서는 Configuration의 형태로 입력을 받으며 아래와 같은 정보들을 포함한다.

  • driver: 데이터베이스와 통신을 담당하는 클래스 ex) oracle.jdbc.OracleDriver
  • url: 데이터베이스 연결을 위한 식별 값. driver에 따라 그 형식이 다름
  • username: 데이터베이스 접속정보
  • password: 데이터베이스 접속정보
  • hikari: 데이터에비스 커넥션을 관리해주는 도구. Pool로서의 기능을 제공하며 Hikari CP(Connection Pool)이라고 부른다. 설정된 풀의 크기만큼 커넥션을 허용하며 데이터베이스에 순차적으로 요청을 보내준다. hikari CP는 Spring boot 2.0부터 default가 되었다.

요소들의 생명주기

  • SqlSession:
    SqlSession의 경우, 사용하는 쓰레드마다 인스턴스를 가지고 사용하게 된다. 때문에 공유되지 않으며 thread safe하지도 않다. 그러므로 SqlSession을 static필드나 클래스의 필드로 지정하는 것은 위험하다. SqlSession의 생명주기는 각 쓰레드마다, 응답의 결과를 받기까지로 짧다. 때문에 닫힌 것을 확인하는 것 또한 중요하며 정의를 보면 Closeable을 확장한 것을 확인할 수 있다.(Spring boot를 사용 할 경우, SqlSession을 개발자가 관리하지 않고 Context에 책임을 위임할 수 있다.)
  • SqlSessionFactory:
    SqlSessionFactory는 삭제하거나 재생성을 할 필요가 없으므로, 싱글턴 패턴을 사용하는 것이 좋다. 실제로 Spring에서는 SqlSessionFacotoryBean의 형태로 관리한다.
  • Mapper 인스턴스: Mapper는 mapping statement를 바인딩하기 위해 사용되며, SqlSession에서 인스턴스를 생성한다. 따라서 SqlSession과 동일한 생명주기를 가지게 된다. Mapper인스턴스가 사용되는 메소드가 호출되면 생성 후 삭제되므로 명시적으로 닫을 필요는 없다.

실제로 mybatis의 내부에서 사용되는 Class들은 더 많고 다양하지만, 개발자에게 인터페이스로 제공되는 내용들에서는 위의 내용들이 중요하다고 생각이 되어 정리를 해보았다.

다음 시간에는 Spring에서 mybatis를 위해 어떤 기능을 제공하는지, BATCH의 수행 등에 대해서 정리하도록 하겠다.

0개의 댓글