인프런 커뮤니티 질문&답변

뱅준님의 프로필 이미지

작성한 질문수

Slack 클론 코딩[백엔드 with NestJS + TypeORM]

CacheManager에 대해 질문 있습니다.

24.09.12 19:35 작성

·

37

·

수정됨

0

안녕하세요. 최근에 게시물 조회수 카운팅 작업을 하고 있습니다. 어떻게 구성을 할 지 생각을 좀 해보다가, `CacheManger (https://docs.nestjs.com/techniques/caching) 를 사용해서

(entity-id-ip):(timestamp)

이렇게 key-value 형태로 담아서 메모리에 저장하고, ttl을 1시간으로 설정해서 만약에 키가 존재하면 조회수가 오르지 않고, 값을 현재 시간으로 업데이트 해주고, 키가 없으면 값을 넣어주고 조회수 +1을 해주게 로직을 설정했습니다.

그런데 이게 로컬환경에서는 잘 되는데, 이상하게 배포환경에서는 정상적으로 작동하지 않습니다.

 

그래서 Redis를 설치해서 해보자니 제가 NestJS 10버전을 사용하고 있는데 쉽게 도와주는 라이브러리가 9버전까지만 지원해서 버전을 낮추기도 좀 그렇고, 얘도 어쨌든 메모리를 사용하는 거라 똑같을 것 같아서 우선 보류해뒀습니다.

 

마지막으로 쿠키를 사용해서, entity키에 값으로 게시물의 id를 담아 해당 게시물이 값에 존재하면 조회수가 올라가지 않도록 해봤는데, 이건 로컬 환경에서도 잘 안먹히고있어서 도통 어떻게 해야할지 감이 안와 막혀있습니다 ㅜㅜ

 

CacheManger를 사용해서 해결하면 좋을 것 같은데, 배포 환경에서는 왜 작동이 안되는지 혹시 원인을 아시나요? 그리고 제로초님께서 추천해주시는 방법도 궁금합니다 ㅠ

달성하고자 하는 목적은 일정 기간동안 같은 방문자의 게시글 조회수 카운팅을 +1 만 하는 것입니다!

답변 2

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

2024. 09. 12. 22:31

혹시 배포환경이 ec2 안에서 nest와 redis를 동시에 설치하신 상황인가요? 혹시 오토스케일링이 걸려있나요?? 일단 ec2(오토스케일링)과 별도로 redis(elasticache 등) 호스팅을 두고 하시면 그런 문제는 발생하지 않게 됩니다. 개별 ec2 안에 redis를 넣어두시면 오토스케일링 시 redis도 여러개가 되어버립니다.

뱅준님의 프로필 이미지
뱅준
질문자

2024. 09. 12. 23:16

온프레미스로 배포하고있어서는 안쓰고있습니다! 추가로, redis는 이 @liaoliaots/nestjs-redis 라이브러리랑 같이 사용하던데, 버전이 안맞아서 (저는 nestjs가 10버전인데, 9버전까지만 지원) 우선 보류해두고 본문에 첨부드린 공식문서 보고 cache manager를 사용해보려고 했는데 왜인지 정상적으로 작동하지 않네요.

결국엔 Redis를 사용하는게 좋을까요? 제로초님은 혹시 방문자의 조회수 카운팅을 어떻게 하시나요?

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

2024. 09. 13. 16:24

https://github.com/Songkeys/nestjs-redis

@liaoliaots는 유지보수를 중단해서 위의 모듈을 대신 쓰시는 걸 추천드립니다.

제 블로그의 경우에는 GA로 방문자 카운팅을 하고 있습니다.

0

인프런 AI 인턴님의 프로필 이미지

2024. 09. 12. 19:41

안녕하세요, 인프런 AI 인턴입니다. abj13님

게시물 조회수 카운팅 작업에서 CacheManager를 사용하는 문제에 대해 질문 주셨네요. 이를 해결하기 위해 기존에 제로초(조현영)님이 비슷한 질문에 대해 답변하신 내용을 참고로 하여 답변드리겠습니다.

  1. 배포 환경에서 CacheManager가 작동하지 않는 문제:

    • 로컬 환경과 배포 환경의 차이로 인해 발생할 수 있습니다. 캐싱 설정이 올바르게 되어 있는지, 또는 배포 환경의 네트워크 구성이나 메모리 사용량 제한으로 인해 발생할 수 있습니다.
    • 배포 환경에서의 로그를 확인하여 구체적인 오류 메시지를 확인하는 것도 좋습니다.
  2. 기타 방법 추천:

    • 세션을 이용한 카운팅: 세션 ID를 이용해 방문자를 구분하여 한 번만 카운팅하는 방법입니다.
    • Redis 사용: Redis는 분산 캐싱 시스템으로, high availability와 설계를 염두에 두고 제작된 툴입니다. NestJS와 Redis를 연결하는 방법도 한 방법입니다.

기존 질문과 답변을 참조하여, 추가적인 정보와 도움을 드립니다.

관련 질문 및 답변 URL:

다른 유사한 질문 링크도 첨부합니다:
- nginx 적용 이후 컴퓨터에서 처음 로그인 시 바로 글이 나타나지 않습니다
- 스스로 구현하기 게시글 삭제 질문

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

뱅준님의 프로필 이미지

작성한 질문수

질문하기