고급 TypeScript - 데코레이터: 메서드 데코레이터

데코레이터: 메서드 데코레이터

데코레이터는 클래스의 속성이나 메서드, 접근자에 대한 추가적인 기능을 제공하는 특별한 종류의 함수입니다. TypeScript에서는 이러한 디코레이터를 사용하여 코드의 재사용성과 가독성을 높이고, 특정 로직을 간결하게 구현할 수 있습니다.

메서드 데코레이터란?

메서드 데코레이터는 클래스의 메서드를 수정하거나 추가적인 행동을 정의하기 위해 사용됩니다. 이들은 주로 로깅, 권한 검사, 성능 측정 등 다양한 목적으로 활용될 수 있습니다.

기본 구조

메서드 데코레이터는 다음과 같은 형식을 가집니다:

function 로그(target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) {
    const originalMethod = descriptor.value;

    descriptor.value = function (...args: any[]) {
        console.log(`Calling ${String(propertyKey)} with arguments: ${args}`);
        return originalMethod.apply(this, args);
    };

    return descriptor;
}
  • target: 해당 메서드를 소속하고 있는 클래스.
  • propertyKey: 메서드 이름.
  • descriptor: 메서드에 대한 프로퍼티 설명자.

위 예제에서 로그라는 이름의 메서드 데코레이터가 정의되었습니다. 이 데코레이터는 원래의 메서드를 호출하기 전에 인자를 콘솔에 출력합니다.

실제 예시

이제 위에서 정의한 로그 데코레이터를 사용하는 방법을 살펴보겠습니다:

class 계산기 {
    @로그
    더하기(a: number, b: number): number {
        return a + b;
    }

    @로그
    빼기(a: number, b: number): number {
        return a - b;
    }
}

const calc = new 계산기();
console.log(calc.더하기(5, 3)); // Calling 더하기 with arguments: 5,3 
                                  // 결과 : 8
console.log(calc.빼기(10, 4));   // Calling 빼기 with arguments: 10,4 
                                  // 결과 : 6

위 코드에서 계산기 클래스에는 두 개의 메서드 (더하기, 빼기)가 있으며 각 메서드는 @로그라는 데코레이터로 장식되어 있습니다. 이로 인해 각 호출 시 인자가 로그에 기록되고 그 후 원래 동작이 수행됩니다.

활용 사례

  • 로깅:

    • API 요청 및 응답 시간을 기록하여 성능 분석 가능.
  • 권한 검사:

    • 특정 역할이나 권한이 있는지 확인하여 접근 제어 구현 가능.
  • 캐싱:

    • 이전 결과를 저장하고 동일한 입력 값으로 호출 시 캐시된 값을 반환하도록 설정 가능.
  • 데버깅:

    • 개발 중 오류 추적 및 문제 해결을 위한 유용한 정보를 출력할 수 있음.

메소드 데코레이터는 이러한 방식으로 코드를 더욱 깔끔하고 관리하기 쉽게 만들어 줍니다. 이를 통해 반복되는 코드를 줄이고 비즈니스 로직과 부가적인 기능들을 분리할 수 있어 유지 보수성이 향상됩니다.

결론

TypeScript에서 메소드 데코레이터는 강력한 도구이며 잘 활용하면 애플리케이션 설계를 개선하는데 큰 도움이 됩니다. 다양한 상황에 맞게 커스터마이징 할 수 있으므로 여러 가지 패턴과 기법들을 적용해 보는 것이 좋습니다!

Subscribe to shimdh.log

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
jamie@example.com
Subscribe