본문 바로가기

Framework/Spring

[Spring][Redis] RedisConfig 설정(CachingConfigurer, CacheManager, RediscacheConfiguration, serialize, RedisCacheManager) - 컴도리돌이

728x90

 

레디스 설정부터, 레디스 조회/ 추가/ 삭제 등에 대한 깊게 다뤄보려고 합니다. 

올해 자바 버전 업과 스프링 버전 업을 했기 때문에 다시 레디스 설정에 대해 다시 정비하는 시간을 가지려고 합니다. 

겸사겸사 설정한 코드에 대한 깊게 분석할 시간을 가지려고 합니다. 😊

 


 

레디스는 메모리 기반의 데이터 저장소로서, 캐싱, 세션 관리 등 다양한 용도로 사용되는데, 저는 스프링 부트를 사용하며 레디스는 대게 캐시 매니저나 세션을 저장을 할 때 활용되고 있어요.

 

스프링 부트에서는 레디스를 간편하게 설정하고 사용할 수 있는데, properties 또는 yml 파일에서 redis 호스트, 포트, 타입 등을 간단하게 설정할 수 있어요. 저는 properties 파일을 사용하기 때문에 다음과 같이 설정을 했습니다 🙄

 

spring.redis.port=6379
spring.redis.host=localhost
spring.cache.type=redis

 


 

스프링 부트에서 캐시 매니저를 사용하여 사용자가 설정한 조건에 따른 쿼리 데이터를 저장하는 경우가 많습니다. 

이를 위해 자바 8을 사용할 때는 CachingConfigurerSupport를 상속받아서 다음과 같이 RedisConfig 클래스를 작성했어요.

 

@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {

   ...

 

하지만 CachingConfigurerSupport는 다음과 같이 Deprecated가 되었고,, 😳😳

 

 

 

CachingConfigurer를 상속받아서 RedisConfig 클래스를 다음과 같이 작성했어요. 😤

CachingConfigurer

redisConfig 클래스를 작성할 때, 왜 CachingConfigurer 클래스를 상속받아서 사용해야 할까요?

스프링 캐시 구성을 사용자 정의하기 위한 인터페이스로, 해당 인터페이스를 구현하거나 확장함으로써 캐시 구성을 변경하고 조정할 수 있어요. CachingConfigurer를 상속받아서 cacheManager 메서드를 커스텀하여 사용하기 위해서 다음과 같이 코드를 작성하였습니다. 

 

@Configuration
@EnableCaching
public class RedisConfig implements CachingConfigurer {

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofDays(30))
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
        return RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(redisConnectionFactory).cacheDefaults(redisCacheConfiguration).build();
    }

}

 

사용하는 메서드도 하나고, 메서드 내부에서도 작성된 코드가 생각 이상으로 짧아서 놀라셨을 거예요. 😧

저도 코드를 덕칠덕칠 하다가 리팩토링 하는 겸 부분 부분 지우면서 테스트하고 단순화 작업을 반복하였더니, 결국 남은 건 이 캐시 매니저 메서드 하나뿐이네요.

 

 

 

캐시 매니저 메서드만 남기니깐,, 해당 메서드에 대해 더욱 집중하게 되네요. 🥱🥱

 


 

RediscacheConfiguration

RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofDays(30))
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));

 

 

RediscacheConfiguration의 설정을 어떻게 했는지 차근차근 확인해 볼게요.

RediscacheConfiguration는 Redis 캐시의 구성을 나타내는 클래스예요. 이 클래스를 사용하여 Redis 캐시에 대한 다양한 설정을 지정할 수 있으며, 주요 설정에는 캐시 엔트리의 직렬화 방식, 만료 시간, 캐시 키의 접두사 등이 포함됩니다.

 

RedisConnectionFactory

caheManager을 호출할 때 RedisConnectionFactory를 인자로 받아서 사용합니다. 여기서 redisConnectionFactory는 레디스 서버와의 연결을 설정하고 관리하는 인터페이스로, 레디스 서버에 연결하고 캐시 매니저가 이를 활용하여 데이터를 레디스에 저장하거나 조회할 수 있습니다. 

 

RedisCacheConfiguration

RedisCacheConfiguration 클래스는 레디스 캐시의 구성을 나타내는 클래스입니다. 이 클래스를 사용하여 레디스 캐시에 대한 다양한 설정을 지정할 수 있으며, 주요 설정에는 캐시 엔트리의 직렬화 방식, 만료 시간, 캐시키의 접두사 등이 포함됩니다.

 

entryTt1은 캐시 엔트리의 만료 시간을 지정합니다.

위에 코드처럼 Duration 객체를 사용하여 만료 시간을 설정하면 됩니다.

 

serializeKeysWith, serializeValueWith는 각각의 캐시 키와 데이터를 직렬화하는 방식으로 지정하는데, 여기서 직렬화라는 방식이 무엇일까요?

serialize란? 🤔

데이터를 레디스에 저장할 때 해당 데이터를 바이트 배열로 변환하여 저장하는 과정을 "직렬화하는 방식"입니다.

레디스에서는 저장하려는 데이터를 바이트 배열로 변환할 때, 사용하는 직렬화 방식은 주로 키와 값을 저장하는 데 사용되는 객체의 유형에 따라 달라집니다.

또한 어떤 방식으로 직렬화를 수행하느냐에 따라 저장된 데이터의 형태가 달라져요. 

예를 들면, 키와 값을 JSON 형식으로 직렬화하면 레디스에 저장된 데이터는 JSON 문자열로 저장되는 거죠. 

따라서 "레디스에서 키와 값을 직렬화하는 방식으로 지정한다"는 것은 레디스에 저장되는 데이터를 어떤 방식으로 바이트 배열로 변환하여 저장할지를 결정하는 것을 의미합니다.

저는 캐시 키를 StringRedisSerializer를 사용하여 문자열 형태의 캐시 키를 직렬화하였습니다. 제가 사용하는 데이터의 키 값이 대게 문자열인데, 키가 문자열인 경우 효율적으로 저장하기 위한 설정으로 StringRedisSerializer을 많이 사용합니다.

그리고 데이터(값)를 저장할 때는 GenericJackson2 JsonRedisSerializer를 사용하여 데이터를 JSON 형식으로 직렬화합니다. 일반적으로 레디스 데이터를 저장할 JSON 형식을 사용하는데, 보통 JSON 형식이 일반적인 다른 형식보다 데이터를 직관적으로 확인할 수 있기 때문에 많이 사용합니다. 

 

return RedisCacheManager
                .RedisCacheManagerBuilder
                .fromConnectionFactory(redisConnectionFactory)
                .cacheDefaults(redisCacheConfiguration)
                .build();

 

 

RedisCacheManager는 빌더 클래스예요. 이 클래스에서는 fromConnectionFactory 메서드를 통해 RedisConnectionFactory를 설정하고, cacheDefaults 메서드를 통해 기본 캐시 설정을 지정합니다. 

 

레디스를 연결을 하기 위해 fromConnectionFactory에서 redisConnectionFactory으로 설정하였고, cacheDefaults에서는 저희가 설정한 redsCacheConfiguration을 정의해 줍니다. 

 

위의 코드와 같이 레디스 캐시 매니저를 구성하는 과정을 단순화하고, 빌더 패턴을 사용하여 유연하게 캐시 설정을 변경할 수 있습니다.