이번에는 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 공식 문서를 참고하시기 바랍니다.