📌 1. 기존 상품 조회 로직
현재 진행중인 프로젝트에서는
- getProductById - productId(특정 상품 ID) 조회
- getProductsByName - productName(상품명) 조회
- 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 로직은 다음과 같다
- 캐시로 상품 정보 조회
- 캐시로 상품 정보 조회 성공 시 로그 파일에 기록
- productId, ProductName, categoryId 중 어떤 것으로 검색했는지
- 조회한 시간
- 상품 정보가 캐싱되어있지 않을 경우, 데이터베이스에서 상품 정보 조회
- 캐시에 해당 상품 정보 저장 (만료 시간 : 1시간)
📎 2-4. Redis에 항상 최신 정보 저장
🖇 products.service.ts - updateProduct
사용자에게 항상 최신 정보를 제공하도록 상품 정보 업데이트 시 해당 상품, 해당 상품의 카테고리 캐시 삭제 하는 로직을 추가했다!
많은 도움이 되었습니다, 감사합니다.