• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

age가 숫자인지 다시 체크하는 이유

21.07.25 21:46 작성 조회수 107

2

안녕하세요! 좋은 강의 잘 듣고 있습니다.

다름이 아니라 질문이 있어 글을 남깁니다.

이미 User.js에서 age: Number로 설정해두었기 때문에 숫자 외의 것이 들어온다면 catch문에서 제대로 에러 처리가 될 것 같은데, 따로 라우트 내에서 age가 숫자인지 아닌지를 다시 체크하는 이유가 궁금합니다. 

감사합니다!

답변 1

답변을 작성해보세요.

1

김가현님 안녕하세요 :)

좋은 질문입니다. 보통은 크게 두가지 이유가 있다고 할 수 있어요. 

  1. 개발자가 아닌 일반 유저가 이해하기 쉬운 오류 메시지를 전달하기 위해
  2. 디비 스키마의 validation으로 처리할 수 없는 예외 처리가 있을 경우

이 경우 1.도 몽구스 스키마에서 해결이 가능은 해요. 몽구스 스키마에 커스텀 오류 메시지를 작성할 수 있습니다. 그리고 주의하실점이 있는데요. mongoose validation의 기본 설정으로는 .save()에서만 validation이 발동합니다. 서버에 수정할 문서를 불러와서 수정하고 .save()할 때는 검증이 되지만 updateOne이런식으로 하면 서버에 문서가 없기 때문에 검증을 하지 않아요. 이런 경우에도 검증을 하도록 하기 위해서는 mongoose.set('runValidators', true)로 글로벌 설정을 해주시거나 개별 쿼리에서 옵션을 추가해주시면 되요. 자세한건 아래 공식문서 링크를 확인해주세요!

https://mongoosejs.com/docs/validation.html

그리고 무엇보다 검증은 여러 곳에서 하는게 좋아요. 예를 들어 백엔드, 디비단에서 검증을 한다고 해도 프론트에서 검증을 안하고 보내도 되는건 아니에요. 최대한 앞단에서 잘못된 요청은 걸러 주는게 좋아요. 그래야 백엔드와 디비의 부하가 감소되겠죠. 이 경우는 간단한 API라서 age검증 같은건 mongoose schema가 해도 상관은 없지만 복잡한 요청이면 최대한 로직이 시작하기 전에 검증을 해주는게 좋습니닷.

저 같은 경우 기본적인 validation들은 GraphQL, Typescript를 이용해서 해결해요. Client에서 애초에 GraphQL Schema에 선언된 type들이 아니면 자동으로 오류처리를 하게 되거든요. 더 나아가서 프론트에서도 Typescript를 적용하면 개발할 때부터 잘못된 타입들은 애초에 빌드 안되도록 할 수 있어요 :) 

김가현님의 프로필

김가현

질문자

2021.07.26

친절하고 자세하게 설명해주셔서 정말 감사합니다! ㅎㅎ