Spring Boot Redis 연동 - Redis CacheManager 사용

코딩은 많은 시행착오·2024년 1월 28일
0

back-end

목록 보기
8/18
post-thumbnail

기존에 사용했던 RedisTemplate은 비즈니스 로직에 불필요한 코드가 늘어나 가독성이 안좋아진다.
Redis CacheManager를 사용하면 이러한 문제점을 해결할 수 있다고 한다.
Redis CacheManager에 대해 알아보자.

https://github.com/khc41/redis-test (github)


먼저 Redis CacheManager는 Spring Cache처럼 사용 가능하다.
기존에 cache가 설정되어있지 않다면 별도의 설정 없이 @Cacheable 어노테이션을 사용하면 Redis CachaManager를 사용하게 된다.

간단한 어노테이션을 추가하면 되므로 비즈니스 로직에 불필요한 코드를 추가안해도 된다

주의사항) 현재 프로젝트의 별도의 캐시 설정이 있으면 충돌나게 되므로 Bean에서 default or 우선순위를 정해주거나 이름을 변경해야 한다.

실제 구현

config 설정

RedisApplication.java

@SpringBootApplication
@EnableCaching
public class RedisApplication {

    public static void main(String[] args) {
        SpringApplication.run(RedisApplication.class, args);
    }

}

먼저, cache 어노테이션을 사용하기 위해 메인 클래스에 @EnableCaching을 달아준다.


RedisConfigure.java

	@Bean("redisCacheManager")
    public CacheManager redisCacheManager() {
        return RedisCacheManager.RedisCacheManagerBuilder
                .fromConnectionFactory(redisConnectionFactory())
                .cacheDefaults(defaultConfiguration())
                .withInitialCacheConfigurations(configureMap())
                .build();
    }

    private Map<String, RedisCacheConfiguration> configureMap() {
        Map<String, RedisCacheConfiguration> cacheConfigurationMap = new HashMap<>();
        cacheConfigurationMap.put("getRedisWithCacheManager", defaultConfiguration().entryTtl(Duration.ofMinutes(5)));
        return cacheConfigurationMap;
    }

    private RedisCacheConfiguration defaultConfiguration() {
        return RedisCacheConfiguration.defaultCacheConfig()
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()))
                .entryTtl(Duration.ofMinutes(10));
    }

별도의 RedisCachaManager 세팅을 해준다.
defaultConfiguration는 기본적인 redis config세팅, configureMap에선 커스텀한 redis config 세팅을 도와준다.
현재 'getRedisWithCacheManager'의 커스텀 세팅으로 ttl을 5분으로 설정했다.


실제 코드 적용

RedisController.java

@GetMapping("/manager")
public String getRedisWithCacheManager(@RequestBody RedisParam param) {
    return redisService.getRedisWithCacheManager(param);
}

기존에 세팅해놨던 redis와 별도로 테스트하기 위해 간단하게 새로운 api를 만들어준다.


RedisServiceImpl.java

@Override
@Cacheable(value = "getRedisWithCacheManager", key = "#param.key", cacheManager = "redisCacheManager")
public String getRedisWithCacheManager(RedisParam param) {
    return param.getValue();
}

실제 RedisCacheManager의 사용법이다.
@Cacheable을 넣어두면 사용 가능하다.
value는 위에 redis configure map에서 커스텀한 설정이 매핑되는 이름과 실제 저장되는 redis key의 prefix의 역할을 한다.
key는 실제 저장되는 redis key의 prefix뒤에 오는 값이다. spel 표현식으로 사용 가능하고 변수를 넣어서 key를 동적으로 지정가능하다.
cacheManager는 어떤 cacheManager를 사용할 지 명시해준다. 별도로 지정하지 않으면 default로 설정된 cacheManager를 사용하게 된다.


결과

다음과 같이 postman으로 api에 요청을 보내고 redis-cli에 들어가 결과를 확인해봤다.

위에서 설정했던 value::key의 형태로 redis의 key가 생성된 것을 확인할 수 있다.

다시 요청을 보내보면 정상적으로 redis에서 응답하는 것을 확인할 수 있다.

마무리

간단하게 캐싱만 사용하려면 Redis CacheManager를 추천한다!

이렇게 Redis CacheManager로 Redis를 사용하는 방법에 대해 알아봤다.

RedisTemplate를 사용하면서 비즈니스 로직에 변경이 너무 많아서 고민했었는데 Redis CacheManager를 발견하고 역시 나같이 고민한 개발자가 한둘이 아니라고 다시한번 느끼는 순간이였다.

0개의 댓글