더티 체킹(Dirty Checking)이란 객체가 가지고 있는 값의 변경을 추적하고, 변경된 경우에만 데이터베이스와 동기화하는 기능을 말한다. 이는 JPA와 같은 ORM 프레임워크에서 주로 사용된다.
일반적으로 데이터베이스에서 엔티티의 상태를 변경한 경우 update 쿼리 실행을 통해 변경 사항을 데이터베이스에 반영하지만, JPA에서는 트랜잭션 내에서 엔티티의 상태가 변경되면 이를 자동으로 감지하고, 트랜잭션이 종료되는 시점에 변경된 엔티티에 대한 update 쿼리를 자동으로 생성하여 실행한다. 이렇게 변경 사항을 자동으로 감지하고 반영하는 기능을 더티 체킹이라고 한다. 더티 체킹은 영속성 컨택스트(Persistence Context) 안에 있는 엔티티를 대상으로 일어난다. 이 때, 영속성 컨텍스트는 엔티티를 영구적으로 저장하기 위한 환경을 의미한다. 엔티티가 데이터베이스에 저장되기 전 임시로 보관하고 관리되는 영역이다.
영속성 컨텍스트는 다음과 같은 역할을 수행한다.
엔티티의 생명주기 관리: 영속성 컨텍스트는 엔티티의 생명주기(비영속, 영속, 준영속, 삭제)를 관리한다.
캐시의 기능: 영속성 컨텍스트는 캐시의 기능을 가지고 있어, 한 트랜잭션 내에서 같은 엔티티를 조회할 경우, 영속성 컨텍스트에 캐시된 엔티티를 반환하여 성능을 향상시킨다.
더티 체킹: 영속 상태의 엔티티에 대한 변경을 감지하고, 변경된 엔티티에 대해 자동으로 UPDATE SQL을 생성하여 데이터베이스에 반영한다.
지연 로딩(Lazy Loading): 연관된 엔티티를 실제로 사용하는 시점에 데이터베이스에서 로딩하는 기능을 제공한다.
영속성 컨텍스트는 이런 방식으로 엔티티를 안전하게 저장하고, 필요에 따라 엔티티를 빠르게 조회하거나 변경사항을 적절히 반영하는 등의 역할을 수행하며, 이를 통해 개발자는 데이터 접근 및 관리에 대한 복잡성을 줄일 수 있다.