학습목표
Spring과 Redis가 상호작용하는 방법을 이해한다.
RedisTemplate의 사용법을 이해한다.

RedisTemplate은 스프링에서 Redis를 객체 지향적으로 다루기 위해 제공되는 핵심 클래스이다. 단순 캐시 이상의 복잡한 데이터 구조 조작, 트랜잭션 연동, 순위나 집계 등 Redis 자료구조 활용이 필요할 때 사용하며, 스프링과 자연스럽게 통합되어 편리하게 Redis를 사용할 수 있도록 도와준다.
RedisTemplate를 왜 사용해야 할까?
Redis 명령어를 자바 코드로 추상화해서 객체 지향적으로 사용할 수 있게 해준다. 직접 Jedis나 Lettuce를 사용해서 Redis 명령어를 보내는 것보다 타입 안전성과 편의성이 높여준다.
또, 스프링과 통합되어 트랜잭션 관리, 캐시 추상화(Cache Abstraction) 등 스프링 기능과 자연스럽게 연동하여 사용할 수 있다.
Redis에서 제공하는 다양한 자료구조를 쉽게 활용하여 특정 아이템의 조회수를 증가시키거나 순위별로 정렬된 데이터를 가져오는 등의 작업을 코드 몇 줄로 구현할 수 있게도 해준다.
RedisTemplate의 사용법에 대해 알아보기 전에, Spring에서 Redis를 어떻게 사용하는지 간략하게 이해하고 넘어가자.
- Redis는 인메모리 키-값 저장소이다. 빠른 읽기/쓰기가 필요할 때 캐시, 세션 저장, 실시간 통계, 큐 등으로 자주 사용됨.
- Spring Boot에서는 Spring Data Redis를 통해 Redis와 편하게 연동할 수 있음.
Spring에서 Redis를 사용하는 법 2가지
1) @RedisHash이용 : Redis에 엔티티처럼 저장할 때 - 리포지토리를 이용한 CRUD
2) RedisTemplate : Redis의 CRUD를 직접 다룰 때
@RedisHash 이용하기
- JPA의 @Entity처럼, Redis에 저장할 객체(도메인 클래스)임을 나타내는 어노테이션
- 즉, 이 어노테이션을 붙이면 Spring Data Redis가 자동으로 해당 객체를 Redis의 Hash 구조로 변환해서 저장
- 객체(Entity) 중심의 사용 방식
✅ 예제
RadisHash 생성
package com.example.redis;
import lombok.*;
import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.RedisHash;
import java.io.Serializable;
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
//Entity 대신 RedisHash
@RedisHash("item") //래디스에 저장될 key 이름
public class Item implements Serializable { //Serializable : 직렬화가 가능한 클래스란 말
@Id
//String으로 주면 UUID로 자동으로 배정
private String id;
private String name;
private String description;
private Integer price;
}
Repository
package com.example.redis;
import org.springframework.data.repository.CrudRepository;
public interface ItemRepository extends CrudRepository<Item, String> {
}
Test
@SpringBootTest
public class RedisRepositoryTests {
@Autowired
private ItemRepository itemRepository;
@Test
public void createTest() {
//객체 생성
Item item = Item.builder()
.name("keyboard")
.description("description")
.price(100000)
.build();
//save 호출
itemRepository.save(item);
}
✅ 결과

RestTemplate 사용하기
- 데이터 구조를 직접 제어하고 싶을 때, 객체 말고 단순한 값, 리스트, 해시를 조작하고 싶을 때 사용
- 일반적으로 StringRedisTemplate을 자주 사용한다. (문자열을 자주 다루기 때문에)
- 필요시 RestTemplate을 커스텀하여(직렬화 등) bean으로 등록한 후 사용
📌 StringRedisTemplate
- RedisTemplate<String, String>을 상속받은 문자열 전용 템플릿
- 문자열(String) 전용 Redis 클라이언트임.
- "자바의 문자열"을 Redis 저장/조회할 때 사용하는 템플릿(자바쪽에서 redis의 데이터를 String으로 취급할 때)
- 내부적으로 keySerializer = StringRedisSerializer, valueSerializer = StringRedisSerializer 설정을 이미 갖고 있어서 문자열을 바로 저장/조회할 수 있음.
- 간단한 토큰, 설정값, 문자열 캐시 등에 적합함.
ValueOperations : redis의 "문자열" 조작을 위한 도구(SET, GET...)들을 메서드 형태로 가지고 있는 클래스
📌 RedisTemplate<K, V>
- 제네릭 타입으로 key, value의 타입을 지정해서 사용할 수 있는 범용 템플릿임.
- 기본 직렬화기는 JDK 직렬화(JdkSerializationRedisSerializer)로 설정되어 있어서 지정 없이 사용하면 바이트 직렬화 형태로 저장됨(사람이 읽기 어려움).
- 객체(DTO 등)를 저장하려면 직렬화 설정(예: JSON)이 필요함.
📌 StringRedisTemplate vs RedisTemplate
- StringRedisTemplate은 문자열 전용으로 이미 key/value에 StringRedisSerializer가 설정되어 있음.
- 장점: 설정 필요 없음, 바로 사용 가능.
- 단점: 문자열 이외 타입을 저장하면 직렬화 오류 또는 잘못된 저장 형태가 발생함.
- RedisTemplate은 범용 템플릿으로 객체 저장 가능하지만 기본 직렬화기가 JDK 직렬화라 사람이 읽기 어려운 바이트 형태로 저장됨.
- 따라서 객체(DTO)를 저장하려면 valueSerializer를 RedisSerializer.json() 등으로 변경해줘야 함
📌 RedisTemplate 커스텀
- 문자열 이외의 타입을 저장하고 싶을 때
- setKeySerializer, setValueSerializer를 명시적으로 설정하여 원하는 직렬화 방식(JSON 등) 적용 (기본 직렬화기는 JDK 직렬화로 설정되어 있어서 직렬화 커스텀 필수)
📌 RedisTemplate을 커스텀하여 Bean으로 등록하여 쓰는 것이 좋음
- RedisTemplate<String, ItemDto>를 @Bean으로 등록하면 여러 서비스에서 타입 안전하게 재사용 가능함.
- Bean 등록 시 setKeySerializer, setValueSerializer를 명시적으로 설정하여 원하는 직렬화 방식(JSON 등)을 보장할 수 있음.
- 기본 RedisTemplate을 그냥 @Autowired하면 기본 직렬화(JDK)가 적용되어 JSON이나 다른 시스템 간 호환에 불리함.
- 따라서 객체 저장용 템플릿은 직렬화 설정을 맞춘 뒤 Bean으로 등록해놓고 쓰는 것이 유지보수에 유리함.
✅ StringRedisTemplate 예제
package com.example.redis;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
@SpringBootTest
public class RedisTemplateTests {
/**
* StringRedisTemplate : "자바의 문자열"을 Redis 저장/조회할 때 사용하는 템플릿(자바쪽에서 redis의 데이터를 String으로 취급할 때)
* -> RedisTemplate<String, String>을 상속받은 문자열 전용 템플릿
* -> RedisTemplate<K, V> : key,value 타입을 직접 지정할 수 있는 일반 템플릿
*/
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
public void stringOpsTest() {
//ValueOperations : redis의 "문자열" 조작을 위한 도구(SET, GET...)들을 메서드 형태로 가지고 있는 클래스
//opsForValue : 데이터를 넣거나 가져오는 도구 상자 (여기선 string 데이터)
ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
//'SET simplekey simplevalue' 명령어와 같음
ops.set("simplekey", "simplevalue"); //key="simplekey" value="simplevalue" 데이터 저장
System.out.println(ops.get("simplekey"));
}
}

✅ RedisTemplate 커스텀하여 Bean 등록 후 사용하는 예제 - DTO 저장해보기
redis에 등록할 객체 (DTO)
package com.example.redis;
import lombok.*;
import java.io.Serializable;
@Getter
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ItemDto implements Serializable {
private String name;
private String description;
private Integer price;
}
RedisConfig
Check Point
✔️ 데이터 타입 설정
✔️ 직렬화 설정
package com.example.redis;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
@Configuration
public class RedisConfig {
@Bean //재사용할 수 있도록 빈 객체로 만들었움
public RedisTemplate<String, ItemDto> itemRedisTemplate(
RedisConnectionFactory redisConnectionFactory //레디스 커넥션 관리(yml정보를 바탕으로 만들어짐)
) {
RedisTemplate<String, ItemDto> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(RedisSerializer.string()); //키를 어떻게 직렬화/역직렬화 할것인지
redisTemplate.setValueSerializer(RedisSerializer.json());
return redisTemplate;
}
}
테스트
package com.example.redis;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.SetOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import java.util.concurrent.TimeUnit;
@SpringBootTest
public class RedisTemplateTests {
//앞부분 코드 생략
/**
* RedisConfig에서 RedisTemplate을 bean으로 등록 후 사용해보자.
*/
@Autowired
private RedisTemplate<String, ItemDto> itemRedisTemplate;
@Test
public void itemRedisTemplateTest() {
ValueOperations<String, ItemDto> ops = itemRedisTemplate.opsForValue();
ops.set("my:keyboard", ItemDto.builder()
.name("Mechanical Keyboard")
.price(250000)
.description("OMG")
.build());
System.out.println(ops.get("my:keyboard"));
}
}
요약 정리
Redis 연동은 크게 두 축으로 생각하면 편하다. 문자열 전용 작업은 StringRedisTemplate을 쓰고, 객체(예: DTO) 저장은 RedisTemplate<K, V>를 타입에 맞게 설정해서 쓰는 것이다.
객체를 저장할 때는 반드시 valueSerializer를 JSON으로 바꿔 사람이 읽을 수 있고 다른 시스템과 호환되는 형태로 직렬화해야 한다.
DTO용 RedisTemplate을 Bean으로 등록해 여러 서비스에서 재사용하는 패턴을 권장한다.
'DATABASE > Redis' 카테고리의 다른 글
| 인메모리 저장소와 Redis (RDB와의 비교) (0) | 2025.10.23 |
|---|