package com.yesul.config;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {

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

    @Value("${spring.data.redis.port}")
    private int port;

    /**
     * redis의 연결 정보 설정
     */

    // RedisTemplate 캐싱 (DB 인덱스별로 하나씩만 생성해서 재사용)
    private final Map<Integer, RedisTemplate<String, String>> redisTemplateMap = new ConcurrentHashMap<>();

    public RedisTemplate<String, String> getRedisTemplate(int dbIndex) {
        return redisTemplateMap.computeIfAbsent(dbIndex, this::createRedisTemplateForDb);
    }

    private RedisTemplate<String, String> createRedisTemplateForDb(int dbIndex) {
        RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
        config.setHostName(host);
        config.setPort(port);
        config.setDatabase(dbIndex);

        LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(config);
        connectionFactory.afterPropertiesSet();

        RedisTemplate<String, String> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new StringRedisSerializer());
        template.afterPropertiesSet();
        return template;
    }

}

package com.yesul.chatroom.service;

import com.yesul.config.RedisConfig;
import java.util.concurrent.TimeUnit;
import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class TempMessageServiceImpl implements TempMessageService {

    private final RedisConfig redisConfig;
    private static final long TTL_SECONDS = 60 * 60; // 1시간

    @Override
    public void saveTempMessage(Long chatRoomId, Long userId, String message, int dbIndex) {
        RedisTemplate<String, String> redisTemplate = redisConfig.getRedisTemplate(dbIndex);  // DB별로 RedisTemplate 가져오기
        redisTemplate.opsForValue().set(key(chatRoomId, userId), message, TTL_SECONDS, TimeUnit.SECONDS);
    }

    @Override
    public String getTempMessage(Long chatRoomId, Long userId, int dbIndex) {
        RedisTemplate<String, String> redisTemplate = redisConfig.getRedisTemplate(dbIndex);
        return redisTemplate.opsForValue().get(key(chatRoomId, userId));
    }

    @Override
    public void deleteTempMessage(Long chatRoomId, Long userId, int dbIndex) {
        RedisTemplate<String, String> redisTemplate = redisConfig.getRedisTemplate(dbIndex);
        redisTemplate.delete(key(chatRoomId, userId));
    }

    private String key(Long chatRoomId, Long userId) {
        return "temp-message:" + chatRoomId + ":" + userId;
    }
}

<aside> 💡

나는 1번 가영누나 2번 정연 누나 3번 사용하기!!!!!!1

</aside>


Redis 터미널로 제대로 저장되는지 확인하기

스크린샷 2025-07-11 오전 10.48.33.png

스크린샷 2025-07-11 오전 10.48.52.png

스크린샷 2025-07-11 오전 10.49.05.png