작성 날짜 | 수정 날짜 |
---|---|
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에 관한 글을 쓸 것이다.
'개발 공부 > Web (웹)' 카테고리의 다른 글
Docker [2/3] - NodeJS 환경 구축 (0) | 2021.01.22 |
---|---|
Docker [1/3] - 기초부터 이미지 생성까지 (0) | 2021.01.20 |
반복문 병렬 처리 (0) | 2021.01.08 |
nodeJS는 JS 기반인데 어떻게 웹 서버로 사용할 수 있을까? (0) | 2020.09.28 |
livereload 사용법 (0) | 2019.01.25 |