토스는 어떻게 광고 속에 게임을 넣었을까
토스가 광고 시스템을 자체 구축하면서 서드파티 SDK 대신 국제 광고 표준 MRAID를 직접 구현해 플레이어블 광고(앱 설치 전 게임 체험)를 지원한 과정이다. mraid.js 브릿지, 5중 렌더링 완료 신호, 보안 중심 설계, 앱 심사 없는 즉시 배포를 동시에 달성했다.
요약 이어보기React.Children 유틸리티의 동작 원리와 함정, 그리고 실무에서 children을 조작할 때 왜 toArray()를 사용해야 하는지를 코드 예제로 설명한다. React.Children이 maintenance mode임을 인지하고 대안까지 안내하는 실용적인 글이다.
핵심 포인트 - children prop을 slice/filter 등으로 조작하려면 React.Children.toArray() 먼저 호출해야 한다 - children은 겉보기엔 배열이지만 실제로는 opaque data structure(object 또는 undefined)일 수 있음 - toArray()는 중첩 배열을 1차원(flat)으로 변환하고 각 child에 고유 key를 부여함 - toArray()가 React.Fragment 내부를 flatten하지 않는 알려진 한계가 있음 - 대안: react-keyed-flatten-children 패키지로 Fragment까지 완전 flatten 가능 - React.Children은 현재 maintenance mode → 향후 다른 유틸로 대체될 수 있음
상세 정리 - children이 단일 element면 object, 복수면 array, 자식 없으면 undefined - 따라서 children.slice()를 직접 호출하면 TypeError 가능 - React.Children.toArray(children)는 undefined나 object도 항상 array로 반환 - DOM 렌더링 시에는 배열이 1depth로 자동 평탄화되어 보여서 착각하기 쉬움 - 직접 children.slice(0,2) 시도: fruits 배열이 1개 요소로 카운트되어 3개가 렌더링됨 - toArray 후 slice(0,2): banana, apple만 2개 렌더링 (의도한 결과) - toArray의 key 부여: 원본 key에 배열 위치 prefix 추가 (.1:$1_apple 형태) - 이 prefix는 Reconciliation 최적화를 위해 각 child가 어느 입력 배열에 속하는지 추적 - React.Fragment가 자식으로 들어오면 toArray가 Fragment 내부를 flatten하지 않음 - Fragment 포함 시 toArray 결과: [Object(banana+melon), Object(apple), Object(kiwi)] - 해결책: react-keyed-flatten-children을 import해서 사용하면 Fragment까지 완전 flatten - React 팀 공식 입장: React.Children은 maintenance mode, 추후 대체 API 제공 예정 - 더 깊이 공부하려면 react-children-deepdive 문서 참고 권장
왜 읽나: children을 단순히 {children}으로 렌더링하는 것을 넘어 조작·필터링해야 하는 컴포넌트를 만들 때 반드시 알아야 할 함정과 올바른 해결책을 알려준다.
토스가 광고 시스템을 자체 구축하면서 서드파티 SDK 대신 국제 광고 표준 MRAID를 직접 구현해 플레이어블 광고(앱 설치 전 게임 체험)를 지원한 과정이다. mraid.js 브릿지, 5중 렌더링 완료 신호, 보안 중심 설계, 앱 심사 없는 즉시 배포를 동시에 달성했다.
요약 이어보기채널톡 고객용 SDK에서 boot→shutdown→boot 연속 호출 시 사이드 이펙트가 중첩되는 타이밍 버그를 RxJS 기반 구조 개편으로 해결한 사례다. 비동기 흐름 직렬화에 RxJS, 동기적 상태 관리에 Zustand를 도입해 타이밍 비결정성을 구조 수준에서 제거했다.
요약 이어보기여기어때 항공 서비스 프론트엔드가 웹과 앱 웹뷰 두 환경에서 동일한 함수 호출로 동작하는 앱 브릿지 추상화 레이어를 설계한 과정을 다룬다. iOS·안드로이드 규약 차이와 "웹에 존재하지 않는 브릿지를 어떻게 호출하나"라는 문제를 단일 추상화 층으로 해결한 구현 사례다.
요약 이어보기