프로그래밍(Basic)/NestJS

[바미] NestJS - 데코레이터(Custom decorators)

Bami 2024. 3. 2. 09:40
728x90
반응형

데코레이터?

클래스, 메서드, 프로퍼티 또는 매개변수 전체에 대해 메타데이터를 정의하는 간단한 표현입니다.

이 메타데이터는 클래스나 메서드 등의 행동을 변경하거나 확장하기 위해 사용하고 있죠.

 

사용법

 @ 기호를 사용하여 특정 요소에 적용해주는데 NestJS에서는 다양한 데코레이터를 사용하여 클래스, 메서드 등을 정의하고 구성하고 정의 하는데 사용하고 있어요.


예시 코드

클래스 데코레이터로 사용하기

function Logger(prefix: string) {
  return function (target: Function) {
    console.log(`${prefix} - ${target.name} created.`);
  }
}

@Logger('Controller')
class MyController {
  // 클래스 내용
}

 

클래스 데코레이터인 Logger를 만들어 클래스가 생성될 때마다 해당 클래스의 이름과 접두사를 로그에 출력하도록 만들 수 있어요.

메서드 데코레이터로 만들어 사용하기

function Log(target: any, key: string, descriptor: PropertyDescriptor) {
  const originalMethod = descriptor.value;
  descriptor.value = function (...args: any[]) {
    console.log(`Calling method ${key} with arguments: ${args}`);
    return originalMethod.apply(this, args);
  };
  return descriptor;
}

class MyClass {
  @Log
  myMethod() {
    // 메서드 내용
  }
}

 

메서드 데코레이터 Log를 만들어 메서드가 호출될 때마다 해당 메서드의 이름과 전달된 인수를 로그에 출력하고, 원래 메서드를 실행하도록 만들 수 있어요.

 

프로퍼티 데코레이터로 만들어 사용하기

function ReadOnly(target: any, key: string) {
  Object.defineProperty(target, key, {
    writable: false
  });
}

class MyClass {
  @ReadOnly
  readonly myProperty: string = 'read-only';
}

 

프로퍼티 데코레이터 ReadOnly를 만들어서 해당 프로퍼티를 읽기 전용으로 만들어 값을 변경할 수 없도록 사용할 수 있어요.


지금까지 NestJS의 데코레이터에 대해 간단하게 알아보았습니다. 

 

데코레이터를 사용하여 클래스, 메서드, 프로퍼티 등을 더욱 유연하게 정의하고 확장할 수 있고, 코드를 더 명확하게 구성하고 기능을

확장하기 쉽게 만들어 주는 강력한 도구라는 걸 알 수 있죠.

 

처음 NestJS를 배울 때 저 데코레이터의 개념이 익숙하지 않았는데 이 글을 보시고 데코레이터에 대한 이해에 도움이 되셨길 바랍니다.

728x90
반응형