JPA :: 준영속 엔티티 적용법
준영속 엔티티란
- 영속성 컨텍스트가 관리하지 않는 엔티티
- 때문에 값을 수정해도
dirty checking
을 하지 않는다.
방법 1. 변경 감지
@Autowired EntityManager em;
void update(Item param) {
Item findItem = em.find(Item.class, param.getId());
findItem.setPrice(param.getPrice());
}
- 영속성 컨텍스트에서
key
값을 통해 엔티티를 조회한다. - 반환된 엔티티에서 원하는 요소를 수정하기만 하면 된다.
- 커밋 시점에
dirty checking
으로 UPDATE문을 실행하기 때문이다.
- 커밋 시점에
방법 2. 병합
준영속 상태의 엔티티를 영속 상태로 변경할 때 사용한다.
void update(Item param) {
Item mergeItem = em.merge(param);
}
- 변경 감지와는 달리, 준영속 엔티티의 모든 값을 덮어씌우는 방식이다.
병합 동작 방식
출처: 책 자바 ORM 표준 JPA 프로그래밍 3.6.5
- 장점
- 편하고, 코드가 훨씬 간단하다.
- 준영속 엔티티의 변경 사항을 개발자가 신경쓰지 않아도, 원하는 대로 작동한다.
- 단점
- 병합 시 값이 없으면,
null
로 업데이트 할 위험이 있다. - 준영속 엔티티가 모든 데이터를 항상 올바르게 유지해야만 한다.
- 변경할 필요가 없는 필드도 모두 변경한다.
- 일부 변경 가능한 데이터만 노출된 경우, 불필요하게 준영속 엔티티에 데이터를 채워넣는 등 추가 비용이 발생한다.
- 병합 시 값이 없으면,
결론 : 변경 감지를 사용하자!
- 변경 감지는 개발자가 변경 사항을 코드로 명확하게 작성하므로, 보다 더 안전하다.
- 병합 방식의 장점이었던 '편함'도, 준영속 엔티티가 모든 데이터를 완벽하게 보관하고 있을 때의 이야기다. 그렇지 않다면 오히려 번거롭다.
- 편함 이외의 장점은 아직까지는 잘 모르겠다..
물론 실무자들이 병합을 쓰는 데는 이유가 있을 것이다.
그러나 병합을 사용해야 하는 명확한 이유가 없다면, 변경 감지를 쓰는 편이 여러 모로 더 좋다고 생각된다.😀
Author And Source
이 문제에 관하여(JPA :: 준영속 엔티티 적용법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@wisepine/JPA-준영속-엔티티-적용법저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)