JPA :: 준영속 엔티티 적용법

숑숑·2022년 2월 13일
0

JPA

목록 보기
1/4

준영속 엔티티란

  • 영속성 컨텍스트가 관리하지 않는 엔티티
  • 때문에 값을 수정해도 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로 업데이트 할 위험이 있다.
    • 준영속 엔티티가 모든 데이터를 항상 올바르게 유지해야만 한다.
    • 변경할 필요가 없는 필드도 모두 변경한다.
    • 일부 변경 가능한 데이터만 노출된 경우, 불필요하게 준영속 엔티티에 데이터를 채워넣는 등 추가 비용이 발생한다.

결론 : 변경 감지를 사용하자!

  • 변경 감지는 개발자가 변경 사항을 코드로 명확하게 작성하므로, 보다 더 안전하다.
  • 병합 방식의 장점이었던 '편함'도, 준영속 엔티티가 모든 데이터를 완벽하게 보관하고 있을 때의 이야기다. 그렇지 않다면 오히려 번거롭다.
    • 편함 이외의 장점은 아직까지는 잘 모르겠다..

물론 실무자들이 병합을 쓰는 데는 이유가 있을 것이다.
그러나 병합을 사용해야 하는 명확한 이유가 없다면, 변경 감지를 쓰는 편이 여러 모로 더 좋다고 생각된다.😀

profile
툴 만들기 좋아하는 삽질 전문(...) 주니어 백엔드 개발자입니다.

0개의 댓글