728x90

 

아래의 포스팅에서 알아보았듯이 Spring Boot에서 Redis를 사용할 때, 두 가지 주요 접근 방식이 있다고 했습니다.

 

[Redis] Spring boot에서의 Redis사용하기 #1 : RedisRepository

Redis는 높은 성능과 다양한 데이터 구조 지원 덕분에 많은 애플리케이션에서 캐싱, 세션 저장소, 메시지 큐 등으로 사용됩니다. SpringBoot에서는 Redis와의 통합이 매우 간편하게 이루어집니다. 이

pixx.tistory.com

 

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의 문자열 데이터에 특화된 기능을 제공합니다.

 

 

 

RedisTemplateopsForValue() 메서드를 호출하면, 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>
  • 설명: 이 경우 ValueOperationsString 타입의 Integer 타입의 을 처리할 수 있습니다. opsForValue() 메서드는 String 타입을 기반으로 한 ValueOperations <String, Integer>를 반환합니다.

 

String과 User

RedisTemplate<String, User> redisTemplate = new RedisTemplate<>();
ValueOperations<String, User> valueOps = redisTemplate.opsForValue();

 

 

  • 제네릭 타입: <String, User>
  • 설명: 여기서는 ValueOperationsString 타입의 사용자 정의 User 타입의 을 처리할 수 있습니다. opsForValue() 메서드는 String 타입을 기반으로 한 ValueOperations<String, User>를 반환합니다.

 

Integer과 String

RedisTemplate<Integer, String> redisTemplate = new RedisTemplate<>();
ValueOperations<Integer, String> valueOps = redisTemplate.opsForValue();

 

  • 제네릭 타입: <Integer, String>
  • 설명: 이 경우 ValueOperationsInteger 타입의 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의 데이터에서 KeyJava로 표현될 때의 데이터 타입과, Redis 데이터ValueJava로 표현될 때의 데이터 타입을 지정한다고 할 수 있습니다.


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들이 들어있는 것을 확인할 수 있습니다.


정리하자면, StringRedisTemplateKey와 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 객체를 생성합니다.
    • StringRedis의 키 타입을, ItemDtoRedis의 값 타입을 나타냅니다.
  • 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의 설정을 정의하고, 애플리케이션에서 주입받아 사용할 수 있습니다.