(NestJS-기초강의) 7. Controller

앞선 글에서 Module에 대해 알아보았습니다.

이번 글에서는 요청을 받아 처리결과를 반환하는데 사용되는 Controller에 대해 알아보겠습니다.

Controller란 무엇인가?

Controller는 클라이언트로부터의 요청(request)을 받아들이고 응답(response)을 반환하는 역할을 합니다.

어플리케이션에서 특정한 요청을 수신하고, 라우팅 메커니즘을 통해 어떤 Controller가 어떤 요청을 받아들일지 결정됩니다.

각 Controller에는 여러 개의 라우트가 있을 수 있으며, 각 라우트는 다양한 작업을 수행할 수 있습니다.

출처: https://docs.nestjs.com/controllers

@Controller

앞선 글에서 보았듯이 Controller는 다음 명령어로 추가할 수 있다.

$ nest g controller users

기본적인 Controller를 만들기 위해서는 Class와 Decorator를 사용합니다.

Decorator는 Class를 필요한 Meta data와 연결하고, NestJS가 라우팅 맵을 생성할 수 있도록 합니다.

예를 들어, 다음은 users 엔티티와 관련된 라우트를 다루는 간단한 Controller의 예시 코드입니다.

다시 말해 http://localhost:3000/users 로 요청이 오면 UsersController로 라우팅 되도록 되어 있습니다.

import { Controller } from '@nestjs/common';

@Controller('users')
export class UsersController {

}

REST API Handler

다음의 decorator를 활용하여 Controller에서는 REST API Method들을 라우팅하여 처리할 수 있습니다.

@Get, @Post, @Put, @Post

다음의 경우 http://localhost:3000/users 로 요청이 오면 findAll() method로 라우팅되도록 되어 있습니다.

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Get()
  async findAll(): Promise<string> {
    return 'This action returns all users';
  }
}

따라서 http://localhost:3000/users 접속하면 다음 결과를 확인할 수 있습니다.

Decorator 안에 다음과 같이 값('all-users')을 넣어 경로를 지정할 수도 있습니다.
이 경우 http://localhost:3000/users/all-users 로 접속하면 findAll() method도 라우팅 됩니다.

  @Get('all-users')
  async findAll(): Promise<string> {
    return 'This action returns all users';
  }

그 외 Decorators

Decorator설명
@Get()HTTP GET 요청에 대한 핸들러를 정의합니다.
@Post()HTTP POST 요청에 대한 핸들러를 정의합니다.
@Put()HTTP PUT 요청에 대한 핸들러를 정의합니다.
@Delete()HTTP DELETE 요청에 대한 핸들러를 정의합니다.
@Patch()HTTP PATCH 요청에 대한 핸들러를 정의합니다.
@Options()HTTP OPTIONS 요청에 대한 핸들러를 정의합니다.
@Head()HTTP HEAD 요청에 대한 핸들러를 정의합니다.
@All()모든 HTTP 요청 메서드에 대한 핸들러를 정의합니다.

Request Object 사용

Exporess를 사용하고 있으므로 Request Object를 사용할 수 있다.

Request 객체는 @Req()를 통해 핸들러의 Parameter에 inject 할 수 있다.

import { Controller, Get, Req } from '@nestjs/common';
import { Request } from 'express';
import { UsersService } from './users.service';

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Get('all-users')
  async findAll(@Req() request: Request): Promise<string> {
    console.log(request.headers);
    return 'This action returns all users';
  }
}

본 예제에서는 Request 객체의 header 부분을 로그로 기록하였습니다.

Route Parameter

매개변수를 ‘:’를 이용해서 전달받아

@Param Decorator를 통해 사용할 수 있습니다.

  @Get(':id')
  async getUserById(@Param() params): Promise<string> {
    return `This user has id ${params.id}`;
  }

이 경우, http://localhost:3000/users/a30 과 같이 ID (이 경우 a30)를 parameter로 전달하면 다음과 같은 결과를 얻을 수 있습니다.

Post 에서 Body 다루기

@Body() Decorator를 통해서 Post 라우트 핸들러에서 DTO(Data Transfer Object) Scheme class를 생성하여 데이터를 처리할 수 있습니다.

예를 들어 다음과 같은 dto class 가 존재할 때,

/src/users/dto/create-users.dto.ts

export class CreateUserDto {
  id: string;
  name: string;
  age: number;
}

이를 PostMan이란 Client tool을 이용하여 Post method의 Body에 JSON 형식으로 값들을 넣어 데이터를 전송하여 결과를 확인했습니다.

그 외 Decorators

다음 Decorator들을 이용하여, Request와 Response 객체 혹은 해당 속성들에 접근할 수 있습니다.

데코레이터플랫폼 특정 객체
@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

참고링크

Leave a Comment