컨트롤러는 수신 요청을 처리하고 클라이언트에 대한 응답을 반환하는 역할을 합니다.
컨트롤러의 목적은 애플리케이션에 대한 특정 요청을 수신하는 것입니다. 라우팅 메커니즘은 어떤 컨트롤러가 어떤 요청을 수신하는 지를 제어합니다.
기본 컨트롤러를 만들기 위해 클래스와 데코레이터를 사용합니다. 데코레이터는 클래스를 필요한 메타데이터와 연결하고 네스트가 라우팅 맵(해당 컨트롤러에 요청을 연결)을 만들 수 있도록 합니다.

다음 예제에서는 기본 컨트롤러를 정의하는 데 @Controller()필요한 데코레이터를 사용 합니다. 선택적 경로 경로 접두사를 로 지정하겠습니다 cats. 데코레이터 에서 경로 접두사를 사용하면 @Controller()관련 경로 집합을 쉽게 그룹화하고 반복 코드를 최소화할 수 있습니다. 예를 들어, Route 아래에 있는 cat 엔터티와의 상호 작용을 관리하는 일련의 경로를 그룹화하도록 선택할 수 있습니다 /cats. 이 경우 파일의 각 경로에 대해 경로의 해당 부분을 반복할 필요가 없도록 데코레이터 cats에서 경로 접두사를 지정할 수 있습니다.@Controller()
import { Controller, Get } from '@nestjs/common';
@Controller('cats')
export class CatsController {
@Get()
findAll(): string {
return 'This action returns all cats';
}
}
라우팅 패스는 와일드 카드를 사용해서 작성할 수 있습니다. ()문자를 사용하면 문자열 가운데 어떤 문자가 와도 상관없이 라우팅 패스를 구성하겠다는 뜻입니다. 이외에 ?, +, () 문자 역시 정규 표현식에서의 와일드 카드와 동일하게 동작합니다. 단, 하이픈(-)과 점은 문자열로 취급합니다.
@Get('ab*cd')
findAll() {
return 'This route uses a wildcard';
}
클라이언트는 요청을 보내면서 종종 서버가 원하는 정보를 함께 전송합니다. Nest는 요청과 함께 전달되는 데이터를 핸들러가 다룰 수 있는 객체러 변환합니다. 이렇게 변환된 객체는 @Req 데커레이터를 이용하여 다룰 수 있습니다.
@Get()
findAll(@Req() req: Request) {
console.log(req);
return this.appService.getHello();
}

요청 객체는 HTTP 요청을 나타냅니다. Nest는 @Query(), @Param(), @Body()데커레이터를 이용해 매개변수, 패스, 매개변수 본문을 쉽게 받을 수 있게 도와줍니다.
Nest는 CRUD에 대해 성공 응답으로 POST 201 그 외에는 200을 보냅니다. 만약 상태 코드를 다른 값으로 바꾸길 원한다면 @HttpCode를 사용하면 됩니다.
참고 : PUT은 리소스를 전체 교체할 때 사용하며 PATCH는 리소스의 일부를 업데이트 할 때 사용합니다.
@Get(':id')
findOne(@Parm('id')id : string){
if(id < 1){
throw new BadRequestException('id는 0보다 큰 값이어야 합니다.');
}
return this.userService.fineOne(+id);
}
Nest는 응답 헤더를 자동으로 구성해줍니다. 만약 응답에 커스텀 헤더를 추가하고 싶다면 @Header 데커레이터를 사용하면됩니다.
종종 서버가 요청한 후 요청을 보낸 클라이언트를 다른 페이지로 이동하고 싶은 경우가 있습니다. 이를 리디렉션이라고 합니다. 응답 본문에 리디렉션할 URL을 포함해서 클라이언트가 스스로 페이지를 이동하게 해도 되지만, @Redirect 데코레이터를 사용하면 쉽게 구현이 가능합니다.
@Redirect('리디렉션할 url', 상태코드) : 💥리디렉션의 상태코드는 300번대 입니다. 200번대로 작성시, 예측한 대로 작동하지 않을 가능성이 있습니다.
라우트 매개변수는 패스 매개변수라고도 합니다. 경로로 들어오는 매개변수는 @Param 데커레이터로 주입받을 수 있습니다.
라우트 매개변수를 전달받는 방법은 2가지가 있습니다. 여러 개 전달된 경우 객체로 한 번에 받는 방법(params의 타입이 any로 되어 권장하지 않습니다) 라우트 매개변수는 타입이 항상 string이기 때문에 명시적으로 {[key:string]: string} 타입을 지정해도 됩니다.
@Delete(':userId/memo/:memoId')
delete(@Param() params:{[key: string]: string}){
return 'userId: ${params.userId}, memoId: ${params.memoId}';
}
더 일반적인 방법은 라우팅 매개변수를 따로 받는 것입니다. REST API를 구성할 때는 매개변수의 개수가 너무 많아지지 않게 설계하는 것이 좋기 때문에 따로 받아도 코드가 많이 길어지지 않습니다.
@Delete(':userId/memo/:memoId')
delete(
@Param('userId') userId: string,
@Param('userId') userId: string
){
return 'userId: ${params.userId}, memoId: ${params.memoId}';
}