[kotlin] Ktor Locations와 세션 관리

Kotlin 기반의 웹 애플리케이션을 개발하다 보면 사용자의 요청을 처리하는 과정에서 URL 경로의 파라미터 값을 추출하거나 세션을 관리해야할 때가 있습니다. Ktor는 이러한 기능을 위해 LocationsSessions 모듈을 제공합니다.

Ktor Locations

Locations 모듈을 사용하면 URL 경로에서 파라미터 값을 추출하거나 RESTful API의 경로를 정의할 수 있습니다. 예를 들어, /users/{id}와 같은 경로에서 id 값을 추출하거나, /items/{itemId}/comments/{commentId}와 같은 복잡한 경로를 정의할 수 있습니다.

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

@Location("/users/{id}")
data class UserLocation(val id: Int)

fun Application.main() {
    install(Locations)
    routing {
        get<UserLocation> { location ->
            call.respondText("User ID: ${location.id}")
        }
    }
}

@Location 어노테이션을 사용하여 Location 클래스를 정의하고, 해당 클래스를 라우팅 설정에서 사용하여 해당 경로에 대한 처리를 정의할 수 있습니다.

Ktor 세션 관리

Ktor는 기본적으로 세션을 관리하기 위한 Sessions 모듈을 제공합니다. 이를 사용하면 클라이언트의 세션을 추적하고 상태를 유지할 수 있습니다.

import io.ktor.sessions.*
import io.ktor.application.*
import io.ktor.response.*
import io.ktor.request.*
import io.ktor.routing.*
import io.ktor.http.*

data class Session(val username: String)

fun Application.main() {
    install(Sessions) {
        cookie<Session>("SESSION") {
            cookie.path = "/"
        }
    }

    routing {
        get("/login") {
            call.sessions.set(Session("user123"))
            call.respondText("Logged in")
        }

        get("/user") {
            val session = call.sessions.get<Session>()
            if (session != null) {
                call.respondText("Logged in as ${session.username}")
            } else {
                call.respondText("Not logged in", status=HttpStatusCode.Unauthorized)
            }
        }
    }
}

위의 예제에서는 Sessions 모듈을 설치하고, Session 클래스를 정의하여 사용자의 세션 정보를 저장합니다. 로그인 요청(/login)에서 세션을 설정하고, 사용자 정보 요청(/user)에서 해당 세션을 가져와 사용자를 인증하는 예제를 보여줍니다.

Ktor Locations와 Sessions 모듈을 사용하여 Kotlin 기반의 웹 애플리케이션을 보다 효율적으로 개발할 수 있습니다.

참고 자료