Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 48 additions & 1 deletion src/main/java/com/proovy/global/config/RedisConfig.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,24 @@
package com.proovy.global.config;

import io.lettuce.core.ClientOptions;
import io.lettuce.core.SocketOptions;
import io.lettuce.core.SslOptions;
import io.lettuce.core.protocol.ProtocolVersion;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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.StringRedisSerializer;

import java.time.Duration;

@Configuration
@EnableRedisRepositories
public class RedisConfig {
Expand All @@ -22,13 +29,53 @@ public class RedisConfig {
@Value("${spring.data.redis.port}")
private int port;

@Value("${spring.data.redis.password:}")
private String password;

@Value("${spring.data.redis.ssl.enabled:false}")
private boolean sslEnabled;

@Bean
public RedisConnectionFactory redisConnectionFactory() {
RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
config.setHostName(host);
config.setPort(port);

// 비밀번호 설정 (비어있지 않은 경우)
if (sslEnabled && (password == null || password.isBlank())) {
throw new IllegalStateException("spring.data.redis.password must be set when SSL is enabled");
}

if (password != null && !password.isBlank()) {
config.setPassword(password);
}
Comment thread
coderabbitai[bot] marked this conversation as resolved.

LettuceClientConfiguration.LettuceClientConfigurationBuilder clientConfigBuilder =
LettuceClientConfiguration.builder()
.commandTimeout(Duration.ofMillis(5000));

// SSL 설정 (prod 환경에서 Upstash 호환)
if (sslEnabled) {
ClientOptions clientOptions = ClientOptions.builder()
.protocolVersion(ProtocolVersion.RESP2) // Upstash Redis 호환을 위해 RESP2 명시
.sslOptions(SslOptions.builder()
.jdkSslProvider() // JDK SSL 프로바이더 사용
.build())
.socketOptions(SocketOptions.builder()
.connectTimeout(Duration.ofSeconds(10))
.keepAlive(true) // Keep-alive 활성화
.build())
.autoReconnect(true) // 자동 재연결 활성화
.build();

clientConfigBuilder
.clientOptions(clientOptions)
.useSsl()
.and()
.shutdownTimeout(Duration.ofMillis(100));
}

LettuceConnectionFactory factory = new LettuceConnectionFactory(config);
LettuceConnectionFactory factory = new LettuceConnectionFactory(config, clientConfigBuilder.build());
factory.setValidateConnection(true);
return factory;
}
Expand Down
2 changes: 0 additions & 2 deletions src/main/resources/application.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -178,8 +178,6 @@ spring:
redis:
ssl:
enabled: true
bundle:
implicit: true

proovy:
api:
Expand Down
Loading