[Spring] Redis를 이용한 캐싱 기법

1. 소개

1. Redis란?

Redis(REmote DIctionary Server)는 인메모리(NoSQL) 데이터 저장소이다.

즉, 데이터를 메모리에 저장해서 빠르게 읽고 쓸 수 있는 데이터베이스라고 생각하면 될 것 같다. 

빠른 속도와 다양한 데이터 구조를 지원해 캐싱용도로 많이 사용된다.

Spring Boot와 함께 Redis를 활용하면 데이터베이스나 외부 API 호출을 최소화하면서 성능을 향상시킬 수 있다.

 

2. 사용하는 이유

  • 고속 데이터 처리: 메모리 기반 저장소라서 DB보다 훨씬 빠름
  • 부하 감소: 자주 사용하는 데이터를 캐싱하여 DB 부하를 줄임
  • TTL(만료 시간) 설정 가능: 특정 시간 후 자동 삭제 가능
  • 분산 환경 지원: 여러 인스턴스에서 공유 가능

 

2. 프로젝트 설정 (Spring Boot + Redis)

1. 의존성 추가

Maven

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

Gradle

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-redis'
    implementation 'org.springframework.boot:spring-boot-starter-cache'
}

 

2. Redis 설정

application.yml 

spring:
  cache:
    type: redis
  redis:
    host: localhost
    port: 6379

 

host랑 port는 환경에 맞게 변경 가능

 

 

3. Redis 캐싱 활성화 및 설정

Spring Boot에서 Redis를 캐시로 사용하려면 @EnableCaching을 사용해야한다.

 

캐싱 활성화 RedisConfig.java

@Configuration
@EnableCaching // 캐싱 기능 활성화
public class RedisConfig {

    @Bean
    public RedisCacheConfiguration cacheConfiguration() {
        return RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofMinutes(10)) // 기본 캐시 만료 시간 (10분)
                .disableCachingNullValues(); // null 값 캐싱 방지
    }
}

 

  • @EnableCaching: Spring의 캐싱 기능 활성화
  • entryTtl(Duration.ofMinutes(10)): 캐시의 기본 TTL(만료 시간) 설정

 

3. 캐싱 적용 방법

1. @Cacheable - 캐싱된 데이터 가져오기

@Cacheable을 사용하면 DB 조회 전에 Redis에서 캐시된 값을 먼저 가져오고, 없으면 DB에서 데이터를 가져와 Redis에 저장한다.

 

Service 레이어에서 캐싱 적용 

@Service
public class ProductService {

    @Autowired
    private ProductRepository productRepository;

    @Cacheable(value = "products", key = "#id")
    public Product getProductById(Long id) {
        System.out.println("Fetching from DB...");
        return productRepository.findById(id).orElse(null);
    }
}

 

 

  • @Cacheable(value = "products", key = "#id")
    • Redis에서 "products" 캐시를 먼저 확인
    • 캐시가 있으면 DB 조회 없이 반환
    • 없으면 DB에서 조회 후 캐시에 저장
  • System.out.println("Fetching from DB..."); → Redis에서 캐시된 데이터가 있으면 실행되지 않음

 

2. @CachePut - 캐시 갱신하기

DB의 데이터가 업데이트될 경우, 캐시도 갱신해야한다.

이때 @CachePut을 사용하면 기존 캐시를 업데이트할 수 있다.

@CachePut(value = "products", key = "#product.id")
public Product updateProduct(Product product) {
    System.out.println("Updating DB...");
    return productRepository.save(product);
}

 

 

  • @CachePut: DB 데이터를 변경하면서 캐시도 동시에 갱신
  • 기존에 저장된 products 캐시 데이터를 새로운 값으로 덮어씀

 

3. @CacheEvict - 캐시 삭제

데이터가 삭제되거나 변경되면 기존 캐시를 제거해야한다.

이때 @CacheEvict를 사용해 캐시를 제거한다.

@CacheEvict(value = "products", key = "#id")
public void deleteProduct(Long id) {
    System.out.println("Deleting from DB...");
    productRepository.deleteById(id);
}

 

 

  • @CacheEvict: 캐시에서 해당 데이터를 삭제
  • "products" 캐시에서 해당 ID의 데이터를 삭제함

 

4. TTL(Time To Live) 설정하기

Redis에서 TTL을 설정하면 일정 시간이 지나면 캐시가 자동으로 삭제된다.

 

RedisConfig에서 TTL 설정 추가

@Bean
public RedisCacheConfiguration cacheConfiguration() {
    return RedisCacheConfiguration.defaultCacheConfig()
            .entryTtl(Duration.ofMinutes(5)) // 캐시 유효 시간 5분
            .disableCachingNullValues();
}

 

 

5. 정리

캐싱이 없을 때는 같은 요청이 여러번와도 매번 DB에서 조회하는 반면, Redis 캐싱을 적용하면 처음 요청만 DB에서 조회하고

이후 요청은 Redis에서 즉시 반환하므로 조회 속도를 개선할 수 있고 응답시간을 단축해 사용자 경험을 개선한다.

또한 DB 조회가 줄어드므로 DB의 부하도 낮추는 효과를 얻을 수 있다.

 

'Spring' 카테고리의 다른 글

[Spring] Spring Boot에서 DB Replication  (0) 2025.02.10
[Spring] Spring Boot Starter 이해하기  (0) 2025.02.08
[Spring] Spring Security  (0) 2025.02.06
[Spring] N + 1 문제  (0) 2025.02.06
[Spring] 관계 매핑 어노테이션  (2) 2025.02.06