Spring 변경 감지와 병합(merge)

eunsiver·2022년 3월 23일
0

준영속 엔티티


  • 영속성 컨텍스트가 더는 관리하지 않는 엔티티

  • 임의로 만들어낸 엔티티도 기존 식별자를 가지고 있으면 준영속 엔티티로 볼 수 있다.

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

❓❓그렇다면 어떻게 준영속 엔티티를 관리할 수 있을까??

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


  • 변경 감지 기능 사용

  • 병합(merge) 사용

    • 준영속 상태의 엔티티를 영속 상태로 변경할 때 사용하는 기능
    • 넘어온 모든 데이터를 바꿔치기 함

Merge 병합

public void save(Item item){
  if (item.getId()==null){
    em.persist(item);
    }
  else{
    Item merge=em.merge(item);
    }
  }

Item merge=em.merge(item);
Item merge가 영속성 컨텍스트로 관리, item은 X

⛔Merge 시 주의점


  • 변경 감지 기능을 사용하면 원하는 속상만 선택해서 변경할 수 있지만, 병합을 사용하면 모든 속성이 변경된다.

  • 병합시 값이 없으면 null로 업데이트 할 위험이 있다.(병합은 모든 필드를 교체한다)

  • 실무에서는 보통 변경가능한 데이터만 노출하기 때문에, 병합을 사용하는 것이 더 번거롭다.

결론💥 Merge보다는 변경 감지 기능을 사용하자

✖️추가

변경감지 기능을 사용할 때 setter를 사용하면 추적하기 어렵다.
setter 보다는 의미있는 메서드를 사용하여 변경을 확실하게 알 수 있게 하자!

profile
Let's study!

0개의 댓글