일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- cookie
- nestjs
- 정렬
- class
- jest
- typeORM
- Bull
- JavaScript
- Queue
- Sequelize
- 공룡게임
- TypeScript
- mongoose
- dfs
- 게임
- Dinosaur
- MongoDB
- Python
- nodejs
- react
- 자료구조
- Express
- GIT
- game
- MySQL
- OCR
- Nest.js
- flask
- AWS
- Today
- Total
포시코딩
2월8일 - express에서 validation 다루기 (joi) 본문
개요
이전부터 프론트엔드로부터 전달 받는 값들에 대해
프론트엔드에서 validation 처리가 진행됐다는 가정하에 (귀찮은것도 있고)
백엔드에서는 최소한으로만 진행을 해왔었다.
하게 되더라도 팀원들과
controller에서 체크를 할거냐 service에서 체크를 할거냐 라는 토론을 하기도 했었다.
결국 controller는 service가 잘 작동하도록 데이터를 전달하는 역할을 하는것이고
어떠한 로직을 수행한다는건 service에서 해야되기 때문에
service에서 하는걸로 결론이 났었지만
하지만 지속적으로 validation이 추가로 필요할 것 같다는 피드백을 받았었고
그 방법으로 여러가지 추천을 받아 이번 기회에 정리해보려고 한다.
validation 방법들
express에서 validation 하는 방법은 크게 세가지 정도로 구분할 수 있겠다.
- 정규표현식
- joi
- express-validator
정규표현식은 지금까지 프론트엔드에서 해왔듯 단순히 값을 정규표현식으로 비교하는 것이고
joi와 express-validator가 처음 들어보는 라이브러리여서 간단하게 알아보았다.
두 라이브러리 다 미들웨어를 통해 중간에 데이터를 검증하는 방법을 이용해서 비슷하다.
https://www.npmjs.com/package/joi
https://www.npmjs.com/package/express-validator
글을 쓰는 시점 기준으로 npm에서 검색했을 때 joi의 다운로드 수가 월등하게 많았는데
아무래도 express-validator는 express에서만 쓸 수 있고
joi는 다른 프레임워크에서도 쓸 수 있어서 그런게 아닐까 라는 생각이 든다.
실제로 여러 express에서 사용할 수 있는 validation 라이브러리를 비교한 결과
joi의 사용량이 몇배가 된다는 것을 확인할 수 있다.
따라서 위의 이유들과 앞으로 Nest를 배우게 되면
express-validator를 배워도 써먹을 수 없게 되므로 처음부터 joi를 배워 써먹는게 좋다고 결론을 내렸다.
Joi
joi의 사용 방법은 위 공식 홈페이지에서 확인할 수 있는데
그보다 먼저 매우 쉽게 사용 방법을 알려주는 블로그를 찾아 이 내용으로 테스트를 진행해보았다.
https://applepick.tistory.com/103
사용 방법
validateMiddleware.js
const Joi = require('joi');
const validationMiddleware = {
createProduct: async (req, res, next) => {
const schema = Joi.object().keys({
name: Joi.string().min(2).max(4).required(),
});
try {
await schema.validateAsync(req.body);
} catch (err) {
console.log(err);
return res.status(400).json({ code: 400, message: err.message });
}
next();
},
};
module.exports = validationMiddleware;
router.js
router.post(
'/products',
validationMiddleware.createProduct,
productsController.createProduct
);
joi를 사용할 미들웨어를 만들어 전달받는 req.body의 값들에 대해 체크하는 로직을 만들면
중간에 체크해서 catch문을 통해 원하는 응답을 만들어 낼 수 있다.
주의사항
원래 해당 라우터에는 이미지 파일을 받고 있어서 multer를 사용중인데
router.post(
'/products',
adminsAuthMiddleware,
uploadUtil.multer({ storage: uploadUtil.storage }).array('files'),
validationMiddleware.createProduct,
productsController.createProduct
);
이런식으로 multer middleware 뒤에 위치시켜야 req.body의 값을 정상적으로 받을 수 있다.
multer middleware보다 먼저 위치시키면 req.body가 빈값으로 전달되어
제대로 된 joi를 사용할 수 없다.
'TIL' 카테고리의 다른 글
2월10일 - JSDoc (0) | 2023.02.10 |
---|---|
2월9일 - IoC와 DI - DIP 관련 작성중 (0) | 2023.02.09 |
2월6일 - Thuner Client에서 cookie 세팅하기 (0) | 2023.02.06 |
2월5일 - [CSS] 테이블 row에 마우스 오버 시 하이라이트 효과 주기 (0) | 2023.02.05 |
2월3일 - devCity 프로젝트 시작 (0) | 2023.02.03 |