[NestJS] 캐시 관리: cacheKey와 cacheData

혜진·2024년 11월 12일
0

NestJS

목록 보기
11/12
post-thumbnail

NestJS 캐시 관리: cacheKey와 cacheData

cacheKey

캐시 시스템에서 특정 데이터를 식별하기 위해 사용되는 고유한 키로, 이를 통해 캐시에서 데이터를 검색하고 조회할 수 있다.

cacheData

cacheKey를 통해 캐시에서 조회한 실제 데이터를 의미한다. 이 데이터는 로그인 상태나 인증 정보 등 다양한 정보를 포함할 수 있다.

캐시 시스템의 동작 예시

  1. 사용자는 고유한 loginUniqueID를 포함한 로그인 요청을 보낸다.
  2. loginUniqueID를 사용하여 cacheKey를 생성한다. ex) 'telegram-login-12345'.
  3. 캐시 시스템은 cacheKey를 사용하여 해당 데이터를 캐시에서 조회한다.
  4. cacheData가 존재하면 데이터를 반환하고, 없으면 undefined을 반환한다.
  5. cacheData가 undefined 이면 로그인 요청이 유효하지 않다고 판단하고 UnauthorizedException을 발생시킨다.

캐시 사용의 장점

  • 성능 향상: 자주 사용하는 데이터를 캐시에 저장하면, 데이터베이스나 외부 시스템에서 다시 조회할 필요 없이 빠르게 데이터를 가져올 수 있다.
  • 서버 부하 감소: 캐시를 사용하면 반복적인 데이터 조회를 피할 수 있어 시스템의 부하를 줄일 수 있다.
  • 응답 시간 단축: 캐시에서 직접 데이터를 가져오기 때문에 응답 시간이 단축된다.

cacheKey와 cacheData 유효성 검사

  1. 유효 기간 (TTL, Time-To-Live) 설정
    캐시된 데이터에는 유효 기간(TTL, Time-To-Live)이 설정된다. 이 시간 동안 캐시된 데이터는 유효하게 사용될 수 있다. TTL이 만료되면, 해당 데이터는 자동으로 만료되고 더 이상 유효하지 않게 된다. 만료된 데이터는 캐시에서 undefined로 반환되어 사용할 수 없게 된다.

  2. 유효성 검사 절차
    데이터를 캐시에서 조회할 때, cacheKey로 해당 데이터를 요청한다.
    만약 cacheData가 undefined이면,
    1) 캐시된 데이터가 존재하지 않음
    2) 캐시된 데이터가 만료됨
    이 경우, 캐시에서 데이터를 다시 계산하거나 데이터베이스에서 다시 조회하는 등의 처리가 필요하다.

  3. 유효성 검사 예시
    캐시된 데이터가 유효한지 확인하려면 cacheData를 조회한 후 undefined인지 체크해야 한다.
    ex) 캐시가 만료되었다면 새로운 데이터를 가져와야 할 수 있다.

📑 NestJS에서 캐시 시스템 사용 예시

import { Injectable, UnauthorizedException } from '@nestjs/common';
import { CacheManagerService } from './cache-manager.service'; // 가상의 캐시 관리 서비스

@Injectable()
export class TelegramAuthService {
  constructor(private readonly cacheManager: CacheManagerService) {}

  // 로그인 요청 검증
  async validateLogin(loginUniqueID: string) {
    const cacheKey = `telegram-login-${loginUniqueID}`;  // cacheKey 생성
    const cacheData = await this.cacheManager.get(cacheKey);  // 캐시에서 데이터 조회

    if (!cacheData) {
      throw new UnauthorizedException('Invalid login request');  // 캐시 데이터 없으면 예외 발생
    }

    return cacheData;  // 로그인 유효성 검증 성공 시 데이터 반환
  }
}

CacheManagerService

캐시 데이터를 관리하는 서비스로, get(), set(), del() 등의 메서드를 통해 데이터를 조회하고 저장한다.

📑 CacheManagerService 예시 구현

import { Injectable } from '@nestjs/common';
import { Cache } from 'cache-manager';  // CacheManager 사용

@Injectable()
export class CacheManagerService {
  private cache: Cache;

  constructor() {
    // 메모리 캐시 사용 (TTL: 300초 = 5분)
    this.cache = require('cache-manager').caching({ store: 'memory', ttl: 300 });
  }

  // cacheKey로 데이터를 가져오는 메서드
  async get(cacheKey: string): Promise<any> {
    return await this.cache.get(cacheKey);
  }

  // cacheKey로 데이터를 저장하는 메서드
  async set(cacheKey: string, value: any, ttl: number = 300): Promise<void> {
    await this.cache.set(cacheKey, value, { ttl });
  }

  // 캐시에서 데이터를 삭제하는 메서드
  async del(cacheKey: string): Promise<void> {
    await this.cache.del(cacheKey);
  }
}

0개의 댓글