[JPA] 영속성 컨텍스트(Persistence Context) _디버깅의 눈물
1.영속성 컨텍스트 개념
영속성 컨텍스트란 엔티티(Entity) 객체를 관리하는 데 사용되는 메모리 영역입니다.
영속성 컨텍스트의 역할과 목적: 영속성 컨텍스트는 JPA의 핵심 컴포넌트로서 엔티티 객체의 생명주기를 관리하고, 엔티티와 데이터베이스 간의 상호작용을 도와줍니다. 영속성 컨텍스트는 엔티티를 식별하고 추적하는 데 사용되며, 데이터베이스에서 가져온 엔티티와 변경된 엔티티를 관리하고 데이터베이스에 변경사항을 반영합니다.
영속성 컨텍스트의 특징과 동작 원리: 영속성 컨텍스트는 논리적인 개념으로서 물리적인 저장소가 아닙니다. 각 JPA 구현체(예: Hibernate)마다 영속성 컨텍스트를 관리하기 위한 내부 구현이 있습니다. 영속성 컨텍스트는 논리적인 트랜잭션 범위 내에서 동작하며, 트랜잭션의 커밋 시점에 변경사항을 데이터베이스에 반영합니다.
2.영속성 컨텍스트의 생명주기
영속성 컨텍스트의 생성과 소멸: 영속성 컨텍스트는 보통 엔티티 매니저(Entity Manager)를 통해 생성됩니다. 엔티티 매니저는 영속성 컨텍스트를 생성하고 관리합니다. 영속성 컨텍스트는 주로 트랜잭션 범위 내에서 사용되며, 트랜잭션이 커밋되거나 롤백되면 영속성 컨텍스트도 소멸됩니다.
영속성 컨텍스트의 상태 변화: 영속성 컨텍스트는 엔티티 객체의 상태 변화를 감지하고 관리합니다. 엔티티 객체의 상태는 총 4가지로 구분됩니다: 1)새로운 상태(New), 2)영속 상태(Persistent), 3)준영속 상태(Detached), 4)삭제 상태(Removed). 영속성 컨텍스트는 이러한 상태 변화를 추적하여 데이터베이스와 동기화합니다.
3.영속성 컨텍스트의 기능
엔티티의 식별성 보장: 영속성 컨텍스트는 엔티티의 식별자를 기반으로 엔티티를 식별하고 관리합니다. 식별자를 통해 영속성 컨텍스트 내에서 동일한 엔티티를 가져올 수 있으며, 이를 통해 데이터베이스의 다중 조회나 캐싱 기능을 제공합니다.
1차 캐시(First-Level Cache): 영속성 컨텍스트는 엔티티를 처음으로 조회할 때, 엔티티를 자체적으로 보관하는 캐시인 1차 캐시를 사용합니다. 이 캐시를 통해 동일한 엔티티에 대한 반복적인 조회 시 데이터베이스 접근을 줄여 성능을 향상시킵니다.
지연 로딩(Lazy Loading): 영속성 컨텍스트는 연관된 엔티티를 필요한 시점까지 로딩하지 않고, 필요한 순간에 데이터베이스에서 가져오는 지연 로딩을 지원합니다. 이를 통해 성능을 최적화하고 연관된 엔티티를 필요한 경우에만 로딩할 수 있습니다.
트랜잭션과의 관계: 영속성 컨텍스트는 트랜잭션 범위 내에서 동작합니다. 트랜잭션이 커밋될 때, 영속성 컨텍스트는 변경사항을 데이터베이스에 반영하고, 롤백될 때는 변경사항을 취소합니다.
플러시(Flush) 작업: 영속성 컨텍스트는 변경사항을 데이터베이스에 동기화하기 위해 플러시 작업을 수행합니다. 플러시 작업은 주로 트랜잭션 커밋 전에 자동으로 실행되며, 변경사항을 데이터베이스에 반영합니다.
4.영속성 컨텍스트와 데이터베이스의 동기화
플러시(Fush)와 데이터베이스 동기화: 영속성 컨텍스트의 플러시 작업은 변경된 엔티티를 데이터베이스에 동기화하는 과정입니다. 플러시 작업은 엔티티의 상태를 확인하고 변경사항을 적절한 SQL 문으로 변환하여 데이터베이스에 전달합니다.
영속성 컨텍스트와 트랜잭션의 관계: 영속성 컨텍스트는 트랜잭션 범위 내에서 동작하며, 트랜잭션의 커밋 시점에 변경사항을 데이터베이스에 반영합니다. 따라서 트랜잭션이 롤백되면 영속성 컨텍스트의 변경사항도 취소됩니다.
데이터베이스 트랜잭션의 커밋과 롤백: 데이터베이스 트랜잭션의 커밋 시점에 영속성 컨텍스트의 변경사항이 데이터베이스에 반영됩니다. 반대로 롤백되면 변경사항도 취소되고, 영속성 컨텍스트는 이전 상태로 되돌립니다.
5.영속성 컨텍스트의 주의사항과 최적화
메모리 사용량과 성능 최적화: 영속성 컨텍스트는 엔티티를 메모리에 보관하기 때문에 큰 규모의 애플리케이션에서는 메모리 사용량에 주의해야 합니다. 또한, 영속성 컨텍스트의 상태 변화를 최소화하고, 플러시 작업을 효율적으로 사용하여 성능을 최적화할 수 있습니다.
엔티티의 동일성과 동등성: 영속성 컨텍스트에서 관리되는 엔티티는 동일성(identity)과 동등성(equality)을 가집니다. 동일성은 엔티티의 식별자를 기준으로 하며, 동등성은 엔티티의 속성 값이 동일한지를 판단하는 기준입니다.
트랜잭션 범위와 영속성 컨텍스트: 영속성 컨텍스트는 주로 트랜잭션 범위 내에서 동작합니다. 따라서 트랜잭션을 적절하게 관리하고, 영속성 컨텍스트의 생명주기와 트랜잭션 범위를 일치시키는 것이 중요합니다.