영속성 컨텍스트

영속성 컨텍스트(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()
┌────────────────────────────────────┐
│            데이터베이스              │
└────────────────────────────────────┘

한줄 요약

영속성 컨텍스트 = 엔티티를 관리하면서 캐싱, 변경 감지, 쓰기 지연 등을 제공하는 중간 저장소

CSLOG에서 보기