0Pricing
TypeScript Academy · 강의

데코레이터 메타데이터

메타데이터 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 3단계 데코레이터 설명
  2. 데코레이터 메타데이터
  3. reflect-metadata와 설계 타입
  4. 데코레이터 프레임워크 구축
← TypeScript Academy(으)로 돌아가기