자바 ORM 표준 JPA 프로그래밍 - 변경감지와 병합

lacblueeun·2021년 1월 19일
0

springboot

목록 보기
17/17
post-thumbnail

1. 변경 감지와 병합(mege)

1-1 변경 감지 (Dirty Checking)

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

준영속 엔티티 : 데이터베이스에 한번 접근하고 난 객체들은 영속성 컨텍스트에 의해서 더는 관리하지 않는 엔티티를 가리킨다.

1-2 병합(merge)

준영속 상태의 엔티티를 영속상태로 변경시켜준다.

1.ITem mergeItem = em.merge(item); 를 실행한다.
2. 조회한 영속 엔티티에 item 엔티티의 값을 채워넣는다.
3. 영속 상태인 mergeItem 를 반환한다. (기존의 item은 그대로 준영속 상태이다.)

1-3 병합의 주의점

변경 감지를 사용하면 원하는 속성을 선택해서 변경가능하다. 하지만 병합을 사용하면 모든 속성을 변경해야한다.
병합시 값이 없으면 null로 업데이트 할 위험도 있다. (병합은 모든 필드를 교체한다.)

영한님 : 실무에서 merge를 이용해서 깔끔하게 처리하는 경우가 거의없다.
엔티티를 변경할 때는 항상 변경 감지를 사용하세요!

2. 컨트롤러에서 애매하게 엔티티를 생성하지 마세요!

트랜잭션이 있는 서비스 계층에 식별자(id)와 변경할 데이터를 명확하게 전달해야 한다. DTO 객체를 서비스에 전달하고, 서비스에서 값을 수정하거나 설정해주는 것이 훨씬 좋다.

즉, 트랜잭션이 있는 서비스 계층에서 영속 상태의 엔티티를 조회하고, 엔티티의 데이터를 직접 변경하세요.

profile
Go for Frontend Developer 🧪

0개의 댓글