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
- find() 하면 먼저 1차 캐시에서 찾음
- 없으면 DB에서 가져와서 캐시에 저장
- 이후엔 캐시에서 조회 → 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
'프로그래밍 > Spring' 카테고리의 다른 글
변경 감지 (Dirty Checking)란? (0) | 2025.04.07 |
---|---|
✅ Write-Behind (쓰기 지연) 란? (0) | 2025.04.07 |
🌿 JPA의 핵심! Persistence Context(영속성 컨텍스트) 완벽 정리 (0) | 2025.04.07 |
🌱 Spring Data JPA 완전 정복 가이드 (0) | 2025.04.04 |
ORM이란? (0) | 2025.04.04 |