Skip to main content

NestJs - MetaData

NestJs - 메타데이터 & Reflection

Reflector & MetaData

개요

Nest는 Reflector 라이브러리의 createDecorator 메소드와 기본 포함된 @SetMetadata 데코레이터를 활용해 생성한 데코레이터들이 Route Handler에 Custom 메타데이터를 적용할 수 있도록 허용한다.

CreateDecorator

createDecorator 메소드를 사용해서 강타입 데코레이터를 생성하려면, 매개변수의 타입을 명시해야한다. 예를 들어 Roles 데코레이터를 생성할 때, @Roles 데코레이터의 매개변수가 어떤 타입을 받을 건지 (ex. Role enum 타입의 array를 받을건지, string 타입의 array를 받을건지 ) 제네릭을 통해 명시해줘야한다.


/**
* 권한 체킹 Role 데코레이터
*
* @example @Roles(['ADMIN'])
* @example @Roles([ Role.ADMIN ])
**/
export const Roles = Reflector.createDecoorator<string[] | Role[]>();

해당 Roles 데코레이터를 API Controller 메소드 위에 추가하게되면, 추가된 메소드에 Roles 데코레이터의 메타데이터가 추가되고, @Roles 데코레이터 사용시 추가한 Role만 해당 메소드의 엔드포인트에 접근할 수 있게 된다. Roles 메타데이터가 추가된 메소드에 접근하려면 Reflector를 사용해야한다. Reflectorget 메소드를 사용해서 Role의 메타데이터에 접근할 수 있다.

@SetMetadata

MetaData를 추가해야할 때마다 CreateDecorator 메소드를 사용해 데코레이터를 매번 생성하는 대신에 @SetMetadata로 바로 메타데이터의 추가가 가능하다. 하지만, 데코레이터 패턴을 사용하는 것이 더 깔끔하고 가독성이 좋으므로 데코레이터 패턴을 권장한다.