decorator를 잘 사용하면 cross-cutting concern을 분리하여 관점 지향 프로그래밍을 적용한 코드를 작성할 수 있습니다. 타입스크립트의 데커레이터는 파이썬의 데커레이터나 자바의 이노테이션과 유사한 기능을 합니다. 클래스, 메서드, 접근자, 프로퍼티, 매개변수에 적용 가능합니다. 각 요소의 선언부 앞에 @로 시작하는 decorator를 선언하면 decorator로 구현된 코드를 함께 실햄합니다. 예를 들어 다음 코드는 유저 생성 요청의 본문을 data transfer object(DTO)로 표현한 클래스 입니다.
사용자는 얼마든지 요청을 잘못 보낼 수 있기 때문에 decorator를 이용하여 앱이 허용하는 값으로 제대로 요청을 보냈는지 검사하고 있습니다.
controller는 request를 받고 처리된 결과를 response으로 돌려주는 interface 역할을 합니다.
@Controller(decorator)를 class에 선언하는 것으로 해당 class는 controller의 역할을 하게 됩니다.
getHello 함수는 @Get(decorator)를 가지고 있습니다. 따라서 root 경로('/')로 들어오는 요청을 처리할 수 있게 됩니다.
클라이언트는 요청을 보내면서 종종 서버가 원하는 정보를 함께 전송합니다. Nest는 요청과 함께 전달되는 데이터 핸들러(요청을 처리할 구성 요소, 컨트롤러가 이 역할을 합니다.)가 다룰 수 있는 객체로 변환합니다. 이렇게 변환된 객체는 @Req 데커레이터를 이용하여 다룰 수 있습니다.
요청 객체는 HTTP 요청을 나타냅니다. 쿼리 스트링, 매개변수, 헤더와 본문 외 많은 정보를 가지고 있습니다.
Express를 사용한다면 @Res 데커레이터를 이용해서 Express 응답 객체를 다룰 수 있습니다.
Nest는 또 다른 데커레이터 @HttpCode를 통해 상태 코드를 변경할 수 있습니다.
http://localhost:3000/users/1에서 1에 해당하는 부분이 유저 id인데 당연히 동적으로 구성됩니다. 즉 경로를 구성하는 매개변수가 됩니다. 전달 받은 매개변수는 함수 인수에 @Param 데커레이터로 주입받을 수 있습니다.
라우트 매개변수를 전달받는 방법은 2가지가 있습니다. 먼저 매개변수가 여러 개 전달 될 경우 객체로 한 번에 받는 방법입니다. 이 방법은 params 타입이 any가 되어 권장하지 않습니다.
물론 라우트 매개변수는 타입이 항상 string 이기 때문에 명시적으로 { [key: string]: string } 타입을 지정해도 됩니다.
하위도메인 라우팅 기법을 통해서 해당 도메인만 따로 요청을 받을 수도 있습니다.
POST,PUT,PATCH 요청을 보통 처리에 필요한 데이터를 함께 실어 보냅니다.
이 데이터 덩어리, 즉 페이로드는 body라고 합니다. 전송 객체(DTO)가 구현되어 있어 본문을 쉽게 다룰 수 있습니다.
지금까지 백엔드 앱의 관문이라 할 수 있는 컨트롤러를 Nest에서 어떻게 사용하는지 살펴 보았습니다. 정리하자면, 컨트롤러는 서버로 들어오는 요청을 처리하고 응답을 가공합니다. 서버에서 제공하느 기능을 어떻게 클라이언트와 주고 받을지에 대한 인터페이스를 정의하고 데이터의 구조를 기술합니다.