티스토리 뷰
Spring
스프링의 읽기 전용 조회시 성능 향상 (스칼라 타입, org.hibernate.readOnly, @Transactional(readOnly = true))
기내식은수박바 2021. 8. 13. 11:28반응형
JPA는 영속성 컨텍스트라는 것을 사용하는데, 엔티티가 영속성 컨텍스트에서 관리되면 여러 가지 장점을 얻을 수 있다.
- 1차 캐시를 통한 빠른 데이터 조회
- 변경 감지 (Dirty Checking)
하지만 영속성 컨텍스트는 Dirty Checking을 위해서 스냅샷을 가지고 있어야 하기 때문에, 많은 메모리를 사용해야 한다는 단점이 있다.
이 때문에 엔티티를 조회할 때, 읽기 전용 모드로 조회하면 메모리를 최적화할 수 있는 이점을 얻을 수 있다.
읽기 전용 모드의 종류
1. 스칼라 타입
SELECT p.id, p.age, p.name FROM Person p
엔티티 객체가 아닌 스칼라 타입으로 조회하기 때문에 영속성 컨텍스트가 결과를 관리하지 않아 메모리를 최적화할 수 있다.
2. 읽기 전용 쿼리 힌트
Person findPerson = em.createQuery("SELECT p FROM Person p", Person.class)
.setHint("org.hibernate.readOnly", true)
.getSingleResult();
하이버네이트 전용 힌트를 사용하여 엔티티 객체를 읽기 전용으로 조회할 수 있다.
마찬가지로 읽기 전용이므로 영속성 컨텍스트는 Dirty Checking을 위한 스냅샷을 관리하지 않기 때문에 메모리를 최적화할 수 있다.
3. 읽기 전용 트랜잭션
@Transactional(readOnly = true)
public Entity readEntity(String id) {
...
}
스프링에서 제공하는 트랜잭션 읽기 전용 모드를 사용할 수 있다.
readOnly = true 로 설정하면 스프링이 하이버네이트 세션 플러시 모드가 MANUAL로 설정되는데, 이렇게 되면 강제로 flush를 호출하는 것이 아닌 이상 flush를 수행하지 않는다.
즉, 트랜잭션을 commit하더라도 flush를 수행하지 않는다.
- flush를 수행하지 않는다는 것은 즉, 아래와 같은 작업을 수행하지 않는다는 것이다.
- 엔티티의 등록 (Insert), 수정 (Update), 삭제 (Delete)
- Dirty Checking을 위한 스냅샷 비교
- 따라서 위와 같은 로직들을 수행하지 않기 때문에 성능이 약간 향상 된다.
반응형
'Spring' 카테고리의 다른 글
Spring MVC (Model, View, Controller) (0) | 2022.04.15 |
---|---|
스프링 의존성 주입 방식 종류와 차이 (1) | 2021.08.08 |
Spring Boot + ELK 를 이용한 로그 수집 (0) | 2021.02.07 |
댓글