[Nest.js] Redis를 통해 상품 정보 캐싱

초이지수·2023년 8월 10일
0

Nest.js

목록 보기
11/14
post-thumbnail

📌 1. 기존 상품 조회 로직

현재 진행중인 프로젝트에서는

  1. getProductById - productId(특정 상품 ID) 조회
  2. getProductsByName - productName(상품명) 조회
  3. getProductsByCategory - categoryId(카테고리명) 조회

총 세 가지의 방법으로 상품을 조회할 수 있다.

쇼핑몰 환경에서는 상품 조회 요청이 빈번하게 발생할 수 있다고 생각했다. 이를 고려해서, 상품 정보를 캐싱하는 기능을 도입했다. 사용자가 상품을 조회할 때 캐싱된 정보를 효율적으로 반환하도록 로직을 최적화해보았다.


🖇 기존 로직 참고용 - products.controller.ts


2. 📌 캐싱을 위해 Redis 연결


📎 2-1. Redis 설정

왜 호출 한 번에 로그 두 번이 찍힐까요? - 2 - Redis 설정 관련 코드와 방법이 있습니다.


📎 2-2. Redis와 상호작용하는 서비스 생성

🖇 cache.service.ts

Redis와 상호작용하는 메서드를 제공하는 클래스를 작성해준다.

  • get : 주어진 키로 Redis에서 값을 가져옴
  • set : 주어진 키와 값을 Redis에 저장
  • del : 주어진 키와 관련된 값을 Redis에서 삭제

📎 2-3. CacheService 사용하기

🖇 products.service.ts - getProductById

getProductById, getProductsByName, getProductsByCategory 코드가 비슷해서
getProductById 코드만 기록해보려고 한다.

getProductById 로직은 다음과 같다

  1. 캐시로 상품 정보 조회
  2. 캐시로 상품 정보 조회 성공 시 로그 파일에 기록
  • productId, ProductName, categoryId 중 어떤 것으로 검색했는지
  • 조회한 시간
  1. 상품 정보가 캐싱되어있지 않을 경우, 데이터베이스에서 상품 정보 조회
  2. 캐시에 해당 상품 정보 저장 (만료 시간 : 1시간)

📎 2-4. Redis에 항상 최신 정보 저장

🖇 products.service.ts - updateProduct

사용자에게 항상 최신 정보를 제공하도록 상품 정보 업데이트 시 해당 상품, 해당 상품의 카테고리 캐시 삭제 하는 로직을 추가했다!

profile
닫혀 있어서 벽인 줄 알고 있지만, 사실은 문이다.

1개의 댓글

comment-user-thumbnail
2023년 8월 10일

많은 도움이 되었습니다, 감사합니다.

답글 달기