프로그래밍/Typescript

TypeScript의 클래스 데코레이터: 메타프로그래밍의 힘

shimdh 2025. 4. 13. 10:15
728x90

TypeScript는 강력한 타입 시스템과 함께 메타프로그래밍을 지원하는 기능을 제공합니다. 그 중에서도 클래스 데코레이터는 개발자가 코드의 구조와 동작을 유연하게 조정할 수 있도록 돕는 중요한 도구입니다. 이번 포스트에서는 클래스 데코레이터의 기본 개념부터 고급 활용 예제까지 자세히 살펴보겠습니다.

1. 클래스 데코레이터의 기본 개념

클래스 데코레이터는 함수로 구현되며, 다음과 같은 파라미터를 가집니다:

  • target: 데코레이트될 클래스의 생성자 함수입니다. 이 파라미터를 통해 클래스의 메타데이터에 접근하거나, 클래스의 프로토타입을 수정하는 등의 작업을 수행할 수 있습니다.

클래스 데코레이터를 사용하면 새로운 클래스를 생성하거나 기존 클래스를 수정할 수 있으며, 이를 통해 코드의 재사용성과 유지보수성을 높일 수 있습니다. 특히 대규모 애플리케이션에서 코드의 일관성을 유지하는 데 중요한 역할을 합니다.

2. 간단한 예제

기본적인 클래스 데코레이터의 예시를 살펴보겠습니다:

function Logger(constructor: Function) {
    console.log("클래스가 생성되었습니다:", constructor);
}

@Logger
class User {
    constructor(public name: string) {}
}

const user = new User("Alice");

위 코드에서 Logger라는 함수를 정의하고 이를 User 클래스에 적용했습니다. 이 경우 User 클래스를 인스턴스화할 때마다 콘솔에 "클래스가 생성되었습니다:"라는 메시지가 출력됩니다. 이처럼 간단한 데코레이터를 통해 클래스의 생성 과정을 추적할 수 있으며, 이는 디버깅이나 로깅에 유용하게 활용될 수 있습니다.

3. 고급 활용 예제

클래스 데코레이터를 사용하여 특정 속성을 추가하거나 변경할 수도 있습니다. 아래 예시는 새로운 속성을 추가하는 방법을 보여줍니다:

function AddAge(target: Function) {
    target.prototype.age = 30; // 나이를 추가합니다.
}

@AddAge
class Person {
    constructor(public name: string) {}
}

const person = new Person("Bob");
console.log(person.age); // 출력: 30

여기서 AddAge라는 데코레이터를 통해 모든 Person 인스턴스에 age라는 속성이 자동으로 추가되고 초기값이 설정됩니다. 이와 같은 방식으로 클래스의 프로토타입에 속성을 추가함으로써, 객체의 상태를 보다 쉽게 관리할 수 있습니다.

4. 여러 개의 데코레이터 조합하기

TypeScript에서는 여러 개의 데코레이터를 함께 사용할 수 있습니다. 아래와 같이 두 개 이상의 역할을 가진 데코레이터를 결합해 보겠습니다:

function LogClass(target: Function) {
    console.log(`Logging class creation for ${target.name}`);
}

function AddRole(role: string) {
    return function (target: any) {
        target.prototype.role = role;
    };
}

@LogClass
@AddRole('Admin')
class AdminUser {
    constructor(public username: string) {}
}

const admin = new AdminUser("Charlie");
console.log(admin.role); // 출력: Admin

이처럼 각각 다른 기능을 가진 두 개의 데코레이터가 결합되어 한 클래스에서 다양한 효과를 낼 수 있습니다. 이를 통해 개발자는 코드의 가독성을 높이고, 각 기능을 모듈화하여 관리할 수 있는 장점을 누릴 수 있습니다.

요약

  • 클래스 데코레이터는 TypeScript에서 메타프로그래밍과 관련된 중요한 도구이며, 주로 클래스를 수정하거나 확장하는 용도로 사용됩니다.
  • 실질적으로 코드 작성 시 유용함을 제공하며, 유지보수성과 재사용성을 높이는 데 기여합니다.
  • 다양한 방식으로 객체 지향 프로그래밍 패러다임 내에서 코드를 더 구조적이고 관리하기 쉽게 만들 수 있습니다.

이와 같이 데코레이터들을 활용하면 TypeScript 애플리케이션의 설계를 더욱 유연하고 강력하게 할 수 있으며, 개발자는 복잡한 비즈니스 로직을 보다 간결하게 표현할 수 있는 기회를 얻게 됩니다.

728x90