@Transactional에 관한 고찰

Hoo-Sung.Lee·2024년 6월 29일
0

Spring

목록 보기
13/15

@Transactional 이란?

매우 편하게 별 생각없이 사용했던 Spring의 편리한 기능 중 하나인 @Transactional이 어떤 식으로 트랜잭션을 관리하는지 TransactionManager를 중심으로 알아보자.

@Transactional은 AOP이다. 서비스 계층에 순수한 비즈니스 로직만 남긴다는 목표를 위해서 스프링 AOP를 통해 프록시를 도입하면 문제를 깔끔하게 해결할 수 있다.

프록시를 도입하기 전에는 기존처럼 서비스의 로직에서 트랜잭션을 직접 시작한다.

프록시를 사용하면 트랜잭션을 처리하는 객체와 비즈니스 로직을 처리하는 서비스 객체를 명확하게 분리할 수 있다. 즉, 관심사의 분리가 명확하게 이뤄진다.

TransactionManager와 EntityManager

스프링 트랜잭션 추상화의 핵심은 PlatformTransactionManager 인터페이스이다.
JPA의 TransactionManager 동작을 이해할 때 가장 중요한 것은 TransactionManager 내부에서의 EntityManager의 동작을 이해하는 것이다.
AbstractPlatformTransactionManager의 구현체 중 JPA를 사용할 때 사용되는 JpaTransactionManager의 내부 동작을 살펴보도록 하자.

JpaTransactionManager


JpaTransactionManager의 코드를 보면, 위의 사진처럼 EntityManagerFactory를 확인할 수 있다.

EntityManagerFactory의 출처 ?
이 EntityManagerFactory는 기본적으로 JpaBaseConfiguration.java 에서 bean으로 등록되어 주입된다.
JpaBaseConfiguration은 Spring Boot의 자동 설정 메커니즘을 통해 JPA 관련 빈들을 구성하는 중요한 클래스

JpaTransactionManager에서 EntityManagerFactory의 활용

JpaTransactionManager에서 EntityManagerFactory는 doBegin() 이 실행되는 순간부터 바로 활용되기 시작한다.


위의 사진을 보면 doBegin() 내부로직에서 createEntityManagerForTransaction() 이라는 함수를 이용해서 EntityManager를 반환하고 있는 것을 확인할 수 있다.


드디어 EntityManagerFactory를 이용해서 EntityManager를 생성하는 구문을 발견할 수 있었다.!!

정리

트랜잭션 AOP가 사용된 전체 흐름은 아래와 같다.

  1. Spring이 구동하면서 JpaBaseConfiguration에 의해서 EntityManagerFactory, JpaTransactionManager가 singleton으로 Bean 등록된다.
  2. @Transactional 설정된 함수가 실행하면, EntityManagerFactory가 EntityManager를 생성한다. (Tx가 EntityManagerFactory를 의존성 주입 받음을 기억하자)
  3. 생성된 EntityManager를 이용하여 각각 Transaction 및 영속성을 관리한다.


@Transactional이 붙은 메소드를 실행할 경우, 일어나는 일들은 위와 같다고 한다.
이렇게 많은 일이 @Transactional 하나에 담겨있다.

profile
Software Engineer

0개의 댓글

관련 채용 정보