express sequelizeexpress 서버 구축express DBnode.js sequelize mysqlbackend

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

KUKJIN LEE
KUKJIN LEE
2024년 2월 19일
189

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}`);
});

관련 글

[SQL 입문] 필요한 데이터만 콕 집어 가져올 수 있는 WHERE 절

사용자는 테이블에 있는 모든 데이터를 다 보고 싶어 하지는 않습니다. 오히려 특정 항목에 대한 데이터만 가져오고 싶을 때가 훨씬 많습니다. 예를 들어, 어떤 사용자의 이메일이나 ID는 알고 있는데, 그 사람이 언제 우리 앱에 가입했는지 확인하고 싶다고 가정해 봅시다...

2026년 1월 27일10

SQL에서 SELECT란 무엇인가?

데이터베이스를 거대한 서류 보관함이라고 생각하면 됩니다. 보관함 안에는 수많은 데이터가 차곡차곡 쌓입니다. SELECT는 이 보관함에서 "내가 원하는 정보를 찾아줘!"라고 요청하는 명령어입니다. 이 과정을 전문 용어로 '쿼리(Query)'라고 부릅니다. &nbs...

2026년 1월 26일10

[SQL 기초] "언제 하나씩 다 넣어?" 데이터 한 번에 넣기

개발을 하다 보면 데이터베이스(DB)에 샘플 데이터를 대량으로 넣어야 할 때가 있습니다. 메뉴 100개를 추가해야 하는데 INSERT 문을 100번 쓰고 있다면? 너무 비효율적이죠! 오늘은 SQL에서 여러 데이터를 한 번에 넣는 '다중 삽입(Multiple Inse...

2026년 1월 21일13

SQL 데이터 삽입하기

데이터가 없는 데이터베이스는 연료 없는 로켓과 같습니다. 이제 'Missions' 테이블에 새로운 행(row)을 추가하는 방법을 알아보겠습니다. "삽입(Inserting)"은 '데이터 추가'를 의미합니다. 기존 Missions 테이블 ...

2026년 1월 20일12