영속성(Persistence)
: 데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터의 특성
- 영속성을 갖지 않는 데이터는 단지 메모리에서만 존재하기 때문에, 프로그램이 종료되면 모두 잃어버림
-> 파일 시스템, 관계형 데이터베이스를 활용하여 데이터를 영구적으로 저장하고 영속성을 부여
영속성 레이어
: 프로그램의 아키텍처에서 데이터에 영속성을 부여해주는 계층
- JDBC를 이용하여 직접 구현할 수 있지만 Persistance Framework를 이용한 개발이 많이 이루어짐
- JDBC 프로그래밍의 복잡함이나 번거로움 없이 간단한 작업만으로 DB와 연동되는 시스템을 빠르게 개발할 수 있으며, 안정적인 구동을 보장함
영속성 컨텍스트
: 애플리케이션와 DB 사시에서 엔티티와 레코드의 괴리를 해소하는 기능과 객체를 보관하는 기능을 수행
- 엔티티 객체가 영속성 컨텍스트에 들어오면 JPA는 엔티티 객체의 매핑 정보를 DB에 반영하는 작업을 수행
- 영속 객체
: 엔티티 객체가 영속성 컨텍스트에 들어와 JPA의 관리 대상이 되는 시점부터 객체를 부르는 호칭
- 엔티티를 영구 저장하는 환경으로 엔티티 매니저를 통해 영속성 컨텍스트에 접근
- 세션 단위의 생명주기를 가짐 )
- DB에 접근하기 위한 세션이 생성되면 영속성 컨텍스트가 반들어짐
- 세션이 종료되면 영속성 컨텍스트도 없어짐
- 엔티티 매니저는 이러한 일련의 과정에서 영속성 컨텍스트에 접근하기 위한 수단으로 사용됨
Entity의 생명 주기
- New / Transient
- 비영속 상태
- Entity가 생성, 영속성 컨텍스트에 저장되지 않은 상태
- new 키워드를 통해 생성된 상태로 영속성 컨텍스트와 관련이 없는 상태
- Managed
- 영속 상태
- Entity 매니저로 영속성 컨텍스트에 저장된 상태
- DB에 반영되지 않고 영속성 컨텍스트에 의해 관리됨
- 트랜잭션 커밋 시점에 DB에 반영
- Detached
- 준영속 상태
- 영속성 컨텍스트에 의해 관리되다가 분리된 상태
- Removed
- 삭제된 상태
- 영속성 컨텍스트와 DB에서 제거된 상태
영속성 컨텍스트의 특징
1. 식별자 값
- 영속성 컨텍스트는 식별자 값(PK)로 Entity를 구분
- 모든 영속 상태의 Entity는 식별자 값을 가지고 있어야 함
- 없다면 예외를 뱉어냄
2. 커밋 & 플러시
- 영속성 컨텍스트에 Entity를 저장하고 트랜잭션을 커밋해야 실제 DB에 반영됨
- Flush : 현재 영속성 컨텍스트의 변경 내용을 DB에 반영하는 작업
- Commit : 트랜잭션의 작업을 최종적으로 DB에 반영하는 과정
-> 트랜잭션에 포함된 논리 작업 단위를 성공적으로 수행했고, 데이터가 무결성을 준수한다면 Commit을 통해 DB에 반영
cf) Commit vs Flush
- Flush는 쿼리를 전송하는 역할 -> 임시저장
- Commit은 Flush를 수행하고 트랜잭션을 끝내는 역할
3. 1차 캐시
- 영속성 컨텍스트 내부에는 Entity 인스턴스를 캐싱하는 1차 캐시가 있음
- 일반적으로 트랜잭션 내에서 유효한 생명 주기를 가짐
- 같은 트랜잭션 내에서 1차 캐시에 존재하는 Entity를 조회할 때, DB에 접근하지 않아도 됨
- 트랜잭션이 커밋되면 소멸함
cf) 트랜잭션
: DB에서 한 번에 실행되어야 할 여러 작업들이 묶인 논리적인 작업 단위
- 데이터의 일관성과 무결성을 보장하는 데 매우 중요한 역할을 함
4. 동일성 보장
- 1차 캐시에서는 Entity 인스턴스를 Map 구조로 캐싱함
- 따라서 같은 식별자를 통해 1차 캐시에서 얻은 Entity 인스턴스는 == 연산을 통해 동일성을 보장
5. 쓰기 지연
- 트랜잭션 내에서 영속화된 Entity에 대한 쿼리를 쓰기 지연 SQL 버퍼에 저장해두었다가 commit이나 flush 시점에 DB로 요청함
6. 변경 감지
- Entity 인스턴스를 영속성 컨텍스트에 보관할 때, 최초 상태에 대한 스냅샷을 저장해둠
- 커밋 또는 플러시 시점에 각각의 Entity 상태를 스냅샷과 비교하는데 변경된 Entity가 있으면 쓰기 지연 SQL 버퍼에 update 쿼리를 추가함
Reference
'JPA' 카테고리의 다른 글
6. JPA의 캐시 (0) | 2025.06.17 |
---|---|
5. M : N 해결 전략 (0) | 2025.06.17 |
4. N + 1 문제 (0) | 2025.06.17 |
3. Eager, Lazy Loading (0) | 2025.06.06 |
1. JPA & Hibernate (2) | 2025.06.06 |