Spring Transaction VS JPA Transaction

고승원·2023년 6월 20일
0

Spring

목록 보기
9/14

Spring Transaction과 JPA Transaction은 다르다.

JPA는 EntityManager를 통해 영속성 컨텍스트를 관리하기 때문에 Transaction 처리방법이 다르다.

Spring

Spring Transaction은 PlatformTransactionManager 가 관리한다.
PlatformTransactionManager는 Spring에서 제공하는 인터페이스로, Spring Transaction 관리를 추상화한 객체다.

이 인터페이스는 애플리케이션에서 트랜잭션을 시작, 커밋 또는 롤백하는 등의 트랜잭션 관리 작업을 수행한다.

Spring은 이 인터페이스를 구현한 여러 클래스를 제공하는데, 대표적으로 DataSourceTransactionManager, JpaTransactionManager, HibernateTransactionManager 등이 있다.

JPA

JPA Transaction은 JpaTransactionManager가 관리한다.
JpaTransactionManager는 JPA의 EntityManager를 사용하여 트랜잭션 범위에서 영속성 컨텍스트를 관리하고, JPA의 트랜잭션 관리 기능을 활용하여 트랜잭션 처리를 수행한다.

설명하기 앞서 EntityManager에 대해서 간단히 설명하자면, JPA는 EntityManager가 관리하게 되는데 이는 thread safe 하지 않다.(EntityManger당 PersistContext하나씩 가진다.)
EntityManager는 EntityManagerFactory가 생성하는데, 이는 thread safe 하기 때문에 DB당 하나씩 공유하여 사용한다.



JpaTransactionManager는 EntityManagerFactory 객체를 주입 한다. 이를 통해 JPA의 EntityManager를 생성하고, 트랜잭션 처리를 위해 필요한 JPA의 EntityTransaction을 사용한다.

DefaultTransactionStatus로부터 JpaTransactionObject를 가져온다. DefaultTransactionStatus에는 JpaTransactionObject, JpaTransactionManager등 트랜잭션의 이름등의 정보를 포함한다.

JpaTransactionObject에서 EntityManager를 가져온 후, 해당 EntityManager의 트랜잭션을 커밋한다.

RollbackException이 발생한 경우, 예외의 원인이 RuntimeException이면, JpaDialect를 사용하여 예외를 변환한다. 변환 가능한 DataAccessException이 존재한다면 해당 예외를 던지고, 그렇지 않으면 TransactionSystemException 예외를 던진다.

RuntimeException인지 확인하는 이유는 RuntimeException이 아닌 경우 트랜잭션 시스템 자체의 문제이기 때문에 TransactionSystemException을 던지는 것이다. (ex.TransactionManager 구성문제, Transaction관련 리소스문제)


실제 코드를 보면 800 라인이 넘어가는데 주요한 것만 요약하자면 JpaTransactionManager는 트랜잭션 범위 내에서 영속성 컨텍스트를 관리한다. 이를 통해 엔티티의 상태 변화를 추적하고, 트랜잭션 커밋 시에 변경 내용을 데이터베이스에 반영한다. 또한 EntityManagerFactory, persistence unit, JPA properties, DataSource, Dialect, EntityManager등을 설정하는 추가기능을 제공한다.

마무리

JpaTransactionManagerPlatformTransactionManager의 구현체중 하나로 EntityManager를 사용하여 트랜잭션을 관리한다. 사용되는 리소스 또한 EntityManagerFactory, EntityManager등으로 한정되어 있다.
PlatformTransactionManager를 구현한 다른 클래스들은 다양한 트랜잭션 유형을 지원하고, 해당 유형에 맞는 방식으로 트랜잭션 제어한다.

profile
봄은 영어로 스프링

0개의 댓글