Java

[JPA(Jakarta Persistence API)] 영속성 관리

ride-dev 2024. 3. 12. 13:09

영속성, Persistence

영속성(Persistence)은 JPA(Jakarta Persistence API)를 이해하기 위해 알아야하는 개념중 하나입니다.

영속성 컨텍스트(Persistence Context)는 JPA(Jakarta Persistence API)가 내부에서 동작하는 방식과 관련된 개념입니다.

JPA(Jakarta Persistence API)를 통해 데이터베이스의 데이터를 자바 컬렉션 객체를 다룰 수 있게 해줍니다.

영속성 컨텍스트(Persistence Context)는 엔티티(Entity)를 영구적으로 저장하는 환경을 의미합니다.

엔티티 팩토리로 생성한 엔티티 매니저를 통해 영속성 컨텍스트에 접근합니다.

엔티티 생명주기

엔티티(Entity)는 생명주기가 있으며, 영속성 컨텍스트(Persistence Context)를 통해 관리됩니다.

비영속 new / transient

영속성 컨텍스트(Persistence Context)와 관계가 없는 새로운 상태, 새롭게 객체를 생성한 상태

객체를 영속성 컨텍스트(Persistence Context)로 관리하지 않은 상태

영속 managed

영속성 컨텍스트(Persistence Context)에 관리되는 상태

객체, 엔티티 매니저를 생성하고 영속성 컨텍스트(Persistence Context)에 저장하여 관리하고 있는 상태

객체를 엔티티 매니저의 persist(객체) 메서드를 통해 영속성 컨텍스트에 저장

준영속 detached

영속성 컨텍스트(Persistence Context)에 저장되었다가 분리된 상태

영속성 컨텍스트(Persistence Context)에 저장된 객체의 상태에 따라 SQL문을 작성하여 DB에 요청

삭제 removed

삭제된 상태

영속성 컨텍스트(Persistence Context)에 저장된 객체를 삭제

영속성 컨텍스트의 이점

1차 캐시

영속성 컨텍스트(Persistence Context)에 객체가 저장(캐시)되어 있다면,

DB에 요청하지 않고 캐시에 있는 값을 조회함.

1차 캐시는 하나의 트랜잭션에서만 유효하며,

비즈니스 로직이 복잡하여 하나의 트랜잭션에서 여러 번의 DB연결이 필요할 때 유용함.

동일성(identity) 보장

자바 컬렉션에서 동일한 참조값을 가진 객체를 비교하는 것처럼,

1차 캐시 데이터를 통해 객체를 비교할 수 있음.

트랜잭션을 지원하는 쓰기 지연(transactional write-behind)

엔티티 매니저(Entity Manager)가 데이터 변경 시 트랜잭션을 시작하고,

다수의 영속성 컨텍스트(Persistence Context)의 1차 캐시에 있는 데이터를 변경,

쓰기 지연 SQL저장소에 SQL문을 저장,

변경 즉시 DB에 요청하는 것이 아니라 commit 시 저장소를 flush하면서 DB에 요청을 보냄.

(DB에 요청할 SQL의 최대치를 batch size로 지정)

변경 감지(Dirty Checking)

DB에 저장된 데이터를 엔티티 매니저(Entity Manager)로 조회하여 영속성 컨텍스트(Persistence Context)에 저장하면,

저장된 객체의 데이터 수정 시 변경 사항을 감지(Dirty Checking)하여 DB에 적용함.

 

DB 데이터 조회시, 스냅샷을 생성하여 객체의 초기 상태를 저장한 뒤,

flush가 호출되면 객체의 변경사항이 있는지 스냅샷과 비교하고,

쓰기 지연 저장소에 UPDATE(혹은 DELETE) SQL을 저장함,

이후 DB에 적용.

지연 로딩(Lazy Loading)

DB 테이블을 조회할 때,

그 테이블과 관련된 테이블을 전부 조회하는 것을 즉시 로딩(Eager Loading)이라고 함,

따라서 지연 로딩(Lazy Loading)을 사용하여 필요한 데이터만 조회하도록 함

플러시 flush

플러시는 영속성 컨텍스트(Persistence Context)의 변경내용을 데이터베이스에 반영하는 작업임.

(1차 캐시에 있는 데이터가 사라지는 것이 아님)

영속성 컨텍스트(Persistence Context)의 변경내용을 감지(Dirty Checking)하고,

엔티티의 변경사항에 따라 쓰기 지연(transactional write-behind) SQL 저장소에 SQL이 저장되면,

저장소의 쿼리를 DB에 전송한뒤 DB 트랜잭션을 커밋.

em.flush()를 통해 직접호출할 수도 있음.

트랙잭션을 커밋하거나 JPQL쿼리 실행시 플러시가 자동으로 호출됨.

준영속 상태 detached

준영속 상태는,

영속상태의 엔티티(managed Entity)가 영속성 컨텍스트(Persistence Context)에서 분리(detached)된 상태를 말함.

영속성 컨텍스트(Persistence Context)가 제공하는 기능을 사용하지 못함.

em.detached(entity) //특정 entity를 준영속 상태로 전환함
em.clear() //영속성 컨텍스트를 완전히 초기화함
em.close() //영속성 컨텍스트를 종료함

 

1. 객체 생성(비영속)

2. 영속성 컨텍스트에 저장(영속)

2-1. 1차 캐시 및 스냅샷에 저장

2-2. 쓰기 지연 SQL 저장소(transactional write-behind)에 SQL 저장

3. 영속성 컨텍스트의 객체 변경

3-1. 스냅샷과 객체의 데이터를 비교하여 변경 감지(Dirty Checking)

4.플러시(flush)를 통해 변경 사항을 DB에 반영

5.영속성 컨텍스트 종료(준영속)

728x90