요청 유효성 검사
필수 의존성: io.ktor:ktor-server-request-validation
코드 예시: request-validation
RequestValidation 플러그인은 들어오는 요청의 본문을 유효성 검사하는 기능을 제공합니다. 직렬 변환기와 함께 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
함수는 두 가지 방식으로 요청 본문을 유효성 검사할 수 있도록 두 가지 오버로드(overload)를 제공합니다:
첫 번째
validate
오버로드를 사용하면 지정된 타입의 객체로 요청 본문에 접근할 수 있습니다. 아래 예시는String
값을 나타내는 요청 본문을 유효성 검사하는 방법을 보여줍니다:kotlininstall(RequestValidation) { validate<String> { bodyText -> if (!bodyText.startsWith("Hello")) ValidationResult.Invalid("Body text should start with 'Hello'") else ValidationResult.Valid } }
특정 직렬 변환기로
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 } } }