본문 바로가기
Spring

Spring. 영속성이란 (persistence)

by 리승우 2022. 10. 13.

영속성 (persistence)

사전적의미

> 고집

> (없어지지 않고 오래 동안) 지속됨

 

영속성 컨텍스트란?

> Entity를 영구 저장하는 환경

EntityManager를 이용해 Entity를 저장하거나 조회할 때 EntityManager는 영속성 컨텍스트에

Entity를 보관하고 관리한다.

 

EntityManager.persist(Entity)를 실행하면, 영속성 컨텍스트가 Entity를 관리하게 된다!

=> persist메소드는 DB에 저장하는 것이 아니라, Entity를 영속성 컨텍스트 안에다가 저장한다는 의미임!

이로 인해 transaction commit이 되는 시점에 DB로 이동된다.

 

=====================

 

EntityManagerFactory

> 생성하는데 비용이 크기 때문에 애플리케이션 전체에서 한 번만 생성해 공유하도록 설계됨

> 여러 스레드가 동시에 접근해도 안전하며, 따라서 서로 다른 스레드 간에 공유가 가능하다.

 

EntityManager

> 생성하는데 비용이 거의 들지 않는다.

> 여러 스레드가 동시에 접근하면, 동시성 문제가 발생하기 때문에 스레드 간에 절대 공유하지 않는다. 

 

 

flush란?

영속성 컨텍스트의 변경내용을 DB에 반영(동기화)하는 작업

 

> 변경 감지가 동작해 영속성 컨텍스트에 있는 모든 Entity를 스냅샷과 비교한 후, 수정된 Entity를 찾는다.

 

> 그 후 수정된 Entity는 수정 쿼리를 만들어 쓰기 지연 SQL 저장소에 저장한다. (등록, 수정, 삭제쿼리)

 

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

 

 

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

> 직접호출

em.flush()로 직접호출하는 방식이나 거의 사용하지 않는 방법

 

> 트랙잭션 commit을 통한 플러시 자동호출

JPA는 트랜잭션을 commit할 때 자동으로 flush()를 호출한다.

 

> JPQL 쿼리 실행 시 플러시 자동 호출

JPQL같은 객체지향 쿼리를 호출할 때도 쿼리 실행 직전에 플러시가 자동으로 실행된다.

 

영속성 컨텍스트를 씀으로써의 이점

> 1차 캐시 

ex) 1번 조회한 것을 또 조회할 시, 굳이 DB에 쿼리를 날려 다시 보지않고 1차 캐시 안에 있는 데이터를 조회함.

 

> 동일성 보장

 

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

 

> 변경감지 (Dirty Checking) 

ex) 수정 / 삭제 변경된 것을 JPA가 자동으로 인식

 

> 지연로딩 (Lazy Loading)

'Spring' 카테고리의 다른 글

querydsl 사용법!  (0) 2022.10.27
Spring. Filter/Interceptor  (0) 2022.10.13
Spring. JPA ORM 및 연관관계  (0) 2022.10.13
Spring. Form input값 DTO 자동 주입  (1) 2022.10.08
Spring. @AuthenticationPrincipal이란?  (0) 2022.10.07

댓글