[kotlin] 코틀린으로 웹소켓 서버 개발하기

이번 블로그 포스트에서는 코틀린을 사용하여 간단한 웹소켓 서버를 개발하는 방법에 대해 알아보겠습니다.

웹소켓 서버란?

웹소켓은 클라이언트와 서버 간의 양방향 통신을 지원하는 프로토콜입니다. 웹 소켓을 이용하면 실시간으로 데이터를 주고받을 수 있어, 실시간 채팅 애플리케이션 등에 많이 사용됩니다.

코틀린으로 웹소켓 서버 구축하기

코틀린을 사용하여 웹소켓 서버를 구축하려면 kotlinx.coroutineskotlinx.serialization에 대한 의존성을 추가해야 합니다.

dependencies {
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2")
    implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.0")
}

웹소켓 서버를 구현하기 위해서는 kotlinx.coroutines에서 제공하는 WebSocketServer 클래스를 사용할 수 있습니다. 한편, 데이터를 JSON 형식으로 주고받기 위해 kotlinx.serialization 라이브러리를 사용할 수 있습니다.

아래는 코틀린을 사용하여 간단히 웹소켓 서버를 구현한 예시입니다.

import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.channels.ReceiveChannel
import kotlinx.coroutines.channels.SendChannel
import kotlinx.coroutines.runBlocking
import kotlinx.serialization.Serializable
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonConfiguration
import kotlinx.serialization.json.buildJsonObject
import kotlinx.serialization.json.put
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.content
import kotlin.random.Random
import kotlinx.coroutines.channels.actor

@Serializable
data class Message(val type: String, val content: String)

@OptIn(ExperimentalCoroutinesApi::class)
fun main() = runBlocking {
    val server = WebSocketServer(8080)

    server.start { incoming, outgoing ->
        val actor = actor<ReceiveChannel<String>> {
            for (msg in incoming) {
                val json = Json(JsonConfiguration.Stable)
                val message = json.decodeFromString<Message>(msg)

                // process message
                val response = buildJsonObject {
                    put("type", "echo")
                    put("content", message.content)
                }

                outgoing.send(json.encodeToString(response))
            }
        }

        try {
            while (true) actor.send(incoming.receive())
        } finally {
            actor.close()
        }
    }
}

위의 코드는 코틀린을 사용하여 웹소켓 서버를 구축하는 기본적인 예시입니다. kotlinx.coroutineskotlinx.serialization을 이용하여 JSON 형식의 데이터를 주고받는 기능을 구현하였습니다.

마치며

이번 포스트에서는 코틀린을 사용하여 간단한 웹소켓 서버를 구현하는 방법에 대해 알아보았습니다. 코틀린의 강력한 기능을 활용하여 다양한 웹소켓 기반 애플리케이션을 개발할 수 있다는 점을 기억해두시기 바랍니다.