NestJS의 Class Transformer는 객체 변환을 쉽게 처리하기 위한 도구입니다. Class Transformer는 주로 DTO(Data Transfer Object)를 사용하여 입력 데이터의 유효성을 검사하고 원하는 형식으로 변환하는 데 사용됩니다. Class Transformer는 다양한 메소드와 프로퍼티를 제공하여 객체 변환 작업을 유연하게 제어할 수 있습니다.
@Exclude()
데코레이터는 특정 프로퍼티를 변환에서 제외하도록 지정합니다. 변환 작업 시 해당 프로퍼티는 무시되고 제외됩니다. 예를 들어, 다음은 password
프로퍼티를 변환에서 제외하는 예시입니다:import { Exclude, Transform } from 'class-transformer';
export class UserDto {
id: number;
username: string;
@Exclude()
password: string;
}
@Expose()
데코레이터는 특정 프로퍼티를 변환에 포함시키도록 지정합니다. 기본적으로 Class Transformer는 클래스의 모든 프로퍼티를 변환에 포함시킵니다. 그러나 @Expose()
를 사용하여 특정 프로퍼티만 포함시킬 수 있습니다. 예를 들어, 다음은 email
프로퍼티를 변환에 포함하는 예시입니다:import { Expose } from 'class-transformer';
export class UserDto {
id: number;
username: string;
@Expose()
email: string;
}
@Transform()
데코레이터는 특정 프로퍼티의 값을 변환하는 함수를 지정합니다. 이를 통해 데이터를 원하는 형식으로 변환할 수 있습니다. @Transform()
은 데코레이터에 전달된 함수를 사용하여 변환 작업을 수행합니다. 예를 들어, 다음은 dateOfBirth
프로퍼티의 값을 변환하는 예시입니다:import { Transform } from 'class-transformer';
export class UserDto {
id: number;
username: string;
@Transform(date => date.toISOString())
dateOfBirth: Date;
}
@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;