요청 유효성 검사
필수 의존성: io.ktor:ktor-server-request-validation
코드 예제: request-validation
RequestValidation 플러그인은 들어오는 요청의 본문(body)을 유효성 검사하는 기능을 제공합니다. 가공되지 않은(raw) 요청 본문이나, 직렬화 도구(serializer)가 포함된 ContentNegotiation 플러그인이 설치된 경우 특정 요청 객체의 속성을 유효성 검사할 수 있습니다. 요청 본문 유효성 검사에 실패하면 플러그인은 RequestValidationException을 발생시키며, 이는 StatusPages 플러그인을 사용하여 처리할 수 있습니다.
의존성 추가
RequestValidation을 사용하려면 빌드 스크립트에 ktor-server-request-validation 아티팩트를 포함해야 합니다:
RequestValidation 설치
RequestValidation 플러그인을 애플리케이션에 설치하려면, 지정된
install 함수에 전달하세요. 아래 코드 스니펫은 RequestValidation을 설치하는 방법을 보여줍니다. - ...
embeddedServer함수 호출 내부에서 설치. - ...
Application클래스의 확장 함수인 명시적으로 정의된module내부에서 설치.
RequestValidation 플러그인은 특정 라우트에 설치할 수도 있습니다. 이는 서로 다른 애플리케이션 리소스에 대해 다른 RequestValidation 설정이 필요한 경우 유용할 수 있습니다.
RequestValidation 설정
RequestValidation 설정은 다음 세 가지 주요 단계로 구성됩니다:
1. 본문 수신
RequestValidation 플러그인은 타입 매개변수와 함께 receive 함수를 호출할 때 요청 본문을 유효성 검사합니다. 예를 들어, 아래 코드 스니펫은 본문을 String 값으로 수신하는 방법을 보여줍니다.
routing {
post("/text") {
val body = call.receive<String>()
call.respond(body)
}
}2. 유효성 검사 함수 설정
요청 본문을 유효성 검사하려면 validate 함수를 사용하세요. 이 함수는 유효성 검사의 성공 또는 실패 결과를 나타내는 ValidationResult 객체를 반환합니다. 실패한 결과의 경우, RequestValidationException이 발생합니다.
validate 함수에는 요청 본문을 두 가지 방식으로 유효성 검사할 수 있는 두 개의 오버로드가 있습니다:
첫 번째
validate오버로드는 요청 본문을 지정된 타입의 객체로 접근할 수 있게 해줍니다. 아래 예제는String값인 요청 본문을 유효성 검사하는 방법을 보여줍니다:kotlininstall(RequestValidation) { validate<String> { bodyText -> if (!bodyText.startsWith("Hello")) ValidationResult.Invalid("Body text should start with 'Hello'") else ValidationResult.Valid } }특정 직렬화 도구(serializer)로 설정된
ContentNegotiation플러그인이 설치되어 있다면, 객체 속성을 유효성 검사할 수 있습니다. 자세한 내용은 예제: 객체 속성 유효성 검사에서 확인하세요.두 번째
validate오버로드는ValidatorBuilder를 인자로 받으며 사용자 정의 유효성 검사 규칙을 제공할 수 있게 해줍니다. 자세한 내용은 예제: 바이트 배열 유효성 검사에서 확인할 수 있습니다.
3. 유효성 검사 예외 처리
요청 유효성 검사에 실패하면 RequestValidation은 RequestValidationException을 발생시킵니다. 이 예외를 통해 요청 본문에 접근하고 해당 요청에 대한 모든 유효성 검사 실패 이유를 가져올 수 있습니다.
다음과 같이 StatusPages 플러그인을 사용하여 RequestValidationException을 처리할 수 있습니다:
install(StatusPages) {
exception<RequestValidationException> { call, cause ->
call.respond(HttpStatusCode.BadRequest, cause.reasons.joinToString())
}
}전체 예제는 여기에서 찾을 수 있습니다: request-validation.
예제: 객체 속성 유효성 검사
이 예제에서는 RequestValidation 플러그인을 사용하여 객체 속성을 유효성 검사하는 방법을 살펴보겠습니다. 서버가 다음과 같은 JSON 데이터를 포함한 POST 요청을 받는다고 가정해 보겠습니다:
POST http://0.0.0.0:8080/json
Content-Type: application/json
{
"id": -1,
"firstName": "Jet",
"lastName": "Brains"
}id 속성에 대한 유효성 검사를 추가하려면 아래 단계를 따르세요:
위의 JSON 객체를 설명하는
Customer데이터 클래스를 생성합니다:kotlin@Serializable data class Customer(val id: Int, val firstName: String, val lastName: String)JSON 직렬화 도구와 함께
ContentNegotiation플러그인을 설치합니다:kotlininstall(ContentNegotiation) { json() }다음과 같이 서버 측에서
Customer객체를 수신합니다:kotlinpost("/json") { val customer = call.receive<Customer>() call.respond(customer) }RequestValidation플러그인 설정에서id속성이 지정된 범위 내에 있는지 확인하는 유효성 검사를 추가합니다:kotlininstall(RequestValidation) { validate<Customer> { customer -> if (customer.id <= 0) ValidationResult.Invalid("A customer ID should be greater than 0") else ValidationResult.Valid } }이 경우,
id값이0보다 작거나 같으면RequestValidation은 RequestValidationException을 발생시킵니다.
예제: 바이트 배열 유효성 검사
이 예제에서는 바이트 배열로 수신된 요청 본문을 유효성 검사하는 방법을 살펴보겠습니다. 서버가 다음과 같은 텍스트 데이터를 포함한 POST 요청을 받는다고 가정해 보겠습니다:
POST http://localhost:8080/array
Content-Type: text/plain
-1데이터를 바이트 배열로 수신하고 유효성 검사를 수행하려면 다음 단계를 수행하세요:
- 다음과 같이 서버 측에서 데이터를 수신합니다:kotlin
post("/array") { val body = call.receive<ByteArray>() call.respond(String(body)) } - 수신된 데이터를 유효성 검사하기 위해,
ValidatorBuilder를 인자로 받아 사용자 정의 유효성 검사 규칙을 제공할 수 있는 두 번째validate함수 오버로드를 사용합니다:kotlininstall(RequestValidation) { validate { filter { body -> body is ByteArray } validation { body -> check(body is ByteArray) val intValue = String(body).toInt() if (intValue <= 0) ValidationResult.Invalid("A value should be greater than 0") else ValidationResult.Valid } } }
