Backend/springboot
[SpringBoot] 영속성 컨텍스트, 변경 감지와 병합(merge)
설기똥꼬
2023. 1. 6. 00:01
영속성 컨텍스트 : "엔티티를 영구 저장하는 환경"
- Server side와 Database 사이에 엔티티를 저장하는 논리적인 영역
- 엔티티 매니저로 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.
- 눈에 보이지 않는 논리적인 개념
- 엔티티 매니저를 통해 영속성 컨텍스트에 접근
EntityManager.persist(entity);
준영속 엔티티
- 영속성 컨텍스트가 더는 관리하지 않는 엔티티
- 임의로 만들어낸 엔티티도 기존 식별자를 가지고 있으면 준영속 엔티티로 볼 수 있음
준영속 엔티티의 문제: JPA가 관리를 안함, 변경을 해도 update가 안됨
준영속 엔티티를 수정하는 2가지 방법
- 변경 감지 기능 사용
- 병합(merge) 사용
- 준영속 상태의 엔티티를 영속 상태로 변경할 때 사용하는 기능
- 넘어온 모든 데이터를 바꿔치기 함
Merge 병합
public void save(Item item){
if (item.getId()==null){
em.persist(item);
}
else{
Item merge=em.merge(item);
}
}
Merge 시 주의사항
- 변경 감지 기능을 사용하면 원하는 속성만 선택해 변경이 가능하지만, 병합을 사용하면 모든 속성이 변경됨
- 병합시 값이 없으면 null로 업데이트 할 위험 존재 (병합은 모든 필드를 교체)
- 실무에서는 보통 변경가능한 데이터만 노출하기 때문에, 병합을 사용하는 것이 더 번거롭다.
- Merge보다는 변경 감지 기능을 사용하는 것이 더 낫다.
- 변경감지 기능을 사용할 때 setter를 사용하면 추적하기 어려우므로 setter 보다는 메소드를 활용