NestJS 공식 문서 Serialization

GGAE99·2023년 7월 3일
0

NestJS 공식 문서

목록 보기
16/33

Serialization

시리얼 라이저는 실제 응답을 보내기 전에 데이터 조작에 대한 깨끗한 추상화 계층을 제공합니다. 예를 들어, 사용자 비밀번호와 같은 민감한 데이터는 항상 최종 응답에서 제외해야 합니다. 또한 특정 속성에는 추가 변환이 필요할 수 있습니다. 예를 들어 전체 데이터베이스 엔터티를 보내지 않으려는 경우를 가정해 보겠습니다. 대신, 우리는 idname 만 고르고 싶습니다. 나머지는 자동으로 제거해야합니다. 불행히도 모든 엔티티를 수동으로 매핑하면 많은 혼란이 생길 수 있습니다.

Overview

Nest는 이러한 작업을 수행하는 간단한 방법을 제공하기 위해 ClassSerializerInterceptor클래스를 제공합니다. class-transformer 패키지를 사용하여 선언적이고 확장 가능한 객체 변환 방법을 제공합니다. 기본적으로 ClassSerializerInterceptor는 메소드에서 리턴된 값을 가져 와서 class-transformer 패키지에서 serializclassToPlain()함수를 호출합니다.

Exclude properties

다음 엔터티에서 password 속성을 자동으로 제외한다고 가정 해 봅시다.

import { Exclude } from 'class-transformer';

export class UserEntity {
  id: number;
  firstName: string;
  lastName: string;

  @Exclude()
  password: string;

  constructor(partial: Partial<UserEntity>) {
    Object.assign(this, partial);
  }
}

그런 다음 컨트롤러의 메소드에서 이 클래스의 인스턴스를 직접 리턴하십시오.
꼭 클래스의 인스턴스를 반환해야 합니다.
JavaScript 객체를 반환하면 { user: new UserEntity() }객체가 제대로 직렬화되지 않습니다.

@UseInterceptors(ClassSerializerInterceptor)
@Get()
findOne(): UserEntity {
  return new UserEntity({
    id: 1,
    firstName: 'Kamil',
    lastName: 'Mysliwiec',
    password: 'password',
  });
}

ClassSerializerInterceptor는 @nestjs/common 패키지에서 가져옵니다.

이제 이 엔드 포인트를 호출하면 다음과 같은 응답이 나타납니다.

{
  "id": 1,
  "firstName": "Kamil",
  "lastName": "Mysliwiec"
}

Expose properties

미리 계산된 속성을 노출하려면 @Expose()데코레이터를 사용하십시오. ( getter 함수와 유사).

// user.entity.ts에 추가
@Expose()
get fullName(): string {
  return `${this.firstName} ${this.lastName}`;
}

@Expose 데코레이터는 class-transformer 패키지에서 가져옵니다.

이 때, Expose로 정의한 값도 같이 retrun합니다.

// 변경된 값 
{
  "id": 1,
  "firstName": "Kamil",
  "lastName": "Mysliwiec",
  "fullName": "Kamil Mysliwiec"
}

Transform

@Transform()데코레이터를 사용하여 추가 데이터 변환을 수행할 수 있습니다.
예를 들어, 전체 객체를 반환하는 대신 RoleEntity의 이름을 선택하려고합니다.

@Transform(({ value }) => value.name)
role: RoleEntity;

Pass options

변형 옵션은 특정 요인에 따라 달라질 수 있습니다. 기본 설정을 덮어 쓰려면 @SerializeOptions()데코레이터를 사용하십시오.

@SerializeOptions({
  excludePrefixes: ['_'],
})
@Get()
findOne(): UserEntity {
  return new UserEntity();
}

@SerializeOptions() 데코레이터는 @nestjs/common 패키지에서 가져옵니다.

전달된 옵션은 @SerializeOptions()instanceToPlain()함수의 두 번째 인수로 전달됩니다.
이 예에서는 _접두사로 시작하는 모든 속성을 자동으로 제외합니다

Websockets & Microservices

이 장에서는 HTTP 스타일 애플리케이션(예: Express 또는 Fastify)을 사용하는 예제를 보여 주지만 ClassSerializerInterceptor사용되는 전송 방법에 관계없이 WebSocket 및 Microservices에 대해 동일하게 작동합니다.

0개의 댓글