써봤어
S
솔루션 & 전문가
최적의 툴과 검증된 파트너를 찾아보세요.
R
솔루션 평가
실제 사용자의 솔직한 평가를 확인하세요.
E
경험 공유
현업 엔지니어들의 생생한 경험담입니다.
커뮤니티기술 블로그교육 +
평가 쓰기경험 쓰기
⭐️ 메신저커뮤니티솔루션평가경험블로그교육 +
이용약관개인정보처리방침

© 2026 Trydit. All rights reserved.

← Back to List
📚 Performance Optimization Series

Redis 설치 및 Spring Boot 연동을 통한 캐싱 구현

Backend_Guru•2025.12.16•backend

💡 Summary

Problem:DB 조회 쿼리가 많아 응답 속도가 느림
Solution:Redis
Result:자주 조회되는 데이터를 캐시하여 API 응답 시간을 200ms -> 20ms로 단축

1. 성능 병목의 원인 파악

서비스 트래픽이 급증하면서 DB CPU 사용률이 90%를 육박하는 상황이 발생했습니다. Slow Query Log를 분석해보니, 쇼핑몰의 '상품 목록 조회'와 '메인 배너 조회' 쿼리가 전체 부하의 60%를 차지하고 있었습니다. 이러한 데이터는 실시간성이 아주 중요하지는 않지만 빈번하게 조회되는 특성이 있어 Redis(In-Memory DB)를 이용한 캐싱 전략을 수립했습니다.

2. Redis 아키텍처 (Standalone vs Cluster)

초기에는 관리 포인트를 줄이기 위해 AWS ElastiCache for Redis (Primary-Replica 구조)를 선택했습니다. 읽기 분산이 필요할 경우 Replica Node를 증설하여 대응할 수 있는 유연한 구조입니다.

3. Spring Boot 연동 및 설정

3.1 의존성 추가 (build.gradle)

implementation 'org.springframework.boot:spring-boot-starter-data-redis'

3.2 Docker로 로컬 Redis 실행

docker run -d -p 6379:6379 --name redis redis:latest

3.3 Cache 설정 (RedisConfig.java)

Key는 String, Value는 JSON 형태로 저장하기 위해 Serializer를 설정합니다. 기본 JDK Serializer는 이진 데이터로 저장되어 디버깅이 어렵기 때문입니다.

@Configuration
@EnableCaching
public class RedisConfig {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        return template;
    }
}

4. 캐시 적용 (@Cacheable)

비즈니스 로직에 침투하지 않고 AOP 기반으로 캐시를 적용할 수 있는 @Cacheable 어노테이션을 사용합니다.

@Service
public class ProductService {
    
    @Cacheable(value = "products", key = "#categoryId", unless = "#result.isEmpty()")
    public List<ProductDto> getProductsByCategory(Long categoryId) {
        // DB 조회 로직 (300ms 소요 가정)
        return productRepository.findByCategoryId(categoryId);
    }
    
    @CacheEvict(value = "products", key = "#product.categoryId")
    public void updateProduct(Product product) {
        productRepository.save(product);
    }
}

5. 트러블슈팅: 캐시 사태(Cache Stampede) 방지

TTL(Time To Live)이 만료되는 순간 수많은 요청이 동시에 DB로 몰리는 현상을 방지하기 위해 Probabilistic Early Expiration 알고리즘을 참고하여 만료 시간을 약간씩 무작위로 분산시켰습니다.

6. 성과 측정

JMeter 부하 테스트 결과, 평균 응답 속도가 300ms에서 15ms로 약 20배 단축되었습니다. DB CPU 사용률 또한 20%대로 안정화되어, 추가적인 인프라 증설 비용을 절감할 수 있었습니다.

Was this helpful?

🛠️

Introduction to Redis

Interested in the tool mentioned in this experience? Check out official pricing, verified sales partners, and expert engineers who can help you adopt it.

View Solution InfoFind Experts