Spring Boot 성능 최적화 3

2025. 10. 28. 22:18·TIL

캐시(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
'TIL' 카테고리의 다른 글
  • Spring Boot 성능 최적화 5
  • Spring Boot 성능 최적화 4
  • Spring Boot 성능 최적화 2
  • Spring Boot 성능 최적화 1
twodc
twodc
매일의 배움과 고민, 그리고 작은 성장을 담은 개발자의 성장일지입니다.
  • twodc
    The Answer is 42
    twodc
  • 전체
    오늘
    어제
    • 분류 전체보기 (122)
      • TIL (122)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Github
  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
twodc
Spring Boot 성능 최적화 3
상단으로

티스토리툴바