poeee 2024. 11. 11. 15:43

JPA 영속성(Persistence)이란?

JPA(Java Persistence API)에서 영속성(Persistence)이란, 데이터를 특정한 생명주기 동안 유지하고 관리하는 것을 의미합니다. 이는 애플리케이션의 객체 상태를 데이터베이스와 일치하도록 유지하는 것을 목표로 합니다. JPA의 핵심 역할 중 하나는 데이터베이스와의 상호작용을 통해 자바 객체의 상태를 저장하고 조회하며, 이를 통해 객체 지향적인 프로그래밍과 데이터베이스의 관계형 모델 간의 간극을 메워주는 것입니다.

 

영속성 컨텍스트(Persistence Context)란?

영속성 컨텍스트는 JPA에서 매우 중요한 개념으로, 엔티티(Entity) 객체를 관리하는 일종의 '저장소' 또는 '캐시'라고 할 수 있습니다. 쉽게 말해, 엔티티의 영속 상태를 관리하는 공간이며, 엔티티와 데이터베이스 사이의 중간 다리 역할을 합니다. 영속성 컨텍스트는 엔티티 매니저(Entity Manager)를 통해 접근할 수 있습니다.

 

영속성 컨텍스트의 주요 특징

- 1차 캐시

1차 캐시

영속성 컨텍스트는 1차 캐시를 통해 엔티티 객체를 메모리상에 보관합니다. 동일한 엔티티를 반복해서 조회할 경우, 데이터베이스를 다시 조회하는 대신 1차 캐시에 저장된 엔티티를 반환하여 성능을 높입니다.

- 동일성(identity) 보장

영속성 컨텍스트 내에서 동일한 엔티티는 동일성을 보장합니다. 즉, 동일한 영속성 컨텍스트 안에서 동일한 PK(Primary Key)를 가진 엔티티를 여러 번 조회해도 동일한 인스턴스가 반환됩니다.

- 변경 감지(Dirty Checking)

변경 감지

영속성 컨텍스트는 엔티티의 변경 사항을 감지하고, 트랜잭션 종료 시 자동으로 변경된 내용을 데이터베이스에 반영합니다. 이를 통해 개발자는 명시적으로 UPDATE 쿼리를 작성하지 않고도 엔티티의 변경사항을 처리할 수 있습니다.

(변경 감지는 영속성 컨텍스트가 관리하는 영속 상태의 엔티티에만 적용된다. 즉 비영속, 준영속처럼 영속성 컨텍스트의 관리를 받지 못하는 엔티티는 값을 변경해도 데이터베이스에 반영되지 않는다.)

 

 

- 쓰기 지연(Write-behind)

쓰기 지연1

 

쓰기 지연2

영속성 컨텍스트는 엔티티 매니저의 flush() 메서드를 호출하거나 트랜잭션이 커밋될 때까지 데이터베이스로의 쿼리 반영을 지연시킵니다. 이렇게 모아둔 쿼리는 한 번에 실행되므로 성능 최적화에 도움이 됩니다.

- 트랜잭션과 생명주기 연관

영속성 컨텍스트는 일반적으로 트랜잭션과 함께 생성되고 종료됩니다. 트랜잭션이 종료되면 영속성 컨텍스트도 종료되어, 더 이상 해당 엔티티를 관리하지 않게 됩니다.

 

요약

JPA의 영속성은 애플리케이션 객체와 데이터베이스 간의 일관성을 유지하는 중요한 개념이며, 영속성 컨텍스트는 이러한 영속성을 효과적으로 관리하기 위한 공간입니다. 1차 캐시, 동일성 보장, 변경 감지, 쓰기 지연 등의 특징을 통해 엔티티의 상태를 효율적으로 관리하고 최적화된 데이터베이스 접근을 제공합니다.