US공시톡 Flutter 클라이언트 구조
왜 Flutter인가요?
US공시톡은 SEC 공시 데이터를 실시간으로 모니터링하는 서비스예요. 처음부터 Android 타겟으로 시작했지만, 추후 iOS 확장 가능성을 열어두고 싶었어요. Flutter는 단일 코드베이스로 멀티 플랫폼을 지원하면서도 네이티브에 가까운 성능을 보여줘요.
앱 구조
상태 관리 · Provider
ChangeNotifierProvider 패턴을 사용해요. 각 도메인별로 Provider를 분리했어요.
- AuthProvider: 로그인/로그아웃 상태, 세션 복원
- WatchlistProvider: 관심 종목 추가/삭제/순서 변경
- MarketIndicatorProvider: 시장 지표 자동 갱신
- FilingSheetProvider: 공시 바텀시트 상태, 열람권 차감
- NotificationProvider: 알림 뱃지, 읽음 처리
화면 구성
| 화면 | 설명 |
|---|---|
| Home | 시장 지표 티커 테이프, AI 브리핑, 관심종목 |
| Ticker Detail | 주가 정보, 공시 탭, 뉴스 탭 |
| Search | 티커/회사명으로 종목 검색 |
| Notification | 푸시 알림 히스토리 |
네트워크 레이어 · Dio + AuthInterceptor
HTTP 클라이언트는 Dio를 사용해요. AuthInterceptor가 핵심인데, 모든 요청에 JWT 토큰을 자동으로 부착하고, 401 응답이 오면 Refresh Token으로 자동 갱신 후 원래 요청을 재시도해요.
동시에 여러 요청이 401을 받는 경우를 대비해서, Completer 기반의 Lock으로 토큰 갱신을 1회만 수행하도록 설계했어요.
인증 흐름
- Google Sign-In으로 ID Token 획득
- 서버에 전송 → JWT Access/Refresh Token 발급
FlutterSecureStorage에 토큰 저장- 앱 재시작 시 저장된 Refresh Token으로 세션 자동 복원
수익화 · 열람권 + 보상형 광고
공시 AI 요약을 열람하려면 열람권 1장이 필요해요. 열람권이 부족하면 Google AdMob 보상형 광고를 시청해서 충전할 수 있어요.
광고 인벤토리가 없거나 로드에 실패하면, 하루 3회까지 무료 충전 폴백이 적용돼요. 보상 검증은 **AdMob SSV(Server-Side Verification)**로 서버에서 처리해요.
UI/UX
- Material 3 기반, 시스템 설정에 따라 Light/Dark 자동 전환
- 주가 색상: 한국식(빨강=상승) / 미국식(초록=상승) 전환 가능
- 포그라운드 푸시 수신 시 인앱 스낵바 표시
- GitHub Gist 기반 원격 상태 JSON으로 긴급 점검 모드/강제 업데이트 제어