
BFF와 SSE 스트리밍으로 1.7MB에 달하는 대형 전시 지면의 병목을 시원하게 해결한 배달의민족 기술 여정
서비스가 성장하면서 복잡해진 배달의민족 '가게목록' 지면의 통신 구조를 획기적으로 개선한 사례입니다. 클라이언트와 서버 간의 다중 호출 문제를 해결하기 위해 BFF 서버를 구축하고, 응답 지연을 방지하기 위해 웹 표준인 SSE 스트리밍을 과감히 도입했습니다. 프론트엔드와 백엔드의 유기적인 아키텍처 재설계를 통해 사용자 경험(UX)과 엔지니어링 생산성을 동시에 극대화한 과정을 생생하게 담고 있습니다.
다양한 서브 도메인의 데이터를 한 화면에 렌더링해야 하는 포털형 지면을 개발 중이거나, 대량의 데이터 전송으로 인해 화면 초기 로딩 성능에 병목을 겪고 있는 아키텍트 및 풀스택 개발자에게 강력히 추천합니다.
배달의민족 가게목록 지면이 단순 리스트에서 다양한 큐레이션과 광고가 결합된 통합 전시 지면으로 진화하면서, 클라이언트가 여러 서버를 직접 호출하는 다중 통신 구조로 인해 클라이언트 코드 복잡도 증가 및 백엔드의 화면 제어권 상실 문제가 발생했습니다. 이를 단일 REST API로 통합할 경우, 대용량 응답 데이터와 가장 느린 구좌 속도로 전체 지연 시간이 상향 평준화되는 새로운 병목 현상이 예상되었습니다.
BFF(Backend For Frontend) 서버를 도입하여 1지면 1API 구조로 통합하는 한편, 요청은 단 한 번만 받되 응답은 완료되는 순서대로 부분 전송하는 SSE(Server-Sent Events) 스트리밍 기술을 도입했습니다. 웹 프론트엔드에서는 커스텀 헤더 지원을 위해 fetch와 ReadableStream을 결합하여 스트림을 직접 파싱하고, 수신된 데이터를 React Query 캐시에 동적으로 밀어 넣어 컴포넌트 단위로 점진적 렌더링을 수행하도록 설계했습니다.
기존에는 전체 지면이 완성되기까지 약 300ms를 대기한 후에야 렌더링이 시작되었으나, SSE 도입 이후에는 가벼운 구좌가 약 15ms 만에 먼저 응답하여 체감 초기 로딩 속도가 극적으로 단축되었습니다. 또한 백엔드가 각 영역의 조회 오류 시 대체 구좌를 편성하는 등 유연한 화면 제어권을 확보했으며, nginx 프록시 버퍼링 검증을 통해 스트리밍 환경에서도 안정적인 자원 제어가 가능함을 입증했습니다.
Trade-off
표준 EventSource API의 커스텀 헤더 미지원 제약으로 인해 fetch 기반의 자체 스트림 파서 구현 비용이 발생했으며, 단일 컴포넌트나 단순한 응답 구조를 가진 지면에는 오히려 시스템 복잡도만 가중시킬 수 있다는 한계가 있습니다.
프론트엔드 화면의 요구사항에 맞춤형으로 데이터를 가공, 조합하여 제공하는 전용 백엔드 게이트웨이 계층입니다.
한 번 수립된 HTTP 커넥션을 통해 서버에서 클라이언트로 데이터를 실시간 단방향 스트리밍하는 웹 표준 프로토콜입니다.
서버 상태(State) 관리를 자동화하고, 캐싱된 데이터를 컴포넌트들이 선언적으로 구독하여 렌더링 상태를 동기화하는 기법입니다.




