class transformer는 plain object를 class의 instance로 변환하거나, 그 반대의 작업을 수행하기 위해 사용하는 library이다.
Plain object란 Object class의 instance를 말한다. 이는 {} notation을 사용하여 생성되는 경우 literal objects
라고도 한다.
Class object란 class의 instance를 말한다.
이러한 두 instance의 변환 과정이 필요한 이유는 공식 readme에 예시와 함께 잘 작성되어 있어, 해당 내용을 참고하면 쉽게 이해할 수 있다.
[
{
"id": 1,
"firstName": "Johny",
"lastName": "Cage",
"age": 27
},
{
"id": 2,
"firstName": "Ismoil",
"lastName": "Somoni",
"age": 50
},
{
"id": 3,
"firstName": "Luke",
"lastName": "Dacascos",
"age": 12
}
]
외와 같은 형태로 데이터가 저장되어 있는 `users.json` 파일이 존재한다고 하고, 아래와 같은 User class가 정의되어 있다고 가정하자.
export class User {
id: number;
firstName: string;
lastName: string;
age: number;
getName() {
return this.firstName + ' ' + this.lastName;
}
isAdult() {
return this.age > 36 && this.age < 60;
}
}
이후 다음과 같은 코드를 작성해서 json 데이터를 활용해볼 수 있다.
fetch('users.json').then((users: User[]) => {
// you can use users here, and type hinting also will be available to you,
// but users are not actually instances of User class
// this means that you can't use methods of User class
});
다만 이 상황에서의 문제는, 우리는 id, firstName, lastName, age등의 데이터에는 접근 가능하지만 getName, inAdult와 같은 method 들은 사용할 수 없다. 왜냐하면 `users`는 실제로는 plain javascript object의 배열에 해당하기 때문이다.
즉, 실제로는 완벽한 User 타입이 아니지만 `users: User[]` 라고 컴파일러에게 거짓말을 하고 있는 상황에 해당한다.
따라서 이러한 상황을 해결하기 위해서는 User object의 new instance를 생성하고 모든 properties를 복사하여 새로 만든 객체에 값을 넣어주어야하는 번거로운 작업을 수행해야한다.
이러한 번거로움을 해결하기 위해 사용하는 것이 class-transformer library로, 아래와 같은 방법으로 plain object를 class object로 변환할 수 있다.
fetch('users.json').then((users: Object[]) => {
const realUsers = plainToClass(User, users);
// now each user in realUsers is an instance of User class
});