제목 : tsconfig.json 안의 데코레이터 활성 옵션들
나는 프로그래머스 부트캠프에서 NestJS 프로젝트를 진행 할 때,
Nest CLI 를 통해서 프로젝트 생성, 및 컨트롤러, 서비스, 테스트 파일을 생성했다.
Nest CLI 를 통해서 프로젝트 관리를 할 경우,
굳이 구성 (config.json
파일들) 요소들을 건드릴 필요 없이, 곧바로 프로젝트 코드를 구성하면 되었다.
Node.js 를 통한 의존성 주입과 프로젝트 관리에 대한 정보가 부족하여 Udemy 에서 강의를 듣는데,
아예 npm
명령어를 이용하여 처음부터 프로젝트를 구성하게 됐다.
이 과정에서 tsconfig.json
파일을 직접 생성하여 옵션들을 넣게 되었는데,
완전히 처음 보는 옵션들이 있어, 이 옵션의 목적과 기능을 작성하려고 한다.
1. experimentalDecorators - 데코레이터 활성화
TC39 라는 정식 Typescript 사양 표준이 존재한다.
여기에 아직 작성되지 않고 사용되는 데코레이터들, EX - @Injectable(), ...
이 존재하는데,
NestJS 혹은 Angular 와 같은 어플리케이션에서 사용되는 옵션이라고 한다.
Javascript 에서는 공식적으로 지원되는 데코레이터들이 존재하는데,
특정 프레임워크에서 지정해서 사용하고, 아직 정식 사양으로 받아들여지지 않은 데코레이터들을 활성화 한다.
2. emitDecoratorMetadata - 데코레이터 메타데이터 인식
이는 컴파일 시, 데코레이터의 메타데이터도 같이 방출한다는 의미이다.
즉, Typescript 컴파일러가 .js
파일로 변환 할 때, 데코레이터용 메타데이터를 추가로 내보낸다는 의미이다.
공식문서 예시 :
function LogMethod(
target: any,
propertyKey: string | symbol,
descriptor: PropertyDescriptor
) {
console.log(target);
console.log(propertyKey);
console.log(descriptor);
}
class Demo {
@LogMethod
public foo(bar: number) {
// do nothing
}
}
const demo = new Demo();
Result
[LOG]: Demo: {}
[LOG]: "foo"
[LOG]: {
"writable": true,
"enumerable": false,
"configurable": true
}
공식 문서를 보면서 생각 해 보건대, 데코레이터로서의 역할을 다시 생각 해 보는 것 같다.
위의 예제를 보면서 느끼는 건데, 프록시 패턴과 유사하다고 생각이 든다.
물론, 진정한 프록시 패턴이란, 기존의 객체를 "대리" 하여 수행하는 것을 의미한다.
이 과정에서 추가적인 기능이 들어갈 수도 있으며, 기존 객체를 캡슐화하는 역할도 수행한다.
물론 데코레이터가 직접적으로 객체를 대리하는 것은 아니지만,
데코레이터를 통해서 클래스 객체에 접근하고,
내부 메서드 및 변수를 추출하여 특정 속성을 주입할 수도 있다는 것을 알게 되었다.
NestJS 에서는 DI (Dependency Injection - 의존성 주입),
AOP(Aspect Oriented Programming - 관점 지향 프로그래밍) 에 사용된다.
즉, 우리는 NestJS 에서 @Injectable()
, @Service()
, ... 와 같은 데코레이터를 사용 할 때,
프레임워크가 의존성을 자동으로 파악하도록 만들고 있다는 것이다.
그리고 이러한 데코레이터는 참조하고 있는 정보를 통해 로직의 전 후 부분에 무언가를 추가할 수도 있다.
참고 사이트
'Node.js > 잡다 지식' 카테고리의 다른 글
node.js 로 멀티 스레드 구현하기 (Worker) (0) | 2025.04.07 |
---|---|
package.json 과 package-lock.json 은 무엇일까? (0) | 2025.04.03 |
JavaScript, TypeScript 에서 진짜 Private 구현하기 (2) | 2025.03.31 |
tsconfig 옵션 의미 (with NestJS) (0) | 2025.03.28 |
타입스크립트와 데코레이터 - Typescript with Decorator (0) | 2025.03.26 |