변경감지
와 병합
은 준영속 엔티티가 가지는 문제점 때문에 사용되는 방법이다.
📍 문제점 준영속 엔티티는 영속성 컨텍스트가 관리하지 않는다.
@Transactional
public void updateItem(Long itemId, Book param) {
// 영속 상태의 Entity 조회
Item findItem = itemRepository.findOne(itemId);
// 변경 감지(더티체킹)
findItem.setName(param.getName());
...
}
영속성 컨텍스트
는 변경된 사항만 감지하여, flush()
를 날려준다.
이 때, insert
가 아닌 수정 항목만 변경하는 update sql
을 날린다.
...
private final EntityManager em;
...
@Transactional
public void updateItem(Item param) {
Item mergedItem = em.merge(param);
}
mergedItem
는 영속성을 가지게 된다.
🚨 merge
는 null
도 모두 update
하게 되므로 사용에 주의해야한다.
(모든 필드를 update
함)
사용에 번거롭더라도 변경감지
를 사용하는 것이 좋다.
또한, 생성 메서드
, 비즈니스 로직
을 두어 setter
의 무분별한 사용을 자제하고, 응집력을 높이는 것이 좋다.
개인적으로 공부하며 기록한 내용으로, 틀린 내용이 있는 경우 덧글을 달아주시면 감사하겠습니다. 😍