개요
express.js 프로젝트 진행 중 모델 인스턴스 validation을 일일히 작성해주는게 귀찮아 공통으로 처리하는 작업을 진행했다.
프로젝트 디렉토리 구조
project
├── app.js
├── middlewares
│ └── beforeValidateHandler.js
└── config
└── db.js
middlewares/beforeValidateHandler.js
const { ValidationError } = require('sequelize');
/**
* 모델 인스턴스 validation
*
* @param {Object} entity - 검증할 모델 인스턴스
* @throws {ValidationError} 속성 규칙에 따라 필드 값이 유효하지 않은 경우 예외 발생
*/
function validateAttributes(entity) {
for (const field in entity.rawAttributes) {
const inputValue = entity[field];
const column = entity.rawAttributes[field];
// 컬럼이 null을 허용하지 않고 입력받은 값이 비어있을 경우
if (column.allowNull === false && !inputValue) {
throw new ValidationError(`Validation error: ${column.comment}을(를) 입력해주세요.`);
}
}
}
/**
* beforeValidate 핸들러 등록
*
* @param {Object} sequelize - Sequelize 인스턴스
*/
function registerBeforeValidateHook(sequelize) {
sequelize.addHook('beforeValidate', (entity, options) => {
validateAttributes(entity);
});
}
module.exports = registerBeforeValidateHook;
사용법
app.js(index.js)에서 beforeValidateHandler를 등록해두면 된다.
app.js (index.js)
require('dotenv').config();
// server.js
const express = require('express');
const app = express();
const PORT = 3000;
const sequelize = require('./config/db')
const beforeValidateHandler = require('./middlewares/beforeValidateHandler');
// 모델 인스턴스 validation 핸들러 등록
beforeValidateHandler(sequelize);
// 데이터베이스 동기화 및 서버 시작
sequelize.sync({ alter: true }).then(() => {
console.info('Database & tables 생성');
// 기본적인 라우트 설정
app.listen(PORT, () => {
console.log(`Server is running on http://localhost:${PORT}`);
});
}).catch(err => {
console.error('Database 연결 중 오류 발생:', err);
});
적용 후