OPEN HYPER STEP
← 목록으로 (TypeScript)
TS · 17 / 34
ts
CHAPTER 17 / 34
읽기 약 2
SYNTAX

데코레이터 해부: 메타프로그래밍


핵심 개념

데코레이터는 @로 시작하며 클래스, 메서드, 속성에 메타데이터를 추가합니다. experimentalDecorators 옵션이 필요합니다. 클래스 데코레이터, 메서드 데코레이터, 속성 데코레이터, 매개변수 데코레이터가 있습니다. Angular, NestJS에서 활발히 사용됩니다. 데코레이터를 지우며 메타 시스템이 어떻게 사라지는지 확인하십시오.

코드 분석
TS📋 코드 (39줄)
// 데코레이터 패턴 시뮬레이션 (JS로)
  function Injectable(target) {
    target._injectable = true;
    return target;
  }

  function Log(target, key, descriptor) {
    const original = descriptor.value;
    descriptor.value = function(...args) {
      console.log(`[LOG] ${key} 호출됨`, args);
      return original.apply(this, args);
    };
    return descriptor;
  }

  // @Injectable 시뮬레이션
  class MissionService {
    execute(target) { return `${target} 임무 실행`; }
  }
  Injectable(MissionService);

  const service = new MissionService();
  const descriptor = Object.getOwnPropertyDescriptor(MissionService.prototype, 'execute') || { value: service.execute };
  // Log 데코레이터 적용

  const results = [
    `@Injectable: _injectable = ${MissionService._injectable}`,
    `메서드 실행: ${service.execute('T-800')}`,
    '@Log: 콘솔에 호출 로그 출력됨',
    '@Component, @NgModule: Angular 패턴',
    '@Controller, @Get: NestJS 패턴',
  ];

  results.forEach(r => {
    const el = document.createElement('div');
    el.style.color = '#888'; el.style.fontSize = '11px'; el.style.marginBottom = '4px';
    el.textContent = r;
    document.currentScript.parentElement.appendChild(el);
  });

AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude

무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6

이 TS '데코레이터' 코드에서
타입 에러·any 남용·타입 안전성 누락을 찾아
엄격한 타입으로 리팩토링해줘.
ChatGPT

무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro

'데코레이터'를 실무에서 사용하는
패턴 3가지를 비교표로 보여주고
각각의 적합한 케이스를 알려줘.
Gemini

무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro

이 TS '데코레이터' 관련 코드 전체의 타입 구조를
분석하고 제네릭·유틸리티 타입으로
개선할 포인트를 정리해줘.
Grok

무료: Grok 4.1 / SuperGrok $30/mo

TypeScript '데코레이터'를 꼭 써야 하는지
개발 속도 vs 안전성 관점에서
솔직하게 평가해줘.

⭐ 이것만 기억하세요
데코레이터 해부: 메타프로그래밍 이 3가지만 확실히 잡으세요
1.로깅·인증·캐싱 같은 횡단 관심사를 매 메서드마다 반복 구현하면 핵심 로직이 부수 코드에 묻힙니다
2.데코레이터는 @함수명으로 클래스·메서드·프로퍼티에 부착하며, 원본을 수정하지 않고 동작을 확장합니다
3.다음 챕터에서 코드를 파일 단위로 분리하는 모듈과 네임스페이스를 배웁니다


공유하기
진행도 17 / 34