Skip to content
Server Plugin

데이터 변환

코드 예제: data-conversion

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

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

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

의존성 추가

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

Kotlin
Groovy
XML

DataConversion 설치

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

모듈
모듈을 사용하면 경로를 그룹화하여 애플리케이션 구조를 잡을 수 있습니다.
install 함수에 이를 전달하세요. 아래 코드 스니펫은 DataConversion을(를) 설치하는 방법을 보여줍니다...

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

컨버터 추가

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

  • 값 목록을 역직렬화하려면 decode() 함수를 사용하세요. 이 함수는 URL의 반복된 값을 나타내는 문자열 목록을 인자로 받아 디코딩된 값을 반환합니다.

    kotlin
    decode { values -> // 컨버터: (values: List<String>) -> Any?
      //값 역직렬화
    }
  • 값을 직렬화하려면 encode() 함수를 사용하세요. 이 함수는 임의의 값을 인자로 받아 이를 나타내는 문자열 목록을 반환합니다.

    kotlin
       encode { value -> // 컨버터: (value: Any?) -> List<String>
         //값 직렬화
        }

서비스 접근하기

현재 컨텍스트에서 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 -> // 컨버터: (values: List<String>) -> Any?
                LocalDate.from(formatter.parse(values.single()))
            }

            encode { value -> // 컨버터: (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에서 확인할 수 있습니다.