@Transactional이란?
Spring에서 제공하는 어노테이션으로, 트랜잭션 시작과 종료를 자동으로 관리한다.
비즈니스 로직 실행 중 문제가 발생하면 데이터를 롤백(Rollback)하고, 정상적으로 실행되면 커밋(Commit)합니다.
그렇다면, @Transactional을 사용하면 어떻게 자동으로 관리 되는 걸까?
Transaction은 데이터베이스를 작업하는 하나의 단위로 알고 있었다. 다만, 어노테이션을 사용하면 해당 메소드가 어떻게 트랜잭션으로 관리되는지 고민해보지 않았다.
다음과 같이 @Transactional은 AOP와 프록시 객체를 통해 작동한다.
@Transactional이 선언된 메서드를 호출할 때 프록시 객체를 생성한다.AOP와 프록시 객체는 무엇일까?
AOP : 관점 지향 프로그래밍으로, 애플리케이션의 핵심 비즈니스 로직과 이를 지원하는 공통 관심사를 분리하는 프로그래밍 패턴
프록시 객체 : 프록시는 대리 객체로, 원래 객체 대신 동작하며 추가적인 기능을 제공한다. Spring에서 AOP를 구현할 때, 프록시 객체를 사용하여 실제 비즈니스 로직 앞뒤로 공통 로직(Aspect)을 삽입한다.
프록시 동작 방식:
이렇게 @Transactional을 통해 트랜잭션으로 관리하며 JPA의 영속성 컨텍스트를 사용할 수 있게 된다.