오늘 뭐했냐/개발에 대한 주저리

23.10.01 데코레이터( @, Decorator)

스스로에게 2023. 10. 3. 15:48

NestJS 강의를 들으면서 처음 데코레이터라는 것을 보고 이게 뭐야 하는 의문이 들었다.

 

데코레이터

 주어진 상황 및 용도에 따라 어떤 객체에 책임을 덧붙이는 디자인 패턴으로, 기능 확장이 필요할 때 서브클래싱 대신 쓸 수 있는 유연한 대안이 될 수 있다.

NestJS는 TypeScript 기반의 백엔드 프레임워크로, TypeScript의 데코레이터는 클래스, 메서드, 속성, 매개변수 등에 메타데이터를 추가하거나 변경하는 데 사용된다.

 

이것이 어떻게 작동되냐

  • 데코레이터 정의: 데코레이터는 함수로 정의되며, 이 함수는 데코레이트되는 대상에 대한 정보를 인자로 받는다.
  • 데코레이터 적용: 데코레이터는 클래스, 메서드, 속성, 매개변수 등에 @데코레이터명 형태로 적용된다.
  • 메타데이터 리플렉션: NestJS는 내부적으로 reflect-metadata 라이브러리를 활용하여 데코레이터를 통해 부여된 메타데이터를 추출하고, 해당 메타데이터를 기반으로 프레임워크의 동작을 조정한다.
  • 프레임워크와의 연동: NestJS의 핵심 기능들, 예를 들면 라우터나 의존성 주입 시스템 등은 데코레이터로부터 얻은 메타데이터를 바탕으로 작동한다.

 

  @Get('/:id')
  getBoardById(@Param('id') id: number
  ): Promise<Board> {
    return this.boardsService.getBoardById(id);
  }

@Get('/:id') 데코레이터는 해당 메서드가 HTTP GET 요청을 처리하며, 요청 경로가 '/:id' 임을 나타내는 NestJS에서 만들어져 있는 데코레이터이다.  NestJS는 이 데코레이터를 분석하여, ' '/:id' ' 경로로 오는 GET 요청이 해당 메서드에 바인딩되도록 라우터를 설정한다.

 

@Module이나 @Injectable()도 NestJS에서 제공하는 데코레이터로 내가 만든 클래스나 메서드 등에 적용하여 모듈로 선언하거나 의존성 주입에 사용된다. 

 

아직은 이해하지 힘든 추가 설명들  

https://velog.io/@ragnarok_code/데코레이터

 

[NestJS] 데코레이터(@)

Nest는 데코레이터를 적극 활용합니다. 데코레이터를 잘 사용하면 횡단관심사를 분리하여 관점 지향 프로그래밍을 적용한 코드를 작성할 수 있습니다. 는 나 과 유사한 기능을 합니다. 클래스,

velog.io

https://toss.tech/article/nestjs-custom-decorator

 

NestJS 환경에 맞는 Custom Decorator 만들기

NestJS에서 데코레이터를 만들기 위해서는 NestJS의 DI와 메타 프로그래밍 환경 등을 고려해야 합니다. 어떻게 하면 이러한 NestJS 환경에 맞는 데코레이터를 만들 수 있을지 고민해보았습니다.

toss.tech