[JPA] 변경감지와 merge 정리

도도·2023년 9월 9일
0

SPRING

목록 보기
14/14

준영속 엔티티란 ?

  • 영속성 엔티티가 더는 관리하지 않는 엔티티를 말한다.

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

  • 변경 감지 기능 사용
  • 병합(merge) 기능 사용

변경 감지 기능

@Transactional
void update(Item itemParam){
	Item findItem = em.find(Item.class, itemParam.getId());
    findItem.setPrice(itemParam.getPrice());
}

영속성 컨텍스트에서 엔티티를 다시 조회한 후에 데이터를 수정하는 방법
트랜잭션 안에서 엔티티를 다시 조회, 변경할 값 선택 -> 트랜잭션 커밋 시점에서 변경 감지
이 동작을 통해 데이터베이스 UPDATE SQL 실행

병합 사용
병합은 준영속 엔티티를 영속 상태로 변경할 때 사용하는 기능

@Transactional
void update(Item itemParam){
	Item mergeItem = em.merge(itemParam);
}

동작 방식을 정리하자면
1. 준영속 엔티티의 식별자 값으로 영속 엔티티를 조회
2. 영속 엔티티의 값을 준영속 엔티티의 값으로 모두 교체(병합)
3. 트랜잭션 커밋 시점에 변경 감지 기능이 동작해서 데이터베이스에 UPDATE SQL이 실행

🚨 이 때, 주의할 점으로

변경 감지 기능을 사용하려면 원하는 속성만 선택해서 변경할 수 있지만, 병합을 사용하면 모든 속성이 변경된다. 병합시 값이 없으면 null로 업데이트 할 위험이 있다

따라서 실무에서 업데이트를 기능을 이용하려면 변경 감지를 항상 사용하는 것을 추천한다.


이 페이지는 김영한님의 JPA활용 1편 강의를 참고했습니다.

profile
공부한것 정리하는 중입니다~

0개의 댓글