본문 바로가기
프로젝트 이슈

RunGuard 개발 로컬 캐시(Caffeine)

by BIGENGINEER 2026. 7. 8.

로컬 캐시(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 다시 조회
→ 최신 데이터로 리포트 재계산
→ 새 결과 캐시 저장