JPA의 더티 체킹이란 무엇인가요?
더티 체킹은 JPA의 특징 중 하나로 트랜잭션 안에서 엔티티의 변경이 일어나면, 변경 내용을 자동으로 데이터베이스에 반영하는 기능입니다.
Dirty Checking의 뜻은 변경 감지 정도로 생각할 수 있습니다. 변경을 감지해서 DB에 반영합니다.
추가질문
더티 체킹은 그럼 어떤 과정으로 변경을 감지하나요?
변경사항이 생기는 어떤 데이터의 업데이트 쿼리문의 더티 체킹의 과정을 크게 3개로 구분해보면 로딩, 변경, 커밋 시점으로 구분할 수 있습니다.
엔티티 로딩 시점은 최초 JPA는 엔티티를 데이터베이스에서 로딩할 때 최초 엔티티의 상태를 스냅샷(초기 상태)으로 저장합니다. 트랜잭션 내에서 변경이 일어난 경우에 어떤 부분이 바뀌었는지를 비교하는 기준이 됩니다.
트랜잭션 내에서 변경 시점은 일반적으로 실제 수정 작업을 이야기합니다. 트랜잭션 내에서 엔티티의 속성이 변경되면, JPA는 해당 변경 사항을 추적합니다. 추적된 내용들은 더티 체킹이 필요할 때 사용됩니다.
커밋 시점 트랜잭션이 커밋될 때, JPA는 엔티티의 현재 상태와 스냅샷을 비교하여 변경된 속성을 감지합니다. 변경된 속성이 있다면, 초기 스냅샷을 비교하여 그 부분만을 데이터베이스에 업데이트하고 나머지는 그대로두게 됩니다.
이런식으로 엔티티의 상태를 효율적으로 관리하면서 필요한 변경된 부분만 감지하여 업데이트를 수행하게 됩니다.
추가질문
더티 체킹은 어떤 방식으로 구현되나요?
위 더티 체킹 기능은 JPA의 EntityManager 객체가 수행합니다. EM은 영속성 컨텍스트를 통해 엔티티의 상태를 추적하고, 각 수행문인 쿼리문들을 액션 큐라는 공간에 저장해두었다가 커밋과 같은 실행에 일괄적으로 데이터베이스에 변경사항을 반영하는 역할을 합니다. EntityManager는 EntityManagerFactory (EMF)로부터 생성됩니다. EntityManagerFactory는 JPA의 핵심 구성 요소 중 하나입니다.
추가질문
영속성 컨텍스트는 무엇인가요?
영속성 컨텍스트는 JPA에서 중요한 개념 중 하나로, 엔티티의 변경 등 상태를 관리하는 작업 환경이라고 볼 수 있습니다. 임시공간, 가상 공간과 같은 개념이라고 생각 할 수 있고 EM이 Java의 특정 객체를 persist() 메소드로 호출하게되면 그 객체는 Managed라는 영속성이 관리하는 상태가 됩니다. 이런 관리 받고 있는 객체들이 모여있는 곳이 영속성 컨텍스트라는 공간입니다. 이처럼 EM이 변동사항들을 영속성 컨텍스트 내에서 계속 관리하고있다가 액션큐에서 커밋이 되면 DB로 한번에 쿼리들이 작동하게 됩니다.