Yebali

Spring JPA 준영속 엔티티 수정하기 본문

Spring

Spring JPA 준영속 엔티티 수정하기

예발이 2021. 10. 11. 19:07

준영속 엔티티란?

영속성 컨텍스트가 더는 관리하지 않는 엔티티를 말합니다.
해당 엔티티는 영속성 컨텍스트가 제공하는 기능을 사용하지 못한다.
임의로 만들어낸 엔티티도 기존 식별자(id)를 가지고 있는 경우에 준영속성 엔티티로 볼 수 있다.

준영속 엔티티 수정하는 방법

  1. 변경 감지 기능 사용
  2. 병합(merge) 사용

변경감지 기능

@Transactional
void update(Item itemParam) { 
  //itemParam: 파리미터로 넘어온 준영속 상태의 엔티티
  
  Item findItem = em.find(Item.class, itemParam.getId()); //같은 엔티티를 조회.
  findItem.setPrice(itemParam.getPrice()); //데이터를 수정한다. 
}

영속성 컨텍스트에서 엔티티를 다시 조회한 후 데이터를 수정하는 방법.
트랜잭션 커밋 시점에 변경이 감지(Dirty Checking)되고 이 동작에서 DB에 UPDATE Query를 실행한다.

병합 사용

@Transactional
void update(Item item) { 
  //itemParam: 파리미터로 넘어온 준영속 상태의 엔티티
  
  Item mergeItem = em.merge(item); //병합사용
}

병합은 준영속 상태의 엔티티를 영속 상태로 변경할 때 사용한다.
-> merge()하는 값으로 아예 대체해버린다

 

정리

변경 감지 기능을 사용하면 원하는 속성만 변경이 가능하다.
하지만 병합의 경우 모든 속성이 변경된다.

그렇기 때문에 엔티티를 변경 할 때는 변경 감지 기능을 사용하는 것이 좋다.


병합을 사용 할 경우 특정 속성에 값이 없으면 null로 업데이트되기 때문에 사용 시 주의해야 한다.