본문 바로가기
Web/Spring&SpringBoot

[SpringBoot] 영속성 컨텍스트(persistence context)란?

by alphaca202 2024. 4. 12.

영속성이란?

프로그램이 종료되더라도 사라지지 않는 데이터의 특성을 말한다. 

 

-> 영속성이라는 개념은 다양한 소프트웨어 분야에서 데이터의 보존과 관리를 위해 사용되는 필수적인 개념이다. 

 

 

 

영속성 컨텍스트란?

(-> 여기서 컨텍스트란 환경, 상황을 뜻한다. )

 

영속성 컨텍스트는 데이터를 영구적으로 저장하기 위한 환경이다.

어플리케이션과 DB 사이에서 객체를 보존하는 가상의 DB역할을 한다.

(app과 DB 사이에 중간에 있는 것.. ! )

 

 

엔터티 매니저영속성 컨텍스트

 

 

객체(entity)를 영속성 컨텍스트에서 관리하기 위해 

엔터티 매니저 팩토리로 엔터티 매니저를 만든다. 

엔터티 매니저는 트랜잭션의 단위이며 영속성 컨텍스트에 접근하여 

엔터티의 저장, 수정, 삭제, 관리, 조회 등을 모두 담당한다. 

 

트랜잭션이 시작할 때 DB와의 커넥션을 획득하고

트랜잭션이 끝남과 동시에 영속성 컨텍스트의 엔터티를 DB에 저장한다. 

즉 엔터티 매니저 하나 당 영속성 컨텍스트 하나가 생기고 

트랜잭션이 끝남과 동시에 사라진다. 

 

 

엔터티의 상태 4가지

- 비영속 상태

- 영속 상태

- 준영속 상태

- 삭제 상태 

 

▶ 영속성 컨텍스트의 장점

(app과 DB 사이에 이게 있으면 어떤게 좋은가 .. ?)

 

1. 1차 캐시의 장점을 가질 수 있다. 

영속성 컨텍스트에 최근에 들어온 값을 캐시에 저장해놓고 있기 때문에

DB에 쿼리를 날리지 않고도 해당 값에 접근할 수 있어 시간 자원 측면에서 효율적이다. 

 

2. 영속 엔터티의 동일성 보장

같은 호출을 반복할 때 1차 캐시에 있는 동일한 값을 반환하여 동일성을 보장함. "=="으로 비교했을 때 true임다. 

 

3. 엔터티 등록할 때 쓰기 지연

엔터티 하나를 생성할 때마다 쿼리를 날리지 않고 commit을 할 때 한꺼번에 날리니까 효율적이다. 

 

4. 엔터티 수정할 때 수정 감지 (dirty checking)

엔터티를 수정할 때 update를 직접 해줄 필요가 없고 영속성 컨텍스트가 자동으로 쿼리를 날려준다. 

어떻게 가능하냐면 처음 트랜잭션 시 원래 entity를 스냅샷을 저장해두는데 나중에 commit을 했을 때 현재 entity 값과 스냅샷을 비교해서 바뀌었으면 update 쿼리를 생성해서 날려준다!