Serialization

Serialization

์‹œ๋ฆฌ์–ผ ๋ผ์ด์ €๋Š” ์‹ค์ œ ์‘๋‹ต์„ ๋ณด๋‚ด๊ธฐ ์ „์— ๋ฐ์ดํ„ฐ ์กฐ์ž‘์— ๋Œ€ํ•œ ๊นจ๋—ํ•œ ์ถ”์ƒํ™” ๊ณ„์ธต์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋Š” ํ•ญ์ƒ ์ตœ์ข… ์‘๋‹ต์—์„œ ์ œ์™ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํŠน์ • ์†์„ฑ์—๋Š” ์ถ”๊ฐ€ ๋ณ€ํ™˜์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—”ํ„ฐํ‹ฐ๋ฅผ ๋ณด๋‚ด์ง€ ์•Š์œผ๋ ค๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ , ์šฐ๋ฆฌ๋Š” id์™€ name ๋งŒ ๊ณ ๋ฅด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€๋Š” ์ž๋™์œผ๋กœ ์ œ๊ฑฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ๋ชจ๋“  ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋งคํ•‘ํ•˜๋ฉด ๋งŽ์€ ํ˜ผ๋ž€์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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);
  }
}

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ฉ”์†Œ๋“œ์—์„œ ์ด ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ง์ ‘ ๋ฆฌํ„ดํ•˜์‹ญ์‹œ์˜ค.

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

info ํžŒํŠธ ClassSerializerInterceptor๋Š” @nestjs/common ํŒจํ‚ค์ง€์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์ด์ œ ์ด ์—”๋“œ ํฌ์ธํŠธ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‘๋‹ต์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

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

Expose properties

๋ฏธ๋ฆฌ ๊ณ„์‚ฐ๋œ ์†์„ฑ์„ ๋…ธ์ถœํ•˜๋ ค๋ฉด @Expose()๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

@Expose()
get fullName(): string {
  return `${this.firstName} ${this.lastName}`;
}

Transform

@Transform()๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ „์ฒด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋Œ€์‹  RoleEntity์˜ ์ด๋ฆ„์„ ์„ ํƒํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

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

Pass options

๋ณ€ํ˜• ์˜ต์…˜์€ ํŠน์ • ์š”์ธ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์„ค์ •์„ ๋ฎ์–ด ์“ฐ๋ ค๋ฉด @SerializeOptions()๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

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

info ํžŒํŠธ @SerializeOptions() ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” @nestjs/common ํŒจํ‚ค์ง€์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์ด ์˜ต์…˜์€ classToPlain() ํ•จ์ˆ˜์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

Websockets & Microservices

์ด ๋ชจ๋“  ์ง€์นจ์€ ์‚ฌ์šฉ์ค‘์ธ ์ „์†ก ๋ฐฉ๋ฒ•์— ๊ด€๊ณ„์—†์ด WebSocket๊ณผ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Learn more

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ, ์˜ต์…˜์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ด ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

Last updated

Was this helpful?