WebFlux, Coroutine에서 Redis 연결하기

TaeHye0n·2024년 3월 25일
1

pmeet

목록 보기
1/5
post-thumbnail
post-custom-banner

먼저 의존성을 추가해줍니다.

// redis
implementation("org.springframework.boot:spring-boot-starter-data-redis-reactive")

lettuce란

고성능, 확장 가능, 스레드 세이프한 레디스 자바 클라이언트로 동기, 비동기, 리액티브 프로그래밍 모두 지원합니다.

다음 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)
  }
}

profile
왜? 에 대해 생각하려고 노력하는 개발자
post-custom-banner

0개의 댓글