JPA

영속성과 영속성 컨텍스트에 대하여

euicheol0910 2025. 7. 14. 14:35

1. 영속성이란 무엇인가?

영속성(Persistence)은 쉽게 말해 데이터가 프로그램이 종료되어도 살아남는 상태를 말합니다. 즉, 데이터를 메모리(RAM)뿐 아니라 디스크(DB) 같은 영구 저장소에 보존하는 것과 관련된 개념이에요.

  • 예시
    • 자바 객체만 메모리에 있으면 → 프로그램 종료 시 모두 날아감 → 비영속 상태
    • DB에 저장해서 나중에 다시 꺼낼 수 있으면 → 영속 상태

영속성은 “데이터를 지속적으로 저장할 수 있게 만드는 성질”이라고 이해하면 됩니다.

 

2. 영속성 컨텍스트란 무엇인가?

영속성 컨텍스트(Persistence Context)는 JPA에서 매우 중요한 개념이에요.

 

정의:

영속성 컨텍스트는 엔티티(Entity)를 관리하는 메모리상의 공간(캐시)입니다.

  • JPA가 엔티티를 저장, 조회, 수정, 삭제할 때 사용하는 일종의 “1차 캐시”

 

영속성 컨텍스트의 역할

 

① 엔티티 관리 (영속 상태 유지)

  • EntityManager를 통해 persist()를 호출 → 엔티티가 영속성 컨텍스트에 저장됨
  • 영속성 컨텍스트에 저장된 엔티티는 영속 상태(persistent state)가 된다.
  • 같은 트랜잭션 안에서 같은 엔티티 객체가 재사용된다. → 1차 캐시 덕분

 

② 1차 캐시

  • DB에 바로 쿼리 안 보내고 영속성 컨텍스트(캐시)에서 먼저 엔티티 찾음
  • 같은 엔티티를 또 조회해도 SQL 쿼리가 안 나감
 
Member m1 = em.find(Member.class, 1L); 
Member m2 = em.find(Member.class, 1L);
System.out.println(m1 == m2); // true (동일성 보장)

 

→ DB에서 두 번 불러오지 않고 같은 객체 반환!

 

③ 변경 감지(Dirty Checking)

  • 영속성 컨텍스트가 엔티티 스냅샷을 보관하고 있다가
  • 트랜잭션 종료 시점에 변경사항을 감지해
  • 자동으로 UPDATE 쿼리를 실행한다.
Member m = em.find(Member.class, 1L); 
m.setName("변경됨"); // flush 시점에 UPDATE 쿼리 발생


 

→ 즉, 개발자가 UPDATE SQL 직접 안 써도 된다!

 

④ 쓰기 지연 SQL 저장소 (Write-Behind)

  • INSERT 쿼리를 즉시 DB에 보내지 않고
  • 트랜잭션 커밋 직전에 한꺼번에 보낸다.

 

⑤ 엔티티 동일성 보장

  • 같은 트랜잭션 안에서 같은 PK 가진 엔티티는 동일 객체
  • 비영속 객체끼리는 다르다.

상태 구분 (엔티티 생명주기)


 

상태 설명
비영속(Transient) 아직 영속성 컨텍스트에 저장되지 않음
영속(Persistent) 영속성 컨텍스트에 저장된 상태
준영속(Detached) 컨텍스트에서 분리됨 (관리 안 됨)
삭제(Removed) 삭제 예약된 상태
 

 

간단 정리

영속성

  • 데이터가 DB 등에 저장되어 프로그램 종료 후에도 살아있음

영속성 컨텍스트

  • JPA가 엔티티를 관리하는 1차 캐시
  • 같은 엔티티 객체 관리, 쿼리 최소화, 변경감지 등 기능 수행

쉽게 말해:

  • “영속성” → DB에 저장되어 안 사라지는 것
  • “영속성 컨텍스트” → 엔티티를 관리하는 JPA의 메모리 공간

'JPA' 카테고리의 다른 글

JPA와 MyBatis  (1) 2025.06.30