Unrecognized token 'SSE': wasexpecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false') at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 5]com.fasterxml.jackson.core.JsonParseException: Unrecognizedtoken'SSE': wasexpecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false') at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 5]
2.2. 테스트 구현
WebTestClient를 사용하여 요청을 보내보고 응답이 정상적으로 오는지 확인
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)internalclassNotificationRouterTest@Autowiredconstructor(privateval webTestClient: WebTestClient,) {@Testfun`알림을 받을 수 있다`(): Unit=runBlocking {val result = webTestClient .get() .uri("/notification") .accept(MediaType.TEXT_EVENT_STREAM) .exchange() .expectStatus().isOk .returnResult(ServerSentEvent::class.java)val eventStream = result.responseBody.blockFirst()!!assertThat(eventStream.event()).isEqualTo("periodic-event") }}
3. SSE 이해
SSE는 단방향 스트리밍 이벤트를 활용하기 위해 대부분의 브라우저에서 채택한 사양이다. 이벤트는 UTF-8로 인코딩된 텍스트 데이터 스트림이다. 이벤트의 형식은 줄바꿈으로 구분된 일련의 키-값 요소(id, retry, data, event, name, comment)로 구성된다.
스트리밍 기능을 사용할 때 고려할 점은 SSE 스트리밍과 WebSocket 사용의 차이점이다. WebSocket은 서버와 클라이언트 간의 양방향 통신을 제공하는 반면 SSE는 단방향 통신을 사용한다. 또한 WebSocket은 HTTP 프로토콜이 아니며 SSE와 달리 오류 처리 표준을 제공하지 않는다. 이러한 내용들을 참고하여 서비스에 적합한 통신 방식을 선택하여 사용해야 한다.