Mapped Types 정리

HyunSe·2022년 7월 19일
2

NestJS

목록 보기
3/3
post-thumbnail

Mapped-Types

yarn add @nestjs/mapped-types

을 설치하여 mapped-types를 사용할 수 있다.
Mapped-Types는 주로 CRUD와 같은 기능을 만들 때 엔티티 하나 하나를 모두 세팅해주는 경우 하나의 Entity가 클 경우 세팅을 할 때 시간이 많이 소모된다.

이를 보다 편리하게 하기 위해 Mapped-Types를 통해 기본 Entity 유형을 변경하여 사용할 수 있다.


우선 우리가 가장 기본적으로 MemoRoom 이라는 Entity를 Create할 경우

import { BaseEntity, Column, Entity, PrimaryGeneratedColumn } from 'typeorm';

// 예시 MemoRoom Entity
@Entity()
export class MemoRoom extends BaseEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string; // 방 이름

  @Column()
  pinned: boolean; // 방 고정핀

  @Column()
  category: string; // 방 유형
}

위와 같은 Entity에서 우리는 아래와 같은 Dto를 도출해 사용한다.


export class CreateMemoRoomDto {
  name: string;
  pinned: boolean;
  category: string;
}

하지만 Create, Read, Update, Delete 모두 Dto가 필요할 경우 다음과 같이 Dto를 만들어주는 코드를 매번 작성해야 하는데

이 때 Mapped-Types를 이용하여 좀 더 편리하게 작성할 수 있다.

1. PartialType

export class UpdateMemoRoomDto extends PartialType(CreateMemoRoomDto) {}

PartialType을 사용하면 CreateMemoRoomDto에 있는 Column들이 모두 Optional해지고 따로 IsOptional 처리 또한 해줄 필요가 없다.


2. PickType

export class UpdateMemoRoomPinnedDto extends PickType(CreateMemoRoomDto, ['pinned' as const]) {}

PickType을 사용하면 CreateMemoRoomDto에 있는 Column들 중 원하는 것들만 정해 해당 값들로만 이루어진 Dto를 만들 수 있다.

🔃 해당 Dto에서는 MemoRoom의 고정 값만 변경할 수 있다.


3. OmitType

export class UpdateUserDto extends OmitType(CreateUserDto, ['id' as const]) {}

OmitType을 사용하면 CreateUserDto에 있는 Column들 중 원하는 것들만 정해 해당 값들을 제외하고 이루어진 Dto를 만들 수 있다.

따로 위에 CreateUserDto가 없지만 대략적으로
id, password, nickname이 있다고 하면 일반적인 서비스에서는 userId는 절대 변경될 일이 없기 때문에 id를 제외하고 Dto를 만들어 준다.

✅ 주로 유저 프로필 변경에서 사용될 Dto


4. IntersectionType

export class InsertUserDto extends IntersectionType(CreateUserDto, CreateUserInfoDto) {}

IntersectionType을 사용하면 CreateUserDto와 CreateUserInfoDto 두 개의 Dto를 합친 하나의 Dto를 만들 수 있다.

✅ 해당 예시는 좋은 예시가 아니라서 좀 더 좋은 예시가 생각나면 업데이트 예정


Composition

export class UpdateUserDto extends PartialType(
  OmitType(CreateUserDto, ['email'] as const),
) {}

유저 정보를 업데이트할 때 꼭 모든 정보를 한 번에 업데이트해야 하는 것은 아니기 때문에 3번에서 사용한 OmitType 대신 PartialType과 OmitType의 혼합 사용을 통해 변경이 일어나지 않을 email을 제외하고 optional하게 Dto를 사용할 수 있다.

profile
FrontEnd Dev

1개의 댓글

comment-user-thumbnail
2022년 10월 19일

혹시 현재 개발 공부중인 학생입니다. 백엔드 쪽으로 일을하시나요 아니면 프론트 쪽으로 일을하시나요? 노드공부하면서 네스트도 관심있는데 막 리액트 넥스트 공부해보는것도 좋다하고 그래서 방향이 맞나 싶어서 댓글남깁니다

답글 달기