Dirty Checking
JPA에서 Dirty checking은 영속성 컨텍스트(Persistence Context)에서 엔티티 객체의 상태 변경을 감지하는 메커니즘입니다. JPA는 엔티티 객체를 조회하거나 변경할 때, 엔티티의 상태를 추적하고 변경된 내용을 데이터베이스에 자동으로 반영하는 기능을 제공합니다.
영속성 컨텍스트는 JPA가 엔티티를 관리하는 논리적인 영역으로, 엔티티의 변경 여부를 추적하고 이를 데이터베이스에 동기화합니다. 엔티티 객체의 필드가 변경되면, 영속성 컨텍스트는 이를 감지하여 변경된 필드만 데이터베이스에 반영합니다. 이 과정에서 Dirty checking이 수행되어 변경된 필드만을 업데이트합니다.
Dirty checking은 데이터베이스에서 특정 객체의 값을 변경하고자 할 때, 이전 값과 변경된 값 사이의 차이를 비교하여 변경 여부를 판단합니다.이때 변경된 값이 이전 값과 다르다면, 해당 객체를 업데이트하거나 특정 동작을 수행할 수 있습니다.
Dirty Checking 과정
1. JPA는 영속성 컨텍스트에 Entity를 저장할 때 최초 상태(LoadedState)를 저장
2. 트랜잭션이 commit되고 em.flush(); 가 호출되면 Entity의 현재 상태와 저장한 최초 상태를 비교
3. 변경 내용이 있다면 Update SQL을 생성하여 쓰기 지연 저장소에 저장하고 모든 쓰기 지연 저장소의 SQL을 DB에 요청
4. 마지막으로 DB의 트랜잭션이 commit 되면서 반영
따라서 변경하고 싶은 데이터가 있다면 먼저 데이터를 조회하고 해당 Entity 객체의 데이터를 변경하면 자동으로 Update SQL이 생성되고 DB에 반영합니다.
정리
- Hibernate와 같은 ORM(Object-Relational Mapping) 도구에서 Dirty checking 기능을 제공
- Dirty Checking은 트랜잭션 중에 변경이 발생할 때 작동하며 이러한 변경은 자동으로 데이터베이스에 반영
- 영속 객체를 생성, 세션에 연결하며 변경 사항을 자동으로 데이터베이스와 동기화하기 위해 메서드를 호출
- 영속 객체의 변경 사항을 관리하는 프로세스를 단순화하고 데이터베이스가 이에 따라 업데이트되도록 보장
'Spring' 카테고리의 다른 글
| Spring Day 10 : 인증과 인가 (1) | 2024.02.01 |
|---|---|
| Spring Day 9 : JPA Auditing (0) | 2024.01.30 |
| Spring Day 7 : 영속성 콘텍스트 (0) | 2024.01.26 |
| Spring Day 6 : JPA (0) | 2024.01.25 |
| Spring Day 5 : IoC(제어의 역전)과 DI(의존성 주입) (0) | 2024.01.24 |