영속성 컨테스트 & EntityManager

썩은요플렛's avatar
Aug 16, 2024
영속성 컨테스트 & EntityManager
 
 

1. 영속성 컨텍스트 (Persistence Context)

개념

  • 영속성 컨텍스트는 엔터티를 관리하는 일종의 메모리 공간이다. JPA에서 영속성 컨텍스트는 엔터티 인스턴스와 데이터베이스 사이의 중간 캐시 역할을 하며, 이 공간 내에서 엔터티의 상태를 관리한다.
  • 영속성 컨텍스트는 엔터티가 persist되어 있거나 데이터베이스에서 조회된 이후에 엔터티의 상태를 유지하고 추적한다. 영속성 컨텍스트는 엔터티를 메모리 내에서 관리하므로, 트랜잭션이 끝나기 전까지 데이터베이스와 상호작용할 필요 없이 엔터티의 상태를 관리할 수 있다.

특징

  • 엔터티 상태 관리: 영속성 컨텍스트는 엔터티의 생명 주기(Lifecycle)를 관리한다. 여기에는 엔터티의 상태 변화(비영속, 영속, 준영속, 삭제)와 관련된 모든 것이 포함된다.
  • 엔터티의 동일성(identity): 영속성 컨텍스트는 같은 엔터티를 동일한 트랜잭션 내에서 여러 번 조회할 경우, 동일한 엔터티 인스턴스를 반환합니다. 즉, 동일한 엔터티를 여러 번 조회해도 동일한 인스턴스가 보장된다.
  • 변경 감지(Dirty Checking): 영속성 컨텍스트는 엔터티의 변경 사항을 추적합니다. 트랜잭션이 끝나기 전에 엔터티의 속성 값이 변경되었는지 감지하고, 변경이 감지되면 자동으로 데이터베이스에 반영한.
  • 1차 캐시: 영속성 컨텍스트는 기본적으로 1차 캐시 역할을 한다. 이는 트랜잭션이 끝나기 전까지 같은 엔터티에 대한 데이터베이스 조회를 최소화한다.

영속성 컨텍스트의 작동 원리

  • 엔터티 관리: 엔터티가 영속성 컨텍스트에 들어가면 그 엔터티는 "영속 상태"가 된다. 이 상태의 엔터티는 영속성 컨텍스트에 의해 관리되며, 데이터베이스와 동기화된다.
  • 변경 사항 전파: 트랜잭션이 끝나기 전(일반적으로 commit할 때), 영속성 컨텍스트는 관리 중인 모든 엔터티의 변경 사항을 데이터베이스에 반영한다. 이를 플러시(flush - 물을 내려보낸다 라는 뜻)라고 한다.
 
 

2. 엔티티 매니저 (Entity Manager)

개념

  • *EntityManager*는 영속성 컨텍스트를 관리하는 JPA의 API이다. EntityManager는 애플리케이션이 영속성 컨텍스트와 상호작용할 수 있도록 다양한 메서드를 제공한다. 이는 데이터베이스와의 CRUD(Create, Read, Update, Delete) 작업을 처리하고, 트랜잭션을 관리하며, 엔터티의 상태를 제어한다.

기능과 역할

  • 영속성 컨텍스트 관리: EntityManager는 영속성 컨텍스트를 생성하고 관리한다. persist, merge, remove, find 등의 메서드를 통해 영속성 컨텍스트 내에서 엔터티의 상태를 관리한다.
  • CRUD 작업:
    • persist(Entity entity): 엔터티를 영속성 컨텍스트에 넣고, 새로운 엔터티를 데이터베이스에 추가한다.
    • merge(Entity entity): 비영속 상태의 엔터티를 영속성 컨텍스트에 병합하여, 변경된 상태를 데이터베이스에 반영한다.
    • remove(Entity entity): 영속성 컨텍스트에서 엔터티를 삭제하고, 데이터베이스에서도 삭제를 반영한다.
    • find(Class<T> entityClass, Object primaryKey): 기본 키를 사용하여 데이터베이스에서 엔터티를 조회하고, 영속성 컨텍스트에 로드한다.
  • 트랜잭션 관리: EntityManager는 트랜잭션을 관리하는 데 중요한 역할을 한다. 트랜잭션이 시작되면 EntityManager는 영속성 컨텍스트를 관리하고, 트랜잭션이 끝날 때 데이터베이스에 변경 사항을 반영한다.
  • 쿼리 실행: EntityManager는 JPQL(Java Persistence Query Language) 또는 네이티브 SQL 쿼리를 실행하는 기능도 제공한다. 이를 통해 복잡한 조회 작업을 수행할 수 있다.
    • createQuery(String qlString): JPQL 쿼리를 생성하여 엔터티를 조회힌다.
    • createNativeQuery(String sqlString): 네이티브 SQL 쿼리를 생성하여 데이터베이스에서 직접 데이터를 조회한다.
  • 플러시(flush) 및 클리어(clear):
    • flush(): 영속성 컨텍스트 내의 모든 변경 사항을 데이터베이스에 강제로 반영한다.
    • clear(): 현재 영속성 컨텍스트를 비워 엔터티 인스턴스에 대한 모든 관리를 종료한다. 영속성 컨텍스트는 여전히 유효하지만, 더 이상 엔터티를 관리하지 않는다.
 
 

EntityManager의 라이프사이클

  • EntityManager는 일반적으로 스레드당 하나씩 사용된다. 이는 멀티스레드 환경에서 스레드 간의 데이터 일관성을 유지하기 위해서이다.
  • EntityManager는 여러 방법으로 생성될 수 있다:
    • 컨테이너 관리: Java EE 환경에서는 EntityManager가 컨테이너에 의해 관리된다.
    • 애플리케이션 관리: Java SE 환경에서는 EntityManagerFactory를 통해 개발자가 직접 EntityManager를 생성하고 관리한다.

EntityManager와 영속성 컨텍스트의 관계

  • EntityManager는 영속성 컨텍스트의 관리를 책임지는 객체로, 이 둘은 밀접하게 연관되어 있다. EntityManager의 메서드를 호출하면 영속성 컨텍스트 내에서 엔터티의 상태가 변경된다.
  • EntityManager가 종료되거나 트랜잭션이 종료되면, 영속성 컨텍스트도 종료되거나 변경 사항이 commit된다.
 
 

3. 요약 및 결론

  • 영속성 컨텍스트는 엔터티를 관리하는 메모리 내의 공간으로, 엔터티의 상태를 관리하고 변경 사항을 추적한다.
  • *EntityManager*는 영속성 컨텍스트를 관리하는 API로, 엔터티를 데이터베이스와 동기화하고, 트랜잭션을 관리하며, 데이터베이스 작업을 처리한다.
  • 이 두 개념은 JPA를 사용하는 애플리케이션에서 데이터의 영속성을 효과적으로 관리하고, 데이터베이스와의 상호작용을 간소화하는 데 중요한 역할을 한다.
Share article

RottenYogurt's Development Blog