솜이의 데브로그

[NestJS] 기본 개념 본문

dev/NestJS

[NestJS] 기본 개념

somsoming 2022. 1. 2. 16:38

컨트롤러

  • 서버가 수행해야하는 작업을 데코레이터로 기술하여, 어플리케이션이 가지는 핵심 로직에 집중할 수 있도록 도와준다.
  • @Controller 데코레이터를 클래스에 달면 해당 클래스는 컨트롤러의 역할을 하게 된다.
  • @Get() 을 통해 들어오는 요청을 경로에 따라 관리 가능하다.
    • ex) @Get('/hello') 라고 하는 경우, /hello 경로로 들어오는 요청을 처리
  • @Contoller 데코레이터도 인자를 넣어 라우팅 경로의 prefix를 지정할 수 있다.
  • 라우팅 패스는 와일드 카드를 이용하여 작성할 수 있다.

 

요청 객체 (Request Object)

  • Nest는 요청과 함께 전달되는 데이터를 핸들러가 다룰 수 있는 객체로 변환한다.
  • 변환된 객체는 @Req() 데코레이터를 이용해 다룰 수 있다.

 

Nest는 CRUD에 대한 http method의 성공에 대한 응답으로 POST는 201, 그 외에는 200을 갖는다.

상태코드를 다른 코드를 바꾸기 위해서는 다음과 같이 적용할 수 있다.

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

@HttpCode(202)
@Patch(':id')
update(@Param('id') id: string, @Body() updateUserDto: UpdateUserDto) {
  return this.usersService.update(+id, updateUserDto);
}

 

요청을 처리하는 도중 에러가 발생하거나 예외를 던져야 하는 경우 다음과 같이 할 수 있다.

@Get(':id')
findOne(@Param('id') id: string) {
  if (+id < 1) {
    throw new NotFoundException('User is not found');
  }

  return this.usersService.findOne(+id);
}

 

응답을 받는 서버 또는 클라이언트와 약속된 커스텀 헤더를 추가할 경우, @Headers 데코레이터를 사용한다.

인자로는 헤더 이름과 값을 받는다.

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

@Header('Custom', 'Test Header')
@Get(':id')
findOneWithHeader(@Param('id') id: string) {
  return this.usersService.findOne(+id);
}

 

리디렉션(Redirection)

  • 응답 바디에 redirectionUrl을 포함시켜 클라이언트가 스스로 페이지를 이동하도록 @Redirection 데코레이터 사용.
  • 두번째 인자는 상태코드.

 

하위 도메인 라우팅

  • 새로운 컨트롤러 생성
  • 새로운 컨트롤러에서도 같은 엔드포인트를 받도록 하는데, 먼저 처리될 수 있도록 순서를 수정
  • @Controller 데코레이터는 ControllerOptions 객체를 인자로 받는데, 이 때 host 속성에 하위 도메인을 기술한다.
  •  @Controller({ host: 'api.example.com' }) // 하위 도메인 요청 처리 설정
    export class ApiController {
      @Get() // 같은 루트 경로
      index(): string {
        return 'Hello, API'; // 다른 응답
      }
    }

 

요청 페이로드 다루기

    • NestJS는 DTO (Data Transfer Object)를 정의하여 쉽게 다룰 수 있다.
    • 예를 들어, Users 리소스를 생성하기 위해 POST /users 로 들어오는 바디는 CreateUserDto 로 받을 수 있다.
    • export class CreateUserDto {
        name: string;
        email: string;
      }
    •  
@Post()
create(@Body() createUserDto: CreateUserDto) {
  const { name, email } = createUserDto;

  return `유저를 생성했습니다. 이름: ${name}, 이메일: ${email}`;
}

 

프로바이더 (Provider)

  • 앱이 제공하고자 하는 핵심 기능, 즉 비즈니스 로직을 수행하는 역할을 하는 것.
  • Service, Repository, Factory, Helper 등 여러 형태로 구현이 가능.
  • Nest에서 제공하는 프로바이더의 핵심은 의존성을 주입할 수 있다는 점이다.
  • DI : Dependency Injection 를 이용하면 객체 생성과 사용의 관심을 분리할 수 있다.

 

모듈(Module)

  • 전역 모듈을 만드는 방법 : @Global() 데코레이터 선언
  • 동적 모듈(Dynamic Module)

'dev > NestJS' 카테고리의 다른 글

[NestJS] 유저 서비스와 회원가입  (0) 2022.01.02