스프링 프레임워크에서 어노테이션으로 트랜잭션을 읽기 전용 모드로 설정할 수 있다.
@Transactional(readOnly = true)
예상치 못한 엔티티의 등록, 변경, 삭제를 예방할 수 있고, 또한 성능을 최적화 할 수 있다. -> DBMS 별 Transaction Read Only에 대한 동작 방식 다르다.
만약 조회만 하는 경우에 읽기 전용으로 엔티티를 조회하면 메모리 사용량을 최적화 할 수 있다.
Hibernate는 readOnly 옵션이 설정된 경우는 Session의 Flush Mode를 'FlushMode.MANUAL' 모드로 설정한다.
이는 곧, '강제로 플러시를 호출하지 않은 한 플러시가 일어나지 않는다'는 것을 의미한다.
결국은 Hibernate는 Entity에 flush를 호출하지 않게 되고, 변경은 자연스럽게 무시되게 된다.
또한, flush가 호출되지 않고, Dirty Checking을 하지 않기 때문에 성능적으로도 이 점을 얻을 수 있다.
(Dirty Checking이 이루어지는 과정을 쉽게 설명한다고 하면, Entity와 Snapshot을 비교하게 되는데 이러한 과정이 생략되게 되면서 성능 상의 이점을 얻게 된다.)
public interface MemberRepository extends JpaRepository<Member, Long> {
// DTO로 직접 조회
@Query("select new me.kyeongho.dto.MemberDto(m.id, m.username, t.name) from Member m join m.team t")
List<MemberDto> findMemberDto();
}