목차
- JPA 영속성 컨텍스트란?
- 영속성 컨텍스트(Persistence Context)
- Entity Manager(엔티티 매니저)
- Entity 생명주기
- flush, 변경감지(Dirty Checking)
JPA 영속성 컨텍스트란?(Persistence Context)
- JPA에서 가장 중요한 개념인 영속성 컨텍스트(Persistence Context)에 대해서 알아보자.
- JPA는 Entity Manager, 영속성 컨텍스트를 통해 데이터의 상태변화를 감지하고 상황에 맞는 쿼리를 수행한다.
○ 영속성 컨텍스트 (Persistence Context)
- Entity를 영구 저장하는 환경.
- JAVA 영역에서 데이터를 관리하며 DB 접근을 역할을 수행한다.
- 어플리케이션과 DB 사이에서 객체를 보관, 저장하는 개념이다.
- JPA에서 관리하는 상태가 된것이다.
- EntityManager 를 통해 영속성 컨텍스트에 접근, 관리한다.
- EntityManager와 영속성 컨텍스는 1:1 관계로 생성된다.
○ 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가지의 상태가 존재한다.
- 비영속
- 영속
- 준영속
- 삭제
○ 비영속
- 영속성 컨텍스트와 관계가 없는 상태.
- @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 하는 방법
- em.flush();
- Transaction Commit
- 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
'spring & boot > JPA' 카테고리의 다른 글
[JPA] Java로 JPA 설정시 주의할점(.yml 설정 무시) (0) | 2024.08.12 |
---|---|
[JPA]JpaRepository 원리 및 내부 분석(EntityManager 자동주입, 상속관계) (0) | 2023.08.30 |
[JPA] JPA N+1 문제와, 해결방법 정리 (0) | 2023.02.21 |
[JPA] JPA, ORM 이란 무엇인가? (0) | 2023.01.31 |
댓글