11package com .be .sportizebe .global .config ;
22
3- import com .fasterxml . jackson . annotation . JsonTypeInfo ;
3+ import com .be . sportizebe . domain . post . dto . response . PostPageResponse ;
44import com .fasterxml .jackson .databind .ObjectMapper ;
55import com .fasterxml .jackson .databind .SerializationFeature ;
66import com .fasterxml .jackson .databind .json .JsonMapper ;
7- import com .fasterxml .jackson .databind .jsontype .impl .LaissezFaireSubTypeValidator ;
87import com .fasterxml .jackson .datatype .jsr310 .JavaTimeModule ;
98import org .springframework .cache .CacheManager ;
109import org .springframework .cache .annotation .EnableCaching ;
1312import org .springframework .data .redis .cache .RedisCacheConfiguration ;
1413import org .springframework .data .redis .cache .RedisCacheManager ;
1514import org .springframework .data .redis .connection .RedisConnectionFactory ;
16- import org .springframework .data .redis .serializer .GenericJackson2JsonRedisSerializer ;
15+ import org .springframework .data .redis .serializer .Jackson2JsonRedisSerializer ;
1716import org .springframework .data .redis .serializer .RedisSerializationContext ;
18- import org .springframework .data .redis .serializer .RedisSerializer ;
1917
2018import java .time .Duration ;
2119import java .util .HashMap ;
@@ -27,30 +25,35 @@ public class RedisCacheConfig {
2725
2826 @ Bean
2927 public CacheManager cacheManager (RedisConnectionFactory redisConnectionFactory ) {
30-
28+ // 캐시 역직렬화를 위해 타입 정보(@class)를 포함하도록 설정
3129 ObjectMapper objectMapper = JsonMapper .builder ()
3230 .addModule (new JavaTimeModule ())
3331 .disable (SerializationFeature .WRITE_DATES_AS_TIMESTAMPS )
32+ // ❗ 타입 정보 절대 쓰지 않음
3433 .build ();
35- objectMapper .activateDefaultTyping (
36- LaissezFaireSubTypeValidator .instance ,
37- ObjectMapper .DefaultTyping .NON_FINAL ,
38- JsonTypeInfo .As .PROPERTY
39- );
4034 // 캐시에 들어가는 값의 직렬화 방식 결정
41- RedisSerializer <Object > valueSerializer =
42- new GenericJackson2JsonRedisSerializer (objectMapper );
35+
36+ // 기본 캐시(대부분)는 Object로 직렬화/역직렬화
37+ Jackson2JsonRedisSerializer <Object > defaultValueSerializer =
38+ new Jackson2JsonRedisSerializer <>(Object .class );
39+ defaultValueSerializer .setObjectMapper (objectMapper );
40+
41+ // postList 캐시는 PostPageResponse 타입으로 역직렬화되어야 ClassCastException이 나지 않음
42+ Jackson2JsonRedisSerializer <PostPageResponse > postListValueSerializer =
43+ new Jackson2JsonRedisSerializer <>(PostPageResponse .class );
44+ postListValueSerializer .setObjectMapper (objectMapper );
4345 // TTL(캐시 수명) 정책 정의
4446 // 아무 설정 없는 캐시(Default) = 5분
4547 RedisCacheConfiguration defaultConfig =
4648 RedisCacheConfiguration .defaultCacheConfig ()
4749 .serializeValuesWith (
48- RedisSerializationContext .SerializationPair .fromSerializer (valueSerializer )
50+ RedisSerializationContext .SerializationPair .fromSerializer (defaultValueSerializer )
4951 )
5052 .entryTtl (Duration .ofMinutes (5 ));
5153
5254 Map <String , RedisCacheConfiguration > cacheConfigs = new HashMap <>();
5355
56+
5457 // 캐시별로 TTL override 가능 ( post, commet 등 우리가 원하는 값으로 TTL 설정 가능 )
5558 cacheConfigs .put (
5659 "facilityNear" ,
@@ -62,7 +65,11 @@ public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory)
6265 );
6366 cacheConfigs .put (
6467 "postList" ,
65- defaultConfig .entryTtl (Duration .ofSeconds (30 ))
68+ RedisCacheConfiguration .defaultCacheConfig ()
69+ .serializeValuesWith (
70+ RedisSerializationContext .SerializationPair .fromSerializer (postListValueSerializer )
71+ )
72+ .entryTtl (Duration .ofSeconds (30 ))
6673 );
6774 return RedisCacheManager .builder (redisConnectionFactory )
6875 .cacheDefaults (defaultConfig )
0 commit comments