1. 구조 확인하기
우선 설치가 완료된 디렉터리에 가서 package.json을 확인합니다.
"scripts": {
"prebuild": "rimraf dist",
"build": "nest build",
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
"start": "nest start",
"start:dev": "nest start --watch",
"start:debug": "nest start --debug --watch",
"start:prod": "node dist/main",
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
"test": "jest",
"test:watch": "jest --watch",
"test:cov": "jest --coverage",
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
"test:e2e": "jest --config ./test/jest-e2e.json"
},
파일을 보면 프로젝트를 어떻게 시작할 수 있는지를 알 수 있는데 개발자 모드인 start:dev를 사용해 프로젝트를 시작해 보도록 하겠습니다. start;dev는 --watch옵션으로 프로젝트 전체의 변화를 감지하고 수정사항이 발생하면 즉시 빌드를 수행합니다.
npm run start:dev |
실행 후 기본적인 웹서비스가 동작하는 걸 확인할 수 있습니다.
참고로 port는 80번으로 하였으며 해당 번호는 src/main.ts에 지정되어 있습니다.
src/main.ts는 nestjs의 시작점입니다. 서비스는 무조건 main.ts로 시작하며 bootstrap() 함수를 호출하여 AppModule에서 app을 생성해 listen() 함수로 대기하게 됩니다.
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(80);
}
bootstrap();
main.ts는 이름을 바꿀 수 없지만 기본함수 boostrap()은 임의로 수정이 가능합니다. AppModule은 웹서비스 전체의 모듈이며 웹 서비스를 실현하는 주요 프로그램이라고 할 수 있습니다. 위 소스에서 AppModule로 정의된 부분을 보면
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
@Module({
imports: [],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
AppModule은 하나의 클래스이며 바로 위에 @Module()이라는 함수가 하나 존재합니다. netsjs에서는 @로 시작하는 함수를 데코레이터라고 하며 클래스에 함수 기능을 추가하기 위해 사용됩니다.
AppModule클래스는 @Module() 데코레이터에 의해서 Controller와 Service가 정의되는데 Controller는 AppService의 getHello()함수를 반환하고 있습니다.
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
return this.appService.getHello();
}
}
AppService는 AppController클래스의 생성자함수인 constructor()에 의해 전달되며 내부에 getHello()함수는 @Get() 데코레이터에 의해 get호출로 함수가 실해되도록 하고 있습니다. @Get()에서는 아무런 라우트도 지정되지 않았기에 기본적으로 '/'처럼 최상위 경로에 대한 요청을 실행합니다.
Controller에서 getHello()함수에서 반환되는 appService는 아래와 같이 구현되어 있습니다.
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}
소스 안에는 AppService라는 클래스를 볼 수 있으며 내부적으로 getHello() 함수 룰 하나 가지고 있습니다. getHello() 함수는 string형식의 값을 반환하며 실제 함수 내부에서 return에 의해 Hello World! 를 반환하고 있습니다. 이 때문에 클라이언트가 / 요청을 하게 되면 화면에 Hello World! 를 볼 수 있게 됩니다.
2. Controller
Controller는 사용자가 요청한 URL이나 get / post등을 통해서 들어온 데이터를 다루고 Service의 함수를 실행하는 역할을 수행합니다. AppController에서 다음과 같이 함수 하나를 추가해 봅니다.
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
return this.appService.getHello();
}
@Get('/test')
getTest(): string {
return 'test';
}
}
추가한 함수는 getTest()이며 @Get() 데코레이터에 의해 '/test'요청을 받고 test라는 string값을 반환합니다.
이와 같이 Controller는 사용자의 URL요청에 대응하는 역활을 수행합니다.
3. Service
Controller는 URL요청에 대응하고 Service는 사용자에게 무엇인가를 응답하기 위해 비즈니스 로직을 처리하는 역할을 수행합니다. 기본적인 철학은 URL요청과 비즈니스 처리 로직을 분리하고자 하는 것이며 이를 Controller와 Service를 통해 구현하는 것입니다.
AppService에서 아래와 같이 함수하나를 추가하고
export class AppService {
getHello(): string {
return 'Hello World!';
}
getTest(): string {
return 'test';
}
}
Controller에서 위에서 추가한 getTest()함수를 수정해 문자열 대신 Service의 getTest() 함수를 반환하도록 합니다.
@Get('/test')
getTest(): string {
return this.appService.getTest();
}
'/test'를 요청하면 아마도 브라우저는 위의 결과와 동일한 화면을 보여줄 것입니다.
'Web > NestJS' 카테고리의 다른 글
[nestjs] DTO (Data Transfer Object) (0) | 2021.03.16 |
---|---|
[nestjs] validation (0) | 2021.03.16 |
[nestjs] Service (0) | 2021.03.16 |
[nestjs] controller (0) | 2021.03.15 |
[NestJS] 소개및 설치 (0) | 2021.03.15 |