# 스프링 트랜잭션 AOP의 동작 흐름

# AOP

alt text

  • Aspect Oriented Programming
  • 어떤 로직을 핵심, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화

# @Transactional

  1. 요청이 들어오면 트랜잭션 AOP 프록시가 트랜잭션 매니저 획득
  2. 트랜잭션을 시작하기 위해 트랜잭션 매니저에게 요청
  3. 데이터 소스를 통해 커넥션을 받아오고 트랜잭션 시작
  4. 트랜잭션 매니저는 트랜잭션이 시작된 커넥션을 트랜잭션 동기화 매니저에 저장
  5. 트랜잭션이 종료되는 경우 트랜잭션 매니저는 트랜잭션 동기화 매니저에 보관한 커넥션을 가져와 종료하고 커넥션을 반환하거나 종료

# 트랜잭션 매니저

  • JDBC를 사용할 때와 JPA를 사용할 때의 트랜잭션은 서로 다른 양상을 가짐
  • 스프링은 개발자가 이를 신경쓰지 않도록 하기 위해 트랜잭션 추상화인 PlatformTransactionManager 사용
  • 개발자는 상황에 맞게 DataSourceTransactionManager, JpaTransactionManager를 사용 가능

# 트랜잭션 동기화 매니저

  • 특정 트랜잭션을 시작한 커넥션이 여러 코드에 걸쳐 사용되어도 이를 유지시켜주기 위함
  • 만약 트랜잭션 동기화 매니저가 없다면 다른 코드의 메서드를 실행할 때 마다 커넥션을 인자로 넘겨줘야 함