"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 맞춤 `@Cacheable` 데코레이터를 사용하여 Nest.js 성능 향상

맞춤 `@Cacheable` 데코레이터를 사용하여 Nest.js 성능 향상

2024-11-01에 게시됨
검색:236

Enhance Your Nest.js Performance with a Custom `@Cacheable` Decorator

캐싱은 애플리케이션의 성능과 확장성을 향상시키는 기본 기술입니다. Nest.js에서는 내장된 캐시 관리자를 사용하여 캐싱을 원활하게 통합할 수 있습니다. 이 문서에서는 Nest.js 서비스 또는 컨트롤러에서 캐싱을 단순화하기 위해 사용자 정의 @Cacheable 데코레이터를 만드는 방법을 살펴보겠습니다.

? 사용자 정의 @Cacheable 데코레이터를 사용하는 이유는 무엇입니까?

Nest.js는 기본적으로 강력한 캐싱 메커니즘을 제공하지만 메서드 내에서 직접 캐싱 논리를 적용하면 코드가 복잡해질 수 있습니다. 사용자 정의 데코레이터는 이 논리를 추상화하여 코드를 더 깔끔하고 유지 관리하기 쉽게 만듭니다.

? @Cacheable 데코레이터 만들기

메서드 결과를 캐시하는 데 사용할 @Cacheable 데코레이터를 만드는 것부터 시작하겠습니다.

import { Cache } from 'cache-manager';

export function Cacheable(cacheKey: string) {
  return function (
    target: any,
    propertyName: string,
    descriptor: PropertyDescriptor,
  ) {
    const originalMethod = descriptor.value;

    descriptor.value = async function (...args: any[]) {
      const cache: Cache = this.cacheManager;

      if (!cache) {
        throw new Error(
          'Cannot use Cacheable() decorator without injecting the cache manager.',
        );
      }

      // Try to get cached data
      try {
        const cachedResult = await cache.get(cacheKey);
        if (cachedResult) {
          return cachedResult;
        }
      } catch (error) {
        console.error(`Cache get error for key: ${cacheKey}:`, error);
      }

      // Call the original method if cache miss
      const result = await originalMethod.apply(this, args);

      // Set the new result in cache
      try {
        await cache.set(cacheKey, result);
      } catch (error) {
        console.error(`Cache set error for key: ${cacheKey}:`, error);
      }

      return result;
    };

    return descriptor;
  };
}

? 설명

  • 캐시 검색: 원래 메서드를 실행하기 전에 데코레이터는 결과가 이미 캐시되었는지 확인합니다.
  • 캐시 미스 처리: 결과가 캐시에 없으면 원래 메서드를 실행한 후 결과를 캐시합니다.
  • 오류 처리: 캐시 검색 또는 설정 중 오류를 포착하고 기록하여 캐싱 문제로 인해 애플리케이션이 충돌하지 않도록 합니다.

? @Cacheable 데코레이터 사용

@Cacheable 데코레이터를 서비스의 메서드에 적용하는 방법은 다음과 같습니다.

import { Injectable } from '@nestjs/common';
import { Cacheable } from './cacheable.decorator';

const SETTING_CACHE_KEY = 'settings';

@Injectable()
export class SettingsService {
  // Inject the cache manager
  constructor(private readonly cacheManager: Cache) {}

  /**
   * Retrieves settings from the cache if available, or loads them from the
   * repository and caches the result.
   *
   * @returns A promise that resolves to a `Settings` object.
   */
  @Cacheable(SETTING_CACHE_KEY)
  async getSettings(): Promise {
    return await this.findAll();
  }

  // ... other methods like findAll() and buildTree()
}

? 설명

  • 데코레이터 애플리케이션: @Cacheable 데코레이터는 특정 캐시 키를 사용하여 getSettings() 메서드에 적용됩니다.
  • 종속성 주입: 캐시 관리자는 데코레이터가 사용할 서비스에 주입됩니다.

? Nest.js에 캐시 관리자 통합

애플리케이션에서 캐시 관리자를 사용하려면 모듈에 등록해야 합니다.

import { Module } from '@nestjs/common';
import { CacheModule } from '@nestjs/cache-manager';
import { SettingsService } from './settings.service';

@Module({
  imports: [
    CacheModule.register({
      isGlobal: true,
      ttl: 300, // Time to live in seconds
      max: 100, // Maximum number of items in cache
    }),
  ],
  providers: [SettingsService],
})
export class AppModule {}

? 설명

  • 글로벌 캐시: isGlobal: true로 설정하면 애플리케이션 전체에서 캐시 관리자를 사용할 수 있습니다.
  • TTL 및 최대 항목: 캐시의 TTL(Time-To-Live) 및 최대 항목 수(max)를 구성합니다.

? 캐시 관리자 주입

@Cacheable 데코레이터를 사용하는 모든 서비스나 컨트롤러에 캐시 관리자를 삽입했는지 확인하세요.

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

@Injectable()
export class SettingsService {
  constructor(private readonly cacheManager: Cache) {}

  // ... your methods
}

? 결론

사용자 정의 @Cacheable 데코레이터를 생성하면 메서드를 깔끔하게 유지하고 핵심 로직에 집중할 수 있으며 캐싱 문제는 데코레이터에 맡길 수 있습니다. 이 접근 방식은 코드 가독성과 유지 관리성을 향상시켜 Nest.js 애플리케이션을 더욱 효율적이고 확장 가능하게 만듭니다.

아래에 의견이나 질문을 남겨주세요. 즐거운 코딩하세요! ?

릴리스 선언문 이 기사는 https://dev.to/marrouchi/enhance-your-nestjs-performance-with-a-custom-cacheable- decorator-589o?1에서 복제됩니다.1 침해가 있는 경우에는 [email protected]으로 문의하시기 바랍니다. 그것을 삭제하려면
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3