Express.js와 Sequelize를 활용한 서버, 데이터베이스 구축

Taeyoung's profile picture

Taeyoung9개월 전 작성

Express.js에서 Sequelize를 사용하는 기본 절차와 설정 방법, Sequelize를 활용한 데이터베이스 연결, Sequelize 구성 파일 생성, 모델 정의 및 연결에 관한 글입니다.

Sequelize 설치

Express 애플리케이션에서 Sequelize를 사용하기 위해 먼저 필요한 패키지를 설치합니다.

npm install --save sequelize mysql2

Sequelize 인스턴스 생성 및 연결 확인

기본적인 Sequelize 설정 예시입니다.

app.js 파일에 작성하면 됩니다.

데이터베이스 연결을 확인합니다. 연결 성공시 console 메시지를 표시하고, 실패하면 오류를 표시합니다.

주의 사항: 하드코딩을 사용하지 말아주세요. 보안상의 문제를 일으킬 수 있습니다.

DB_NAME 대신 process.env.DB_NAME, 'test'대신 process.env.USER_ID, '1234'대신 process.env.USER_PASSWORD와 같이 .env 활용해주시면 좋습니다.

const Sequelize = require('sequelize');
const sequelize = new Sequelize('DB_NAME', 'test', '1234', {
    host: '127.0.0.1',
    dialect: 'mysql',
});

sequelize
    .authenticate()
    .then(() => {
        console.log('데이터베이스 연결에 성공했습니다.');
    })
    .catch((err) => {
        console.error('데이터베이스 연결에 실패했습니다:', err);
    });

Sequelize 구성 파일 작성

config/config.js 파일을 작성하여 다양한 환경(개발, 테스트, 프로덕션)에 대한 데이터베이스 설정을 관리합니다.

아래는 예시입니다. 생성한 데이터베이스 이름, 개인 사용자 ID, 개인 비밀번호를 사용해주세요.

3개의 구성을 작성할 수 있습니다. 개발 환경, 테스트 환경, 배포 환경, Git Flow Logic에 따라서 models/index.js에서 각 환경에 맞춰서 설정만 변경해주시면 원하는 환경의 DB를 사용할 수 있습니다.

주의 사항으로는 위와 같이 하드코딩을 사용하지 말아주세요.

module.exports = {
  development: {
    username: 'test',
    password: '1234',
    database: 'test',
    host: '127.0.0.1',
    dialect: 'mysql',
  },
  test: {
    // 테스트 환경 설정
  },
  production: {
    // 프로덕션 환경 설정
  },
};

모델 및 연결 파일(models/index.js) 작성

models/index.js 파일은 Sequelize 모델을 초기화하고 관리합니다. 이 파일은 모든 모델을 가져오고, 데이터베이스와 연결하며, 관계를 설정하는 중심적인 역할을 합니다.

현재 사용하고 있는 코드입니다.

process.env.NODE_ENV를 사용해 개발 환경인지 확인할 수 있습니다.

데이터베이스 연결 설정은 config/config.js에서 가져옵니다.

모델의 경우 fs.readdirSync를 사용해 모델 파일을 동적으로 읽어옵니다.

모델간의 관계는 각 모델에서 설정할 수 있습니다. (1:1, 1:N, N:M)

'use strict';

const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const process = require('process');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/config.js')[env];
const db = {};

let sequelize;
if (config.use_env_variable) {
  sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  sequelize = new Sequelize(config.database, config.username, config.password, config);
}

fs.readdirSync(__dirname)
  .filter((file) => {
    return file.indexOf('.') !== 0 && file !== basename && file.slice(-3) === '.js' && file.indexOf('.test.js') === -1;
  })
  .forEach((file) => {
    const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
    db[model.name] = model;
  });

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

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

development 실제 예시

config.js 파일의 경우 dotenv를 사용하여 보안을 높여주세요.

예시 제공을 위해 하드 코딩하였습니다.

models/index.js는 예시와 같습니다.

require('dotenv').config();

module.exports = {
  development: {
    username: 'test',
    password: '1234',
    database: 'test',
    host: '127.0.0.1',
    dialect: 'mysql',
  },
  test: {
    username: 'root',
    password: null,
    database: 'database_test',
    host: '127.0.0.1',
    dialect: 'mysql',
  },
  production: {
    username: 'root',
    password: null,
    database: 'database_production',
    host: '127.0.0.1',
    dialect: 'mysql',
  },
};

new Sequelize(DB 이름, 사용자ID, 사용자 비밀번호)순으로 입력해주시면 됩니다. 또는 process.env를 활용해 암호화해주세요.

const sequelize = new Sequelize(process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASSWORD)

const express = require('express');
const cors = require('cors');
const app = express();
const userRoutes = require('./routes/user');
const postRoutes = require('./routes/post');
require('dotenv').config();

const PORT = 3345;
const Sequelize = require('sequelize');

app.use(cors());
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

const sequelize = new Sequelize(process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASSWORD, {
   host: '127.0.0.1',
   dialect: 'mysql',
 });

sequelize
  .authenticate()
  .then(() => {
    console.log('데이터베이스 연결에 성공했습니다.');
  })
  .catch((err) => {
    console.error('데이터베이스 연결에 실패했습니다:', err);
  });

app.get('/', (req, res) => {
  res.send('Food-bnb-server On!');
});

app.use(
  cors({
    origin: 'http://localhost:3000', // 허용하고 싶은 도메인
    credentials: true, // 응답 헤더에 Access-Control-Allow-Credentials 추가
  }),
);

app.use('/user', userRoutes);
app.use('/post', postRoutes);

app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).send('문제가 생겼네요.');
});

app.listen(PORT, () => {
  console.log(`서버 포트: ${PORT}`);
});

New Tech Posts