최근 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 캐싱이 정상적으로 동작할 것입니다! ✅🔥
💬 혹시 같은 오류를 경험했다면?
저와 같은 오류를 겪었다면, 댓글로 공유해 주세요! 😊
다른 해결 방법이 있다면 알려주시면 함께 고민해보겠습니다! 🚀
'프로그래밍 > 트러블슈팅' 카테고리의 다른 글
📌 [트러블슈팅] Wear OS 기기 승인 해제 후 앱 자동 이동 문제 해결 (0) | 2025.04.10 |
---|---|
📌[트러블슈팅] Janus WebRTC 서버 외부 접속 문제 해결 트러블슈팅 (0) | 2025.03.19 |
📌 [Java] Spring WebFlux Mockito 유닛 테스트에서 verify(valueOperations).set() 호출되지 않는 문제 해결 (0) | 2025.02.26 |
📌 [Java] Mockito 유닛 테스트 시 Java Agent 설정 이해하기 (0) | 2025.02.25 |
📌 [Java] 스케줄러를 활용한 MySQL 자동 백업 적용기 - 시행착오 및 해결 과정 (0) | 2025.02.14 |