[SPRING #12 JPA] @Transaction(readOnly=true)

eunseo·2021년 10월 21일
0

SPRING

목록 보기
12/14

스프링 프레임워크에서 어노테이션으로 트랜잭션을 읽기 전용 모드로 설정할 수 있다.
@Transactional(readOnly = true)

예상치 못한 엔티티의 등록, 변경, 삭제를 예방할 수 있고, 또한 성능을 최적화 할 수 있다. -> DBMS 별 Transaction Read Only에 대한 동작 방식 다르다.

만약 조회만 하는 경우에 읽기 전용으로 엔티티를 조회하면 메모리 사용량을 최적화 할 수 있다.

Hibernate로 사용할 때는 어떻게 적용될까?

Hibernate는 readOnly 옵션이 설정된 경우는 Session의 Flush Mode를 'FlushMode.MANUAL' 모드로 설정한다.

이는 곧, '강제로 플러시를 호출하지 않은 한 플러시가 일어나지 않는다'는 것을 의미한다.

결국은 Hibernate는 Entity에 flush를 호출하지 않게 되고, 변경은 자연스럽게 무시되게 된다.

또한, flush가 호출되지 않고, Dirty Checking을 하지 않기 때문에 성능적으로도 이 점을 얻을 수 있다.

(Dirty Checking이 이루어지는 과정을 쉽게 설명한다고 하면, Entity와 Snapshot을 비교하게 되는데 이러한 과정이 생략되게 되면서 성능 상의 이점을 얻게 된다.)

엔티티가 아니라 DTO로 바로 조회할 때는 어차피 스냅샷이 안만들어지기 때문에 이 경우에는 성능 이점이 없다.

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(); 

  }
profile
backend developer

0개의 댓글

관련 채용 정보