티스토리 뷰
JPA가 제공하는 기능은 크게 두 가지로 볼 수 있습니다.
앞선 글에서 설명드렸던 부분인 엔티티와 테이블을 매핑하는 설계 부분과 매핑한 엔티티를 실제 사용하는 부분입니다.
이번에는 매핑한 엔티티를 실제로 어떻게 사용하는지, 어떻게 작동하는지 자세하게 살펴보도록 하겠습니다.
우선 엔티티가 어떻게 작동하는지 알기 위해서는 몇 가지 용어를 살펴봐야 하는데 용어부터 정리해 보도록 하겠습니다.
1. 엔티티 매니저? 엔티티 매니저 팩토리? 영속성 컨텍스트?
엔티티를 사용하기 위해서 JPA는 엔티티 매니저를 활용을 합니다. 엔티티 매니저는 엔티티를 저장하고, 수정하고, 삭제하고, 조회하는 등 엔티티와 관련된 모든 일들을 처리합니다.
이러한 엔티티 매니저를 만드는 공장이 있는데 이를 엔티티 매니저 팩토리라고 합니다.
// 엔티티 매니저 팩토리
EntitymanagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
// 엔티티 매니저
EntityManager em = emf.createEntityManager();
🤔엔티티 매니저 팩토리 VS 엔티티 매니저
엔티티 매니저 팩토리는 만드는 비용이 상당히 크기 때문에 한 개만 만들어 애플리케이션 전체에 공유하도록 설계되어 있습니다.
그렇기 때문에 서로 다른 스레드 간에 공유가 가능합니다.
반면, 엔티티 매니저는 여러 스레드가 동시에 접근을 하면 동시성 문제가 발생하기 때문에 스레드 간에 공유를 해서는 안됩니다.
엔티티 매니저로 엔티티를 관리하기 위해서 엔티티 매니저는 엔티티를 영속성 컨텍스트에 보관을 합니다.
이 영속성 컨텍스트는 엔티티를 영구적으로 저장하는 환경을 의미합니다.
이런 영속성 컨텍스트는 엔티티 매니저를 생성할 때 하나가 만들어지며 논리적인 개념이기 때문에 직접 볼 수는 없습니다.
아래 엔티티의 생명주기를 보면서 영속성 컨텍스트에 대해 자세하게 이해해 보도록 하겠습니다.
2. 엔티티의 생명주기
엔티티는 크게 4가지 형태의 생명주기를 가지고 있는데, 비영속, 영속, 준영속, 삭제가 있습니다.
우선, 비영속부터 보도록 하겠습니다.
비영속
영속성 컨텍스트와 전혀 관계가 없는 상태를 의미합니다.
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
Member 객체만 생성한 상태입니다.
영속성 컨텍스트에 의해 관리되기 위해서는 persist() 메소드를 활용해야 하는데 바로 아래에서 확인해보겠습니다.
영속
영속성 컨텍스트에 저장된 상태를 의미합니다. 즉, 엔티티 매니저에 의해 관리되는 상태입니다.
// 엔티티 매니저 팩토리 및 엔티티 매니저 생성
EntitymanagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
EntityManager em = emf.createEntityManager();
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
em.persist(member); // 영속 상태로 전환
Member 객체 생성한 후 persist() 메소드를 활용해 영속 상태로 전환했습니다.
이러면 Member 객체는 엔티티 매니저에 의해 관리되고 있다고 볼 수 있습니다.
준영속
영속성 컨텍스트에 저장되었다가 분리된 상태를 의미합니다.
// 엔티티 매니저 팩토리 및 엔티티 매니저 생성
EntitymanagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
EntityManager em = emf.createEntityManager();
// 1. 특정 엔티티만 준영속 상태로 전환
em.detach(member);
// 2. 영속성 컨텍스트를 초기화
em.clear(member);
// 3. 영속성 컨텍스트를 종료
em.close(member);
엔티티 객체를 준영속 상태로 만들기 위해 3가지 방법이 있습니다.
더 자세한 내용은 따로 정리해서 설명드리겠습니다.
삭제
삭제된 상태를 의미합니다.
// 엔티티 매니저 팩토리 및 엔티티 매니저 생성
EntitymanagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
EntityManager em = emf.createEntityManager();
em.remove(member);
간단하게 엔티티들의 생명주기를 살펴봤습니다.
좀 더 자세한 이해를 위해 엔티티를 CRUD 하면서 영속성 컨텍스트 안에서는 어떤 일들이 일어나는지 다음 글에서 확인해 보도록 하겠습니다.
본 포스팅은 자바 ORM 표준 JPA 프로그래밍을 참고하여 작성했습니다.
'JPA' 카테고리의 다른 글
플러시란? (0) | 2024.06.07 |
---|---|
영속성 컨텍스트의 특징 (0) | 2024.06.07 |
상속 관계 매핑 - @MappedSuperclass (0) | 2024.06.06 |
상속 관계 매핑 - 상속 전략 (0) | 2024.06.05 |
다양한 연관관계 매핑 (0) | 2024.05.01 |
- 최적화
- @GeneratedValue
- @OneToMany
- @Id
- 비동기
- @Table
- JPA
- N + 1
- @joincolumn
- 인메모리 db
- 준영속
- @MappedSuperclass
- 메일
- Redis
- 단일 테이블 전략
- 변경감지
- 영속성 컨텍스트
- @Entity
- @Cacheable
- 비영속
- 1차 캐시
- onetoone
- 조인 전략
- mappedBy
- 연관관계
- 즉시 로딩
- @ManyToOne
- @TransactionalEventListener
- 엔티티 매니저
- 스키마 자동 생성