[Spring] JPA 준영속 엔티티

윤성철·2024년 5월 4일

Back-End

목록 보기
4/22
post-thumbnail

준영속 엔티티란

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

  • 준영속 엔티티는 detach 메서드를 통해서 혹은, 아래처럼 식별자를 강제로 주입한 객체가 될 수 있다.

참고 : https://sjiwon-dev.tistory.com/14

  • 준영속 엔티티는 영속성 컨텍스트가 관리하지 않기 때문에 엔티티가 수정되어도 그것을 반영할 근거가 없다.

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

  • 변경 감지 사용
  • 병합(merge) 사용

1. 변경 감지 사용 [권고 방식]

  • 영속성 컨텍스트에서 엔티티를 다시 조회 한 후 데이터를 수정하는 방법

간단하게 몸통을 가져와서 전부 교체한다고 생각하면 된다.

  1. 트랜잭션 안에서 엔티티를 다시 조회, 수정
  2. 트랜잭션 커밋이 이루어지면 dirty checking을 수행해 DB에 UPDATE 쿼리를 날린다.

2. 병합 사용

  1. merge()가 실행되면 1차 캐시 or 데이터베이스에서 엔티티를 조회하고 1차 캐시에 저장

  2. 기존의 엔티티에 변경, 추가된 내용을 전부 합친다.

  3. 트랜잭션 커밋 시점에 변경감지가 발생해서 UPDATE 쿼리를 날린다.

    변경 감지를 사용하면 속성만 변경할 수 있지만, 병합은 엔티티 전체를 수정한다.
    setPrice로 상품의 가격을 수정하는 코드가 누락된 경우 DATABASE의 가격칼럼이 NULL로 바뀔 수 있다...

profile
내 기억보단 내가 작성한 기록을 보자..

0개의 댓글