노트더티 체킹
Dirty Checking
백엔드#jpa · 연결된 개념 7개
쉽게 말하면
더티 체킹은 집을 빌릴 때 처음 상태를 사진으로 찍어 두고, 나갈 때 사진과 비교해 달라진 게 있으면 알려 주는 것과 같아요. 객체 값을 바꾸기만 하면 저장을 다시 부르지 않아도 그 변경이 DB에 반영되죠.
비유가 깨지는 곳 사진은 JPA가 관리 중인 영속 상태 엔티티만 찍어 둬서 준영속 엔티티는 고쳐도 반영되지 않아요. 비교도 바로 하지 않고 flush 시점(커밋 직전, JPQL 실행 직전 등)에 해요.
영속 상태 엔티티의 필드를 바꾸기만 하면, flush(영속성 컨텍스트의 변경을 DB에 반영) 시점에 처음 스냅샷(snapshot)과 비교해 바뀐 엔티티의 UPDATE를 만들어 보내는 기능. save()를 다시 부를 필요가 없다.
- 비교 기준은 엔티티를 1차 캐시에 올릴 때 떠 둔 스냅샷이다
- flush는 트랜잭션 커밋 직전, 관련 테이블을 읽는 JPQL 실행 직전,
flush()를 직접 부를 때 일어난다
- 준영속 엔티티는 대상이 아니다
- React 상태 갱신와 반대 방향의 설계다. React는 새 객체를 넘겨 바뀌었다고 알리고, JPA는 같은 객체를 고치면 알아서 찾아낸다
책: 7장. 영속성 컨텍스트라는 출석부
출처: Hibernate ORM User Guide: Modifying managed state · Flushing
연결된 개념
이 노트를 가리키는 문서
뜻이 가까운 노트
- JPA Auditing
JPA Auditing은 엔티티의 생성·수정 시각과 생성자·수정자를 저장할 때 자동으로 채워 주는 Spring Data JPA 기능이다. 모든 엔티티에 반복되는 createdAt = now() 코드를 없앤다.
- 영속성 전이 (cascade)
영속성 전이(cascade, transitive persistence)는 부모 엔티티에 한 영속성 작업(저장·병합·삭제 등)을 연관된 자식 엔티티에도 자동으로 적용하는 JPA 옵션이다. 기본값은 아무것도 전이하지 않는 것이다.
- 변수·컬렉션 캡슐화
넓은 범위에서 쓰이는 데이터에 직접 접근하지 못하게 하고, 읽고 쓰는 함수를 통해서만 다루게 하는 리팩터링. 데이터를 옮기거나 바꿀 때 고쳐야 할 곳이 접근 함수 한 곳으로 좁아진다.
- 저장소 역할 분담 (DB·캐시·큐·검색)
서버 애플리케이션 옆에는 거의 늘 관계형 DB, 인메모리 캐시, 메시지 브로커(message broker), 검색 엔진이 붙는다. 하나로 다 하지 않는 이유는 데이터의 성격(영구성·속도·전달·검색)마다 잘하는 도구가 다르기 때문이다.
- 최종 일관성
최종 일관성(eventual consistency)은 "지금 당장은 저장소마다 값이 다를 수 있지만, 새 변경이 멈추면 결국 같아진다"는 보장이다. 원본 DB와 검색 색인·캐시·다른 서비스처럼 물리적으로 분리된 저장소를 한 트랜잭션으로 묶을 수 없을 때 받아들이는 일관성 모델(consistency model)이다.