TIL #26 영속성 컨텍스트

HYEON JIN CHOI·2024년 5월 29일

1. 영속성 컨텍스트 기본 개념

영속성 컨텍스트JPA(Java Persistence API) 의 핵심 개념 중 하나로, Entity 객체를 영속적으로 관리하는 환경을 의미한다. 이는 데이터베이스와의 상호작용을 추상화하여, 애플리케이션이 객체 지향적으로 데이터베이스 작업을 수행할 수 있게 해준다. 영속성 컨텍스트Entity 객체를 캐싱하고, 변경 내용을 추적하여 데이터베이스와 동기화하는 중요한 역할을 한다.

2. 영속성 컨텍스트의 기능

2.1. 1차 캐시

영속성 컨텍스트1차 캐시 로서의 역할을 한다. 이는 Entity 객체를 메모리에 저장하여, 데이터베이스에 불필요한 접근을 줄이고 성능을 향상시킨다. 같은 트랜잭션 내에서 동일한 Entity 를 조회하면, 데이터베이스를 다시 조회하지 않고 1차 캐시에서 조회된 객체를 반환한다.

2.2. 쓰기 지연 저장소(ActionQueue)

쓰기 지연 저장소Entity 의 상태 변화를 데이터베이스에 즉시 반영하지 않고, 트랜잭션이 끝날 때까지 지연시킨다. 이를 통해 여러 번의 데이터베이스 접근을 줄이고, 트랜잭션이 완료될 때 일괄적으로 반영함으로써 성능을 최적화한다.

2.3. 변경 감지(Dirty Checking)

영속성 컨텍스트변경 감지 기능 을 제공하여, Entity 객체의 상태 변화를 감지하고 자동으로 데이터베이스에 반영한다. 트랜잭션이 끝날 때 Entity 객체의 변경 사항을 체크하여 변경된 부분만 데이터베이스에 반영한다.

3. Entity의 상태

Entity영속성 컨텍스트 내에서 다양한 상태를 가질 수 있다. Entity 의 상태는 다음과 같이 네 가지로 분류된다.

  • 비영속(Transient)
    비영속 상태는 영속성 컨텍스트와 관계없는 상태로, 데이터베이스에 저장되지 않은 상태이다. 새로운 객체를 생성했을 때, 아직 영속성 컨텍스트에 포함되지 않은 상태를 의미한다.

  • 영속(Managed)
    영속 상태는 영속성 컨텍스트에 의해 관리되는 상태로, 데이터베이스와 동기화된 상태이다. EntityManagerpersist 메서드를 호출하면 객체가 영속 상태가 된다.

  • 준영속(Detached)
    준영속 상태는 영속성 컨텍스트에 의해 더 이상 관리되지 않는 상태로, 데이터베이스와의 동기화가 중지된 상태이다. detach, clear, close 메서드를 호출하거나 트랜잭션이 종료되면 객체가 준영속 상태가 된다.

  • 삭제(Removed)
    삭제 상태는 영속성 컨텍스트에서 제거된 상태로, 데이터베이스에서 삭제될 예정인 상태이다. EntityManagerremove 메서드를 호출하면 객체가 삭제 상태가 된다.

4. EntityManager와 EntityManagerFactory

4.1. EntityManager

EntityManagerJPA 에서 제공하는 인터페이스로, Entity 객체의 생명 주기를 관리하고 데이터베이스와의 CRUD(Create, Read, Update, Delete) 작업을 수행하는 역할을 한다. EntityManager 를 통해 영속성 컨텍스트에 접근하고, Entity 객체를 관리할 수 있다.

4.2. EntityManagerFactory

EntityManagerFactoryEntityManager 를 생성하는 팩토리 인터페이스로, 애플리케이션 전체에서 하나의 인스턴스를 공유하며, 비용이 많이 드는 자원들을 효율적으로 관리한다. EntityManagerFactory영속성 유닛(Persistence Unit) 설정을 바탕으로 EntityManager 를 생성한다.

EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-persistence-unit");
EntityManager em = emf.createEntityManager();

5. 트랜잭션 관리

트랜잭션 은 데이터베이스 작업의 논리적 단위로, 일련의 작업들이 모두 성공하거나 모두 실패해야 하는 원자성을 보장한다. JPA 에서는 EntityManager 를 통해 트랜잭션을 관리할 수 있다.

EntityTransaction tx = em.getTransaction();
tx.begin();

try {
    // 데이터베이스 작업
    tx.commit();
} catch (Exception e) {
    tx.rollback();
}

트랜잭션 관리를 통해 데이터의 일관성과 무결성을 유지할 수 있으며, 실패 시 롤백을 통해 이전 상태로 복구할 수 있다.

6. 영속성 컨텍스트 디버깅으로 확인하기

영속성 컨텍스트의 상태를 확인하고 디버깅하는 것은 중요하다. 이를 통해 애플리케이션의 동작을 이해하고 문제를 해결할 수 있다. 영속성 컨텍스트를 디버깅하는 방법에는 여러 가지가 있다:

  • 로그 확인
    JPA 는 다양한 로그 설정을 제공하여 SQL 쿼리와 영속성 컨텍스트의 동작을 로그로 확인할 수 있다. 이를 통해 어떤 쿼리가 실행되고, 어떤 객체가 관리되고 있는지 파악할 수 있다.

  • 디버거 사용
    IDE 의 디버거를 사용하여 영속성 컨텍스트의 상태를 확인할 수 있다. 디버거를 통해 객체의 상태, 캐시의 내용, 트랜잭션의 상태 등을 실시간으로 모니터링할 수 있다.

  • JPA 프로파일링 도구
    JPA 프로파일링 도구를 사용하면 영속성 컨텍스트의 성능을 분석하고 최적화할 수 있다. 이러한 도구들은 쿼리 실행 시간, 캐시 히트 비율, 트랜잭션 처리 시간을 분석하여 성능 병목을 파악하는 데 도움을 준다.

7. 회고

영속성 컨텍스트는 JPA에서 매우 중요한 개념으로, Entity 객체를 효율적으로 관리하고 데이터베이스와의 동기화를 처리하는 데 핵심적인 역할을 한다. 처음에는 이 개념이 직관적으로 이해되지 않았지만, 반드시 이해해야 한다고 생각해 반복해서 학습하게 되었다. 다양한 활용 방법까지 익히면 실무에서 큰 도움이 될 것이라 생각한다.

0개의 댓글