팀프로젝트나 심화 과제를 하면서 느꼈던 점은 유효성 검사를 진행하게 되면 if문을 자주 사용하게 되어서 코드가 길어지고 한눈에 안들어온다고 느껴졌다.
다른 팀이 joi 라이브러리를 사용하여 유효성 검사를 진행했던 것을 보고 따로 찾아보니 중복적으로 사용하는 코드를 줄여주기 위해 joi 라이브러리를 사용하면 비교적 깔끔하게 유효성 검사를 할 수 있다고 한다.
joi가 좋은 점은 관계에 따른 내용을 정의할 수 있다. 예를 들어 a와 b가 둘 중에 하나라도 있으면 된다던가, a가 있을때만 b가 있어야 된다는 식으로 사용할 수 있다.
const Joi = require('joi');
// validate할 schema 정의
const schema = Joi.object().keys({
username: Joi.string().min(3).max(30).required(),
birthyear: Joi.number().integer().min(1900).max(2018),
});
// validate할 object
const user = {
username: 'username1',
};
// validate
const {error, value} = Joi.validate(user, schema);
console.log(error); // null
console.log(value); // {username: "username1"}
schema에 정의되지 않은 key는 valdate error가 나므로 .unknown()
API를 사용하여 방지
const Joi = require('joi');
// .unknown()이 없는 경우
const schema1 = Joi.object().keys({
username: Joi.string().min(3).max(30).required(),
});
const user1 = {
username: 'username1',
birthyear: 2014, // schema1에 정의되지 않은(unknown) 'birthyear'
};
const {error: error1, value: value1} = Joi.validate(user1, schema1);
console.log(error1); // Error: "birthyear" is not allowed
console.log(value1); // {username: "username1", birthyear: 2014}
// .unknown()이 있는 경우
const schema2 = Joi.object().keys({
username: Joi.string().min(3).max(30).required(),
})
.unknown(); // 정의되지 않은 key도 허용함.
const user2 = {
username: 'username1',
birthyear: 2014, // schema1에 정의되지 않은(unknown) 'birthyear'
};
const {error: error2, value: value2} = Joi.validate(user2, schema2);
console.log(error2); // null
console.log(value2); // {username: "username1", birthyear: 2014}
에러가 나면 더 이상 진행하지 않는 것이 기본 동작(abortEarly: true). 한 번에 에러를 확인하고자 한다면 validate 시점에 동작을 제어할 수 있는 validate()의 세 번째 파라미터로 {abortEarly : false}를 설정하면 된다.
const options: {
abortEarly: false,
};
.and
, .or
, .nand
, .xor