아래의 포스팅에서 알아보았듯이 Spring Boot에서 Redis를 사용할 때, 두 가지 주요 접근 방식이 있다고 했습니다.
Redis Repository와 RedisTemplate. 각 접근 방식은 Redis와의 상호작용을 간편하게 처리할 수 있게 해 주지만, 용도와 사용 방식에 따라 선택할 수 있습니다.
Spring boot 프로젝트 설정
Spring Boot에서 Redis를 사용하기 위해서는 의존성을 추가해야 합니다. pom.xml 또는 build.gradle 파일에 다음 의존성을 추가합니다.
의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
Redis Configuration 설정
spring:
redis:
host: localhost
port: 6379
username: <사용자 계정, 기본값 default>
password: <사용자 비밀번호>
RedisTemplate이란 ❓
RedisTemplate은 Redis와의 상호작용을 더 세밀하게 제어할 수 있는 기능을 제공합니다. 복잡한 Redis 작업을 수행하거나 다양한 Redis 데이터 구조를 다루어야 할 때 유용합니다.
특징
- 세밀한 제어
- Redis의 다양한 데이터 구조(문자열, 리스트, 집합, 해시 등)를 직접 다룰 수 있습니다.
- 커스텀 직렬화
- 데이터 직렬화 및 역직렬화 방식을 사용자 정의할 수 있습니다.
- 다양한 Redis 명령어 사용 가능
- Redis의 거의 모든 명령어를 지원합니다.
RedisTemplate과 ValueOperaions
- opsForValue()
- 문자열 값을 처리하는 데 사용됩니다.
- opsForList()
- Redis 리스트에 대한 연산을 제공합니다.
- opsForSet()
- Redis 집합에 대한 연산을 제공합니다.
- opsForHash()
- Redis 해시에 대한 연산을 제공합니다.
- opsForZSet()
- Redis 정렬된 집합(Sorted Set)에 대한 연산을 제공합니다.
Spring boot에서 RedisTemplate 사용하기 - String
Spring Boot에서는 Redis의 StringRedisTemplate과 같은 템플릿 클래스를 통해 Redis와의 상호작용을 쉽게 할 수 있습니다.
StringRedisTemplate은 RedisTemplate의 특정 구현으로, Redis의 문자열 데이터에 특화된 기능을 제공합니다.
RedisTemplate의 opsForValue() 메서드를 호출하면, Redis의 문자열 값에 대한 다양한 연산을 수행할 수 있는 ValueOperations 인터페이스를 받을 수 있습니다.
출력 결과는 위와 같습니다. ValueOperations 클래스를 사용하여 데이터를 저장하거나 조회하는 코드는 위에서 보여준 코드와 동일한 동작을 합니다.
더불어 opsForValue()를 호출하면, RedisTemplate에서 정의된 제네릭 타입에 기반하여 ValueOperations를 받을 수 있습니다.
여기서는 <String, String>으로 설정되어 있으므로, String 타입을 기반으로 한 ValueOperations를 사용하게 됩니다.
즉, ValueOperations는 Redis에서 문자열 조작을 위해 제공하는 다양한 메서드들을 가진 클래스라고 할 수 있습니다."
RedisTemplate의 제네릭 타입에 따른 ValuOperaions의 동작
String과 Integer
RedisTemplate<String, Integer> redisTemplate = new RedisTemplate<>();
ValueOperations<String, Integer> valueOps = redisTemplate.opsForValue();
- 제네릭 타입: <String, Integer>
- 설명: 이 경우 ValueOperations는 String 타입의 키와 Integer 타입의 값을 처리할 수 있습니다. opsForValue() 메서드는 String 타입을 기반으로 한 ValueOperations <String, Integer>를 반환합니다.
String과 User
RedisTemplate<String, User> redisTemplate = new RedisTemplate<>();
ValueOperations<String, User> valueOps = redisTemplate.opsForValue();
- 제네릭 타입: <String, User>
- 설명: 여기서는 ValueOperations가 String 타입의 키와 사용자 정의 User 타입의 값을 처리할 수 있습니다. opsForValue() 메서드는 String 타입을 기반으로 한 ValueOperations<String, User>를 반환합니다.
Integer과 String
RedisTemplate<Integer, String> redisTemplate = new RedisTemplate<>();
ValueOperations<Integer, String> valueOps = redisTemplate.opsForValue();
- 제네릭 타입: <Integer, String>
- 설명: 이 경우 ValueOperations는 Integer 타입의 키와 String 타입의 값을 처리합니다. opsForValue() 메서드는 Integer 타입을 기반으로 한 ValueOperations<Integer, String>를 반환합니다.
제네릭 타입에 따라 ValueOperations의 타입 매개변수도 달라집니다.
따라서 Redis에서 데이터를 저장하거나 조회할 때 사용하는 타입이 일치해야 합니다. RedisTemplate의 제네릭 타입에 따라 opsForValue() 메서드가 반환하는 ValueOperations의 타입도 결정되며, 이를 통해 다양한 데이터 타입을 효율적으로 처리할 수 있습니다.
StringRedisTemplate ≠ Redis의 String 타입
StringRedisTemplate
StringRedisTemplate는 Redis의 String 자료형만 사용하는 것이 아니라, Redis와 Spring Boot 사이에서 데이터를 주고받을 때 Java의 String으로 취급되는 클래스입니다.
즉, Redis의 리스트에 Java 문자열을 넣거나, Redis의 집합(Set)에 Java 문자열을 넣는 것을 의미합니다.
ValueOperations의 제네릭 <A, B>는 각각 키와 값을 나타냅니다.
여기서 StringRedisTemplate 클래스의 String은 Redis에 저장된 키를 식별할 때 사용되는 Java 클래스 타입을 의미합니다. 이는 Redis의 문자열(string)과는 관련이 없으며, 자바에서 키를 처리할 때의 자료형을 지정합니다.
두 번째 인자 Value는 저장할 값의 타입을 나타냅니다. 따라서 <String, String>은 Redis와의 통신 시 Java에서 사용할 타입을 지정하는 것입니다.
즉, Redis의 데이터에서 Key가 Java로 표현될 때의 데이터 타입과, Redis 데이터의 Value가 Java로 표현될 때의 데이터 타입을 지정한다고 할 수 있습니다.
RedisTemplate과 ValueOperations
- opsForValue()
- 문자열 값을 처리하는 데 사용됩니다.
- opsForList()
- Redis 리스트에 대한 연산을 제공합니다.
- opsForSet()
- Redis 집합에 대한 연산을 제공합니다.
- opsForHash()
- Redis 해시에 대한 연산을 제공합니다.
- opsForZSet()
- Redis 정렬된 집합(Sorted Set)에 대한 연산을 제공합니다.
Spring boot에서 RedisTemplate 사용하기 - Set
SetOperations<String, String> setOps = stringRedisTemplate.opsForSet();
집합을 조작하기 위한 클래스는 위와 같이 작성할 수 있습니다.
그렇다면 여기서 "SetOperations 클래스는 Key는 Java에서 문자열로 제공, Value들도 Java에서 문자열로 제공할 것이다."라고 할 수 있습니다.
Test를 실행해보면, 위와 같이 Redis의 Set 데이터 타입의 중복을 제거한 values들이 들어있는 것을 확인할 수 있습니다.
정리하자면, StringRedisTemplate은 Key와 Value 모두를 Java의 문자열로 사용하는 경우에 유용합니다.
즉, Redis의 키와 값을 모두 Java 문자열(String)로 처리할 때 적합합니다.
공용 명령어
@Autowired
private StringRedisTemplate stringRedisTemplate;
public void demo() {
// 값 설정
stringRedisTemplate.opsForValue().set("greeting", "Hello, World!");
// 값 조회
String greeting = stringRedisTemplate.opsForValue().get("greeting");
System.out.println(greeting); // 출력: Hello, World!
// 값 증가
stringRedisTemplate.opsForValue().increment("counter", 1);
// 값 감소
stringRedisTemplate.opsForValue().decrement("counter", 1);
// 값 삭제
stringRedisTemplate.delete("greeting");
}
공용 명령어는 stringRedisTemplate가 가지고 있습니다.
- set(String key, String value)
- 주어진 key에 value를 저장. key가 이미 존재하면 값 덮어쓰기.
- get(String key)
- 주어진 key의 값을 조회. 값이 없으면 null 반환.
- delete(String key)
- 주어진 key를 삭제. 삭제 성공 시 true, 실패 시 false 반환.
- increment(String key, long delta)
- 주어진 key의 값을 delta만큼 증가시킴. 숫자 형식이 아니면 null 반환.
- decrement(String key, long delta)
- 주어진 key의 값을 delta만큼 감소시킴. 숫자 형식이 아니면 null 반환.
- setIfAbsent(String key, String value)
- key가 존재하지 않을 때만 value를 설정. key가 존재하면 값 변경 없음.
- getSet(String key, String value)
- 현재 key의 값을 반환하고, value로 업데이트. key가 없으면 null 반환.
@Configuration에서 RedisTemplate 정의
RedisConfig 클래스는 Spring Boot 애플리케이션에서 Redis와 상호작용하기 위한 설정(Config)을 정의합니다.
여기서는 RedisTemplate을 커스텀하여 Redis에서 ItemDto 객체를 저장하고 조회할 수 있도록 설정해 보겠습니다.
RedisConfig
@Configuration 어노테이션
- 이 클래스가 Spring의 설정 클래스를 정의하며, Spring 컨테이너에 빈(Bean)을 등록하기 위해 사용된다는 것을 의미합니다.
- Bean으로 등록했기 때문에 itemRedisTemplate에서 사용이 가능합니다.
setConnectionFactory(connectionFactory)
- Redis 연결을 위한 RedisConnectionFactory를 설정합니다.
setKeySerializer(RedisSerializer.string())
- Redis의 키를 문자열로 직렬화합니다.
setValueSerializer(RedisSerializer.json())
- Redis의 값을 JSON 형태로 직렬화합니다.
- ValueOperations <String, ItemDto>
- opsForValue() 메서드를 사용하여 Redis의 문자열 값을 처리할 수 있는 ValueOperations 객체를 생성합니다.
- String은 Redis의 키 타입을, ItemDto는 Redis의 값 타입을 나타냅니다.
- ops.set("name", ItemDto.builder()... build()):
- 빌더 패턴을 사용하여 ItemDto 객체를 Redis에 저장합니다. 이때, ItemDto는 JSON으로 직렬화되어 Redis에 저장됩니다.
- System.out.println(ops.get("name")):
- Redis에서 키 "name"의 값을 조회하고 콘솔에 출력합니다. 출력된 값은 JSON으로 직렬화된 ItemDto 객체의 문자열 표현입니다.
위와 같이 Redis Template를 만들어 사용할 수 있습니다.
Redis를 사용할 때, 기본적인 CRUD 작업을 간단히 처리하려면 Redis Hash와 Repository를 결합한 Redis Repository가 가장 간편한 방법입니다.
Redis Repository는 기본적인 CRUD 연산을 쉽게 수행할 수 있도록 도와줍니다. 하지만 Redis의 더 상세한 작업이나 복잡한 데이터 처리 로직을 구현하려면 RedisTemplate을 사용하는 것이 좋습니다.
RedisTemplate을 사용하면 문자열, 리스트, 집합 등 Redis의 다양한 데이터 타입을 보다 유연하게 다룰 수 있습니다.
이때, RedisTemplate을 효과적으로 사용하기 위해서는 적절한 Config 설정이 필요합니다. 이를 통해 필요한 RedisTemplate의 설정을 정의하고, 애플리케이션에서 주입받아 사용할 수 있습니다.
'Database > redis' 카테고리의 다른 글
[Redis] Spring Boot와 Redis로 세션 클러스터링 구현하기 (0) | 2024.08.11 |
---|---|
[Redis] Spring boot에서의 Redis사용하기 #1 : RedisRepository (0) | 2024.08.10 |
[Redis] Redis의 주요 타입 살펴보기 (0) | 2024.08.08 |
[Redis] 인메모리 저장소와 redis란 무엇일까❓ (0) | 2024.08.06 |