본문으로 건너뛰기

@Transactional 어노테이션 AOP 동작 흐름

@Transactional 어노테이션을 사용한 선언적 트랜잭션 관리(Declarative Transaction Management)의 전체 흐름에는 크게 3가지 요소가 등장합니다. 트랜잭션 매니저, 트랜잭션 AOP 프록시, 트랜잭션 동기화 매니저가 이에 해당됩니다.

클라이언트 코드로부터 요청이 들어오면 트랜잭션 AOP 프록시트랜잭션 매니저를 획득하고, 트랜잭션을 시작하기 위해서 트랜잭션 매니저에게 요청합니다. 트랜잭션 시작 요청 받은 트랜잭션 매니저는 데이터 소스를 통해 커넥션을 받아오고 트랜잭션을 시작합니다. 그리고, 트랜잭션 매니저는 트랜잭션이 시작된 커넥션을 트랜잭션 동기화 매니저에 보관합니다. 이후 트랜잭션이 종료되는 경우, 트랜잭션 매니저트랜잭션 동기화 매니저에 보관한 커넥션을 가져와 트랜잭션을 종료하고 커넥션을 반환하거나 종료합니다.

✔️ 트랜잭션 매니저 (Transaction Manager)

JDBC를 사용한 트랜잭션 관리 코드와 JPA를 사용한 트랜잭션의 양상이 다릅니다. 스프링은 개발자가 트랜잭션에 대한 구현 세부 사항을 신경 쓰지 않도록 트랜잭션 추상화인 PlatformTransactionManager를 제공합니다. 개발자는 상황에 맞게 DataSourceTransactionManager, JpaTransactionManager를 사용할 수 있으며, 이를 트랜잭션 매니저(Transaction Manager)라고 부릅니다.

✔️ 트랜잭션 동기화 매니저 (Transaction Syncronization Manager)

서비스 로직에서 여러 서비스 로직을 호출할 수 있고, 데이터 접근 로직을 호출할 수도 있습니다. 이때, 트랜잭션을 유지하기 위해서는 해당 트랜잭션을 시작한 커넥션이 여러 코드에 걸쳐 필요하게 됩니다. 트랜잭션 동기화 매니저(Transaction Syncronization Manager)는 이를 도와줍니다. 만약, 트랜잭션 동기화 매니저가 없다면, 다른 코드의 메서드를 호출할 때마다 커넥션을 인자로 넘겨줘야 하는 문제가 발생합니다.

Loading comments...