decorator란?
데코레이터는 주로 클래스, 메서드, 매개변수등의 요소에 추가적인 동작을 부여하가 위해 사용되는 것으로
주로 @와 함께쓰이며 프레임워크들은 자체적으로 많은 데코레이터를 미리 정의하여 제공한다.
프레임워크는 데코레이터를 이용해 코드를 더 모듈화하고 재사용성을 높이며. 코드의 의도를 더 명확히 전달한다.
nestjs 제공 데코레이터 : @Controller(), @Injectable(), @Middleware() 등
사용자 정의 데코레이터란?
개발자 직접 정의하는 데코레이터로 이를 통해 특정 동작을 추가하거나 기존 기능을 확장한다.
주로 인증 및 권한 부여, 캐싱, 로깅 및 모니터링. 유효성 검사, 전역 에러 처리 등에 사용된다.
nestjs에선 데코레이터는 함수 형태로 작성되며 @nestjs/common의 createParamDecorator함수를 사용해 정의한다. (고 공식문서에 나와있다.)
그럼 createParamDecorator는 뭘까?
먼저 프로젝트에사용한 현재 요청의 id값을 반환하는 커스텀 데코레이터를 정의한 코드이다.

여기서 createParamDecorator는 data, ctx를 매개변수로 받는다.
data는 데코레이터에 전달된 데이터이고, ctx는 현재 http 요청 객체이다.
ctx는 ExecutionContext 타입으로 http, websocket, rpc 프로토콜 정보를 가져올 수 있다.
이 매개변수를 이용해 필요한 값을 가공하여 반환하여 데코레이터를 정의하는 것이다.
이렇게 정의된 데코레이터는 아래처럼 사용할 수 있다.

이게 기본적인 커스텀데코레이터 사용법이다.
데코레이터와 메타데이터
이것저것 찾아보니 데코레이터가 사용되는 것 중 메타데이터 설정에 관한 내용이 많이 보였다.
이것도 정리해 보겠다.
메타데이터란?
메타데이터는 데이터에 대한 데이터로, 주어진 데이터의 설명, 의미, 구조, 특성을 포함하는 정보이다.
NestJs는 메타데이터를 사용하여 애플리케이션의 다양한 부분에서 부가적인 정보를 제공하고 처리한다.
NestJs는 메타데이터를 설정하는 SetMetadata 함수를 정의하고 있고 아래처럼 사용한다.
예시로 설명을 해보면
유저를 생성하는 create메서드를 role이 admin만 가능하게 하고 싶다고 가정하자
이때 create는 admin만 사용 가능하다는 정보가 메타데이터이다.
즉 @SetMetadata를 통해 create 메서드는 role이 admin일때만 호출한다 라는 메타데이터를 지정할 수 있다.
메타데이터 등록
SetMetadata는 key와 value를 매개변수로 받아 메타데이터로 등록하는데
직접 바로 메타데이터를 key와 value로 등록하면 아래와 같다.

하지만 보통 의미적으로 보기 좋게 커스텀 데코레이터로 정의해서 사용한다고 한다.


이렇게 해주면 createLetter는 admin이라는 role을 가진 메타 데이터를 가지게 된다.
메타데이터 적용
Nestjs에선 메타데이터를 읽는 Reflector클래스를 지원한다.
그럼 role을 검증하는 guard를 만들어 메타데이터를 적용 해보겠다. guard에 Reflector를 주입하여 사용한다.

메타데이터 사용하는 이유
그냥 로직에서 확인해도 되는거 아니야? 라는 생각도 들었다.
로직에서 직접 역하을 처리할 경우 코드도 길어지고 복잡해진다.
그래서 메타데이터를 이용해 역할정보와 코드를 분리하여 가독성과 유지보수성을 높일 수 있다.
또한 메타데이터를 사용하면 역할 정보를 동적으로 변경하고 확장하기 쉽다.
메타데이터를 변경하거나 새로운 역할을 추가하는 것만으로 코드변경 없이 역할 관리가 가능하다.
https://rondeveloper.tistory.com/76
[NestJS] 커스텀 데코레이터 만들기
데코레이터란? 데코레이터는 대다수의 프로그래밍 언어에 사용되는 잘 알려진 개념이지만 JavaScript 세계에서는 도입된지 얼마되지 않은 개념이라고 합니다. 데코레이터에 대해 공식 문서에서는
rondeveloper.tistory.com
https://toss.tech/article/nestjs-custom-decorator
NestJS 환경에 맞는 Custom Decorator 만들기
NestJS에서 데코레이터를 만들기 위해서는 NestJS의 DI와 메타 프로그래밍 환경 등을 고려해야 합니다. 어떻게 하면 이러한 NestJS 환경에 맞는 데코레이터를 만들 수 있을지 고민해보았습니다.
toss.tech
https://assu10.github.io/dev/2023/04/23/nest-reflection-metadata/
NestJS - Metadata(Reflection Class)
이 포스트는 NestJS 에서 빌드 타임에 선언해 둔 메타데이터를 활용하여 런타임에 동작을 제어할 수 있는 Metadata 에 대해 알아본다.
assu10.github.io
'Nest' 카테고리의 다른 글
| [Nest] passport (0) | 2024.03.04 |
|---|---|
| [Nest] nest guard (0) | 2024.02.29 |
| [Nest] NestJs 구조 (0) | 2024.01.29 |
| [Nest] NodeJs Event Loop (0) | 2024.01.26 |
| [Nest] Node.js 특징 (single Thread, Nonblocking) (0) | 2024.01.15 |