2018년 11월 26일 월요일

마이바티스 - mybatis, mybatis-spring

마이바티스만 쓸거면 mybatis를 보고,
스프링에 마이바티스를 연동해 쓸거면 mybatis-spring를 보고,
스프링-부트에 마이바티스를 연동해 쓸거면 mybatis-spring-boot-starter를 보자.

하이버네이트 같은 ORM 방식이 나은지 마이바티스 같은 데이터 매퍼 방식이 나은지는 그때 그때 다르겠다.
꼰대 DBA가 없으면서 심플한 데이터 관계를 갖는 New 프로젝트에선 ORM 방식이 나은 것 같고,
DBA를 설득하기 빡세고, 레가시 도메인이 복잡하면 그냥 마이바티스 쓰는게 최선인 것 같다.


마이바티스 주요 클래스 인스턴스의 스코프와 생명주기

마이바티스의 주요 클래스로 SqlSessionFactoryBuilder, SqlSessionFactory, SqlSession이 있다.
다행인것은 DI 프레임워크가 생명주기에 대해 기억하지 않아도 쓰레드로 부터 안전하게 동작하도록 관리해준다는 것이다.

1) SqlSessionFactoryBuilder (SqlSessionFactoryBean); SqlSessionFactory를 생성한 후 유지될 필요가 없으므로 메소드 스코프.
2) SqlSessionFactory; 한번 생성한뒤 SqlSessionFactory는 애플리케이션이 실행되는 동안 계속 존재하는 것이 좋다. 따라서 애플리케이션 스코프. 가장 간단한 방법은 싱글턴 패턴이나 static 싱글턴 패턴을 사용하는 것인데, 스프링과 같은 DI 컨테이너를 사용하는 것이 일반적이다.
3) SqlSession (SqlSessionTemplate); 각자의 쓰레드는 자체적으로 SqlSession 인스턴스를 가져야 한다. SqlSession 인스턴스는 공유되지 않고 쓰레드에 안전하지도 않기 때문이다. 따라서 요청 단위 또는 메소드 스코프.


mybatis

1) 마이바티스 애플리케이션은 SqlSessionFactoryBuilder로 SqlSessionFactory 인스턴스를 만들어 사용한다.
2) SqlSessionFactory는 SqlSession을 만드는 역할을 한다.
3) SqlSession은 데이터베이스에 대해 SQL 명령어를 실행하기 위해 필요한 모든 메서드를 가지고 있다.


mybatis-spring

1) SqlSessionFactoryBuilder 대신 SqlSessionFactoryBean이 SqlSessionFactory를 만들어 준다. SqlSessionFactory는 DataSource를 필요로 하고, 다른 스프링의 데이터베이스 연결과 동일한 형식으로 DataSource가 설정되어야 한다. 매퍼의 위치는 SqlSessionFactoryBean에 mapperLocations 프로퍼티를 이용해 지정한다.

<!-- sample.config.mappers 패키지 아래와 그 하위 패키지를 모두 검색해서 마이바티스 매퍼 XML 파일을 모두 로드한다. -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="mapperLocations" value="classpath*:sample/config/mappers/**/*.xml"/>
</bean>

2) mybatis-spring에선 SqlSessionFactory를 직접 사용할 필요가 없다. SqlSessionTemplate은 SqlSession을 구현하고 코드에서 SqlSession을 대체하는 역할을 한다. SqlSessionTemplate은 쓰레드에 안전하고 여러개의 DAO나 매퍼에서 공유될 수 있다. 아래의 빈은 DAO에 직접 주입될 수 있다. SqlSessionTemplate은 인자로 ExecutorType을 갖는 생성자를 가지고 있는데 실행 방식을 아래와 같이 배치 형태로 바꿀 수도 있다.

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg index="0" ref="sqlSessionFactory"/>
    <constructor-arg index="1" value="BATCH"/>
</bean>

3) SqlSession을 제공하는 추상클래스인 SqlSessionDaoSupport가 있고, MapperFactoryBean 방식으로 DAO를 다룰 수도 있다. 이들은 추가적으로 작성되는 코드를 줄이거나 없애는 역할을 한다.

출처: http://www.mybatis.org/spring/ko/index.html

댓글 1개: