본문 바로가기
Java/JPA

[JPA]영속성 컨텍스트

by 인포썸 2024. 4. 17.

 

영속성 컨텍스트란?

  • 영속성 컨텍스트란 '영구 저장 환경' 이다.
  • Entity Manager 가 Entity를 저장하거나 조회하면 매니저는 영속성 컨텍스트에 Entity를 보관하고 관리한다.
  • Entity Manager 가 persist()메소드를 사용하면 엔티티를 영속성 컨텍스트에 저장한다.
  • 하나의 엔티티 매니저가 하나의 영속성 컨텍스트를 생성 및 접근 할 수 도 있고, 여러 엔티티 매니저가 하나의 영속성 컨텍스트를 공유할 수 도 있다.

엔티티의 생명주기

  1. 비영속(new/transient):영속성 컨텍스트와 관계가 없는 상태
  2. 영속(managed): 영속성 컨텍스트에 저장된 상태
  3. 준영속(detached):영속성 컨텍스트에 저장되어있다가 분리된 상태
  4. 삭제(removed):삭제된상태

영속성 컨텍스트의 특징

  1. 영속성 컨텍스트는 엔티티를 식별자 값(@Id) 으로 구분하기 때문에 영속 상태는 식별자 값이 반드시 필요하다.
  2. JPA는 보통 트랜잭션을 커밋하는 순간 영속성 컨텍스트의 엔티티를 데이터베이스에 반영한다. 이것을 flush라 한다.

영속성 컨텍스트가 엔티티를 관리할때 생기는 장점

  1. 1차캐시 : 영속성 컨텍스트 내부의 캐시를 의미 영속성 상태의 엔티티는 모두 이곳에 저장 find 메소드를 사용하면 캐시를 먼저 찾고 없으면 db검색을함
  2. 동일성 보장 : JPA는 1차캐시내에 있는 객체를 반환하기 때문에 동일성을 보장할 수 있다.
  3. 트랜잭션을 지원하는 쓰기 지연 : 엔티티 매니저는 트랜잭션을 커밋하기 전까지 엔티티를 저장하지 않고 내부 쿼리 저장소에 쿼리를 저장하고 커밋할때 한 번에 저장
  4. 변경 감지 : jpa는 엔티티를 영속성 컨텍스트에 저장할때 스냅샷을 함께 저장해 flush시점에 스냅샷과 엔티티를 비교해 수정된 데이터를 저장
  5. 지연로딩 : 데이터가 실제로 사용되는 시점에 가져오기 때문에 효율적이다.

Flush

flush는 영속성 컨텍스트의 변경 내용을 DB에 반영한다.

 

Flush 수행과정

1. 변경 감지가 동작하여 영속성 컨텍스트에 있는 모든 엔티티를 스냅샷과 비교하여 변경된 내용이 있는 엔티티를 찾는다.

2. 변경이 있는 엔티티는 수정 쿼리르 만들어서 쓰기 지연 sql저장소에 등록한다.

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

 

Flush 방법

- em.flush() 직접 호출

- 트랙잭션 커밋 시 자동호출

- JPQL 쿼리 실행 시 자동호출

 

'Java > JPA' 카테고리의 다른 글

[JPA] JPA의 요소  (0) 2024.04.21
[JPA] ORM와 JPA  (0) 2021.05.28

댓글