learn-flutter/llm.txt
ChangJoo Park(박창주) 900b0ab68b update markdown
2025-05-14 09:34:13 +09:00

267 lines
9.7 KiB
Text

# Tabling User Flutter 프로젝트 LLM 가이드
## 1. 프로젝트 개요
이 문서는 `tabling_user` Flutter 애플리케이션 프로젝트를 이해하고 개발하는 데 도움을 주기 위한 LLM 가이드입니다. Tabling 사용자 앱은 고객이 레스토랑을 검색하고, 예약하고, 웨이팅 목록에 참여하는 등의 기능을 제공하는 앱입니다.
## 2. 프로젝트 구조
### 2.1. 모노레포(Monorepo) 구조
Tabling Flutter 프로젝트는 모노레포 구조로 조직되어 있으며, 여러 앱과 패키지를 포함하고 있습니다.
tabling_c_flutter/
├── apps/
│ ├── tabling_user/ # 유저 타입 앱 (이 문서의 주제)
│ ├── tabling_web_app/ # 웹 앱
│ ├── server_board/
│ ├── tabling_web/
│ ├── reservation/
│ ├── ceoboard/
│ ├── storybook/
│ └── tabling_pager/
└── packages/ # 공유 패키지
├── tabling_ui/ # UI 컴포넌트 패키지
├── tabling_models/ # 데이터 모델 패키지
├── tabling_rest_client/ # API 클라이언트 패키지
├── tabling_shared_data/ # 공유 데이터 패키지
├── tabling_restaurant_card/ # 레스토랑 카드 UI 컴포넌트
├── tabling_format/ # 포맷팅 유틸리티
├── tabling_analytics/ # 분석 도구
├── tabling_image/ # 이미지 관련 유틸리티
└── tabling_video_player/ # 비디오 플레이어 컴포넌트
### 2.2. tabling_user 앱 구조
tabling_user 앱은 다음과 같은 디렉토리 구조를 가지고 있습니다:
tabling_user/
├── lib/
│ ├── analytics/ # 분석 관련 코드
│ ├── animations/ # 애니메이션 관련 코드
│ ├── constants/ # 상수 정의
│ ├── extensions/ # 확장 메소드
│ ├── locales/ # 다국어 지원
│ ├── mixins/ # 믹스인
│ ├── models/ # 앱 특화 모델 (패키지 모델 외)
│ ├── pages/ # 페이지 정의 (라우팅 진입점)
│ ├── providers/ # Riverpod 프로바이더
│ ├── repositories/ # 데이터 리포지토리
│ ├── router/ # 라우팅 설정
│ ├── services/ # 비즈니스 로직 서비스
│ ├── utils/ # 유틸리티 함수
│ ├── view_models/ # 뷰 모델
│ ├── app.dart # 앱 진입점
│ ├── flavors.dart # 환경 설정
│ ├── main.dart # 메인 진입점
│ ├── main_develop.dart # 개발 환경 진입점
│ ├── main_production.dart # 프로덕션 환경 진입점
│ └── main_staging.dart # 스테이징 환경 진입점
## 3. 아키텍처 패턴
### 3.1. Page -> Screen -> Widget 패턴
tabling_user 앱은 Page -> Screen -> Widget 패턴을 사용하여 UI를 구성합니다:
1. **Page**:
- 라우팅 시스템의 진입점
- 앱의 `/pages` 디렉토리에 정의됨
- 해당 화면의 라우팅, 상태 관리 및 초기화 로직을 담당
- 일반적으로 Provider나 View Model과 연결되어 데이터 상태를 관리
- 화면 내용을 구성하는 Screen 컴포넌트를 포함
2. **Screen**:
- `tabling_ui` 패키지의 `/screens` 디렉토리에 정의됨
- 특정 페이지의 주요 레이아웃과 UI 로직을 담당
- 재사용 가능한 단위로 설계됨
- 상위 Page로부터 데이터와 이벤트 핸들러를 전달받음
- 여러 작은 Widget들을 조합하여 화면을 구성
3. **Widget**:
- `tabling_ui` 패키지의 `/widgets` 디렉토리에 정의됨
- 작고 재사용 가능한 UI 컴포넌트
- 버튼, 텍스트 필드, 카드 등 기본 UI 요소
- 디자인 시스템에 따라 일관된 스타일과 동작을 제공
### 3.2. 상태 관리
tabling_user 앱은 Riverpod를 사용하여 상태를 관리합니다:
- `/providers` 디렉토리: 글로벌 상태 및 서비스 프로바이더
- 각 Page 디렉토리 내 `provider.dart`: 해당 페이지 특화 프로바이더
- 각 기능 디렉토리 내 `viewmodel.dart`: 상태와 비즈니스 로직 캡슐화
## 4. 주요 패키지 및 종속성
### 4.1. 내부 패키지
앱은 다음과 같은 내부 패키지를 활용합니다:
- **tabling_ui**: 디자인 시스템 구현, UI 컴포넌트 제공
- **tabling_models**: 앱에서 사용되는 데이터 모델 정의
- **tabling_rest_client**: API 통신 클라이언트
- **tabling_shared_data**: 앱 간 공유 데이터
- **tabling_restaurant_card**: 레스토랑 카드 UI 컴포넌트
- **tabling_format**: 날짜, 시간, 금액 등 포맷팅 유틸리티
- **tabling_analytics**: 분석 및 이벤트 추적
- **tabling_image**: 이미지 관련 유틸리티
### 4.2. 외부 종속성
주요 외부 라이브러리:
- **flutter_riverpod**: 상태 관리
- **go_router**: 라우팅
- **firebase_core, firebase_analytics, firebase_messaging 등**: Firebase 서비스
- **cached_network_image**: 네트워크 이미지 캐싱
- **flutter_facebook_auth, kakao_flutter_sdk_user, sign_in_with_apple**: 소셜 로그인
- **infinite_scroll_pagination**: 무한 스크롤
- **easy_debounce**: 입력 디바운싱
- **permission_handler**: 권한 관리
- **sentry_flutter**: 에러 모니터링
- **geolocator**: 위치 정보
- **flutter_local_notifications**: 로컬 알림
- **animations, flutter_animate, lottie**: 애니메이션 효과
## 5. 코드 규칙 및 패턴
### 5.1. 파일 명명 규칙
- **페이지**: `page.dart` (예: `/pages/my/reviews/page.dart`)
- **화면**: `*_screen.dart` (예: `search_screen.dart`)
- **위젯**: 기능/유형에 따른 이름 (예: `tabling_search_field.dart`)
- **프로바이더**: `provider.dart`
- **뷰모델**: `viewmodel.dart` 또는 `view_model.dart`
- **모델**: `*_model.dart` 또는 `entity.dart`
### 5.2. 코드 구조화 패턴
1. **기능별 디렉토리 구조**:
- 각 주요 기능은 자체 디렉토리에 캡슐화됨
- 예: `/pages/my/reviews/` - 리뷰 관련 페이지 및 로직
2. **Provider-ViewModel 패턴**:
- Provider: 상태 관리 및 의존성 주입
- ViewModel: UI 로직과 상태를 캡슐화
- 예: `provider.dart` + `viewmodel.dart`
3. **이벤트 기반 통신**:
- 화면 간 통신은 이벤트 기반 패턴 사용
- `ScreenEvent` 클래스를 통한 일관된 이벤트 처리
- 상위 컴포넌트에 이벤트 위임 (콜백 함수)
## 6. 개발 워크플로우
### 6.1. 새로운 기능 개발
1. **모델 정의**:
- 필요한 데이터 모델이 `tabling_models`에 있는지 확인
- 없다면 추가 요청 또는 로컬 모델 정의
2. **API 통합**:
- `tabling_rest_client`를 통해 API 호출
- 리포지토리 패턴으로 데이터 접근 추상화
3. **상태 관리 설정**:
- Riverpod Provider 및 ViewModel 구현
- 상태 및 비즈니스 로직 구현
4. **UI 구현**:
- Page 컴포넌트 구현 (라우팅 진입점)
- 필요한 Screen 컴포넌트 구현 또는 재사용
- `tabling_ui` 위젯 활용
### 6.2. 환경 설정
- **Flavors**: 개발, 스테이징, 프로덕션 환경 구분
- **환경별 진입점**: `main_develop.dart`, `main_staging.dart`, `main_production.dart`
- **firebase_app_check**: 인증된 앱 요청 보장
## 7. UI/UX 가이드라인
### 7.1. 디자인 시스템
tabling_ui 패키지는 다음과 같은 디자인 시스템 요소를 제공합니다:
- **토큰 시스템**:
- `/tokens/core`: 색상, 간격, 타이포그래피 등 기본 디자인 토큰
- 일관된 디자인 적용을 위해 하드코딩된 값 대신 토큰 사용 권장
- **위젯 컴포넌트**:
- `/widgets`: 버튼, 텍스트 필드, 카드 등 재사용 가능한 UI 컴포넌트
- 커스텀 UI보다 기존 컴포넌트 재사용 권장
- **테마**:
- `/theme`: 앱 전체 테마 및 스타일링
- 앱 테마를 일관되게 유지하기 위해 테마 설정 준수
### 7.2. 반응형 디자인
- **LayoutBuilder 및 MediaQuery** 활용
- 다양한 화면 크기에 적응하는 UI 설계
- 기기 방향 변경 대응
## 8. 테스팅 및 품질 보증
### 8.1. 테스트 유형
- **단위 테스트**: `/test` 디렉토리
- **통합 테스트**: `/integration_test` 디렉토리
- **위젯 테스트**: UI 컴포넌트 테스트
### 8.2. 코드 품질 도구
- **analysis_options.yaml**: 린트 규칙 정의
- **custom_lint**: 추가 린트 규칙
- **lefthook.yml**: 커밋 전 검사
## 9. 배포 및 릴리스
### 9.1. CI/CD
- **codemagic.yaml**: CI/CD 파이프라인 구성
- **GitHub Actions**: 추가 자동화 작업
### 9.2. 버전 관리
- **pubspec.yaml**: 앱 버전 및 빌드 번호 관리
- **melos.yaml**: 모노레포 패키지 버전 관리
## 10. 문제 해결 및 디버깅
### 10.1. 로깅
- **talker_flutter**: 고급 로깅 및 디버깅 도구
- **sentry_flutter**: 에러 모니터링 및 보고
### 10.2. 성능 모니터링
- **firebase_performance**: 앱 성능 모니터링
- **firebase_crashlytics**: 크래시 보고 및 분석
## 11. 공통 개발 작업
### 11.1. 새 페이지 추가
1. `/pages/[feature]/` 디렉토리 생성
2. `page.dart` 파일 구현 (Page 컴포넌트)
3. Provider 및 ViewModel 구현
4. `/router/` 디렉토리에 라우트 등록
### 11.2. 기존 페이지 수정
1. 관련 Page 컴포넌트 식별
2. 필요한 상태 및 이벤트 핸들러 수정
3. 필요에 따라 Screen 또는 Widget 컴포넌트 수정
### 11.3. 새 API 통합
1. `tabling_rest_client`에서 API 엔드포인트 확인/추가
2. 필요한 모델 업데이트/추가
3. Repository 구현/수정
4. Provider 및 ViewModel 업데이트
## 12. 결론
tabling_user 프로젝트는 Page -> Screen -> Widget 패턴과 Riverpod를 사용한 상태 관리를 통해 구조화된 Flutter 앱입니다. 다양한 내부 패키지를 활용하여 일관된 UI/UX 및 기능을 제공합니다. 이 가이드를 참고하여 프로젝트의 구조를 이해하고 효율적으로 개발에 기여할 수 있습니다.