프로그래밍/Typescript

TypeScript에서 프로퍼티 데코레이터의 활용과 중요성

shimdh 2025. 4. 2. 09:00
728x90

TypeScript는 현대 웹 개발에서 널리 사용되는 프로그래밍 언어로, 객체 지향 프로그래밍의 개념을 잘 지원합니다. 그 중에서도 데코레이터는 TypeScript의 강력한 기능 중 하나로, 클래스, 메서드, 접근자, 프로퍼티 또는 매개변수에 추가적인 기능을 부여할 수 있는 특별한 구문입니다. 이번 포스트에서는 프로퍼티 데코레이터의 개념과 활용 방법에 대해 깊이 있게 살펴보겠습니다.

프로퍼티 데코레이터란?

프로퍼티 데코레이터는 클래스의 속성에 대한 메타데이터를 추가하는 데 사용됩니다. 이는 클래스 정의 시 속성 앞에 붙여 사용되며, 속성이 어떻게 처리되어야 하는지를 정의하는 중요한 역할을 합니다. 이를 통해 속성의 동작을 세밀하게 조정할 수 있습니다.

프로퍼티 데코레이터의 기본 구조

프로퍼티 데코레이터는 다음과 같은 기본 구조를 가집니다:

function PropertyDecorator(target: any, propertyKey: string) {
    // 메타데이터 처리 로직
}
  • target: 해당 속성이 포함된 클래스의 프로토타입을 나타냅니다.
  • propertyKey: 현재 속성의 이름을 의미합니다.

이러한 구조를 통해 개발자는 속성에 대한 다양한 동작을 정의할 수 있습니다.

프로퍼티 데코레이터의 예시

1. 로그 데코레이터

가장 간단한 예로, @log라는 이름의 데코레이터를 구현하여 특정 속성이 설정될 때마다 로그를 출력하는 코드를 살펴보겠습니다.

function log(target: any, propertyKey: string) {
    let value = target[propertyKey];

    const getter = () => {
        console.log(`Getting ${propertyKey}: ${value}`);
        return value;
    };

    const setter = (newValue) => {
        console.log(`Setting ${propertyKey} to ${newValue}`);
        value = newValue;
    };

    Object.defineProperty(target, propertyKey, {
        get: getter,
        set: setter,
        enumerable: true,
        configurable: true,
    });
}

class Person {
    @log
    name!: string;
}

const person = new Person();
person.name = 'Alice'; // Setting name to Alice
console.log(person.name); // Getting name: Alice

위의 예제에서 name이라는 속성은 @log 데코레이터가 적용되어 있어, 값을 설정하거나 가져올 때마다 로그 메시지가 출력됩니다. 이러한 방식은 디버깅이나 상태 추적을 용이하게 만들어 주며, 개발자가 코드의 흐름을 명확하게 이해할 수 있도록 돕습니다.

2. 유효성 검사 데코레이터

입력값에 대해 유효성을 검사하는 프로퍼티 데코레이터도 유용합니다. 이 데코레이터는 특정 속성에 대해 최대 길이를 제한하여, 데이터의 무결성을 유지하는 데 기여합니다.

function validateStringLength(maxLength: number) {
    return function (target: any, propertyKey: string) {
        let value = target[propertyKey];

        const getter = () => value;

        const setter = (newValue) => {
            if (newValue.length > maxLength) {
                throw new Error(`${propertyKey} must be at most ${maxLength} characters long.`);
            }
            value = newValue;
        };

        Object.defineProperty(target, propertyKey, { get: getter, set: setter });
    };
}

class User {
    @validateStringLength(10)
    username!: string;
}

const user = new User();

try {
   user.username = "ThisUsernameIsTooLong"; 
} catch (error) { 
   console.error(error.message); // username must be at most 10 characters long.
}

위 코드에서는 username이라는 속성이 최대 길이를 제한하도록 설정되었습니다. 사용자가 너무 긴 문자열을 할당하려고 할 경우, 오류가 발생하여 데이터의 무결성을 유지할 수 있습니다. 이러한 방식은 개발자가 의도한 대로 데이터가 처리되도록 보장하며, 애플리케이션의 안정성을 높이는 데 기여합니다.

프로퍼티 데코레이터의 장점

  1. 코드의 가독성 향상: 데코레이터를 사용하면 코드의 의도를 명확하게 표현할 수 있어, 다른 개발자들이 코드를 이해하기 쉬워집니다.
  2. 재사용성: 동일한 데코레이터를 여러 속성에 적용할 수 있어, 코드의 재사용성을 높입니다.
  3. 유지보수 용이: 데코레이터를 통해 속성의 동작을 중앙에서 관리할 수 있어, 유지보수가 용이합니다.
  4. 데이터 무결성 보장: 유효성 검사와 같은 기능을 통해 데이터의 무결성을 보장할 수 있습니다.

결론

프로퍼티 데코레이터는 TypeScript에서 객체 지향적으로 개발할 때 매우 유용하게 활용될 수 있습니다. 다양한 상황에서 필요한 메타데이터나 행동을 부여함으로써 코드를 더욱 깔끔하고 유지보수하기 쉽게 만들어 줍니다. 이러한 데코레이터를 적절히 활용하면, 개발자는 더 나은 품질의 코드를 작성할 수 있으며, 팀원 간의 협업도 원활하게 진행될 수 있습니다.

728x90