영속성 컨텍스트

영속성 ?

  • 데이터를 생성한 프로그램이 종료 시 데이터가 사라지지 않는 데이터의 특성을 말하며, 영속성을 갖지 않는 데이터는 메모리 상에 존재하더라도 프로그램 종료와 함께 모두 사라진다. 그러므로 데이터를 파일이나 DB에 영구 저장함으로써 데이터에 영속성을 부여한다.

JPA에서의 영속성 ?

  • ORM 기술인 JPA에서 핵심적인 부분 중 하나는 영속성 컨텍스트영속 상태를 이해하는 것이다. JPA의 Entity Manager가 활성화된 상태로 하나의 트랜잭션(@Transactional) 안에서 DB로부터 데이터를 조회하면 트랜젝션이 끝나는 시점까지 영속성 컨텍스트라는 1차 캐시에 저장되고 관리된다.
  • 정리하면 하나의 트랜젝션이 발생하는 시점에서 DB로부터 조회 된 데이터(=Entity)는 영속성 컨텍스트라는 곳에서 트랜젝션이 끝나는 시점까지 관리하는 대상이 되기에 하나의 트랜젝션 안에서 관리되는 영속화된 Entity는 항상 같음을 보장하고 변경점이 발생하면 트랜젝션이 끝나는 시점에 **더티체킹(=변경 감지)**이라는 개념을 통해 변경사항을 감지하여 update 쿼리를 별도로 날려서 변경사항을 DB에 반영한다.

영속성 컨텍스트란?

  • 영속성 컨텍스트(persistence context) 는 '엔티티를 영구 저장하는 환경' 이라는 뜻으로 눈에 보이지 않는 논리적인 개념입니다.
  • EntityManager를 통해 Entity를 저장, 조회 시 EntityManager는 영속성 컨텍스트에 Entity를 보관하고 관리합니다.
  • 영속성 컨텍스트의 생성 시점은 EntityManager를 생성할 때 하나의 영속성 컨텍스트가 만들어지며 EntityManager를 통해 접근하고 관리할 수 있습니다.
  •  

- 영속성 컨텍스트의 특징?

  • 영속성 컨텍스트는 Entity를 식별자 값으로 구분
    • Entity 정의 시 식별자로 지정할 멤버변수에 @Id 어노테이션을 붙임으로 식별자 값으로 저장된다.
  • JPA는 트랙잭션을 종료하기 직전 영속성 컨텍스트에 새로 저장된 Entity를 커밋하여 DB에 반영(=flush)
  • 1차 캐시 사용
    • 영속성 컨텍스트 내부에 존재하는 캐시(Map)를 1차 캐시라 하며, 영속상태의 Entity가 key는 @Id로 매핑한 식별자 값, value는 Entity 인스턴스로 하여 이곳에 저장
    • find() 메소드를 호출하면 1차 캐시에서 Entity를 찾으며 없을 시 DB에서 조회 후 1차 캐시에 저장하고 찾은 영속화 된 Entity를 반환합니다. → 동일한 Entity는 트랜젝션 내에서 항상 동일성이 보장된다.
  • 쓰기 지연을 수행
    • EntityManager는 트랜잭션을 commit 하기 직전까지 데이터베이스에 Entity를 저장하지 않고 영속성 컨텍스트 내부의 SQL 저장소에 생성 쿼리를 저장 후 commit 시점에 DB에 쿼리를 한번에 보내서 반영합니다.
  • 변경감지
    • 영속성 컨텍스트에는 이전 flush() 때의 Entity 상태를 복사해서 저장해둔 스냅샷이 존재하며, flush() 시점에 스냅샷과 Entity를 비교해 변경된 Entity를 찾고 있다면 각각의 객체에 대한 수정 쿼리를 만들어 쓰기 지연 SQL 저장소에 저장한 후 한꺼번에 데이터베이스로 보내고 트랜잭션을 commit 합니다.
    • 수정 쿼리는 Entity의 모든 필드를 업데이트하기에 수정 쿼리를 애플리케이션 로딩 시점에 미리 생성해두고 재사용할 수 있으며, 데이터베이스에 동일한 쿼리를 보낼 때 데이터베이스가 이전에 한 번 파싱된 쿼리를 재사용하기 때문에 성능상 장점이 됩니다.
    • 변경 감지는 영속성 컨텍스트가 관리하는 영속 상태의 엔티티에만 적용됩니다.
  • 지연 로딩
    • 실제 객체 대신 프록시 객체를 로딩해두고 해당 객체를 실제 사용할 때 영속성 컨텍스트를 통해 데이터를 불러오는 방법

 

참고자료

[JPA] 영속성(persistence)이란? (velog.io)

 

[JPA] 영속성(persistence)이란?

데이터를 생성한 프로그램이 종료되어도 사라지지 않는 데이터의 특성을 말한다.영속성을 갖지 않으면 데이터는 메모리에서만 존재하게 되고 프로그램이 종료되면 해당 데이터는 모두 사라지

velog.io

 

 

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

즉시 로딩, 지연 로딩  (0) 2023.03.23
Proxy  (0) 2023.03.22