Spring Webflux 프로젝트에 Spring Data Redis
를 사용해서 Redis 연결을 해보겠습니다.
먼저 Spring Data Redis
를 사용하기 위해 Dependency에 다음 내용을 추가합니다.
참고로 저는 Gradle이 kotlin으로 되어 있어요.
implementation("org.springframework.boot:spring-boot-starter-data-redis")
그 다음 application.yaml
을 생성합니다.
spring:
application:
name: fan-signal-api
jackson:
property-naming-strategy: SNAKE_CASE
data:
redis:
host: localhost
port: 6379
password: master
timeout: 60000
그 다음 위 application.yaml
설정을 바탕으로 Redis Config를 작성해보겠습니다.
reactiveRedisConnectionFactory
에 @Primary
설정을 하지 않으면, Spring Boot에서 기본적으로 등록하는 redisConnectionFactory
와 충돌이 발생하므로 반드시 기입해야 합니다.
@Configuration
class RedisConfig(private val redisProperties: RedisProperties) {
@Bean
@Primary
fun reactiveRedisConnectionFactory(): ReactiveRedisConnectionFactory {
val config = RedisStandaloneConfiguration()
config.hostName = redisProperties.host
config.port = redisProperties.port
if (!redisProperties.password.isNullOrBlank()) {
config.password = RedisPassword.of(redisProperties.password)
}
return LettuceConnectionFactory(config)
}
@Bean
@Qualifier("reactiveStringRedisTemplate")
fun reactiveStringRedisTemplate(factory: ReactiveRedisConnectionFactory): ReactiveStringRedisTemplate {
return ReactiveStringRedisTemplate(factory)
}
@Bean
@Qualifier("reactiveRedisTemplate")
fun reactiveRedisTemplate(factory: ReactiveRedisConnectionFactory): ReactiveRedisTemplate<String, String> {
val keySerializer = StringRedisSerializer()
val valueSerializer = StringRedisSerializer()
val serializationContext = RedisSerializationContext.newSerializationContext<String, String>(keySerializer)
.value(valueSerializer)
.build()
return ReactiveRedisTemplate(factory, serializationContext)
}
}
연결 테스트를 위해 다음과 같은 API를 생성합니다.
@RestController
class RedisTestController(@Autowired private val redisTemplate: ReactiveStringRedisTemplate) {
@GetMapping("/redis-connect")
fun testConnection(): String {
return try {
redisTemplate.opsForValue().set("testKey", "testValue")
"Redis 연결 성공: ${redisTemplate.opsForValue().get("testKey")}"
} catch (e: Exception) {
"Redis 연결 실패: ${e.message}"
}
}
}
실제로 호출해보면 다음과 같은 정상 응답이 내려오는 것을 확인할 수 있습니다.
Redis 연결 성공: testValue