여러대의 Redis와 Valkey에 연결할 수 있도록 환경설정

This commit is contained in:
2024-11-22 17:54:23 +09:00
parent 831bd731ca
commit 157e3a39b6
10 changed files with 122 additions and 113 deletions

View File

@@ -0,0 +1,18 @@
package kr.co.vividnext.sodalive.configs
import org.springframework.context.annotation.ComponentScan
import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.FilterType
import org.springframework.data.jpa.repository.config.EnableJpaRepositories
@Configuration
@EnableJpaRepositories(
basePackages = ["kr.co.vividnext.sodalive"],
includeFilters = [
ComponentScan.Filter(
type = FilterType.ASSIGNABLE_TYPE,
classes = [org.springframework.data.jpa.repository.JpaRepository::class]
)
]
)
class JpaConfig

View File

@@ -1,32 +1,40 @@
package kr.co.vividnext.sodalive.configs
import org.springframework.beans.factory.annotation.Value
import org.springframework.cache.annotation.EnableCaching
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.ComponentScan
import org.springframework.context.annotation.Configuration
import org.springframework.data.redis.cache.RedisCacheConfiguration
import org.springframework.data.redis.cache.RedisCacheManager
import org.springframework.context.annotation.FilterType
import org.springframework.data.redis.connection.RedisConnectionFactory
import org.springframework.data.redis.connection.RedisStandaloneConfiguration
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory
import org.springframework.data.redis.core.RedisTemplate
import org.springframework.data.redis.core.StringRedisTemplate
import org.springframework.data.redis.repository.configuration.EnableRedisRepositories
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer
import org.springframework.data.redis.serializer.RedisSerializationContext
import org.springframework.data.redis.serializer.StringRedisSerializer
import java.time.Duration
@Configuration
@EnableCaching
@EnableRedisRepositories
@EnableRedisRepositories(
basePackages = ["kr.co.vividnext.sodalive"],
redisTemplateRef = "redisTemplate",
excludeFilters = [
ComponentScan.Filter(
type = FilterType.REGEX,
pattern = ["kr\\.co\\.vividnext\\.sodalive\\.v2\\..*"]
),
ComponentScan.Filter(
type = FilterType.ASSIGNABLE_TYPE,
classes = [org.springframework.data.jpa.repository.JpaRepository::class]
)
]
)
class RedisConfig(
@Value("\${spring.redis.host}")
private val host: String,
@Value("\${spring.redis.port}")
private val port: Int
) {
@Bean
@Bean(name = ["redisConnectionFactory"])
fun redisConnectionFactory(): RedisConnectionFactory {
val clientConfiguration = LettuceClientConfiguration.builder()
.useSsl()
@@ -36,53 +44,15 @@ class RedisConfig(
return LettuceConnectionFactory(RedisStandaloneConfiguration(host, port), clientConfiguration)
}
@Bean
@Bean(name = ["redisTemplate"])
fun redisTemplate(): RedisTemplate<*, *> {
val redisTemplate: RedisTemplate<*, *> = RedisTemplate<Any, Any>()
redisTemplate.setConnectionFactory(redisConnectionFactory())
return redisTemplate
}
@Bean
fun cacheManager(redisConnectionFactory: RedisConnectionFactory): RedisCacheManager {
val defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(30))
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(StringRedisSerializer()))
.serializeValuesWith(
RedisSerializationContext.SerializationPair.fromSerializer(
GenericJackson2JsonRedisSerializer()
)
)
val cacheConfigMap = mutableMapOf<String, RedisCacheConfiguration>()
cacheConfigMap["default"] = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(30))
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(StringRedisSerializer()))
.serializeValuesWith(
RedisSerializationContext.SerializationPair.fromSerializer(
GenericJackson2JsonRedisSerializer()
)
)
cacheConfigMap["cache_ttl_3_days"] = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofDays(3))
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(StringRedisSerializer()))
.serializeValuesWith(
RedisSerializationContext.SerializationPair.fromSerializer(
GenericJackson2JsonRedisSerializer()
)
)
cacheConfigMap["cache_ttl_3_hours"] = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofHours(3))
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(StringRedisSerializer()))
.serializeValuesWith(
RedisSerializationContext.SerializationPair.fromSerializer(
GenericJackson2JsonRedisSerializer()
)
)
return RedisCacheManager.builder(redisConnectionFactory)
.cacheDefaults(defaultCacheConfig)
.withInitialCacheConfigurations(cacheConfigMap)
.build()
@Bean(name = ["redisStringRedisTemplate"])
fun redisStringRedisTemplate(): StringRedisTemplate {
return StringRedisTemplate(redisConnectionFactory())
}
}

View File

@@ -0,0 +1,66 @@
package kr.co.vividnext.sodalive.configs
import org.springframework.beans.factory.annotation.Value
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.ComponentScan
import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.FilterType
import org.springframework.data.redis.connection.RedisClusterConfiguration
import org.springframework.data.redis.connection.RedisConnectionFactory
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory
import org.springframework.data.redis.core.RedisTemplate
import org.springframework.data.redis.core.StringRedisTemplate
import org.springframework.data.redis.repository.configuration.EnableRedisRepositories
import java.time.Duration
@Configuration
@EnableRedisRepositories(
basePackages = ["kr.co.vividnext.sodalive.v2"],
redisTemplateRef = "valkeyTemplate",
includeFilters = [
ComponentScan.Filter(
type = FilterType.REGEX,
pattern = ["kr\\.co\\.vividnext\\.sodalive\\.v2\\..*"]
)
],
excludeFilters = [
ComponentScan.Filter(
type = FilterType.ASSIGNABLE_TYPE,
classes = [org.springframework.data.jpa.repository.JpaRepository::class]
)
]
)
class ValkeyConfig(
@Value("\${spring.valkey.host}")
private val host: String,
@Value("\${spring.valkey.port}")
private val port: Int
) {
@Bean(name = ["valkeyConnectionFactory"])
fun valkeyConnectionFactory(): RedisConnectionFactory {
val clusterConfig = RedisClusterConfiguration()
clusterConfig.clusterNode(host, port)
val clientConfig = LettuceClientConfiguration.builder()
.commandTimeout(Duration.ofSeconds(5))
.shutdownTimeout(Duration.ofSeconds(5))
.useSsl()
.disablePeerVerification()
.build()
return LettuceConnectionFactory(clusterConfig, clientConfig)
}
@Bean(name = ["valkeyTemplate"])
fun valkeyTemplate(): RedisTemplate<*, *> {
val redisTemplate: RedisTemplate<*, *> = RedisTemplate<Any, Any>()
redisTemplate.setConnectionFactory(valkeyConnectionFactory())
return redisTemplate
}
@Bean(name = ["valkeyStringRedisTemplate"])
fun valkeyStringRedisTemplate(): StringRedisTemplate {
return StringRedisTemplate(valkeyConnectionFactory())
}
}