[DB DEEP] SSE 와 WebSocket

cup-wan·2025년 5월 25일

DBDeep

목록 보기
1/3

Intro

싸피의 마지막 프로젝트로 구글 기업 연계 DB Deep을 진행했습니다. DB Deep은 LLM을 활용한 기업 데이터 분석 서비스입니다. 데이터 분석은 전문성을 요구하는 영역이었으나 생성형 AI의 등장으로 여러 기업에서 쉽게 접근할 수 있는 방법을 모색 중 입니다.
이번 프로젝트를 진행하며 새로운 기술을 활용하고 웹소켓 채팅을 구현하려다보니 석연치 않은 부분이 많아 정리를 해보겠습니다.

Chat GPT는?

가장 먼저 찾아본 서비스는 Chat GPT입니다. 가장 처음 생성형 AI를 선보인 기업이고 지금도 압도적인 업계 1위를 지키고 있는 서비스인 Chat GPT는 SSE (Server-Sent Event)를 사용하고 있습니다.

SSE

서버에서 클라이언트로 단방향 실시간 데이터를 전송하는 HTML5 표준입니다. 브라우저에서 JavaScript를 수신하며, 실시간 알림이나 로그 스트리밍에 유리합니다.

[흐름]

  • 클라이언트가 EventSource를 통해 서버 연결
  • 서버는 text/event-stream Content-Type으로 응답
  • 서버는 데이터를 일정 간격 or 이벤트 발생 시 전송
  • 클라이언트는 자동으로 수신 및 처리
  • 연결이 끊기면 클라이언트가 자동 재접속 시도

[장점]

  • HTTP 기반으로 구현 및 디버깅 용이
  • 자동 재연결, 이벤트 ID 재사용 등 기본 기능 제공
  • 양방향 통신이 불필요한 경우 효율적

[단점]

  • 단방향 통신이라 클라이언트는 서버에 요청 불가능
  • 브라우저 탭이 많으면 연결 수 제한
  • HTTP/2에서는 동시 연결 관리 유리, HTTP/1.1에서는 제약 존재

ChatGPT가 SSE를 선택한 이유는 아마도? 다음과 같습니다.

  • HTTP 통신으로 요청, SSE로 응답
    • 양방향 통신 불필요
    • 단방향 스트리밍 응답이 필요
  • 방화벽 차단 및 프록시 통과에 SSE가 Websocket 대비 유리
  • 핸드셰이크 복잡 (이건 아마 HTTPS와 함께 구성하기..애매해서가 아닐까...요???)

API 통신이 아닌 SSE를 선택한 이유는 생성형 AI의 응답이 완성까지 굉장히 느리기 때문에 사용자를 붙잡아 두기 위한 전략이라 생각합니다. 실제로 GPT 쓰면서도 와다닥 답변 하는 느낌이라 가만 있는 것이지 그마저도 요즘엔 답변 생성하는 도중에 다른 짓 합니다.

DB Deep은

저희는 많이.... 고민했지만 Websocket을 이용해 구현하기로 했습니다. 근거는 다음과 같습니다.

  • 생성형 AI 응답 전까지 사용자의 입력 자체가 트리거, 단방향 SSE보다 양방향 통신이 더 자연스럽다 생각
  • DB Deep은 사용자의 질문과 피드백을 서버로 계속 전송해야함 (응답 품질 상승 요인)
  • SSE는 text/event-stream 기반 단일 메시지 타입만 지원하기 때문에 개발 단계에서 구조화된 메시지 포맷을 통한 쉬운 유지 보수를 의도함

WebSocket

클라이언트와 서버 간 양방향 통신 (Full-Duplex)을 가능하게 해주는 프로토콜, 한번 연결되면 양측 모두 자유롭게 데이터를 주고 받기 가능

[흐름]

  • 클라이언트가 서버로 Websocket 연결 요청 ws:// or wss://
  • 서버가 핸드셰이크 수락 시 연결 성립
  • 이후 클라이언트와 서버는 서로 필요할 때마다 자유롭게 메시지 송수신
  • 연결 종료 시 클라이언트 혹은 서버가 명시적으로 close

[장점]

  • 양방향 통신 지원
    • 채팅, 실시간 협업, 알림 등 즉각적인 피드백 필요할 때
  • 낮은 오버헤드
    • HTTP 요청/응답 처럼 헤더 반복 필요 X

[단점]

  • 초기 핸드셰이크 문제
    • HTTP를 이용한 핸드셰이크 이후 Websocket으로 업그레이드
  • 방화벽/프록시 제한
    • 일부 네트워크 환경에서는 Websocket 연결 차단
  • 연결 수 관리 필요
    • 브라우저/서버에서 동시 유지할 수 있는 연결 수 제한 존재
  • 구현 복잡

Outro


6주라는 짧은 기간에 가장 중요한 핵심 기능을 어떻게 구현할까 고민이 너무 짧았던 것 같기도 하고 아쉬운 선택은 아니었나..싶기도 합니다.
사내 서비스라 인프라 요소를 좀 더 고려해서 SSE를 선택했어도 괜찮았을 것 같고... 피드백 기반 성능 개선을 위해선 WebSocket이 더 좋은 것 같기도하고...
아직 웹에서 실시간 통신은 장단점이 있는 것 같습니다. 좀 더 다양한 방법으로 프로젝트를 리팩토링 해보고 싶네요.

출처

ChatGPT - 채팅
MDN - SSE
MDN - WebSocket

profile
아무것도 안해서 유죄 판결 받음

0개의 댓글