Java/CS

[Java 이론] 영속성 컨텍스트(Persistence Context)

annovation 2025. 2. 27. 08:50

영속성 컨텍스트(Persistence Context)

  • 영속성 컨텍스트는 JPA 계층에서 작동하는 중간 저장소로, 애플리케이션과 데이터베이스 사이에서 데이터를 임시로 보관하고 관리하는 가상의 데이터베이스라고 생각하면 됩니다.
  • 마치 우리가 물건을 바로 창고(DB)에 넣지 않고 장바구니(영속성 컨텍스트)에 담아두는 것처럼 데이터를 임시로 보관하고 관리하는 공간입니다.
  • 속성 컨텍스트는 엔티티(Entity, 데이터베이스에 저장될 데이터)를 저장하는 가상의 데이터베이스입니다. 실제 데이터베이스에 저장하기 전에 임시로 데이터를 보관하고 관리하는 공간으로, 메모리에 존재합니다.

Java 웹 어플리케이션 계층 구조

이미지 1 : https://suhwan.dev/2019/02/24/jpa-vs-hibernate-vs-spring-data-jpa/

 

1. 애플리이션 레임워크 계층

  • Spring Boot : Java 플리케이션을 쉽게 설정하고 실행할 수 있도록 와주는 임워크. 자동 설정(Auto Configuration)과 내장 서버(Tomcat 등)를 제공하여 개발 속도를 높입니다.
  • Spring Framework : Java 이션 개발을 위한 핵 임워크. 의존성 주입(DI), AOP(Aspect-Oriented Programming), MVC(Model-View-Controller) 패 등을 지원하여 듈화와 유지보수성을 향상니다.
  • Spring Data JPA : JPA 쉽게 사용할 수 있도록 추상화한 모. 데이터 접근 을 간하게 구현할  있도록 니다.

2. ORM 계층

  • JPA (Java Persistence API) : Java 객체와 관계 데이터베이스  매핑 관리하는 표준 API. 영성 컨텍스트, 엔티티 매, JPQL(Java Persistence Query Language) 등을 통해 데이터베이스 작업 합니다.
  • Hibernate : JPA의 대표적인 구현, JPA 스 르면서도 추가적인 기능을 제공합니다. 캐싱, 지연 로, 변경 감 등의 기능을 통해 성 합니다.

3. 데이터 접근 계층

  • JDBC (Java Database Connectivity) : Java에서 데이터베이스 연결하고 SQL 쿼리를 실행하기 위한 표준 API. 데이터베이스와의 직접적인 통신 담당합니다.

4. 데이터베이스

  • RDB (Relational Database) : 관계형 데이터베이스, 테이블  관계를 기반으로 데이터를 저장하고 관리합니다. MySQL, Oracle 등이 대표적입니다.
  • NoSQL : 비관계 데이터베이스, 다양한 데이터 모델(문서, 키-값, 그래프 등)을 지원합니다. MongoDB 대표적인 예입니다.

엔티티 생명주기

1. 비영속 상태(New) : JPA가 아직 관리하지 않는 상태

Question question = new Question();  // 객체만 생성
question.setTitle("제목");  // JPA가 아직 모름

 

2. 영속 상태(Managed) : JPA가 관리하는 상태

questionRepository.save(question);  // DB 저장
Question question = questionRepository.findById(1);  // DB 조회

 

3. 준영속 상태(Detached) : JPA가 관리하다가 분리된 상태

em.detach(question);  // 영속성 컨텍스트에서 분리
em.clear();  // 영속성 컨텍스트 초기화

 

4. 삭제 상태(Removed) : 삭제가 예정된 상태

questionRepository.delete(question);  // 실제 DB에서도 삭제

특징 

1. 1차 캐시

영속성 컨텍스트 내부에 있는 임시 저장소

// 첫 조회 : DB 접근
User user1 = userRepository.findById(1);
// 두 번째 조회 : 캐시에서 바로 가져옴
User user2 = userRepository.findById(1);

 

2. 동일성 보장

마치 하나의 장바구니에서 같은 상품을 두 번 꺼내도 동일한 상품인 것처럼, 같은 데이터를 조회하면 항상 같은 객체임을 보장합니다.

// JPA 계층에서 객체 동일성 보장
User user1 = userRepository.findById(1);
User user2 = userRepository.findById(1);
System.out.println(user1 == user2);  // true

 

3. 변경 감지(Dirty Checking)

장바구니 안의 상품 정보가 변경되면 자동으로 이를 감지하여 데이터베이스에 반영합니다.

@Transactional
public void updateUserName(Long id, String newName) {
    User user = userRepository.findById(id);  // 영속성 컨텍스트에 저장
    user.setName(newName);  // 변경 감지 동작
    // 별도의 save() 호출 불필요
}

출처

1. OpenAI ChatGPT (https://openai.com)

2. 이미지 1 출처 : https://suhwan.dev/2019/02/24/jpa-vs-hibernate-vs-spring-data-jpa/

반응형

'Java > CS' 카테고리의 다른 글

[Java] GC(Garbage Collection)  (0) 2025.04.26
[Java] 변수(Variables)  (1) 2025.04.21
Gradle VS Maven  (0) 2025.03.01
Java VS Kotlin  (1) 2025.02.21
[Java 이론] 메모리 구조 JVM (업데이트 중..)  (0) 2024.11.19