먼저 의존성을 추가해줍니다.
// redis
implementation("org.springframework.boot:spring-boot-starter-data-redis-reactive")
고성능, 확장 가능, 스레드 세이프한 레디스 자바 클라이언트로 동기, 비동기, 리액티브 프로그래밍 모두 지원합니다.
다음 yaml파일 작성을 합니다.
spring:
data:
redis:
host: localhost
port: 6379
기존의 CrudRepository를 사용하는 방법은 Reactive 환경에서 사용할 수 없습니다.
그래서 ReactiveRedisTemplate<>을 사용해야 합니다.
@Configuration
class RedisConfig(
@Value("\${spring.data.redis.host}") val host: String,
@Value("\${spring.data.redis.port}") val port: Int
) {
@Primary
@Bean
fun connectionFactory(): ReactiveRedisConnectionFactory? {
return LettuceConnectionFactory(host, port)
}
@Bean
fun reactiveRedisTemplate(factory: ReactiveRedisConnectionFactory): ReactiveRedisTemplate<String, String> {
val context = RedisSerializationContext.newSerializationContext<String, String>()
.key(StringRedisSerializer())
.hashKey(StringRedisSerializer())
.value(StringRedisSerializer())
.hashValue(StringRedisSerializer())
.build()
return ReactiveRedisTemplate(factory, context)
}
}
기본적인 사용은 다음과 같이하면 됩니다.
@Service
class UserService(
private val userRepository: UserRepository,
private val passwordEncoder: PasswordEncoder,
private val reactiveRedisTemplate: ReactiveRedisTemplate<String, String>
) {
@Transactional
suspend fun save(requestDto: SignUpRequestDto): UserResponseDto {
val user = userRepository.save(
User(
email = requestDto.email,
name = requestDto.name,
password = passwordEncoder.encode(requestDto.password),
nickname = requestDto.nickname,
)
).awaitSingle()
val refreshToken = "Token" + user.id
reactiveRedisTemplate.opsForValue().set(refreshToken, user.id!!).subscribe();
return UserResponseDto.from(user)
}
}