Skip to content

Commit a8c9a95

Browse files
안훈기안훈기
authored andcommitted
🐛 Fix: Redis 캐시 postList 역직렬화 타입 이슈 해결
1 parent fd256ba commit a8c9a95

File tree

1 file changed

+21
-14
lines changed

1 file changed

+21
-14
lines changed

src/main/java/com/be/sportizebe/global/config/RedisCacheConfig.java

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
package com.be.sportizebe.global.config;
22

3-
import com.fasterxml.jackson.annotation.JsonTypeInfo;
3+
import com.be.sportizebe.domain.post.dto.response.PostPageResponse;
44
import com.fasterxml.jackson.databind.ObjectMapper;
55
import com.fasterxml.jackson.databind.SerializationFeature;
66
import com.fasterxml.jackson.databind.json.JsonMapper;
7-
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
87
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
98
import org.springframework.cache.CacheManager;
109
import org.springframework.cache.annotation.EnableCaching;
@@ -13,9 +12,8 @@
1312
import org.springframework.data.redis.cache.RedisCacheConfiguration;
1413
import org.springframework.data.redis.cache.RedisCacheManager;
1514
import org.springframework.data.redis.connection.RedisConnectionFactory;
16-
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
15+
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
1716
import org.springframework.data.redis.serializer.RedisSerializationContext;
18-
import org.springframework.data.redis.serializer.RedisSerializer;
1917

2018
import java.time.Duration;
2119
import 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

Comments
 (0)