[nestjs] Contorller (2)

Dev.Jo·2022년 2월 23일
0

nestjs

목록 보기
2/2
post-thumbnail

Route Parameters

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

GET /cats/1와 같이 request URL에 동적인 정보를 담고 있는 요청인 경우 @Param() 데코레이터를 사용해 Parameter 정보를 가져온다.

다음 처럼 데코레이터 안에 특정한 파라미터를 지정할 수 도 있다


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

Sub-Domain Routing

@Controller 데코레이터에 host option을 설정해 줄 수 있다.

들어오는 request의 HTTP host와 host option의 값이 일치하면 해당 라우팅을 처리한다

@Controller({ host: 'admin.example.com' })
export class AdminController {
  @Get()
  index(): string {
    return 'Admin page';
  }
}
  • { host: 'admin.example.com' } 해당 호스트에서 보낸 request인 경우에만 라우팅을 처리한다

path를 동적으로 처리하기 위해 Route Paramerter를 사용해 @Controller(':id')를 사용한 것과 마찬가지로 동적인 host를 처리하기 위해 @HostParam 데코레이터를 사용할 수 있다

@Controller({ host: ':account.example.com' })
export class AccountController {
  @Get()
  getInfo(@HostParam('account') account: string) {
    return account;
  }
}

Aynchronicity 비동기성

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

async 함수를 사용해서 Promise를 return 하는데 Nest는 알아서 스스로 resolve한 값을 return 하게 됩니다.

Request payloads

DTO (Data Transfer Object)

DTO는 네트워크를 통해 주고받는 데이터들을 정의하는 객체입니다.
DTO를 타입스크립트의 인터페이스나 간단한 클래스로 정의할 수 있습니다.

nestjs는 클래스를 사용해 DTO를 정의하는 것을 추천합니다.

그 이유는 타입스크립트로 정의하게 되면 그 코드는 컴파일할 때 제거되고 변환되게 됩니다. 그렇게 되면 Nest는 런타임 때 참조할 수 없게 됩니다.

POST 요청을 통해 body안에 담겨 오게되는 데이터를 정의하는 DTO를 작성해봅시다

export class CreateCatDto {
  name: string;
  age: number;
  breed: string;
}
@Post()
async create(@Body() createCatDto: CreateCatDto) {
  return 'This action adds a new cat';
}

Controller 적용하기

컨트롤러 파일을 작성했다고 해서 적용되는 것이 아닙니다. 컨트롤러는 항상 module에 속하게 되는데, @Module 데코레이터 안에 넣어 컨트롤러를 적용해 봅시다.

import { Module } from '@nestjs/common';
import { CatsController } from './cats/cats.controller';

@Module({
  controllers: [CatsController],
})
export class AppModule {}

정리하기

예제 코드를 보면서 배웠던 내용을 정리해봅시다

import { Controller, Get, Query, Post, Body, Put, Param, Delete } from '@nestjs/common';
import { CreateCatDto, UpdateCatDto, ListAllEntities } from './dto';


// @Controller 데코레이터를 사용해 정의힙니다.
// 데코레이터 안에 route를 설정할 수 있습니다.
@Controller('cats') // /cats 라우팅을 처리합니다.
export class CatsController {
  
  // POST 메서드를 처리합니다.
  @Post()
  create(@Body() createCatDto: CreateCatDto) { // DTO를 정의하여 Body에 담겨 들어오는 데이터를 정의합니다.
    return 'This action adds a new cat';
  }

  @Get()
  findAll(@Query() query: ListAllEntities) { // @Query 데코레이터를 사용해서 query를 가져옵니다.
    return `This action returns all cats (limit: ${query.limit} items)`;
  }

  @Get(':id') // Method 데코레이터 안에 동적인 Param을 가져옵니다
  findOne(@Param('id') id: string) { // @Param 데코레이터를 사용해서 Param을 가져옵니다.
    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`;
  }
}
profile
소프트웨어 엔지니어, 프론트엔드 개발자

0개의 댓글