Given : 시나리오 진행에 필요한 값을 설정, 테스트의 상태를 설정 ▸ [준비]
When : 시나리오 진행 필요조건 명시, 테스트하고자 하는 행동 ▸ [실행]
Then : 시나리오를 완료했을 때 보장해야 하는 결과를 명시, 예상되는 변화 설명 ▸ [검증]
엔티티 객체를 저장하고 관리하는 JPA의 1차 캐시 공간을 말한다
말 그대로, 데이터베이스와의 연결 고리이자, 메모리 내에 있는 엔티티 저장소라고 보면 된다
📦 한 마디로 → "JPA가 객체를 관리하는 내부 저장소"
DB는 창고,
JPA는 그 창고랑 통신하는 관리자,
영속성 컨텍스트는 관리자가 임시로 들고 있는 노트라고 생각해보기
| 기능 | 설명 |
|---|---|
| 1차 캐시 | find() 하면 DB 말고 컨텍스트에서 먼저 찾아! (성능 굿) |
| 동일성 보장 | 같은 PK면 항상 같은 객체 리턴 (== 비교 가능) |
| 변경 감지 (Dirty Checking) | 엔티티 값 바뀌면 자동 감지해서 flush 시 update 쿼리 날림 |
| flush / clear 지원 | 원하는 타이밍에 DB와 싱크 or 초기화 가능 |
em.persist()는?em.persist(entity);
flush() 시점에 실제로 쿼리 나감)em.clear()는?em.clear();
영속성 컨텍스트를 비워서 1차 캐시를 날려버리는 것이다
즉, JPA가 관리하던 객체들을 전부 detach(비영속 상태)로 만들어서
이후에 find() 하면 DB에서 새로 가져오게 된다
테스트 코드에서 데이터 초기화
👉 이전에 영속되던 데이터들 싹 지우고 새로 시작하고 싶을 때
변경 감지 방지
👉 객체를 더 이상 관리하고 싶지 않을 때
성능 최적화
👉 너무 많은 객체가 영속 상태면 메모리 낭비 → clear로 비워줌
Member member = new Member("홍길동");
em.persist(member); // 아직 DB insert 아님, 영속성 컨텍스트에 등록
member.setName("이몽룡"); // JPA가 자동 감지함
em.flush(); // 여기서 insert + update 쿼리 날라감
em.clear(); // 영속성 컨텍스트 초기화
| 메서드 | 역할 |
|---|---|
em.persist() | 객체를 영속성 컨텍스트에 등록 (DB 반영은 아님) |
em.clear() | 영속성 컨텍스트 비우기 (1차 캐시, 관리 대상 객체 제거) |
flush() | DB에 실제 쿼리 반영 |
오... 영속성하셨나요..? 저도!