데코레이터 메타데이터
메타데이터 API로 메타데이터를 연결하고 읽습니다.
데코레이터 메타데이터은(는) CoddyKit의 무료 TypeScript Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 TypeScript Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
데코레이터 메타데이터 API
표준화된 데코레이터에는 내장된 메타데이터 채널이 포함됩니다. 문맥 객체는 기록할 수 있는 metadata 객체를 제공하며, 클래스는 나중에 미리 정해진 Symbol.metadata 키 아래에 이 객체를 담습니다.
context.metadata
모든 데코레이터 컨텍스트는 정의 중인 클래스에 대해 하나의 metadata 객체를 공유합니다. 데코레이터는 여기에 데이터를 추가하고, 이 객체가 클래스 메타데이터가 됩니다.
function tag(label: string) {
return function (value: any, context: DecoratorContext) {
context.metadata[context.name] = label;
};
}Symbol.metadata를 통한 읽기
클래스가 정의된 후에는 수집된 메타데이터를 SomeClass[Symbol.metadata]에서 사용할 수 있습니다.
class User {
@tag("identifier") id = 0;
@tag("display") name = "";
}
const meta = (User as any)[Symbol.metadata];
console.log(meta); // { id: "identifier", name: "display" }객체를 공유하는 이유
클래스의 모든 데코레이터가 동일한 metadata 객체에 기록하므로, 여러 데코레이터의 정보를 하나의 일관된 클래스 설명 레코드에 누적할 수 있습니다.
구조화된 메타데이터 저장
메타데이터 값은 어떤 형태든 될 수 있습니다. 일반적인 패턴은 멤버 이름을 키로 사용하는 중첩 레코드를 유지하는 것입니다.
function column(type: string) {
return function (value: any, context: ClassFieldDecoratorContext) {
const md = context.metadata as any;
md.columns ??= {};
md.columns[context.name] = { type };
};
}클래스 수준 메타데이터
클래스 데코레이터도 메타데이터를 기록할 수 있습니다. 예를 들어 필드별 열 정보와 함께 사용할 테이블 이름을 저장할 수 있습니다.
function entity(table: string) {
return function (value: Function, context: ClassDecoratorContext) {
(context.metadata as any).table = table;
};
}
@entity("users")
class UserEntity {
@column("serial") id = 0;
@column("text") name = "";
}메타데이터 상속
메타데이터 객체는 프로토타입 체인을 따라 연결됩니다. 하위 클래스의 메타데이터 객체가 부모 메타데이터를 프로토타입으로 가지므로, 재정의되지 않은 상속된 항목도 표시됩니다.
Symbol.metadata 폴리필
Symbol.metadata는 잘 알려진 심벌입니다. 이 심벌이 없는 환경에서는 폴리필을 할당하여 실행 환경이 수집된 객체를 연결할 수 있도록 합니다.
(Symbol as any).metadata ??= Symbol.for("Symbol.metadata");reflect-metadata 없이 메타데이터 사용하기
이 API는 데코레이터 제안 자체의 일부이므로 별도의 reflect-metadata 라이브러리가 필요하지 않습니다. 해당 라이브러리는 이전의 실험적 설계 타입 방출 방식에서만 여전히 관련이 있습니다(다음 레슨에서 다룹니다).
실용적인 읽기 도우미
작은 접근자 하나로 모든 클래스에서 메타데이터를 읽는 작업을 한곳에 모을 수 있으며, 메타데이터가 없으면 빈 객체를 반환합니다.
function getMeta(cls: any): Record<string, any> {
return (cls[Symbol.metadata] as Record<string, any>) ?? {};
}중요한 이유
메타데이터를 사용하면 데코레이터가 일회성 동작 래퍼에서 클래스의 선언적 설명으로 바뀝니다. 프레임워크는 이 설명을 읽어 실행 중 리플렉션을 사용하는 편법 없이 ORM, 유효성 검사기, 라우터를 구성합니다.
빠른 확인
메타데이터 API를 제대로 이해했는지 확인해 보세요.
복습
데코레이터의 메타데이터 API는 모든 데코레이터에 공유 context.metadata 객체를 제공하며, 클래스에서는 Symbol.metadata를 통해 이 객체에 접근할 수 있습니다. 데코레이터는 외부 라이브러리 없이 구조화되고 상속 가능한 메타데이터를 누적하여, 선언적이고 프레임워크에 친화적인 클래스 설명을 가능하게 합니다.
자주 묻는 질문
“데코레이터 메타데이터” 강의는 무료인가요?
네 — “데코레이터 메타데이터” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 TypeScript Academy 강의 전체를 잠금 해제할 수 있습니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“데코레이터 메타데이터”에서 뭘 배우나요?
메타데이터 API로 메타데이터를 연결하고 읽습니다. 브라우저에서 직접 실행하는 실습 코드로 TypeScript Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
TypeScript Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 TypeScript Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“데코레이터 메타데이터” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 TypeScript Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 TypeScript Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.