JPA는 1차 캐시, 변경 감지를 통해 얻는 장점이 많다.

하지만, 이러한 장점을 얻기 위해선 많은 인스턴스들이 메모리에 할당되어야 하는 이슈가 있다.

이런 이슈를 해결하고자 읽기 전용으로 엔티티를 조회하는 경우 메모리 사용량을 최적화해야 된다.

1) 스칼라 타입으로 조회

엔티티로 조회하는 것이 아닌 아래와 같이 스칼라 타입으로 모든 필드 조회

select o.id, o.name, o.price from order o;

2) 읽기 전용 쿼리 힌트 적용

하이버네이트 전용 힌트 readOnly를 적용한다. ( 영속성 컨텍스트 관리(변경관리)에서 제외됨 )

TypeQuery<Order> query = em.createQuery(”select o from Order o”,Order.class);

query.setHint(”org.hibernate.readOnly”,true);

3) 읽기 전용 트랜젝션 사용

스프링 프레임워크를 사용하면 트랜잭션을 읽기 전용 모드로 설정할 수 있다.

@Transcational(readOnly = true)

트랜잭션을 읽기모드로 적용하면 강제로 플러시를 호출하지 않는 이상 플러시가 발생하지 않는다.

그러므로 자동으로 플러시 되면서 수행되는 무거운 로직들이 실행되지 않아 성능이 향상된다.

4) 트랜잭션 밖에서 읽기

말 그대로 트랜잭션 밖에서 엔티티를 조회하는 것임으로 커밋, 플러시 어떤 것도 적용되지 않는다.

단, 반드시 조회 목적인 경우에만 사용해야 한다.