✔ 클래스 레벨과 메서드 레벨의 트랜잭션 적용 순서
클래스 레벨과 메서드 레벨에 @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가 자체적으로 성능 최적화 과정을 거치도록 하는 편이 좋다.
'Develop > Spring' 카테고리의 다른 글
[Spring Data JPA] N+1 문제를 해결하기 위한 방법(JPQL의 fetch join, @EntityGraph, ...) (1) | 2023.06.26 |
---|---|
서버에서 내려주는 에러 메시지를 직접 정의해야만 하는 이유 (0) | 2023.04.22 |
@Value 애너테이션으로 값을 불러올 때, 항상 null 값이 오는 경우 (0) | 2023.01.10 |
application.properties 파일에 민감한 정보 담기 (0) | 2023.01.10 |
ddl-auto 옵션 (2) | 2022.12.23 |