자바 ORM 표준 JPA 프로그래밍 - 기본편 섹션4 영속성 관리 - 내부 동작 방식
🔲 영속성 컨텍스트
영속성 컨텍스트: 엔티티를 영구 저장하는 환경.엔티티 매니저를 통해서 영속성 컨텍스트에 접근.
◻ 애플리케이션 시작 시 → EntityManagerFactory가 생성됨 (무겁고 비용이 큰 객체).
◻ 클라이언트 요청 → 요청마다 새로운 EntityManager가 EntityManagerFactory에서 생성됨.
◻ 요청 처리 후 → EntityManager는 닫힘(close).
🔲 엔티티의 생명주기
- 비영속 (new/transient): 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
- 영속 (managed): 영속성 컨텍스트에 관리되는 상태
- 준영속 (detached): 영속성 컨텍스트에 저장되었다가 분리된 상태
- 삭제 (removed): 삭제된 상태
🔲 영속성 컨텍스트 이점
- 1차 캐시
- 동일성(identity) 보장
- 트랜잭션을 지원하는 쓰기 지연 (transactional write-behind)
- 변경 감지(Dirty Checking)
- 지연 로딩(Lazy Loading)
먼저 영속성 1차 캐시에서 조회후, 없다면 DB에서 조회한다.

또한 영속 엔티티는 동일성을 보장한다.
Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");
System.out.println(a == b); //동일성 비교 true
엔티티는 커밋 순간 SQL을 모아 보낸다.
예를들어 아래처럼 커밋 시점에 인서트 쿼리를 보낸다.
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
//엔티티 매니저는 데이터 변경시 트랜잭션을 시작해야 한다.
transaction.begin(); // [트랜잭션] 시작
em.persist(memberA);
em.persist(memberB);
//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
//커밋하는 순간 데이터베이스에 INSERT SQL을 보낸다.
transaction.commit(); // [트랜잭션] 커밋
JPA는 엔티티의 변경을 감지하기 위해 스냅샷(Snapshot)을 사용한다. 이는 엔티티의 초기 상태를 복제해두고, 트랜잭션 커밋 시점에 현재 상태와 비교하여 변경 사항을 자동으로 감지한다.
🔲 플러시
- 플러시: 영속성 컨텍스트의 변경내용을 데이터베이스에 반영
- 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화한다.
-
DB와의 데이터 동기화는 트랜잭션이 끝나기 직전(커밋 직전)에만 하면 충분함.
🟢 준영속 상태로 만드는 방법
- em.detach(entity): 특정 엔티티만 준영속 상태로 전환
- em.clear(): 영속성 컨텍스트를 완전히 초기화
- em.close(): 영속성 컨텍스트를 종료
'JPA' 카테고리의 다른 글
자바 ORM 표준 JPA 프로그래밍 - 기본편 섹션2 JPA 시작하기 (0) | 2024.03.30 |
---|---|
자바 ORM 표준 JPA 프로그래밍 - 기본편 섹션1 JPA 소개 (0) | 2024.03.28 |