이번 포스팅은 작업한 내용을 간단히 메모하는 느낌의 포스팅입니다.
현재 프로젝트에서는 HTTP 리퀘스트 데이터의 유효성을 검증하기 위해 class-validator라는 라이브러리를 사용하고 있습니다.
기존에는 필수로 받아야 하는 프로퍼티를 체크하기 위해 @IsNotEmpty() 데코레이터를 사용했는데,
이렇게 했을 때 문제가 되는 부분이 생겨서 간단하게 정리 용도로 작성하겠습니다.
문제가 생겼던 부분은
주소를 검색해서 서버로 주소를 넘겨주는 부분입니다.
유저 회원가입시에 다음 주소 API를 사용하여 특정 값들만 서버에 넘겨주고 있는데,
기존에는 아래 코드처럼 @IsNotEmpty()로 유효성 검사를 하는 것 을 볼 수 있습니다.
export default class AddressDto {
@ApiProperty({
description: '우편번호',
default: '05381',
})
@IsNotEmpty()
readonly zonecode: string;
@ApiProperty({
description: '시',
default: '서울',
})
@IsNotEmpty()
readonly sido: string;
@ApiProperty({
description: '구',
default: '동대문구',
})
@IsNotEmpty()
readonly sigungu: string;
@ApiProperty({
description: '동',
default: '회기동',
})
@IsNotEmpty()
readonly bname: string;
@ApiProperty({
description: '도로명',
default: '경희대로 4길',
})
@IsNotEmpty()
readonly roadname: string;
@IsDefined()
@ApiProperty({
description: '도로명 주소',
default: '서울 동대문구 경희대로4길 26',
})
@IsNotEmpty()
readonly roadAddress: string;
@ApiProperty({
description: '지번 주소',
default: '서울 동대문구 회기동 8-4',
})
@IsNotEmpty()
readonly jibunAddress: string;
@ApiProperty({
description: '학원 주소(상세)',
default: '1305호',
})
@IsNotEmpty()
readonly addressDetail: string;
}
이렇게 되면 문제가 되는 부분이 다음 API로 값을 가져왔을 때,
아래 예시처럼 jibunAddress 혹은 다른 값들을 "" 이런식으로 빈값으로 보내게 되고,
@IsNotEmpty()로 유효성검사를 하게 되면 422 에러가 나는 문제가 있었습니다.
그래서 class-validator의 데코레이터중에 조건에 맞는 것을 다시 찾아보았는데요.
제가 생각한 조건은
1. null 혹은 undefined는 422로 걸려야 하고
2. ""값은 통과시켜야 했습니다.
위 두 데코레이터의 설명을 보면 아시겠지만, @IsDefined는 정의만 되어있다면 ""도 통과를 시키는걸 알 수 있었고,
현재는 아래와 같이 수정하여 사용하고 있습니다.
export default class AddressDto {
@IsDefined()
@ApiProperty({
description: '우편번호',
default: '05381',
})
readonly zonecode: string;
@IsDefined()
@ApiProperty({
description: '시',
default: '서울',
})
readonly sido: string;
@IsDefined()
@ApiProperty({
description: '구',
default: '동대문구',
})
readonly sigungu: string;
@IsDefined()
@ApiProperty({
description: '동',
default: '회기동',
})
readonly bname: string;
@IsDefined()
@ApiProperty({
description: '도로명',
default: '경희대로 4길',
})
readonly roadname: string;
@IsDefined()
@ApiProperty({
description: '도로명 주소',
default: '서울 동대문구 경희대로4길 26',
})
readonly roadAddress: string;
@IsDefined()
@ApiProperty({
description: '지번 주소',
default: '서울 동대문구 회기동 8-4',
})
readonly jibunAddress: string;
@IsDefined()
@ApiProperty({
description: '학원 주소(상세)',
default: '1305호',
})
readonly addressDetail: string;
}
주소 DTO에서 정확히 어떤 데이터가 ""로 올지 몰라서 우선 전부 @IsDefined로 설정하여 찝찝하긴 하지만,
우선은 일정문제로 넘어가기로 하였고, 나중에 자세히 알아볼 시간이 있으면 다시 정리하여 포스팅하는 시간을 가져보겠습니다.
'JavaScript & TypeScript' 카테고리의 다른 글
[NestJS] iterable 객체 병렬처리 하기(feat.Bluebird JS) (1) | 2022.10.09 |
---|---|
[NestJS] DTO의 사용범위에 관한 고찰 및 리팩토링(feat.Layered Architecture) (4) | 2022.09.23 |
[NestJS] 이벤트 드리븐으로 기능 구현하기(feat.Event Emitter) (0) | 2022.09.18 |
[NestJS] 쿼리빌더를 사용한 코드 리팩토링 (feat.TypeORM) (0) | 2022.08.23 |
[NestJS] Many-to-Many 생성시에 할당하는 코드 리팩토링 (feat.TypeORM) (0) | 2022.07.12 |