Spring에서는 Proxy를 기반으로 AOP를 구현합니다.
AOP는 Aspect Oriented Programming의 약자로, 관점 지향 프로그래밍이라고 하며
핵심 관심사(Core Concerns)와 횡단 관심사(Cross-cutting Concerns)를 분리해 가독성과 모듈성을 증진시킬 수 있는 프로그래밍 패러다임입니다.
AOP에서 핵심 관심사는 보통 비즈니스 로직(Target 코드)이고, 횡단 관심사를 트랜잭션 처리, 로깅 등 공통 부가기능(Advice)입니다.
이때 Advice를 Target 코드에 적용하는 과정을 Weaving이라고 하며, Spring AOP는 런타임 시에 프록시 객체를 생성해 적용하는 Runtime Weaving을 하게 됩니다.
@Transaction을 예시로 이해하기데이터베이스 작업 시 Connection 획득, 트랜잭션 시작/종료, Commit/Rollback 같은 코드를 매번 작성한다면 비즈니스 로직이 부가 기능에 묻혀 가독성이 떨어지고, 유지보수성이 낮아집니다. (동일한 코드의 중복, 설정 변경 시 일괄 수정 필요)
이런 문제를 해결하기 위해 Spring은 AOP로 트랜잭션을 추상화했습니다.
@Transactional의 동작
AOP Proxy에서 TransactionInterceptor.invoke()를 호출해 트랜잭션 시작
실제 객체의 메서드를 실행
결과에 따라 commit 혹은 rollback으로 트랜잭션을 종료