본문 바로가기
혼자 공부하는 것들/node.js

node.js 에서 Joi를 통해 validation를 검증해보자!

by applepick 2021. 8. 12.
반응형

node.JS로 rest API를 제작하면서 공부하던 중 validation 라이브러리 중 Joi가 괜찮아 보여서 사용해보았습니다.
해당 프로젝트로 들어가서 Joi를 설치해줍니다. package.json파일이 있는 곳에서 설치해주세요 저는 이 프로젝트에서만 사용할 테니 글로벌 옵션은 제거했습니다.

npm install joi

사용법은 간단합니다.

// ../API/validation/user.js 
const Joi = require('joi'); 
const user_validation = { 
	user_singup : async (req, res, next) =>{ 
	console.log("req :", req.query); 
    	const body = req.query; 
    	const schema = Joi.object().keys({ 
    		name: Joi.string().min(1).max(20).required(), 
        	password: Joi.string().min(1).max(20).required(), 
        	email: Joi.string().email().required(), 
        	}); 
    
    try { // 검사시작 
    	await schema.validateAsync(body); 
    } catch (e) { // 유효성 검사 에러 
    	return res.status(400).json({ code: 400, message: e.message });
    	} 
    next(); 
    }
    
  }; 
    
    module.exports = user_validation;

저는 로직에서 validation와 비지니스 로직을 분리하였습니다.

//index.js 
const express = require('express'), 
	  router = express.Router(); 

const user_validate = require('../API/validation/user'), 
      user = require('../API/controllers/user.controller'), 

//회원가입 
router.post('/signup', user_validate.user_singup, user.signup); 

module.exports = router;

값을 받아오면 값에 대한 validation을 합니다. 만약 정상적인 값이라면 next()를 통해 user.singup으로 넘어갑니다. user.singup에서는 변수 컨트롤을 안 해줘도 되어 나중에 테스트 코드를 작성할 때 조금 테스트하기 편할 것이라고 생각합니다.
index에서는 라우터만 연결해주었습니다. 여기에 비지니스 로직을 들어가는 방법은 옳지 않은 방법이라 생각했습니다.

https://joi.dev/api/?v=17.4.2

 

joiSite

## Build Setup

joi.dev


이곳은 joi API 공식 문서입니다. 자세한 사용방법이 나와있으니 참고해주시면 좋을듯합니다.
제가 사용하면서 삽질했던 내용을 정리해보려고 합니다. 저는 rest api를 제작하면서 값을 검증할 때 관계 연산이 필요했습니다. 예를 들어 업데이트해야 할 값을 받아오는데 3개 중에 하나만 받아야 합니다. 이때 Joi로 validation 하면 간결해집니다.

const body = req.query; 
const schema = Joi.object().keys({ 
	name: Joi.string().min(1).max(20), 
    phone: Joi.string().min(1).max(20), 
    id: Joi.string().min(1).max(20), 
   	}) 
    .xor('name', 'phone', 'id'); 
    
    try { // 검사시작 
    	await schema.validateAsync(body); 
    } catch (e) { // 유효성 검사 에러 
    	return res.status(400).json({ code: 400, message: e.message }) 
    }

이렇게 사용한다면 값을 xor로 관계 연산으로 받아올 수 있습니다. 짝짝짝~ 저는 변수 뒤에. required()를 줘가지고 xor이 안되었습니다... 엄청난 삽질을... ㅠㅠ required()는 필수로 값을 받아와야 하는 옵션입니다.! 이런 식으로 값들을 쉽게 핸들링할 수 있습니다. 이제는

if(name != undefined || name.length == 0 ...)

이렇게 귀찮게 안 하고도 joi를 통해 쉽게 validation 합시다. 끝!!

반응형

댓글