노트

TypeScript 데코레이터

Decorators

프런트엔드#ts#pattern · 연결된 개념 6개

쉽게 말하면

데코레이터는 클래스나 메서드 앞에 @ 표시를 붙여, 원래 코드를 고치지 않고 포장지를 한 겹 씌우거나 꼬리표를 다는 문법이에요. 검증 규칙이나 DI 등록 같은 일을 선언 한 줄로 해결해요.

비유가 깨지는 곳 포장은 메서드를 부를 때마다가 아니라 클래스가 정의될 때 한 번 일어나요. 또 레거시 experimentalDecorators와 TS 5.0 표준 데코레이터는 시그니처가 달라 섞어 쓸 수 없어요.

데코레이터(Decorator)는 클래스나 그 멤버 선언 앞에 @표현식을 붙여, 정의 시점에 대상을 감싸거나 메타데이터를 등록하는 문법이다. 기존 코드를 고치지 않고 기능을 덧붙인다는 점에서 데코레이터 패턴과 생각이 같다.

function Logger(prefix: string) {          // 데코레이터 팩토리: 인자를 받아 데코레이터를 반환
  return function (target: Function) { console.log(prefix, target.name) }
}
@Logger('LOG')
class Person {}
  • 언제 실행되나: 인스턴스를 만들 때가 아니라 클래스가 정의될 때 한 번 실행된다. 메서드를 부를 때마다 도는 이벤트 리스너가 아니다
  • 순서: 여러 개를 쌓으면 팩토리 호출은 위에서 아래로, 데코레이터 적용은 아래에서 위로 일어난다
  • 대표 용례: 메서드에 this를 묶어 주는 AutoBind, 속성에 검증 규칙을 등록하는 class-validator(@IsNotEmpty()), NestJS·Angular의 컨트롤러·DI(Dependency Injection) 등록. 프레임워크가 데코레이터로 정보를 모으는 방식은 의존성 주입 (DI)과 연결된다

두 가지 데코레이터 (2026 기준)

  • 레거시(experimentalDecorators): 옛 TC39(Ecma Technical Committee 39) 초안 기반. 클래스·메서드·접근자·속성·매개변수 데코레이터가 있고, 메서드는 (target, name, descriptor)를 받는다. NestJS 등 기존 생태계가 아직 이것을 쓴다
  • 표준(TS 5.0+): 플래그 없이 쓰는 ECMAScript 데코레이터. (value, context)를 받으며 매개변수 데코레이터는 없다. 둘은 시그니처가 달라 섞어 쓸 수 없다

파이썬의 같은 문법은 파이썬 데코레이터, 스프링에서 비슷한 일을 하는 프록시는 스프링 AOP 참고.

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • TypeScript 클래스 문법

    TypeScript는 JavaScript 클래스에 접근 제어자(Access Modifier), readonly, 추상 클래스(Abstract Class), 생성자 매개변수 프로퍼티(Parameter Properties) 같은 타입 수준 문법을 더한다. 이들은 컴파일 때 검사에만 쓰이고, 출력 JS에서는 대부분 사라진다.

  • type과 interface

    type(타입 별칭, Type Alias)과 interface는 둘 다 타입에 이름을 붙이는 방법이다. 객체 모양을 정의할 때는 대부분 바꿔 써도 되지만, 확장 방식과 표현 범위가 다르다.

  • 함수 오버로드와 시그니처

    함수 오버로드(Function Overloads)는 구현 하나 위에 호출 방식별 시그니처를 여러 개 선언해, 인자 조합에 따라 정확한 반환 타입이 추론되게 하는 TypeScript 기능이다.

  • 기본형 집착

    전화번호·금액·우선순위 같은 도메인 개념을 끝까지 문자열이나 숫자로만 다루는 냄새. 같은 검증과 포맷 코드가 여기저기 반복되고, 문자열로 모든 걸 표현하는 "stringly typed" 코드가 된다.

  • tsconfig 핵심 옵션

    tsconfig.json은 TypeScript 컴파일러(tsc)에게 어떤 파일을, 어떤 규칙으로 검사하고, 무엇을 출력할지 알려 주는 프로젝트 설정 파일이다. tsc --init으로 만들고, 이 파일이 있으면 tsc만 쳐도 프로젝트 전체를 컴파일한다(-w는 감시 모드, watch mode).

보기 옵션