class-transformer의 plainToClass를 이용한 plain object에서 class object로 변환하기

dev Aug 18, 2019

자바스크립트에는 두 가지 형태의 객체가 있다.

  • plain (literal) objects
  • class (constructor) objects

plain object는 Object 클래스의 인스턴스이다. { } 표기법을 통해 생성하면 객체 리터럴이라 부르기도 한다. class object는 생성자, 프로퍼티 및 메소드가 있는 클래스의 인스턴스이다. 일반적으로 class 통해 정의한다.

class-transformer는 위에서 설명한 자바스크립트의 plain object를 class object로 쉽게 변환해준다. 자바스크립트의 plain object를 class object로 변환해서 얻게 되는 이점은 레포지토리(https://github.com/typestack/class-transformer)에서 확인할 수 있다. class-transformer 설치 및 코드는 다음과 같다.

class-transformer  설치

사용하고 있는 패키지 매니저를 사용해서 class-transformer, reflect-metadata를 설치한다. 나는 yarn을 통해서 설치했다.

$ yarn add class-transformer
$ yarn add reflect-metadata

설치가 끝나면 class-transformer의 plainToClass 메소드를 활용해 plain object를 class object로 변환해보자. 코드는 다음과 같다.

코드

fromPlainUser 객체 리터럴와  GetUserResponse 클래스 객체를 만들었다. 다음으로 class-transformer의 plainToClass 메소드를 이용해 plain object를 class object로 변환한다.

import moment = require('moment');
import { plainToClass, Expose} from 'class-transformer'

const fromPlainUser = {
    id: 1,
    uuid: "50CC75F5-537C-4407-B4B3-951F95E16F90",
    name: "cherrypick",
    isActive: true,
    createdAt: moment("2019-08-17").toDate(),
    updatedAt: moment("2019-08-17").toDate()
}

class GetUserResponse {
    id: number
    uuid: string
    name: string
    isActive: boolean
    createdAt: Date
    updatedAt: Date
}
 
console.log(fromPlainUser)
console.log(plainToClass(GetUserResponse, fromPlainUser))

결과

기존의 plain object가 GetUserResponse class object로 변환된 것을 확인할 수 있다.

{ 
  id: 1,
  uuid: '50CC75F5-537C-4407-B4B3-951F95E16F90',
  name: 'cherrypick',
  isActive: true,
  createdAt: 2019-08-16T15:00:00.000Z,
  updatedAt: 2019-08-16T15:00:00.000Z 
}

GetUserResponse {
  id: 1,
  uuid: '50CC75F5-537C-4407-B4B3-951F95E16F90',
  name: 'cherrypick',
  isActive: true,
  createdAt: 2019-08-16T15:00:00.000Z,
  updatedAt: 2019-08-16T15:00:00.000Z 
}

오늘은 class-transformer의 plainToClass 메소드에 대해 알아봤다. 이 외에도 유용한 메소드가 많이 있어 차례대로 포스팅 할 예정이다.

cherrypick

체리픽이라는 단어 본연의 뜻은 안 좋은 의미이지만 저는 트렌디하고 많은 기술을 공부하고 내 거로 만들자는 뜻을 가지고 사용하고 있습니다.