Jpa

jpa 준영속 상태 및 merge vs 변경감지 비교

무대포 개발자 2021. 1. 6. 20:22
728x90
반응형

jpa 준영속 상태

개념

  • 영속성 컨텍스트가 더 이상 관리하지 않는 엔티티를 준영속 상태라고 함.
  • 즉, database 에 이미 한 번 갔다 온다음, 영속성 콘텍스트에서 빠진 Entity 를 준영속 상태라고 함.
-- 여기서 member 는 이미 1이라는 pk 로 저장돼있다고 가정하고
-- api 를 통해 다시 한 번 들어오면, Member member = new Member() 는 준영속 상태이다.
-- 영속

@PostMapping(xxx)
public xxx updateMember(xxx) {
    Member member = new Member();
    member.setId(1);
}

준영속 엔티티를 수정하는 방법

1. find 로 찾은 다음에 데이터를 변경해줌 (best 방법)
  • 아래와 같이 데이터를 수정하면, 변경 감지를 통해 update 해줌.
@Transactional
public void updateMember(MemberDto xxx) {
    Member member = memberRepository.findOne(memberId);
    member.setName(xxx);
}
2. merge 호출 및 동작방식
2.1 merge 호출
// merge 호출
em.merge(member);

// merge 상세 동작 - 데이터를 조회해와서 아래와 같이 set 을 한 번씩 더 해줌.
// 즉, 불필요한 set 과정이 한 번 더 들어가는거지. 
Member member = memberRepository.findOne(memberId);
member.setName(xxx)
member.setAge(xxx);
2.2 Merge 동작 방식
  • em.merge(paramMember) —> 1차 캐시 에서 엔티티 찾음. —> 없으면 DB 조회 함.
  • 위에서 찾은 데이터를 dbMember 객체 라고 하면, dbMember 객체에 paramMember 의 값을 전부 set 해줌.
  • set 해준다음에 영속성상태인 dbMember 를 반환. paramMember 는 영속성 상태가 아니다.
변경감지 vs merge
  • merge 는 필드를 전부 교체해버리기에 주의해서 써야 함.
  • 내가 실수로 Member.age 에 null 값을 넣어버리면 이게 그대로 디비에 반영이 되버림.
  • 변경감지의 경우 변경할 것만 바꿔주면 나머지는 그대로 값이 들어감.