nestJS decorator 네스트 데커레이터 대충 알아보기

jangdu·2023년 7월 1일
0

nest.js

목록 보기
4/11

Decorator

TS의 데커레이터는 자바에서 애너테이션이랑 비슷하다.
클래스, 메서드, 접근자, 프로퍼티, 매개변수에 적용 가능

사용자가 요청을 잘못 보낼 때, 네스트에서는 @데커레이터로 허용하는 값으로 보냈는지 검사한다.

class CreateUserDto {
  @IsEmail()
  @MaxLength(60)
  readonly email: string;
  
  @IsString()
  @Matches(/^[A-Za-z\d!@#$%^&*()]{8,30}$/)
  readonly password: string;
}

위 예시를 모면 이메일인지 아닌지 길이는 60자 이하로 검사하고
정규표현식에 적합한 string인지 검사한다.

tsconfig.json에서 experimentalDecorators 옵션이 true로 설정되야 사용 가능하다

데커레이터는 @deco이런 식으로 사용하는데,
deco는 데커레이팅된 선언에 대한 정보랑 같이 호출되는 함수다.

예를 들어보면


타입스크립트에서 지원하는 데커레이터는 총 5가지가 있다.

Class Decorator

클래스의 바로 앞에 선언되며, 생성자에 적용돼서 클래스 정의를 읽고 수정이 가능하다.

선언파일과 선언 클래스 안에는 사용할 수 없다.

// 클레스 데터레이터 팩터리
function classDecorator <T extends { new (...args: any[]): {} }> (constructor: T) {
  // 클래스데터레이터는 생성자를 리턴하는 함수다.
  return class extends constructor {
    reportingURL = 'http://www.ex.com';
  }
}

@classDecorator
class Report {
  type = 'report';
  title: string;
  constructor(t: string) {
    this.title = t
  }
}

const a = new Report('hello report')
console.log(a);

클래스 데커레이터는 생성자를 리턴하는 함수다.

위 클래스 데터레이터 팩터리는 생성자 타입을 (new (...args: any[]): {}) 상속받는 제네릭 타입 T를 가지는 생성자를 메서드의 인수로 전달한다.

이는 new키워드와 함께 어떤 형식의 인수들도 받을 수 있는 타입이다.

클래스 데커레이터가 적용되는 클래스는 reportingURL을 속성에 추가한다.

위 예시의 출력결과는

{type: 'report', title: 'hello report', reportingURL: 'http://www.ex.com'}

으로 선언되지 않은 속성이 추가된다.


Method Decorator

메서드 바로 앞에 선언.
메서드의 속성 프로퍼티에 적용되며, 메서드를 읽고 수정가능

메서드 데커레이터는 3개의 인수를 가진다.

  • 정적 멤버가 속한 클래스의 생서자 함수나 인스턴스 멤버에대한 클래스의 프로토타입
  • 멤버의 이름
  • 매개변수가 함수에서 어디서 선언되는지 인덱스
    메서드 데커레이터가 값을 반환하면, 해당 메서드의 속성설명자가 된다.

Parameter Decorator

매개변수 데커레이터는 생성자, 메서드의 파라미터에 적용된다.
호출 시 3가지 인수랑 같이 호출되는데, 반환값은 무시한다.

  • 정적 멤버가 속한 클래스의 생서자 함수나 인스턴스 멤버에대한 클래스의 프로토타입
  • 멤버의 이름
  • 매개변수가 함수에서 어디서 선언되는지 인덱스

선언 파일이나 클래스에는 사용못함.

profile
대충적음 전부 나만 볼래

0개의 댓글