본 캠프_44일차

졸용·2025년 4월 18일

TIL

목록 보기
45/144

Given-When-Then 패턴

Given-When-Then Pattern (출처: https://cobi-98.tistory.com)

  • Given : 시나리오 진행에 필요한 값을 설정, 테스트의 상태를 설정 ▸ [준비]

  • When : 시나리오 진행 필요조건 명시, 테스트하고자 하는 행동 ▸ [실행]

  • Then : 시나리오를 완료했을 때 보장해야 하는 결과를 명시, 예상되는 변화 설명 ▸ [검증]


✅ 영속성 컨텍스트란?

엔티티 객체를 저장하고 관리하는 JPA의 1차 캐시 공간을 말한다

말 그대로, 데이터베이스와의 연결 고리이자, 메모리 내에 있는 엔티티 저장소라고 보면 된다

📦 한 마디로 → "JPA가 객체를 관리하는 내부 저장소"


💡 비유로 이해하기

DB는 창고,
JPA는 그 창고랑 통신하는 관리자,
영속성 컨텍스트는 관리자가 임시로 들고 있는 노트라고 생각해보기

  • DB에 바로 저장 안 하고
  • 이 노트에 쓰고
  • 적절한 시점에 한 번에 창고(DB)에 넣는 것으로 이해해보기

🔧 주요 기능

기능설명
1차 캐시find() 하면 DB 말고 컨텍스트에서 먼저 찾아! (성능 굿)
동일성 보장같은 PK면 항상 같은 객체 리턴 (== 비교 가능)
변경 감지 (Dirty Checking)엔티티 값 바뀌면 자동 감지해서 flush 시 update 쿼리 날림
flush / clear 지원원하는 타이밍에 DB와 싱크 or 초기화 가능

🧪 em.persist()는?

em.persist(entity);
  • 엔티티를 영속성 컨텍스트에 등록
  • 아직 DB에 insert 되진 않았음! (flush() 시점에 실제로 쿼리 나감)

🧹 em.clear()는?

em.clear();

영속성 컨텍스트를 비워서 1차 캐시를 날려버리는 것이다

즉, JPA가 관리하던 객체들을 전부 detach(비영속 상태)로 만들어서
이후에 find() 하면 DB에서 새로 가져오게 된다


✅ em.clear()를 왜 할까?

  1. 테스트 코드에서 데이터 초기화
    👉 이전에 영속되던 데이터들 싹 지우고 새로 시작하고 싶을 때

  2. 변경 감지 방지
    👉 객체를 더 이상 관리하고 싶지 않을 때

  3. 성능 최적화
    👉 너무 많은 객체가 영속 상태면 메모리 낭비 → 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에 실제 쿼리 반영
profile
꾸준한 공부만이 답이다

2개의 댓글

comment-user-thumbnail
2025년 4월 18일

오... 영속성하셨나요..? 저도!

1개의 답글