Skip to content

NestJS에서 Redis 사용하기

손문기 edited this page Dec 14, 2023 · 2 revisions

시작하며

프로젝트를 진행하면서 NestJS에 Redis를 적용하며 겪은 이슈들에 대해 적어보고자 합니다. 캐싱을 위해 Redis를 cache-manger를 통해 사용하였다가 ioredis로 전환하게된 이유, redis 라이브러리를 전환하게된 배경 등의 간략한 트러블 슈팅에 대해 소개 해보겠습니다.

NestJS에서 Redis 사용하기

공식문서 참고하기

프로젝트에 캐싱을 적용하기위해 Redis를 사용하기로 결정하고, 이를 처음 적용하는 과정에서 NestJS 공식문서를 참고하였습니다.

해당 문서의 내용대로 cache-manager-redis-store를 통해 redis를 캐시 저장소로만 사용하다 보니 기능적 제약이 많았습니다.

get, set과 같은 기본적인 명령어만 사용 가능하였고, redis의 다양한 자료구조를 사용하는 것도 불가하였습니다.

ioredis, @liaoliaots/nestjs-redis 모듈

위와 같은 문제를 해결하기 위해 NestJS에서 redis 자체를 사용하기 위해 ioredis와 @lioliaots/nestjs-redis 모듈을 사용하기로 하였습니다. @liaoliaots/nestjs-redis는 npm 주간 다운로드수가 5만건 이상이어서 안전성이 보장되어있다고 생각하여 사용하게 되었습니다.

하지만 install 하는 과정에서 충돌이 발생하였고, 이를 해결하기 위해 @liaoliaots/nestjs-redis의 github issue를 참고하였습니다.

@songkeys/nestjs-redis

songkeys

위의 이슈를 통해 저와 같은 문제를 겪는 사람들이 꽤 있다는 것을 알았습니다.

해당 문제는 NestJs의 10버전 이상의 dependencies 문제인 것으로 확인되어, issue의 댓글을 통해 10버전 호환이 되는 @songkeys/nestjs-redis로 변경하였고 잘 적용되는 것을 확인하였습니다.

Redis의 다양한 자료구조

프로젝트에서 인기 상품 목록 순위를 제공하기 위한 기능을 개발하는 과정에서 Redis에 대한 자세한 학습을 진행하지 않고 시작하여, 랭크 순위를 일반적인 key-value로 저장하고 이를 서버에서 호출해서 다시 정렬하여 재가공하는 방법을 사용하고 있었습니다.

하지만 Redis에 대해 좀더 학습하는 과정에서 다양한 자료구조가 있다는 것을 알게 되었고 기존의 코드를 Sorted Set을 사용하도록 변경하였습니다.

Sorted Set을 사용하는 과정에서도 zrevrange()를 WITHSCORES 옵션과 함께 사용하면 member와 score가 같이 조회된다는 것을 나중에 알아서 member와 score를 따로 조회하던 기존의 코드를 수정하기도 하였습니다.

마치며

이번 프로젝트를 진행하면서 NestJS과 Redis 모두 처음 사용하면서 시행착오를 많이 겪게 된 것 같습니다.

한정된 시간동안에 프로젝트를 완성해야 한다는 생각에, 새로운 개념에 대한 학습을 소홀히 하여 겪은 시행착오였기도 합니다.

아무리 유용한 도구일지라도, 도구를 다루는 방법을 익히지 않고 사용하면 아무런 소용이 없다는 것을 직접 체감하는 경험이 되었습니다.

Clone this wiki locally