생성 결과를 실시간으로 보여주기
Server-Sent Events(SSE)를 활용해 멀티모달 AI 콘텐츠의 생성 결과를 실시간으로 표시하는 동적 UI를 구현했습니다.
GENERATIVE AI · REALTIME
GenWave
콘텐츠 생성 결과는 SSE로 표시하고, 생성 완료 알림은 Next.js에서 분리한 Redis Pub/Sub·WebSocket 알림 서버로 사용자에게 전달했습니다.

01 / CONTEXT & ROLE
멀티모달 AI 콘텐츠는 생성에 시간이 걸려, 사용자가 기다리는 동안 다른 화면으로 가거나 서비스를 떠나기도 합니다. 생성 과정은 실시간으로 보여주고, 완료 소식은 사용자가 어디에 있든 놓치지 않게 전달해야 했습니다. 검색 유입과 서비스 운영도 함께 고려해야 했습니다.
Next.js 기반 프론트엔드, SSE를 활용한 생성 결과 UI, Node.js·TypeScript 알림 서버(Express·ws·ioredis)와 Redis Pub/Sub·WebSocket 연동, SEO 최적화 및 배포 환경 구성을 담당했습니다.
02 / DEEP DIVE
03 / ENGINEERING DECISIONS
Server-Sent Events(SSE)를 활용해 멀티모달 AI 콘텐츠의 생성 결과를 실시간으로 표시하는 동적 UI를 구현했습니다.
처음에는 알림도 SSE로 받았습니다. 그런데 생성 진행 표시도 SSE를 쓰고 있어, 알림 연결까지 계속 열어두면 HTTP/1.1에서 도메인당 6개로 제한된 브라우저 연결을 오래 점유해 다른 요청이 대기할 수 있었습니다. 알림 SSE는 Next.js 라우트를 거쳐 중계되어, 프록시 버퍼링과 서버의 연결 유지 부담도 함께 안고 있었습니다. 그래서 알림을 별도 Node.js 서버로 분리하고 브라우저가 WebSocket으로 직접 연결하도록 바꿨습니다. 요청마다 끝나는 생성 진행 표시는 SSE로 남겨 역할을 나눴습니다.
알림 서버는 Redis 채널로 받은 이벤트를 사용자별 정렬 집합과 알림별 해시에 먼저 저장한 뒤, 연결된 사용자에게만 WebSocket으로 전송합니다. 접속 여부가 알림의 존재를 좌우하지 않도록 저장과 전송의 순서를 정했습니다.
전체 공지를 사용자마다 복사해 저장하지 않고, 공지용 정렬 집합 하나에 저장한 뒤 알림 목록을 조회할 때 개인 알림과 합쳤습니다. 사용자가 늘어도 공지 발송 비용이 늘지 않습니다.
알림마다 3일 보관 기한을 두고, 12시간마다 오래된 목록을 정리했습니다. 목록은 공지와 개인 알림을 합쳐 최대 100개로 제한하고, 미확인 여부 확인과 읽음 처리는 Redis 파이프라인으로 묶어 왕복 횟수를 줄였습니다.
Next.js SSR 기반으로 SEO를 최적화해 구글 검색을 통한 신규 사용자 유입률 향상에 기여했습니다. PM2를 도입해 무중단 배포 환경을 구성했습니다.
04 / HOW IT CONNECTS
생성 완료 알림의 개념 흐름입니다. 먼저 저장한 뒤 전송하므로, 접속하지 않은 사용자도 다음에 알림을 확인할 수 있습니다. 콘텐츠 생성 결과를 표시하는 SSE UI는 별도로 구현했습니다.
05 / OUTCOME
상단 이미지는 실제 GenWave 서비스 화면입니다.
06 / LET’S CONNECT
새로운 기회나 기술에 관한 대화, 편하게 연락 주세요.