JPA - 변경 감지

Codren·2021년 10월 1일
0

상품 수정

  • Spring Boot 쇼핑몰 프로젝트에서 상품을 수정할 때, save() 로직을 호출하지 않아도 자동으로 DB 정보가 업데이트되는 것에 대한 궁금증
  • Transactional(readOnly = true) 로 인한 성능향상이 가능한 이유에 대한 궁금증
  • JPA 동작 원리 - 영속성 컨테이너와 변경 감지 (참고)




변경 감지 (Dirty Checking)



1. 영속성 컨텍스트 (Persistence Context)

애플리케이션과 DB 사이의 중간 계층으로 애플리케이션의 실제 Entity를 영속화하고, DB 의 데이터를 조회하여 저장하는 공간



2. 스냅샷 (Snapshot)

영속성 컨텍스트 1차 캐시에 존재하는 데이터로 JPA 조회 기능으로 인해 DB 에서 처음 불려진 Entity 의 초기 상태 값을 의미



3. 변경 감지 (Dirty Checking)

애플리케이션의 Entity 객체와 1차 캐시에 저장된 해당 Entity의 스냅샷을 비교하여 변경 사항이 있다면 자동으로 UPDATE 문을 쓰기 지연 SQL 저장소에 담아 두어 커밋 시점에 변경 내용을 자동으로 반환

  • 즉, DB 로 부터 조회한 Entity 객체에 변경 사항이 생긴다면 update 작업을 자동으로 수행하는 기능




Transactional(readOnly = true)



1. Transactional(readOnly = true)

DB 에서 객체를 조회할 때, 읽기 전용 상태로 설정하는 어노테이션과 속성



2. 성능 향상 원리

  • DB 에서 영속성 컨텍스트로 불려올 때, 스냅샷을 만들지 않음 -> 메모리 공간 확보
  • 트랜잭션을 커밋하더라도 영속성 컨텍스트가 flush() 되지 않아 Entity 의 상태변화가 이루어지지 않음
    -> 불필요한 작업 없앰
  • 참고 블로그 1, 참고 블로그 2

0개의 댓글