본문 바로가기
Develop/Spring

트랜잭션 적용 순서

by jaeyoungb 2023. 1. 25.

✔ 클래스 레벨과 메서드 레벨의 트랜잭션 적용 순서

클래스 레벨과 메서드 레벨에 @Transactional 애너테이션을 추가할 때 트랜잭션은 다음과 같이 적용된다.

 

  • 클래스 레벨에만 @Transactional이 적용된 경우
    • 클래스 레벨의 @Transactional 애너테이션이 메서드에 일괄 적용
  • 클래스 레벨과 메서드 레벨에 함께 적용된 경우
    • 메서드 레벨의 @Transactional 애너테이션이 적용
    • 만약 메서드 레벨에 @Transactional 애너테이션이 적용되지 않았을 경우, 클래스 레벨의 @Transactional 애너테이션이 적용

 

 

더보기

✔ 조회 메서드에 @Transactional(readOnly = true) 로 설정하는 이유

 

findeMember()와 같은 조회 메서드에 @Transactional(readOnly = true)로 설정해도 commit 절차를 진행하기는 한다. JPA에서 commit이 호출되면 영속성 컨텍스트가 flush된다.

 

그런데 @Transactional(readOnly = true) 로 설정하면 JPA 내부적으로 영속성 컨텍스트를 flush하지 않는다.

그리고 읽기 전용 트랜잭션일 경우, 변경 감지를 위한 스냅샷 생성도 진행하지 않는다.

 

flush 처리를 하지 않고, 스냅샷도 생성하지 않으므로 불필요한 추가 동작을 줄일 수 있다.

 

결론은,
조회 메서드에는 readonly 속성을 true로 지정해서 JPA가 자체적으로 성능 최적화 과정을 거치도록 하는 편이 좋다.