📌 [Java] Spring WebFlux + Redis 사용 시 ReactiveRedisTemplate Bean 오류 해결 방법
2025. 3. 4. 11:25

최근 Spring WebFlux + R2DBC + Redis를 활용하여 비동기 데이터 캐싱 시스템을 구축하는 프로젝트를 진행하던 중,
사용자 데이터를 Redis에 저장하고 조회하는 기능을 구현하는 과정에서 Application Startup 오류를 경험했습니다.


⚠️ 발생한 오류

❌ 오류 메시지

APPLICATION FAILED TO START
***************************
Description:

Parameter 1 of constructor in com.mpole.reactiveapp.service.UserService required a bean of type 
'org.springframework.data.redis.core.ReactiveRedisTemplate' that could not be found.

Action:

Consider defining a bean of type 'org.springframework.data.redis.core.ReactiveRedisTemplate' in your configuration.

 


🔍 오류 원인 분석

이 오류는 Spring Boot가 UserService에서 ReactiveRedisTemplate<String, User>을 찾지 못해서 발생합니다.

🚨 원인 1: ReactiveRedisTemplate<String, Object>만 등록된 경우

보통 Redis 설정(RedisConfig.java)에서 ReactiveRedisTemplate<String, Object>을 등록합니다.

@Bean
public ReactiveRedisTemplate<String, Object> reactiveRedisTemplate(ReactiveRedisConnectionFactory factory) {
    Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);

    return new ReactiveRedisTemplate<>(
            factory,
            RedisSerializationContext
                    .<String, Object>newSerializationContext(new StringRedisSerializer())
                    .value(serializer)
                    .key(new StringRedisSerializer())
                    .build()
    );
}

그러나, 이 설정만으로는 ReactiveRedisTemplate<String, User>을 지원하지 않습니다.
즉, User 데이터를 직렬화/역직렬화할 Bean이 없기 때문에 오류가 발생하는 것입니다.


✅ 해결 방법: ReactiveRedisTemplate<String, User> Bean 추가

RedisConfig.java에서 User 전용 ReactiveRedisTemplate<String, User>을 등록하면 해결됩니다.

🚀 해결 코드: RedisConfig.java 수정

@Bean
public ReactiveRedisTemplate<String, User> userReactiveRedisTemplate(ReactiveRedisConnectionFactory factory) {
    Jackson2JsonRedisSerializer<User> serializer = new Jackson2JsonRedisSerializer<>(User.class);

    return new ReactiveRedisTemplate<>(
            factory,
            RedisSerializationContext
                    .<String, User>newSerializationContext(new StringRedisSerializer())
                    .value(serializer)
                    .key(new StringRedisSerializer())
                    .build()
    );
}

이제 Spring Boot가 ReactiveRedisTemplate<String, User>를 찾을 수 있으며, UserService에서 정상적으로 사용할 수 있습니다. 🎯


💡 이렇게 해결하는 이유

✅ 1. 직렬화 오류 방지

Redis는 데이터를 바이트 배열로 저장합니다.
따라서, 직렬화/역직렬화 시 타입 정보가 명확해야 오류가 발생하지 않습니다.

  • ReactiveRedisTemplate<String, Object>를 사용하면, User 객체를 Object로 저장하고 가져올 때 ClassCastException이 발생할 가능성이 있음
  • ReactiveRedisTemplate<String, User>을 따로 등록하면 안전하게 변환 가능!

✅ 2. 성능 최적화

  • 모든 데이터를 Object 타입으로 변환하는 것보다,
    User 전용 Serializer를 사용하면 성능이 향상됩니다.
  • Redis에서 데이터를 가져올 때 불필요한 변환 비용을 줄일 수 있음.

✅ 3. 유지보수성 증가

  • 프로젝트가 커질수록 User 외에도 Product, Order 등의 다양한 데이터 모델이 추가될 가능성이 큽니다.
  • 특정 모델(User)에 최적화된 Redis 설정을 만들면, 확장성과 유지보수성이 높아짐.

📌 최종 정리

1️⃣ 오류 원인: ReactiveRedisTemplate<String, User> Bean이 등록되지 않아서 발생.
2️⃣ 해결 방법: User 전용 ReactiveRedisTemplate을 RedisConfig에 추가.
3️⃣ 이렇게 해결하는 이유: 직렬화 안정성, 성능 최적화, 유지보수성 증가.

🎯 결론: ReactiveRedisTemplate<String, User>을 따로 등록하는 것이 Best Practice! 🚀

이제 Spring WebFlux + Redis 캐싱이 정상적으로 동작할 것입니다! ✅🔥


💬 혹시 같은 오류를 경험했다면?

저와 같은 오류를 겪었다면, 댓글로 공유해 주세요! 😊
다른 해결 방법이 있다면 알려주시면 함께 고민해보겠습니다! 🚀