본문 바로가기

spring

영속성 컨텍스트

영속성 컨텍스트
  • 엔티티를 영구 저장하는 환경
  • 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스 역할 수행
  • 엔티티 매니저 (Entity Manager)를 통해 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리
  • 서비스에는 하나의 엔티티 매니저 팩토리 (Entity Manager Factory)가 존재하며 엔티티 매니저 팩토리에서 데이터베이스에 접근하는 트랜잭션이 생길 때마다 엔티티 매니저를 생성하여 영속성 컨텍스트에 접근

 

엔티티 생명주기

  • 비영속 (New/Transient)
    • 엔티티 객체를 생성했지만 아직 영속성 컨텍스트에 저장하지 않은 상태

  • 영속 (Managed)
    • 엔티티 매니저를 통해서 엔티티가 영속성 컨텍스트에 저장된 상태
    • 영속성 컨텍스트에 의해 관리되는 상태

  • 준영속 (Detached)
    • 영속성 컨텍스트가 관리하던 영속 상태의 엔티티를 더 이상 관리하지 않을 때의 상태
    • 영속성 컨텍스트가 제공하는 기능이 동작하지 않는 상태

  • 삭제 (Removed)
    • 엔티티가 영속성 컨텍스트와 데이터베이스에서 삭제된 상태

 

Spring Data JPA에서의 엔티티 매니저
Spring Data JPA의 Repository Interface에는 엔티티 매니저가 포함되어 있음
≫ 직접 작성하지 않아도 내부에서 자동으로 호출됨!

 

  • Spring Data JPA를 사용하면 Repository를 통해 DB에 접근
    • 내부 구현체인 SimpleJpaRepository가 EntityManager를 사용함
    • 직접 작성 필요 x

 

flush()
  • 영속성 컨텍스트 변경 내용을 DB에 반영
  • commit(트랜잭션), 쿼리 실행 시에 실행됨
    • commit(트랜잭션) 직전에만 동기화하도록 설계
  • 영속성 컨텍스트를 비우는 게 아니라 반영하는 개념!

 

영속성 컨텍스트 특징
  • 식별자 값이 반드시 있어야 함 : 엔티티를 식별자값 (@Id를 통해 PK와 매핑한 값)으로 구분
  • 플러쉬(flush())를 통해 영속성 컨텍스트의 엔티티를 데이터베이스에 반영
  • 영속성 컨텍스트가 엔티티를 관리하는 장점
    1. 1차 캐시 (영속 상태의 엔티티는 여기에 저장됨)
      • 엔티티 조회 시 메모리에 있는 1차 캐시에서 데이터 조회 (식별자 값을 통해)
    2. 동일성 보장 : 식별자로 인식하기 때문에 실제 인스턴스가 같음 (identity)을 보장
    3. 트랜잭션을 지원하는 쓰기 지연 (transaction write-behind)
      • 엔티티 매니저는 트랜잭션을 커밋하기 직전까지 데이터베이스에 엔티티를 저장하지 않고 내부 쿼리 저장소에 INSERT SQL을 차곡차곡 모아둠
      • 트랜잭션을 커밋할 때 모아둔 쿼리를 데이터베이스에 보냄 ≫ 트랜잭션을 지원하는 쓰기 지연 (transactional write-behind)

  • 트랜잭션을 커밋 → 엔티티 매니저는 우선 영속성 컨텍스트를 flush()
    • 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화
    • 등록, 수정, 삭제한 엔티티를 데이터베이스에 반영
    • 이 예시에서는 쓰기 지연 SQL 저장소에 모인 쿼리를 데이터베이스에 보냄
  • 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화한 후에 실제 데이터베이스 트랜잭션을 커밋

 

 

 

 

'spring' 카테고리의 다른 글

페이징 / 정렬 처리  (0) 2024.09.13
Spring Data JPA 이용하기  (0) 2024.09.13
JPA / Hibernate / Spring Data JPA  (0) 2024.09.13
ORM  (0) 2024.09.13
JdbcTemplate  (0) 2024.09.13