JPA/자바 ORM 표준 JPA 프로그래밍

[JPA] 3장. 영속성 관리(2): 영속성 컨텍스트 개념, 엔티티 생명주기

suoop 2024. 6. 1. 01:15

김영한, 『 자바 ORM 표준 JPA 프로그래밍 』, 에이콘, 2015.

 

해당 포스팅은 위 책을 학습하기 위한 용도로 쓰여진 글입니다.

 


영속성 컨텍스트(Persistence Context)란?

  • '엔티티를 영구 저장하는 환경' 이라는 뜻이다.
  • 엔티티 매니저로 엔티티를 저장하거나 조회하면, 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.
  • 영속성 컨텍스트는 논리적인 개념에 가깝고 눈에 보이지도 않는다. 
  • 영속성 컨텍스트는 엔티티 매니저를 생성할 때 하나 만들어진다. 그리고 엔티티 매니저를 통해 영속성 컨텍스트에 접근 및 관리할 수 있다.
em.persist(member);

persist() 메서드는 엔티티 매니저를 사용하여 회원 엔티티를 영속성 컨텍스트에 저장한다.

 

 

엔티티의 생명주기

엔티티에는 4가지 상태가 존재한다.

  1. 비영속(new / transient): 영속성 컨텍스트와 전혀 관계가 없는 상태
  2. 영속(managed): 영속성 컨텍스트에 저장된 상태
  3. 준영속(detached): 영속성 컨텍스트에 저장되었다가 분리된 상태
  4. 삭제(removed): 삭제된 상태

밑에서 더 자세히 알아보자.

 

[ 그림 1 ]  출처: https://velog.io/@yhlee9753/JPA-%EC%98%81%EC%86%8D%EC%84%B1-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8Persistence-Context

 

 

- 비영속 (new / transient)

//객체를 생성한 상태 (비영속)
Member member = new Member ();
member.setId("member1");
member.setUsername("회원1");
  • 위 코드에서 엔티티 객체를 생성했다. 지금은 순수한 객체 상태이며 아직 영속성 컨텍스트에 저장하지 않았다.
    따라서 영속성 컨텍스트나 DB와는 전혀 관련이 없다. 이것을 비영속 상태라 한다(그림 2 참고).

 

[ 그림 2 ] 출처: https://catsbi.oopy.io/523e7c47-e9ab-43ef-bc19-3e527ecff3a7

 

 

 

- 영속 (managed)

//객체를 저장한 상태 (영속)
em.persist (member);
  • 엔티티 매니저를 통해 엔티티를 영속성 컨텍스트에 저장했다. 
    이렇게 영속성 컨텍스트가 관리하는 엔티티를 영속 상태라 한다.
  • 이제 회원(member) 엔티티는 비영속 상태에서 영속 상태가 되었다. 
    결국 영속 상태라는 것은 영속성 컨텍스트에 의해 관리된다는 뜻이다.
  • em.find() 나 JPQL 을 사용해서 조회한 엔티티도 영속성 컨텍스트가 관리하는 영속 상태다.

[ 그림 3 ] 출처: https://catsbi.oopy.io/523e7c47-e9ab-43ef-bc19-3e527ecff3a7

 

 

- 준영속 (detached)

//회원 엔티티를 영속성 컨텍스트에서 분리한 상태 (준영속)
em.detach (member);
  • 영속성 컨텍스트가 관리하던 영속 상태의 엔티티를 영속성 컨텍스트가 관리하지 않으면 준영속 상태가 된다.
  • 특정 엔티티를 준영속 상태로 만들려면 em.detach() 를 호출하면 된다.
  • em.close() 를 호출해서 영속성 컨텍스트를 닫거나, em.clear() 를 호출해서 영속성 컨텍스트를 초기화해도 영속 상태의 엔티티는 준영속 상태가 된다.

 

- 삭제 (removed)

//객체를 삭제한 상태 (삭제)
em.remove (member);
  • 엔티티를 영속성 컨텍스트와 DB에서 삭제한다.

 


Reference

  • 김영한, 『 자바 ORM 표준 JPA 프로그래밍 』, 에이콘, 2015, 92~94쪽.