JPA에는 entity를 수정하는 두 가지 방법이 있다.
✏️변경 감지(dirtyChecking)와 병합(merge) 이 두 가지 방법의 차이점에 대해 정리해 보려고 한다.
변경 감지는 최초 엔티티가 1차 캐시에 들어온 상태와 현재 상태를 비교하여 변경된 부분이 있으면 반영하는 것이다.
// 영속 엔티티 조회
Member memberA = em.find(Member.class, "memberA");
// 영속 엔티티 데이터 수정
memberA.setUsername("hi");
memberA.setAge(10);
transaction.commit(); // [트랜잭션] 커밋
엔티티 정보를 수정하고 entityManager.persist()를 하지 않는다.
객체의 id값에 따라 새로 생성하거나 이미 존재하는 엔티티를 수정한다.
@PostMapping("/members/{memberId}/editName")
public String updateMemberName(@ModelAttribute("form") MemberNameEditForm form){
Member member = new Member();
member.setId(form.getId());
member.setName(form.getName());
em.merge(member);
return "redirect:/members";
public void save(Member member){
if(Member.getId() == null){
em.persist(member);
}
else{
em.merge(member);
}
}
위의 코드와 같이 id값 여부에 따라 persist()와 merge()를 나누어 사용한다.
특별한 상황이 아니라면 되도록 변경 감지(dirtyChecking)을 사용하여 엔티티 값을 수정하는 것이 좋아 보인다.