프로젝트 개요
리드그로우(ReadGrow)는 AI 기반의 종합 주식 분석 및 투자 정보 플랫폼입니다. 복잡한 주식 시장 데이터를 AI가 실시간으로 분석하여 투자자들이 쉽게 이해할 수 있는 형태로 제공하며, 대화형 AI 챗봇을 통해 맞춤형 투자 인사이트를 제공합니다.
초보 투자자부터 전문가까지, 누구나 쉽게 주식 정보를 이해하고 활용할 수 있도록 직관적인 UI/UX와 개인화된 알림 시스템을 갖춘 모바일 중심의 투자 플랫폼입니다.
서비스 흐름도
주요 기능
1. AI 기반 종목 분석 시스템
- READ SCORE: 독자적인 AI 알고리즘으로 종목의 긍정 신호를 점수화합니다. 뉴스, 공시, 시장 데이터를 종합하여 투자 판단에 필요한 핵심 지표를 하나의 숫자로 제공합니다.
- 실시간 분석 리포트: 뉴스, 공시, 시장 데이터를 종합하여 AI가 생성한 분석 보고서를 제공합니다. 복잡한 정보를 이해하기 쉬운 형태로 요약하여 투자 결정을 지원합니다.
- 동향 감지: 종목의 상승/하락 추세를 화살표 아이콘으로 직관적으로 표시합니다.
- 종목 요약: 복잡한 기업 정보를 한눈에 파악할 수 있도록 요약합니다.
2. READ CHAT (대화형 AI 투자 상담)
- 맞춤형 질문 키워드: 사용자 관심사에 맞는 질문 템플릿을 제공하여 빠르게 원하는 정보에 접근할 수 있습니다.
- 실시간 대화형 분석: 자연어로 종목, 시장, 투자 전략에 대해 질문하고 즉시 답변을 받습니다. 이전 대화 맥락을 이해하여 연속적인 분석을 제공합니다.
- 대화 히스토리 관리: 과거 질문과 답변을 시간순으로 저장 및 조회합니다.
3. 그로우팜 (관심 종목 관리)
- 관심 종목 즐겨찾기: 자주 확인하는 종목을 저장하여 빠르게 접근할 수 있습니다.
- 종목별 실시간 알림: 관심 종목 관련 중요 뉴스 발생 시 푸시 알림을 받습니다. 투자 기회를 놓치지 않도록 실시간으로 정보를 제공합니다.
- 최근 검색 종목: 검색 기록을 로컬 DB에 저장하여 빠르게 재검색할 수 있습니다.
- 종목 검색: 종목명, 종목 코드로 실시간 검색합니다.
4. 애널리스트 전문가 콘텐츠
- 애널리스트 팔로우: 신뢰하는 전문가의 분석 글을 구독합니다. 원하는 전문가의 최신 분석을 빠르게 확인할 수 있습니다.
- 카테고리별 필터링: 산업, 테마별로 전문가 콘텐츠를 분류합니다.
- 전문가 상세 프로필: 애널리스트의 이력, 주요 분석 글, 팔로워 수를 표시합니다.
- 콘텐츠 북마크 및 좋아요: 유용한 분석 글을 저장하고 공감을 표현합니다.
5. 종합 뉴스 피드
- 오늘의 하이라이트 뉴스: AI가 선별한 주요 시장 이슈를 제공합니다.
- 카테고리별 뉴스: 테마, 산업군별 뉴스를 분류합니다.
- 키워드 뉴스: 특정 키워드 관련 뉴스를 모아 봅니다.
- 뉴스 상세 분석: 뉴스가 특정 종목에 미치는 영향을 분석합니다.
6. 개인화 기능
- 마이페이지: 내 활동 내역을 한눈에 조회합니다.
- 북마크 관리: 저장한 콘텐츠, 뉴스, 분석 글을 모아 봅니다.
- 좋아요한 게시물: 관심 표현한 콘텐츠를 모아 봅니다.
- 팔로우 애널리스트 관리: 구독 중인 전문가 목록을 관리합니다.
- 앱 설정: 알림 설정, 계정 관리, FAQ를 확인합니다.
플랫폼 구성
| 구성 요소 | 기술 스택 | 역할 |
|---|---|---|
| 프론트엔드 | Flutter 3.0+, Dart SDK 3.0+ | iOS/Android 크로스 플랫폼 UI |
| 상태 관리 | Riverpod 2.3+, Flutter Hooks | 반응형 상태 관리 및 의존성 주입 |
| 로컬 DB | Drift 2.11+ (SQLite) | 최근 검색 종목 저장 |
| 로컬 저장소 | Shared Preferences | 사용자 설정, 토큰 저장 |
| 네트워크 | Dio 5.3+, Retrofit 4.0+ | REST API 통신 |
| 인증 | Firebase Auth, 소셜 로그인 | Google, Apple, Kakao, Naver 로그인 |
| 푸시 알림 | FCM, Flutter Local Notifications | 실시간 종목/뉴스 알림 |
| 차트 | FL Chart 0.63+ | 주가 차트, 데이터 시각화 |
| 라우팅 | Go Router 10.0+ | 선언적 내비게이션 |
| 코드 생성 | Freezed, JSON Serializable | 불변 모델, JSON 직렬화 |
기술적 선택과 이유
Flutter + Dart 선택
- 크로스 플랫폼 효율성: 단일 코드베이스로 iOS/Android 동시 개발하여 개발 속도 2배 향상
- Hot Reload: 실시간 UI 수정으로 디자인 반복 주기 단축
- 네이티브 성능: AOT 컴파일로 네이티브 앱 수준의 성능 제공
- 풍부한 UI 컴포넌트: Material Design과 Cupertino 위젯으로 플랫폼별 네이티브 UX 구현
Riverpod + Hooks 패턴
- 컴파일 타임 안전성: Provider 오류를 컴파일 단계에서 포착
- 선언적 의존성 관리: 자동 의존성 해결 및 캐싱
- 테스트 용이성: Mock Provider로 단위 테스트 간소화
- 함수형 접근: Hooks로 상태 로직을 재사용 가능한 함수로 분리
Retrofit + Dio 조합
- 타입 안전한 API 클라이언트: Retrofit 어노테이션으로 API 인터페이스 자동 생성
- 인터셉터 체계: Dio 인터셉터로 JWT 토큰, 에러 핸들링, 로깅 중앙화
- 요청 취소 및 재시도: 네트워크 상태에 따른 유연한 요청 관리
Drift (SQLite) 로컬 DB
- 타입 안전한 SQL: Dart 코드로 SQL 쿼리 작성하여 런타임 에러 방지
- 반응형 쿼리: Stream 기반으로 데이터 변경 자동 감지
- 오프라인 우선: 네트워크 없이도 최근 검색 기록 유지
Firebase 생태계 통합
- 간편한 소셜 로그인: Firebase Auth로 4개 플랫폼 인증 통합
- 푸시 알림: FCM으로 iOS/Android 통합 푸시 관리
- Analytics 준비: 향후 사용자 행동 분석 기반 마련
Freezed + Code Generation
- 불변 데이터 모델: immutable 객체로 상태 관리 안정성 확보
- copyWith 자동 생성: 객체 복사 보일러플레이트 제거
- Union Types: sealed class로 여러 상태를 타입 안전하게 표현
- JSON 직렬화: toJson/fromJson 자동 생성으로 수동 파싱 오류 방지
프로젝트 특징
도메인 중심 아키텍처
- Clear Separation of Concerns: UI, 비즈니스 로직, 데이터 레이어를 명확하게 분리하여 각 레이어의 책임을 명확히 합니다.
- 확장 가능한 구조: 새로운 기능 추가 시 기존 코드 영향을 최소화하는 구조를 갖추고 있습니다.
- 테스트 가능한 설계: 각 레이어를 독립적으로 테스트할 수 있어 코드 품질을 유지합니다.
실시간 알림 시스템
- 이벤트 기반 아키텍처: 관심 종목 뉴스 생성 시 Event Router가 알림을 전송합니다.
- 로컬 알림 스케줄링: 오늘의 뉴스를 매일 정해진 시간에 알림으로 제공합니다.
- Notification Payload: 알림 클릭 시 해당 종목/뉴스 상세 페이지로 바로 이동합니다.
- Badge 관리: iOS App Badge를 미확인 알림 개수로 표시합니다.
오프라인 지원
- 최근 검색 기록 캐싱: Drift DB로 로컬에 저장하여 네트워크 없이도 조회할 수 있습니다.
- Graceful Degradation: API 실패 시 사용자에게 명확한 에러 메시지를 표시합니다.
- Retry 메커니즘: 네트워크 복구 시 자동으로 재시도합니다.
성능 개선
- Infinite Scroll Pagination: 대량 리스트를 페이지 단위로 로드하여 메모리 사용량을 줄입니다.
- Image Caching: flutter_svg로 벡터 아이콘 캐싱을 처리합니다.
- Debounce 검색: easy_debounce로 검색 입력 시 불필요한 API 호출을 방지합니다.
- Pull to Refresh: 데이터 새로고침으로 최신 정보를 유지합니다.
다국어 준비
- Intl 패키지: 향후 글로벌 서비스 확장을 위한 다국어 지원 인프라를 구축했습니다.
- flutter_localizations: 날짜, 숫자 포맷 로컬라이제이션을 지원합니다.
개발자 경험 (DX)
- Code Generation: build_runner로 반복 코드를 자동 생성합니다.
- Linting: flutter_lints로 코드 품질 일관성을 유지합니다.
- Custom Lint: riverpod_lint로 Provider 사용 패턴을 강제합니다.
- Hot Reload: 평균 UI 수정 반영 시간 1초 미만으로 빠른 개발이 가능합니다.