백엔드/JPA

[JPA] 영속성 컨텍스트 정리

happy_life 2022. 8. 5. 15:39

[JPA] 영속성 컨텍스트 정리

목차

1. 영속성 컨텍스트 개요

2. 영속성 컨텍스트의 장점

3. flush

 

영속성 컨텍스트 개요

 

영속성 컨텍스트

 

개념

엔티티를 영구 저장하는 환경이라는 뜻으로, 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 1차 캐시 역할을 한다. 엔티티 매니저를 통해 엔티티를 저장하거나 조회하면 엔티티 매니저가 영속성 컨텍스트에서 엔티티를 관리한다.

 

 

엔티티 생명주기

엔티티 생명주기

 

1) 비영속(new/transient)

영속성 컨텍스트와 전혀 관계없는 새로운 상태의 엔티티

Member member = new Member();

 

2) 영속(managed)

영속성 컨텍스트에서 관리되는 상태

Member member = new Member();
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();

em.persist(member);

 

3) 준영속(detached)

영속성 컨텍스트에 저장되었다가 분리된 상태

em.detach(entity) // 특정 엔티티만 준영속 상태로 전환
em.clear() // 통으로 다 지움
em.close() // 영속성 컨텍스트를 닫아버린다.

 

 

4) 삭제(removed)

삭제된 상태

em.remove(member);

 

 

영속성 컨텍스트의 장점

1차 캐시

영속성 컨텍스트에서 조회가 가능하면, 캐시처럼 먼저 값을 조회할 수 있다. 만약 조회 후 없으면 DB에서 조회한다.

 

동일성 보장

동일성 보장

 

1차 캐시로 반복 가능한 읽기 등급의 트랜잭션 격리 수준을 데이터베이스가 아닌 애플리케이션 차원에서 제공할 수 있다.

 

쓰기 지연

쓰기 지연

 

commit 코드가 있는 시점까지 SQL을 모았다가, 한번에 쿼리를 날린다.

 

변경 감지

변경 감지

 

엔티티를 조회할 당시의 상태를 스냅샷처럼 찍어두고 바뀐 것이 있으면 commit 시점에 자동으로 update한다.

 

 

flush

개념

영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 것이다. (쿼리 날리는 것)

 

특징

1. 영속성 컨텍스트를 비우지 않는다.

2. 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화한다.

3. 트랜잭션이라는 작업 단위가 중요하다. 커밋 직전에만 동기화하면 된다.

 

과정

1. 변경 감지

2. 수정된 엔티티 쓰기 지연 SQL 저장소에 등록

3. 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송

 

플러시하는 방법

1. em.flush() - 직접 호출

2. 트랜잭션 커밋 - 플러시 자동 호출

3. JPQL 쿼리 실행 - 플러시 자동 호출

 

Commit과의 차이점

flush는 쿼리를 전송하는 역할이고, commit은 내부적으로 flush를 수행한뒤 트랜잭션을 끝낸다. 따라서 flush로 전송된 쿼리는 rollback할 수 있지만 commit은 트랜잭션이 끝나므로 rollback할 수 없다.