Ktor의 Hello World

왜 Ktor를 시도하려고 생각했는가?



최근 Kotlin 고조되고 있다고 생각해, 늦어지면서 Kotlin 스타트북을 읽고 있던 때에, JetBrains 근제 웹 프레임워크인 Ktor의 Version 1.0. 0이 릴리스되었다고 하는 뉴스를 보았습니다.
이전부터 백엔드 프레임 워크를 공부하고 싶었으며 Node.js, Flask, Beego 등에서 검토했습니다. Node.js와 헤매었습니다만, Java의 경험이 있다고 하는 것, Kotlin의 편리한 것 같은 문법을 시험해 보고 싶은 것으로부터, 먼저 Ktor를 접해 보기로 했습니다.

Ktor는?



Kotlin 개발자인 JetBrains가 개발한 웹 프레임워크에서 케이터와 읽습니다. Easy to use, fun and asynchronous.

목적



모처럼이므로 JSON에서 "Hello World"를 반환하는 API를 만들어 보겠습니다.

개발 및 언어 환경



OS
macOS Mojave 10.14.1
IDE
IntelliJ IDEA Community Edition 2018.3

Kotlin
1.3.10
Ktor
1.0.0

IDE에 대해서는 Visual Studio Code와 헤매었습니다만, 빌드가 조금 번거로울 것 같은 것, 플러그인이 아직 발전 도상에 생각된 적도 있어, IntelliJ IDEA로 했습니다.

Let's Hello World!



Ktor 플러그인 설치



Marketplace에서 설치합니다.


프로젝트 만들기



Ktor 플러그인을 설치했으므로 프로젝트 형식에 Ktor가 추가되었습니다. 빌드 시스템은 Gradle이지만 개발 서버 엔진은 Netty가 기본적으로 선택되어 있습니다. 이번에는 기본값으로 진행합니다.


프로젝트 구성 파일 확인



application.conf
ktor {
    deployment {
        port = 8080
        port = ${?PORT}
    }
    application {
        modules = [ com.example.ApplicationKt.module ]
    }
}

어플리케이션의 각종 설정은 application.conf에 쓰는 것 같습니다. 프로젝트 작성 직후에는 8080 포트에서 청취하는 설정과, 후술하는 Application.module 함수로 지정한 기능을, 서버 기동시에 로드하는 설정이 쓰여져 있습니다.

Application.kt
fun main(args: Array<String>): Unit = io.ktor.server.netty.EngineMain.main(args)

@Suppress("unused") // Referenced in application.conf
@kotlin.jvm.JvmOverloads
fun Application.module(testing: Boolean = false) {
}

main 함수의 io.ktor.server.netty.EngineMain.main(args)는 개발 용 Netty 서버 엔진을 시작합니다. 또한 fun Application.module(testing: Boolean = false) {}는 응용 프로그램에서 사용할 기능을 지정합니다.

Routing 기능 추가



즉시 Routing 기능을 추가하고 먼저 Text를 반환합니다.

Application.kt
fun Application.module(testing: Boolean = false) {
    routing {
        get("/HelloWorld") {
            call.respondText("Hello World!")
        }
    }
}

기본적으로 제공되는 build config : com.example.AppicationKt로 빌드하고 실행하면 서버가 시작됩니다.

요청해 보겠습니다.

문제 없을 것 같습니다! 쉽네요

JSON으로 반환



Ktor의 Content Negotiation 기능과 JSON library의 Jackson을 사용하여 구현해 보겠습니다.

Application.kt
fun Application.module(testing: Boolean = false) {
    install(ContentNegotiation) {
        jackson {
            enable(SerializationFeature.INDENT_OUTPUT)
        }
    }
    routing {
        get("/HelloWorld") {
            call.respond(mapOf("Hello" to "World!"))
        }
    }
}

Routing 기능과 달리 install(ContentNegotiation)입니다. Routing 기능은 routing DSL 블록을 사용하면 자동으로 설치되므로 명시적인 설치가 필요하지 않습니다. 다시 요청해 보겠습니다.

완료

소감



다른 프레임 워크에 대해 자세하지 않기 때문에 비교는 할 수 없습니다만, 이만큼 간단하게 쓸 수 있다면, 도메인 로직 등의 코어인 부분에 집중할 수 있어 좋다고 생각했습니다(프레임워크는 그러한 것입니까?라고 말해져 그렇습니다 ). 공식 문서도 충실하기 때문에 기본적인 일을하는 분은 곤란하지 않을 것 같습니다. 판매인 비동기 처리도 시도하고 싶기 때문에 다음은 WebSocket을 사용한 간단한 앱을 만들어 보려고합니다.

참고 사이트



  • k와 r. 이오
  • 빠른 시작 - HTTP API
  • 서버 - 애플리케이션
  • 서버 - 구성
  • Servers - Features - Content Negotiation

  • 좋은 웹페이지 즐겨찾기