[Web] 스프링부트 Redis 사용법 - (세팅편)

업데이트:



1. redis 설치 🎯


redis를 설치할 서버를 결정했다면 해당 서버로 가서 설치를 시작합니다.

설치

apt-get install redis-server


설정 세팅

vim /etc/redis/redis.conf


redis.conf 파일 수정

# bind 127.0.0.1 ::1
bind 0.0.0.0 ::1

# requirepass foobared
requirepass sangjinRedis


Redis 재시작

systemctl restart redis-server


Redis 상태보기

systemctl status redis-server


6379 포트 오픈

sudo iptables -I INPUT 5 -i ens3 -p tcp --dport 6379 -m state --state NEW,ESTABLISHED -j ACCEPT




2. GUI툴 설치 🎯


< Mac 툴 >

: medis가 대표적인 툴인데, 무료인 medis 2의 경우에는 연결 하나 밖에 안됩니다 ㅠㅜ…

image


서버에 접속하는 방법은 다음과 같습니다.

new server을 클릭해서, host와 password를 입력해줍니다.

  • host : redis를 설치한 서버의 ip
  • password : redis.conf 에서 requirepass 다음에 입력했던 값

image

image


< Windows 툴 >

: p3x도 있고, redis desktop manager도 있는데, 저는 p3x를 선택해보았습니다.

p3x는 무료이고, 아래 링크에서 다운로드 받습니다.

=> https://www.electronjs.org/apps/p3x-redis-ui

image

(redis desktop manager는 유료라서, 사용하려면 무료 버전 설치 파일을 찾아서 다운로드 해야합니다.)


서버에 접속하는 방법은 다음과 같습니다.

=> settings > new connection > 정보 입력 > Test connection > add

image


그리고는 Home 을 눌러서 데이터를 확인합니다.

image




3. 스프링 부트 환경 세팅 🎯


스프링 부트를 사용하는 것을 기준으로 다음과 같이 build.gradle 을 추가해줍니다.

build.gradle

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


그리고 application.yml에 값을 추가해줍니다.

build.gradle

spring:
  redis:
      host: redis의 ip
      port: 6379
      password: redis 비밀번호

  cache:
    type: redis


그리고 config 코드를 2가지 추가합니다.

RedisCacheConfig.java

import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.time.Duration;

@Configuration
@EnableCaching
public class RedisCacheConfig {

    @Bean
    public CacheManager userCacheManager(RedisConnectionFactory connectionFactory) {
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()))
                .entryTtl(Duration.ofHours(3L));

        return RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(connectionFactory).cacheDefaults(redisCacheConfiguration).build();
    }
}

RedisConfiguration.java

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfiguration {

    @Bean
    public RedisTemplate<String, String> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
        RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(lettuceConnectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        return redisTemplate;
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplateObj(LettuceConnectionFactory lettuceConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(lettuceConnectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
        return redisTemplate;
    }
}




4. 만날지도 모르는 에러들 🎯


1) 생성자 이슈

redis의 직렬화 메소드는 역직렬화 과정에서 기본 생성자가 필요하며,

@Builder 와 함께 쓰고 있다면 @AllArgsConstructor 도 추가가 필요합니다.

Exception : org.springframework.data.redis.serializer.SerializationException: Could not read JSON: Cannot construct instance of [클래스명] (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

해결방법)

@NoArgsConstructor
@AllArgsConstructor



2) LocalDateTime 이슈

redis에 LocalDateTime 타입을 역직렬화하는 과정에서 에러가 날 수 있습니다.

아래 Exception 예시와 해결 방법을 보기 전에 build.gradle에 모듈을 하나 추가합시다.

implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'



Exception : org.springframework.data.redis.serializer.SerializationException: Could not write JSON: Java 8 date/time type java.time.LocalDateTime not supported by default

해결방법)

@JsonSerialize(using = LocalDateTimeSerializer.class)



Exception : org.springframework.data.redis.serializer.SerializationException: Could not read JSON: Java 8 date/time type java.time.LocalDateTime not supported by default

해결방법)

@JsonDeserialize(using = LocalDateTimeDeserializer.class)



정말 고생 많으셨습니다~!

이제 다음 페이지로 이동해서 redis 적용법을 알아봅시다.

=> 스프링부트 Redis 사용법 - (적용편)




카테고리:

업데이트: