본문 바로가기
Spring

[Spring] 코틀린 쓸 때 @Valid 동작이 안된다면

by Nhahan 2024. 1. 18.
data class OwnerSignUpRequest(
    @field:Email(message = "이메일 형식을 입력해주세요.")
    val email: String?,
    @field:Size(min = 8, message = "비밀번호는 8글자 이상이어야 합니다.")
    val password: String?,
    @field:Size(min = 11, message = "잘못된 휴대전화 번호입니다.")
    val phoneNumber: String?,
    val storeName: String? = null,
    val ownerName: String,
    @field:Size(min = 10, message = "사업자번호는 10글자 이상이어야 합니다.")
    val businessRegistrationNumber: String?,
)

 

검색해서 나온 모든 방법을 다 해봤지만, Validation을 하지 않고 그냥 통과해버렸다.

이유는, 코틀린에서는 기본적으로 null 허용을 하지 않기 때문이었다. 자바에서는 당연하게 됐던 것이 안되니까 당황스러웠지만, 막상 해결하고 보니 간단한 문제.

 

위처럼 Validation이 필요한 필드 타입에 ?를 붙여 null 허용을 해주면 정상적으로 동작한다.

 

 


 

 

@ExceptionHandler(MethodArgumentNotValidException::class)
fun handleMethodArgumentNotValidException(ex: MethodArgumentNotValidException): ResponseEntity<ErrorResponse> {
    val errors = ex.bindingResult.fieldErrors.associateBy(
        keySelector = { it.field },
        valueTransform = { it.defaultMessage ?: "Invalid value" }
    )
    val errorResponse = ErrorResponse(code = 400, message = errors)
    return ResponseEntity(errorResponse, HttpStatus.BAD_REQUEST)
}

/*
{
    "code": 400,
    "message": {
        "businessRegistrationNumber": "사업자번호는 10글자 이상이어야 합니다.",
        "password": "비밀번호는 8글자 이상이어야 합니다.",
        "phoneNumber": "잘못된 휴대전화 번호입니다."
    }
}
*/

 

 

controller advice 에서 이 에러를 잡아 리턴해주게까지 세팅했다. 이제 프론트엔드에서 편하게 message[필드명] 으로 에러를 접근할 수 있을 것이다.

 

 

 

댓글