본문 바로가기

Diary

[1D1C] 0319 기록

Dto 만들 때 기존에는 PickType 을 사용하여, 특정 스키마에서 필요한 필드만 골라서 dto 클래스를 만들었었다

import { PickType } from '@nestjs/swagger';
import { Member } from '../member.schema';

export class MemberRequestDto extends PickType(Member, [
  'email',
  'password',
  'name',
]) {}

 

스키마 구조가

드라이버 리뷰 테이블 / 우드 리뷰 테이블 / 아이언 리뷰 테이블... 이런식으로 테이블을 분리했다

(이게 올바른 판단인지는 아직까지도 확신이 서지 않는다) 

이유는 종류별로 별점 키값이 다르고, 제출해야하는 부가 정보가 다르기 때문이다

 

어쨌든, 근데 리뷰 Post API 는 하나의 API 로 프론트로부터 데이터를 받고, 내부적으로 카테고리에 따라서 다른 리뷰 테이블로 create 하는 로직을 타게 된다

 

그래서 ReviewCreateDto 클래스는 드라이버리뷰 스키마 / 우드 리뷰 스키마 / 아이언 리뷰 스키마 에서 필요한 것만 PickType 해서 상속 받고 싶었다.

 

export class ReviewCreateDto extends 
PickType(DriverReviews, [
  'directional',
  'design',
]),
PickType(WoodReviews, [
  'number',
  'distance',
])
{}

 

이런식으로

 

하지만 Class 는 1가지 클래스만 상속받을 수 있다.

multiple 클래스를 상속받기 위해서는 interface 를 사용할 수 있다.

 

결론적으로는 Picktype 을 사용하지 못하고

 

일일히 필요한 필드를 클래스 내부에 작성해주지만, interface 를 통해서 타입 safe 처리를 했다

 

interface ReviewCreateDtoInterface extends DriverReviews, WoodReviews {}

export class ReviewCreateDto
  implements Omit<ReviewCreateDtoInterface, 'product_id' | 'author_id'>
{
  @ApiProperty({
    example: 's, sr,, r, a, l',
    description: '샤프트',
  })
  @Prop()
  shaft: string;

  @ApiProperty({
    example: '9, 10, ...',
    description: '로프트 각도',
  })
  @Prop()
  loft: string;

  @ApiProperty({
    example: '9, 10, ...',
    description: '우드 넘버(for Wood Only)',
  })
  @Prop()
  number: number;

  @ApiProperty({
    example: 5,
    description: '방향성(5점만점)',
  })
  @Prop()
  directional: number;
}

 

 

'Diary' 카테고리의 다른 글

[1D1C] 0318 기록  (0) 2024.03.19
[1D1C] 0220 기록  (0) 2024.02.20
[1D1C] 0215 기록  (0) 2024.02.16
[1D1C] 0214 기록  (0) 2024.02.15
[1D1C] 0213 기록  (0) 2024.02.14