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 |
|---|