NestJs class-tranformer exclude expose transform type

agnusdei·2023년 7월 13일

NestJS의 Class Transformer는 객체 변환을 쉽게 처리하기 위한 도구입니다. Class Transformer는 주로 DTO(Data Transfer Object)를 사용하여 입력 데이터의 유효성을 검사하고 원하는 형식으로 변환하는 데 사용됩니다. Class Transformer는 다양한 메소드와 프로퍼티를 제공하여 객체 변환 작업을 유연하게 제어할 수 있습니다.

  1. Exclude:
    @Exclude() 데코레이터는 특정 프로퍼티를 변환에서 제외하도록 지정합니다. 변환 작업 시 해당 프로퍼티는 무시되고 제외됩니다. 예를 들어, 다음은 password 프로퍼티를 변환에서 제외하는 예시입니다:
import { Exclude, Transform } from 'class-transformer';

export class UserDto {
  id: number;
  username: string;

  @Exclude()
  password: string;
}
  1. Expose:
    @Expose() 데코레이터는 특정 프로퍼티를 변환에 포함시키도록 지정합니다. 기본적으로 Class Transformer는 클래스의 모든 프로퍼티를 변환에 포함시킵니다. 그러나 @Expose()를 사용하여 특정 프로퍼티만 포함시킬 수 있습니다. 예를 들어, 다음은 email 프로퍼티를 변환에 포함하는 예시입니다:
import { Expose } from 'class-transformer';

export class UserDto {
  id: number;
  username: string;

  @Expose()
  email: string;
}
  1. Transform:
    @Transform() 데코레이터는 특정 프로퍼티의 값을 변환하는 함수를 지정합니다. 이를 통해 데이터를 원하는 형식으로 변환할 수 있습니다. @Transform()은 데코레이터에 전달된 함수를 사용하여 변환 작업을 수행합니다. 예를 들어, 다음은 dateOfBirth 프로퍼티의 값을 변환하는 예시입니다:
import { Transform } from 'class-transformer';

export class UserDto {
  id: number;
  username: string;

  @Transform(date => date.toISOString())
  dateOfBirth: Date;
}
  1. Type:
    @Type() 데코레이터는 특정 프로퍼티의 타입을 지정합니다. Class Transformer는 자동으로 데이터를 지정된 타입으로 변환하려고 시도합니다. 그러나 때로는 변환할 데이터의 타입을 명시적으로 지정해야 할 때가 있습니다. 예를 들어, 다음은 dateOfBirth 프로퍼티의 타입을 Date로 지정하는 예시입니다:
import { Type } from 'class-transformer';

export class UserDto {
  id: number;
  username: string;

  @Type(() => Date)
  dateOfBirth: string;
}

이러한 메소드와 프로퍼티를 조합하여 Class Transformer를 유연하게 사용할 수 있습니다. 예를 들어, 다음은 위에서 소개한 기능을 모두 활용하는 예시입니다:

import { Exclude, Expose, Transform, Type } from 'class-transformer';

export class UserDto {
  id: number;
  username: string;

  @Exclude()
  password: string;

  @Expose()
  @Transform(date => date.toISOString())
  @Type(() => Date)
  dateOfBirth: string;
}

위의 예시에서 password는 변환에서 제외되고, dateOfBirth는 ISO 문자열로 변환되며, Date 타입으로 변환됩니다.

@Expose()
  @Transform(({ obj }: { obj: ReviewDTO }) => {
    if (obj.user) return obj.user as UserDTO;
    if (obj.admin) return obj.admin as AdminDTO;
  })
  reviewer: UserDTO | AdminDTO;
profile
DevSecOps Pentest🚩

0개의 댓글