웹 풀스택

[Node.js] 유효성 검사: express-validatior

kevinmj12 2025. 2. 27. 12:52

유효성 검사

유효성 검사란 사용자가 입력한 값이 유효한지를, 타당한지를 확인하는 검사이다.

예를들어 로그인을 진행한다면 사용자로부터 아이디와 비밀번호를 입력받아야 하고, 아이디와 비밀번호는 그 조건을 만족하는 문자열이어야 할 것이다.

 

express-validator

https://www.npmjs.com/package/express-validator

 

express-validator

Express middleware for the validator module.. Latest version: 7.2.1, last published: 2 months ago. Start using express-validator in your project by running `npm i express-validator`. There are 11693 other projects in the npm registry using express-validato

www.npmjs.com

만약 유효성 검사를 하나하나 작성해야 한다면 매우 피곤할 것이다.

친절하게도 express-validator라는 모듈은 이런 작업을 편리하게 할 수 있도록 만들어준다.

 

https://express-validator.github.io/docs/guides/getting-started

 

Getting Started | express-validator

One of the best ways to learn something is by example!

express-validator.github.io

자세한 사용 정보는 위 github io에서 확인 가능하다.

 

const {body, validationResult} = require('express-validator')

먼저 코드 상단에 express-validator를 사용하기 위해 require()문을 작성해준다.

 

.post(body("userId").notEmpty().isInt(), (req, res) => {
    const result = validationResult(req);
    if (!result.isEmpty()) {
      console.log("userId가 유효성 검사를 통과하지 못했습니다.");
    }

그리고 요청을 처리하는 코드에 query("userId").notEmpty().isInt() 를 추가해주고,

 err = validationResult(req)로 유효성 검사 통과 여부를 저장하도록 하였다.

이상태로 userId에 이상한 값(abc)를 넣고 요청을 보내면 콘솔창에서 유효성 검사를 통과하지 못했다는 문구가 나온다.

 

  .post(
    body("userId").notEmpty().isInt().withMessage("숫자 입력 필요"),
    (req, res) => {
      const result = validationResult(req);
      if (!result.isEmpty()) {
        console.log("userId가 유효성 검사를 통과하지 못했습니다.");
        console.log(result.array());
      }

추가로 isInt() 뒤에 .withMessage()를 추가하여 에러 발생 시 출력되는 메시지를 설정할 수도 있다.

 

.post(
    [
      body("userId").notEmpty().isInt().withMessage("숫자 입력 필요"),
      body("name").notEmpty().isString().withMessage("문자 입력 필요"),
    ],
    (req, res) => {
      const result = validationResult(req);
      if (!result.isEmpty()) {
        return res.status(400).json(result.array());
      }

파라미터 여러 개를 유효성 검사를 진행하고 싶다면, 배열 [] 내에 여러 개를 넣으면 된다.

그리고 if문에 return res.status(400).json(err.array())를 통해 에러 발생 시 에러 메시지를 리턴하도록 하였다.

 

const { body, param, validationResult } = require("express-validator");

.get(param("id").notEmpty(), (req, res) => {
    const result = validationResult(req);

만약 body가 아닌 parameter로 전달받은 값에 대하여 유효성 검사를 진행하고 싶다면, 

위와 같이 body가 아닌 param으로 진행하면 된다.

 

유효성 검사를 미들웨어로 관리

매우 편리하게 유효성 검사를 할 수 있게 되었지만, 구현해야 할 API가 많을 때 이를 일일히 다 작성하는 것은 매우 힘든 일이다.

매번 const results = validationResult() .... 를 작성하지 말고 미들웨어로 관리하여 보자.

 

function validationError(req, res) {
  const result = validationResult(req);
  if (!result.isEmpty()) {
    return res.status(400).json(result.array());
  }
}


.get(body("userId").notEmpty().isInt(), (req, res) => {
  validationError(req, res);

먼저 함수로 빼서 위와 같이 작성할 수 있을 것이다. 

자주 사용하던 코드들을 validationError()로 호출할 수 있게 되어 편리해졌다.

 

function validationError(req, res, next) {
  const result = validationResult(req);
  if (!result.isEmpty()) {
    return res.status(400).json(result.array());
  }
  next();
}


.get([body("userId").notEmpty().isInt(), validationError], (req, res) => {

다른 방법으로 핸들러를 통해 유효성 검사를 진행할 수도 있다.

단 이 경우에는 next라는 파라미터를 추가로 받아 함수에 추가해주어야 하며,

유효성 검사를 진행하는 body("userId")... 부분을 배열로 감싼 뒤 맨 마지막에 validationError를 추가해주면 된다.