Express.js와 Sequelize를 활용한 서버, 데이터베이스 구축
Taeyoung • 9개월 전 작성
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}`);
});