1+ package com.chuseok22.ctredis.infrastructure.config
2+
3+ import com.chuseok22.ctredis.infrastructure.properties.RedisProperties
4+ import com.fasterxml.jackson.databind.ObjectMapper
5+ import com.fasterxml.jackson.databind.SerializationFeature
6+ import com.fasterxml.jackson.databind.jsontype.BasicPolymorphicTypeValidator
7+ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
8+ import com.fasterxml.jackson.module.kotlin.KotlinModule
9+ import org.springframework.boot.context.properties.EnableConfigurationProperties
10+ import org.springframework.context.annotation.Bean
11+ import org.springframework.context.annotation.Configuration
12+ import org.springframework.data.redis.connection.RedisConnectionFactory
13+ import org.springframework.data.redis.connection.RedisStandaloneConfiguration
14+ import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory
15+ import org.springframework.data.redis.core.RedisTemplate
16+ import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer
17+ import org.springframework.data.redis.serializer.StringRedisSerializer
18+
19+ @Configuration
20+ @EnableConfigurationProperties(RedisProperties ::class )
21+ class RedisConfig (
22+ private val properties : RedisProperties
23+ ) {
24+
25+ /* *
26+ * Redis Factory
27+ */
28+ @Bean
29+ fun redisConnectionFactory (redisProperties : RedisProperties ): RedisConnectionFactory {
30+
31+ val config = RedisStandaloneConfiguration ().apply {
32+ hostName = properties.host
33+ port = properties.port
34+ setPassword(redisProperties.password)
35+ }
36+
37+ return LettuceConnectionFactory (config)
38+ }
39+
40+ /* *
41+ * RedisTemplate
42+ */
43+ @Bean
44+ fun redisTemplate (
45+ connectionFactory : RedisConnectionFactory
46+ ): RedisTemplate <String , Any > {
47+ val objectMapper = createObjectMapper()
48+
49+ return RedisTemplate <String , Any >().apply {
50+ this .connectionFactory = connectionFactory
51+
52+ // Key Serializer: String
53+ keySerializer = StringRedisSerializer ()
54+ hashKeySerializer = StringRedisSerializer ()
55+
56+ // Value Serializer: JSON
57+ val jsonSerializer = GenericJackson2JsonRedisSerializer (objectMapper)
58+ valueSerializer = jsonSerializer
59+ hashValueSerializer = jsonSerializer
60+
61+ afterPropertiesSet()
62+ }
63+ }
64+
65+ /* *
66+ * ObjectMapper 생성
67+ */
68+ private fun createObjectMapper (): ObjectMapper {
69+ return ObjectMapper ().apply {
70+ // Kotlin 모듈
71+ registerModule(KotlinModule .Builder ().build())
72+
73+ // Java 8 Time API (LocalDateTime 등)
74+ registerModule(JavaTimeModule ())
75+ disable(SerializationFeature .WRITE_DATES_AS_TIMESTAMPS )
76+
77+ // 다형성 지원
78+ activateDefaultTyping(
79+ BasicPolymorphicTypeValidator .builder()
80+ .allowIfBaseType(Any ::class .java)
81+ .build(),
82+ ObjectMapper .DefaultTyping .NON_FINAL
83+ )
84+ }
85+ }
86+ }
0 commit comments