2. 트러블 슈팅 -DTO Data & Data Type Transform-

2023. 2. 18. 10:40프로젝트/8주차 실전 프로젝트

해당 문제는 사용자의 피드백을 받아 수정했던 것이다.

문제 원인: Validation(검증)을 꼼꼼하게 하지 못했고, DTO에 대해서 잘못 알고 있었기 때문에 생긴 문제이다.

목표 생성 및 수정 시 title(제목)의 글자 제한은 25자였는데 프론트에서 1차적으로 검증하고, 백엔드에서 2차적으로 검증해야한다.

Nest.JS로 Controller(API EndPoints)와 Service(Business Logic) 구현 당시, DTO(Data Transfer Object)를 사용했는데 해당 문제를 제보받고 실제로 Body 값으로 DTO에 정의되지 않은 필드가 들어가더라도 정상적으로 API 로직이 실행되는 문제를 발견했다.

이로써 알게된 것은 DTO는 개발시 타입을 지정하며 입력받아오는 데이터에 대한 타입 및 글자수까지 제한하는 것은 아니라는 것이었다. 정확히는 어느정도 검증을 하는 것 같긴한데(내가 Thunder Client로 테스트 하려 했더니 타입 에러가 검출되었다), 뚫고 들어올 수 있는 방법이 있는 것으로 보인다.

 

문제 해결 : Nest.JS 프로젝트의 디렉토리 최상단에 위치한 main.ts에 Validation Pipe를 적용하여 문제를 해결할 수 있다는 것을 알게 되었다.

Validation Pipe가 제공하는 옵션들 중에서 whitelist / forbidNonWhitelisted를 true로 적용한 이후, DTO에 명시되지 않은 데이터 타입이 Body에 넘겨졌을 시 API 호출 과정에서 Exception을 띄우고 해당 필드가 허용되지 않은 필드라고 명시해주는 것을 확인했다.

또한, Query Param으로 들어오는 값은 number type로 지정해도 string으로 들어오는 것을 해결하기 위해 transform 옵션을 사용함으로써 controller와 service에서 ID값을 param으로부터 number로 받을 수 있었다. 기존에 Type Conversion하는 과정을 줄일 수 있게 되었다.