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

Yebali·2021년 4월 14일
1

약간의_Spring

목록 보기
11/30
post-thumbnail

준영속 엔티티란?

영속성 컨텍스트가 더는 관리하지 않는 엔티티를 말합니다.
해당 엔티티는 영속성 컨텍스트가 제공하는 기능을 사용하지 못합니다.
임의로 만들어낸 엔티티도 기존 식별자(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()하는 값으로 아예 대체해버린다.

정리

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

엔티티를 변경 할 때는 변경 감지 기능을 사용하자.
트랜잭션이 있는 서비스 계층의 식별자(id)와 변경할 데이터를 명확하게 전달하자!

사용하지 말아야 할 이유는?
병합시 특정 속성에 값이 없으면 null로 업데이트 되기 때문에.

출처 : https://www.inflearn.com/users/@yh

profile
머리에 다 안들어가서 글로 적는 중

0개의 댓글