오늘은 Typescript 환경에서 class-transformer에 대해서 포스팅 할 것이다.
회사에 테크니컬 리더님께서 꼭 class-transformer에 대해서 제대로 알고 가야지 된다고 하셔서 오늘 끝장을 내보려한다.
포스팅을 위해서 많이 찾아봤는데 이미 NestJS에서 개발을 하면서 DTO와 plainToInstance를 사용하고 있었는데
이게 class-transformer인줄도 몰랐다... 머쓱
우선, class-transformer를 사용하는 이유는 크게 7가지가 있다.
1. 데이터 유효성 검사
class-transformer와 class-validator를 함께 사용하여 TypeScript클래스의 객체에 대한 데이터 유효성 검사를 수행하는 경우,
일반적으로 DTO(Data Transfer Object)클래스를 사용한다.
DTO 클래스는 데이터 전송을 위해 사용되며, class-validator 데코레이터를 이용하여 데이터 유효성 검사를 수행한다.
다음과 같은 UserDTO 클래스가 있다고 가정해보자.
import { IsNotEmpty, IsEmail } from 'class-validator';
export class UserDTO {
@IsNotEmpty()
firstName: string;
@IsNotEmpty()
lastName: string;
@IsEmail()
email: string;
}
import { Controller, Post, Body } from '@nestjs/common';
import { plainToClass } from 'class-transformer';
import { UserDTO } from './dto/user.dto';
@Controller('users')
export class UserController {
@Post()
createUser(@Body() userDTO: UserDTO) {
// 유효성 검사
return await this.createService~~~
}
}
Controller부에서 @Body() 파라미터들을 UserDto로 유효성검사를 진행하게 된다.
여태 당연하다고 여기고 매번 사용하던 DTO의 본질적인 역할을 이제야 알게 되었다..
2. 직렬화
class-transformer를 사용하여 Typescript 클래스의 객체를 JSON 객체로 직렬화 할수있다.
다음과 같은 User 클래스가 있다고 가정해보자.
class User {
firstName: string;
lastName: string;
email: string;
}
import { classToPlain } from 'class-transformer';
const user = new User();
user.firstName = 'John';
user.lastName = 'Doe';
user.email = 'johndoe@example.com';
const userJSON = classToPlain(user);
위 코드에서 classToPlain 함수를 사용하여 User 클래스의 객체를 JSON객체로 직렬화 한다.
직렬화된 JSON 객체:
{ firstName: 'John', lastName: 'Doe', email: 'johndoe@example.com' }
객체를 직렬화하여 데이터로 변환하는 경우, 데이터 전송이나 저장 등에 용이하다.
직렬화된 데이터는 문자열, 바이트 배열, JSON 등 다양한 형태로 변환될 수 있다.
3. 역직렬화
이번에는 직렬화의 반대인 역직렬화다.
class-transformer를 사용하여 JSON 객체를 Typescript 클래스의 인스턴스로 역직렬화 할수있다.
아까처럼 같은 User 클래스가 있다고 가정해보자.
class User {
firstName: string;
lastName: string;
email: string;
}
import { classToPlain } from 'class-transformer';
const user = new User();
user.firstName = 'John';
user.lastName = 'Doe';
user.email = 'johndoe@example.com';
const userObj = PlaintoClass(User, userJSON);
이제는 plainToClass 함수를 사용하여 직렬화된 JSON 객체를 User 클래스의 객체로 역직렬화한다.
역직렬화된 User 객체:
User { firstName: 'John', lastName: 'Doe', email: 'johndoe@example.com' }
직렬화된 데이터를 역직렬화하여 객체로 변환하는 경우, 객체를 다루는 것이 더 편리해진다.
객체로 변환된 데이터를 다시 조작하거나 활용할 수 있다.
직렬화와 역직렬화의 차이점에 대해서 코드의 콘솔값으로 비교해서 보면 한번에 이해가 갈 것이다.
그리고 역직렬화중 하나인 plainToInstance도 자주 사용해서 이전에 포스팅 했었는데 읽어보면 도움이 될 것이다.
https://ilikezzi.tistory.com/9
4. 중첩된 객체 변환
class-transformer를 사용하면 중첩된 객체를 쉽게 변환할 수 있다.
이는 복잡한 데이터 구조를 다룰 때 유용하게 사용된다.
5. 데이터 변환
class-transformer를 사용하면 데이터를 원하는 형식으로 변환할 수 있다.
이는 데이터 전송 및 처리 작업에서 유용하게 사용된다.
6. 객체 변환
class-transformer를 사용하면 TypeScript 클래스의 객체를 다른 타입의 객체로 변환할 수 있다.
이는 객체를 다양한 형태로 변환하여 사용할 수 있도록 도와준다.
7. 간편한 사용성
class-transformer를 사용하면 간편하게 TypeScript 클래스의 객체를 다양한 형태로 변환할 수 있다.
이는 코드 작성과 유지보수를 간편하게 해준다.
이렇게 class-transformer의 장점 7가지에 대해서 알아보았는데
처음 세가지가 헷갈리고 중요한 내용이라서 자세히 다뤄보았다.
결국 DTO를 사용하면 데이터 유효성 검사, 직렬화, 역직렬화 등의 작업을 쉽게 수행할 수 있고.
class-transformer 를 통해 코드의 가독성을 높이고 중복 코드를 줄일 수 있게 되었다.
'Programming Language > Typescript' 카테고리의 다른 글
[Typescript] Reflect Metadata를 활용한 Custom Decorator (6) | 2024.10.24 |
---|