Backend/Java

영속성 컨텍스트 (Persistence Context)

개발자의 첫 걸음 2025. 12. 14. 10:00

안녕하세요. 오늘은 영속성 컨텍스트에 대해 알아볼게요.

 

 

 

영속성 컨텍스트(Persistence Context)

 

 

영속성 컨텍스트는 JPA(Java Persistence API)를 공부할 때 가장 핵심이 되는 개념으로

 

“엔티티를 1차 캐시에 저장해 두고, 동일 트랜잭션 안에서 엔티티를 관리하는 JPA의 내부 저장소”

 

라고 생각하시면 되요.

 

영속성 컨텍스트는 엔티티를 저장하는 1차 캐시 에요.

 

EntityManager는 엔티티를 DB에 바로 저장하지 않고,

 

먼저 영속성 컨텍스트라는 메모리 공간(1차 캐시)에 저장해요.

Member member = new Member(1L, "userA");
em.persist(member);  // DB에 INSERT X -> 1차 캐시에 저장됨

 

 

 

※ 영속성 컨텍스트는 왜 EntityManager(EM) 를 통해서만 사용할까?

 

JPA가 “트랜잭션 단위로 엔티티를 관리하기 위한 통제된 출입구”가 필요하기 때문이에요.

 

JPA 구조에서 영속성 컨텍스트는 독립적으로 존재하지 않아요.

 

EntityManager 내부에 포함된 “관리 공간(1차 캐시 + SQL 저장소)” 이기 때문에

 

EntityManager 없이는 영속성 컨텍스트를 건들 수 없어요.

 

 

요약하자면

 

영속성 컨텍스트는 EntityManager의 내부에 있는 엔티티 관리 창고이고,


이 창고의 문을 열고 조작하는 유일한 열쇠가 EntityManager이다

 

그래서 영속성 컨텍스트는 EM을 통해서만 사용할 수 있어요.

 

 

 

영속성 컨텍스트의 핵심 특징

 

1. 1차 캐시

Member m1 = em.find(Member.class, 1L); // SELECT 실행
Member m2 = em.find(Member.class, 1L); // SELECT 없음! 캐시에서 조회

동일한 트랜잭션 내에서는 DB 조회를 최소화해요.

 

 

2. 동일성 보장 (Identity)

m1 == m2  // true

영속성 컨텍스트가 같은 엔티티 인스턴스를 반환하므로 트랜잭션 내에서 엔티티 동일성이 보장돼요.

 

 

3. 변경 감지(Dirty Checking)

 

엔티티 값만 바꿔도 JPA가 변경사항을 자동으로 감지해서 UPDATE 문을 실행해요.

Member member = em.find(Member.class, 1L);
member.setName("newName");  // UPDATE 선언 안 했음

// 트랜잭션 커밋 시:
em.commit(); // JPA가 변경된 부분만 자동으로 UPDATE!

그리고 개발자가 직접 UPDATE SQL을 쓰지 않아도 돼요.

 

 

4. 쓰기 지연(Write-behind)

em.persist()했다고 바로 DB에 INSERT가 안 나가고 트랜잭션 커밋 시 한 번에 모아서 실행할 수 있어요.

em.persist(a);
em.persist(b);
em.persist(c);
// 여기까지 INSERT SQL 없음

em.commit(); 
// INSERT 3개 한번에 실행

그래서 성능 최적화에 매우 유리해요.

 

5. 엔티티 생명주기

 

엔티티는 4단계를 거치는데 종류와 예시를 볼게요.

상태 설명
비영속(new) JPA가 모르는 상태
영속(managed) 영속성 컨텍스트에서 관리되는 상태
준영속(detached) 영속성 컨텍스트에서 분리됨
삭제(removed) 삭제 예약 상태

 

 

// 예시
em.detach(member); // 준영속 상태로 변경
em.remove(member); // 삭제 상태

 

 

6. 도식으로 이해하기

    [영속성 컨텍스트(1차 캐시)]  
         |   |   |  
        엔티티A 엔티티B 엔티티C  
         ↓  
    트랜잭션 커밋 시  
         ↓  
    SQL 생성 + DB 반영

 

 

7. 영속성 컨텍스트의 중요성

이유 설명
성능 최적화 1차 캐시·쓰기 지연으로 SQL 최소화
코드 간결 변경 감지로 UPDATE 코드 필요 없음
객체지향적 개발 엔티티 상태 전환을 통해 DB 접근을 추상화
트랜잭션 단위 관리 동일성 보장으로 안정적인 작업 가능

 

 

 

여기까지 영속성 컨텍스트에 대해 알아봤는데요.

 

영속성 컨텍스트를 이해하신다면 JPA가 어떻게 엔티티를 똑똑하게 관리하는지 보이기 시작할 것 같아요.

 

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

Spring - OSIV  (0) 2025.12.18
Spring - interceptor  (1) 2025.12.16
Spring Boot - Mustache  (0) 2025.12.12
Spring Security OAuth2  (0) 2025.12.08
RESTful API  (0) 2025.09.07