[NestJS] starter-kit bolierplate 구조 살펴보기 & PostgreSQL Docker 준비

JeungJoo Lee
CrocusEnergy
Published in
6 min readSep 17, 2020

저번 포스팅[NestJS] Introduction 에서 설치한 nest-starter-kit 을 통해 이번 시간에는 NestJS 의 기본적인 사용법과 개념들을 알아볼 것이다.

먼저 프로젝트 폴더 구조를 잠깐 살펴 보도록 하겠다.

크게 root 에는 eslint 관련 파일과, nest-cli.json, package.json, tsconfig.json 등의 설정 파일들이 존재한다.

eslint 는 우리가 익히 알다시피 Code Convention 을 위한 설정이다. ts config 의 경우 tsc 를 통해 트랜스파일된 js는 어느 위치로 build 할 것인지 설정과 target ecma 버전은 몇인지 이러한 설정들이 존재한다. 이외에도 eslint 와 tsconfig는 다양한 설정들이 존재하니 이 부분은 개발을 하면서 디테일함을 잡으면 될듯 하다.

tsconfig.json

{
"compilerOptions": {
"module": "commonjs",
"declaration": true,
"removeComments": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"allowSyntheticDefaultImports": true,
"target": "es2017",
"sourceMap": true,
"outDir": "./dist",
"baseUrl": "./",
"incremental": true
}
}

NestJS가 기본적으로 완전한 Typescript를 지원하는 프레임워크이다 보니 기본적으로 Typescript를 설정하여 사용할 수 있도록 nestjs 공식 프로젝트에서 제공하는 boilerplate 의 모습이다.

src 폴더

src 폴더는 실제 소스 폴더이다. 아직은 굉장히 flat 한 구조에 app.service.ts, app.module.ts, app.controller.ts app.controller.spec.ts 등의 한 쌍의 app 프로그램이 존재한다. 그리고 nestjs의 어플리케이션의 entry point 인 main.ts가 존재한다.

각각의 역할을 정의하자면 아래와 같이 간단히 설명할 수 있을 것이고 더 자세한 설명은 후반부로 갈수록 깊게 설명하도록 하겠다.

main.ts

어플리케이션의 시작 Entry Point 이자 HTTP 서버를 띄우는 곳이다.

app.controller.spec.ts

테스트 코드를 작성하는 파일이다.

app.module.ts

Service, Repository, Model, Controller 등 각각의 기능 모듈을 담당하고 있는 레이어를 각 기능 단위로 import 하거나 export 할 수 있는 역할이다.

app.service.ts

Service 레이어이다. 해당 Service dependency는 Singleton 으로 관리되고 기능 로직 부분을 담당하도록 작성한다.

app.controller.ts

실제 Route URL 이 정의되고 해당 Route URL 을 통해 Http Request와 Response 가 되는 Client 계층과 인터페이스하는 곳이다.

간단히 NestJS 에서 제공하는 bolierplate의 구조가 어떻게 되어있는지 파악해보았다.

두 번째로 CRUD 실습을 위해 PostgreSQL DB 를 Docker 로 설치해 보겠다,

PostgreSQL Docker Setup

가장 간단한 사용자 CRUD API 구현을 하기 전에 사전 준비 작업인 데이터베이스를 Docker로 활용 하도록 준비할 것이다. 앞서 살펴 보았던 bolierplate root 에 docker 폴더를 생성한다.

위의 docker 폴더 안에는 docker-compose.yml 이 존재한다.

docker-compose.yml

version: '3.1'
services:
db:
image: postgres
restart: always
environment:
POSTGRES_PASSWORD: password
POSTGRES_DB: uaa
volumes:
- ../data:/var/lib/postgresql/data
- ./init/:/docker-entrypoint-initdb.d/
ports:
- 5432:5432
db-admin:
image: adminer
restart: always
ports:
- 8080:8080

그리고 start.shstop.sh 쉘을 만들어서 docker-compose up 과 stop 등을 구현 했지만 아래와 같이 cli로 사용하면 된다.

// postgressql 컨테이너 실행
docker-compose -f docker-compose.yml up

// 컨테이너 서비스 종료
docker-compose down $(docker ps -q)

🙏 "Docker 가 기본적으로 설치 되어있다는 것을 전제로 함"

추가적으로, init 폴더를 만든 이유는 기본적으로 DDL 실행이나 데이터베이스 initialize를 하기 위해 sql 파일을 사전에 작성하여 넣는곳으로 처음 컨테이너가 실행될 때 최초에 한번 실행되게 된다.

컨테이너가 정상적으로 실행 될 때 아래와 같다.

아래와 같이 docker 프로세스 확인을 위해 명령어를 치면 현재 몇 번 포트로 서비스가 가동되어있는지 확인할 수 있다.

docker ps

유저정보로는 postgres // password 로 DB를 접속하면 된다. DATABASE는 yml 설정대로 uaa로 설정되어 있다.

이상 NestJS Starter Kit boilerplate 와 PostgreSQL Docker 를 세팅하는 작업을 진행하였다.

다음글. [NestJS] Controller 개념 및 실습

--

--