Backend/springboot

[SpringBoot] 영속성 컨텍스트, 변경 감지와 병합(merge)

설기똥꼬 2023. 1. 6. 00:01

영속성 컨텍스트 : "엔티티를 영구 저장하는 환경"

  • Server side와 Database 사이에 엔티티를 저장하는 논리적인 영역
  • 엔티티 매니저로 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.
  • 눈에 보이지 않는 논리적인 개념
  • 엔티티 매니저를 통해 영속성 컨텍스트에 접근
EntityManager.persist(entity);

 

준영속 엔티티

  • 영속성 컨텍스트가 더는 관리하지 않는 엔티티
  • 임의로 만들어낸 엔티티도 기존 식별자를 가지고 있으면 준영속 엔티티로 볼 수 있음

준영속 엔티티의 문제: JPA가 관리를 안함, 변경을 해도 update가 안됨

 

준영속 엔티티를 수정하는 2가지 방법

  1. 변경 감지 기능 사용
  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 보다는 메소드를 활용