JPA 변경 감지와 병합(merge) - dnwls16071/Backend_Study_TIL GitHub Wiki

📚 JPA 변경 감지와 병합(merge)

  • 준영속 엔티티 : 영속성 컨텍스트가 관리하지 않는 엔티티

📚 엔티티를 변경할 때는 항상 변경 감지를 사용하기

  • 컨트롤러에서 어설프게 엔티티 생성하지 말기
  • 트랜잭션이 있는 서비스 계층에 식별자와 변경할 데이터를 명확하게 전달하기(파라미터 혹은 DTO)
  • 트랜잭션이 있는 서비스 계층에서 영속 상태의 엔티티를 조회하고 엔티티 데이터를 직접 변경하기
  • 트랜잭션 커밋 시점에 변경 감지가 발생

📚 merge()를 지양하는 이유

1. merge()를 실행한다.
2. 파라미터에 전달한 준영속 엔티티 식별자 값으로 JPA의 1차 캐시에서 엔티티를 조회한다. 
   2-1. 이 때, 1차 캐시에 엔티티가 존재하지 않는다면 데이터베이스에서 엔티티를 조회한다.(수정 시의 경우)
   2-2. 데이터베이스에서도 발견하지 못하면 새로운 엔티티를 생성해서 병합한다.
3. 조회한 영속 엔티티에 준영속 엔티티의 값을 채워 넣는다.

📚 병합

  • 식별자 값으로 엔티티를 조회할 수 있으면 1차 캐시로 불러와서 병합하고 조회할 수 없다면 새로 생성해서 병합한다.
  • 불러와서 병합하거나 새로 생성해서 병합, 이것을 Save Or Update 기능이라고 한다.
  • 하지만 수정 과정에서 일부 필드만 수정을 원하는 경우가 있기 때문에 merge()를 사용하게 되면 일부 필드가 null로 들어갈 위험이 있다. 따라서 변경 감지를 사용해서 수정하는 것을 권장한다.