nestjs

NestJS  Java 의 Spring 또는 Python 의 django 처럼 Node 기반의 프로젝트에 익숙한 아키텍처와 구조를 제공한다. 기존에 Node 를 활용한 프로젝트는 망망대해에서 나만의 레고 블록을 조립하는 느낌이 강했다. (본인이 원하는 대로 프로젝트 구조를 잡아갈 수 있는 장점은 있지만 그 만큼 시간과 노력이 많이 들고 공부해야 할 양도 방대해 짐, 물론 NestJS 라고 공부할 양이 적거나 그런건 아니다). 그러나 NestJS 를 사용하면 정해진 틀 안에서 Router 를 작성하고 DB 와 연결하고 테스트 코드를 작성하면서 보다 쉽게 프로젝트 구조를 구성할 수 있게 해주고 무엇 보다 개인적으로 Typescript 를 사용한다는 점이 굉장히 맘에 들었다.

 

$ npm i -g @nestjs/cli
$ nest new nest-tutorial

nestjs/cli 를 global 로 설치하면 NestJS 의 유용한 기능들을 터미널로 사용 할 수 있다. 그리고 yarn 보다 npm 을 사용하는 것을 추천한다.

 

src 폴더를 열어보면 controller 와 service 그리고 중요한 app.module.ts, main.ts 가 존재하는데 main.ts 코드를 보면 3000 번 포트로 앱을 실행시키는 것을 알 수 있다. 그리고 controllerservice 를 사용하기 위해서는 app.module.ts 에 등록을 해줘야 한다.

 

NestJS 는 Controller 와 비즈니스 로직을 구분지어 코드를 작성해야 한다. 컨트롤러는 URL 을 가져올 뿐이고 URL 에 맞는 데이터를 Service 에서 가져와서 리턴 해준다. Service 는 사실상 비즈니스 로직을 실행하는 역할이라고 볼 수 있다.

 

간단한 User Controller 를 만들어 보자. 

$ nest g co

 

위 명령어는 NestJS 에게 새로운 controller 를 만들어 달라고 하는 것이다. 위 명령어를 실행시키면 controller 의 이름을 무엇으로 할건지 물어보는데 간단하게 users 로 만들자. 그리고 app.module.ts 를 보면 자동으로 아래와 같이 users 의 controller 가 등록되어 있다. NestJS의 cli 기능이 이런 점에서 참 편리하다.

 

// app.module.ts

import { Module } from '@nestjs/common';
import { UsersController } from './users/users.controller';

@Module({
  imports: [],
  controllers: [UsersController], // router 같은 존재
  providers: [],
})
export class AppModule {}

 

그리고 간단한 users controller 를 작성 해 보자. 

 

// users.controller.ts

import { Body, Controller, Delete, Get, Param, Patch, Post } from '@nestjs/common';

@Controller('users')
export class UsersController {
  @Get()
  getAllUser() {
    return '모든 유저 정보를 요청합니다.';
  }

  @Get('/:id') // Decorator 의 id 와 Param 의 id 의 네임은 일치해야 하지만 뒤의 오는 변수명은 아무거나 사용해도 된다
  getUserById(@Param('id') userId: string) {
    return `${userId} 의 유저 정보를 요청합니다!`;
  }

  @Patch('/:id') // Decorator 의 id 와 Param 의 id 의 네임은 일치해야 하지만 뒤의 오는 변수명은 아무거나 사용해도 된다
  patchUserById(@Param('id') fooId: string) {
    return `${fooId} 의 유저 정보가 업데이트 됩니다`;
  }

  @Delete('/:id')
  deleteByUserId(@Param('id') userId: string) {
    return `${userId} 의 유저가 삭제 되었습니다`;
  }
  
}

 

NestJS 의 decorator 를 이해하는 것은 굉장히 중요하다. decorator 를 통해 해당 함수의 역할 및 기능들을 정의해 준다. 

 

$ npm run start:dev

 

위 명령어로 프로젝트를 실행한 후에 Postman 또는 Insomnia 툴을 활용해서 아래의 주소로 요청을 보내보자.

  • GET localhost:3000/users
  • GET localhost:3000/users/1
  • PATCH localhost:3000/users/1
  • DELETE localhost:3000/users1

Insomnia 를 활용해 Controller 에게 요청을 보낸 결과 화면

 

 controller 에 작성한 return 값들을 확인 할 수 있다. 사실 controller 는 위에 작성한 예제처럼 직접 리턴값을 반환하는 것이 아닌 service 에서 비즈니스 로직을 받고 그 값을 리턴해야 한다. service 로직과 Post 요청에 대해서도 알아 보도록 하자.

 

 

참고

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기