꿈꾸는 시스템 디자이너

[NestJS] 첫 번째 프로젝트 본문

Development/JS

[NestJS] 첫 번째 프로젝트

독행소년 2021. 10. 5. 15:24

프로젝트 생성

first-nest란 NestJS 프로젝트를 생성한다.

root@08a895abeaa2:~# nest new first-nest
⚡  We will scaffold your app in a few seconds..

CREATE first-nest/.eslintrc.js (631 bytes)
CREATE first-nest/.prettierrc (51 bytes)
CREATE first-nest/README.md (3339 bytes)
CREATE first-nest/nest-cli.json (64 bytes)
CREATE first-nest/package.json (1966 bytes)
CREATE first-nest/tsconfig.build.json (97 bytes)
CREATE first-nest/tsconfig.json (546 bytes)
CREATE first-nest/src/app.controller.spec.ts (617 bytes)
CREATE first-nest/src/app.controller.ts (274 bytes)
CREATE first-nest/src/app.module.ts (249 bytes)
CREATE first-nest/src/app.service.ts (142 bytes)
CREATE first-nest/src/main.ts (208 bytes)
CREATE first-nest/test/app.e2e-spec.ts (630 bytes)
CREATE first-nest/test/jest-e2e.json (183 bytes)

? Which package manager would you ❤️  to use? npm
✔ Installation in progress... ☕

🚀  Successfully created project first-nest
👉  Get started with the following commands:

$ cd first-nest
$ npm run start


Failed to execute command: git init
Git repository has not been initialized
                                                                                                                              
                                                                                                               Thanks for installing Nest 🙏
                                                                                                      Please consider donating to our open collective
                                                                                                             to help us maintain this package.
                                                                                                                              
                                                                                                                              
                                                                                                    🍷  Donate: https://opencollective.com/nest
                                                                                                                              
root@08a895abeaa2:~#

 

프로젝트 실행

프로젝트 디렉토리로 진입하여 프로젝트를 실행한다.

root@08a895abeaa2:~# cd first-nest/
root@08a895abeaa2:~/first-nest# ls
README.md  nest-cli.json  node_modules  package-lock.json  package.json  src  test  tsconfig.build.json  tsconfig.json
root@08a895abeaa2:~/first-nest# npm run start

> first-nest@0.0.1 start /root/first-nest
> nest start

[Nest] 31184  - 10/05/2021, 2:47:29 PM     LOG [NestFactory] Starting Nest application...
[Nest] 31184  - 10/05/2021, 2:47:29 PM     LOG [InstanceLoader] AppModule dependencies initialized +22ms
[Nest] 31184  - 10/05/2021, 2:47:29 PM     LOG [RoutesResolver] AppController {/}: +4ms
[Nest] 31184  - 10/05/2021, 2:47:29 PM     LOG [RouterExplorer] Mapped {/, GET} route +3ms
[Nest] 31184  - 10/05/2021, 2:47:29 PM     LOG [NestApplication] Nest application successfully started +2ms

 

브라우저로 서버에 접근하여 서버 동작여부를 확인한다.

 

리소스 추가

새로운 리소스 cats를 추가한다.

root@08a895abeaa2:~/first-nest# ls
README.md  dist  nest-cli.json  node_modules  package-lock.json  package.json  src  test  tsconfig.build.json  tsconfig.json
root@08a895abeaa2:~/first-nest# nest g res cats
? What transport layer do you use? REST API
? Would you like to generate CRUD entry points? Yes
CREATE src/cats/cats.controller.spec.ts (556 bytes)
CREATE src/cats/cats.controller.ts (873 bytes)
CREATE src/cats/cats.module.ts (240 bytes)
CREATE src/cats/cats.service.spec.ts (446 bytes)
CREATE src/cats/cats.service.ts (595 bytes)
CREATE src/cats/dto/create-cat.dto.ts (29 bytes)
CREATE src/cats/dto/update-cat.dto.ts (165 bytes)
CREATE src/cats/entities/cat.entity.ts (20 bytes)
UPDATE package.json (1999 bytes)
UPDATE src/app.module.ts (308 bytes)
✔ Packages installed successfully.
root@08a895abeaa2:~/first-nest#

소스 디렉토리에 cats란 서브 디렉토리가 생성되고 controller, service, module 관련 파일들이 생성되고, 하부 dto 디렉토리에 create와 update용 dto 파일, 그리고 entities 디렉토리에는 기본 cat 클래스의 파일이 생성되었다.

 

다시 말하면 리소스(cats)을 생성하면 다음과 구성들이 자동 생성되고 설정된다.

- Controller: 라우터 처리

- Service: 라우터로부터 호출되는 서비스 로직

- Module: 리소스 구성 명세 및 종속성 명세

- cat.entity.ts : 리소스의 데이터 모델 클래스 정의 파일

- create-cat.dto.ts/update-cat.dto.ts: 리소스 데이터의 추가 및 갱신에 사용되는 클래스 정의 파일

 

개발모드로 서버 재가동

프로젝트의 파일이 변경될 때 마다 변화를 반영하여 서버를 재가동하기 위해 프로젝트를 개발모드로 재가동 한다.

package.json 파일의 scripts 항목을 확인한다.

 "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 옵션을 이용한다.

root@08a895abeaa2:~/first-nest# npm run start:dev

[3:13:44 PM] Starting compilation in watch mode...

[3:13:46 PM] Found 0 errors. Watching for file changes.

[Nest] 12960  - 10/05/2021, 3:13:46 PM     LOG [NestFactory] Starting Nest application...
[Nest] 12960  - 10/05/2021, 3:13:46 PM     LOG [InstanceLoader] AppModule dependencies initialized +22ms
[Nest] 12960  - 10/05/2021, 3:13:46 PM     LOG [InstanceLoader] CatsModule dependencies initialized +0ms
[Nest] 12960  - 10/05/2021, 3:13:46 PM     LOG [RoutesResolver] AppController {/}: +4ms
[Nest] 12960  - 10/05/2021, 3:13:46 PM     LOG [RouterExplorer] Mapped {/, GET} route +5ms
[Nest] 12960  - 10/05/2021, 3:13:46 PM     LOG [RoutesResolver] CatsController {/cats}: +0ms
[Nest] 12960  - 10/05/2021, 3:13:46 PM     LOG [RouterExplorer] Mapped {/cats, POST} route +1ms
[Nest] 12960  - 10/05/2021, 3:13:46 PM     LOG [RouterExplorer] Mapped {/cats, GET} route +1ms
[Nest] 12960  - 10/05/2021, 3:13:46 PM     LOG [RouterExplorer] Mapped {/cats/:id, GET} route +2ms
[Nest] 12960  - 10/05/2021, 3:13:46 PM     LOG [RouterExplorer] Mapped {/cats/:id, PATCH} route +1ms
[Nest] 12960  - 10/05/2021, 3:13:46 PM     LOG [RouterExplorer] Mapped {/cats/:id, DELETE} route +1ms
[Nest] 12960  - 10/05/2021, 3:13:46 PM     LOG [NestApplication] Nest application successfully started +2ms

이제 파일을 저장할 때 마다 파일의 변화를 감지하여 서버가 재시작된다.

 

리소스 접근

cats 리소스에 접근한다.

다음은 cat/를 GET으로 접근한 것이다.

 

다음은 cat/111을 GET으로 접근한 것이다.

 

cats.controller.ts 파일을 확인하자.

import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common';
import { CatsService } from './cats.service';
import { CreateCatDto } from './dto/create-cat.dto';
import { UpdateCatDto } from './dto/update-cat.dto';

@Controller('cats')
export class CatsController {
  constructor(private readonly catsService: CatsService) {}

  @Post()
  create(@Body() createCatDto: CreateCatDto) {
    return this.catsService.create(createCatDto);
  }

  @Get()
  findAll() {
    return this.catsService.findAll();
  }

  @Get(':id')
  findOne(@Param('id') id: string) {
    return this.catsService.findOne(+id);
  }

  @Patch(':id')
  update(@Param('id') id: string, @Body() updateCatDto: UpdateCatDto) {
    return this.catsService.update(+id, updateCatDto);
  }

  @Delete(':id')
  remove(@Param('id') id: string) {
    return this.catsService.remove(+id);
  }
}

 

첫 번째 그림의 리소스 접근은 GET 방식으로 컨트롤러의 findAll 메소드로 전달되고, 두 번째 그림의 리스소 접근은 findOne 메소드로 전달된다.

Patch나 Delete 메소드는 브라우저의 URL창을 이용해서는 호출할 수 없으므로 insomnia와 같은 프로그램을 이용한다.

https://insomnia.rest/

 

The API Design Platform and API Client

Leading Open Source API Client, and Collaborative API Design Platform for REST, SOAP, GraphQL, and GRPC

insomnia.rest

 

 

'Development > JS' 카테고리의 다른 글

Next.js 팁  (0) 2021.10.13
React 개발 환경 구성  (0) 2021.09.30
NestJS 개발에 유용한 npm 패키지들  (0) 2021.09.27
NestJS 기본 소스 구조  (0) 2021.09.23
NestJS 개발 환경 구성  (0) 2021.09.23
Comments