최근에는 코틀린이 서버 사이드 개발에서 많이 사용되고 있으며, 프론트엔드와의 상호작용이 필요한 경우가 많습니다. 이번 블로그에서는 코틀린을 사용하여 프론트엔드와의 상호작용을 구현하는 방법에 대해 알아보겠습니다.
WebSocket을 이용한 양방향 통신 구현
웹 소켓(WebSocket)은 서버와 클라이언트 간의 양방향 통신을 가능하게 하는 프로토콜입니다. 코틀린 서버에서 WebSocket을 이용하여 프론트엔드와의 실시간 상호작용을 구현할 수 있습니다.
import io.ktor.http.cio.websocket.*
import kotlinx.coroutines.channels.SendChannel
import kotlinx.coroutines.channels.actor
import kotlinx.coroutines.channels.consumeEach
import kotlinx.coroutines.launch
import kotlinx.html.*
import kotlinx.html.stream.*
import java.time.*
suspend fun DefaultWebSocketServerSession.handle(frontendChannel: SendChannel<String>) {
frontendChannel.actor {
consumeEach { message ->
send(Frame.Text(message))
}
}
for (frame in incoming) {
frame as? Frame.Text ?: continue
frontendChannel.send(frame.readText())
}
}
위 코드는 Ktor 프레임워크와 kotlinx.html을 사용하여 WebSocket을 구현한 예시입니다. 이를 통해 서버와 클라이언트 간의 실시간 양방향 통신이 가능해집니다.
RESTful API를 통한 데이터 교환
또 다른 방법으로는 RESTful API를 통해 데이터를 교환하는 것입니다. 코틀린 서버에서 REST API를 구현하고, 프론트엔드에서 HTTP 요청을 통해 데이터를 주고받을 수 있습니다.
import io.ktor.application.*
import io.ktor.http.*
import io.ktor.response.*
import io.ktor.routing.*
fun Application.main() {
routing {
get("/api/data") {
call.respondText("This is the data from the server.", ContentType.Text.Plain)
}
}
}
위 코드는 Ktor 프레임워크를 사용하여 간단한 RESTful API를 구현하는 예시입니다. 클라이언트 측에서 HTTP GET 요청을 보내면, 서버는 해당 데이터를 응답으로 보내줍니다.
GraphQL을 이용한 유연한 데이터 요청
GraphQL은 데이터를 효율적으로 요청하고 응답받을 수 있는 쿼리 언어입니다. 코틀린 서버에서 GraphQL을 이용하여 프론트엔드와의 데이터 요청을 다룰 수 있습니다.
import com.expediagroup.graphql.server.execution.GraphQLContext
import com.expediagroup.graphql.server.execution.GraphQLRequestHandler
import com.expediagroup.graphql.server.execution.GraphQLRequestParser
import com.expediagroup.graphql.server.execution.GraphQLRequestParserKtor
import com.expediagroup.graphql.server.types.GraphQLRequest
import com.expediagroup.graphql.server.types.GraphQLResponse
import io.ktor.application.*
import io.ktor.request.*
import io.ktor.response.*
import io.ktor.routing.*
import io.ktor.server.engine.*
import io.ktor.server.netty.*
fun main() {
val requestParser: GraphQLRequestParser = GraphQLRequestParserKtor()
val requestHandler: GraphQLRequestHandler = MyGraphQLRequestHandler()
embeddedServer(Netty, port = 8080, module = {
routing {
post("/graphql") {
val request = call.receive<GraphQLRequest>()
val response = requestHandler.handleRequest(request, GraphQLContext(), requestParser)
call.respond(response)
}
}
}).start(wait = true)
}
class MyGraphQLRequestHandler : GraphQLRequestHandler {
override suspend fun handleRequest(
request: GraphQLRequest,
requestContext: GraphQLContext,
requestParser: GraphQLRequestParser
): GraphQLResponse {
// Handle the GraphQL request and return the response
}
}
위 코드는 Ktor 프레임워크와 com.expediagroup.graphql
라이브러리를 사용하여 GraphQL 서버를 구현하는 예시입니다.
결론
코틀린을 사용하여 서버 사이드 개발을 할 때, 프론트엔드와의 상호작용을 위한 다양한 방법을 살펴보았습니다. WebSocket, RESTful API, 그리고 GraphQL을 이용하여 서버와 클라이언트 간의 효율적인 통신을 구현할 수 있습니다. 이러한 방법을 활용하여 보다 유연하고 효율적인 서버-클라이언트 통신을 구현할 수 있을 것입니다.
참고 문헌:
- https://ktor.io/docs/websockets.html
- https://ktor.io/docs/http.html
- https://expediagroup.github.io/graphql-kotlin/docs/server/getting-started.html
- https://www.apollographql.com/docs/graphql-tools/graphql-tools-getting-started/