03. Spring Redis Project
Spring Boot와 Redis Java Client인 Lettuce(Non-blocking, Spring Boot 2 정식 채택)를 이용하여 프로젝트를 진행합니다. 구현할 API Spec.은 아래와 같습니다. Redis Data Structures(Strings, Lists, Sets, SortedSets, Hashes)별로 데이터를 저장하고 조회합니다.
Project 생성
https://start.spring.io/ 에서 Maven Project로 프로젝트를 생성합니다. [GENERATE] 버튼을 누르면 압축 폴더가 다운로드 됩니다. 다운로드 받은 폴더를 압축 해제하고 작업 폴더로 옮긴 후 IntelliJ에서 File > Open > 다운로드받은폴더\pom.xml을 열면 됩니다. Dependencies의 경우, Spring Web, Spring Data Redis, Lombok을 추가합니다.
Project 구조
Swagger 설정
application.yaml 설정
host와 port를 설정합니다. redis key의 경우, 자료구조별로 정의합니다.
spring:
redis:
host: localhost
port: 6379
key:
stringsKey: redis:strings
listsKey: redis:lists
setsKey: redis:sets
sortedSetsKey: redis:sorted:sets
hashesKey: redis:hashes
RedisConfiguration.java 파일 생성
Redis 사용을 위한 기본 구성 파일입니다. application.yaml에 설정한 값을 @Value 어노테이션으로 주입합니다. Redis Data에 접근하기 위해 RedisTemplate을 사용하며, LettuceConnectionFactory를 적용합니다. setKeySerializer, setValueSerializer를 설정해주는 이유는 redis-cli를 통해서도 데이터를 확인하기 위함입니다(기본적으로 JDK 직렬화 방식 사용). GenericJackson2JsonRedisSerializer의 경우, hashes 데이터 저장 시 ClassCastException 발생으로 적용하였습니다.
package com.spring.redis.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.repository.configuration.EnableRedisRepositories;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
@EnableRedisRepositories
@RequiredArgsConstructor
public class RedisConfiguration {
@Value("${spring.redis.host}")
private String redisHost;
@Value("${spring.redis.port}")
private int redisPort;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(redisHost, redisPort);
}
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory,
ObjectMapper objectMapper) {
GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer(
objectMapper);
RedisTemplate redisTemplate = new RedisTemplate<String, Object>();
redisTemplate.setConnectionFactory(redisConnectionFactory());
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(serializer);
return redisTemplate;
}
}
[전체 소스 코드]
Controller ~ Repository 까지는 [전체 소스 코드]에 링크된 github의 소스 코드를 참고하시면 됩니다.