inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

mongoDB 기초부터 실무까지(feat. Node.js)

PUT /user/:userId

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

해결된 질문

195

김가현

작성한 질문수 1

2

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

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

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

감사합니다!

데이터 엔지니어링 rest-api mongodb DBMS/RDBMS javascript aws nodejs

답변 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를 적용하면 개발할 때부터 잘못된 타입들은 애초에 빌드 안되도록 할 수 있어요 :) 

0

김가현

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

option usecreateindex is not supported 오류 나면은

0

163

1

Schemaless 특성을 재생시 검은화면이 나와요

0

258

1

user 내장 시 ref 필드 필요성

0

257

1

await 관련해서 질문드릴게 있습니다!!

0

306

2

섹션6의 3번째 강의 faker파일이 어디있나요?

0

321

1

$elemMatch 질문이 있습니다.

0

252

1

DB 업데이트에 실패했을 상황에서 대처는 어떻게 할 수 있나요.

2

778

2

블로그에 user 데이터를 추가하는 방법에 대해서

0

243

1

blog 데이터 생성시 user 관련 오류

0

363

1

age 예외 처리를 별도로 하신 이유가 궁금합니다.

2

314

2

delete 메소드가 많은 이유가 궁금합니다.

0

185

1

unique validation 처리

0

302

1

updateMany에서 user._id를 못찾는 상황

1

404

1

find() 가 리턴하는 instance member

1

440

3

몽고 db를 백업방법을 부탁합니다.

0

611

1

인덱스 생성시점

0

722

1

$pull 문법에 대한 질문

0

368

1

comment의 id가 생성되는 시점

1

311

1

리팩토링 강의에서 라우터 리팩토링 전개연산자(...)

1

322

1

session.abortTransaction()에 대한 실제 예시 문의

0

297

1

섹션9 Computed Fields 강의에서, 다음 강의 가기 전 빠진부분

-1

414

1

faker 패키지 취약성 이슈

1

497

1

라우터 리팩토링

0

349

1

섹션4 진행중, mongoose 질문

0

317

1