엔티티매니저 EntityManager
EntityManager는 JPA에서 엔티티와 영속성 컨텍스트를 다루는 핵심 개체
엔티티매니저 EntityManager
엔티티매니저 EntityManager
- EntityManager는 JPA에서 엔티티와 영속성 컨텍스트를 다루는 핵심 개체이다.
- 영속성 컨텍스트를 통해 엔티티의 상태를 관리하며, 트랜잭션 내부에서 안전하게 DB와 상호작용 하도록 돕는다.
그렇다면 영속성이란 무엇일까
영속성 컨텍스트에 대해 이해
- 엔티티를 영구 저장하는 환경으로 1차 캐시, 쓰기 지연, 변경 감지 등 다양한 기능을 제공함
- 동일한 트랜잭션 범위 내에서 동일한 엔티티를 반복 조회할 때 DB가 아닌 1차 캐시에서 조회함
- 엔티티가 변경될 때, 쓰기 지연 저장소에 쿼리를 모아두었다가 트랜잭션 종료 시점에 flush 과정을 통해 DB와 동기화함
엔티티 매니저(EntityManager)의 역할
- 영속성 컨텍스트에 엔티티를 등록(persist)하거나, 삭제(remove), 다시 영속화(merge), 준영속(detach) 상태로 전환시킴
- JPQL이나 Native Query를 사용해 직접 DB로부터 데이터를 조회하거나, 1차 캐시를 통해 이미 조회한 엔티티를 재활용함
- 트랜잭션 범위 내에서 엔티티 상태 전환과 DB 동기화를 제어하고, 필요 시 flush를 사용해 원하는 시점에 DB 반영 가능함
- 영속성 컨텍스트가 close되거나 clear되면, 해당 범위에 있던 영속 상태의 엔티티는 준영속 상태로 전환됨
엔티티의 4가지 상태
- 비영속
- 새로 생성된 엔티티가 아직 영속성 컨텍스트와 연결되지 않은 상태
- 예시 코드:
1 2
// Member 엔티티를 새로 생성했으나, 아직 비영속 상태 Member member = new Member("산초");
- 영속
- 영속성 컨텍스트에 연결된 상태로, 변경 사항이 자동으로 DB에 반영되는 상태
- 예시 코드:
1 2
// 비영속 상태의 member를 영속성 컨텍스트에 등록 em.persist(member);
- 준영속
- 한 번 영속 상태였다가 영속성 컨텍스트와 분리된 상태로, 변경 사항이 더 이상 DB에 반영되지 않는 상태
- 예시 코드:
1 2 3 4
// 영속성 컨텍스트와 분리해 준영속 상태로 만든다 em.detach(member); em.clear(); em.close();
- 삭제
- 영속 상태의 엔티티를 영속성 컨텍스트와 DB에서 완전히 제거한 상태
- 예시 코드:
1 2
// 영속 상태의 member를 삭제 상태로 전환 em.remove(member);
- 간단한 예시 코드로 살펴보기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
public class Main { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("example-unit"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); try { // 1. 비영속 상태 Member member = new Member("산초"); // 2. 영속 상태로 전환 (persist) em.persist(member); // 3. 준영속 상태로 전환 (detach) em.detach(member); // 4. 다시 영속 상태로 전환 (merge) Member mergedMember = em.merge(member); // 엔티티 매니저에서 삭제 상태로 전환 em.remove(mergedMember); tx.commit(); } catch(Exception e) { tx.rollback(); } finally { em.close(); emf.close(); } } }
em.persist(member)
: 비영속 상태의member
엔티티를 영속 상태로 전환함em.detach(member)
:member
엔티티를 영속성 컨텍스트에서 분리해 준영속 상태로 만듦em.merge(member)
: 준영속 상태의 엔티티를 다시 영속 상태로 복귀시킴em.remove(mergedMember)
: 영속 상태의 엔티티를 삭제 상태로 전환함
그래서 엔티티 매니저란 것은 결국?
- 엔티티 매니저는 영속성 컨텍스트를 통해 엔티티의 생명 주기를 일관성 있게 관리함
- 비영속, 영속, 준영속, 삭제 상태로 나뉜 엔티티를
persist
,merge
,remove
,detach
같은 메서드로 조작함 - 1차 캐시와 쓰기 지연, 변경 감지 기능을 사용해 DB와의 직접적인 통신 횟수를 줄이고 성능을 높임
- 결과적으로 객체지향적인 접근 방식을 유지하면서도 안전하고 유연하게 데이터베이스와 연동하게 됨
This post is licensed under CC BY 4.0 by the author.