Redis를 써보자!

콜트·2021년 3월 22일
0

Edit. 앱 개발기

목록 보기
9/11
post-thumbnail

프로젝트에 Redis를 도입하기로 하여, 관련 내용을 정리하고자 한다. 명령어를 비롯한 Redis에 대한 자세한 학습 내용은 추후에 정리하도록 하겠다.

Why?

현재로써의 목적은 캐시기능이 아닌 휘발성 데이터를 처리하는 것이다. 현재 앱에서는 JWT를 이용한 인증방식을 채택하였는데, JWT의 특성상 만료기간이 다 되기 전까지는 제거가 불가능하다. 그래서 로그아웃시 해당 JWT만을 제외하는 블랙리스트를 따로 만들어서 관리하는 방식을 사용하기로 했다. 다만 여기서 요점은 유효기간이 다 되면 쓸모없는 데이터가 된다는 것이다. 즉, 유효기간 동안만 갖고 있으면 된다는 것이다. 이와 마찬가지로 이메일 인증을 진행할 때, 인증에 대한 정보도 제한시간 동안만 유효하므로 이와 같은 것들을 주기적으로 처리해줘야 한다.

처음에는 Spring Boot Scheduler를 이용해서 매 초 마다 불필요해진 휘발성 데이터들을 제거해주려고 했다. 하지만 현재 사용하고 있는 EC2 인스턴스는 프리티어여서, 스프링부트 프로젝트만 실행해도 절반 이상의 메모리가 사용되고 있는 것을 확인할 수 있다(이유가 뭐지..?).

이렇게 되자, 유저가 유입된 이후의 EC2 인스턴스의 메모리가 걱정되기 시작했다(정확한 측정은 해봐야 알겠지만.. 공부하자). 게다가, 결국엔 사라질 데이터라면 굳이 DB에 저장할 필요가 있을까? 라는 고민이 생겼다. 동시에 DB 서버의 부하를 줄이면 좋지 않을까? 라는 생각에 도달했다.

그래서 팀원과의 논의 끝에 휘발성 데이터 처리에 AWS ElastiCache에서 제공해주는 Redis를 사용해보기로 했다.


How?

우선 가장 먼저 고민이 되었던 건, 'Key - Value로 이루어진 데이터를 어떻게 관리할 것인가?' 였다.

그래서 논의 끝에 다음과 같이 규칙을 정했다(현재로써는 관리할 대상이 BlacklistAuthentication Code 뿐이다).

Blacklist

  • Set을 이용한다. 단순히 블랙리스트의 기능만 한다.
  • SetKey 형식은 blacklist:20210324과 같이 blacklist:{날짜}로 한다.
  • Set에 추가할 member는 토큰 문자열로 한다.
  • Set 생성시에 적절한 만료기간을 지정해서 자동으로 제거될 수 있도록 한다.
  • 추후에 유저 이탈 등 데이터 분석의 여지를 남겨둘 수 있게 스냅샷 기능을 이용하는 것도 고려해보도록 한다.
(2021.03.25 추가 수정)

블랙리스트도 Strings로 관리하도록 한다.

Authentication Code

  • 이메일 인증을 진행할 이메일 주소Key로 하여 Strings로 관리한다.
  • Authentication CodeValue로 사용한다.
  • Authentication Code의 만료 기간은 인증 제한시간인 180초로 한다.
2021.03.26 추가 수정

인증코드 검증 시나리오는 유효한 코드(인증 성공), 만료된 코드, 틀린 코드 3가지로 한다.
이에 따라, 우선은 인증 코드 요청 시 다음 2개의 StringsRedis에 추가해서 검증을 진행한다.

  • 인증 코드 : 이메일 주소 -> 인증 코드 존재 여부 검증, Value가 비어있으면 잘못된 인증코드
  • 이메일 주소 : 인증 코드 -> 인증 코드 존재 여부 검증 후, 이메일 주소로 인증 코드 최신 인증코드 검증(존재하지 않을시 인증 제한 시간이 만료된 것).

More?

현재 개발중인 서비스에서 캐시 기능을 사용할만한 곳이 있다. 바로 메인 화면이다. 특정 데이터를 조회해서 보여주는 부분이 있는데, 메인 화면에서 해당 부분의 경우 하루동안 같은 데이터를 보여주게 되어있다. 그래서 이 부분에 캐시 기능을 적용해볼 예정이다.


참고자료


profile
개발 블로그이지만 꼭 개발 이야기만 쓰라는 법은 없으니, 그냥 쓰고 싶은 내용이면 뭐든 쓰려고 합니다. 코드는 깃허브에다 작성할 수도 있으니까요.

0개의 댓글