joi라이브러리 유효성검사

권태형·2023년 3월 11일
1

이집은

목록 보기
12/12
post-thumbnail

이번 프로젝트에 joi라이브러리를 이용한 유효성검사와 그에 때른 에러 핸들러 미들웨어를 작성하게 되었다.

코딩 초기 if로 유효성 검사를 하게되면 그 코드의 길이나 양이 많이 늘어나고, 코드가 지저분해 지는 것을 겪어 보았을 것이다.

하나의 text를 검증할 때에도 고려해야할 것이 많다. 예를 들어 한 줄의 문자열을 받는다면

최소 글자수
타입
들어가서는 안되는 용어
다른 택스트와 겹치도 되는지 않되는지
최대 글자수
기타 등등

검증해야할 것이 많은데 if로 처리해서 === , !== 등 으로 어떻게 언제 다 검증할 것인가.
너무 효율성과 가독성이 떨어진다. 이러한 문제점을 해결하게 해주는 라이브러리가 joi 이다.

joi 라이브러리란?

joi는 Node.js에서 사용할 수 있는 데이터 검증 및 스키마 유효성 검사 라이브러리이다. joi는 데이터의 형식, 범위, 값 등을 정의하고 유효성을 검사할 수 있게 해 준다.

사용방법

npm을 통해 joi를 설치해준다.

npm install joi

1. 설치한 joi를 임포트 해와서 유효성검증할 객체를 정의해 준다.

필자는 joi로 만든 객체만 따로 정리한 validation파일을 따로 만들어서 export했다.
아래는 validation 파일의 일부 이다.

const joi = require('joi');
const { postLocation1, postLocation2 } = require('../static/postLocation')

const createPostValidation = joi.object().keys({
  title: joi.string().trim().required().min(1).max(100).not(''),
  content: joi.string().trim().required().min(1).max(10000).not(''),
  postLocation1: joi
    .string()
    .required()
    .valid(...postLocation1),
  postLocation2: joi
    .string()
    .required()
    .valid(...postLocation2),
  userId: joi.number().required(),
  email: joi.string().required(),
  postImage: joi.string(),
});

module.exports = createPostValidation

2. 작성한 객체를 joi에 포함된 내장 메소드 validateAsync를 이용해 검증한다.

아래는 게시글 파일의 서비스 로직 일부이다.

const createPostValidation = require('../validations/post.validaiton')

createPost = async (postInput) => {
    const { email, ...postInfo } = await createPostValidation.validateAsync(
      postInput,
    );
    postInfo.email = email.split('@')[0];
    await this.postRepository.createPost(postInfo);
  };

검증에 성공하면 통과하고 실패하면 에러에 Joi.ValidationError를 예외로 던진다.

3. 실패시 예외처리되는 에러를 응답한다.

아래는 에러 핸들러의 일부 코드이다.

const errorHandler = (err, req, res, next) => {
  if (err.isBoom) //isBoom 에러
      else if (err.isJoi)
    res
      .status(400)
      .json({ errorMsg: '유효성 검사 오류', originalMsg: err.message });
  else res.status(500).json({ errorMsg: '알 수 없는 오류' });
};

좀 더 자세한 사용방법을 알고 싶다면 joi 공식페이지 를 참고하자. 다행이 여기 공식페이지는 잘 정리되어 있어 알아보기 쉽다.

장단점

joi는 Node.js에서 매우 유용한 데이터 유효성 검사 라이브러리이다. 간편하고 가독성이 높은 검증 규칙을 제공하며, 다양한 데이터 유형과 함께 사용할 수 있다.

장점

  • 간편하고 가독성이 높은 유효성 검사
  • 다양한 데이터 유형을 지원
  • 검증 규칙을 쉽게 추가하고 수정할 수 있다.
  • 다른 라이브러리와 연동이 가능하며, 웹 프레임워크와도 함께 사용할 수 있다.

단점

  • joi의 검증 규칙이 매우 제한적일 수 있다.
    만약 사용자 정의 규칙을 추가해야 한다면, 직접 구현해야 한다.
  • 스키마 유효성 검사를 수행하는 데 추가적인 리소스가 필요하다.
    이는 joi가 다른 라이브러리에 비해 처리 속도가 느릴 수 있는 이유 중 하나이다.

validation을 위한 다른 유사한 라이브러리


joi 라이브러리도 매우 유용하고 사용량도 제일 많지만, 다른 선택지도 많이 있다고 한다.
아래는 joi와 유사한 몇 가지 라이브러리이다.
모두 Node.js에서 작동하며, 다양한 유효성 검사 규칙과 함께 사용할 수 있다.
각각의 라이브러리의 특징과 장단점을 고려하여 적절한 라이브러리를 선택하면 될 것이다.

Yup

유효성 검사 규칙을 정의하는 데 사용하는 JavaScript 객체 스키마를 지원한다.
브라우저와 Node.js에서 모두 작동한다.
멋진 에러 메시지를 지원한다.

Validator.js

문자열 유효성 검사에 특화되어 있다.
Node.js에서 작동하며, 브라우저에서도 사용할 수 있다.
다양한 유효성 검사 규칙을 제공한다.

Express-validator

Express 웹 프레임워크에 특화되어 있다.
사용자 정의 유효성 검사 규칙을 구현할 수 있다.
다양한 에러 메시지 유형을 지원한다.


참고자료(출처)
joi 공식 홈페이지
npm 트랜드 비교 분석 사이트
Chat GPT 검색결과

profile
22년 12월 개발을 시작한 신입 개발자 ‘권태형’입니다. 포스팅 하나하나 내가 다시보기 위해 쓰는 것이지만, 다른 분들에게도 도움이 되었으면 좋겠습니다. 💯컬러폰트가 잘 안보이실 경우 🌙다크모드를 이용해주세요.😀 지적과 참견은 언제나 환영합니다. 많은 댓글 부탁드립니다.

0개의 댓글