1414import org .springframework .data .redis .serializer .GenericJackson2JsonRedisSerializer ;
1515import org .springframework .data .redis .serializer .Jackson2JsonRedisSerializer ;
1616import org .springframework .data .redis .serializer .RedisSerializationContext ;
17- import org .springframework .data .redis .serializer .RedisSerializer ;
1817import org .springframework .data .redis .serializer .StringRedisSerializer ;
1918
2019import com .fasterxml .jackson .databind .ObjectMapper ;
@@ -29,12 +28,12 @@ public class RedisConfig {
2928 public ObjectMapper redisCacheObjectMapper () {
3029 ObjectMapper mapper = new ObjectMapper ();
3130 mapper .registerModule (new JavaTimeModule ());
32- // 타입 정보를 포함하지 않도록 설정 (클린한 JSON)
31+ // 명시 타입 serializer에서 사용할 ObjectMapper
3332 return mapper ;
3433 }
3534
3635 @ Bean
37- public RedisCacheConfiguration defaultCacheConfiguration (ObjectMapper redisCacheObjectMapper ) {
36+ public RedisCacheConfiguration defaultCacheConfiguration () {
3837 return RedisCacheConfiguration .defaultCacheConfig ()
3938 .entryTtl (Duration .ofMinutes (10 ))
4039 .disableCachingNullValues ()
@@ -45,7 +44,8 @@ public RedisCacheConfiguration defaultCacheConfiguration(ObjectMapper redisCache
4544 )
4645 .serializeValuesWith (
4746 RedisSerializationContext .SerializationPair .fromSerializer (
48- new GenericJackson2JsonRedisSerializer (redisCacheObjectMapper )
47+ // 기본 캐시도 타입 정보를 유지해 역직렬화 시 Map으로 깨지지 않도록 설정
48+ new GenericJackson2JsonRedisSerializer ()
4949 )
5050 );
5151 }
@@ -58,9 +58,9 @@ public CacheManager cacheManager(
5858
5959 Map <String , RedisCacheConfiguration > cacheConfigurations = new HashMap <>();
6060
61- Jackson2JsonRedisSerializer <Object > stockInfoSerializer =
62- new Jackson2JsonRedisSerializer <>(redisCacheObjectMapper , Object .class );
63- RedisSerializationContext .SerializationPair <Object > stockInfoSerializationPair =
61+ Jackson2JsonRedisSerializer <StockInfoResponse > stockInfoSerializer =
62+ new Jackson2JsonRedisSerializer <>(redisCacheObjectMapper , StockInfoResponse .class );
63+ RedisSerializationContext .SerializationPair <StockInfoResponse > stockInfoSerializationPair =
6464 RedisSerializationContext .SerializationPair .fromSerializer (stockInfoSerializer );
6565
6666 // 숏뷰 추천: 5분 캐시 (사용자별 추천 결과)
@@ -70,7 +70,7 @@ public CacheManager cacheManager(
7070 // 실시간 가격: 30초 캐시 (변동성 높음)
7171 cacheConfigurations .put ("stockPrice" ,
7272 defaultCacheConfiguration .entryTtl (Duration .ofSeconds (30 ))
73- .serializeValuesWith (stockInfoSerializationPair ));
73+ .serializeValuesWith (castToObjectPair ( stockInfoSerializationPair ) ));
7474
7575 // 주식 정보: 1시간 캐시 (기본 정보, 변동 적음)
7676 cacheConfigurations .put ("stockInfo" ,
@@ -79,7 +79,7 @@ public CacheManager cacheManager(
7979 // 검색 결과: 30분 캐시
8080 cacheConfigurations .put ("searchResult" ,
8181 defaultCacheConfiguration .entryTtl (Duration .ofMinutes (30 ))
82- .serializeValuesWith (stockInfoSerializationPair ));
82+ .serializeValuesWith (castToObjectPair ( stockInfoSerializationPair ) ));
8383
8484 // 유효한 주식 목록: 1시간 캐시
8585 cacheConfigurations .put ("validStocks" ,
@@ -90,4 +90,10 @@ public CacheManager cacheManager(
9090 .withInitialCacheConfigurations (cacheConfigurations )
9191 .build ();
9292 }
93+
94+ @ SuppressWarnings ("unchecked" )
95+ private RedisSerializationContext .SerializationPair <Object > castToObjectPair (
96+ RedisSerializationContext .SerializationPair <?> pair ) {
97+ return (RedisSerializationContext .SerializationPair <Object >) pair ;
98+ }
9399}
0 commit comments