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
를 사용해야한다. Reflector
의get
메소드를 사용해서 Role의 메타데이터에 접근할 수 있다.
@SetMetadata
MetaData를 추가해야할 때마다 CreateDecorator
메소드를 사용해 데코레이터를 매번 생성하는 대신에 @SetMetadata
로 바로 메타데이터의 추가가 가능하다. 하지만, 데코레이터 패턴을 사용하는 것이 더 깔끔하고 가독성이 좋으므로 데코레이터 패턴을 권장한다.