BE/JPA

[JPA] Dirty Checking(변경 감지) vs Merge(병합)

멍목 2023. 10. 15. 17:23
반응형

김영한님의 JPA 강의를 보다가 좋은 내용이 있어서 기록해둡니다.

 

https://inf.run/Codk

 

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 인프런 | 강의

실무에 가까운 예제로, 스프링 부트와 JPA를 활용해서 웹 애플리케이션을 설계하고 개발합니다. 이 과정을 통해 스프링 부트와 JPA를 실무에서 어떻게 활용해야 하는지 이해할 수 있습니다., - 강

www.inflearn.com

 


 

JPA에서 데이터를 수정할 때 병합을 사용하거나 변경 감지를 사용하는 데, 이 두 방식의 차이를 알아보자.

 

우선, 수정을 하기 전에 '준영속 엔티티'라는 개념을 정확히 알고 있어야 한다.

 

준영속 엔티티

  • 영속성 컨텍스트가 관리하지 않는 엔티티
  • 즉, JPA 기능을 통해서 가져오지 않은 엔티티를 의미한다.
  • 이 엔티티로 수정을 하던, 삭제를 하던 JPA에서는 UPDATE나 DELETE를 하지 않는다.

 

수정, 삭제와 같은 작업을 진행하기 위해서는 준영속 엔티티를 영속성 컨텍스트가 관리하도록 해야 하는데

그 방법이 아래 2가지다.

 

1. Dirty Checking (변경 감지)

PK로 DB에서 조회해서 얻은 엔티티에 변경할 내용을 덮어 쓴다.

Person person = em.find(Person.class, id);
person.setName("이름 변경");
person.setGender("성별 변경");

// 영속성 컨텍스트에서 자동으로 변경 감지 및 커밋 진행

 

2. Merge (병합)

EntityManager의 merge 기능을 사용한다.

Person person = new Person();
person.setId("1L");
person.setName("이름 변경");
person.setGender("성별 변경");

em.merge(person);

 

 

Dirty Checking vs Merge

Merge가 변경 감지 방식처럼 DB로부터 엔티티를 조회하고 데이터를 SET 해주는 소스를 자동으로 해준다고 생각해주면 된다.

하지만, null 이 들어가있는 데이터의 경우에도 null로 UPDATE가 되기 때문에  조심해서 다뤄야 한다. (모든 필드를 교체)

 

반응형