마지막 기업 과제는 개인으로 진행하게 되었습니다. 🔥
요구사항 1. 자동차 차종 ID를 이용하여 사용자가 소유한 타이어 정보를 저장한다.
- 한 번에 최대 5명까지의 사용자에 대한 요청을 받을 수 있도록 해야한다.
/* Request Body 예제 */
[
{
"id": "candycandy",
"trimId": 5000
},
{
"id": "mylovewolkswagen",
"trimId": 9000
},
{
"id": "bmwwow",
"trimId": 11000
},
{
"id": "dreamcar",
"trimId": 15000
}
]
1. class-validator의 IsArray 데코레이터를 사용하면 위의 요구사항과 다르게 됩니다.
{ items: [item1, item2] } // X
[ item1, item2, item3 ... ] // O
2. NestJS의 parseArrayPipe 클래스는 개수 제한 설정이 없습니다.
해당 요구 사항에 맞추기 위해 NestJS Pipe 모듈을 분석하고 커스텀 했습니다.
단순히 컨트롤러에서 길이가 5 이상인 요청은 거부하면 되지만, NestJS에서 권장하는 SRP(단일책임원칙)를 따라 제공되는 Pipe를 커스텀하였습니다.
요구사항 2. 타이어 포맷 유효성 검사
조회된 정보에서 타이어 정보는 spec → driving → frontTire/rearTire 에서 찾을 수 있다.
타이어 정보는 205/75R18의 포맷이 정상이다.
205는 타이어 폭을 의미하고 75R은 편평비, 그리고 마지막 18은 휠사이즈로써 {폭}/{편평비}R{18}과 같은 구조이다.
위와 같은 형식의 데이터일 경우만 DB에 항목별로 나누어 서로다른 Column에 저장하도록 한다.
실용적인 테이블 설계를 위해 자동차와 타이어에 대해 조사했습니다.
자동차 평균 수명 (타이어의 수명을 고려해야 했습니다. 😅)
여러번의 모델링 끝에 완성한 테이블 구조입니다.
- 이전의 프로젝트보다 더 좋은 폴더 구조를 고민했습니다.
- OOP를 고려하여 API로 받은 리터럴 객체를 상태와 행위를 가진 클래스로써 관리하였습니다.
TypeScript 환경에서 class-transformer 적극적으로 사용하기
느낀점
- DTO, Entity의 정확한 활용 방법을 아직 모르겠다. (정답이 없는걸까?)
- 프로젝트 도메인(타이어)에 대해 조사하는 과정이 흥미로웠다.
결과물
https://github.com/luckyhyom/car-project
'개발 공부' 카테고리의 다른 글
1일 1커밋 6개월 + 코로나 완치! + 면접..등 (0) | 2021.12.23 |
---|---|
회고록 (0) | 2021.12.16 |
여섯번째 기업 과제 회고록 (Deer) (0) | 2021.11.22 |
다섯번째 기업 과제 회고록 (Human Scape) (0) | 2021.11.18 |
원티드x위코드 프리온보딩 네번째 기업과제 (에잇퍼센트) 회고록 (0) | 2021.11.15 |