내가 생각했던 것 보다 지역 데이터들의 중복이 많았다. 그 중 특정 데이터로 예시를 들어보겠다.
지역 데이터 중, 읍/면/리 에 ‘오리’ 라는 동네가 있다. Region 테이블을 조회해본 결과 총 대구, 부산, 경기도, 전라남도 4개의 ‘오리’ 가 존재한다는 것을 확인할 수 있다.
Request Body를 아래와 같이 설정해보자. “region” : “오리” 라고 요청을 보낼경우 어떤 지역의 ‘오리’인지 확인할 수 없어 4개의 지역구 중 랜덤 지역구가 데이터베이스에 저장이 된다.
여러 방법으로 해결할 수 있겠지만, 나는 상위 지역명도 request body 포함하는 방법으로 해결했다.
위의 Request Body에 맞게 Dto도 바꿔보자.
먼저 지역 데이터인 parentRegionName과 하위 데이터인 RegionName을 넣은 RegionDto를 만들었다.
export class RegionDto{
@ApiProperty({ example: '강남구', description: '사용자가 거주하는 구/군의 상위 지역 정보' })
@IsNotEmptyAndString()
parentRegionName!: string;
@ApiProperty({ example: '역삼동', description: '사용자가 거주하는 구/군' })
@IsNotEmptyAndString()
RegionName!: string;
}
그 다음, CreateUserDto의 region type을 RegionDto로 설정했다.
export class CreateUserDto extends AuthCredentialsDto{
@ApiProperty({type: String, description: '사용자 닉네임', required: true, example: '야망있는최필규'})
@IsNotEmptyAndString(1, 15)
nickname!: string;
@ApiProperty({type: String, description: '사용자가 거주하는 지역 정보', required: true})
@Type(() => RegionDto) // region 객체를 RegionDto 클래스의 인스턴스로 변환
@ValidateNested() // RegionDto 클래스 유효성 검사
region!: RegionDto;
}
@ValidateNested()를 사용하면 CreateUserDto내에 중첩된 RegionDto 객체가 있을 경우, RegionDto 내에서 정의된 유효성 검사 규칙(@IsNotEmpty, @IsString…)이 수행된다.