캐싱은 애플리케이션의 성능과 확장성을 향상시키는 기본 기술입니다. Nest.js에서는 내장된 캐시 관리자를 사용하여 캐싱을 원활하게 통합할 수 있습니다. 이 문서에서는 Nest.js 서비스 또는 컨트롤러에서 캐싱을 단순화하기 위해 사용자 정의 @Cacheable 데코레이터를 만드는 방법을 살펴보겠습니다.
Nest.js는 기본적으로 강력한 캐싱 메커니즘을 제공하지만 메서드 내에서 캐싱 논리를 직접 적용하면 코드가 복잡해질 수 있습니다. 사용자 정의 데코레이터는 이 논리를 추상화하여 코드를 더 깔끔하고 유지 관리하기 쉽게 만듭니다.
먼저 메소드 결과를 캐시하는 데 사용할 @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 데코레이터를 적용하는 방법은 다음과 같습니다.
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<Settings> { return await this.findAll(); } // ... other methods like findAll() and buildTree() }
애플리케이션에서 캐시 관리자를 사용하려면 모듈에 등록해야 합니다.
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 {}
@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 애플리케이션을 더욱 효율적이고 확장 가능하게 만듭니다.
아래에 의견이나 질문을 남겨주세요. 즐거운 코딩하세요! ?
위 내용은 맞춤 `@Cacheable` 데코레이터를 사용하여 Nest.js 성능 향상의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!