11package com.back.koreaTravelGuide.common.config
22
3+ import com.back.koreaTravelGuide.domain.ai.tour.dto.TourDetailResponse
4+ import com.back.koreaTravelGuide.domain.ai.tour.dto.TourResponse
5+ import com.back.koreaTravelGuide.domain.ai.weather.dto.MidForecastDto
6+ import com.back.koreaTravelGuide.domain.ai.weather.dto.TemperatureAndLandForecastDto
37import com.fasterxml.jackson.databind.ObjectMapper
4- import com.fasterxml.jackson.databind.jsontype.BasicPolymorphicTypeValidator
58import com.fasterxml.jackson.module.kotlin.KotlinModule
69import org.springframework.cache.CacheManager
710import org.springframework.context.annotation.Bean
@@ -10,13 +13,20 @@ import org.springframework.data.redis.cache.RedisCacheConfiguration
1013import org.springframework.data.redis.cache.RedisCacheManager
1114import org.springframework.data.redis.connection.RedisConnectionFactory
1215import org.springframework.data.redis.core.RedisTemplate
13- import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer
16+ import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer
1417import org.springframework.data.redis.serializer.RedisSerializationContext
1518import org.springframework.data.redis.serializer.StringRedisSerializer
1619import java.time.Duration
1720
1821@Configuration
1922class RedisConfig {
23+ @Bean
24+ fun objectMapper (): ObjectMapper =
25+ ObjectMapper ().apply {
26+ // Kotlin 모듈 등록 (data class 생성자 인식)
27+ registerModule(KotlinModule .Builder ().build())
28+ }
29+
2030 @Bean
2131 fun redisTemplate (connectionFactory : RedisConnectionFactory ): RedisTemplate <String , String > {
2232 val template = RedisTemplate <String , String >()
@@ -33,35 +43,76 @@ class RedisConfig {
3343 }
3444
3545 @Bean
36- fun cacheManager (connectionFactory : RedisConnectionFactory ): CacheManager {
37- // Kotlin data class 역직렬화 지원을 위한 ObjectMapper 생성
38- val objectMapper =
39- ObjectMapper ().apply {
40- // Kotlin 모듈 등록 (data class 생성자 인식)
41- registerModule(KotlinModule .Builder ().build())
42- // 타입 정보 보존을 위한 검증기 설정
43- activateDefaultTyping(
44- BasicPolymorphicTypeValidator .builder()
45- .allowIfBaseType(Any ::class .java)
46- .build(),
47- ObjectMapper .DefaultTyping .NON_FINAL ,
46+ fun cacheManager (
47+ connectionFactory : RedisConnectionFactory ,
48+ objectMapper : ObjectMapper ,
49+ ): CacheManager {
50+
51+ // 각 캐시 타입별 Serializer 생성
52+ val tourResponseSerializer = Jackson2JsonRedisSerializer <TourResponse >(objectMapper, TourResponse ::class .java)
53+ val tourDetailResponseSerializer = Jackson2JsonRedisSerializer <TourDetailResponse >(objectMapper, TourDetailResponse ::class .java)
54+
55+ // List<MidForecastDto> 타입을 위한 JavaType 생성
56+ val midForecastListType =
57+ objectMapper.typeFactory.constructCollectionType(
58+ List ::class .java,
59+ MidForecastDto ::class .java,
60+ )
61+ val midForecastListSerializer = Jackson2JsonRedisSerializer <List <MidForecastDto >>(objectMapper, midForecastListType)
62+
63+ // List<TemperatureAndLandForecastDto> 타입을 위한 JavaType 생성
64+ val tempAndLandListType =
65+ objectMapper.typeFactory.constructCollectionType(
66+ List ::class .java,
67+ TemperatureAndLandForecastDto ::class .java,
68+ )
69+ val tempAndLandListSerializer = Jackson2JsonRedisSerializer <List <TemperatureAndLandForecastDto >>(objectMapper, tempAndLandListType)
70+
71+ // 공통 키 Serializer
72+ val keySerializer = RedisSerializationContext .SerializationPair .fromSerializer(StringRedisSerializer ())
73+
74+ // Tour 관련 캐시 설정 (TourResponse 타입)
75+ val tourResponseConfig =
76+ RedisCacheConfiguration .defaultCacheConfig()
77+ .serializeKeysWith(keySerializer)
78+ .serializeValuesWith(
79+ RedisSerializationContext .SerializationPair .fromSerializer(tourResponseSerializer),
4880 )
49- }
81+ .entryTtl( Duration .ofHours( 12 ))
5082
51- val redisCacheConfiguration =
83+ // Tour 상세 캐시 설정 (TourDetailResponse 타입)
84+ val tourDetailConfig =
5285 RedisCacheConfiguration .defaultCacheConfig()
53- .serializeKeysWith(
54- RedisSerializationContext .SerializationPair .fromSerializer(StringRedisSerializer ()),
86+ .serializeKeysWith(keySerializer)
87+ .serializeValuesWith(
88+ RedisSerializationContext .SerializationPair .fromSerializer(tourDetailResponseSerializer),
5589 )
90+ .entryTtl(Duration .ofHours(12 ))
91+
92+ // 중기예보 캐시 설정 (List<MidForecastDto> 타입)
93+ val midForecastConfig =
94+ RedisCacheConfiguration .defaultCacheConfig()
95+ .serializeKeysWith(keySerializer)
96+ .serializeValuesWith(
97+ RedisSerializationContext .SerializationPair .fromSerializer(midForecastListSerializer),
98+ )
99+ .entryTtl(Duration .ofHours(12 ))
100+
101+ // 기온/육상 예보 캐시 설정 (List<TemperatureAndLandForecastDto> 타입)
102+ val tempAndLandConfig =
103+ RedisCacheConfiguration .defaultCacheConfig()
104+ .serializeKeysWith(keySerializer)
56105 .serializeValuesWith(
57- RedisSerializationContext .SerializationPair .fromSerializer(
58- GenericJackson2JsonRedisSerializer (objectMapper),
59- ),
106+ RedisSerializationContext .SerializationPair .fromSerializer(tempAndLandListSerializer),
60107 )
61108 .entryTtl(Duration .ofHours(12 ))
62109
63110 return RedisCacheManager .builder(connectionFactory)
64- .cacheDefaults(redisCacheConfiguration)
111+ .withCacheConfiguration(" tourAreaBased" , tourResponseConfig)
112+ .withCacheConfiguration(" tourLocationBased" , tourResponseConfig)
113+ .withCacheConfiguration(" tourDetail" , tourDetailConfig)
114+ .withCacheConfiguration(" weatherMidFore" , midForecastConfig)
115+ .withCacheConfiguration(" weatherTempAndLandFore" , tempAndLandConfig)
65116 .build()
66117 }
67118}
0 commit comments