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 |