ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 엔티티의 상태
    spring/스프링 입문 주차 2024. 1. 25. 09:41

    비영속과 영속 상태
    비영속 상태 : 객체를 persist 하기 전의 객체
    영속 상태 : 객체를 persist 한 이후 JPA에게 관리되는 객체
    준영속(Detached) 상태 : 영속 상태였다가 분리된 객체

    em.contains : Entity객체가 현재 영속성 컨텍스트에 의해 관리되는 객체인지 확인하는 메서드
    변경 감지(dirty checking)가 일어나는 것은 영속 상태일 때만 일어난다.

    영속 상태에서 준영속 상태로 전환하는 방법
    - em.detache() : 해당 객체를 준영속 상태로 전환
    - em.clear() : 영속성 컨텍스트를 완전히 초기화하여 모든 Entity를 준영속 상태로 만든다.
     - 영속성 컨텍스트의 틀은 유지하지만 내용은 비워 새로 만든 것과 같은 상태가 된다.
     - 따라서 계속해서 영속성 컨텍스트를 이용할 수 있다.

    - em.close() : 영속성 컨텍스트를 종료한다.
     - 해당 영속성 컨텍스트가 관리하던 영속성 상태의 Entity들은 모두 준영속 상태로 변경된다.
     - 영속성 컨텍스트가 종료되었기 때문에 계속해서 영속성 컨텍스트를 사용할 수 없다.

     



    준영속 상태에서 다시 영속 상태로 바꾸는 방법
    em.merge : 전달받은 Entity를 사용하여 새로운 영속 상태의 Entity를 반환한다.
    - 파라미터로 전될된 Entity의 식별자 값으로 영속성 컨텍스트를 조회한다.
     1. 해당 Entity가 영속성 컨텍스트에 없다면?
      a. DB에서 새롭게 조회한다.
      b. 조회한 Entity를 영속성 컨텍스트에 저장한다.
      c. 전달 받은 Entity의 값을 사용하여 병합한다.
      d. Update SQL이 수행된다.(수정)
     2. 만약 DB에도 없다면?
      a. 새롭게 생성한 Entity를 영속성 컨텍스트에 저장한다.
      b. Insert SQL이 수행된다. (저장)
    - 따라서 merge(entity) 메서드는 비영속, 준영속 모두 파라미터로 받을 수 있으며 상황에 따라
     '저장'을 할 수도 '수정'을 할 수도 있다.

    em.merge() 에서 인자값으로 사용된 객체는 '조회'에 사용되고, 실제로 merge되는 것은 새롭게 만들어진 객체이다.
    때문에 인자값으로 사용된 객체를 em.contains 해도 false 가 나온다.
    하지만 Memo mergedMemo = em.merge(memo) 로 반환된 
    mergedMemo 를 가지고 contains를 한다면 true 가 나온다.
    mergedMemo 가 바로 '새롭게 만들어진 후에 저장된 객체'이기 때문이다.
    이 차이점을 기억해 두도록 하자.

    em.remove() : 삭제하기 위해 조회해온 영속 상태의 Entity를 파라미터로 전달받아 삭제 상태로 전환한다.

    'spring > 스프링 입문 주차' 카테고리의 다른 글

    Query Methods 란 무엇일까  (0) 2024.01.25
    SpringBoot의 JPA  (1) 2024.01.25
    영속성 컨텍스트의 기능  (0) 2024.01.25
    JPA란 무엇일까  (0) 2024.01.23
    제어의 역전, ApplicationContext  (2) 2024.01.22
Designed by Tistory.