훈훈훈

Spring boot :: JPA, Mybatis Transaction Manager 정리 본문

Spring Framework/개념

Spring boot :: JPA, Mybatis Transaction Manager 정리

훈훈훈 2021. 9. 6. 23:14

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 를 등록할 필요는 없다.

Comments