728x90

🔍 1차 캐시란?

JPA에서 엔티티를 메모리에 저장하는 저장소(Persistence Context) 내부에 존재하는 캐시
한마디로, DB 접근 없이 메모리에서 데이터를 먼저 확인하는 기능

 


💡 왜 중요한가요?

  • 성능 향상: 같은 엔티티를 또 조회해도 DB에 다시 접근하지 않음
  • 엔티티 동일성 보장: 같은 트랜잭션 안에서는 == 비교도 true
  • JPA 핵심 기능들의 기반: Dirty Checking, Flush, Write-behind 등 모두 1차 캐시 위에서 작동

 


📦 캐시 작동 흐름

Member member1 = em.find(Member.class, 1L); // ✅ DB 접근 O
Member member2 = em.find(Member.class, 1L); // ✅ DB 접근 X (1차 캐시에서 조회)

System.out.println(member1 == member2); // ✅ true
  1. find() 하면 먼저 1차 캐시에서 찾음
  2. 없으면 DB에서 가져와서 캐시에 저장
  3. 이후엔 캐시에서 조회 → DB 접근 X

 


🧪 실습 예제

 
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();

Member member1 = em.find(Member.class, 1L); // DB 접근
Member member2 = em.find(Member.class, 1L); // 캐시에서 가져옴

System.out.println(member1 == member2); // true

em.getTransaction().commit();
em.close();

 


🧠 특징 요약

항목 설명
저장 위치 Persistence Context (영속성 컨텍스트) 내부
유지 범위 트랜잭션 단위 (트랜잭션 끝나면 사라짐)
저장 기준 @Id 값 기준
동일 객체 반환 여부 동일 트랜잭션 내에서는 == 비교도 true
DB 접근 최적화 캐시에 있으면 DB 접근 안 함

 


⚠️ 주의사항

  • 트랜잭션이 종료되면 캐시도 제거됨
  • 트랜잭션마다 새롭게 캐시 생성됨 → 다른 트랜잭션에서는 새롭게 DB 접근
  • @Id가 없는 엔티티는 캐시 대상이 아님

 


❓ 2차 캐시도 있나요?

  • 있음! (Second-Level Cache)
    → 애플리케이션 전체 범위에서 공유되는 캐시
    → 설정을 별도로 해야 하며, 성능 최적화용

하지만 JPA의 기본 기능들은 모두 1차 캐시 기준으로 동작

 


✅ 요약 정리

용어 설명
1차 캐시 영속성 컨텍스트 내부 메모리 캐시
캐시 범위 트랜잭션 단위
핵심 기능 DB 접근 최소화, 동일성 보장, 변경 감지 기반
사용 방식 find() 호출 시 자동 사용

 

 


 

728x90