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를 이용하여 좀 더 편리하게 작성할 수 있다.
export class UpdateMemoRoomDto extends PartialType(CreateMemoRoomDto) {}
PartialType을 사용하면 CreateMemoRoomDto에 있는 Column들이 모두 Optional해지고 따로 IsOptional 처리 또한 해줄 필요가 없다.
export class UpdateMemoRoomPinnedDto extends PickType(CreateMemoRoomDto, ['pinned' as const]) {}
PickType을 사용하면 CreateMemoRoomDto에 있는 Column들 중 원하는 것들만 정해 해당 값들로만 이루어진 Dto를 만들 수 있다.
🔃 해당 Dto에서는 MemoRoom의 고정 값만 변경할 수 있다.
export class UpdateUserDto extends OmitType(CreateUserDto, ['id' as const]) {}
OmitType을 사용하면 CreateUserDto에 있는 Column들 중 원하는 것들만 정해 해당 값들을 제외하고 이루어진 Dto를 만들 수 있다.
따로 위에 CreateUserDto가 없지만 대략적으로
id, password, nickname이 있다고 하면 일반적인 서비스에서는 userId는 절대 변경될 일이 없기 때문에 id를 제외하고 Dto를 만들어 준다.
✅ 주로 유저 프로필 변경에서 사용될 Dto
export class InsertUserDto extends IntersectionType(CreateUserDto, CreateUserInfoDto) {}
IntersectionType을 사용하면 CreateUserDto와 CreateUserInfoDto 두 개의 Dto를 합친 하나의 Dto를 만들 수 있다.
✅ 해당 예시는 좋은 예시가 아니라서 좀 더 좋은 예시가 생각나면 업데이트 예정
export class UpdateUserDto extends PartialType(
OmitType(CreateUserDto, ['email'] as const),
) {}
유저 정보를 업데이트할 때 꼭 모든 정보를 한 번에 업데이트해야 하는 것은 아니기 때문에 3번에서 사용한 OmitType 대신 PartialType과 OmitType의 혼합 사용을 통해 변경이 일어나지 않을 email을 제외하고 optional하게 Dto를 사용할 수 있다.
혹시 현재 개발 공부중인 학생입니다. 백엔드 쪽으로 일을하시나요 아니면 프론트 쪽으로 일을하시나요? 노드공부하면서 네스트도 관심있는데 막 리액트 넥스트 공부해보는것도 좋다하고 그래서 방향이 맞나 싶어서 댓글남깁니다