본문 바로가기
IT

[AI] SSE(Feat.Streaming HTTP)

by 뽀리님 2025. 12. 3.

나는 채팅을 개발한다면 흔히 WebSocket을 써서 개발해야 되겠구나 하고 생각했다.

근데 보다보니 SSE?라는게 보이길래 아니 이건 또 무슨 기술이여? 하고 찾다가 정리해본다.

일단 내가 개발하는건 사용자끼리(User To User) 채팅이 아닌, 챗봇(User To Server)라는 거다.

사용자끼리 하는 채팅은 실시간으로 언제든지 메시지 및 파일을 보낼 수 있어야 한다. 

서로 동시에 그리고 비동기적으로 발생하기 때문에 이런경우엔 양방향이므로  Websocket은 필수이다. 

하지만!! 챗봇은 경우가 좀 다르다.

사용자가 챗봇에게 질문을 던지면 서버에서 그 질문을 분석한 후 적당한 데이터을 조립하여 답변 형식으로 다시 내려다 주는.....

UI가 대화형이어서 그렇지 어떻게 보면 단방향이라고 볼 수 있다.

즉, 클라이언트 ---> 서버 (요청) 
     서버 ---> 클라이언트 (응답)

엥, 걍 우리가 흔히 보는 HTTP 통신 방식이 아인교 ....???

하지만 여기서 중요한게 있다!

우리가 여기저기 다른서비스에서 챗봇같은걸 이용하다 보면(gpt나 뭐 다른것들도 마찬가지임)

공통점이 질문을 던지면 글자가 하나씩 타이핑 되면서 뚜따뚜따 나오는데 

이게 바로 핵심이다!!!!! 

이런식으로 나오게 하려면 일반적인 HTTP 통신으로는 불가능하다.

왜냐고? 일반 HTTP 통신은 모든 데이터가 다 생성될 때까지 응답을 하지 않기 때문이다.

그렇기에 우리가 만약 일반 HTTP 통신으로 구현하게 된다면 질문 하나 던졌을 때, 오래걸리는 계산로직일 경우 하염없이 뻉글뺑글 도는 로딩바만 보게 될 것이다.


이래서 쓰는게 바로 SSE 방식이다.

 

✔️ Server-Sent Events (SSE)

SSE는 HTTP 스트리밍 방식으로, 서버가 클라이언트에게 지속적으로 데이터를 푸시(Push)하는 단방향 통신이다.

클라이언트는 EventSource 객체를 통해 서버에 연결하며, 서버는 text/event-stream MIME 타입으로 데이터를 전송한다.

HTTP 연결을 끊지 않고, 서버에서 이벤트가 발생할 때마다 실시간으로 텍스트 데이터를 보내는 방식이다.

(만약에 양방향 통신이 필요하다면  Websocket을 쓰면됨)

 

SSE를 이용하여 토큰단위(TTFT(Time to First Token) )로 끊어 보내는게 챗봇의 핵심이다.

요게 무슨 말인고 하니?

우리가 예를들어 질문으로 "오늘 날씨는 어때?" 라고 물어봤을 경우 

일반 REST API(HTTP) 통신으로 구현했을 때는 "오늘 날씨는 영하 -3도에 매우 춥습니다" 라는 대답이 이 한문장에 다 생성될 때까지 기다렸다가 화면에 뽜아앙!! 하고 보여주게 된다.

그러나 SSE를 통해 토큰단위로 끊어보내주는 경우 "오늘" "날씨는" "영하" "-3도에" "매우" "춥습니다." 하는 단어로 각각 끊어보내주게 되고, 

그 결과 우리가 화면상으로 봤을땐 뚜따뚜따 타이핑되는걸로 (마치 말하듯) 보여지게 되는것이다.


챗봇의 핵심 요소는

 

  • SSE 표준 데이터 포맷 (Standard Data Format)
  • SSE 연결 메커니즘 (단방향 실시간 연결성, 자동 재연결)
  • TTFT (Time to First Token) 극대화 (UX 요소)

 

 

이 3가지가 되겠다.

표준데이터 포맷은 W3C 규격에 따른 표준데이터 포맷인데 이거 때문에 모든 브라우저의 EventSource가 동일하게 동작할 수 있단 것이다.

연결 매커니즘은 지속적인 단방향 연결(질문을 했을 때 답변이 끝날때까지 연결) 과 예상치 못한 상황에 종료(브라우저를 닫는다던지)에 자동으로 연결을 복구하는 로직이 내장되어 있어 서비스의 안정성을 높여준다.

TTFT는 아까 말햇듯이 SSE가 지원하는 기능은 아니고, 뚜따뚜따 타이핑처럼 되는걸로 보이게 할 수 있도록 토큰단위로 끊어 보낸단 것이다.

이런 장점 때문에 챗봇이 SSE를 선택하는 이유라 보면 되겠다.

 

웹소켓을 써도 상관이 없긴하지만, 연결이 끊겼을 경우 웹소켓은 따로 로직을 처리해야 하고 SSE는 HTTP 통신이지만 웹소켓은 ws라는 통신을 하기에 한번더 프로토콜 변환 과정을 거친다. 

이 과정에서 또 리소스가 낭비 되므로 굳이 양방향이 이루어질 필요가 없다면 잘 고려한후 SSE 방식도 써보자.