[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의 경우에는 연결 하나 밖에 안됩니다 ㅠㅜ…
서버에 접속하는 방법은 다음과 같습니다.
new server을 클릭해서, host와 password를 입력해줍니다.
- host : redis를 설치한 서버의 ip
- password : redis.conf 에서
requirepass
다음에 입력했던 값
< Windows 툴 >
: p3x도 있고, redis desktop manager도 있는데, 저는 p3x를 선택해보았습니다.
p3x는 무료이고, 아래 링크에서 다운로드 받습니다.
=> https://www.electronjs.org/apps/p3x-redis-ui
(redis desktop manager는 유료라서, 사용하려면 무료 버전 설치 파일을 찾아서 다운로드 해야합니다.)
서버에 접속하는 방법은 다음과 같습니다.
=> settings > new connection > 정보 입력 > Test connection > add
그리고는 Home 을 눌러서 데이터를 확인합니다.
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 적용법을 알아봅시다.