반응형

다음은 이 글의 동영상 강의입니다.

https://youtu.be/v66oRI3peh8

아래는 컨트롤러 실습 강의 영상입니다.

https://youtu.be/BJbL6zT16DM

 

* 이글은 NestJS 홈페이지를 참조하여 작성하였습니다.

https://docs.nestjs.kr/controllers

 

네스트JS 한국어 매뉴얼 사이트

네스트JS 한국, 네스트JS Korea 한국어 매뉴얼

docs.nestjs.kr

 

Controller의 역할

NestJS의 Controller는 Client의 request(요청)를 받아 처리한 후 response(응답)하는 역할을 합니다.

Client의 요청이 들어왔을 때 요청에 따라 처리할 Controller로 분기 처리하는 것을 Routing이라고 합니다.

 

@Controller()

Controller는 @Controller() 데코레이터를 사용합니다.

마지막에 사용된 () 안에는 다음과 같이 요청 라우팅 path를 지정할 수 있습니다.

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

@Controller('cats')
export class CatsController {}

이때 정의된 cats는 하위 메소드들의 접두어 역할을 하므로 반복하여 작성할 필요가 없습니다.

 

라우팅 path가 없을 경우에는 root path('/')로 사용됩니다.

사용 예는 다음과 같습니다.

  • http://localhost:3000/   =>  @Controller()
  • http://localhost:3000/cats   =>  @Controller('cats')

Controller에서는 다음과 같이 HTTP Request Method 데코레이터를 사용할 수 있습니다.

@Get, @Post, @Put, @Delete
import { Controller, Get } from '@nestjs/common';

@Controller('cats')
export class CatsController {
  @Get()
  findAll(): string {
    return 'This action returns all cats';
  }
}

위의 @Get() 데코레이터는 Controller의 라우팅 패스를 상속 받기 때문에 Client에서는 다음과 같이 요청할 수 있습니다.

  • http://localhost:3000/cats

@Get() 데코레이터도 @Controller와 마찬가지로 routing path를 지정할 수 있습니다.

  • @Get('profile') 

이 경우 사용자의 요청 URL은 다음과 같습니다.

  • http://localhost:/3000/cats/profile

@Get() 데코레이터 아래 선언된 Method의 이름은 어떤 의미도 부여하지 않습니다.
다만, 코드를 해석하기 쉬운 형태로 작성해 주시면 됩니다.

 

Method 옆에 선언된 type은 response 형식입니다.

@Get()
findAll(): string

 

Request 객체

NestJS는 Express를 사용하고 있으므로 인해 Request 객체를 사용할 수 있습니다.

핸들러 parameter에 @Req() 데코레이터를 사용하면 됩니다.

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

@Controller('cats')
export class CatsController {
  @Get()
  findAll(@Req() request: Request): string {
    console.log(request);
    return 'This action returns all cats';
  }
}

 

Route parameters

동적 라우팅을 위해서는 매개변수를 ':'과 함께 사용할 수 있습니다.

다음은 동적 매개변수를 사용한 예입니다.

@Get(':id')
findOne(@Param() params): string {
  console.log(params.id);
  return `This action returns a #${params.id} cat`;
}

만약 id가 1일 경우 호출 url은 다음과 같습니다.

  • http://localhost:3000/cats/1

매개 변수는 @Param() 데코레이터로 받아서 처리하면 됩니다.

위에서는 params.id로 라우팅 매개변수 값을 추출할 수 있습니다.

다음과 같은 방법으로도 처리할 수 있습니다.

@Get(':id')
findOne(@Param('id') id: string): string {
  return `This action returns a #${id} cat`;
}

 

비동기 처리

비동기 함수는 아래 예제와 같이 Promise를 반환해야 합니다.

@Get()
async findAll(): Promise<any[]> {
  return [];
}

 

Post의 Body DTO

Post 라우트 핸들러에서는 @Body() 데코레이터를 사용할 수 있습니다.

이때 DTO 스키마 클래스를 생성해서 데이터를 처리할 수 있습니다.

다음은 DTO를 사용한 예제입니다.

export class CreateCatDto {
  name: string;
  age: number;
  breed: string;
}

 해당 DTO를 Controller에서 사용하는 방법은 다음과 같습니다.

@Post()
async create(@Body() createCatDto: CreateCatDto) {
  return 'This action adds a new cat';
}

 

일반적인 API의 구조를 모두 포함한 예제는 다음과 같습니다.

  • findAll : 전체 데이터 목록 조회
  • findOne : 데이터 상세 조회
  • create : 데이터 생성
  • update : 데이터 수정
  • remove : 데이터 삭제
import { Controller, Get, Query, Post, Body, Put, Param, Delete } from '@nestjs/common';
import { CreateCatDto, UpdateCatDto, ListAllEntities } from './dto';

@Controller('cats')
export class CatsController {
  @Post()
  create(@Body() createCatDto: CreateCatDto) {
    return 'This action adds a new cat';
  }

  @Get()
  findAll(@Query() query: ListAllEntities) {
    return `This action returns all cats (limit: ${query.limit} items)`;
  }

  @Get(':id')
  findOne(@Param('id') id: string) {
    return `This action returns a #${id} cat`;
  }

  @Put(':id')
  update(@Param('id') id: string, @Body() updateCatDto: UpdateCatDto) {
    return `This action updates a #${id} cat`;
  }

  @Delete(':id')
  remove(@Param('id') id: string) {
    return `This action removes a #${id} cat`;
  }
}

이상으로 nestjs의 controller에 대해 알아보았습니다.

반응형

+ Recent posts