-
[OKU] 유효성 검사는 어디에서 발생하는가?Project 2021. 7. 2. 00:34
유효성검사 코드를 조금 수정해놓았다. 기존의 코드는 컨트롤러단에서 검사를 하고 있어서 코드를 보기 어렵다고 판단했다.
문득, 유효성검사 코드를 건드리면서 궁금한 점이 하나 생겼다.
유효성 검사는 어디에서 일어나는걸까.
1. 클라이언트
2. 비즈니스 로직
3. DB단
유효성 검사는 클라이언트, 비즈니스로직, 데이터베이스 등 애플리케이션 전체에 골고루 분포될 수 있다.
하지만 유효성 검사가 여기저기 분포될 수록 코드의 관리가 어려워진다. 검사 조건이 변경될 때 마다 찾아서 변경할 수도 없고,
클라이언트와 데이터베이스간의 유효성 검사 조건 맞추는 것도 일일이 비교대조 해야해서 시간이 꽤 걸렸다.
거기에 잘 작동하는지도 일일이 확인해야했다. 비즈니스 로직에서 추가적으로 유효성 검사를 하면 좀 더 튼튼한 웹사이트가 되겠지만, 굳이 거기에 시간적 비용, 메모리를 잡아 넣을 이유가 마땅히 생각나지 않아서 하지 않기로했다.
user.js
const mongoose = require("mongoose"); const Joi = require('joi'); const { Schema, model, Types } = mongoose; const user = new Schema({ email: { type: String, }, password: { type: String, }, number: { type: String, }, nickname: { type: String, required: true, }, profileImg: { type: String, }, marketdesc: { type: String, default: "", }, kakaoId: String, }); //스키마를 변수에 저장 const User = mongoose.model('User',user) // 스키마를 인자로하는 벨리데이터 생성 const validateUser = (user) => { const schema = Joi.object({ email: Joi.string().email(), password: Joi.string().pattern(new RegExp('^(?=.*[a-zA-z])(?=.*[0-9])(?=.*[$`~!@$!%*#^?&\\(\\)\-_=+]).{8,15}$')), // password2의 경우, 벨리데이션은 필요하지만 DB에는 저장되지 않는 정보이다. password2: Joi.ref('password'), nickname: Joi.string().pattern(new RegExp('^[a-zA-Z0-9]{2,10}$')) }) // 벨리데이션 결과를 리턴한다. return schema.validate(user) } module.exports = { User, validateUser };
password2의 경우에는 validator의 인자인 스키마 내에 없는 내용이므로 not allowed 가 뜬다. 이걸 영리하게 해결한 코드를 찾았는데,
middleware를 활용해 validator에서 error가 발생한 경우에만 에러를 발생시키고, 아닌 경우에는 next()를 이용해 다음으로 넘어간다.
validateMiddleware.js
module.exports = (validator) => { return (req, res, next) => { const { error } = validator(req.body) if (error) { console.log('error: ', error) return res.status(400).send(error.details[0].message) } next(); } }
github
https://github.com/danaisboss/OKU/commit/ba6c992fd78999d8f99afff43193be11482749bb
reference
https://gist.github.com/stongo/6359042
https://softwareengineering.stackexchange.com/questions/81062/data-input-validation-where-how-much
https://meetup.toast.com/posts/223
'Project' 카테고리의 다른 글
[리팩토링] 챗봇 추가하기 (4) 2021.07.25 [리팩토링] 유저 가입 코드 수정 (0) 2021.07.15 채팅 생성하기 (0) 2021.05.27 오쿠 기술 소개 (0) 2021.05.26 pm2-slack 이용해서 pm2 log 공유하기 (0) 2021.05.19