본문 바로가기
spring & boot/JPA

[JPA] 영속성 컨텍스트(Persistence Context), Entity Manager

by lucas_owner 2023. 2. 2.

목차

  1. JPA 영속성 컨텍스트란?
  2. 영속성 컨텍스트(Persistence Context)
  3. Entity Manager(엔티티 매니저)
  4. Entity 생명주기
  5. flush, 변경감지(Dirty Checking)

 

 

JPA 영속성 컨텍스트란?(Persistence Context)

- JPA에서 가장 중요한 개념인 영속성 컨텍스트(Persistence Context)에 대해서 알아보자.

- JPA는 Entity Manager, 영속성 컨텍스트를 통해 데이터의 상태변화를 감지하고 상황에 맞는 쿼리를 수행한다.

 

 

○ 영속성 컨텍스트 (Persistence Context)

  • Entity를 영구 저장하는 환경. 
  • JAVA 영역에서 데이터를 관리하며 DB 접근을 역할을 수행한다.
  • 어플리케이션과 DB 사이에서 객체를 보관, 저장하는 개념이다. 
  • JPA에서 관리하는 상태가 된것이다. 
  • EntityManager 를 통해 영속성 컨텍스트에 접근, 관리한다.  
  • EntityManager와 영속성 컨텍스는 1:1 관계로 생성된다. 

made By Lucas Kang

 

○ Entity Manager (엔티티 매니저)

  • EM(Entity Manager)는 영속성 컨텍스트 내부에서 Entity들을 관리한다. 
  • 어플리케이션(Application)이 실행될 때 Bean으로 등록되어 있다.
    • @Autowire와 같이 DI 를 통해 사용한다. 
  • DB 연결이 꼭 필요한 시점에만 Connection을 얻는다. 
    • 1차캐시에서 조회를 수행하는 경우.(아래에서 다룰 예정.)
    • Entity가 영속화 되었지만, Transaction Commit이 이루어지지 않은경우.(DB에 저장이 되지 않은상태.)
  • Thread Safe 하지 않다. 
    • EM은 Thread Not Safe 하다. 여러 스레드 동시 접근시 동시 접근 문제 발생.
    • Thread(요청)별 1개씩 할당한다. 
    • EM 객체 사용시 Proxy 패턴을 사용하여 Thread Safe 보장한다. (Spring Container가 역할 수행.)

○ Entity Manager 생성

// Entity Manager 생성

// name부분을 통해 persistance에 unitName을 등록할 수 있다. 
EntityManagerFactory emf = Persistance.createEntityManagerFactory("name");

// EM
EntityManager em = emf.createEntityManager();

 

 

Entity 생명주기

- Entity 의 생명주기는 4가지의 상태가 존재한다.

  1. 비영속
  2. 영속
  3. 준영속
  4. 삭제

○ 비영속

- 영속성 컨텍스트와 관계가 없는 상태. 

- @Entity 어노테이션을 갖고 있는 Entity 객체는 생성했을 때는 영속성 컨텍스트에서 관리 하지 않는다.

   -> EntityManager 의 persist(Entity)를 통해 영속상태로 변경 가능하다. 

// 객체 생성
Member member = new Member(); // 비영속 상태.

// 영속화 
em.persist(member);

 

○ 영속

- 영속성 컨텍스트에서 관리 중인 상태.

- 영속화가 이루어져도 DB에 저장이 바로 되지 않는다. -> commit 혹은 flush()가 이루어진다면 DB에 저장된다. 

- commit, flush() 가 이루어지지 않았다면, 영속성 컨텍스트에만 객체가 존재하게 된다.

// Transaction(Entity Manager)
EntityTransaction tx = em.getTransaction(); // DB Connection에서 Transaction 가져온다.
tx.begin(); // Transaction 시작. 

// 객체 생성
Member member = new Member(); // 비영속 상태.

/ ... /

// DB에 저장 되지 않는다. 
em.persist(member); // 영속화 상태

// DB 저장.
tx.commit();

- em.flush() 그리고 em.clear()를 사용해서 Commit전에 DB에 강제 반영가능하다.

--> DB에서의 데이터를 확인하고 싶거나, Query를 확인 하고 싶을 때 주로 사용한다. 

 

○ 준영속

- 영속 상태 였으나, 영속성 컨텍스트에서 분리하여 관리하지 않는 상태가 된것.

   -> 영속 상태의 데이터(객체)를 분리하여 관리하지 않는 상태.

- 영속성 컨텍스트의 객체를 detach(), 혹은 초기화, 종료가 되면 컨텍스트 내부의 모든 데이터는 준영속 상태가 된다.

/.../
Member member = new Member();

em.persist(member);

// detach 
em.detach(member); // 준영속 상태

// 혹은 
em.close(); // 영속성 컨텍스트 종료.
em.clear(); // 영속성 컨텍스트 초기화.

 

○ 삭제

- Entity(객체)를 영속성 컨텍스트, DB 양쪽 모두 삭제한다. 

em.remove(member);

 

○ 병합(Merge) - 추가 개념 

- 준영속 상태가 된 데이터는 병합을 통해 다시 영속 상태로 만들 수 있다. 

Member member = em.find(param);
em.detach(member); // 준영속 상태. 

em.merge(member); // 영속상태

 

 

Flush(), 변경감지(Dirty Checking)

- flush()란 영속성 컨텍스트 내부의 변경된 내용들을 DB에 반영하는것이다. 

- 호출 하더라도 1차캐싱 데이터는 유지된다!

- flush를 하더라도, 영속성 컨텍스트는 비워지지 않는다. 

 

※ 영속성 컨텍스트를 flush 하는 방법

  1. em.flush();
  2. Transaction Commit
  3. JPQL 쿼리 실행.

* Transaction이 Commit 된다면 flush() 자동 호출. 

 

 

- 변경감지 (Dirty Checking)된 내용 모두 DB 반영된다.

  • 변경감지란?
  • 영속성 컨텍스트가 관리하는 객체들이 등록, 변경, 수정, 삭제가 되었을때 DB에 반영되도록 하는것. 
    • JPA의 경우 update쿼리가 없다. 그 이유는 변경감지를 통해 update 하기 때문이다.
  • 변경된 객체들을 -> 쓰기지연 SQL 저장소에 Query를 생성하여 쌓아 놓는다. 
    • 이후 flush(), commit()이 발생하면 쓰기지연 저장소의 Query를 DB에 전달하여 데이터의 Update  진행한다.
em.flush(); // DB 반영

em.clear(); // 플러시 이후 영속성 컨텍스트를 초기화

* JPA, ORM에 대해서 알고 보면 좀더 이해 하기 좋을것 같습니다.

https://lucas-owner.tistory.com/33?category=600100 

 

[JPA] JPA, ORM 이란 무엇인가?

JPA(Java Persistence API), ORM(Object Reational Mapping) 이란 ? JPA를 공부를 하게 된다면 JPA, ORM, 영속성 컨텍스트 등 많은 용어가 나오게 된다. JPA, ORM 이란 무엇이고, 관련된 내용에 대해서 알아보자. ORM 이란

lucas-owner.tistory.com

 

반응형

댓글