저작권 안내: 저작권자표시 Yes 상업적이용 No 컨텐츠변경 No

스프링5 입문

JSP 2.3

JPA 입문

DDD Start

인프런 객체 지향 입문 강의

스프링의 @EnableCache 설정과 @Cacheable 설정을 사용하면 매우 쉽게 레디시를 캐시로 사용할 수 있어서 편리하다. 한 가지 불편한 점이 있다면 캐시키를 JDK 직렬화를 사용해서 저장한다는 것이다. 그러다보니 상상한 레디스 키가 cache:1:2:3" 문자열이어도(캐시 이름 cache, 키 "1:2:3") 실제 레디스에 들어간 키는 "cache:타입데이터1:2:3" 이런 모양이 된다. 이는 레디스에 직접 연결해서 데이터를 확인할 때 불편함을 준다.


JDK 직렬화 대신 문자열로 키를 생성하는 KeySerializer를 사용하면 이 단점을 보완할 수 있다. 이를 하려면 직접 RedisTemplate을 생성해주면 된다. 다음은 코드 구현 예이다.


import java.net.UnknownHostException;


import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.annotation.Primary;

import org.springframework.data.redis.connection.RedisConnectionFactory;

import org.springframework.data.redis.core.RedisTemplate;

import org.springframework.data.redis.serializer.StringRedisSerializer;


@Configuration

public class RedisTemplateConfiguration {


    @Bean

    @Primary

    public RedisTemplate<Object, Object> redisTemplate(

            RedisConnectionFactory redisConnectionFactory)

            throws UnknownHostException {

        RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();

        template.setConnectionFactory(redisConnectionFactory);

        template.setKeySerializer(new StringRedisSerializer());

        return template;

    }

}


StringRedisSerializer는 키 값을 직렬화할 때 String.getBytes()를 사용하므로 JDK 직렬화를 사용할 때처럼 불필요한 타입정보가 붙지 않는다.

Posted by 최범균 madvirus

댓글을 달아 주세요

스프링은 캐시 구현으로 레디스를 지원한다. 스프링 부트를 사용하면 다음의 간단한 설정만 추가하면 된다.


<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-data-redis</artifactId>

</dependency>

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-cache</artifactId>

</dependency>


이 설정을 추가하면 @EnableCaching 만으로 쉽게 @Cacheable과 관련 애노테이션을 사용해서 레디스를 캐시로 사용할 수 있다.

그런데, 스프링 부트가 제공하는 설정만으로 레디스를 캐시로 사용하면 캐시별로 유효 시간을 줄 수 없다. Ehcache를 캐시로 사용하면 설정 파일을 이용해서 유효 시간을 줄 수 있는데 레디스의 경우 설정 파일도 없다.(http://docs.spring.io/spring-boot/docs/1.4.3.RELEASE/reference/html/common-application-properties.html 참고)


진행중인 프로젝트에 캐시별 유효시간 설정 기능이 필요해서 스프링 부트로 다음과 같은 프로퍼티를 사용해서 캐시별로 유효 시간을 설정할 수 있도록 구현해봤다.


# application.properties

spring.cache.redis.defaultExpireTime=0

spring.cache.redis.expireTime.billDetailData=3600

spring.cache.redis.expireTime.billSummaryInfos=3600


이 설정에서 "spring.cache.redis"는 접두어이다. defaultExpireTime은 전체 캐시에 기본으로 적용할 유효시간을 설정한다. "expirTime.캐시이름"은 캐시 이름별로 캐시 시간을 설정한다. 유효 시간은 초 단위이다.


이 설정을 담기 위한 @ConfigurationProperties 클래스를 프로퍼티 클래스를 다음과 같이 작성했다.


import java.util.HashMap;

import java.util.Map;

import java.util.Map.Entry;


import org.springframework.boot.context.properties.ConfigurationProperties;


@ConfigurationProperties(prefix = "spring.cache.redis")

public class CacheRedisProperties {


    private long defaultExpireTime = 0L;

    private Map<String, Long> expireTime = new HashMap<>();


    private CacheTimeParser parser = new CacheTimeParser();


    public long getDefaultExpireTime() {

        return defaultExpireTime;

    }


    public void setDefaultExpireTime(long defaultExpireTime) {

        this.defaultExpireTime = defaultExpireTime;

    }


    public Map<String, Long> getExpireTime() {

        return expireTime;

    }


    public void setExpireTime(Map<String, Long> expireTime) {

        this.expireTime = expireTime;

    }

}


다음으로 RedisCacheManager에 유효 시간 설정하면 된다. 이를 위한 코드는 다음과 같다.


import java.util.Map.Entry;


import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.autoconfigure.cache.CacheManagerCustomizer;

import org.springframework.boot.context.properties.EnableConfigurationProperties;

import org.springframework.cache.annotation.EnableCaching;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.annotation.Profile;

import org.springframework.data.redis.cache.RedisCacheManager;


/**

 * org.springframework.boot.autoconfigure.cache.RedisCacheConfiguration 클래스 참고

 */

@Configuration

@EnableCaching

@EnableConfigurationProperties(CacheRedisProperties.class)

public class CustomRedisCacheConfiguration {

    private Logger logger = LoggerFactory.getLogger(getClass());


    @Autowired

    private CacheRedisProperties cacheRedisProperties;


    @Bean

    public CacheManagerCustomizer<RedisCacheManager> cacheManagerCustomizer() {

        return new CacheManagerCustomizer<RedisCacheManager>() {

            @Override

            public void customize(RedisCacheManager cacheManager) {

                cacheManager.setDefaultExpiration(cacheRedisProperties.getDefaultExpireTime());

                cacheManager.setExpires(cacheRedisProperties.getExpireTime());

            }

        };

    }

}


스프링부트가 제공하는 CacheManagerCustomizer를 이용하면 부트가 생성한 CacheManager를 커스터마이징할 수 있다. 이 기능을 사용해서 RedisCacheManager에 캐시 유효 시간을 설정하면 된다.


Posted by 최범균 madvirus

댓글을 달아 주세요

  1. ㅇㅇ 2017.01.29 20:55 신고  댓글주소  수정/삭제  댓글쓰기

    최범균님이 집필하신 책으로 공부하고 있습니다.

    저에게 많은 도움이 되는 것 같아 감사의 의미로 댓글 남깁니다.

    새해 복 많이 받으시고 건강하세요. ^^

  2. 조승규 2018.02.07 10:44 신고  댓글주소  수정/삭제  댓글쓰기

    많은 도움 되었습니다.
    감사합니다.