프레임워크(Framework)/Ktor

[Ktor] Ktor Framework란? - Ktor 소개 및 프로젝트 생성하기

잇트루 2023. 6. 28. 01:26
반응형

Ktor

Ktor 프레임워크는 Kotlin과 IntelliJ IDEA 개발한 것으로 유명한 JetBrains에서 개발한 연결된 애플리케이션(Connected application)을 쉽게 구축할 수 있는 프레임워크이다. 개발자들 사이에서는 케이터 또는 크토르 등으로 불리고 있다.
 
Ktor 프레임워크의 특징

  • 코틀린을 주 언어로 개발된 프레임워크다. 코틀린은 null 안전성, 확장 함수 등 여러 최신 언어 기능을 제공한다.
  • 연결된 애플리케이션(Connected applications)을 쉽게 구축할 수 있는 프레임워크로 웹 애플리케이션, HTTP 서비스, 모바일 및 웹 애플리케이션 등 유연하게 사용할 수 있다.
  • 고성능을 위해 설계되어 비동기(Asynchronous) 아키텍처로 수많은 동시 연결을 효율적으로 처리할 수 있다.

 
Ktor 프레임워크의 단점

  • Spring Boot와 같은 기존 프레임워크에 비해 라이브러리와 리소스가 적다.
  • 상대적으로 최근에 등장한 프레임워크로 일부 기능과 예시가 부족하다.

 
 

프로젝트 생성하기

Ktor는 Spring Initializr와 같이 프로젝트 생성을 위한 Ktor Generate 페이지를 제공하고 있으며, IntelliJ IDEA Ultimate를 사용하면 Ktor 플러그인을 지원하여 바로 생성할 수도 있다.
 
Ktor Generator
https://start.ktor.io/

Generate Ktor project

start.ktor.io

 
IntelliJ IDEA Ultimate

  • Project Name : 생성할 프로젝트의 이름을 지정한다.
  • Build system : Gradle Kotlin, Gradle Groovy, Maven 등의 빌드 도구를 선택한다.
  • Website : 패키지 이름을 생성하는 데 사용하는 도메인을 지정한다.
  • Artifact : 생성된 프로젝트의 구조를 보여준다.
  • Engine : 서버를 구동할 엔진을 선택한다. 기본적으로 Netty로 설정되어 있으며, Jetty, CIO, Tomcat 등을 선택할 수 있다.
  • Configuration in : 프로젝트의 환경 변수, 서버 설정 방식을 지정한다. yml, HOCON, Code 등을 선택할 수 있다.
  • Add sample code : 체크 시 추가할 플러그인에 대한 샘플 코드를 제공한다.

 
Add Plugin

  • Ktor에서 지원하는 인증, 직렬화, 라우팅 등의 플러그인을 목적에 맞게 선택하여 추가할 수 있다.
  • Routing은 서버의 요청을 처리하기 위한 Ktor의 핵심 기능이다. 이 외의 플러그인은 애플리케이션 목적에 알맞게 추가하여 설정한다.
  • Ktor Generator에서 프로젝트를 설정한 경우 Generate project를 클릭하여 프로젝트의 압축 파일을 다운로드할 수 있다.
  • IntelliJ IDEA에서 프로젝트를 설정한 경우 Create를 클릭하여 프로젝트를 생성할 수 있다.

 
 

Ktor 프로젝트 패키지 구조

  • 스프링 프로젝트와 상당히 유사한 패키지 구조를 구성하고 있다.
  • build.gradle.kts는 스프링의 gradle 프로젝트와 같은 역할을 한다.

 
 

Ktor 프로젝트 분석

gradle.properties

ktor_version=2.3.1
kotlin_version=1.8.22
logback_version=1.2.11
kotlin.code.style=official
  • build.gradle.kts에서 사용할 의존 라이브러리에 대한 버전이 작성되어 있다.
  • 위 설정을 build.gradle.kts에서 선언하여 의존 라이브러리에 대한 버전을 지정할 수 있다.

 

build.gradle.kts

val ktor_version: String by project
val kotlin_version: String by project
val logback_version: String by project

plugins {
    kotlin("jvm") version "1.8.22"
    id("io.ktor.plugin") version "2.3.1"
}

group = "com.example"
version = "0.0.1"
application {
    mainClass.set("io.ktor.server.netty.EngineMain")

    val isDevelopment: Boolean = project.ext.has("development")
    applicationDefaultJvmArgs = listOf("-Dio.ktor.development=$isDevelopment")
}

repositories {
    mavenCentral()
}

dependencies {
    implementation("io.ktor:ktor-server-core-jvm:$ktor_version")
    implementation("io.ktor:ktor-server-netty-jvm:$ktor_version")
    implementation("ch.qos.logback:logback-classic:$logback_version")
    implementation("io.ktor:ktor-server-config-yaml:$ktor_version")
    testImplementation("io.ktor:ktor-server-tests-jvm:$ktor_version")
    testImplementation("org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version")
}
  • dependencies에는 Ktor에서 기본적으로 제공하는 라이브러리와 add plugin에서 추가한 라이브러리들이 추가된다.

 

Application.kt

애플리케이션을 구동하기 위한 메인 메서드가 존재하는 코틀린 application 파일이다.

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

@Suppress("unused")
fun Application.module() {
    configureRouting()
}

 

application.yml

프로젝트 생성 시 Configuration in에서 YMAL을 지정하여 기본 설정이 yml 파일로 작성되어 있다.

ktor:
    application:
        modules:
            - com.example.ApplicationKt.module
    deployment:
        port: 8080
  • Code로 지정하여 프로젝트를 생성하면 Application.kt의 main 함수에 설정되어 있을 것이다.

 
 

샘플코드

Routing.kt

import io.ktor.server.application.*
import io.ktor.server.response.*
import io.ktor.server.routing.*

fun Application.configureRouting() {
    routing {
        get("/") {
            call.respondText("Hello World!")
        }
    }
}
  • 간단한 서버의 요청에 대해 응답을 확인하기 위한 샘플 코드다.
  • 만약, Add sample code를 체크하여 다른 플러그인을 추가하였다면 다른 샘플 코드도 제공될 것이다.

 
 

프로젝트 실행 테스트

  • main 메서드를 실행하여 애플리케이션을 실행할 수 있다.
2023-06-27 16:00:52.872 [main] INFO  Application - Autoreload is disabled because the development mode is off.
2023-06-27 16:00:53.412 [main] INFO  Application - Application started in 0.602 seconds.
2023-06-27 16:00:53.799 [DefaultDispatcher-worker-1] INFO  Application - Responding at <http://127.0.0.1:8080>

 
웹 브라우저에서 localhost:8080에 접속하여 확인해 보자.

반응형