간단한 작업이었다. 우리 팀은 원래 common file에 커스텀 타입을 저장해두고 사용했었는데, 그것을 nestjs 틀에 맞추기 위하여 DTO로 각 module 파일안에 넣어주는 리펙토링을 진행했고 이 과정에서 entity의 구성요소를 이용해서 코드의 재사용성을 높이는 방식으로 DTO를 만들 수 있다는 것을 알게 되었다.
import { ApiProperty, PickType } from '@nestjs/swagger';
import { Waiting } from '../entities/waiting.entity';
export class GetUserWaitingDTO extends PickType(Waiting, ['id', 'createdAt'] as const) {
@ApiProperty({
description: '부스 이름',
})
boothName: string;
@ApiProperty({
description: '내 앞 대기 인원 수',
})
rank: number;
}
이렇게 picktype 메소드를 이용하게 되면 waiting이라고 되어있는 entity안에 column을 가져와서 바로 DTO의 인자로 만들 수 있다. 데이터를 직접 가져온다는 것은 아니고 이름만 빌려오는 것이다. 대신에 entity에 지정되어 있는 타입이 이미 있으니 같은 코드를 두 번 작성하지 않아도 된다.
그렇다면 한 가지 의문점이 들 수 있다. swagger에서 정보를 표시하는 부분을 어떻게 작성하지? 가 그것인데 그것은 entity에 적어주면 swagger에서 표시해준다. 그래서 내가 오늘 작업한 부분이 swagger에서 표시 할 수 있게 festival banner의 type을 명시해주는 것이었다.
@Column({ type: 'varchar' })
@ApiProperty({
description: '배너타입',
enum: ['normal', 'important', 'url'],
example: 'notice',
})
type: string;
수정 사항은 이렇게 반영되었다. 저 Array[3]을 누르게 되면 type 3가지를 명시해준다.
여기서는 예기치 못한 에러가 발생했는데, 바로 시간 데이터 관련해서 코드가 제대로 동작할 때가 있고 아닐 때가 있는 문제였다. 정확한 문제는 아직 알지 못하지만 나의 추측으로는 밀리 세컨드를 nestJs 환경에서 비교연산 할 때 모든 소수점을 확인하지 않는 것 같다는 것 정도? 그래서 원래 밀리 세컨드 까지 시간이 표시되지 않았을 때는 query 연산 중에 between 에서 무조건 자기 자신도 포함하게 되는 문제가 있어서 -1을 연산해주었는데, 밀리 세컨드까지 시간이 표시되는 상황에서는 -1 연산을 하지 않아도 자기 자신을 포함하지 않아 없애주기로 했다.
const temp: GetUserWaitingDTO = {
boothName: obj.booth.name,
createdAt: obj.createdAt,
rank: waitingCntList.length,
id: obj.id,
};
그리고 만약에 해당 전화번호로 되어있는 waiting이 없다면 error를 생성할 수 있게 변경해 주었다.
// 유저가 waiting을 신청할 수 있는 부스는 최대 3개까지 있으니, 해당 부스들을 데이터베이스에서 가져옵니다.
const userWaitingInfo: Waiting[] = await this.waitingRepository.find({
relations: {
booth: true,
},
select: {
id: true,
createdAt: true,
booth: {
id: true,
name: true,
},
},
where: {
phoneNum: phoneNumber,
status: 'pending',
createdAt: MoreThan(krCurr),
},
});
if (userWaitingInfo.length == 0) {
throw new Error();
}
나는 해당 api는 모든 banner를 다 가져오는 줄 알고 구현했는데 알고보니 url은 제외하고 가져와야 하는 것이었다. 그래서 수정해주었다.