import { Controller, Get } from '@nestjs/common';
@Controller('cats')
export class CatsController {
@Get()
findAll(): string {
return 'This action returns all cats';
}
}
그리고 위와 같이 컨트롤러는 Controller()라는 데코레이터를 통해 컨트롤러 기능을 추가해줌으로써 사용한다. @Controller() 안에 'cats'라는 파라미터는 해당 컨트롤러에 접근하기 위한 endpoint라고 할 수 있다. 그래서 이 CatsController 클래스 안에는 findAll이라는 GET 메서드를 사용한 http 요청을 처리하는 부분이 있는데, 이 findAll을 사용하려면 '/cats' 라우트로 요청을 보내되 HTTP의 GET 메서드를 사용해야 한다. 그래서 findAll위에는 Get() 데코레이터를 써줬다. GET, POST, PUT, PATCH, DELETE 등의 메서드들은 모두 이렇게 데코레이터로 표현할 수 있 도록 해놨다. 이 때, endpoint의 접두사가 cats라고 하면, Get('all') 이런식으로 해준다고 했을 때, 'cats/all' 로 endpoint를 변경할 수 있다.
text/html
타입의 데이터가 브라우저에서 렌더링된다. 하지만 object 타입으로 주면 application/json
형태로 온다(아까 말했듯이 자동으로 serialize 돼서 온다).response.status(200).send()
형태로 쓰려면 @res
를 쓰면된다. 하지만 앞서 말했듯이 권장 사항은 standard를 쓰는 것이다.결론적으로 controller의 reponse에서는 statusCode와 필요하다면 return value 등을 넣어줘서 request에 따른 적당한 response를 준다. 이 때, @HttpCode
데코레이터를 적절히 쓰면 좋을 것 같고, return 값의 타입을 적절히 규격화해 만들어서 사용해야할 것 같다. 그래야 FE 쪽에서 예를 들어, axios.create로 만든 모듈에서 response를 받아서 처리하는 부분까지 공통화를 한다고 할 때도 수월하게 규격화된 형태로 할 수 있다.
: 앞서 response에 대해서 알아봤는데, 이번엔 request 에 대해서 알아보자. controller에서 작업을 하다보면 클라이언트 쪽에서 보낸 request object를 살펴봐야할 일이 생긴다. Authorization 값을 확인한다거나(JWT Token 등을 쓴다 했을 때) 등의 일이 그에 해당한다. 이 때 @nestjs/common
에서 기본으로 제공하는 Req
를 쓰면된다.
@Request(), @Req() req
@Response(), @Res()* res
@Next() next
@Session() req.session
@Param(key?: string) req.params / req.params[key]
@Body(key?: string) req.body / req.body[key]
@Query(key?: string) req.query / req.query[key]
@Headers(name?: string) req.headers / req.headers[name]
@Ip() req.ip
@HostParam() req.hosts
위와 같은 Request object를 받아올 수 있다(http request 속의 프로퍼티라고 생각하면 된다.
** @Param은 users/yongki
에서 yongki라는 값을 받을 수 있는 것이고
@Get('/:user_name')
getUserInformByName(@Params('user_name') userName){
return this.userService.getUserInformByName(userName);
}
위와 같이 쓰면된다.
중간에 다른 얘기긴하지만, 대략적으로 위와 같은 response, request Header의 정보들과 general의 정보들을 통제 및 조회하는 곳이 controller이다.
** Redirect 를 쓰면 브라우저단에서 자동으로 캐싱을 한다