BackEnd/Redis

03. Spring Redis Project

hanseom 2021. 12. 3. 00:08
반응형

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을 추가합니다.

https://start.spring.io/

 

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의 소스 코드를 참고하시면 됩니다.

반응형