Kotlin Simple Web Server (Ktor 활용)
28 Dec 2019 | Kotlin ktorbuild.gradle
group 'com.snowdeer'
version '1.0-SNAPSHOT'
buildscript {
ext.kotlin_version = '1.3.61'
ext.ktor_version = '1.2.6'
repositories {
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
apply plugin: 'java'
apply plugin: 'kotlin'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
compile "io.ktor:ktor-server-netty:$ktor_version"
testCompile group: 'junit', name: 'junit', version: '4.12'
}
compileKotlin {
kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
kotlinOptions.jvmTarget = "1.8"
}
kotlin {
experimental {
coroutines "enable"
}
}
BlogApp.kt
package com.snowdeer
import io.ktor.application.*
import io.ktor.http.*
import io.ktor.response.*
import io.ktor.routing.*
import io.ktor.server.engine.*
import io.ktor.server.netty.*
fun main(args: Array<String>) {
embeddedServer(Netty, 8080) {
routing {
get("/") {
call.respondText("SnowDeer's Blog", ContentType.Text.Html)
}
}
}.start(wait = true)
}
Application 모듈을 활용한 BlogApp.kt
package com.snowdeer
import io.ktor.application.*
import io.ktor.features.*
import io.ktor.http.*
import io.ktor.response.*
import io.ktor.routing.*
import io.ktor.server.engine.*
import io.ktor.server.netty.*
fun Application.module() {
install(DefaultHeaders)
install(CallLogging)
install(Routing) {
get("/") {
call.respondText("SnowDeer Blog2", ContentType.Text.Html)
}
}
}
fun main(args: Array<String>) {
embeddedServer(Netty, 8080, watchPaths = listOf("BlogAppKt"), module = Application::module).start()
}
application.conf 사용해서 환경 변수 분리하기
main/resources/ 디렉토리 아래에 application.conf에 파일을 만들고 다음 내용을 작성합니다.
ktor {
deployment {
port = 8070
}
application {
modules = [ com.snowdeer.BlogAppKt.main ]
}
}
적용 확인을 위해서 포트 번호를 8070으로 했습니다.
그 이후 BlogApp.kt 파일은 다음과 같이 변경해줍니다.
package com.snowdeer
import io.ktor.application.*
import io.ktor.features.*
import io.ktor.http.*
import io.ktor.response.*
import io.ktor.routing.*
fun Application.main() {
install(DefaultHeaders)
install(CallLogging)
install(Routing) {
get("/") {
call.respondText("SnowDeer Blog2", ContentType.Text.Html)
}
}
}
기존 코드에서 main 전역 메소드가 사라졌고, fun Application.module() 메소드가 fun Application.main()로 변경되었습니다.
또한 build.gradle에 다음 내용을 추가합니다.
apply plugin: 'application' mainClassName = "com.snowdeer.BlogAppKt"
마지막으로 IntelliJ IDE에서 Run -> Edit Configurations 메뉴로 가서
Main Class를 io.ktor.server.netty.EngineMain으로 해주고 실행하면 위에서 작성한 application.conf 환경 변수가
적용되어 실행되는 것을 확인할 수 있습니다.