Cute Running Puppy
본문 바로가기
개발일기/Java

영속성 컨텍스트란

by 징구짱 2023. 6. 1.
728x90

영속성 컨텍스트란?

JPA(Java Persistence API)에서 영속성 컨텍스트(Persistence Context)는 엔티티(Entity) 객체를 영구 저장하는 환경으로, 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스 같은 역할을 한다. 영속성 컨텍스트는 JPA에서 엔티티의 생명주기를 관리하고, 데이터베이스와의 효율적인 통신을 지원하여 개발자가 더욱 편리하게 데이터를 다룰 수 있게 한다.

 

엔티티의 생명주기

  • 비영속(new/transient): 영속성 컨텍스트와 전혀 관계가 없는 상태
  • 영속(managed): 영속성 컨텍스트에 저장된 상태
  • 준영속(detached): 영속성 컨텍스트에 저장되었다가 분리된 상태
    → 영속성 컨텍스트와의 관계가 끊겨서 데이터베이스에 대한 변경사항을 자동으로 동기화하지 않음
         주로 임시로 데이터를 저장하거나, 다른 영속성 컨텍스트로 엔티티를 이동시킬 때 사용
  • 삭제(removed): 삭제된 상태


영속성 컨텍스트의 주요 기능과 특징

지연 로딩(Lazy Loading)

엔티티의 연관 관계에 지연로딩을 설정하면, 연관된 엔티티를 조회할 때 프록시 객체(실제 엔티티 객체가 아닌 가짜 객체)를 반환한다. 엔티티를 실제로 사용할 때까지 데이터베이스 조회를 지연시켜 성능을 최적화할 수 있다.


동일성(identity) 보장
영속성 컨텍스트는 같은 식별자를 가진 엔티티를 한 번만 반환하여 동일성을 보장한다. 따라서 같은 엔티티를 여러 번 조회해도 동일한 인스턴스를 반환한다.

1차 캐시(First-Level Cache)
영속성 컨텍스트는 엔티티를 저장하는 1차 캐시를 가지고 있다. 이 캐시는 엔티티의 조회나 저장 시 데이터베이스 대신 캐시에서 엔티티를 가져오거나 저장하므로, 데이터베이스와의 통신 횟수를 줄이고, 성능을 향상시킨다.

1차 캐시는 영속성 컨텍스트 범위에서만 유효하며, 트랜잭션 범위가 끝나면 캐시도 함께 사라진다.

변경 감지(Dirty Checking)

영속성 컨텍스트는 엔티티의 변경사항을 자동으로 감지한다. 엔티티 객체를 조회한 후에 값을 변경하면, 해당 변경사항은 자동으로 영속성 컨텍스트에 반영된다. 변경된 엔티티는 트랜잭션 커밋 시점에 자동으로 데이터베이스에 반영된다.

트랜잭션 쓰기 지연(Transaction Write-Behind)

영속성 컨텍스트는 트랜잭션 내에서 엔티티의 변경을 모아두고, 트랜잭션 커밋 시점에 한 번에 데이터베이스에 반영한다. 이를 통해 데이터베이스 쓰기 작업을 효율적으로 처리하고, 성능을 향상시킬 수 있다.

플러시(Flush)

플러시는 영속성 컨텍스트의 변경사항을 데이터베이스에 동기화하는 작업을 의미한다. 플러시는 명시적으로 호출되거나, 트랜잭션이 커밋될 때 자동으로 발생한다. 플러시가 발생하면 변경된 엔티티는 데이터베이스에 반영되고, 1차 캐시는 유지된다.

영속성 컨텍스트의 범위

영속성 컨텍스트는 엔티티 매니저의 범위와 일치한다. 일반적으로 트랜잭션 단위에서 영속성 컨텍스트가 생성되고, 해당 트랜잭션이 커밋되거나 롤백되면 영속성 컨텍스트도 함께 종료된다.

728x90