Spring Boot 공부 일기 <17> - 영속성 컨텍스트
1. IDE
Intellij
2. 오늘 공부 내용
영속성 컨텍스트
- JPA의 핵심 개념 중 하나, 애플리케이션이 데이터베이스와 상호작용하는 동안 객체의 상태를 관리하는 매커니즘
- 엔티티 객체를 1차 캐시로 관리, 데이터베이스와의 동기화를 담당하는 중요한 역할
- 엔티티 객체의 저장소
- 영속 상태 - 엔티티 객체가 영속성 컨텍스트에 존재할 때
영속성 컨텍스트의 특징
- 1차 캐시
- 동일한 트랜잭션 안에서는 같은 엔티티를 조회할 때마다 데이터베이스에 접근하지 않고 1차 캐시에서 가져옴
- 동일성(identity) 보장
- 같은 엔티티를 여러 번 조회해도 동일한 객체를 반환
- 변경 감지(Dirty Checking)
- 트랜잭션이 커밋될 떄, 변경된 엔티티의 속성을 자동으로 UPDATE 쿼리로 반영하여 데이터베이스에 동기화
- 지연 로딩(Lazt Loading)
- 연관된 엔티티를 필요한 순간에만 조회하여 불필요한 데이터베이스 쿼리 호출을 줄임
- 트랜잭션과 영속성 컨텍스트
- 영속성 컨텍스트는 보통 트랜잭션의 생명주기와 동일하게 동작
- 트랜잭션이 시작되면 영속성 컨텍스트가 열리고, 트랜잭션이 종료되면 영속성 컨텍스트도 종료됨
- 쓰기 지연(Batch Writing)
- 쓰기 지연을 통해 트랜잭션이 끝나는 시점에 일괄적으로 쿼리 실행
영속성 컨텍스트의 상태
- 비영속(Transient)
- 영속성 컨텍스트와 전혀 관계가 없는 상태. 아직 데이터베이스에 저장되지 않은 객체.
- 영속(Persistent)
- 영속성 컨텍스트에 저장된 상태로, 데이터베이스에 기록된 상태
EntityManager.persist() 또는 find() 등을 통해 엔티티가 영속성 컨텍스트에 저장될 때 발생
- 준영속(Detached)
- 영속성 컨텍스트에서 더 이상 관리되지 않는 상태, 하지만 이전에 영속성 컨텍스트에 의해 관리되었기 때문에 데이터베이스에 저장된 기록은 남아 있음
- 예를 들어,
EntityManager.clear()나 detach() 메서드를 통해 엔티티를 준영속 상태로 만들 수 있음
- 삭제(Removed)
- 영속성 컨텍스트에서 제거된 상태로, 데이터베이스에서도 삭제될 예정입니다.
EntityManager.remove() 메서드를 호출하면 엔티티가 이 상태로 변합니다.
영속성 컨텍스트의 이점
- 성능 최적화: 1차 캐시와 지연 로딩을 통해 데이터베이스 접근을 최소화하여 성능을 향상시킬 수 있음
- 동일성 보장: 같은 엔티티는 항상 동일한 객체로 보장되어, 데이터 일관성을 유지할 수 있음
- 변경 감지: 엔티티 객체의 상태 변경을 자동으로 감지하고 데이터베이스에 반영함으로써 개발자가 직접 SQL을 작성할 필요가 줄어듬
- 쓰기 지연: 여러 변경 사항을 일괄 처리하여 데이터베이스 성능을 높임
주의할 점
- 메모리 관리: 영속성 컨텍스트가 너무 많은 엔티티를 관리하게 되면 메모리 문제가 발생할 수 있고 특히 대량의 데이터를 처리할 때는
flush() 또는 clear() 메서드를 적절히 사용하여 메모리 관리를 해야 함
- N+1 문제: 지연 로딩을 잘못 사용하면, 연관된 엔티티를 조회할 때 N+1 문제가 발생할 수 있고 이는 성능에 큰 영향을 미치므로 적절한 페치 전략을 설정하는 것이 중요함