---
category: Other
tags: [auto-wikified, technical-documentation, other]
title: Decorators
description: "데코레이터(Decorators)는 클래스, 메서드, 프로퍼티 등에 메타데이터를 추가하여 동작을 정의하거나 의존성을 주입하는 설계 패턴 및 문법적 기능입니다 [1-3]."
last_updated: 2026-05-04
---

# Decorators

## 📌 Brief Summary
데코레이터(Decorators)는 클래스, 메서드, 프로퍼티 등에 메타데이터를 추가하여 동작을 정의하거나 의존성을 주입하는 설계 패턴 및 문법적 기능입니다 [1-3]. 특히 NestJS와 같은 프레임워크에서 모듈, 컨트롤러, 서비스를 구성하는 핵심 아키텍처 요소로 활용되며 [3], 애플리케이션의 횡단 관심사(Cross-Cutting Concerns)를 비즈니스 로직과 분리하여 제어하는 데 유용하게 쓰입니다 [4, 5].

## 📖 Core Content
* **NestJS의 핵심 아키텍처 요소**: NestJS는 타입스크립트 데코레이터(`@Module()`, `@Controller`, `@Get`, `@Injectable` 등)를 적극적으로 사용하여 애플리케이션의 의존성 주입(DI) 컨테이너를 구성합니다 [2, 3, 6, 7]. 모듈은 `@Module()`로 주석이 달린 클래스이며, 프레임워크는 이를 통해 애플리케이션의 구조와 관계를 파악합니다 [2].
* **데이터 모델링 및 문서 자동화**: DTO(Data Transfer Object)나 엔티티(Entity) 클래스에 데코레이터를 적용하여 TypeORM, Prisma, Drizzle 등의 ORM과 연동할 수 있습니다 [1]. 또한, 데코레이터와 DTO를 기반으로 Swagger/OpenAPI 문서를 실제 코드와 동기화하여 자동 생성하는 기능도 제공합니다 [8, 9].
* **GraphQL 스키마 생성**: NestJS의 `@nestjs/graphql` 모듈에서는 데코레이터를 활용한 코드 우선(Code-first) 접근 방식을 지원합니다 [10]. 클래스에 데코레이터를 추가하는 것만으로 GraphQL 타입과 스키마를 자동으로 생성할 수 있습니다 [11].
* **횡단 관심사(Cross-Cutting Concerns)의 분리**: 도메인 로직과 무관한 인프라 측면의 기능(로깅, 인증, 캐싱 등)을 분리할 때 데코레이터가 활용됩니다 [4]. 예를 들어, Django 프로젝트에서는 커스텀 권한(permissions)을 처리하거나 미들웨어와 함께 횡단 관심사의 흐름을 제어하기 위해 데코레이터를 설계 패턴으로 적용합니다 [5, 12].

## ⚖️ Trade-offs & Caveats
* **학습 곡선의 증가**: Express와 같이 제약이 적고 단순한 미니멀리즘 프레임워크에 익숙한 개발자에게는 데코레이터, 의존성 주입(DI), 모듈 시스템 등의 개념이 낯설 수 있으며 이를 익히기 위한 초기 학습 곡선이 가파릅니다 [6, 9].
* **프레임워크 오버헤드**: NestJS의 경우 데코레이터와 의존성 주입(DI) 계층으로 인해 순수한 Express에 비해 약 10~15% 정도의 처리량(Throughput) 감소라는 성능 오버헤드가 발생합니다 [13]. 다만, 프로덕션 환경의 데이터베이스 쿼리나 네트워크 지연 시간에 비하면 이는 대부분 무시할 수 있는 수준입니다 [13].
* **과도한 보일러플레이트 작성**: 소규모 팀이나 간단한 프로젝트에서는 모듈을 선언하고, DTO를 만들고, 엔티티에 데코레이터를 부착하는 구조화 작업 자체가 실제 비즈니스 로직 작성보다 더 많은 시간과 비용을 요구하는 기술 부채(Technical Debt)나 과잉 엔지니어링이 될 수 있습니다 [14, 15].
* **전역 남용의 위험**: NestJS에서 교차 절단 관심사에 `@Global()` 데코레이터를 사용할 수 있지만, 이를 과도하게 남용할 경우 모듈 시스템이 해결하고자 했던 "모든 것이 어디서나 접근 가능해지는 문제"를 다시 발생시킬 수 있으므로 주의해서 사용해야 합니다 [16].

---
*Last updated: 2026-05-03*