캐시(Cache) 기반 성능 최적화
애플리케이션 성능 개선에서 가장 큰 효과를 내는 방법 중 하나는 ‘DB를 호출하지 않는 것’이다.
캐시는 DB 조회를 대체할 수 있는 가장 강력한 수단이며, 조회 트래픽을 크게 줄여 전체 시스템 안정성을 향상시킨다.
이 글에서는 Spring Boot + Redis 환경을 기준으로 캐시 기반 성능 최적화 전략을 정리한다.
#왜 캐시가 중요한가?
DB 조회는 I/O 기반 작업이기 때문에 네트워크 지연, 디스크 접근, 락(lock) 등이 포함되어 비용이 크다.
반면 Redis 같은 인메모리 캐시는 초당 수십만 ~ 수백만 건의 요청을 처리할 수 있다.
캐시를 적용하면 얻는 효과
- DB 부하 감소
- 응답 속도 향상 (ms → μs 수준)
- 트래픽 급증 상황에서도 안정적인 처리
- 총 비용 절감 (RDS 스케일업 빈도 감소)
#Spring Cache를 이용한 기본 캐싱
Spring에서는 @Cacheable, @CacheEvict, @CachePut으로 매우 간단하게 캐시를 적용할 수 있다.
@Cacheable 기본 예제
@Cacheable(value = "member", key = "#id")
public MemberDto getMember(Long id) {
return memberRepository.findById(id)
.map(MemberDto::from)
.orElseThrow(...);
}
동작 방식
- 처음 호출: DB 조회 → Redis 캐시 저장
- 두 번째 이후: Redis에서 즉시 조회 (DB 접근 없음)
주의할 점
- 캐시는 ‘변경이 자주 발생하지 않는 데이터’에만 적용
- 키 충돌 방지를 위해 캐시 key를 명확히 정의
- TTL(만료 시간) 설정이 매우 중요
#Redis를 활용한 캐싱 전략
Redis는 대표적인 인메모리 캐시이자 Spring Boot와 가장 잘 연동되는 캐시 스토리지다.
캐싱하기 좋은 데이터 유형
- 자주 조회되지만 잘 변경되지 않는 데이터
- 리스트 형태의 목록 데이터
- 자주 사용되는 옵션/코드/카테고리
- 외부 API 호출 결과
TTL(Time To Live) 설계
TTL은 캐시의 유효 기간으로, 캐시 일관성과 성능 사이에서 균형을 맞추는 핵심 요소다.
- 정적 데이터: 1시간 ~ 하루
- 유동적 데이터: 1분 ~ 5분
- 트래픽이 큰 API: 10초 ~ 30초
#RedisTemplate을 활용한 수동 캐싱
Spring Cache가 단순 자동 캐싱을 제공한다면, RedisTemplate은 직접 JSON/문자열/Hash 구조로 캐싱할 수 있게 해준다.
예시: 직접 캐시 저장
redisTemplate.opsForValue().set("match:1234", jsonData, 30, TimeUnit.SECONDS);
예시: 직접 캐시 조회
String cached = redisTemplate.opsForValue().get("match:1234");
if (cached != null) {
return objectMapper.readValue(cached, MatchDto.class);
}
이 방식의 장점:
- JSON 구조 그대로 저장 가능
- Cacheable보다 유연한 구조 설계 가능
- 조건별 캐싱 전략 구현 가능
#Hot Key 문제 방지
특정 키에 트래픽이 과도하게 몰리면 Redis 단일 노드가 병목이 된다.
대처 전략
- 캐시 키를 분산시키는 샤딩 전략
- 랜덤 TTL 적용으로 특정 시점의 캐시 미스 폭주 방지
- CDN 캐시 활용(정적 콘텐츠)
랜덤 TTL 예시
int ttl = 60 + new Random().nextInt(30); // 60~90초
redisTemplate.opsForValue().set(key, value, ttl, TimeUnit.SECONDS);
#캐시와 DB 동기화 전략
캐시는 DB와 eventually consistent(일시적 비일관) 상태가 발생할 수 있다.
1) Cache Aside (가장 많이 사용)
- 읽기: 캐시 → 없으면 DB 조회 후 캐시 저장
- 쓰기: DB 업데이트 후 캐시 삭제
2) Read Through
- 캐시가 직접 DB 조회
- Spring Boot 애플리케이션에서는 잘 사용되지 않음
#캐시 사용 시 주의사항
- 캐시가 만능이 아니다 — TTL 및 데이터 갱신 정책이 중요
- 과도한 캐싱은 오히려 복잡도를 높임
- 트랜잭션 내부에서 캐시 접근 시 주의
- 키 네이밍 규칙을 반드시 통일해야 함
마치며
캐시는 성능 최적화에서 가장 즉각적인 효과를 내는 기술이다.
특히 Redis 기반 캐싱은 API 응답 속도, DB 부하, 비용 절감까지 직접적인 기여를 한다.
핵심 포인트는 다음과 같다.
- 변경이 적은 데이터에 캐시 적용
- 적절한 TTL 설정
- @Cacheable & RedisTemplate 함께 활용
- Hot Key 문제 대비
- Cache Aside 패턴이 가장 안전한 전략
다음 글에서는 API 레벨 성능 최적화를 다룰 예정이다.
'TIL' 카테고리의 다른 글
| Spring Boot 성능 최적화 5 (0) | 2025.10.30 |
|---|---|
| Spring Boot 성능 최적화 4 (0) | 2025.10.29 |
| Spring Boot 성능 최적화 2 (0) | 2025.10.27 |
| Spring Boot 성능 최적화 1 (0) | 2025.10.25 |
| 10/24 (0) | 2025.10.24 |