데이터 변환
코드 예제: data-conversion
필수 의존성: io.ktor:ktor-server-data-conversion
DataConversion 플러그인은 값 목록을 직렬화하고 역직렬화할 수 있도록 합니다. 기본적으로 Ktor는 DefaultConversionService를 통해 기본 타입(primitive type)과 열거형(enum)을 처리합니다. DataConversion
플러그인을 설치하고 구성하여 이 서비스를 확장하여 추가 타입을 처리할 수 있습니다.
의존성 추가
DataConversion
을(를) 사용하려면 빌드 스크립트에 ktor-server-data-conversion
아티팩트를 포함해야 합니다:
DataConversion 설치
애플리케이션에 DataConversion
플러그인을 설치하려면, 지정된
install
함수에 전달하세요. 아래 코드 스니펫은 DataConversion
을(를) 설치하는 방법을 보여줍니다... - ...
embeddedServer
함수 호출 내에서. - ...
Application
클래스의 확장 함수인 명시적으로 정의된module
내에서.
컨버터 추가
DataConversion
구성 내에서 타입 변환을 정의할 수 있습니다. 지정된 타입에 대해 convert<T>
메서드를 제공하고 사용 가능한 함수를 사용하여 값 목록을 직렬화하고 역직렬화하세요:
- 값 목록을 역직렬화하려면
decode()
함수를 사용하세요. 이 함수는 URL에 반복되는 값을 나타내는 문자열 목록을 받고 디코딩된 값을 반환합니다.
decode { values -> // converter: (values: List<String>) -> Any?
//deserialize values
}
- 값을 직렬화하려면
encode()
함수를 사용하세요. 이 함수는 임의의 값을 받고 그것을 나타내는 문자열 목록을 반환합니다.
encode { value -> // converter: (value: Any?) -> List<String>
//serialize value
}
서비스 접근
현재 컨텍스트에서 DataConversion
서비스에 접근할 수 있습니다:
val dataConversion = application.conversionService
그런 다음 컨버터 서비스를 사용하여 콜백 함수를 호출할 수 있습니다:
fromValues(values: List<String>, type: TypeInfo)
콜백 함수는values
를 문자열 목록으로, 그리고 값을 변환할TypeInfo
를 인자로 받아 디코딩된 값을 반환합니다.toValues(value: Any?)
콜백 함수는 임의의 값을 인자로 받아 그것을 나타내는 문자열 목록을 반환합니다.
예제
다음 예제에서는 LocalDate
타입에 대한 컨버터가 정의되어 값을 직렬화하고 역직렬화하도록 구성됩니다. encode
함수가 호출되면 서비스는 SimpleDateFormat
을 사용하여 값을 변환하고 형식이 지정된 값이 포함된 목록을 반환합니다. decode
함수가 호출되면 서비스는 날짜를 LocalDate
로 형식화하고 반환합니다.
install(DataConversion) {
convert<LocalDate> { // this: DelegatingConversionService
val formatter = DateTimeFormatterBuilder()
.appendValue(ChronoField.YEAR, 4, 4, SignStyle.NEVER)
.appendValue(ChronoField.MONTH_OF_YEAR, 2)
.appendValue(ChronoField.DAY_OF_MONTH, 2)
.toFormatter(Locale.ROOT)
decode { values -> // converter: (values: List<String>) -> Any?
LocalDate.from(formatter.parse(values.single()))
}
encode { value -> // converter: (value: Any?) -> List<String>
listOf(SimpleDateFormat.getInstance().format(value))
}
}
}
변환 서비스는 인코딩된 값과 디코딩된 값을 검색하기 위해 수동으로 호출될 수 있습니다:
val encodedDate = application.conversionService.toValues(call.parameters["date"])
val decodedDate = application.conversionService.fromValues(encodedDate, typeInfo<LocalDate>())
전체 예제는 data-conversion를(을) 참조하세요.