-
[Spring] 1차 캐시 & 동일성 보장Spring 2025. 5. 7. 16:52
💡 Spring 정리: 1차 캐시 & 동일성 보장 — 왜 == 비교가 true일까?
📘 개념 정리
JPA는 find()로 조회할 때마다 DB에 접근하지 않는다. 영속성 컨텍스트 안의 1차 캐시에 먼저 조회하고, 있으면 거기서 꺼낸다.
그래서 같은 ID를 가진 엔티티를 조회하면 같은 객체(instance)가 반환된다.1차 캐시란?
항목 설명 저장 위치 영속성 컨텍스트 내부 메모리 (Session 수준) 키 값 @Id (식별자) 기준 저장 시점 persist() 또는 find() 특징 동일한 ID 조회 시 DB 접근 없이 캐시에서 반환 이점 성능 향상, 트랜잭션 내 엔티티 동일성 보장
Member m1 = em.find(Member.class, 1L); Member m2 = em.find(Member.class, 1L); System.out.println(m1 == m2); // ✅ true- == 비교가 true인 이유는
같은 ID면 같은 인스턴스를 1차 캐시에서 가져오기 때문 - persist()로 저장한 직후 find() 해도 DB 접근 없음
- 1차 캐시는 트랜잭션 범위 내에서만 유지됨
- 트랜잭션 끝나면 컨텍스트도 날아가고 캐시도 사라짐
⚠️ 실수 및 주의사항
- 트랜잭션 밖에서 find() 하면 매번 DB 접근 발생 (캐시 없음)
- clear() 또는 detach() 후 동일 객체 조회
→ 새로운 객체 (== false) - 캐시 의존하다가 변경 감지 누락되는 경우도 있음
✨ 요약
- JPA는 DB 접근보다 먼저 "1차 캐시"를 조회한다.
- 트랜잭션 내에서는 같은 ID는 같은 객체가 보장된다 (== true).
- 이 덕분에 성능 최적화와 객체 동일성 비교가 가능하다.'Spring' 카테고리의 다른 글
[Spring] JWT - 인증과 인가, 그리고 Access, Refresh Token (1) 2025.05.19 [Spring] JWT (0) 2025.05.18 [Spring] Dirty Checking (0) 2025.05.07 [Spring] Flush 시점 (0) 2025.05.07 [Spring] JPA Entity 생명주기 4단계 (0) 2025.05.07 - == 비교가 true인 이유는