[Spring Boot] 변경 감지와 병합

이용구·2023년 10월 28일

영속성 컨텍스트란?

엔티티를 영구 정장하는 환경이라는 뜻이다.

애플리케이션과 DB 사이에서 객체를 보관하는 가상의 DB 역할을 한다.
EntityManager를 통해 엔티티를 저장하거나 조회하면
EntityManager는 영속성 컨텍스트에 엔티티를 보관한고 관리한다.


@Autowired
EntityManager em;

em.persist(entity);

엔티티 매니저를 사용해 영속성 컨텍스트에 저장.



준영속 엔티티?

준영속 상태

영속상태의 엔티티가 영속성 컨텍스트에서 분리된 것

  1. em.detach(entity)
  • 특정 엔티만 준영속 상태로 변경한다.
  1. em.clear()
  • 영속성 컨텍스트를 완전히 초기화 한다.
  1. em.close()
  • 영속성 컨텍스트를 종료한다.

준영속 엔티티

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

  • db에 한 번 갔다온 엔티티

  • 이미 db에 한번 저장되어 식별자가 존재하는 경우.
    이렇게 임의로 만들어낸 엔티티도
    기존 식별자를 가지고 있으면 준영속 엔티티로 볼 수 있다.

  • jpa 가 식별 할 수 있는 id를 가지고있다

form을 통해 넘어온 데이터로 book을 생성한다.
form에서 getId()로 새로 만든 객체 book에 데이터를 넣는 과정인데,
이미 form으로 id가 세팅이 되어있다.

이미 jap에 한 번 저장되어 식별자가 존재한다.

준영속 상태 객체이기 때문에 아무리 값을 수정해도 db update가 일어나지 않는다.


준영속 엔티티 데이터 변경하기

1. 변경 감지 기능 사용

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



2. merge

merge()를 사용하면
넘겨진 값으로 모든 데이터를 다 바꿔치기 한다.

넘겨진 값이 영속성 상태를 가지는 것이 아니고
리턴 값이 영속성 상태를 가지게 됨



차이점

변경감지

  • 원하는 속성만 선택하여 변경 가능.

merge 호출 시

  • 만일 값을 세팅할 때 값이 없으면 null로 그냥 바꿔치기해서 반환해버림.
profile
베짱이는 개미가 밉다

0개의 댓글