티스토리 뷰

728x90

JPA를 이용하면서 가장 많이 듣게 되는 단어 중 하나인 영속성 컨텍스트에 대해 정리해보았다.

 

영속성 컨텍스트란?


JPA를 이해하는 가장 중요한 용어이다.

"엔티티를 영구 저장하는  환경" 으로 이해하고 넘어가자

 

DB와 영속성 컨텍스트

EntityManager.persist(Entity);

를 사용하면

"Entity 객체를 DB에 저장하는구나" 라고 생각하지만 실제는 Entity를 영속성 컨텍스트에 저장한다.

 

영속성 컨텍스트 / 엔티티 매니저

- 영속성 컨텍스트는 논리적인 개념

- 눈에 보이지 않음

- 엔티티 매니저를 통해 영속성 컨텍스트에 저장 

 

엔티티 매니저를 생성하면 눈에 보이지않는 영속성 컨텍스트가 생성된다.

 

 

엔티티의 생명주기 


엔티티가 DB에 저장되기 까지의 과정에는 4가지의 상태가 존재한다.

4가지 상태

- 비영속성(new/transient)

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

 

- 영속(managed)

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

 

- 준영속(detached)

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

 

- 삭제(removed)

삭제된 상태

 

코드로 살펴보는 엔티티의 생명주기 


commit()의 추가

public static void main(String arg[]){

EntityManageFactory emf = Persistence.createEntityManagerFactory("hello);
EntityManager em = emf.createEntityManger();
.
.
.

// 비영속
Member member = new Member();
member.setId(100L);
member.setName("Dev");

// 영속
em.persist("HelloJPA");

tx.commit();
.
.
.
}

tx.commit();을 날리는 순간 db에 쿼리가 날라가며 

영속상태가 된다.

영속성 컨텍스트의 장점 


장점

1. 1차 캐시 처리

2. 동일성 보장

3. 트랜잭션을 지원하는 쓰기 지연

4. 변경 감지

5. 지연로딩

 

플러시를 통한 변경 내용을 DB에 반영하기


플러시란

JPA의 flush()를 통해 영속성 컨텍스트의 변경 내용을 DB에 반여하는것을 의미한다. 

 

플러시 발생 케이스

아래와 같은 상황에서 플러시가 발생한다.

- 변경 감지(더티채킹) 

- 수정된 엔티티 쓰기 지연 SQL저장소 등록

- 쓰기 지연 SQL저장소의 쿼리를 데이터베이스에 전송 (등록, 수정, 삭제)

 

플러시 하는 방법

1. em.flush()를 통한 직접 호출 

2. 트랜잭션 커밋,  보통 Service레이어에서 @Transaction을 통한 플러시 자동 호출을 이용

3. JPQL 쿼리 실행을 통한 플러시 자동 호출 

 

 

 

 

혹시 부족한 내용이 있다면 댓글로 피드백 부탁드리겠습니다! 감사합니다.

 

728x90
댓글
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday