Releases

Ktor 2.3.0 릴리스

Read this post in other languages:

Ktor 2.3.0이 출시되었다는 기쁜 소식을 전해 드립니다. 이 업데이트에서는 Ktor 에코시스템에 수많은 개선과 더불어 새로운 기능을 제공합니다. 다음 섹션에는 이 릴리스의 주요 변경 사항에 대한 간략한 개요가 나와 있습니다.

코어 개선 사항

WebSockets ContentNegotiation 플러그인의 명시적 타입 지원

WebSocket ContentNegotiation 플러그인이 이제 명시적 타입 지정을 지원합니다.

client.webSocket("ws://localhost:8080/echo") {
    val originalData: Any = Data("hello")
    sendSerialized(originalData, typeInfo<Data>())
    val received = receiveDeserialized<Data>(typeInfo<Data>())

    assertEquals(originalData, received)
}

reified 매개변수가 사용 가능하지 않은 경우 유용할 수 있습니다.

소켓에 대한 구조화된 동시성 지원

이제 ktor-network의 소켓 구현은 CoroutineScope입니다. 즉, 연결을 즉시 종료하는 cancel() 작업을 지원합니다.

close()는 정상 종료로 계속 작동하며 대기 중인 모든 작업이 완료될 때까지 기다립니다.

JS 기존 구성 삭제

곧 출시될 Kotlin 1.9.0 릴리스에서는 기존 JS 컴파일러가 제거됩니다. Ktor 2.3.0부터 기존 컴파일러가 더 이상 지원되지 않습니다. 새로운 IR 컴파일러로의 마이그레이션을 고려해보시기 바랍니다.

서버

라우팅의 정규 표현식 지원

이제 Ktor는 경로를 정의할 때 정규 표현식의 사용을 허용합니다. 정규식 라우팅을 사용하면, 손쉽게 복잡한 루트를 일치시키고 루트 매개변수를 캡처할 수 있습니다.

routing {
    get(Regex("^(?&ltname&gt.+)$")) {
        val name = call.parameters["name"]
        call.respondText("Hello, $name!")
    }
}

작동 방식:

$ curl http://0.0.0.0:8081/Leonid
Hello, Leonid!

해당 문서에서 자세히 알아볼 수 있습니다.

Static Content API 정리

더욱 사용자 친화적인 환경을 위해 Static Content API가 개선되고 간소화되었습니다. 이번에는 가장 일반적인 사례에 중점을 두고 간단한 API를 만들었습니다.

routing {
    staticFiles("/static", File("files"))
}

/static 경로 아래의 files 디렉터리에서 모든 파일을 제공합니다.

그리고 다음 리소스의 파일을 제공할 수도 있습니다.

routing {
    staticResources("/static", "assets")
}

또한 기본 파일로 index.html을 제공하도록 구성하고 사전 압축(리소스용 포함), 캐싱 헤더, 콘텐츠 타입 탐지 등의 기능을 지원합니다.

Static Content API에 대해 자세히 알아보려면 해당 문서를 참조하세요.

이전 API는 계속 사용 가능하며 앞으로도 지원됩니다.

CIO에서 100 Continue 지원

이제 CIO 엔진이 100 Continue 상태를 지원합니다. 별도 설정 없이 바로 사용할 수 있으며 추가적인 구성이 필요하지 않습니다.

여러 구성 파일 지원

여러 파일 사용을 허용하므로 구성 관리가 단순화되었습니다. -config CLI 옵션을 사용하여 여러 구성 파일을 전달할 수 있습니다. 구성 파일은 로드된 후 순서대로 병합됩니다.

해당 문서에서 구성 파일에 대해 자세히 알아보세요.

Jetty 11 및 Tomcat 10 지원

주요 업데이트가 있는 Jetty 또는 Tomcat 종속성이 이미 포함된 프로젝트를 위해 Ktor 2.3.0은 Jetty 11 및 Tomcat 10 서버 구현 지원을 추가합니다. 이러한 구현은 별도의 종속성으로 제공됩니다.

dependencies {
    implementation("io.ktor:ktor-server-jetty-jakarta:2.3.0")
    implementation("io.ktor:ktor-server-tomcat-jakarta:2.3.0")
    implementation("io.ktor:ktor-server-servlet-jakarta:2.3.0")
}

새로운 버전을 사용해야 하는 경우 종속성을 jakarta 버전으로 변경하세요. 마이그레이션이 필요하지 않습니다.

클라이언트

Expect 헤더 및 100 Continue

이제 클라이언트가 Expect 헤더를 지원합니다. 이 헤더를 사용하려면 요청에 Expect 헤더를 추가하세요.

client.post("http://localhost:8080/upload") {
    header("Expect", "100-continue")
    body = "Hello, World!"
}

Logging 플러그인에서 민감한 헤더 삭제

이제 Logging 플러그인이 민감한 헤더 삭제를 지원합니다. 이는 sanitizeHeader 함수를 사용하여 구성할 수 있습니다.

val client = HttpClient {
    install(Logging) {
        sanitizeHeader("<secret>") { it == HttpHeaders.Authorization }
    }
}

이 구성은 모든 Authorization 헤더의 자리표시자로 헤더 값을 바꿉니다.

mingwx64 타깃에 대한 libcurl의 정적 연결

버전 관리를 단순화하기 위해 libcurl 라이브러리가 ktor-client-curl에 정적으로 연결되었습니다. 종속성을 사용하기 위해 더 이상 시스템에 libcurl을 설치할 필요가 없습니다.

Apache 5 및 Jetty 11 지원

새로운 버전의 Apache 및 Jetty가 별도의 종속성으로 추가되었습니다.

dependencies {
    implementation("io.ktor:ktor-client-jetty-jakarta:2.3.0")
    implementation("io.ktor:ktor-client-apache5:2.3.0")
}

새로운 버전을 사용해야 하는 경우 종속성을 적절히 변경하세요. 마이그레이션이 필요하지 않습니다.

새 프로젝트 마법사 및 샘플 업데이트

New Project Wizard(새 프로젝트 마법사)가 새로운 Exposed 및 Postgres 플러그인으로 업데이트되었으며, 새로운 샘플이 추가되어 더 편리해진 Ktor 경험을 도와줍니다.

전체 변경 사항 목록은 GitHub에서 확인할 수 있습니다.

기여자 여러분께 드리는 특별한 감사의 인사

Ktor 개선에 시간과 노력, 전문 지식을 쏟아주신 모든 기여자 여러분께 깊은 감사를 전합니다. chedabob, ay4toh5i, lkurcius, InsanusMokrassar, brianguertin, sproctor, nesk, Rattenkrieg, morki, pull-vert, Sebmaster 님께 특별한 감사의 인사를 드립니다.

사용해보기

Ktor 2.3.0의 개선 사항을 알아보고 소중한 의견을 전하실 수 있도록 초대합니다. Ktor를 처음 사용하는 경우 New Project Generator(새 프로젝트 제너레이터)를 사용하여 새로운 프로젝트를 만들 수 있습니다. 문제를 보고하거나 새로운 기능을 제안하려면 YouTrack을 방문하세요.

지속적인 지원에 감사드립니다!

게시물 원문 작성자

Jessie Cho

Leonid Stashevsky