Spring Boot 공부 일기 <17> - 영속성 컨텍스트

이동휘·2024년 9월 10일

Spring Boot

목록 보기
17/21

1. IDE

Intellij

2. 오늘 공부 내용

영속성 컨텍스트

  • JPA의 핵심 개념 중 하나, 애플리케이션이 데이터베이스와 상호작용하는 동안 객체의 상태를 관리하는 매커니즘
  • 엔티티 객체를 1차 캐시로 관리, 데이터베이스와의 동기화를 담당하는 중요한 역할
  • 엔티티 객체의 저장소
  • 영속 상태 - 엔티티 객체가 영속성 컨텍스트에 존재할 때

영속성 컨텍스트의 특징

  • 1차 캐시
    • 동일한 트랜잭션 안에서는 같은 엔티티를 조회할 때마다 데이터베이스에 접근하지 않고 1차 캐시에서 가져옴
  • 동일성(identity) 보장
    • 같은 엔티티를 여러 번 조회해도 동일한 객체를 반환
  • 변경 감지(Dirty Checking)
    • 트랜잭션이 커밋될 떄, 변경된 엔티티의 속성을 자동으로 UPDATE 쿼리로 반영하여 데이터베이스에 동기화
  • 지연 로딩(Lazt Loading)
    • 연관된 엔티티를 필요한 순간에만 조회하여 불필요한 데이터베이스 쿼리 호출을 줄임
  • 트랜잭션과 영속성 컨텍스트
    • 영속성 컨텍스트는 보통 트랜잭션의 생명주기와 동일하게 동작
    • 트랜잭션이 시작되면 영속성 컨텍스트가 열리고, 트랜잭션이 종료되면 영속성 컨텍스트도 종료됨
  • 쓰기 지연(Batch Writing)
    • 쓰기 지연을 통해 트랜잭션이 끝나는 시점에 일괄적으로 쿼리 실행

영속성 컨텍스트의 상태

  1. 비영속(Transient)
    • 영속성 컨텍스트와 전혀 관계가 없는 상태. 아직 데이터베이스에 저장되지 않은 객체.
  2. 영속(Persistent)
    • 영속성 컨텍스트에 저장된 상태로, 데이터베이스에 기록된 상태
    • EntityManager.persist() 또는 find() 등을 통해 엔티티가 영속성 컨텍스트에 저장될 때 발생
  3. 준영속(Detached)
    • 영속성 컨텍스트에서 더 이상 관리되지 않는 상태, 하지만 이전에 영속성 컨텍스트에 의해 관리되었기 때문에 데이터베이스에 저장된 기록은 남아 있음
    • 예를 들어, EntityManager.clear()detach() 메서드를 통해 엔티티를 준영속 상태로 만들 수 있음
  4. 삭제(Removed)
    • 영속성 컨텍스트에서 제거된 상태로, 데이터베이스에서도 삭제될 예정입니다. EntityManager.remove() 메서드를 호출하면 엔티티가 이 상태로 변합니다.

영속성 컨텍스트의 이점

  • 성능 최적화: 1차 캐시와 지연 로딩을 통해 데이터베이스 접근을 최소화하여 성능을 향상시킬 수 있음
  • 동일성 보장: 같은 엔티티는 항상 동일한 객체로 보장되어, 데이터 일관성을 유지할 수 있음
  • 변경 감지: 엔티티 객체의 상태 변경을 자동으로 감지하고 데이터베이스에 반영함으로써 개발자가 직접 SQL을 작성할 필요가 줄어듬
  • 쓰기 지연: 여러 변경 사항을 일괄 처리하여 데이터베이스 성능을 높임

주의할 점

  • 메모리 관리: 영속성 컨텍스트가 너무 많은 엔티티를 관리하게 되면 메모리 문제가 발생할 수 있고 특히 대량의 데이터를 처리할 때는 flush() 또는 clear() 메서드를 적절히 사용하여 메모리 관리를 해야 함
  • N+1 문제: 지연 로딩을 잘못 사용하면, 연관된 엔티티를 조회할 때 N+1 문제가 발생할 수 있고 이는 성능에 큰 영향을 미치므로 적절한 페치 전략을 설정하는 것이 중요함

0개의 댓글