Spring
[Spring] Dirty Checking & Merge
dawn9
2022. 5. 16. 04:46
준영속 엔티티
영속성 컨텍스트가 더는 관리하지 않는 엔티티
Dirty Checking(변경감지)
1. 트랜잭션 커밋 시점에 JPA가 flush()
2. 영속성 컨텍스트 내에 변경된 엔티티가 있는지 확인
3. 변경된 엔티티가 있다면 DB에 update SQL 실행
//Dirty Checking Example
@Transactional
public void updateMember(Member member){ //파라미터의 member는 준영속 상태의 엔티티
Member findMember = em.find(Member.class, member.getId());
findMember.setName(member.getName());
findMember.setPhoneNum(member.getPhoneNum());
}
Merge(병합)
1. 준영속 엔티티의 식별자 값으로 1차 캐시에서 영속 엔티티를 조회
(1차 캐시에 없다면 데이터베이스에서 엔티티를 조회하고, 있을 때 1차 캐시에 저장)
2. 영속 엔티티의 값을 준영속 엔티티의 값으로 모두 교체(병합)
3. 트랜잭션 커밋 시점에 변경 감지 기능이 동작해서 데이터베이스에 update SQL 실행
//Merge Example
@Transactional
public void updateMember(Member member){ //파라미터의 member는 준영속 상태의 엔티티
Member mergeMember = em.merge(member);
}
변경감지 vs 병합
변경감지는 원하는 속성만을 선택해 변경할 수 있지만 병합은 모든 속성이 변경됨.
병합할 때 속성값이 없으면 null값을 DB에 반영할 위험이 있으므로 변경감지를 사용해야 함.
//이상적인 방법
@Transactional
public void updateMember(Long id, String name, String phoneNum){
Member member = memberRepository.findOne(id);//영속상태
member.changeInfo(name,phoneNum);
}