1. Entity Manager
Entity Manager는 JPA의 핵심 구성 요소로, 엔티티 인스턴스의 생명주기를 관리하는 API이다.
Entity Manager는 데이터베이스와 Java 객체 간의 중개자 역할을 한다.
JPA에서 엔티티는 Persistence Context에서 관리되어야 하는데,
Persistence Context를 도와주는 것이 Entity Manager다.
1 - 1. 주요 기능
1 - 1 - 1. 엔티티 생명주기 관리
엔티티의 생성, 수정, 삭제 등 생명주기 전반을 관리한다.
엔티티는 비영속, 영속, 준영속, 삭제 상태가 될 수 있다.
persist, merge, remove, close 메서드를 이용하여 엔티티의 상태를 변경할 수 있다.
1 - 1 - 2. Persistence Context 관리
Entity Manager는 Persistence Context라는 1차 캐시를 관리하며,
1차 캐시로부터 엔티티를 조회할 수 있다.
이를 통해 엔티티의 상태를 추적한다.
1 - 1 - 3. 데이터베이스 연산
Entity Manager는 트랜잭션을 커밋하기 전까지 Persistence Context의 쓰기 지연 저장소에 쿼리들을 모아두었다가 트랜잭션 커밋 시점에 flush하여 모아둔 쿼리를 데이터베이스에 보낸다.
1 - 1 - 4. 트랜잭션 관리
데이터베이스 트랜잭션을 시작, 커밋, 롤백하는 기능을 제공한다.
2. Persistence Context
Entity Manager에 대해 알기 위해선 Persistence Context 대해 알아야 한다. Persistence Context는 JPA에서 엔티티를 관리하는 가상의 환경으로, 엔티티의 생명주기와 상태를 제어하는 중요한 역할을 한다. Persistence Context는 엔티티를 영구 저장하는 환경으로 1차 캐싱, 쓰기 지연, 변경 감지를 통해 영속 로직을 효율적으로 할 수 있게 해준다.
2 - 1. Persistence Context의 생명 주기
- Persistence Context는 Entity Manager와 밀접하게 연관되어 있다.
- Entity Manager를 생성할 때 Persistence Context가 함께 만들어진다.
- Entity Manager를 통해 Persistence Context에 접근하고 관리할 수 있다.
2 - 2. 엔티티의 생명 주기
Persistence Context 내에서 엔티티는 다음과 같은 상태를 가질 수 있다.
- 비영속(New/Transient): Persistence Context와 전혀 관계가 없는 상태
- 영속(Managed): Persistence Context에 저장된 상태
- 준영속(Detached): Persistence Context에 저장되었다가 분리된 상태
- 삭제(removed): 삭제된 상태
2 - 2 - 1. 엔티티의 각 상태
비영속 상태
Member member = new Member("오베");
비영속 상태는 객체가 새로 생성되었지만, Persistence Context와 연관되지 않은 상태이다.
영속 상태
entityManager.persist(member);
entityManager.merge(detachedMember);
entityManager.find(Member.class, 1L);
영속 상태는 엔티티 객체가 Persistence Context에 관리되고 있는 상태이다.
이 상태에서는 엔티티의 변경사항이 트랜잭션 커밋시점에 자동으로 데이터베이스에 반영된다.
준영속 상태
entityManager.detach(member);
entityManager.clear();
entityManager.close();
준영속 상태는 엔티티 객체가 Persistence Context에 의해 관리되었지만, 현재는 Persistence Context와 분리된 상태이다.
이 상태에서는 엔티티 객체의 변경 사항이 더 이상 데이터베이스에 반영되지 않는다.
Persistence Context 종료, 트랜잭션 종료 등으로도 준영속 상태로 전환된다.
삭제 상태
entityManager.remove(member);
삭제 상태는 엔티티 객체가 Persistence Context에서 제거된 상태이다.
이 상태에서는 엔티티 객체가 데이터베이스에서 삭제된다.
2 - 3. Persistence Context의 특징
- 식별자 값: 영속 상태의 엔티티는 반드시 식별자 값(@Id)을 가져야 한다.
- 데이터베이스 저장: Persistence Context에 저장된 엔티티는 트랜잭션 커밋 시점에 데이터베이스 반영된다.
- 쓰기 지연: Entity Manager는 트랜잭션을 커밋하기 전까지 내부 쿼리 저장소에 SQL을 모아두었다가 트랜잭션 커밋 시점에 모아둔 쿼리를 데이터베이스 보낸다.
- 변경 감지(Dirty Checking): Persistence Context는 엔티티의 변경사항을 자동으로 감지하여 데이터베이스에 반영한다.
- 지연 로딩(Lazy Loading): 연관된 엔티티를 실제로 사용할 때 데이터베이스에서 조회한다.
References
https://www.maeil-mail.kr/question/29
https://www.geeksforgeeks.org/jpa-architecture/
https://www.javatpoint.com/jpa-entity-manager
'백엔드 면접 질문' 카테고리의 다른 글
일급 컬렉션이 무엇인가요? (1) | 2024.11.29 |
---|---|
자바에서 Checked Exception과 Unchecked Exception에 대해서 설명해주세요. (0) | 2024.11.28 |
JPA의 N + 1 문제에 대해서 설명해주세요 (1) | 2024.11.27 |
JPA의 ddl-auto 옵션은 각각 어떤 동작을 하고 어떤 상황에서 사용해야 할까요? (0) | 2024.11.25 |
Spring Data JPA에서 새로운 Entity인지 판단하는 방법은 무엇일까요? (0) | 2024.11.22 |