각 계층은 독립적으로 동작하며, 상위 계층이 하위 계층에만 의존하도록 설계했습니다. 이를 통해 결합도를 최소화하고 테스트 및 유지보수성을 높였습니다.
View → ViewModel → Repository → Service
- 의존성 방향: 상위 계층만 하위 계층을 참조합니다.
| 계층 | 역할 | 의존성 방향 | 예시 |
|---|---|---|---|
| View | - UI 렌더링- 사용자 입력 처리- 상태 변화 반영 | ← ViewModel | HomeView(), LoginView(), PostView() |
| ViewModel | - 비즈니스 로직 실행- 상태 관리- Repository와 통신 | ← Repository | HomeViewModel, LoginViewModel, PostViewModel |
| Repository | - 데이터 가공- Service ↔ ViewModel 간 중개- 도메인 로직 적용 | ← Service | PostRepository, LoginRepository, NoticeRepository |
| Service | - 외부 시스템 통신- 데이터 CRUD 처리- API/DB 연동 | ← 외부 데이터 소스 | FirebaseAuthService, FirebaseStorageService, FirebaseStoreService |
| Model | - 데이터 구조 정의- DTO/Entity 관리 | 모든 계층에서 참조* | User(id, name, ...), Post(title, body, ...), Message(id, text, ...) |
* Model은 데이터 클래스로, 특정 계층에 종속되지 않습니다.
Flutter에서 Result Pattern을 사용해 네트워크 통신 과정의 에러를 효율적으로 처리했습니다.
아래 흐름대로 각 계층(View → ViewModel → Repository → Service)에서 일관된 에러 핸들링이 가능합니다.
성공시 지정한 데이터 타입의 객체가 반환됩니다.
sealed class로 컴파일 타임 안전성 보장- 모든 경우의 수 처리 강제 (
Success/Failure)
- 선언적 라우팅: 복잡한 네비게이션 시나리오(로그인 전환, 딥링크)를 간결하게 관리할 수 있습니다.
- Riverpod 연동: 상태 변화에 반응하는 동적 리다이렉트 로직 구현이 용이합니다.
-
인증 상태 기반 라우팅
GoRouterRefreshStream으로 Riverpod의 인증 상태(authStateProvider)를 실시간 감지합니다.- 인증 상태에 따라
/login,/home등으로 자동 리다이렉트됩니다.
-
StatefulShellRoute를 활용한 탭 구조
- 독립적 네비게이션 스택: 각 탭(홈, 검색, 프로필)마다 별도의 네비게이션 히스토리를 유지합니다.
- 지속적 UI: 하단 탭 바가 모든 서브 경로에서 유지되도록 설계했습니다.
- 딥링크 지원:
/profile/detail/:id와 같은 경로로 직접 접근 가능합니다.
프로젝트 구현 과정에서 작성한 문서입니다. 각 주제를 클릭하면 해당 포스트로 이동합니다.
- [Flutter] RiverPod - Loading 상태 처리하기(with Lottie & Skeleton)
- [Flutter] RiverPod - Data 상태 관리하기
- [Flutter] Riverpod 학습 - Performing side effects & Passing arguments to your requests
- [Flutter] RiverPod - provider 알아보기(with 네트워크 요청)
- [Flutter] RiverPod 학습 - State management
- [Flutter] [Error Handling] Result Pattern (간편로그인 적용)
- [Flutter] [Error Handling] Result Pattern
- [Flutter] [Firbase] 간편 로그인 구현하기(Apple🍎)
- [Flutter] [Firbase] 간편 로그인 구현하기(kakao💬)
- [Flutter] DesignSystem 트러블슈팅
- [Flutter] URL Navigation(with Go_router) 개발 정리
- [Flutter] DynamicTabBar 트러블 슈팅
- [Flutter] Dynamic TabBar on ScrollView & NaverMap URL Scheme 사용 방법
- [Flutter] WhiteScreen 해결(iPhone 무선빌드) & Load Sequence Flutter
- 카카오/애플 로그인: 한국 사용자 편의성 + iOS 앱스토어 심사 규정 준수
kakao_flutter_sdk_user,sign_in_with_apple
- 실시간 DB/인증/스토리지: 백엔드 구축 필요 없음.
firebase_core,cloud_firestore,firebase_auth,firebase_storage
- 상태 관리:
riverpod으로 깔끔한 DI - 탭/딥링크:
go_router로 복잡한 네비게이션 처리 - 날짜/URL:
wheel_picker,url_launcher로 사용성 향상
- Lottie: 가벼운 로딩 애니메이션
- Skeletonizer: 데이터 대기 중 UI 자연스러운 전환
- Cached NetworkImage: 이미지 캐싱으로 속도 2배 ↑
- Image Compress: 업로드 용량 80% ↓
- Flutter Web Frame: 모바일 ↔ 웹 레이아웃 자동 최적화






