Body로 오는 request중에 number로 사용해야하는 값이 있었는데 넘어올때는 string으로 넘어와서 class-transformer 모듈의 Transform을 통해서 number로 변경해주고 validator를 하게끔 구현되어 있었다.
import { IsNotEmpty, IsNumber } from "class-validator";
import { PostInfo } from "./postInfo";
import { ApiProperty } from "@nestjs/swagger";
import { Transform } from "class-transformer";
export class CreatePostRequestDto extends PostInfo {
@IsNumber()
@IsNotEmpty()
@Transform(({ value }) => Number(value))
@ApiProperty()
groupId: number;
@ApiProperty({ type: ["file"] })
postImages: any[];
}
^0.4.0 버전으로 install해서 사용하고 있었는데 배포 서버에서는 transform에서 사용되는 classTransformer.plainToClass is not a function 에러가 발생하는 것이다..!
에러를 찾으려고 하다가 이것 때문에 하루를 날렸다..
틸드와 캐럿에 관한 이야기 https://blog.outsider.ne.kr/1041
틸드
현재 지정한 버전의 마지막 자리 내의 범위에서만 자동으로 업데이트

캐럿
1.xx 내에서는 하위호환성이 보장되므로 그 내에서는 모두 업데이트하겠다는 의미

예외사항
버전이 1.0.0 미만인 경우는 API 변경이 수시로 일어난다고 판단하기 때문에 0.x.x 에서는 마치 틸드처럼 동작한다.

우리 프로젝트에서는 class-transformer": "^0.4.0" 으로 설치가 되어있었는데 앞에 ^(캐럿) 이 붙어있어서 틸드처럼 0.4.x 버전 중에 가장 높은 버전으로 설치가 되었던 것
구글링해보니 따끈따끈한 질문들이 올라와있었다..
https://stackoverflow.com/questions/70053965/using-validation-pipe-in-nestjs-gives-me-an-classtransformer-plaintoclass-is-not/70054626

https://github.com/typestack/class-transformer/blob/develop/CHANGELOG.md

이유는 0.4.0 이하 버전에서만 class-transformer가 동작한다는 것이었는데 내 package.json에는 ^0.4.0 인걸???이라고 넘겼던 것이다..!
TypeError: classTransformer.classToPlain is not a function
하지만 에러를 찾기 힘든 또 다른 이유는 로컬에서는 되고 배포 서버에서는 안되서 그런 것...
해결 방법으로 class-transformer를 삭제하고 다시 설치할 때 yarn add class-transformer@0.4.0 옵션을 줘서 0.4.0 버전으로 fix 시켰더니 잘 동작했다.

??????? 다시 추가했네?????? 욕 많이 먹었나부다