Using Node(3)

develop app

Intro

이전 섹션에서 구축한 애플리케이션을 위한 로컬 개발 환경을 설정하는 과정을 살펴본다.

Local database and containers

이번 섹션에서는 MongoDB를 사용한다. MongoDB를 직접 다운로드 하는것 대신에 Docker 공식 이미지를 사용하도록 한다.

MongoDB Container 를 실행하기 전에 Data를 저장할 수 있는 볼륨을 설정한다. Docker 가 제공하는 volumes 기능을 사용한다.

data와 MongoDB 설정 볼륨을 만든다.

1
2
$ docker volume create mongodb
$ docker volume create mongodb_config

애플케이션과 database가 소통할 네트워크를 생성한다. 네트워크는 사용자 정의 브리지 네트워크라고 하며 컨테이너간 소통할때 사용할 수 있는 DNS 조회 서비스를 제공한다. (mongodb 로 접속할 수 있게 DNS 제공)

1
$ docker network create mongodb

이제 컨테이너에서 mongoDB를 실행하고 볼륨과 네트워크를 연결한다.

1
2
3
4
5
$ docker run -it --rm -d -v mongodb:/data/db \
-v mongodb_config:/data/configdb -p 21017:21017 \
--network mongodb \
--name mongodb \
mongo

server.js 를 수정해서 mongoDB를 사용하도록 한다. process.env.CONNECTIONSTRING 과 같이 환경 변수를 조회하고 있는데 나중에 컨테이너를 실행시킬때 CONNECTIONSTRING 이라는 이름에 환경변수를 추가할 수 있다.

1
2
3
4
5
6
7
8
const ronin     = require( 'ronin-server' )
const mocks = require( 'ronin-mocks' )
const database = require( 'ronin-database' )
const server = ronin.server()

database.connect( process.env.CONNECTIONSTRING )
server.use( '/', mocks.server( server.Router(), false, false ) )
server.start()

ronin-database 를 추가했으므로 설치한다.

1
$ npm i ronin-database

build 한다.

1
$ docker build --tag node-docker .

컨테이너를 실행시킨다. 여기서 CONNECTIONSTRING 환경변수를 추가해서 애플리케이션이 어떻게 데이터베이스에 접근해야 하는지 알려준다.

1
2
3
4
5
6
7
$ docker run \
-it --rm -d \
--network mongodb \
--name rest-server \
-p 8000:8000 \
-e CONNECTIONSTRING=mongodb://mongodb:27017/yoda_notes \
node-docker

Use Compose to develop locally

하나의 명령으로 node-docker 와 MongoDB를 시작하는 Compose 파일을 생성해 본다. 또한 컴포즈 파일로 node-docker 를 시작할때 debug mode로 시작하게 해서 실행중인 프로세스에 디버거를 연결할 수 도 있다.

docker-compose.dev.yml 파일을 만들어서 다음 내용을 복사한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
version: '3.8'

services:
notes:
build:
context: .
ports:
- 8000:8000
- 9229:9229
environment:
- SERVER_PORT=8000
- CONNECTIONSTRING=mongodb://mongo:27017/notes
volumes:
- ./:/app
command: npm run debug

mongo:
image: mongo:4.2.8
ports:
- 27017:27017
volumes:
- mongodb:/data/db
- mongodb_config:/data/configdb
volumes:
mongodb:
mongodb_config:

compose 파일을 이용하면 docker run 할때 사용했던 여러가지 파라미터를 컴포즈 파일에 명시함으로써 생략할 수 있다.

  • 디버거를 연결할 수 있는 9229 포트를 노출한다.
  • services 에서 설정한 이름을 서비스에서 설정할 수 있다. 이경우에는 mongo 가 된다.
  • 디버거 모드로 실행하기 위해서 package.json 에 스크립트를 추가한다.
1
"debug" : "nodemon --inspect=0.0.0.0:9229 server.js"

nodemon을 사용함으로 nodemon을 설치한다

1
$ npm i nodemon 

애플리케이션을 시작한다.

1
$ docker-compose -f docker-compose.dev.yml up --build

docker 이미지를 컴파일한 다음 시작하도록 —build 플래그를 전달한다.

디버깅 모드로도 실행되고 8000 번 포트로 접근할 수 도 있다.

1
$ curl --request GET --url http://localhost:8000/notes

Connect a debugger

크롬 브라우저와 함께 제공되는 디버거를 사용할 수 있다. 크롬을 열고 주소창에 about:inspect 를 입력한다.

depends_on

어떤 컨테이너는 다른 컨테이너의 의존해서 실행 순서가 나중이어야 하는 경우가 있다. mysql을 사용하면서 특정 테이블이 생성되기 전에 server에서 접근하면 에러가 발생하는데 이런경우 mysql 컨테이너가 테이블을 만드는 시점보다 server 가 실행되는 시점이 더 빠르기 때문이다. 의존성을 추가하고 싶다면 depends_on 을 사용하여 의존성을 명시해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
services:
notes:
depends_on:
- mysqldb
build:
context: .
ports:
- 443:8080
- 9229:9229
environment:
- SERVER_PORT=8080
- DB_PORT=3306
- MYSQL_DATABASE=test
- USER=root
- MYSQL_ROOT_PASSWORD=1q2w3e
- HOST=mysqldb
volumes:
- ./:/app
command: yarn run debug