Engineering Note

[Spring] @Transactional 어노테이션과 Spring AOP의 관계 본문

Server/Spring

[Spring] @Transactional 어노테이션과 Spring AOP의 관계

Software Engineer Kim 2025. 10. 7. 23:48

본 글은 Spring의 핵심인 AOP(Aspect Oriented Programming, 관점 지향 프로그래밍)를 학습하면서 @Transactional 어노테이션이 AOP의 대표적인 사례로 볼 수 있음을 알고 두 개념의 관계를 살펴보면서 각 개념을 더 깊이 이해하기 위한 목적으로 작성한 글입니다.

 

 @Transactional 어노테이션과 Spring AOP의 관계



@Transactional은 **Spring AOP (Aspect-Oriented Programming, 관점 지향 프로그래밍)** 개념이 적용된 대표적인 예시입니다.
Spring은 AOP를 활용하여 개발자가 **비즈니스 로직(핵심 관심사)**과 **트랜잭션 처리(Commit/Rollback 등 부가 기능, 횡단 관심사)**를 분리할 수 있도록 지원합니다.

Spring의 AOP 기능이 없었다면 transaction 처리가 필요한 서비스 메서드 코드에서 중복되는 코드가 매번 발생합니다.(DB 커넥션을 획득하고, 트랜잭션 시작을 알리고, 실패시 롤백처리하는 코드 중복)

 


1. AOP를 통한 @Transactional 동작 원리

 



@Transactional이 붙은 메서드가 호출되면, Spring AOP는 다음과 같은 단계로 트랜잭션을 처리합니다.

1) 프록시 객체 생성

Spring IoC 컨테이너는 @Transactional이 선언된 Bean에 대해 원본 객체를 감싸는 **프록시 객체(Proxy Object)**를 생성합니다.
이 프록시가 트랜잭션 처리를 위한 진입점 역할을 합니다.

2) 호출 가로채기 (Interception)

클라이언트가 실제 비즈니스 메서드(예: OrderService.saveOrder())를 호출하면,
실제 객체가 아니라 프록시 객체가 호출을 먼저 가로챕니다.

3) 트랜잭션 부가 로직 수행 (Advice)

프록시 객체는 호출 전후로 다음과 같은 **부가 기능(Advice)**을 삽입합니다.

시점 동작 설명
@Before 트랜잭션 시작 (Transaction Begin) 트랜잭션 매니저를 통해 Connection을 획득하고 트랜잭션을 시작합니다.
@Around 실제 비즈니스 로직 실행 핵심 로직(서비스 메서드)을 수행합니다.
@AfterReturning 트랜잭션 커밋 (Commit) 메서드가 정상적으로 종료되면 커밋합니다.
@AfterThrowing 트랜잭션 롤백 (Rollback) RuntimeException 또는 Error 발생 시 롤백합니다.

 


이 과정을 통해 개발자는 try-catch 문을 직접 작성하지 않아도
단지 @Transactional 어노테이션 하나만으로 **선언적 트랜잭션(Declarative Transaction)**을 구현할 수 있습니다.

 


2. AOP 관점에서의 구성 요소 정리

역할 AOP 용어 설명
트랜잭션 처리 로직 Aspect (관점) 트랜잭션 관리라는 횡단 관심사 전체
@Transactional이 붙은 메서드 Pointcut (포인트컷) 부가 기능(Advice)이 적용될 지점
Commit/Rollback 로직 Advice (어드바이스) 트랜잭션 시작, 커밋, 롤백을 수행하는 코드
Service 클래스 Target (타겟) 실제 트랜잭션 부가 기능이 적용될 대상 객체



3. 동작 구조 요약 (흐름도)



Client
   ↓ (메서드 호출)
Proxy Object (@Transactional 감지)
   ↓
[AOP Advice]
   ├─ Transaction Begin
   ├─ Actual Service Logic 실행
   ├─ Commit (성공 시)
   └─ Rollback (예외 시)


이처럼 Spring은 AOP 프록시 기반의 트랜잭션 처리 구조를 통해 트랜잭션 관리 코드를 비즈니스 로직으로부터 분리시켜, 보다 명확하고 유지보수성 높은 코드를 구현할 수 있게 합니다.


Comments