JPA 영속성 컨텍스트 이해하기

신수정·2024년 5월 8일
0

JPA(Java Persistence API)의 핵심 개념 중 하나인 영속성 컨텍스트에 대해 알아보겠습니다. 영속성 컨텍스트는 JPA를 사용한 애플리케이션 개발에서 매우 중요한 역할을 하기 때문에, 그 원리와 특징을 잘 이해하는 것이 필요합니다.

1. 영속성 컨텍스트란?

영속성 컨텍스트는 간단히 말해 엔티티(Entity)를 관리하는 일종의 캐시(Cache)입니다. 이를 통해 엔티티를 데이터베이스와 매핑하며, 변경된 사항을 추적 및 동기화합니다.

공식적인 정의로는 "엔티티를 영구 저장소(Database)에 보관하는 환경"을 의미합니다. 다시 말해, 데이터베이스의 데이터를 자바 객체로 관리하는 가상의 데이터베이스라고 생각할 수 있습니다.

2. 영속성 컨텍스트의 생명주기

엔티티는 영속성 컨텍스트 내에서 다음과 같은 네 가지 상태를 가집니다.

1. 비영속 (Transient) 상태

  • 영속성 컨텍스트와 연관되지 않은 엔티티 상태를 말합니다.
  • 데이터베이스에 저장되지 않고, 단순히 새로운 객체로 생성된 상태입니다.
  • 예시:
    Member member = new Member();
    member.setName("John Doe");

2. 영속 (Persistent) 상태

  • 엔티티 매니저를 통해 영속성 컨텍스트에 저장된 상태를 의미합니다.

  • 이 상태에 들어가면 영속성 컨텍스트에서 해당 엔티티를 관리합니다.

  • 예시:

    EntityManager em = entityManagerFactory.createEntityManager();
    em.getTransaction().begin();
    
    Member member = new Member();
    member.setName("John Doe");
    em.persist(member);
    
    em.getTransaction().commit();

3. 준영속 (Detached) 상태

  • 한 번 영속 상태였던 엔티티가 영속성 컨텍스트에서 분리된 상태를 의미합니다.
  • 영속성 컨텍스트에서 관리되지 않기 때문에 변경 사항이 자동으로 데이터베이스에 반영되지 않습니다.
  • 예시:
    Member member = em.find(Member.class, 1L);
    em.detach(member); // 영속성 컨텍스트에서 분리

4. 삭제 (Removed) 상태

  • 영속성 컨텍스트에서 제거된 엔티티 상태를 의미합니다.
  • 엔티티 매니저를 통해 영속성 컨텍스트에서 삭제된 엔티티는 데이터베이스에서도 삭제됩니다.
  • 예시:
    Member member = em.find(Member.class, 1L);
    em.remove(member); // 영속성 컨텍스트에서 제거

3. 영속성 컨텍스트의 특징

1. 1차 캐시

  • 영속성 컨텍스트는 엔티티를 메모리에 저장하는 1차 캐시를 제공합니다.
  • 동일한 영속성 컨텍스트에서 동일한 엔티티를 조회하면, 데이터베이스를 거치지 않고 1차 캐시에서 조회합니다.
  • 예시:
    Member member1 = em.find(Member.class, 1L);
    Member member2 = em.find(Member.class, 1L);
    // member1과 member2는 같은 객체를 가리킴

2. 동일성(identity) 보장

  • 1차 캐시로 인해 영속성 컨텍스트 내에서 조회한 엔티티는 동일성을 보장합니다.
  • 동일한 엔티티를 여러 번 조회해도 동일한 자바 객체가 반환됩니다.

3. 변경 감지(Dirty Checking)

  • 영속 상태의 엔티티 변경 사항은 자동으로 감지되어 데이터베이스에 반영됩니다.
  • 영속성 컨텍스트에 의해 관리되기 때문에 가능한 기능입니다.
  • 예시:
    Member member = em.find(Member.class, 1L);
    member.setName("Jane Doe"); // 변경 감지
    em.getTransaction().commit(); // 변경사항이 데이터베이스에 반영됨

4. 지연 쓰기(Write-Behind)

  • 트랜잭션이 끝날 때까지 변경된 엔티티를 모아두고, 트랜잭션이 커밋될 때 한꺼번에 데이터베이스에 반영합니다.
  • 이를 통해 다수의 데이터베이스 접근을 최적화할 수 있습니다.

5. 지연 로딩(Lazy Loading)

  • 영속성 컨텍스트는 연관된 엔티티를 필요할 때까지 로딩하지 않고 지연 로딩으로 관리할 수 있습니다.
  • 필요한 시점에 데이터베이스에서 로딩하여 성능 최적화가 가능합니다.

마무리

JPA에서 영속성 컨텍스트는 데이터베이스와 자바 객체 사이를 매끄럽게 연결해주는 핵심 역할을 합니다. 이를 통해 효율적인 데이터 관리와 변경 추적이 가능해지며, 개발자의 생산성을 높여줍니다.

참고 자료

profile
안녕하세요:)

0개의 댓글