TypeScript의 Decorator를 활용하여 메타데이터 기반의 AOP(Aspect-Oriented Programming) 패턴을 구현할 때, 타입 안전성을 어떻게 확보할 수 있을까요? 특히 `reflect-metadata` 라이브러리와 함께 사용될 때, 컴파일 타임에 타입 정보를 활용하여 런타임에 메타데이터를 안전하게 주입하고 사용하는 방법에 대해 설명해주세요.
힌트 · `emitDecoratorMetadata` 컴파일러 옵션과 `reflect-metadata`를 통해 클래스, 메서드, 속성 등에 대한 타입 정보를 런타임에 조회할 수 있습니다. 이를 활용하여 데코레이터가 적용될 대상의 타입을 검사하고 적절한 로직을 수행하도록 설계할 수 있습니다.
모범답안
TypeScript 데코레이터를 활용한 AOP 구현 시 타입 안전성을 확보하는 방법은 크게 두 가지 측면에서 고려할 수 있습니다.
첫째, emitDecoratorMetadata 컴파일러 옵션과 reflect-metadata 라이브러리를 활용하여 런타임에 타입 정보를 얻습니다. 데코레이터 팩토리를 사용하여 데코레이터가 적용될 대상의 타입을 추론하고, 이를 기반으로 타입 가드를 적용하여 런타임에 타입 검사를 수행합니다. 예를 들어, 특정 타입의 인자만 허용하는 데코레이터를 만들 수 있습니다.
둘째, 제네릭 타입과 조건부 타입을 활용하여 데코레이터의 타입 안정성을 강화합니다. 데코레이터 팩토리에 제네릭 타입을 적용하여 데코레이터가 적용될 대상의 타입에 따라 다른 로직을 수행하도록 설계할 수 있습니다. 조건부 타입을 사용하여 특정 조건에 따라 데코레이터의 반환 타입을 변경할 수도 있습니다.
이러한 방법들을 통해 컴파일 타임에 타입 정보를 활용하여 런타임에 메타데이터를 안전하게 주입하고 사용할 수 있으며, TypeScript의 강력한 타입 시스템을 최대한 활용하여 AOP 구현의 타입 안전성을 확보할 수 있습니다.
읽었다면, 이제 직접 답해볼 차례예요
패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.
함께 보는 TypeScript 면접 질문
- 서드파티 라이브러리(예: `express` 또는 `lodash`)의 타입 정의가 불완전하거나, 애플리케이션 특정 요구사항에 맞춰 기존 타입을 확장해야 할 때, TypeScript에서 안전하고 모듈화된 방식으로 이를 처리하는 방법을 설명해주세요. 특히, 전역 선언 확장과 모듈 확장 간의 차이점 및 사용 시나리오를 비교하여 설명해주세요.
- 대규모 모노레포 환경에서 TypeScript 프로젝트를 관리할 때, 빌드 성능을 최적화하고 타입 의존성을 효율적으로 관리하기 위한 `tsconfig.json` 설정 전략에 대해 설명해주세요. 특히 `project references`의 도입 배경, 동작 방식, 그리고 이를 활용하여 얻을 수 있는 이점을 구체적인 예시와 함께 설명해주세요.
- 런타임에 동적으로 생성되는 데이터 스키마(예: JSON Schema)에 대해, 이를 기반으로 TypeScript 타입 추론을 수행하고 컴파일 타임에 유효성 검사를 강화하는 '타입 레벨 프로그래밍' 기법을 어떻게 적용할 수 있을까요? 특히, 타입 가드와 커스텀 유틸리티 타입을 활용하여 복잡한 데이터 구조의 안정성을 확보하는 방안을 제시해주세요.
- 중첩된 객체 구조에서 깊은(deep) 불변성(immutability)을 강제하는 TypeScript 타입을 어떻게 설계할 수 있을까요? 특히, 재귀적 타입 정의와 Mapped Types를 조합하여 모든 속성이 `readonly`인 중첩 객체 타입을 생성하는 고급 기법을 설명해주세요.
- TypeScript 4.0에서 도입된 Variadic Tuple Types를 활용하여, 인자의 개수나 타입이 동적으로 변하는 함수 시그니처를 어떻게 타입 안전하게 정의하고 활용할 수 있을까요? 특히, 함수 오버로드와 조합하여 유연하면서도 강력한 타입 추론을 제공하는 방법을 설명해주세요.