Overview
베이스 코드로 Spring Boot Cache 적용에 있던 코드들을 재활용할 예정이라 앞의 글을 먼저 읽어보는걸 추천합니다.
단순하게 Redis Cache 설정만 알고 싶다면 상관 없습니다.
코드를 직접 실행해보려면 로컬에 Redis 를 설치해야 합니다.
만약 별도의 Redis 서버를 운영 중이라면 해당 서버를 사용해도 됩니다.
1. Dependency 추가
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.springframework.boot:spring-boot-starter-cache'
spring-boot-starter-cache
에 이어 spring-boot-starter-data-redis
설정을 추가합니다.
Spring Data Redis 설정을 추가하면 자동으로 기본 캐시가 ConcurrentMapCache
에서 RedisCache
로 설정됩니다.
2. Redis Configuration
spring:
data:
redis:
host: 127.0.0.1
port: 6379
@Configuration
public class RedisConfig {
@Value("${spring.data.redis.host}")
private String host;
@Value("${spring.data.redis.port}")
private int port;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(
new RedisStandaloneConfiguration(host, port)
);
}
}
Redis 연결을 위한 기본 설정을 추가합니다.
3. Redis Cache Configuration
@EnableCaching
@Configuration
public class CacheConfig {
/**
* Spring Boot 가 기본적으로 RedisCacheManager 를 자동 설정해줘서 RedisCacheConfiguration 없어도 사용 가능
* Bean 을 새로 선언하면 직접 설정한 RedisCacheConfiguration 이 적용됨
*/
@Bean
public RedisCacheConfiguration redisCacheConfiguration() {
return RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(60))
.disableCachingNullValues()
.serializeKeysWith(
RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())
)
.serializeValuesWith(
RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())
);
}
/**
* 여러 Redis Cache 에 관한 설정을 하고 싶다면 RedisCacheManagerBuilderCustomizer 를 사용할 수 있음
*/
@Bean
public RedisCacheManagerBuilderCustomizer redisCacheManagerBuilderCustomizer() {
return (builder) -> builder
.withCacheConfiguration("cache1",
RedisCacheConfiguration.defaultCacheConfig()
.computePrefixWith(cacheName -> "prefix::" + cacheName + "::")
.entryTtl(Duration.ofSeconds(120))
.disableCachingNullValues()
.serializeKeysWith(
RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())
)
.serializeValuesWith(
RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())
))
.withCacheConfiguration("cache2",
RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofHours(2))
.disableCachingNullValues());
}
}
Redis Cache 설정을 추가합니다.
CacheManager
를 사용했던 ConcurrentMapCache
와는 다르게 Redis 는 간단하게 Redis Cache 설정을 적용할 수 있습니다.
우선 Spring Data Redis 를 사용한다면 Spring Boot 가 RedisCacheManager
를 자동으로 설정해줍니다.
하지만 Redis 는 직렬화/역직렬화 때문에 별도의 캐시 설정이 필요하고 이 때 사용하는게 RedisCacheConfiguration
입니다.
RedisCacheConfiguration
설정은 Redis 기본 설정을 오버라이드 한다고 생각하면 됩니다.
computePrefixWith
: Cache Key prefix 설정entryTtl
: 캐시 만료 시간disableCachingNullValues
: 캐싱할 때 null 값을 허용하지 않음 (#result == null
과 함께 사용해야 함)serializeKeysWith
: Key 를 직렬화할 때 사용하는 규칙. 보통은 String 형태로 저장serializeValuesWith
: Value 를 직렬화할 때 사용하는 규칙. Jackson2 를 많이 사용함
만약 캐시이름 별로 여러 세팅을 하고 싶다면 RedisCacheManagerBuilderCustomizer
를 선언해서 사용할 수 있습니다.
위 코드에서는 cache1
, cache2
두 가지 캐시를 설정했으며 만약 다른 이름의 캐시를 사용하려 한다면 기본 설정인 RedisCacheConfiguration
를 따라갑니다.
GenericJackson2JsonRedisSerializer
를 사용할 때 주의할 점은 여러개의 데이터를 한번에 저장할 때 List
를 사용하지 말고 별도의 일급 컬렉션을 선언해서 사용해야 합니다.
자세한 이슈는 Spring Boot 에서 Redis Cache 사용 시 List 역직렬화 에러 (GenericJackson2JsonRedisSerializer) 글에 정리해두었습니다.
4. Redis 데이터 확인
API 호출 후 Redis CLI 에서 직접 저장된 데이터를 확인해봅니다.
4.1. cache1 데이터 확인
cache1
은 설정한 대로 prefix 가 붙은 key 값이 사용됩니다.
4.2. members 데이터 확인
별도의 이름을 설정하지 않은 members
캐시는 그냥 일반 키값으로 저장됩니다.
Conclusion
Redis Cache 는 일반적으로 가장 많이 사용되는 글로벌 캐시입니다.
직접 RedisTemplate
을 호출해서 구현할 수도 있지만 Spring Boot 에서 제공하는 설정을 알아두면 나중에 유용하게 사용할 일이 있을 겁니다.
Reference
'Framework > Spring' 카테고리의 다른 글
Spring Boot 에서 Cache 사용하기 (2) | 2023.04.09 |
---|---|
Spring Boot 에서 Kakao, Naver 로그인하기 2편 (OAuth 2.0) - 코드 구현 (12) | 2023.03.12 |
Spring Boot 에서 Kakao, Naver 로그인하기 1편 (OAuth 2.0) - 앱 등록 (0) | 2023.03.12 |
Spring WebFlux Thread Test 해보기 (2) | 2022.03.17 |
JPA Batch Size (0) | 2021.09.14 |