들어가기 전에)
Transactional의 @Transactional의 readonly 옵션을 true로 사용하면 성능이 좋다고 한다.
왜일까? “읽기 전용 쿼리의 성능 최적화”로
엔티티가 영속성 컨텍스트에 관리되면 1차 캐시부터 변경 감지까지 얻을 수 있는 혜택이 많다
하지만 영속성 컨텍스트는 변경 감지를 위해서 스냅샷 인스턴스를 보관하므로 더 많은 메모리를 사용하는 단점이 있다.
만약 조회만 하는 경우에는 읽기전용(@Transactional(readonly=true))를 사용하여 엔티티를 조회하면 메모리 사용량을 최적화할 수 있다.
결론: 조회를 하는 경우에는 @Transactional(readonly=true)을 사용하자! 영속성 컨텍스트에서 변경감지와 스냅샷 저장을 하지 않기 때문에 성능을 최적화할 수 있다.
그럼 spring-data-jpa에서 제공하는 JpaRespotiory의 메소드에서는 readonly 옵션이 어떻게 될까?
@Transactional의 readonly 옵션의 default는 false이다.
JpaRespotiroy의 findAll()등 구현 클래스인 SimpleJpaRepository 에서는 기본적으로 readonly=true이다.
SimpleJpaRespository에 있는 함수를 살펴보자.
Create
readonly=false이므로 영속성 컨텍스트에 저장
Read
따로 @Transactional이 없으므로 simpleJpaRespotiroy에 선언된 readonly=true로 영속성컨텍스트에 저장 안함
Delete
readonly=false이므로 영속성 컨텍스트에 저장
결론:
JpaRepository의 함수를 사용할때는 readonly 옵션이 알맞게 쓰여있다. (Read일때만 readonly 옵션이 true)JpaRepository를 상속하는 함수인 Entity의 Repository를 만들땐 Read용 함수에서 @Transactional(readonly=true)를 사용하면 성능이 더 좋다.
'Backend > Spring | Spring Boot' 카테고리의 다른 글
[예외 처리] 사용자 정의 예외 처리 (0) | 2024.06.07 |
---|---|
[Spring] Filter와 OncePerRequestFilter (0) | 2024.03.13 |
[SpringBoot] @PostConstructd와 @PreDestroy (0) | 2024.02.22 |
[Error] TransactionRequiredException: Executing an update/delete query 에러 해결 방법 (1) | 2023.01.27 |
[Spring Boot] Lombok이란? Lombok 추가하기 (0) | 2023.01.21 |