본문 바로가기
Kotlin/Release Notes

[Kotlin Release Notes] Ktor 1.3 Release

by 노력남자 2023. 9. 8.
반응형

2020년 1월 29일

 

Ktor 1.3가 최근에 릴리스되었으며, 이 블로그 포스트에서 자세한 내용을 공유하고자 합니다.

Ktor는 서버 엔진과 유연한 비동기 HTTP 클라이언트로 구성됩니다. 현재 릴리스는 주로 HTTP 클라이언트에 중점을 두고 있습니다. 여기에서는 이 릴리스에 대한 완전한 변경 로그를 찾을 수 있습니다.

클라이언트는 JVM, JS, Android 및 iOS를 지원하는 멀티플랫폼 라이브러리로, 이제 크로스 플랫폼 모바일 애플리케이션에서 자주 사용됩니다. 다음 릴리스에서의 주요 목표는 서버 엔진을 멀티플랫폼으로 만드는 것입니다.

우리가 작업할 다른 분야는 다음과 같습니다:

 

  • kotlinx.serialization 라이브러리와의 통합 향상.
  • Kotlin/Native에서 CIO(코루틴 기반 I/O 클라이언트 엔진)를 지원하여 HttpClient에서 기본 멀티플랫폼 엔진으로 만들기.
    현재 Ktor를 사용하거나 이전에 서버 또는 HttpClient를 사용한 적이 있다면 다음 설문조사에 참여해 주십시오:


설문조사 참여


우리와의 경험을 공유해 주시면 정말 감사하겠습니다!

이제 Ktor 1.3 릴리스에서 무엇이 변경되었는지 자세히 살펴보겠습니다.


HttpClient


HttpStatement 소개


이전 Ktor 버전에서 HttpResponse를 명시적으로 닫아야 했습니다. 그러나 이것은 종종 혼란의 원인이었습니다. HttpResponse를 닫는 것을 잊어버린 경우가 많았고, 심지어 간단한 예제에서도 메모리 누수가 발생했습니다. 이 상황을 개선하기 위해 Ktor 1.3에서 호환되지 않는 변경 사항을 소개합니다: HttpResponse는 더 이상 Closeable 인터페이스를 구현하지 않습니다. 따라서 1.3.0 Ktor 릴리스는 이전 버전 Ktor 1.2.X와 호환되지 않습니다.

HttpResponse는 기본적으로 메모리 상에 있으며 더 이상 닫을 필요가 없습니다:

 

fun main(): Unit = runBlocking {
    val client = HttpClient()
    val url = "http://kotlinlang.org/"
    val response = client.get(url)
    val text = response.readText()
    println(text)
    // 더 이상 response를 '닫을' 필요가 없음
}

 

스트리밍 또는 큰 응답을 처리해야 하는 경우 새로운 HttpStatement 클래스를 사용합니다. HttpStatement는 명시적으로 execute 메서드를 호출할 때까지 네트워크 요청을 수행하지 않습니다:

 

val statement = client.request("$TEST_SERVER/content/stream")
// ...
statement.execute { response: HttpResponse ->
    // 응답 처리
}

 

예를 들어, 데이터를 청크 단위로 읽을 수 있습니다:

 

client.get(url).execute { response ->
    val channel = response.receive()
    while (!channel.isClosedForRead) {
        val packet = channel.readRemaining(size)
        println(packet.readText())
    }
}

 

프록시 구성


HttpClient에는 프록시를 실험적으로 지원하는 기능이 추가되었습니다. 프록시를 통해 요청을 보내야 하는 경우 해당 매개변수에서 프록시 주소를 구성할 수 있습니다:

 

HttpClient {
    engine {
        proxy = ProxyBuilder.http("http://proxy-host:3128")
    }
}


플랫폼 제약 때문에 JVM 및 네이티브 대상 (WatchOS 제외)에서만 지원되며 JavaScript에서는 지원되지 않습니다. 다른 플랫폼에 대한 구성 방법에 대한 자세한 내용은 여기에서 확인할 수 있습니다.


iOS 엔진에서 NSURLSession 사용


iOS 엔진은 이제 NSURLSession을 구성할 수 있는 방법을 제공합니다:

 

HttpClient(Ios) {
    engine {
        configureSession {
            networkServiceType = NSURLNetworkServiceTypeBackground
        }
    }
}


NSURLSession은 iOS에서 HTTP / HTTPS 프로토콜과 상호 작용하는 기본 API이므로 iOS 관련 설정을 조정하는 데 사용할 수 있습니다.


JSON 작업 개선


다음 변경 사항은 HttpClient와 서버 양쪽에서 지원되며 현재 실험 상태입니다.


JSON에서 컬렉션 직렬화 단순화


이전 Ktor 버전에서는 컬렉션을 직렬화하기 위해 보조 유형을 등록해야 했습니다. 이제 이 프로세스가 단순화되었습니다. JsonFeature는 추가 구성 없이 컬렉션 유형을 처리합니다. 그리고 setMapper, setListMapper, register와 관련된 모든 함수가 더 이상 사용되지 않습니다.

JsonFeature에서 List<User>를 더 이상 등록할 필요가 없습니다:

 

install(JsonFeature)
// ...
val list = client.get<List>("https://example/json/users")


서버에서 JSON 작업 시 이와 같이 컨텐츠를 수신할 때 예상되는 제네릭 인수를 사용하여 컬렉션 유형을 지정할 수 있습니다:

 

install(ContentNegotiation) {
    register(ContentType.Application.Json, SerializationConverter())
}
​
routing {
    post("/entity") {
        val receivedList = call.receive<List<User>>()
        // 리스트 처리
    }
}


kotlinx.serialization DSL


Ktor는 이제 kotlinx.serialization DSL을 사용하여 JSON 본문을 구성하는 방법을 지원합니다:

 

client.post("http://localhost:9090") {
    contentType(ContentType.Application.Json)
    body = json {
        "key1" to 123
        "map" to json {
            "key2" to "abc"
        }
    }
}


클라이언트에서 사용하려면 JsonFeature를 설치하고 ktor-client-serialization 종속성을 추가하십시오. 서버에서는 SerializationConverter를 사용하십시오.

마이그레이션 단계


Ktor 애플리케이션을 새 버전으로 마이그레이션하려면 다음 단계를 수행해야 합니다:

  • HttpResponse를 사용하는 모든 사용법을 업데이트하십시오: 단순히 close 호출을 제거하고 필요한 경우 HttpStatement를 사용하십시오.
  • import를 업데이트하십시오. kotlinx.io 종속성이 제거되었으므로 다음과 같이 import를 대체해야 합니다:
    • import kotlinx.io. -> import io.ktor.utils.io.
    • import kotlinx.coroutines.io. -> import io.ktor.utils.io.

 

1.2.x와의 이진 호환성은 없으므로 외부 Ktor 기능을 사용하는 경우 최신 버전에 대해 다시 컴파일해야 합니다. 또한 5.4.1+ Gradle 메타데이터 버전을 사용하는지 확인하십시오.

 

이 글을 읽어 주셔서 감사합니다. 설문조사 참여를 잊지 마세요!

설문조사 참여

 

원문

 

https://blog.jetbrains.com/kotlin/2020/01/ktor-1-3-release/

반응형

댓글