Spring Redis 연결

S_H_H·2025년 3월 20일
post-thumbnail

이번에는 Spring과 Redis를 연결하고 Spring Cache설정을 Redis로 변경해서 사용해 봅시다.

Spring 설정

gradle

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.springframework.boot:spring-boot-starter-web'

StringRedisTemplate Class를 사용하기 위해 starter-data-redis 를 추가합니다.

config

@Configuration
public class RedisConfig {

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory();
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory());

        // 일반적인 key:value의 경우 시리얼라이저
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());

        // Hash를 사용할 경우 시리얼라이저
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new StringRedisSerializer());

        // 모든 경우
        redisTemplate.setDefaultSerializer(new StringRedisSerializer());

        return redisTemplate;
    }

}

LettuceConnectionFactory 생성자를 만들 때, ip and port 번호를 적게되는데 현재는 local환경으로 따로 redis 설정을 변경하지 않았다면은 파라미터 없어도 괜찮습니다.

Controller

    @GetMapping("/set")
    public String setValue(@RequestParam String key, @RequestParam String value) {
        redisService.setStringValue(key, value, 3600);
        return "저장 성공: " + key;
    }

    @GetMapping("/get")
    public String getValue(@RequestParam String key) {
        return "값: " + redisService.getStringValue(key);
    }

테스트가 목적이라 @Get으로 만들었습니다.

Service

	//저장
    public void setStringValue(String key, String value, long timeoutSeconds) {
        redisTemplate.opsForValue().set(key, value, Duration.ofSeconds(timeoutSeconds));
    }

	//조회
    public String getStringValue(String key) {
        return redisTemplate.opsForValue().get(key);
    }

Test

Set Data

Get Data

Spring Cache 설정

위에서 설정을 추가하면 됩니다.

gradle

implementation 'org.springframework.boot:spring-boot-starter-cache'
runtimeOnly 'com.h2database:h2'

Config

@Configuration
@EnableCaching
public class RedisCacheConfig {

    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        RedisCacheConfiguration cacheConfiguration =
                RedisCacheConfiguration.defaultCacheConfig()
                        .disableCachingNullValues();

        return RedisCacheManager.builder(redisConnectionFactory)
                .cacheDefaults(cacheConfiguration)
                .build();
    }
}

yml

spring:
  cache:
    type: redis

Service

기존 redis만 바라보고 있었더라면, 이번에는 메인 DB가 H2로 설정하고 Cache를 redis로 설정했습니다.
cache를 우선적으로 확인하고 해당 정보가 없다면 DB를 조회하게 됩니다.

    private final RedisStringRepository redisStringRepository;

    // 캐시 조회 (캐시에 없으면 메서드 실행 후 저장)
    @Cacheable(value = "redis-cache", key = "#key")
    public String getValue(String key) {
        log.info("key : {} ", key);
        RedisString redisString = redisStringRepository.findById(key).orElse(RedisString.builder().build());
        return redisString.getRedisKey() + " : " +  redisString.getRedisValue(); // 실제로는 DB 조회 등의 로직이 들어갈 수 있음
    }

    // 캐시에 값 업데이트
    @Transactional
    @CachePut(value = "redis-cache", key = "#key")
    public String updateValue(String key, String value) {
        log.info("key : {} ", key);
        RedisString redisString = RedisString.builder().redisKey(key).redisValue(value).build();
        redisStringRepository.save(redisString);
        return value;
    }

Test

Set Data

Get Data

redis 확인

cache를 통해 저장된 key인 경우 앞에 prefix로 redis-cache::가 붙은걸 확인할 수 있습니다.

h2 확인

@CachePut 을 사용하기에 Cache에 값이 있던 없던 메소드를 실행하기에 DB에서도 값을 확인할 수 있습니다.

DB에 Insert를 직접하고 web에서 조회할 경우 해당 값은 cache hit가 되지 않음으로 DB를 조회 후 해당 값을 redis로 저장하는 모습도 볼 수 있습니다.

profile
LEVEL UP

0개의 댓글