훈훈훈
Spring boot :: JPA, Mybatis Transaction Manager 정리 본문
Introduction
이번에는 Mybatis 와 JPA 를 동시에 적용한 환경에서 어떤 transactionManager 를 사용해야되는지 살펴보려고 한다.
해당 글은 스프링에서 트랜잭션을 담당하는 핵심 인터페이스인 PlatformTransactionManager 를 먼저 정리 후, Mybatis 그리고 JPA 에 대한 내용을 정리하는 순서로 작성하였다.
PlatformTransactionManager
스프링 트랜잭션 추상화의 핵심 인터페이스이다.
모든 스프링 트랜잭션 기능과 코드는 이 인터페이스를 통해 트랜잭션 서비스를 이용할 수 있다.
아래는 해당 인터페이스에 정의 된 메서드 목록이다.
getTransaction( ) 메서드는 트랜잭션 속성에 따라 새로 생성하거나 진행 중인 트랜잭션에 참여하거나, 진행 중인 트랜잭션을 무시하고 새로운 트랜잭션을 만드는 식으로 동작을 한다.
즉, 트랜잭션 전파 기법을 이용해 자유롭게 조합하고 확장할 수 있게 할 수 있다.
그리고 파라미터로 받는 TransactionDefinition 은 트랜잭션 전파(propagation) 과 격리 수준(isolation) 을 나타낸다.
아래 그림에서 TransactionDefinition 인터페이스 구조를 볼 수 있다.
마지막으로 PlatformTransactionManager 를 구현하고 있는 클래스들을 살펴보면 아래 그림과 같다.
앞으로 살펴 볼 DataSourceTransactionManager 그리고 JPATransactionManager 는 PlatformTransactionManager 의 구현체인 것을 볼 수 있다. 이 외에도 다양한 구현체를 확인할 수 있다.
Mybatis Transaction
Mybatis 공식 문서를 살펴보면, Spring 에서 DataSourceTransactionManager 를 사용하는 것을 알 수 있다.
DataSourceTransactionManager 는 아래와 같이 등록 할 수 있는 것으로 공식 문서에서 확인할 수 있다
이제 Mybatis 가 사용하는 DataSourceTransactionManager 에 대하여 알아보자.
DataSourceTransactionManager 클래스는 아래와 같은 의존 관계를 가지고 있는 것을 볼 수 있다.
위에서 살펴 보았던 PlatformTransactionManager 를 구현한 AbstractPlatformTransactionManager 를 구현하고 있는 클래스인 것을 확인할 수 있다.
DataSourceTransactionManager 에 대하여 좀 더 살펴보자.
해당 클래스는 Connection 객체에 존재하는 트랜잭션 api 를 이용해서 트랜잭션을 관리해주는 트랜잭션 매니저이다.
또한 사용하기 위해서는 DataSource 가 스프링 빈으로 등록이 돼야 한다.
사용할 수 있는 DAO 로는 JDBC 와 Mybatis 가 있다.
JPA Transaction
이제 JPA 에서 사용하는 JPATransactionManager 를 살펴보자.
먼저 의존관계를 살펴보면 DataSourceTransactionManage 클래스와 유사한 것을 볼 수 있다.
JPATransactionManager 는 기본적으로는 JPA API 를 이용할 때 사용한다.
그런데 JPA 의 EntityManagerFactory 가 스프링의 빈으로 등록된 DataSource 를 사용할 수 있다.
그렇기 때문에 JPA 에서 사용하는 DataSoure 를 JDBC, Mybatis 에서 사용할 수 있다.
따라서 JPATransactionManager 는 DataSourceTransactionManager 가 제공하는 DataSource 레벨의 트랜잭션 관리 기능을 동시에 제공한다.
결과적으로 JPATransactionManager 를 사용하면서 JDBC, Mybatis 의 트랜잭션 관리도 같이 할 수 있다.
Conclusion
위 내용을 정리하자면 Mybatis 를 단독으로 사용할 경우 DataSourceTransactionManager 를 스프링 빈으로 등록이 필요하지만, JPA를 사용할 경우 JPATransactionManager 로 같이 관리가 가능하기 때문에 별도의 TransactionManager 를 등록할 필요는 없다.
'Spring Framework > 개념' 카테고리의 다른 글
Spring boot :: Multiple DataSource 환경에서 @DataJpaTest 이슈 정리 및 스프링 코드 분석 (4) | 2021.10.11 |
---|---|
Spring boot :: Mockito 로 WebClient 테스트 하기 (1) | 2021.09.26 |
Spring boot :: Datasource Replication 구현 (1) | 2021.09.05 |
Spring boot :: Task Execution and Scheduling (0) | 2021.06.12 |
Spring boot :: JPA @EntityListeners 정리 (0) | 2021.03.22 |