[NestJS] - Class Transformer

morecodeplease·2024년 11월 29일
0

NestJS TIL

목록 보기
4/9
post-thumbnail

1. Class Transformer란?

✅ 객체를 클래스 인스턴스로 변환하거나 클래스 인스턴스를 JSON 객체로 변환하는 데 사용되는 라이브러리다.


주요기능

  • 객체 변환 : 평범한 자바스크립트 객체(Plain Object)를 클래스의 인스턴스로 변환한다.
  • 직렬화 및 역직렬화 : 클래스 인스턴스를 JSON 등으로 직렬화하거나 역직렬화 한다.
  • 데이터 보호 : 특정 속성을 제외하거나 노출하여 데이터의 보안과 무결성을 유지 할 수 있다.
  • 데이터 변환 : 데이터의 형식을 변환하거나 커스텀 로직을 적용할 수 있다.

사용 예시

controller.ts

// controller에 ClassSerializerInterceptor를 적용시킨다.
// class-transformer를 controller에 적용을 하기 위한 코드
@UseInterceptors(ClassSerializerInterceptor) 
entity.ts

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

// @Exclude() // 클래스 전체를 Exclude해서 아무것도 안보이게 할 수 있음
export class Movie {
  id: number;
  title: string;

  // @Expose() // 값을 노출시킬 수 있음
  // @Exclude() // 해당 속성을 노출 안시킬수 있고 , 콘솔찍어보면 값은 그대로 있음

  // @Transform(({ value }) => value.toString().toUpperCase()) // value 값을 아예 바꿀수 있음 (custom-transformer)
  genre: string;
}
  • controller에 ClassSerializerInterceptor를 적용 시킨다.
  • 검증하고싶은 property에 데코레이터를 달아준다.
  • @Exclude()는 해당 하는 속성을 숨길 수 있고 , 값은 그대로 있다.
  • @Expose()는 값을 노출시킬 수 있다.
  • @Transformcustom-transformer의 역할을 하는데 해당하는 value값을 아예 바꿔서 노출 시킬 수 있다.

@Expose() 적용 예시

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

@Exclude() // 클래스 전체를 Exclude해서 아무것도 안보이게 할 수 있음
export class Movie {
  id: number;
  title: string;


  @Expose() // 해당 property만 노출
  genre: string;
}

요청 결과

  • @Exclude로 전체를 안보이게 설정하고 , genre 속성만 @Expose를 이용해서 해당속성만 보이게 했다.

@Exclude() 적용 예시

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

export class Movie {
  id: number;
  title: string;

  @Exclude()
  genre: string;
}

요청 결과

  • genre속성에 @Exclude를 적용시켜서 요청한 결과 genre속성만 리턴되지 않았다.

custom-transformer 적용 예시

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

export class Movie {
  id: number;
  title: string;


  @Transform(({ value }) => value.toString().toUpperCase()) // value 값을 대문자로 바꿈
  genre: string;
}

요청 결과

  • @Transform을 사용해서 해당 속성의 string값을 대문자로 바뀐 상태로 리턴 되게 했다.

참조

profile
Everyday's a lesson

0개의 댓글