dto나 entity 클래스에 toEntity(), toResponse() 등등을 사용하면 이런 에러를 내뿜는다…
[Nest] 43441 - 04/01/2023, 1:49:59 PM ERROR [ExceptionsHandler] request.toEntity is not a function
TypeError: request.toEntity is not a function
at BroadService.createBroad (/Users/hannah/Hannah/private/project/nestjs/first-project/src/broad/broad.service.ts:16:31)
at BroadController.createBroad (/Users/hannah/Hannah/private/project/nestjs/first-project/src/broad/broad.controller.ts:31:36)
at /Users/hannah/Hannah/private/project/nestjs/first-project/node_modules/.pnpm/@[email protected]_@[email protected]_@[email protected][email protected][email protected]/node_modules/@nestjs/core/router/router-execution-context.js:38:29
at processTicksAndRejections (node:internal/process/task_queues:95:5)
at /Users/hannah/Hannah/private/project/nestjs/first-project/node_modules/.pnpm/@[email protected]_@[email protected]_@[email protected][email protected][email protected]/node_modules/@nestjs/core/router/router-execution-context.js:46:28
at /Users/hannah/Hannah/private/project/nestjs/first-project/node_modules/.pnpm/@[email protected]_@[email protected]_@[email protected][email protected][email protected]/node_modules/@nestjs/core/router/router-proxy.js:9:17
자료를 찾아보니, 이에 대한 해답(?)이 적인 스택오버플로우 글을 찾을 수 있었다.
The fact that the dto is declared like this dto: ClientDTO in the controller is not enough to create instances of the class. - Guerric P
Your dto was not a class-based object when coming in through your api call-- it's just a generic object. Therefore it can't have methods and so your toEntity method won't work.- glitchbane
정리하자면 컨트롤러에서 @Body() 데코레이터를 통해 전달받는 DTO 는 그 자체로 인스턴스화되어있다고 보기 어렵다는 것이다.
아니 그러면 대체 이 DTO 는 누구란말인가? 직접 출력해보았다.

음.. 일단 object 인 걸로 봐서는 객체는 맞긴 한가보다.
공식 도큐먼트를 찾아보니, 다음 문구가 있었다.
Payloads coming in over the network are plain JavaScript objects.
즉, 컨트롤러를 통해서 들어오는 페이로드는 사실 그냥 순수 자바스크립트 객체에 불과했던 것이다!
자 다시 돌아와서, 그렇다면 내가 해야할 일은 클라이언트로부터 넘어온 요청 데이터를 역직렬화해서 이쁘게 DTO 클래스에 맞는 객체를 생성해주는 일이다.
pnpm install class-validator class-transformer
원래 class-validator 는 Pipe 로서, 클라이언트로부터 들어오는 Request 데이터의 검증을 담당한다고 한다. 이와 관련한 공식 도큐먼트 글을 살펴보면 좋을 것 같다.
The ValidationPipe can automatically transform payloads to be objects typed according to their DTO classes. To enable auto-transformation, set transform to true.