이번 포스팅에서는 스프링 부트와 Redis를 연동하는 방법을 알아보고,
이후 Redis를 통해 기존 스프링 부트 프로젝트에서 간단하게 Refresh Token을
구현한 과정을 적어보려 한다.
✅ Redis란 무엇인가
Redis는 Key-Value 쌍으로 데이터를 저장하는 메모리 기반(In-memory) 데이터 저장소이다.
MySQL과 같은 RDB와 다르게, Redis는 HDD, SDD가 아닌 RAM에 데이터를 저장하므로
데이터를 영구적으로 저장하지 않는 대신, 메모리 기반으로 동작하는 만큼 빠른 응답속도를
제공한다.
빠른 응답속도와 휘발성이라는 특징 때문에 Redis는 주로 데이터 캐싱, 세션 관리,
메시지 큐 등의 용도로 사용된다.
또한, Redis는 싱글 쓰레드로 동작하고 엑세스 속도가 굉장히 빠르기에 RDB에서 발생할 수 있는
동시성 문제를 효과적으로 해결할 수 있다.
❓ Redis 사용 이유
본 포스팅에서는 Redis를 활용하여 Refresh Token을 구현하였는데,
앞서 언급한 Redis의 장점들이 Refresh Token의 용도와 상당히 부합하기 때문이다.
먼저 Redis는 빠른 엑세스 속도를 제공하기에 사용자 로그인 시 Refresh Token을 발급하고
저장하는 과정에서 추가적으로 발생하는 비용에 대한 부담, 즉 성능 저하의 부담이 적다.
또, Refresh Token은 발급 이후 일정 시간이 지나면 만료되어야 한다.
이 때 Refresh Token을 RDB에 저장하고 관리하게 된다면, 새로운 토큰이 발급될 때마다
DB에 발급된 토큰이 쌓이게 될 것이고, 만료된 토큰을 제거하기 위해 스케줄러 등을 통해
주기적으로 DB를 관리해주어야 한다. 하지만 레디스는 기본적으로 데이터를 저장할 때,
데이터의 수명, 즉 TTL(Time To Live)을 지정할 수 있다.
이러한 특징들은 Refresh Token을 관리하기에 아주 적절하다.
✅ Spring Boot 와 Redis 연동
로컬에서 Redis를 다운받아 사용하는 방법도 있지만,
본 포스팅에선 Docker에 Redis를 올려 사용하였다.
📌 Redis Docker 이미지 다운로드
먼저 Docker Hub에서 Redis 이미지를 다운로드 한다.
터미널이나 커맨드 프롬프트(CMD)에서 다음 명령어를 실행하면 다운로드가 된다.
📌 Redis 컨테이너 실행
다운로드한 Redis 이미지를 사용해 컨테이너를 실행한다.
- --name {my-redis} : 컨테이너의 이름을 설정한다 {my-redis}에 원하는 컨테이너의 이름을 넣어주면 된다.
- -p 6379:6349 : 호스트의 6379포트와 컨테이너의 6379포트를 연결, Redis는 기본적으로 6379 포트에서 동작한다.
📌 Redis 컨테이너 접근
Redis 컨테이너가 실행되고 나면, 터미널에서 다음 명령어로 Redis CLI에 접근할 수 있다.
Redis CLI에 성공적으로 접근하고 나면, 다음과 같이 Redis 명령어를 실행시켜 볼 수 있다.
keys * 는 Redis 데이터 저장소의 모든 데이터를 조회하는 명령어인데, 현재는 저장된 데이터가
없기 때문에 (empty array)가 출력되는 모습이다.
📌 build.gradle
이제 본격적으로 Spring Boot와 Redis를 연동하기 위해, build.gradle에 의존성을 추가해 주어야 한다.
build.gradle의 dependencies에 다음과 같이 의존성을 추가해주면 된다.
// Redis
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
📌 application.properties
properties에도 다음과 같이 Redis 관련 설정을 추가해준다.
spring.data.redis.host=localhost
spring.data.redis.port=6379
📌 RedisConfig.class
@Configuration
public class RedisConfig {
@Value("${spring.data.redis.host}")
private String host;
@Value("${spring.data.redis.port}")
private int port;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(host, port);
}
@Bean
public RedisTemplate<String, String> redisTemplate() {
RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory());
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
return redisTemplate;
}
}
RedisConfig를 통해 Redis를 사용하기 위한 설정을 해줘야 한다.
먼저 properties에서 설정한 host, port를 사용할 수 있도록 설정해준다.
Redis Client 구현체로는 Lettuce와 Jedis가 있는데, 여기서는 Lettuce를 사용했다.
또, Spring Boot에서 Redis를 사용하는 방법 역시 두 가지로 나뉜다.
(Redis Repository, Redis Template)
본 포스팅에서는 Redis Template을 사용하였다.
여기까지 왔다면 Spring Boot에서 Redis를 사용하기 위한 모든 준비는 끝났다.
다음 포스팅에서 Redis의 본격적인 활용과 Reflesh Token의 구현을 다뤄볼 예정이다.
'Study > Spring' 카테고리의 다른 글
[Spring] AOP를 활용한 기능 모듈화 (0) | 2024.03.25 |
---|---|
[Spring][Redis] Redis를 활용한 Refresh Token 구현 (0) | 2024.03.15 |
1+N 문제 (0) | 2024.03.04 |
Entity 연관 관계 (지연 로딩, 영속성 전이, 고아 Entity 삭제) (0) | 2024.02.08 |
[Spring] Entity 연관 관계 (1) | 2024.01.31 |