JPA에서 가장 중요한 두 가지는 객체와 관계형 데이터베이스의 매핑과 영속성 컨텍스트입니다. 특히, 영속성 컨텍스트를 이해하면 JPA의 내부 동작 원리를 깊이 있게 파악할 수 있다.
엔티티 매니저 팩토리와 엔티티 매니저
영속성 컨텍스트를 알기 전에 먼저 엔티티 매니저팩토리와 엔티티 매니저를 알아야 할 필요가 있다.
엔티티 매니저 팩토리는 이름 그래도 엔티티 매니저를 만드는 공장이다. 공장을 하나 만드는데 시간적 소요가 크듯이 엔티티 매니저 팩토리도 생성 비용이 크다. 따라서 한 개만 만들어 애플리케이션 전체 공유한다.
반면에 엔티티 매니저를 생성하는 것은 비용이 크지 않다. (거의 들지 않는다고 표현) 주의할 점은 엔티티 매니저 팩토리는 여러 스레드 동시 접근해도 안전하므로 공유해도 상관없지만 (스레드 세이프, Thread Safe), 엔티티 매니저는 여러 스레드가 동시 접근하면 동시성 문제가 발생하게 된다. 그러므로 절대 스레드 간의 공유를 하면 안 된다.
영속성 컨텍스트 란?
JPA를 이해하는데 가장 중요한 용어이며, "엔티티를 영구 저장하는 환경"을 의미한다. 엔티티 매니저를 통해 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.
em.persist(member);
위 코드는 단순히 회원 엔티티를 저장하기 위한 용도 사용된다고 알고 있다. 정확히 표현한다면 엔티티 매니저를 이용하여 회원 엔티티를 영속성 컨텍스트에 저장하는 의미를 나타낸다.
사실 이렇게 표현해도 영속성 컨텍스트가 무엇인지 정확히 감을 잡기가 쉽지 않다. 왜냐하면 영속성 컨텍스트는 논리적인 개념이기 때문이다. 일단 영속성 컨테이너는 엔티티 매니저가 생성될 때 하나 만들어지며, 그 엔티티 매니저를 통하여 접근이 가능하며 관리된다. 정도로 이해하고 있자.
위 설명을 보면 1:1 관계처럼 느껴지지만, 여러 엔티티 매니저가 같은 영속성 컨테이너 접근이 가능하다.
하지만 스프링을 포함하여 설명할 때 추가 설명하도록 하고 현재는 하나의 엔티티 매니저에서 하나의 영속성 컨텍스트가 만들어진다고 생각하자.
엔티티의 생명주기
엔티티는 4가지 생명주기가 존재한다.
- 비영속(new/transient) : 영속성 컨텍스트와 전혀 관계가 없는 상태
- 영속(managed) : 영속성 컨텍스트에 저장된 상태
- 준영속(detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태
- 삭제(removed) : 삭제된 상태
비영속(new/transient)
엔티티 객체를 생성, 지금은 아무것도 하지 않은 순수한 객체 상태를 의미한다.(저장하지 않았다.)
따라서 영속성 컨텍스트나 DB와는 전혀 관련이 없다. 이것을 비영속 상태라고 한다.
// 객체만 생성한 상태 (비영속)
Member member = new Member();
member.setId("m1");
member.setUsername("회원1");
영속(managed)
엔티티 매니저를 통해 엔티티를 영속성 컨텍스트에 저장되어 영속성 컨텍스트가 관리하는 상태이다.
// 객체를 저장한 상태(영속)
em.persist(member);
준영속(detached)
영속성 컨텍스트에 저장되었다가 분리된(detached) 상태이다.
em.detach(member); // 특정 엔티티를 분리
em.close(); // 영속성 컨텍스트 닫기
em.clear(); // 영속성 컨텍스트 초기화
삭제(removed)
엔티티를 영속성 컨텍스트와 데이터베이스에서 삭제한 상태이다.
em.remove(member);
참조
김영한님의 책과 강의
https://ttl-blog.tistory.com/108
[JPA] 영속성 컨텍스트란?
🧐 엔티티 매니저 팩토리 & 엔티티 매니저 영속성 컨텍스트에 대해 알아보기 전에 엔티티 매니저 팩토리와 엔티티 매니저에 대해서 알아보겠습니다. 엔티티 매니저 팩토리는 생성되는 시점에 D
ttl-blog.tistory.com
https://girawhale.tistory.com/122
[JPA] Entity 생명주기(Entity LifeCycle)
엔티티 생명주기(Entity LifeCycle) 비영속(new/transient) 순수한 객체 상태이며, 영속성 컨텍스트와 관련이 없는 상태 Member member = new Member(); 영속(managed) EntityManager를 통해 엔티티를 영속성 컨텍스트에
girawhale.tistory.com
'Framework > JPA' 카테고리의 다른 글
[JPA] 엔티티 매핑 - 객체와 테이블 매핑 (0) | 2024.03.14 |
---|---|
[JPA] 준영속 상태 (0) | 2024.03.13 |
[JPA] 플러시(flush) (0) | 2024.03.13 |
[JPA] 영속성 컨텍스트의 특징 (0) | 2024.03.12 |
[JPA] JPA란? (0) | 2024.03.12 |