캐싱은 애플리케이션의 성능과 확장성을 향상시키는 기본 기술입니다. 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{ 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 애플리케이션을 더욱 효율적이고 확장 가능하게 만듭니다.
아래에 의견이나 질문을 남겨주세요. 즐거운 코딩하세요! ?
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3