[kotlin] Ktor Locations와 웹 소켓 통신

이번에는 Ktor의 Locations 기능과 웹 소켓을 이용하여 클라이언트와 서버 간의 통신을 구축하는 방법에 대해 알아보겠습니다.

Ktor Locations란?

Locations는 Ktor 프레임워크에서 URL 경로를 정의하고 파싱하여 쉽게 인코딩하고 디코딩할 수 있도록 도와주는 기능입니다. Locations를 사용하면 URL 경로를 명확히 정의하고, 요청의 파라미터를 쉽게 추출할 수 있습니다.

우선, Ktor 서버 프로젝트에서 Locations를 설정해보겠습니다.

import io.ktor.locations.*
import io.ktor.application.*
import io.ktor.http.ContentType
import io.ktor.http.content.*
import io.ktor.response.*
import io.ktor.routing.*

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

fun Application.main() {
    install(Locations)
    routing {
        get<UserLocation> { userLocation ->
            call.respondText("Requested user ID is ${userLocation.id}", ContentType.Text.Html)
        }
    }
}

위의 예제에서는 UserLocation을 사용하여 /user/{id} 경로를 정의하고 해당 경로로 요청이 들어오면 해당하는 유저의 ID 값을 응답으로 전달하고 있습니다.

웹 소켓을 이용한 통신

웹 소켓을 통해 클라이언트와 서버 간의 양방향 통신을 구축할 수 있습니다. Ktor는 WebSockets 모듈을 통해 이러한 웹 소켓 통신을 간편하게 구현할 수 있습니다.

서버에서의 간단한 웹 소켓 설정은 다음과 같이 작성할 수 있습니다.

import io.ktor.routing.*
import io.ktor.websocket.*
import io.ktor.http.cio.websocket.*
import java.time.Duration

fun Application.main() {
    install(WebSockets)
    routing {
        webSocket("/chat") {
            send("You are now connected")
            
            for (frame in incoming) {
                when (frame) {
                    is Frame.Text -> {
                        val receivedText = frame.readText()
                        // Handle received text
                    }
                }
            }
        }
    }
}

위의 예제에서 /chat 경로로 들어오는 웹 소켓 연결을 설정하고, 클라이언트로부터 메시지를 수신하여 처리하는 로직을 작성하고 있습니다.

이제 Locations와 웹 소켓을 함께 사용하여 URL 경로를 정의하고 해당 URL로 웹 소켓 연결을 처리하는 로직을 구현하는 방법에 대해 알아보겠습니다.

위의 UserLocation 예제와 웹 소켓 설정 예제를 함께 활용하여, /user/{id}/chat 경로로 들어오는 웹 소켓 연결을 처리하도록 구현할 수 있습니다.

routing {
    webSocket("/user/{id}/chat") {
        val userLocation = call.parameters.getOrFail("id")
        // Handle user ID and chat logic
    }
}

위와 같이 Locations를 통해 경로를 정의하고, 해당 경로로 웹 소켓 연결을 수립하여 클라이언트와 서버 간의 효과적인 통신을 구현할 수 있습니다.

Ktor의 Locations와 웹 솼켓을 함께 사용하여 클라이언트-서버 간의 효과적인 통신을 구현하는 방법에 대해 알아보았습니다.

더 자세한 내용은 Ktor 공식 문서를 참고하시기 바랍니다.