JPA Dirty Checking 과 Flush
- JPA에서는 더티 체킹을 통해 변경된 엔티티의 데이터만 flush한다
- 엔티티에 대한 메타 데이터는
PersistenceContext
내에서 보관하고 수정사항이 있는지 여부를 체크해 업데이트를 수행한다
1 |
|
entityManager.find()
entityManager.find(Coffee.class, 1);
를 하는 순간 엔티티를 조회해 와EntityEntry
를 생성한다.- 이 엔트리는
loadedState
로 영속성 컨텍스트에 들어올 당시의 프로퍼티들을 가지고 있게 된다. - 그리고 이 엔트리와 연관된 엔티티를 페어로 묶어 영속성 컨텍스트에 저장한다.
entityManager.flush()
- 이제 flush()를 하면
FlushEventListener
에서 영속성 컨텍스트에 접근해 관리중이던 엔트리 페어를 가져온다. - 엔트리 페어의
Status
를 확인하고 적합한 엔트리들을FlushEntityEventListner
로 넘긴다. FlushEntityEventListner
는 더티체킹이 필요한 엔티티인지 와 엔티티와loadedState
를 통해 더티 프로퍼티가 존재하는지 등을 확인하고 필요한 엔티티라면 업데이트 액션을 추가한다.- 업데이트 액션에서
Write Lock
을 잡고 DB에 flush를 하면서 영속성 컨텍스트에 저장된 엔티티의loadedState
값을 변경된updateState
로 바꾸게 된다.