NestJS 상속으로 재사용성 증가시키기

bin-lee·2022년 1월 8일
0

cats.schema.ts, cats.request.dto.ts, cat.dto.ts는 중복되는 코드들이 있다. class를 사용하면 상속으로 재사용성을 증가시킬 수 있기 때문에 cats.schema.tsCat 클래스를 상속받아 보자.

// cats.schema.ts

@Schema(options)
export class Cat extends Document {
  @ApiProperty({
    example: 'abc@naver.com',
    description: 'email',
    required: true,
  })
  @Prop({
    required: true,
    unique: true,
  })
  @IsEmail()
  @IsNotEmpty()
  email: string;

  @ApiProperty({
    example: '김가나',
    description: 'name',
    required: true,
  })
  @Prop({
    required: true,
  })
  @IsString()
  @IsNotEmpty()
  name: string;

  @ApiProperty({
    example: 'pass4034',
    description: 'password',
    required: true,
  })
  @Prop({
    required: true,
  })
  @IsString()
  @IsNotEmpty()
  password: string;

  @Prop()
  @IsString()
  imgUrl: string;

  readonly readOnlyData: { id: string; email: string; name: string };
}

위의 코드를 cats.request.dto.ts가 상속받으면 아래와 같다.

// cats.request.dto.ts

export class CatRequestDto extends Cat {}

cat.dto.ts가 상속받으면 아래와 같다.

// cat.dto.ts

export class ReadOnlyCatDto extends Cat {
  @ApiProperty({
    example: '34230004',
    description: 'id',
  })
  id: string;
}

그런데 이렇게 Cat을 상속받으면 cats.request.dto.ts의 경우 password 값이 포함되어 버린다. 이때 PickType을 사용하면 Cat이라는 클래스에서 필요한 부분만 가져올 수 있다. PickType을 사용한 코드는 각각 아래와 같다.

// cats.request.dto.ts

export class CatRequestDto extends PickType(Cat, [
  'email',
  'name',
  'password',
] as const) {}
// cat.dto.ts

export class ReadOnlyCatDto extends PickType(Cat, ['email', 'name'] as const) {
  @ApiProperty({
    example: '34230004',
    description: 'id',
  })
  id: string;
}

이렇게 하면 객체 지향의 패턴을 잘 활용할 수 있다.

profile
🚀 오늘 배운 건 오늘 적자

0개의 댓글