성능 측정 매우 중요하지
- 캐시의 성능을 측정하는 기본 지표인 적중률(Cache Hit Ratio) 개념
- 캐시의 크기와 성능의 상관관계를 실험적으로 학습하기
- 메모리 사용량을 효율적으로 모니터링 하는법
- 간단한 로드 테스트(Load Test) 환경을 구성하여 캐시의 실제 효과 측정하기
- 실무 환경에서 캐시 성능을 분석하고 최적화할 수 있는 기준이란?
캐시 성능 측정 개요
로컬 캐시(Local Cache)는 빠른 응답속도를 위해 사용되지만, 무작정 캐시를 추가한다고 항상 성능이 좋아지는건 아님
성능을 올바르게 측정하기 위해서는 세가지 핵심지표를 이해해야함
| 지표 | 설명 |
| Hit Ratio(적중률) | 캐시에서 데이터를 성공적으로 가져온 비율 |
| Miss Ratio(미적중률) | 캐시에 데이터가 없어 원본 데이터 소스를 조회한 비율 |
| Eviction Count(제거 횟수) | 캐시 용량 초과나 만료로 인해 제거된 항목의 수 |
1. 캐시 동작 시나리오
캐시 성능을 향상시키려면 Hit가 많고 Miss가 적어야한다
데이터 접근 패턴을 분석하고, 적절한 캐시 정책을 설정하는 것이 핵심이라고 함!
캐시 적중률(Cache Hit Ratio) 측정
1. 개념
적중률(Hit Ratio)은 캐시가 실제 성능 향상에 기여하는지를 판단할 수 있는 가장 중요한 지표임
Hit Ratio = Cache Hit 횟수 / (Cache Hit 횟수 + Cache Miss 횟수)
가령
- 총 요청수 : 1000회
- 그 중에서 캐시에서 응답된 요청 수(Cache Hit)가 800회라면
Hit Ratio = 800 / (800 + 200) = 0.8 x 100 = 80%
2. Caffeine 통계 기능 활성화
Caffeine은 캐시 통계 수집을 지원하고 있음
Spring Boot 환경에서 캐시 통계를 출력하는 코드 예제
@Configuration
@EnableCaching // 별도의 Bean 정의가 없으면, ConcurrentMapCacheManager가 기본적으로 사용됨
public class CacheConfig {
@Bean
public CacheManager caffeineCacheManager() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager("userCache");
cacheManager.setCaffeine(Caffeine.newBuilder()
.maximumSize(1000) // 최대 캐시 항목 수
.recordStats() // 캐시 통계 수집 활성화 *
.expireAfterWrite(5, TimeUnit.MINUTES) // write하고 5분 후 만료
.removalListener(new CustomCacheRemovalListener())); // 리스너 메서드를 등록함
return cacheManager;
}
}
출력 예시
CacheStats{hitCount=0, missCount=0, loadSuccessCount=0, loadFailureCount=0, totalLoadTime=0, evictionCount=0, evictionWeight=0}
3. 실무에서의 기준값
| 구분 | Hit Ratio | 판단 기준 |
| 우수 | 90% 이상 | 캐시가 효과적으로 동작하고 있음 |
| 보통 | 70 ~ 89% | 일부 요청이 캐시되지 않음, 개선 필요 |
| 낮음 | 70% 미만 | 캐시 정책 재점검 필요(만료시간, 키 전략 등) |
* Hit Ratio가 높다고 무조건 좋은건 아니다! 너무 높은 적중률은 오래된 데이터가 남아있을 가능성을 의미하기도 함
캐시 크기와 성능의 상관관계
캐시의 크기를 조정할땐 단순히 메모리를 늘리는게 아니라, 적중률과 응답속도의 상관관계를 실험적으로 관찰해야함
1. 예시
* 예시임
| 캐시 크기 | 평균 응답 속도(ms) | Hit Ratio | 메모리 사용량(MB) |
| 100 | 130 | 65% | 45 |
| 500 | 75 | 82% | 110 |
| 1000 | 60 | 89% | 170 |
| 5000 | 58 | 90% | 510 |
예시 분석
- 캐시 크기를 1000까지 늘렸을때 적중률이 급격하게 상승함
- 5000으로 늘리면 Hit Ratio는 거의 동일하지만, 메모리 사용량이 급증함
- > 일정 수준 이후에는 캐시 크기를 키워도 효과가 미미함
팁
* 캐시 크기와 성능의 상관관계는 서비스 트래픽 패턴마다 다름
* 실제 환경에서 테스트를 통해 최적 캐시 크기(Optimum Cache Size)를 찾아야함
* JMX, Acuator, Prometheus와 같은 모니터링 도구를 함께 사용하면 유용함
JVisualVM을 활용한 실시간 모니터링
1. JVisualVM 실행 : JDK 설치시 기본 포함된 도구
2. 애플리케이션 프로세스 선택 : 실행중인 Spring Boot 앱을 선택함
3. Heap 탭 확인 : 캐시 사용량에 따른 힙 변화를 실시간으로 확인하기
4. GC 동작 빈도 확인 : 불필요한 객체가 많을 경우, GC 빈도가 높아진다
팁
* JVM 옵션 Xmx, Xms같은 값을 적절히 조절해서 캐시 메모리 사용을 제한할 수 있음
* jstat, jcmd, jmap 명령어를 활용해서 힙 메모리 상태를 CLI에서 분석할 수 있음
로드 테스트 기법
캐시의 실제 효과를 검증하려면 로드 테스트(Load Test)를 수행해야함
이를 통해 캐시가 트래픽 부하를 얼마나 흡수하는지 확인할 수 있음
1. JMeter를 이용한 테스트 예시
1) Thread Group : 100명 동시 사용자 설정
2) Loop Count : 100회 반복
3) HTTP Request : 캐시가 적용된 API 엔드포인트 지정
4) Listener : Aggregate Report로 평균 응답 시간, Throughtput 확인
예시
| 조건 | 평균 응답 시간(ms) | Throughtput(req/sec) |
| 캐시 미적용 | 200 | 450 |
| 캐시 적용 | 60 | 920 |
캐시 적용 후 응답 속도가 약 3배 향상, 처리량은 2배 증가했음
2. 간단한 테스트 코드
import com.b1uffer.cachetest.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class CacheTestApplicationTests {
@Autowired
private UserService userService;
@Test
void testCachePerformance() {
long start = System.currentTimeMillis();
for(int i = 0; i < 1000; i++) {
userService.getUserById(1L);
}
long duration = System.currentTimeMillis() - start;
System.out.println("Execution time : " + duration + "ms");
}
}
결과
DB 조회 발생
Execution time : 40ms
첫번째 호출에서는 DB를 조회하지만, 이후 999회는 캐시에서 반환되어 실행 시간이 급격하게 줄어들 수 있다.
정리
| 항목 | 설명 |
| Hit Ratio | 캐시의 효율성을 판단하는 핵심 지표 |
| Cache Size vs Performance | 일정 크기 이상은 효과가 제한적임 |
| Memory Monitoring | GC 빈도와 Heap 사용량을 함께 관찰가능 |
| Load Test | 캐시 효과를 실제 요청 환경에서 검증할 수 있음 |
'Spring Boot > Cache' 카테고리의 다른 글
| 캐시 모니터링과 문제 해결 : 캐시 성능 분석 (0) | 2026.01.15 |
|---|---|
| 캐시 모니터링과 문제 해결 : Spring Boot Actuator를 활용한 모니터링 (0) | 2026.01.15 |
| 로컬 캐시 구현과 최적화 : 로컬 캐시 구성 최적화 (0) | 2026.01.12 |
| 로컬 캐시 구현과 최적화 : 로컬 캐시 구현 옵션 (0) | 2026.01.12 |
| Spring Cache 기본 사용 : SpEL을 활용한 동적 캐시 키 (0) | 2026.01.10 |