영속성 (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 |
댓글