해당 포스팅은 위 책을 학습하기 위한 용도로 쓰여진 글입니다.
영속성 컨텍스트(Persistence Context)란?
- '엔티티를 영구 저장하는 환경' 이라는 뜻이다.
- 엔티티 매니저로 엔티티를 저장하거나 조회하면, 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.
- 영속성 컨텍스트는 논리적인 개념에 가깝고 눈에 보이지도 않는다.
- 영속성 컨텍스트는 엔티티 매니저를 생성할 때 하나 만들어진다. 그리고 엔티티 매니저를 통해 영속성 컨텍스트에 접근 및 관리할 수 있다.
em.persist(member);
persist() 메서드는 엔티티 매니저를 사용하여 회원 엔티티를 영속성 컨텍스트에 저장한다.
엔티티의 생명주기
엔티티에는 4가지 상태가 존재한다.
- 비영속(new / transient): 영속성 컨텍스트와 전혀 관계가 없는 상태
- 영속(managed): 영속성 컨텍스트에 저장된 상태
- 준영속(detached): 영속성 컨텍스트에 저장되었다가 분리된 상태
- 삭제(removed): 삭제된 상태
밑에서 더 자세히 알아보자.
- 비영속 (new / transient)
//객체를 생성한 상태 (비영속)
Member member = new Member ();
member.setId("member1");
member.setUsername("회원1");
- 위 코드에서 엔티티 객체를 생성했다. 지금은 순수한 객체 상태이며 아직 영속성 컨텍스트에 저장하지 않았다.
따라서 영속성 컨텍스트나 DB와는 전혀 관련이 없다. 이것을 비영속 상태라 한다(그림 2 참고).
- 영속 (managed)
//객체를 저장한 상태 (영속)
em.persist (member);
- 엔티티 매니저를 통해 엔티티를 영속성 컨텍스트에 저장했다.
이렇게 영속성 컨텍스트가 관리하는 엔티티를 영속 상태라 한다. - 이제 회원(member) 엔티티는 비영속 상태에서 영속 상태가 되었다.
결국 영속 상태라는 것은 영속성 컨텍스트에 의해 관리된다는 뜻이다. - em.find() 나 JPQL 을 사용해서 조회한 엔티티도 영속성 컨텍스트가 관리하는 영속 상태다.
- 준영속 (detached)
//회원 엔티티를 영속성 컨텍스트에서 분리한 상태 (준영속)
em.detach (member);
- 영속성 컨텍스트가 관리하던 영속 상태의 엔티티를 영속성 컨텍스트가 관리하지 않으면 준영속 상태가 된다.
- 특정 엔티티를 준영속 상태로 만들려면 em.detach() 를 호출하면 된다.
- em.close() 를 호출해서 영속성 컨텍스트를 닫거나, em.clear() 를 호출해서 영속성 컨텍스트를 초기화해도 영속 상태의 엔티티는 준영속 상태가 된다.
- 삭제 (removed)
//객체를 삭제한 상태 (삭제)
em.remove (member);
- 엔티티를 영속성 컨텍스트와 DB에서 삭제한다.
Reference
- 김영한, 『 자바 ORM 표준 JPA 프로그래밍 』, 에이콘, 2015, 92~94쪽.
'JPA > 자바 ORM 표준 JPA 프로그래밍' 카테고리의 다른 글
[JPA] 3장. 영속성 관리(1): 엔티티 매니저 팩토리, 엔티티 매니저 (0) | 2024.05.31 |
---|