Skip to content
Server Plugin

데이터 변환

코드 예제: data-conversion

필수 의존성: io.ktor:ktor-server-data-conversion

네이티브 서버
Ktor는 Kotlin/Native를 지원하며 추가 런타임이나 가상 머신 없이 서버를 실행할 수 있게 합니다.
지원: ✅

DataConversion 플러그인은 값 목록을 직렬화하고 역직렬화할 수 있도록 합니다. 기본적으로 Ktor는 DefaultConversionService를 통해 기본 타입(primitive type)과 열거형(enum)을 처리합니다. DataConversion 플러그인을 설치하고 구성하여 이 서비스를 확장하여 추가 타입을 처리할 수 있습니다.

의존성 추가

DataConversion을(를) 사용하려면 빌드 스크립트에 ktor-server-data-conversion 아티팩트를 포함해야 합니다:

Kotlin
Groovy
XML

DataConversion 설치

애플리케이션에 DataConversion 플러그인을 설치하려면, 지정된

모듈
모듈은 라우트(route)를 그룹화하여 애플리케이션을 구조화할 수 있게 합니다.
install 함수에 전달하세요. 아래 코드 스니펫은 DataConversion을(를) 설치하는 방법을 보여줍니다...

  • ... embeddedServer 함수 호출 내에서.
  • ... Application 클래스의 확장 함수인 명시적으로 정의된 module 내에서.
kotlin
kotlin

컨버터 추가

DataConversion 구성 내에서 타입 변환을 정의할 수 있습니다. 지정된 타입에 대해 convert<T> 메서드를 제공하고 사용 가능한 함수를 사용하여 값 목록을 직렬화하고 역직렬화하세요:

  • 값 목록을 역직렬화하려면 decode() 함수를 사용하세요. 이 함수는 URL에 반복되는 값을 나타내는 문자열 목록을 받고 디코딩된 값을 반환합니다.
kotlin
decode { values -> // converter: (values: List<String>) -> Any?
  //deserialize values
}
  • 값을 직렬화하려면 encode() 함수를 사용하세요. 이 함수는 임의의 값을 받고 그것을 나타내는 문자열 목록을 반환합니다.
kotlin
   encode { value -> // converter: (value: Any?) -> List<String>
     //serialize value
    }

서비스 접근

현재 컨텍스트에서 DataConversion 서비스에 접근할 수 있습니다:

kotlin
val dataConversion = application.conversionService

그런 다음 컨버터 서비스를 사용하여 콜백 함수를 호출할 수 있습니다:

  • fromValues(values: List<String>, type: TypeInfo) 콜백 함수는 values를 문자열 목록으로, 그리고 값을 변환할 TypeInfo를 인자로 받아 디코딩된 값을 반환합니다.
  • toValues(value: Any?) 콜백 함수는 임의의 값을 인자로 받아 그것을 나타내는 문자열 목록을 반환합니다.

예제

다음 예제에서는 LocalDate 타입에 대한 컨버터가 정의되어 값을 직렬화하고 역직렬화하도록 구성됩니다. encode 함수가 호출되면 서비스는 SimpleDateFormat을 사용하여 값을 변환하고 형식이 지정된 값이 포함된 목록을 반환합니다. decode 함수가 호출되면 서비스는 날짜를 LocalDate로 형식화하고 반환합니다.

kotlin
    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))
            }
        }
    }

변환 서비스는 인코딩된 값과 디코딩된 값을 검색하기 위해 수동으로 호출될 수 있습니다:

kotlin
val encodedDate = application.conversionService.toValues(call.parameters["date"])
val decodedDate = application.conversionService.fromValues(encodedDate, typeInfo<LocalDate>())

전체 예제는 data-conversion를(을) 참조하세요.