[Spring Boot] Redis 사용하기

YJ KIM·2022년 8월 27일
4

Spring에서는 Spring Data Redis 라이브러리를 이용하여 Redis에 접근할 수 있다.
이때 Redis를 접근할 수 있는 프레임워크로 Lettuce, Jedis가 있다.
Lettuce는 별도의 설정 없이 이용할 수 있고, Jedis는 별도의 의존성 추가가 필요하다.

또한 Spring Data Redis로 Redis에 접근하는 방식으로는
1. RedisTemplate
2. RedisRepository
방식이 존재한다.

이번 포스팅에서는 Lettuce와 RedisTemplate을 이용하여 Redis를 Spring boot local 환경에서 사용하는 것이 목표이다.

  1. Spring Data Redis 의존성 추가
  2. RedisTemplate 설정
  3. 설정된 Redis test (테스트 코드 사용 x, 간단한 테스트o)

1. Spring Data Redis 의존성 추가

implementation 'org.springframework.boot:spring-boot-starter-data-redis'

2. RedisTemplate 설정

Redis 연결을 위한 class를 생성한다.

@Configuration
public class RedisConfig {

    @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<?,?> redisTemplate(){
        RedisTemplate<byte[], byte[]> redisTemplate=new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        return redisTemplate;
    }

    @Bean
    public StringRedisTemplate stringRedisTemplate(){
        StringRedisTemplate stringRedisTemplate=new StringRedisTemplate();
        stringRedisTemplate.setKeySerializer(new StringRedisSerializer());
        stringRedisTemplate.setValueSerializer(new StringRedisSerializer());
        stringRedisTemplate.setConnectionFactory(redisConnectionFactory());
        return stringRedisTemplate;
    }
}

📍 위의 코드 설명

1. Redis에 접근하기 위해서 Redis 저장소와 연결

이 과정을 위하여 RedisConnectionFactory 인터페이스를 사용한다.
RedisConnectionFactory 인터페이스를 통하여 LettuceConnectionFactory를 생성하여 반환한다.
-> 새로운 Connection이나 이미 존재하는 Connection 리턴
-> Jedis, Lettuce 등 Redis-client를 선택하여 연결 생성
📌 @Value 사용하기 때문에 미리 설정 파일에서 spring.redis.@@ 구조로 설정 필요

2. RedisTemplate, StringRedisTemplate bean 생성

  • RedisTemplate: java Object를 redis에 저장하는 경우 사용
  • StringRedisTemplate: 일반적인 String 값을 key, value로 사용하는 경우 사용

🖇 setKeySerializer, setValueSerializer 설정 이유는, RedisTemplate 사용 시에 Spring-Redis 간 데이터 직렬화, 역직렬화에 사용하는 방식이 Jdk 직렬화 방식이기 때문이다.

현재 구현할 서비스에서는 Redis에 객체를 저장하진 않지만 혹시 쓰일까봐 RedisTemplate도 정의하였다. 사용은 StringRedisTemplate만 할 듯!

3. Redis Test

    @Autowired
    private StringRedisTemplate redisTemplate;
    private final String KEY="keyword";

    @org.junit.Test
    public void 검색어_저장(){
        //given
        String keyword="한남동 맛집";
        String keyword2="서촌 맛집";

        //when
        redisTemplate.opsForZSet().add(KEY,keyword,1);
        redisTemplate.opsForZSet().incrementScore(KEY,keyword,1);
        redisTemplate.opsForZSet().incrementScore(KEY,keyword,1);

        redisTemplate.opsForZSet().add(KEY,keyword2,1);

        //then
        System.out.println(redisTemplate.opsForZSet().popMax(KEY));
        System.out.println(redisTemplate.opsForZSet().popMin(KEY));

    }

간단하게 검색어를 저장하고 이를 count하는 test를 만들어보았다.
"한남동 맛집"은 count가 3회 되어야 하고
"서촌 맛집"은 count가 1회 수행되어야 한다.


opsForZSet 이외에도 많은 자료형이 있으니
이는 추후에 정리하도록 하고 급히 구현할 것부터 먼저 구현해야겠다.(ㅠㅠ)

[참고한 포스팅]
1. https://wildeveloperetrain.tistory.com/32
2. https://blossom6729.tistory.com/16

profile
모르면 쓰지 말고 쓸 거면 알고 쓰자

2개의 댓글

comment-user-thumbnail
2023년 4월 26일

+) implementation 'org.springframework.boot:spring-boot-starter-data-redis'

group data 아니고 boot임.

답글 달기
comment-user-thumbnail
2023년 8월 24일

잘봤습니당

답글 달기