토스는 어떻게 광고 속에 게임을 넣었을까
토스가 광고 시스템을 자체 구축하면서 서드파티 SDK 대신 국제 광고 표준 MRAID를 직접 구현해 플레이어블 광고(앱 설치 전 게임 체험)를 지원한 과정이다. mraid.js 브릿지, 5중 렌더링 완료 신호, 보안 중심 설계, 앱 심사 없는 즉시 배포를 동시에 달성했다.
요약 이어보기React Suspense를 활용한 "Render-as-you-fetch" 패턴이 기존 Fetch-on-render, Fetch-then-render 방식의 Race Condition과 Waterfall Problem을 어떻게 해결하는지 코드 비교로 설명한다. React-Query와 함께 Suspense를 도입한 카카오엔터테인먼트 페이지 서비스 팀의 실전 경험이 담겨 있다.
핵심 포인트 - 3가지 data fetching 패턴: Fetch-on-render(렌더 후 useEffect 조회) vs Fetch-then-render(모든 데이터 조회 후 렌더) vs Render-as-you-fetch(비동기+렌더 동시 시작, Suspense) - Race Condition 문제: 컴포넌트 생명주기와 비동기 작업 생명주기 불일치로 "데이터는 왔는데 컴포넌트는 이미 언마운트" 같은 상황 발생. 동기화 코드 추가 필요해 복잡도 증가 - Waterfall Problem(Fetch-on-render): 부모 컴포넌트가 데이터 조회를 마칠 때까지 자식 컴포넌트 렌더링 시작 불가 → 순차 실행으로 전체 응답 시간 증가 - Suspense 동작 방식: 컴포넌트가 데이터 미준비 시 Promise를 throw. Suspense 경계가 이를 잡아 fallback(로딩 UI) 렌더 → 데이터 준비 완료 시 정상 렌더 - 선언적 비동기 처리: Suspense + ErrorBoundary 조합으로 로딩/에러 UI를 컴포넌트 내부가 아닌 외부에서 선언적으로 관리 → 비즈니스 로직과 UI 관심사 분리 - React-Query의 Suspense 지원: suspense: true 옵션으로 Suspense와 쉽게 연동
상세 정리 - Fetch-on-render 예시: useEffect에서 fetchPublisher → setPublisher → isEmpty 체크 → 렌더. 자식 Operators도 동일 패턴 → 순차 실행(Waterfall) - 동기화 코드의 문제: isEmpty 체크, 조건부 렌더링이 컴포넌트를 복잡하게 만들고 실제 비즈니스 로직을 가림 - Suspense fallback: 부모 Suspense에 fallback={<Spinner />} 설정 → 자식이 Promise throw 시 자동으로 Spinner 표시 - 병렬 요청: Render-as-you-fetch 방식에서 Publisher와 Operators 데이터 요청을 동시에 시작해 Waterfall 해소 - ErrorBoundary 조합: 비동기 에러도 동일하게 선언적 처리 가능. try-catch 없이 컴포넌트 외부에서 에러 UI 정의 - 주의: Suspense는 아직 실험적 기능(React 18 이전 기준). 서버 사이드 렌더링과 조합 시 주의사항 확인 필요 - React 18의 Concurrent Features: startTransition, useTransition과 Suspense 연계로 더 세밀한 로딩 상태 제어 가능
왜 읽나: Fetch-on-render의 Race Condition과 Waterfall 문제를 Suspense가 구조적으로 해결하는 원리를 코드 비교로 이해하고, React-Query와의 연동 패턴까지 실전에 바로 적용 가능한 수준으로 익힐 수 있다.
토스가 광고 시스템을 자체 구축하면서 서드파티 SDK 대신 국제 광고 표준 MRAID를 직접 구현해 플레이어블 광고(앱 설치 전 게임 체험)를 지원한 과정이다. mraid.js 브릿지, 5중 렌더링 완료 신호, 보안 중심 설계, 앱 심사 없는 즉시 배포를 동시에 달성했다.
요약 이어보기채널톡 고객용 SDK에서 boot→shutdown→boot 연속 호출 시 사이드 이펙트가 중첩되는 타이밍 버그를 RxJS 기반 구조 개편으로 해결한 사례다. 비동기 흐름 직렬화에 RxJS, 동기적 상태 관리에 Zustand를 도입해 타이밍 비결정성을 구조 수준에서 제거했다.
요약 이어보기여기어때 항공 서비스 프론트엔드가 웹과 앱 웹뷰 두 환경에서 동일한 함수 호출로 동작하는 앱 브릿지 추상화 레이어를 설계한 과정을 다룬다. iOS·안드로이드 규약 차이와 "웹에 존재하지 않는 브릿지를 어떻게 호출하나"라는 문제를 단일 추상화 층으로 해결한 구현 사례다.
요약 이어보기