영속성 컨텍스트
영속성 컨텍스트(Persistence Context) 는 엔티티를 저장하고 관리하는 눈에 보이지 않는 공간입니다.
쉽게 말하면
엔티티를 DB에 바로 저장하지 않고, 중간에 잠시 머무르는 대기실 같은 곳이에요.
Java 객체 → 영속성 컨텍스트(대기실) → 데이터베이스
비유
| 비유 | 영속성 컨텍스트 | DB |
|---|---|---|
| 장바구니 | 담아둔 상품들 | 실제 결제 |
| 임시저장 | 작성 중인 글 | 게시된 글 |
| 클립보드 | 복사한 내용 | 붙여넣기 완료 |
엔티티의 생명주기
// 1. 비영속 (new) - 그냥 객체 생성만 한 상태
User user = new User("홍길동");
// 2. 영속 (managed) - 영속성 컨텍스트에 들어감
entityManager.persist(user);
// 3. 준영속 (detached) - 영속성 컨텍스트에서 빠짐
entityManager.detach(user);
// 4. 삭제 (removed) - 삭제 예정 상태
entityManager.remove(user);
영속성 컨텍스트의 장점
1. 1차 캐시
// 첫 번째 조회 - DB에서 가져옴
User user1 = entityManager.find(User.class, 1L);
// 두 번째 조회 - DB 안 가고 캐시에서 반환 (빠름)
User user2 = entityManager.find(User.class, 1L);
// 같은 객체
System.out.println(user1 == user2); // true
2. 변경 감지 (Dirty Checking)
User user = entityManager.find(User.class, 1L);
user.setName("새이름"); // 수정만 해도
// UPDATE 쿼리 자동 실행됨 (별도 save 호출 필요 없음)
transaction.commit();
3. 쓰기 지연
entityManager.persist(user1); // SQL 저장만
entityManager.persist(user2); // SQL 저장만
entityManager.persist(user3); // SQL 저장만
// 커밋할 때 INSERT 3개 한번에 실행
transaction.commit();
그림으로 보면
┌────────────────────────────────────┐
│ 영속성 컨텍스트 │
│ │
│ [1차 캐시] [쓰기 지연 저장소] │
│ id=1 → User1 INSERT user1 │
│ id=2 → User2 INSERT user2 │
│ │
└────────────────────────────────────┘
↓ commit()
┌────────────────────────────────────┐
│ 데이터베이스 │
└────────────────────────────────────┘
한줄 요약
영속성 컨텍스트 = 엔티티를 관리하면서 캐싱, 변경 감지, 쓰기 지연 등을 제공하는 중간 저장소