노트더티 체킹
Dirty Checking
백엔드#jpa · 연결된 개념 9개
쉽게 말하면
더티 체킹은 집을 빌릴 때 처음 상태를 사진으로 찍어 두고, 나갈 때 사진과 비교해 달라진 게 있으면 알려 주는 것과 같아요. 객체 값을 바꾸기만 하면 저장을 다시 부르지 않아도 그 변경이 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
연결된 개념
이 노트를 가리키는 문서
뜻이 가까운 노트
- 구조적 공유
구조적 공유(Structural Sharing)는 새 버전의 데이터를 만들 때 바뀌지 않은 부분은 이전 버전의 객체를 그대로 가리키게 하는 기법이다. 바뀐 노드와 그 노드까지 올라가는 경로만 새로 만들고, 나머지 가지는 두 버전이 함께 쓴다. 불변 데이터를 다루면서도 매번 전체를 복사하지 않게 해 준다.
- 트랜잭션·트랜지션·뮤테이션 구분
세 단어는 이름이 비슷하지만 다루는 층이 다르다. 뮤테이션(mutation)은 데이터를 바꾸는 작업, 트랜잭션(transaction)은 여러 변경을 전부 반영하거나 전혀 반영하지 않게 묶는 단위, React의 트랜지션(transition)은 화면 업데이트의 우선순위를 낮추는 표시다.
- JPA Auditing
JPA Auditing은 엔티티의 생성·수정 시각과 생성자·수정자를 저장할 때 자동으로 채워 주는 Spring Data JPA 기능이다. 모든 엔티티에 반복되는 createdAt = now() 코드를 없앤다.
- 영속성 전이 (cascade)
영속성 전이(cascade, transitive persistence)는 부모 엔티티에 한 영속성 작업(저장·병합·삭제 등)을 연관된 자식 엔티티에도 자동으로 적용하는 JPA 옵션이다. 기본값은 아무것도 전이하지 않는 것이다.
- 변수·컬렉션 캡슐화
넓은 범위에서 쓰이는 데이터에 직접 접근하지 못하게 하고, 읽고 쓰는 함수를 통해서만 다루게 하는 리팩터링. 데이터를 옮기거나 바꿀 때 고쳐야 할 곳이 접근 함수 한 곳으로 좁아진다.