Avatar 창조적이고 생산적이고 싶은 개발자

#7 JPA 실무 - 변경감지(Dirty checking)와 merge

준영속 엔티티

  • 영속성 컨텍스트가 더는 관리하지 않는 엔티티를 말한다.(detached)
  • Persistence Context로부터 명시적으로 detach하지 않았지만 식별자를 가지고 있는 엔티티는 준영석 엔티티로 볼 수 있다.

merge

  • 준영석 엔티티를 영석 상태로 만들어주는 메소드
  • merge를 수행할 경우 영속성 컨텍스트에 객체가 없는 경우 DB에서 조회 -> 엔티티 영속화 -> 요청된 엔티티와 변경사항을 감지한 후 영속성 컨텍스트의 엔티티에 반영

데이터 수정 시 Dirty checking vs merge

  • Dirty checking이 좀 더 jpa의 근본 원리에 가까움
  • Dirty checking은 영속화된 엔티티의 수정사항이 발생할 경우 변경된 사항을 감지하고 db에 update를 수행함
  • merge의 경우는 db로부터 엔티티를 검색해와서 영속화 한 후 준영속 엔티티와의 차이를 모두 영속화 엔티티에 반영함
  • null 필드가 있는 경우 모두 반영되기때문에(예외적으로 가능한 방법도 있지만 이런거 다 쓰면 유지보수가 진짜 힘들어짐) 실수할 여지도 많고 의도치 않은 데이터 변경도 잦다.
  • 실무에서는 되도록이면 Dirty checking을 통해서 데이터를 변경하도록 하자