RedisTemplate
는 유용한 여러기능들을 보유하고 있는 Redis 모듈의 핵심 클래스다.
직렬화나 연결 관리 등의 고수준 추상화를 제공하며, RedisOperations
인터페이스를 구현한다.
또한, 특정 타입이나 키에 대해 작업할 수 있는 Operation View 들을 제공한다.
예를들어 List
의 경우, ListOperations
/ Set
의 경우, SetOperations
를 제공한다.
상세한 인터페이스는 문서에 소개되어 있다.
RedisTemplate
은 스레드 안전하다는 특징을 지니고 있어 여러 인스턴스에서 재사용할 수 있다.
대부분의 작업에 Java기반 직렬화기를 사용하므로, 템플릿에서 쓰거나 읽은 모든 객체는 Java를 통해 직렬화/역직렬화 된다.
이러한 직렬화 매커니즘은 템플릿에서 변경할 수 있으며, org.springframework.data.redis.serializer
패키지에서 사용가능한 여러 구현체들을 제공한다. 이와 관련된 내용은 하단에 후술할 예정이다.
원한다면
enableDefaultSerializer
속성을false
로 설정하여 모든 직렬화기를 null로 설정하고, 원시 바이트 배열을 사용할 수도 있다.
public class Example {
@Autowired
private RedisOperations<String, String> operations;
// template을 ListOperations로 주입받는다
@Resource(name="redisTemplate")
private ListOperations<String, String> listOps;
public void addLink(String userId, URL url) {
listOps.leftPush(userId, url.toExternalForm());
}
}
특정 템플릿 뷰가 필요한 경우, 위 코드처럼 뷰를 종속성으로 선언하고 redisTemplate
을 주입하면 된다.
컨테이너가 opsFor[X]
호출을 제거하고 자동으로 변환을 수행한다.
위 예시에서는 RedisTemplate
의 opsForList()
를 사용하지 않고 ListOperations
템플릿 뷰를 직접 주입받는 것을 확인할 수 있다.
redisTemplate
을 주입받는 경우, 문자열이 올바르지 않게 저장되는 것을 확인할 수 있다.
이는redisTemplate
에서 사용하는 인코딩 방식이 문자열을 인코딩하는데 적절하지 않기 떄문이다.
( 기본적으로JdkSerializationRedisSerializer
가 사용된다 )따라서, 문자열에 특화된
stringRedisTemplate
을 주입받으면 해당 문제가 해결된다.
대부분의 경우, Redis에 저장되는 키와 값이 String인 경우가 흔하기에 Spring Data Redis 모듈에서는 RedisConnection
와 RedisTemplate
의 확장인 StringRedisConnection
와 StringRedisTemplate
를 제공한다.
각 확장 인터페이스들은 StringRedisSerializer
를 사용하므로, 저장된 키와 값을 사람이 읽을 수 있다.
( 단, Redis와 코드에서 동일한 인코딩을 사용해야한다 )
RedisTemplate
과 StringRedisTemplate
을 사용하면 RedisCallBack
인터페이스를 통해 Redis와 직접 통신이 가능하다.
이 특징을 이용하면 아래 예시처럼 RedisConnection
과 직접 통신하므로 완전한 제어권을 가질 수 있다.
public void useCallback() {
redisOperations.execute(new RedisCallback<Object>() {
public Object doInRedis(RedisConnection connection) throws DataAccessException {
Long size = connection.dbSize();
// StringRedisTemplate를 사용한다면 StringRedisConnection로 캐스팅 가능하다
((StringRedisConnection)connection).set("key", "value");
}
});
}
프레임워크의 관점에서 볼 때, Redis에 저장되는 데이터는 결국 바이트 형식으로 저장된다.
이렇게 저장된 데이터를 어떤 형식으로 반환할지 결정하는 것은 사용자의 선택에 달려있다.
Spring Data Redis의 org.springframework.data.redis.serializer
패키지에서 이러한 데이터 타입 변환을 담당한다.
이 패키지는 두 종류의 직렬화기를 포함하고 있다.
RedisSerializer
기반의 양방향 직렬화기RedisElementReader
와 RedisElementWriter
를 사용하는 단방향 직렬화기RedisSerializer
는 기본적으로 byte[]
로 직렬화 하는 반면, reader와 writer는 ByteBuffer
를 사용한다.
따라서, 단순한 구조의 데이터는 RedisSerializer
를 선택하는 것이 적절하다.
이 두 인터페이스를 기반으로한 다양한 구현체들의 사용이 가능하며,
JSON 포맷 지원을 위한 Jackson2JsonRedisSerializer
와 GenericJackson2JsonRedisSerializer
,
Object/XML 매핑을 위한 OxmSerializer
를 사용할 수도 있다.
기본적으로
RedisCache
와RedisTemplate
은 Java의 네이티브 직렬화를 사용한다.해당 방식은 직렬화 과정에서 예상치않은 코드가 실행되는 보안문제가 있으므로, 다른 메시지 형식의 직렬화를 사용하는 것이 권장된다.