포시코딩

2월8일 - express에서 validation 다루기 (joi) 본문

TIL

2월8일 - express에서 validation 다루기 (joi)

포시 2023. 2. 9. 00:16
728x90

개요

이전부터 프론트엔드로부터 전달 받는 값들에 대해

프론트엔드에서 validation 처리가 진행됐다는 가정하에 (귀찮은것도 있고)

백엔드에서는 최소한으로만 진행을 해왔었다.

 

하게 되더라도 팀원들과

controller에서 체크를 할거냐 service에서 체크를 할거냐 라는 토론을 하기도 했었다.

결국 controller는 service가 잘 작동하도록 데이터를 전달하는 역할을 하는것이고

어떠한 로직을 수행한다는건 service에서 해야되기 때문에

service에서 하는걸로 결론이 났었지만

 

하지만 지속적으로 validation이 추가로 필요할 것 같다는 피드백을 받았었고

그 방법으로 여러가지 추천을 받아 이번 기회에 정리해보려고 한다.

 

validation 방법들

express에서 validation 하는 방법은 크게 세가지 정도로 구분할 수 있겠다.

  • 정규표현식
  • joi
  • express-validator

정규표현식은 지금까지 프론트엔드에서 해왔듯 단순히 값을 정규표현식으로 비교하는 것이고

joi와 express-validator가 처음 들어보는 라이브러리여서 간단하게 알아보았다.

 

두 라이브러리 다 미들웨어를 통해 중간에 데이터를 검증하는 방법을 이용해서 비슷하다.

 

https://www.npmjs.com/package/joi

 

joi

Object schema validation. Latest version: 17.7.0, last published: 3 months ago. Start using joi in your project by running `npm i joi`. There are 9668 other projects in the npm registry using joi.

www.npmjs.com

https://www.npmjs.com/package/express-validator

 

express-validator

Express middleware for the validator module.. Latest version: 6.14.3, last published: 19 days ago. Start using express-validator in your project by running `npm i express-validator`. There are 8398 other projects in the npm registry using express-validator

www.npmjs.com

 

 

글을 쓰는 시점 기준으로 npm에서 검색했을 때 joi의 다운로드 수가 월등하게 많았는데

아무래도 express-validator는 express에서만 쓸 수 있고

joi는 다른 프레임워크에서도 쓸 수 있어서 그런게 아닐까 라는 생각이 든다.

 

https://npmtrends.com/express-joi-validator-vs-express-validation-vs-express-validator-vs-joi

실제로 여러 express에서 사용할 수 있는 validation 라이브러리를 비교한 결과

joi의 사용량이 몇배가 된다는 것을 확인할 수 있다.

 

따라서 위의 이유들과 앞으로 Nest를 배우게 되면

express-validator를 배워도 써먹을 수 없게 되므로 처음부터 joi를 배워 써먹는게 좋다고 결론을 내렸다.

 

Joi

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

 

joi.dev

 

joi.dev

 

joi의 사용 방법은 위 공식 홈페이지에서 확인할 수 있는데

그보다 먼저 매우 쉽게 사용 방법을 알려주는 블로그를 찾아 이 내용으로 테스트를 진행해보았다.

 

https://applepick.tistory.com/103

 

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

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

applepick.tistory.com

 

사용 방법

 

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를 사용할 수 없다.

728x90