Nest.js(1) - Nest.js 시작하기, 컨트롤러 기본
환경 세팅
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