Ktor 서버의 WebSockets 직렬화
ContentNegotiation 플러그인과 마찬가지로, WebSockets를 사용하면 특정 형식으로 텍스트 프레임을 직렬화/역직렬화(serialize/deserialize)할 수 있습니다. Ktor는 JSON, XML, CBOR, ProtoBuf 형식을 기본적으로 지원합니다.
의존성 추가하기
kotlinx.serialization 컨버터를 사용하기 전에, 설정(Setup) 섹션의 설명에 따라 Kotlin 직렬화 플러그인을 추가해야 합니다.
JSON
JSON 데이터를 직렬화/역직렬화하려면 kotlinx.serialization, Gson, Jackson 중 하나를 선택할 수 있습니다.
빌드 스크립트에 ktor-serialization-kotlinx-json 아티팩트를 추가합니다:
빌드 스크립트에 ktor-serialization-gson 아티팩트를 추가합니다:
빌드 스크립트에 ktor-serialization-jackson 아티팩트를 추가합니다:
XML
XML을 직렬화/역직렬화하려면 빌드 스크립트에 ktor-serialization-kotlinx-xml을 추가합니다:
XML 직렬화는
jsNode대상(target)에서 지원되지 않음에 유의하세요.
CBOR
CBOR을 직렬화/역직렬화하려면 빌드 스크립트에 ktor-serialization-kotlinx-cbor을 추가합니다:
ProtoBuf
ProtoBuf를 직렬화/역직렬화하려면 빌드 스크립트에 ktor-serialization-kotlinx-protobuf를 추가합니다:
직렬화 도구(Serializer) 설정하기
JSON 직렬화 도구
WebSockets 설정에서 JSON 직렬화 도구를 등록하려면, Json 파라미터를 사용하여 KotlinxWebsocketSerializationConverter 인스턴스를 생성하고 이 인스턴스를 contentConverter 속성에 할당합니다.
import io.ktor.serialization.kotlinx.*
import kotlinx.serialization.json.*
install(WebSockets) {
contentConverter = KotlinxWebsocketSerializationConverter(Json)
}Gson 직렬화 도구를 등록하려면 GsonWebsocketContentConverter를 contentConverter 속성에 할당합니다.
import io.ktor.serialization.gson.*
install(WebSockets) {
contentConverter = GsonWebsocketContentConverter()
}Jackson 직렬화 도구를 등록하려면 JacksonWebsocketContentConverter를 contentConverter 속성에 할당합니다.
import io.ktor.serialization.jackson.*
install(WebSockets) {
contentConverter = JacksonWebsocketContentConverter()
}XML 직렬화 도구
WebSockets 설정에서 XML 직렬화 도구를 등록하려면, XML 파라미터를 사용하여 KotlinxWebsocketSerializationConverter 인스턴스를 생성하고 이 인스턴스를 contentConverter 속성에 할당합니다.
import nl.adaptivity.xmlutil.serialization.*
install(WebSockets) {
contentConverter = KotlinxWebsocketSerializationConverter(XML)
}CBOR 직렬화 도구
WebSockets 설정에서 CBOR 직렬화 도구를 등록하려면, Cbor 파라미터를 사용하여 KotlinxWebsocketSerializationConverter 인스턴스를 생성하고 이 인스턴스를 contentConverter 속성에 할당합니다.
import io.ktor.serialization.kotlinx.cbor.*
install(WebSockets) {
contentConverter = KotlinxWebsocketSerializationConverter(Cbor)
}ProtoBuf 직렬화 도구
WebSockets 설정에서 ProtoBuf 직렬화 도구를 등록하려면, ProtoBuf 파라미터를 사용하여 KotlinxWebsocketSerializationConverter 인스턴스를 생성하고 이 인스턴스를 contentConverter 속성에 할당합니다.
import kotlinx.serialization.protobuf.*
install(WebSockets) {
contentConverter = KotlinxWebsocketSerializationConverter(ProtoBuf)
}데이터 수신 및 전송
데이터 클래스 생성
프레임을 객체로 직렬화/역직렬화하려면 데이터 클래스를 생성해야 합니다. 예를 들면 다음과 같습니다:
data class Customer(val id: Int, val firstName: String, val lastName: String)kotlinx.serialization을 사용하는 경우, 해당 클래스에 @Serializable 어노테이션이 있는지 확인하세요:
@Serializable
data class Customer(val id: Int, val firstName: String, val lastName: String)데이터 수신
텍스트 프레임의 내용을 수신하고 변환하려면 데이터 클래스를 파라미터로 받는 receiveDeserialized 함수를 호출합니다:
webSocket("/customer") {
val customer = receiveDeserialized<Customer>()
println("A customer with id ${customer.id} is received by the server.")
}incoming 채널에서 역직렬화된 프레임을 수신하려면 WebsocketContentConverter.deserialize 함수를 사용하세요. WebsocketContentConverter는 WebSocketServerSession.converter 속성을 통해 사용할 수 있습니다.
데이터 전송
지정된 형식을 사용하여 텍스트 프레임으로 데이터 객체를 전달하려면 sendSerialized 함수를 사용할 수 있습니다:
webSocket("/customer/1") {
sendSerialized(Customer(1, "Jane", "Smith"))
}전체 예제는 여기에서 찾을 수 있습니다: server-websockets-serialization.
