새소식

Js/express

express - sequelize 모델 인스턴스 validation 공통 처리

  • -

개요

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

적용 후

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.