NestJs class-tranformer exclude expose transform type

agnusdei·2023년 7월 13일
0

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;

0개의 댓글