반응형
김영한님의 JPA 강의를 보다가 좋은 내용이 있어서 기록해둡니다.
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가 되기 때문에 조심해서 다뤄야 한다. (모든 필드를 교체)
반응형
'BE > JPA' 카테고리의 다른 글
[Spring Boot JPA] 테이블명, 컬럼명 생성 전략 수정하는 방법 (0) | 2023.01.18 |
---|---|
[JPA] 로그 속 쿼리의 파라미터 확인 방법 (0) | 2023.01.10 |
[JPA] PK 타입을 UUID로 사용하는 방법 (0) | 2022.05.09 |
[JPA] 17. JPQL - 2편 (0) | 2022.05.04 |
[JPA] 16. JPQL - 1편 (0) | 2022.05.01 |