결론부터 말씀드리자면, 트랜잭션이 동작하지 않습니다.
스프링의 @Transactional은 기본적으로 스프링 AOP를 기반으로 동작합니다. 실제 객체 대신 프록시 객체가 스프링 빈으로 등록됩니다. 프록시 객체가 @Transactional이 선언된 메서드를 실행하기 전에 가로채어 트랜잭션을 시작하고 종료하는 작업을 처리해 줍니다. 이때 프록시 객체는 실제 객체의 메서드를 호출해야 하는데, private 메서드는 외부에서 호출할 수 없으므로 트랜잭션이 동작하지 않습니다.
@Transactional 사용시 주의할 점은 또 무엇인가요?
@Transactional 사용시 내부 호출 문제를 주의해야 합니다.
스프링 AOP는 외부에서 프록시 객체를 통해 메서드가 호출될 때만 AOP 어드바이스가 적용됩니다. 같은 클래스 내에서 호출하면 프록시를 거치지 않고 직접 호출되므로 트랜잭션 어드바이스가 적용되지 않습니다.
이 문제를 해결하기 위해서 자기 자신을 주입받는 방식과 클래스 구조를 변경하는 방식 등이 있습니다.
전자의 방식은 순환 참조가 문제가 발생할 수 있어 가장 권장되는 방식은 후자의 방식입니다. 트랜잭션이 필요한 메서드를 별도의 클래스로 구분하여 내부에서 호출하는 근본적인 원인을 제거할 수 있습니다.
'백엔드 면접' 카테고리의 다른 글
| 서버 사이드 렌더링과 클라이언트 사이드 렌더링의 차이점은 무엇인가요? (2) | 2024.12.26 |
|---|---|
| Connection Timeout, Socket Timeout, Read Timeout의 차이점은 무엇인가요? (0) | 2024.12.25 |
| 포워드 프록시와 리버스 프록시의 차이에 대해 설명해 주세요. (0) | 2024.12.23 |
| CORS란 무엇인가요? (1) | 2024.12.21 |
| 갭락과 넥스트키 락은 무엇이며, 어떻게 팬텀 리드를 방지하나요? (0) | 2024.12.19 |