private 메서드에 @Transactional을 선언하면 트랜잭션이 동작할까요?

2024. 12. 24. 11:09·백엔드 면접

결론부터 말씀드리자면, 트랜잭션이 동작하지 않습니다.

 

스프링의 @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
'백엔드 면접' 카테고리의 다른 글
  • 서버 사이드 렌더링과 클라이언트 사이드 렌더링의 차이점은 무엇인가요?
  • Connection Timeout, Socket Timeout, Read Timeout의 차이점은 무엇인가요?
  • 포워드 프록시와 리버스 프록시의 차이에 대해 설명해 주세요.
  • CORS란 무엇인가요?
이런개발
이런개발
geun-00의 흔적 보관소
  • 이런개발
    내일이 기대되는 오늘
    이런개발
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • 백엔드 면접
      • SQL N
        • SUM, MAX, MIN
        • SELECT
        • GROUP BY
        • JOIN
      • Spring
      • JPA
      • 트러블슈팅
      • Infra
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    스프링
    오블완
    데브코스
    자바
    raid
    JPA
    백엔드 면접
    토스 페이먼츠
    티스토리챌린지
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
이런개발
private 메서드에 @Transactional을 선언하면 트랜잭션이 동작할까요?
상단으로

티스토리툴바