cats.schema.ts
, cats.request.dto.ts
, cat.dto.ts
는 중복되는 코드들이 있다. class를 사용하면 상속으로 재사용성을 증가시킬 수 있기 때문에 cats.schema.ts
의 Cat
클래스를 상속받아 보자.
// 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;
}
이렇게 하면 객체 지향의 패턴을 잘 활용할 수 있다.