본문 바로가기
개발 프레임워크/NestJS

[NestJS] 매핑유형(Partial, Pick, Omit, Intersection) Type()

by minhyeok.lee 2023. 2. 23.
반응형

NestJS에서 PartialType(), PickType(), OmitType(), IntersectionType()의 사용

 

CRUD (Create / Read / Update / Delete)와 같은 기능을 구축할 때 기본 엔터티 유형에서 변형을 구성하는 것이 유용하다.

Nest는 이 작업을 보다 편리하게 만들기 위해 유형 변환을 수행하는 여러 유틸리티 기능을 제공한다.

 

입력 유효성 검사 유형(DTO)을 빌드할 때 동일한 유형에서 생성 및 업데이트 변형을 빌드하는 것이 유용한 경우가 많다 .

예를 들어 생성 변형은 모든 필드를 요구할 수 있지만 업데이트 변형은 모든 필드를 선택 사항으로 만들 수 있다.

Nest는 PartialType()이 작업을 더 쉽게 만들고 상용구를 최소화하기 위한 유틸리티 기능을 제공한다.

1. PartialType()함수는 입력 유형의 모든 속성이 옵션으로 설정된 유형(클래스)을 반환한다. 

예를 들어 다음과 같은 생성 유형이 있다고 가정하자.

export class userStrongInfo {
  @ApiProperty({ type: Number })
  @IsNumber()
  level: number;

  @ApiProperty({ type: Number })
  @IsNumber()
  magicPower: number;
  
  @ApiProperty({ type: Number })
  @IsNumber()
  swordPower: number;
}

기본적으로 이러한 필드는 모두 필수입니다. 

 

동일한 필드가 있지만 각 필드가 선택 사항인 유형을 생성하려면 PartialType()클래스 참조(userStrongInfo)를 인수로 전달한다.

export class PartialTypeClass extends PartialType(userStrongInfo) {}

 

결과값 (Swagger에서 확인한 클래스 구현물)

Swagger에서 PartialTypeClass 속성
Swagger에서 PartialTypeClass 속성

* 결과적으로 PartialTypeClass의 필드들은 속성이 모두 옵션으로 설정된 새로운 클래스 PartialTypeClass이다.

 

 

2. PickType()함수는 입력 유형에서 속성 집합을 선택하여 새 유형(클래스)을 생성한다. 

예시 코드)

export class PickTypeClass extends PickType(userStrongInfo, ['level'] as const) {}

 

결과값 (Swagger에서 확인한 클래스 구현물)

Swagger에서 PickTypeClass 속성
Swagger에서 PickTypeClass 속성

* 결과적으로 level만 선택되어 생성된 새로운 클래스 PickTypeClass이다.

 

3. OmitType()함수는 입력 유형에서 모든 속성을 선택한 다음 특정 키 세트를 제거하여 유형을 구성한다.

예시 코드)

export class OmitTypeClass extends OmitType(userStrongInfo, ['magicPower'] as const) {}

 

결과값 (Swagger에서 확인한 클래스 구현물)

Swagger에서 OmitTypeClass 속성
Swagger에서 OmitTypeClass 속성

* 결과적으로 magicPower가 제거되고 생성된 새로운 클래스 OmitTypeClass이다.

 

 

4. IntersectionType()함수는 두 가지 유형을 하나의 새로운 유형(클래스)으로 결합한다.

예시 코드)

export class userStrongInfo {
  @ApiProperty({ type: Number })
  @IsNumber()
  level: number;

  @ApiProperty({ type: Number })
  @IsNumber()
  magicPower: number;
  
  @ApiProperty({ type: Number })
  @IsNumber()
  swordPower: number;
}

export class userBaseInfo {
  @ApiProperty({ type: String })
  @IsString()
  name: string;

  @ApiProperty({ type: Number })
  @IsNumber()
  age: number;

  @ApiProperty({ type: Number })
  @IsNumber()
  major: number;
}

 

두 유형의 모든 속성을 결합하여 새 유형을 생성할 수 있다.

export class UserInfo extends IntersectionType(
  userBaseInfo,
  userStrongInfo,
) {}

 

결과값 (Swagger에서 확인한 클래스 구현물)

Swagger에서 UserInfo속성
Swagger에서 UserInfo 속성

* 결과적으로 userBaseInfo와 userStrongInfo가 결합되어 생성된 새로운 클래스 UserInfo 이다.

 

 

5. 유형 매핑 유틸리티 함수는 함께 사용 가능하다.

PartialType과 OmitType을 같이 사용하는 예시 코드)

export class PartialTypeOmitClass extends PartialType(
  OmitType(userStrongInfo, ['swordPower', 'magicPower'] as const),
) {}

 

결과값 (Swagger에서 확인한 클래스 구현물)

Swagger에서 PartialTypeOmitClass 속성
Swagger에서 PartialTypeOmitClass 속성

 

* 결과적으로 swrodPower와 magicPower가 제거되고 나머지 속성이 옵션으로 설정되어 생성된 새로운 클래스 PartialTypeOmitClass 이다.

 

 

물론 위 예제 모두 새로운 속성이 추가가 가능하다.

예시 코드)

export class UserInfo extends IntersectionType(userBaseInfo, userStrongInfo) {
  @ApiProperty({ type: Date })
  @IsDateString()
  playTime: Date;
}

 

결과값 (Swagger에서 확인한 클래스 구현물)

Swagger에서 UserInfo속성
Swagger에서 UserInfo속성

반응형

댓글