로컬 캐시(Caffeine)를 이용한 성능 개선을 해보자
로컬캐시
- DB 조회 결과를 서버 메모리에 잠깐 저장해두는 것
- 자주 쓰는 데이터를 더 빠른 곳에 임시 저장하는 것
주간 리포트에서는 API 한 번 호출할 때마다 많은 연산이 이뤄짐
-> 짧은 시간 안에 주간 리포트 여러 번 조회하면, 매번 똑같은 계산을 반복하는 건 낭비임
-> 그래서 첫 번째 조회 결과를 서버 메모리에 저장해두는 것!
첫 번째 요청:
DB 조회 + 계산 → 결과를 캐시에 저장 → 응답
두 번째 요청:
캐시 확인 → 저장된 결과 있음 → DB 조회 없이 바로 응답
<로컬> : 현재 Spring Boot 서버 안의 메모리에 저장
Caffeine
- 고성능 로컬 캐시 라이브러리
spring-boot-starter-cache
→ Spring에서 @Cacheable, @CacheEvict 같은 캐시 기능을 쓰게 해줌
caffeine
→ 실제로 메모리에 캐시 데이터를 저장하고 관리하는 라이브러리
spring:
cache:
type: caffeine
cache-names:
- weeklyReport
caffeine:
spec: maximumSize=1000,expireAfterWrite=5m
주간 리포트 결과 최대 1000개까지 저장, 각 결과는 5분 지나면 자동으로 사라짐
<흐름>
1. 캐시 적용 전
GET /api/reports/weekly?userId=1
→ ReportController
→ ReportService
→ User 조회
→ Workouts 조회
→ WorkoutSegments 조회
→ ConditionEvents 조회
→ 집계 계산
→ WeeklyReportResponse 반환
2. 캐시 적용 후
1) 첫 번째 요청
GET /api/reports/weekly?userId=1
→ 캐시에 user:1 없음
→ DB 조회 + 집계 계산
→ 결과를 weeklyReport 캐시에 저장
→ 응답
2) 두 번째 요청
GET /api/reports/weekly?userId=1
→ 캐시에 user:1 있음
→ DB 조회 생략
→ 캐시된 WeeklyReportResponse 바로 응답
3) 컨디션 이벤트 저장
POST /api/condition-events
→ DB 저장
→ user:1 캐시 삭제
4) 그 다음 주간 리포트 요청
GET /api/reports/weekly?userId=1
→ 캐시에 user:1 없음
→ DB 다시 조회
→ 최신 데이터로 리포트 재계산
→ 새 결과 캐시 저장
'프로젝트 이슈' 카테고리의 다른 글
| RunGuard 개발 - 캐시 무효화 검증 (0) | 2026.07.10 |
|---|---|
| RunGuard 개발 - k6 & Tomcat thread & HikariCP connection pool (0) | 2026.07.08 |
| RunGuard 개발 EXPLAIN (0) | 2026.07.08 |
| RunGuard 개발 예외처리 (0) | 2026.07.08 |
| RunGuard 개발 DTO (0) | 2026.07.08 |