[Redis] Spring Boot 연동 및 계정 생성

강성준·2024년 5월 17일

💡 Redis란?

Redis
Remote Dictionary Server의 약자
Key-Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈소스 기반의
비관계형 데이터베이스 시스템

Redis는 데이터를 저장 및 조회하는 데이터베이스이다.
Redis의 특징으로는 메모리에 데이터를 관리하므로 빠른 속도로 데이터를 저장하고 조회할 수 있다.

하지만 저장된 데이터는 메모리 특성상 저장된 데이터가 사라질 수 있는 가능성을 가지고 있다.

이를 보완하고자 Redis는 RDB, AOF방식으로 메모리에 있는 데이터를 디스크에 백업하는 기능을 제공한다.

📁 영속성

위에서 설명했듯 Redis는 메모리에 데이터를 저장하고 관리한다.
이러한 특징은 장점이 될 수 있지만 데이터가 사라질 수 있는 가능성이 있다는 이야기다.

이러한 단점을 보완하기 위해 Redis에서는 테이터에 영속성을 제공한다.
그 기능은 아래와 같다.

📖 RDB(Redis Database)

메모리에 있는 데이터 전체에서 스냅샷을 작성, 이를 디스크로 저장한다.

  • 특정 시간마다 스냅샷을 만든다. 데이터를 복구해야 한다면 스냅샷을 불러오면 된다.
  • 하지만 스냅샷에 포함되지 않은, 즉 스냅샷 이후에 생성되거나 수정, 삭제된 데이터는 복구할 수 없다.

🪄 AOF(Append Only File)

데이터가 변경되는 이벤트가 발생하면 모두 로그에 기록하는 방식이다.

  • 데이터가 변경되는 이벤트(생성, 수정, 삭제) 이벤트를 초 단위로 취합하고 로그 파일에 작성
  • 모든 데이터의 변경을 기록하므로 RDB방식에 비해서 데이터 유실 가능성이 적다.
  • 모든 데이터의 이벤트를 수시로 기록하기 때문에 RDB방식에 비해 느리고 파일의 크기가 크다.

두 방식 모두 장단점이 있으므로 아래와 같이 상황에 따라 사용한다.

  • 일부 데이터 손실에 영향을 받지 않는 경우(캐시로만 사용) RDB
  • 장애 직전까지의 모든 데이터가 필요한 경우 AOF
  • 강력한 내구성이 필요한 경우 RDB + AOF
  • 레디스는 일반적으로 AOF와 RDB를 동시에 사용하여 백업한다.

📕 Redis를 사용하게된 이유

이번에 진행하게된 팀 프로젝트에서 계정 부분을 담당하게 되었다.
Rest API를 개발해 프론트와 통신하면서 JWT방식의 인증을 사용하게 되었는데,
RefreshToken의 관리용으로 사용하기에 적합했다.

긴 유효시간을 가지고 있는 RefreshToken을 블랙리스트로 등록하여, 실제 토큰의 재발급 요청이 들어올 경우 Redis에 존재하는 RefreshToken인지 확인하며, TTL을 사용해 RefreshToken과의 유효시간을 맞출 수 있기 때문이다.

또한 Redis가 데이터 소실의 위험이 있더라 하더라도 인증정보와 같은 데이터는 사용자가 로그인 과정만 다시 거치면 되기 때문에 유실되더라도 크리티컬한 이슈가 발생하지 않는다는 점에서였다.

로컬에 Redis를 설치하여 개발을 진행하였지만, 조만간 배포를 진행하여 프론트 서버와의 통신을 이루며 테스트할 예정이기 때문에 Ubuntu에 Redis를 Docker Container로 실행하였다.

🔎 Docker를 이용한 Redis 설치

redis를 설치하기 위한 방법을 찾아보니 Docker를 이용한 Redis실행이 가장 간단해보였다.

Redis 홈페이지

Redis 홈페이지를 살펴보면 위 링크와 같이 Docker를 이용한 Redis를 실행할 수 있는 방법들이 쭉 나와있다.

나는 Docker Image를 pull 받아 실행시켰다.

참고한 블로그

💽 Redis 설치

✅ Redis 이미지를 다운받자.

$ docker pull redis

✅ Redis 실행 (여기까지만 해도 redis가 실행될거다.)

$ sudo docker run -p 6379:6379 redis

✅ Docker Container로 돌고 있는 Redis 접속

$ docker exec -it redis /bin/bash
$ redis-cli

✅ Redis 버전확인

127.0.0.1:6379> info
# Server
redis_version:4.0.14

여기 까지 성공했다면 성공적으로 Redis가 설치 되었다.

✒️ Redis 계정 생성

Redis 계정을 생성하기 위해 다시 Redis-cli를 이용하자.
참고한 블로그1
참고한 블로그2

✅ Docker Container로 돌고 있는 Redis 접속

$ docker exec -it redis /bin/bash
$ redis-cli

✅ 사용자 생성

127.0.0.1:6379> acl setuser [계정명] >password allkeys allconnamds

✅ 생성된 사용자로 로그인 시도

127.0.0.1:6379> auth '[계정명]'
(error) ERR AUTH <password> called without any ........
-> 비밀번호가 설정되어있지 않아 error가 발생할거다.

✅ 생성한 사용자의 비밀번호 설정

# 비밀번호 설정 정보 확인
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) ""
-> 비밀번호 정보가 없다.

# 비밀번호 설정
127.0.0.1:6379> config set requirepass [비밀번호]
OK

127.0.0.1:6379> exit

# 다시 시도해보자
127.0.0.1:6379> auth '[계정명]'
'OK'

만약 로그인은 되었지만 Redis 데이터베이스 내 데이터를 조회하려고 할때 접근이 되지 않는다면 아래와 같은 명령어로 계정을 확인해보자

계정명 옆에 "ON"이 아닌 "OFF"로 되어있을 수 있다.
그럴땐 아래와 같이 해주고 접속하면 데이터를 조회할 수 있을것이다.

# ON으로 변경해주자
127.0.0.1:6379> ACL SETUSER free on >free ~* +@all

# 다시한번 확인해보자
127.0.0.1:6379> ACL List

⚙️ Spring Boot / Redis 연동

일전에 JWT를 이용한 인증을 학습하면서 포스트로 기록해두었다.
아래 첨부된 링크를 확인하면 쉽게 연동할 수 있다.
Redis 연동방법

profile
Java, Spring Framework로 백엔드 개발을 하는 개발자입니다.

0개의 댓글