# 프로젝트 구조도 ## 1. 전체 구조 개요 ``` lunchpick/ ├── lib/ │ ├── core/ # 핵심 공통 모듈 │ │ ├── constants/ # 상수 정의 │ │ ├── errors/ # 에러 및 예외 처리 │ │ ├── services/ # 공통 서비스 │ │ ├── utils/ # 유틸리티 함수 │ │ └── widgets/ # 공통 위젯 │ │ │ ├── data/ # 데이터 계층 │ │ ├── datasources/ # 데이터 소스 │ │ │ ├── local/ # 로컬 데이터 소스 │ │ │ └── remote/ # 원격 데이터 소스 │ │ ├── models/ # 데이터 모델 (DTO) │ │ └── repositories/ # 레포지토리 구현체 │ │ │ ├── domain/ # 도메인 계층 │ │ ├── entities/ # 도메인 엔티티 │ │ ├── repositories/ # 레포지토리 인터페이스 │ │ └── usecases/ # 유스케이스 (비즈니스 로직) │ │ │ ├── presentation/ # 프레젠테이션 계층 │ │ ├── pages/ # 화면 단위 구성 │ │ ├── providers/ # 상태 관리 (Riverpod) │ │ └── widgets/ # 프레젠테이션 공통 위젯 │ │ │ └── main.dart # 앱 진입점 │ ├── test/ # 테스트 코드 ├── doc/ # 문서 └── pubspec.yaml # 의존성 관리 ``` ## 2. 계층별 상세 구조 ### 2.1 Core Layer (핵심 모듈) ``` core/ ├── constants/ │ ├── api_keys.dart # API 키 관리 │ ├── app_colors.dart # 색상 테마 │ ├── app_constants.dart # 앱 전역 상수 │ ├── app_typography.dart # 텍스트 스타일 │ └── categories.dart # 카테고리 정의 │ ├── errors/ │ ├── exceptions.dart # 커스텀 예외 │ └── failures.dart # 실패 타입 정의 │ ├── services/ │ └── notification_service.dart # 알림 서비스 │ ├── utils/ │ ├── distance_calculator.dart # 거리 계산 유틸 │ └── validators.dart # 입력 검증 유틸 │ └── widgets/ ├── empty_state_widget.dart # 빈 상태 위젯 ├── error_widget.dart # 에러 표시 위젯 └── loading_indicator.dart # 로딩 인디케이터 ``` ### 2.2 Data Layer (데이터 계층) ``` data/ ├── datasources/ │ ├── local/ │ │ └── (Hive 데이터소스) │ │ │ └── remote/ │ ├── naver_map_parser.dart # 네이버 지도 파서 (기존) │ ├── naver_local_api_client.dart # 네이버 로컬 API (신규) │ └── naver_url_processor.dart # URL 처리기 (신규) │ ├── models/ │ ├── naver_local_search_result.dart # API 검색 결과 모델 (신규) │ └── naver_place_detail.dart # 장소 상세 모델 (신규) │ └── repositories/ ├── recommendation_repository_impl.dart ├── restaurant_repository_impl.dart ├── settings_repository_impl.dart ├── visit_repository_impl.dart └── weather_repository_impl.dart ``` ### 2.3 Domain Layer (도메인 계층) ``` domain/ ├── entities/ │ ├── recommendation_record.dart # 추천 기록 │ ├── restaurant.dart # 식당 엔티티 │ ├── share_device.dart # 공유 디바이스 │ ├── user_settings.dart # 사용자 설정 │ ├── visit_record.dart # 방문 기록 │ └── weather_info.dart # 날씨 정보 │ ├── repositories/ │ ├── recommendation_repository.dart │ ├── restaurant_repository.dart │ ├── settings_repository.dart │ ├── visit_repository.dart │ └── weather_repository.dart │ └── usecases/ └── recommendation_engine.dart # 추천 엔진 ``` ### 2.4 Presentation Layer (프레젠테이션 계층) ``` presentation/ ├── pages/ │ ├── calendar/ # 캘린더 화면 │ │ ├── calendar_screen.dart │ │ └── widgets/ │ │ ├── visit_confirmation_dialog.dart │ │ ├── visit_record_card.dart │ │ └── visit_statistics.dart │ │ │ ├── main/ # 메인 화면 │ │ └── main_screen.dart │ │ │ ├── random_selection/ # 랜덤 선택 화면 │ │ ├── random_selection_screen.dart │ │ └── widgets/ │ │ └── recommendation_result_dialog.dart │ │ │ ├── restaurant_list/ # 식당 목록 화면 │ │ ├── restaurant_list_screen.dart │ │ └── widgets/ │ │ ├── add_restaurant_dialog.dart │ │ └── restaurant_card.dart │ │ │ ├── settings/ # 설정 화면 │ │ ├── settings_screen.dart │ │ └── widgets/ │ │ │ ├── share/ # 공유 화면 │ │ ├── share_screen.dart │ │ └── widgets/ │ │ │ └── splash/ # 스플래시 화면 │ └── splash_screen.dart │ ├── providers/ │ ├── di_providers.dart # 의존성 주입 │ ├── location_provider.dart # 위치 상태 관리 │ ├── notification_handler_provider.dart │ ├── notification_provider.dart │ ├── recommendation_provider.dart │ ├── restaurant_provider.dart │ ├── settings_provider.dart │ ├── visit_provider.dart │ └── weather_provider.dart │ └── widgets/ └── category_selector.dart # 카테고리 선택기 ``` ## 3. 데이터 흐름도 ```mermaid graph TD A[사용자 인터페이스] -->|사용자 액션| B[Presentation Layer] B -->|Provider/State| C[Domain Layer] C -->|Use Case 실행| D[Data Layer] D -->|Repository 구현| E[Data Sources] E --> F[Local Data Source
Hive] E --> G[Remote Data Source
APIs] G --> H[네이버 지도 파서] G --> I[네이버 로컬 API] G --> J[날씨 API] F -->|데이터 반환| D G -->|데이터 반환| D D -->|엔티티 반환| C C -->|결과 반환| B B -->|UI 업데이트| A ``` ## 4. 네이버 URL 처리 플로우 ```mermaid graph LR A[네이버 단축 URL] --> B[NaverUrlProcessor] B --> C{URL 유효성
검증} C -->|유효| D[NaverMapParser] C -->|무효| E[에러 반환] D --> F[단축 URL
리다이렉션] F --> G[HTML
스크래핑] G --> H[기본 정보
추출] H --> I[NaverLocalApiClient] I --> J[로컬 API
검색] J --> K[결과 매칭] K --> L[정보 병합] L --> M[Restaurant
엔티티 생성] M --> N[Repository] N --> O[Hive 저장] ``` ## 5. 의존성 관계도 ```mermaid graph BT A[main.dart] --> B[Presentation Layer] B --> C[Domain Layer] C --> D[Data Layer] D --> E[Core Layer] B --> E D --> F[External Packages] F --> G[flutter_riverpod] F --> H[hive] F --> I[dio] F --> J[http] F --> K[html] E --> L[Flutter SDK] ``` ## 6. 모듈별 책임 ### 6.1 Core 모듈 - **역할**: 앱 전체에서 공통으로 사용되는 기능 제공 - **책임**: - 상수 및 설정 관리 - 공통 유틸리티 제공 - 전역 위젯 제공 - 에러 처리 표준화 ### 6.2 Data 모듈 - **역할**: 데이터 접근 및 변환 - **책임**: - 외부 API 통신 - 로컬 데이터베이스 관리 - DTO ↔ Entity 변환 - 캐싱 처리 ### 6.3 Domain 모듈 - **역할**: 비즈니스 로직 정의 - **책임**: - 엔티티 정의 - 비즈니스 규칙 구현 - 유스케이스 정의 - 레포지토리 인터페이스 정의 ### 6.4 Presentation 모듈 - **역할**: 사용자 인터페이스 및 상태 관리 - **책임**: - UI 렌더링 - 사용자 입력 처리 - 상태 관리 (Riverpod) - 네비게이션 처리 ## 7. 확장 포인트 ### 7.1 새로운 데이터 소스 추가 ``` data/datasources/remote/ ├── kakao_map_parser.dart # 카카오맵 지원 ├── google_maps_parser.dart # 구글맵 지원 └── delivery_app_parser.dart # 배달앱 지원 ``` ### 7.2 새로운 기능 모듈 추가 ``` presentation/pages/ ├── reviews/ # 리뷰 기능 ├── social/ # 소셜 기능 └── analytics/ # 통계 기능 ``` ### 7.3 새로운 저장소 추가 ``` domain/repositories/ ├── review_repository.dart # 리뷰 저장소 ├── user_repository.dart # 사용자 저장소 └── analytics_repository.dart # 분석 저장소 ```