● Transform이 왜 필요한데?
Node.js로 백엔드를 활용하다보면 transform : true가 필요하다 라는 것을 들을 때가 있다.
하지만 왜 필요한지에 대한 이유를 자세히 모르고 사용하는 경우가 있을 경우를 위해 오늘 일하며 배운 것을 요약하여 정리하고자 한다.
✅ class-validator가 plain object를 인식하지 못하기 때문
transform을 사용하는 이유다. node.js , nest.js 는 보통 class instance 즉 dto 환경으로 많이 구성된다.
예로 들자면
class CreateUserDto {
@IsString()
name: string
@IsInt()
age: number
}
다음과 같은 환경으로 구성된다.
하지만 우리가 입력받아야 하는 대상인 html의 경우에는
{
"name": "홍길동",
"age": "30" // ← 문자열!
}
다음과 같이 plain object가 들어오게 된다.
이렇게 되면 우리 클래스인스턴스는 age인 나이를 검사하게 될 때 @IsInt()에 걸리게 되어 오류를 일으킬 것이다.
그러므로 우리는
app.useGlobalPipes(
new ValidationPipe({
transform: true, // 💡 이게 핵심
whitelist: true
})
)
위 코드와 같이 transform: true 를 줌으로써 자동으로 plain object를 class instance로 변환하여 문제를 해결할 수 있다.
● 그럼 plain object와 class instance가 뭔데??
plain object는 자바스크립트/타입스크립트에서 특별한 프로토타입이나 메서드 없이 단순히 key-value 구조로만 구성된 일반 객체를 의미한다.
쉽게 말하면 json타입으로 정리되어 있거나 {} 안에 들어간 객체를 의미한다.
플레인 오브젝트의 예시는 아래와 같다.
const obj = {
name: 'Alice',
age: 30
}
반대로 class instance는 유저의 데이터를 받아오기 위해 class를 만들어 정보를 저장하기 위한 그릇을 만든다고 이해하면 이해하기 쉬울 것이다.
class instance는 다음과 같다
class User {
constructor(public name: string, public age: number) {}
greet() {
return `Hello, ${this.name}`
}
}
const user = new User('Alice', 30)
위와 같이 class instance는 class구조를 띄고 있다.
위의 두 데이터를 정리하면 다음과 같다.
항목 | plain object | class instance |
생성 방식 | {} 또는 JSON | new Class() |
메서드 | 없음 | 있음 (정의 가능) |
타입 정보 | 없음 | 있음 |
instanceof 검사 | false | true |
class-validator 동작 | ❌ | ✅ |
NestJS에서 transform 필요 여부 | 필요함 | 필요 없음 |
위와 같이 정리 할 수 있는데 앞서 배웠듯이 plain object의 경우 transform이 필요한것을 볼 수 있다.
class-validator 또한 이 요청 값이 바른 요청 값으로 들어 왔는지 확인 하는 것인데, 이 또한 plain object에선 불가 한 것을 볼 수 있다.
'코딩 > Node.js' 카테고리의 다른 글
Nest.js 백엔드 구조 이해하기 (0) | 2025.05.08 |
---|