웹 개발/node.js

Nest.js(1) - Nest.js 시작하기, 컨트롤러 기본

SolartheNomad 2023. 6. 4. 15:51

환경 세팅

nest.js/cli 라이브러리 불러오기 

npm i -g @nestjs/cli

 

nest.js 확장 폴더 설치하기

- '프로젝트이름' 명의 폴더가 설치된다. 

nest new 프로젝트이름

 

tsconfig.json 파일 수정

"experimentalDecorators": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,

- "esModuleInterop": true 를 추가해준다. 

 

package.json에서 잘봐야할 명령어는 start, build, start:dev이다. 

 

 

핫 리로딩 설정 

npm i --save-dev webpack-node-externals run-script-webpack-plugin webpack

 

- 공식문서 nest.js documentation의 Recipes > Hot Reload에 따라서, webpack-hmr.config.js 파일을 추가해주고, main.ts 파일을 수정해준 다음에, package.json의 코드를 다음과 같이 수정한다. 

,,,
"start:debug": "nest start --debug --watch",
"start:prod": "node dist/main",
,,,

 

 

nest.js에서 '컨트롤러 = 라우터'라고 생각하자 

 

app.controller.ts

import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';

@Controller('abc')
export class AppController {
  constructor(private readonly appService: AppService) {}
//컨트롤러는 req, res에 대해서 안다. 
  @Get('hello') //GET/abc/hello
  getHello(): string {
    return this.appService.getHello();
  }
  
  @Post('hi') // Post/abc/hi와 같음 @Controller에서 abc라고 라우터 설정을 해주었기 때문! 메서드는 클래스를 따라간다. 
  postHello() : string {
     return this.appService.postHello();
  }
 }

 

app.Service.ts

- 위의 postHello, getHello 메서드를 정의해준다. 

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

@Injectable()
export class AppService {
  getHello(): string {
    return 'Hello World!';
  }
  
  postHello():string {
    return : 'post succeeded';
  }
}

 

- 컨트롤러에서 GET 요청을 받게 되면, service 로직에서 실제로 요청을 처리하는 로직을 작성한다. (예를 들어서 user 목록을 가져오라는 요청을 받으면, db를 가져오는 것을 서비스 로직에서 한다.) 즉 해야하는 동작을 서비스에서 정의를 한다음, 그 결과값을 컨트롤러에 반환한다. 

- 마찬가지로 컨트롤러에서 POST 요청을 받게 되면, service 로직에서 실제로 요청을 처리하는 로직을 작성한다. (예를 들어서 user 목록에 새로운 사용자를 추가하라는 요청을 받으면, db를 수정하는 것을 서비스 로직에서 한다.) 즉 해야하는 동작을 서비스에서 정의를 한다음, 그 결과값을 컨트롤러에 반환한다. 

 

 

app.Controller.ts 리턴 코드 생성 

import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';

@Controller('abc')
export class AppController {
  constructor(private readonly appService: AppService) {}
//컨트롤러는 req, res에 대해서 안다. 
  @Get('user') //GET/abc/user // 클라이언트로부터 요청이 오는 것에 대한 것
  async getUser(): string {
    const user = await this.appService.getUser();
    return user; //user데이터 반환하는 것
    
  }
  

  
  @Post('user') // Post/abc/hi와 같음 @Controller에서 abc라고 라우터 설정을 해주었기 때문! 메서드는 클래스를 따라간다. 
  postUser() : string {
     return user;  //
  }
  
  @Post('user')
  postUser() : string {
     return {code : 'SUCCESS', data : user};
  }
 }

 

 

리턴코드가 근데...보면 계속 겹치는게 있다. data만 바꿔주면 될것 같아서, 다음과 같이 작성할 수 있다. 

app.controller.ts

  @Post('hi') // Post/abc/hi와 같음 @Controller에서 abc라고 라우터 설정을 해주었기 때문! 메서드는 클래스를 따라간다. 
  postHello() : string {
     return hello;
  }
  // return {code : SUCCESS, data : hello}; 와 같음
  
  @Post('user')
  postUser() : string {
     return false;
  }
 }
   // return {code : SUCCESS, data : data}; 와 같음
 
 {code : SUCCESS, data : data}

 

 

ConfigModule 사용하기

 

모듈 설치

npm i --save @nestjs/config