Skip to content
Server Plugin

Ktor 서버의 Server-Sent Events (SSE)

필수 의존성: io.ktor:ktor-server-sse

코드 예시: server-sse

Server-Sent Events (SSE)는 서버가 HTTP 연결을 통해 클라이언트에 이벤트를 지속적으로 푸시할 수 있도록 하는 기술입니다. 클라이언트가 서버를 반복적으로 폴링할 필요 없이 서버가 이벤트 기반 업데이트를 전송해야 하는 경우에 특히 유용합니다.

Ktor에서 지원하는 SSE 플러그인은 서버와 클라이언트 간에 단방향 연결을 생성하는 간단한 방법을 제공합니다.

TIP

클라이언트 측 지원을 위한 SSE 플러그인에 대해 자세히 알아보려면 다음을 참조하십시오:

SSE 클라이언트 플러그인
SSE 플러그인을 사용하면 클라이언트가 HTTP 연결을 통해 서버로부터 이벤트 기반 업데이트를 받을 수 있습니다.
.

NOTE

양방향 통신에는

WebSockets
Websockets 플러그인을 사용하면 서버와 클라이언트 간에 양방향 통신 세션을 생성할 수 있습니다.
사용을 고려하십시오. WebSockets는 Websocket 프로토콜을 사용하여 서버와 클라이언트 간에 전이중 통신을 제공합니다.

제한 사항

Ktor는 SSE 응답에 대한 데이터 압축을 지원하지 않습니다. 만약

Compression
필수 의존성: io.ktor:ktor-server-sse 코드 예시: server-sse 네이티브 서버 지원: ✖️
플러그인을 사용하는 경우, 기본적으로 SSE 응답에 대한 압축을 건너뜁니다.

의존성 추가

SSE을(를) 사용하려면 빌드 스크립트에 ktor-server-sse 아티팩트를 포함해야 합니다:

Kotlin
Groovy
XML

SSE 설치

SSE 플러그인을 애플리케이션에 설치하려면, 지정된

모듈
모듈을 사용하면 라우트를 그룹화하여 애플리케이션을 구조화할 수 있습니다.
install 함수에 전달하십시오. 아래 코드 스니펫은 SSE을(를) 설치하는 방법을 보여줍니다...

  • ... embeddedServer 함수 호출 내부에.
  • ... Application 클래스의 확장 함수인 명시적으로 정의된 module 내부에.
kotlin
kotlin

SSE 세션 처리

SSE 플러그인을 설치한 후, SSE 세션을 처리할 라우트를 추가할 수 있습니다. 이를 위해 라우팅 블록 내에서 sse() 함수를 호출합니다. SSE 라우트를 설정하는 두 가지 방법이 있습니다:

  1. 특정 URL 경로 사용:

    kotlin
  2. 경로 없음:

    kotlin

SSE 세션 블록

sse 블록 내에서 지정된 경로에 대한 핸들러를 정의하는데, 이는 ServerSSESession 클래스로 표현됩니다. 이 블록 내에서 다음 함수와 속성을 사용할 수 있습니다:

send()
<code>send()</code>ServerSentEvent를 생성하여 클라이언트에 전송합니다.
call
<code>call</code> 세션을 시작한 연결된 수신 ApplicationCall입니다.
close()
<code>close()</code> 세션을 닫고 클라이언트와의 연결을 종료합니다. close() 메서드는 모든 send() 작업이 완료되면 자동으로 호출됩니다.

NOTE

close() 함수를 사용하여 세션을 닫는다고 해서 클라이언트에 종료 이벤트가 전송되는 것은 아닙니다. 세션을 닫기 전에 SSE 스트림의 끝을 알리려면 send() 함수를 사용하여 특정 이벤트를 전송하십시오.

예시: 단일 세션 처리

아래 예시는 /events 엔드포인트에 SSE 세션을 설정하고, 각 이벤트 사이에 1초(1000ms) 지연을 두어 SSE 채널을 통해 6개의 개별 이벤트를 전송하는 방법을 보여줍니다:

kotlin

전체 예시는 server-sse를 참조하십시오.

SSE 하트비트

하트비트는 비활성 기간 동안 이벤트를 주기적으로 전송하여 SSE 연결이 활성 상태를 유지하도록 보장합니다. 세션이 활성 상태로 유지되는 한, 서버는 구성된 간격으로 지정된 이벤트를 전송합니다.

하트비트를 활성화하고 구성하려면 SSE 라우트 핸들러 내에서 .heartbeat() 함수를 사용하십시오:

kotlin

이 예시에서는 연결을 유지하기 위해 10밀리초마다 하트비트 이벤트가 전송됩니다.

직렬화

직렬화를 활성화하려면 SSE 라우트에서 serialize 매개변수를 사용하여 사용자 정의 직렬화 함수를 제공하십시오. 핸들러 내에서 ServerSSESessionWithSerialization 클래스를 사용하여 직렬화된 이벤트를 전송할 수 있습니다:

kotlin

이 예시의 serialize 함수는 데이터 객체를 JSON으로 변환하는 역할을 하며, 변환된 JSON은 ServerSentEventdata 필드에 배치됩니다.

전체 예시는 server-sse를 참조하십시오.