[NestJS] Controllers

Hocaron·2021년 12월 12일
1

NestJS

목록 보기
2/12

Controllers

  • Request를 받아서 Response를 돌려주는 함수이다.
  • Routing을 통해 어떤 controller가 어떤 요청을 받을 지 결정한다.
  • ClassDecorator를 사용해서 controller에 기능을 더할 수 있다.

Routing

  • 다음 예제에서는 @Controller() 데코레이터를 사용한다.
  • 선택적 라우트 경로(path) 접두사 cats를 지정한다.
  • 예를 들어 /customers 라우트 아래에서 고객 엔터티와의 상호작용을 관리하는 Route 집합을 그룹화하도록 선택할 수 있다.
    • 이 경우 @Controller() 데코레이터에서 경로(path) 접두사 customers를 지정하여 파일의 각 라우트에 대해 경로(path)의 해당부분을 반복할 필요가 없다.

cats.controller.ts

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

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

Request Object

  • 핸들러의 시그니처에 @Req() 데코레이터를 추가하여 Nest에 주입하여 Request에 엑세스할 수 있다.

cats.controller.ts

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

@Controller('cats')
export class CatsController {
  @Get()
  findAll(@Req() request: Request): string {
    return 'This action returns all cats';
  }
}
  • number, string, boolean 같은 primitive의 경우 그대로 값 전달한다.

  • object, array같은 경우 JSON으로 직렬화해서 내려준다.

🤔primitive를 JSON으로 반환하고 싶다면?

🖐object를 만들어서 리턴하면 된다.

🤔Express의 reponse 객체에 직접 접근하고 싶을 때는, 위의 @Res() 데코레이터로 주입받아서 쓰고 싶다면?

🖐res.send() res.json()

Route Parameters

cats.controller.ts

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

Scopes

  • Node.js는 모든 요청이 별도의 스레드에서 처리되는 요청/응답 다중스레드 상태 비저장(Multi-Threaded Stateless) 모델을 따르지 않는다. 따라서 싱글톤 인스턴스를 사용하는 것은 애플리케이션에 완전히 안전하다.

싱글톤 인스턴스
전역 변수를 사용하지 않고 객체를 하나만 생성하도록 하며, 생성된 객체를 어디에서 든지 참조할 수 있도록 하는 패턴이다. 생성자가 아무리 여러번 호출되더라도 실제로 생성되는 객체는 하나이다.

DTO

  • Request Body의 스키마를 정의하는 오브젝트이다.
  • Typescript의 interface가 아닌 JS의 Class를 사용한다.
    🖐인터페이스는 트랜스파일링을 하면서 사라지는 반면에, 클래스는 런타임에도 접근할 수 있다.
    🖐입력받는 파라미터를 검증하거나 변환할 때 사용하는 Pipe가 런타임에 이걸 활용할 수 있다.

create-cat.dto.ts

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

cats.controller.ts

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

Entity와 DTO 차이

  • Entity와 DTO를 분리해서 관리해야 하는 이유는 DB LayerView Layer 사이의 역할을 분리 하기 위해서다.
  • Entity 클래스는 실제 테이블과 매핑되어 만일 변경되게 되면 여러 다른 클래스에 영향을 끼치고, DTO 클래스는 View와 통신하며 자주 변경되므로 분리 해주어야 한다.
    💁‍♀️실제로 같은 레이어 내에 api도 response가 각각 다르다.
  • 결국 DTO는 Domain Model 객체를 그대로 두고, 복사하여 다양한 Presentation Logic을 추가한 정도로 사용하며 Domain Model 객체는 Persistent만을 위해서 사용해야한다.
  • 즉, Entity는 DB와 1:1매칭이 되는 Class이지만, DTO의 경우 통신간의 Data의 형태를 정의한것임으로 Entity와는 다르게 수시로 변경이 될수 있다.

😊한줄요약

@데코레이터로 시작해서 @데코레이터로 끝난다.

Reference

profile
기록을 통한 성장을

0개의 댓글