backend

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

KUKJIN LEE
KUKJIN LEE
2024년 2월 19일
168

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}`);
});
#express sequelize#express 서버 구축#express DB#node.js sequelize mysql