티스토리 뷰

반응형

JPA는 영속성 컨텍스트라는 것을 사용하는데, 엔티티가 영속성 컨텍스트에서 관리되면 여러 가지 장점을 얻을 수 있다.

  1. 1차 캐시를 통한 빠른 데이터 조회
  2. 변경 감지 (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을 위한 스냅샷 비교
  • 따라서 위와 같은 로직들을 수행하지 않기 때문에 성능이 약간 향상 된다.
반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함