RedisTemplate

뾰족머리삼돌이·2024년 10월 9일
0

Spring Data Redis

목록 보기
2/12

RedisTemplate

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] 호출을 제거하고 자동으로 변환을 수행한다.

위 예시에서는 RedisTemplateopsForList()를 사용하지 않고 ListOperations 템플릿 뷰를 직접 주입받는 것을 확인할 수 있다.

redisTemplate을 주입받는 경우, 문자열이 올바르지 않게 저장되는 것을 확인할 수 있다.


이는 redisTemplate에서 사용하는 인코딩 방식이 문자열을 인코딩하는데 적절하지 않기 떄문이다.
( 기본적으로 JdkSerializationRedisSerializer 가 사용된다 )

따라서, 문자열에 특화된 stringRedisTemplate을 주입받으면 해당 문제가 해결된다.

문자열 중심의 편의 클래스

대부분의 경우, Redis에 저장되는 키와 값이 String인 경우가 흔하기에 Spring Data Redis 모듈에서는 RedisConnection RedisTemplate의 확장인 StringRedisConnectionStringRedisTemplate를 제공한다.

각 확장 인터페이스들은 StringRedisSerializer를 사용하므로, 저장된 키와 값을 사람이 읽을 수 있다.
( 단, Redis와 코드에서 동일한 인코딩을 사용해야한다 )

RedisTemplateStringRedisTemplate을 사용하면 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 기반의 양방향 직렬화기
  • RedisElementReaderRedisElementWriter를 사용하는 단방향 직렬화기

RedisSerializer는 기본적으로 byte[] 로 직렬화 하는 반면, reader와 writer는 ByteBuffer 를 사용한다.
따라서, 단순한 구조의 데이터는 RedisSerializer를 선택하는 것이 적절하다.

이 두 인터페이스를 기반으로한 다양한 구현체들의 사용이 가능하며,
JSON 포맷 지원을 위한 Jackson2JsonRedisSerializerGenericJackson2JsonRedisSerializer,
Object/XML 매핑을 위한 OxmSerializer 를 사용할 수도 있다.

기본적으로 RedisCacheRedisTemplateJava의 네이티브 직렬화를 사용한다.

해당 방식은 직렬화 과정에서 예상치않은 코드가 실행되는 보안문제가 있으므로, 다른 메시지 형식의 직렬화를 사용하는 것이 권장된다.

0개의 댓글

관련 채용 정보