[Nest.JS] class-transformer로 객체 변환

궁금하면 500원·2024년 8월 11일
1

class-transformer

TypeScript 클래스와 JSON 객체 간의 변환을 쉽게 도와주는 라이브러리입니다.

주로 DTO와 엔티티 변환, 데이터 직렬화 및 역직렬화에서 사용됩니다.

NestJS와 함께 사용할 때 유용하며, 데이터의 변환과 매핑을 간편하게 처리할 수 있습니다.

주요 기능

1. 객체 변환: JSON 객체를 TypeScript 클래스로 변환하거나, TypeScript 클래스를 JSON 객체로 변환할 수 있습니다.

2. 속성 변환: 클래스의 속성 값을 자동으로 변환하거나 포맷할 수 있습니다.

3. 중첩 객체 변환: 중첩된 객체의 변환도 지원합니다.

설치

먼저 class-transformerclass-validator를 설치해야 합니다.

NestJS 프로젝트에서는 보통 다음과 같이 설치합니다.

npm install class-transformer class-validator

주요 데코레이터

@Type: 중첩 객체의 타입을 정의합니다.
@Expose: 직렬화할 속성을 지정합니다.
@Exclude: 직렬화에서 제외할 속성을 지정합니다.

예제 코드

다음은 class-transformer의 사용 예제입니다.

1. DTO 클래스 정의

import { Expose, Transform, Type } from 'class-transformer';
import { IsString, IsInt, Min, Max, IsOptional } from 'class-validator';

export class UserDto {
  @Expose()
  @IsString()
  name: string;

  @Expose()
  @IsString()
  @IsOptional()
  email?: string;

  @Expose()
  @IsInt()
  @Min(18)
  @Max(100)
  age: number;

  @Expose()
  @Transform(({ value }) => new Date(value), { toClassOnly: true })
  createdAt: Date;
}

2. JSON 객체를 클래스 인스턴스로 변환

import { plainToClass } from 'class-transformer';
import { UserDto } from './user.dto';

const json = {
  name: 'John Doe',
  email: 'john.doe@example.com',
  age: 30,
  createdAt: '2024-01-01T00:00:00Z'
};

const userDto = plainToClass(UserDto, json);

console.log(userDto);

위 코드는 JSON 객체를 UserDto 클래스 인스턴스로 변환합니다.
createdAt 속성은 문자열에서 Date 객체로 변환됩니다.

3. 클래스 인스턴스를 JSON 객체로 변환

import { classToPlain } from 'class-transformer';
import { UserDto } from './user.dto';

const userDto = new UserDto();
userDto.name = 'Jane Doe';
userDto.email = 'jane.doe@example.com';
userDto.age = 25;
userDto.createdAt = new Date();

const json = classToPlain(userDto);

console.log(json);

이 코드는 UserDto 클래스 인스턴스를 JSON 객체로 변환합니다.
기본적으로 @Expose 데코레이터가 붙은 속성만 직렬화됩니다.

커스터마이징 예제

1. 커스터마이징 변환기

import { Transform } from 'class-transformer';

export class UserDto {
  @Transform(({ value }) => value.toUpperCase(), { toClassOnly: true })
  name: string;
}

이 예제는 name 속성을 변환할 때, 모든 값을 대문자로 변환합니다.

2. 중첩 객체 변환

import { Type } from 'class-transformer';
import { IsString, IsInt, Min } from 'class-validator';

class AddressDto {
  @IsString()
  street: string;

  @IsString()
  city: string;
}

export class UserDto {
  @Type(() => AddressDto)
  address: AddressDto;

  @IsString()
  name: string;

  @IsInt()
  @Min(18)
  age: number;
}

여기서는 UserDto 클래스에 AddressDto를 중첩하여 사용하고,
@Type 데코레이터를 사용하여 address 속성을 AddressDto로 변환합니다.

결론

class-transformer는 JSON과 TypeScript 클래스 간의 변환을 쉽게 해주는 라이브러리입니다.

주요 데코레이터로는 @Type, @Expose, @Exclude, @Transform이 있으며, 이를 통해 속성의 변환과 직렬화를 제어할 수 있습니다.

객체 변환을 통해 JSON을 클래스 인스턴스로 변환하거나, 클래스를 JSON으로 변환할 수 있습니다.

이렇게 class-transformer를 활용하면 데이터 변환 작업을 효율적으로 관리할 수 있다는것을
배웠습니다.

profile
꾸준히, 의미있는 사이드 프로젝트 경험과 문제해결 과정을 기록하기 위한 공간입니다.

0개의 댓글