본문으로 바로가기

Docker [3/3] - NodeJS + PostgreSQL 연결

category 개발 공부/Web (웹) 2021. 1. 22. 10:47
작성 날짜 수정 날짜
2020-12-31 2021-01-22

이제 PostgreSQL을 NodeJS와 연동해볼 것이다. 꼭 PostgreSQL일 필요는 없고, mariadb, MySQL 등 뭐든 상관없다.
그렇기 때문에 NodeJS에서의 DB 연동 설정은 조금 생략하고, docker 위주로 설명하려고 한다.

> npm install sequelize pg

일단 ORM인 sequelize와, PostgreSQL 연동을 위한 pg 모듈을 설치한다.

models/index.js

'use strict'

require('dotenv').config()
const Sequelize = require('sequelize')
const env = process.env
const config = require(__dirname + '/../config/')[env.NODE_ENV]
const db = {}

const sequelize = new Sequelize(config.database, config.username, config.password, config)

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db)
  }
})

db.sequelize = sequelize
db.Sequelize = Sequelize

module.exports = db

디비 모델을 설정해준다. 이 부분은 사람마다 구현하는 방식이 다르니 자세히 보지 않아도 된다.
나는 config/index.js에 DB 관련 설정을 모아두고, 모델 정의 파일인 models/index.js에서 불러오는 방식을 사용했다.

config/index.js

require('dotenv').config()

const env = process.env

const development = {
  "username": env.DB_USER,
  "password": env.DB_PW,
  "database": env.DB_NAME,
  "host": env.DB_HOST,
  "dialect": env.DB_TYPE,
  "define": {
    "underscored": false,
    "freezeTableName": false,
    "charset": "utf8",
    "dialectOptions": {
      "collate": "utf8_general_ci"
    },
    "timestamps": true,
    "paranoid": true
  }
}

module.exports = {
  development
}

이 코드도 너무 자세히 볼 필요는 없다. 나는 위와 같이 구현했다.
보면 환경변수로부터 username부터 dialect까지 불러와서 사용한다. 이렇게 하면, 도커로 실행 시 환경 변수만 다르게 해준다면, 다른 관계형 DB와도 얼마든지 연동이 가능하다.

docker-compose.yml

version: "3.8"
services:
  postgresql:
    image: postgres:13
    restart: always
    volumes:
      - ./postgresql/data:/var/lib/postgresql/data
    ports:
      - 5432:5432
    environment:
      POSTGRES_PASSWORD: "password"
      TZ: "Asia/Seoul"
  node:
    image: node:14
    working_dir: /usr/src/app
    environment:
      - NODE_ENV=development
      - DB_USER=postgres
      - DB_PW=password
      - DB_TYPE=postgres
      - DB_HOST=postgresql
    volumes:
      - ./src:/usr/src/app
    ports:
      - 80:3000
    command: bash -c "npm install && npm start"

나는 위와같이 docker-compose 파일을 작성했다.
restart: always 은 종료되더라도 재시작을 하도록 설정해준다.
컨테이너가 꺼지면, 모든 데이터가 날아갈 수도 있기 때문에, 로컬과 연동시켜서 터지더라도 백업할 수 있도록 하는 것이다.

중요한 것은 node 서비스에서, DB_HOST를 서비스명으로 해줘야 한다는 것이다. 서비스 이름이 postgresql로 설정되어 있기 때문에, 동일하게 설정해줬다.

> docker-compose ps
  Name                Command               State           Ports         
--------------------------------------------------------------------------
node       docker-entrypoint.sh bash  ...   Up      0.0.0.0:80->3000/tcp  
postgres   docker-entrypoint.sh postgres    Up      0.0.0.0:5432->5432/tcp

잘 실행된 것을 볼 수 있다.

 

node | Executing (default): SELECT 1+1 AS result

로그를 확인해보면 정상적으로 연동된 걸 확인할 수 있다.


디비 연결 자체는 따로 글을 안 써도 될 만큼 간단했다. 다음에는 NodeJS Sequelize transaction에 관한 글을 쓸 것이다.