9a61e2f3912015f07ee71100fae1eed1fc8740d4
1. placeId 기반 중복 체크 제거 - 이전 대화에서 명확히 한 대로 placeId는 매칭에 사용하지 않음 2. 주소 기반 매칭 개선 - 주소가 있을 때만 주소 기반 중복 체크 수행 3. 위치 기반 매칭 추가 - 50m 이내 동일한 이름의 맛집 중복 체크 추가 4. 검색 결과 선택 로직 개선 - 주소가 없을 때 가장 가까운 거리의 업체 선택 5. 카테고리 필터 버그 수정 - 카테고리 표시명과 실제 값 불일치 문제 해결 - 부분 일치 및 정규화된 비교 지원 6. 빈 상태 메시지 개선 - 필터링 중일 때 적절한 안내 메시지 표시 - 필터 초기화 버튼 추가 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
🍽️ 오늘 뭐 먹Z? (LunchPick)
매일 반복되는 점심 메뉴 고민을 해결하는 스마트한 메뉴 추천 앱
📱 소개
**오늘 뭐 먹Z?**는 직장인들의 점심 메뉴 선택 고민을 해결하기 위한 Flutter 기반 모바일 애플리케이션입니다. 네이버 지도에서 맛집을 간편하게 수집하고, 날씨와 거리를 고려한 스마트한 추천을 받을 수 있습니다.
🎯 핵심 가치
- 의사결정 시간 단축: 점심 선택 시간을 10-15분에서 1분으로
- 메뉴 다양성 보장: 중복 방문 방지 알고리즘으로 새로운 경험 제공
- 편리한 맛집 관리: 네이버 지도 URL로 간편하게 맛집 추가
✨ 주요 기능
🎰 랜덤 메뉴 추천
- 날씨 기반 거리 자동 조정 (우천 시 500m 이내)
- n일 이내 재방문 금지 설정
- 카테고리별 필터링
- 1-Tap 추천 시스템
📍 네이버 지도 연동
- 네이버 단축 URL(naver.me) 자동 파싱
- 식당 정보 자동 추출
- 위치 정보 및 카테고리 자동 분류
📊 방문 기록 관리
- 캘린더 뷰로 방문 이력 확인
- 방문 통계 시각화
- 자동 방문 확인 알림 (점심 후 1.5~2시간)
🌦️ 날씨 연동
- 현재 날씨 및 1시간 후 날씨 예보
- 우천 시 가까운 맛집 우선 추천
📱 Bluetooth 공유
- 근처 기기와 맛집 리스트 공유
- 팀 회식 시 빠른 의사결정 지원
🔔 스마트 알림
- 방문 확인 푸시 알림
- 알림 시간 커스터마이징
📸 스크린샷
🛠️ 기술 스택
Frontend
- Framework: Flutter 3.8.1+
- State Management: Riverpod 2.4.0
- Local Database: Hive 2.2.3
- Navigation: Go Router 13.0.0
- Architecture: Clean Architecture + MVVM
API & Services
- 네이버 지도 API: 장소 검색 및 상세 정보
- 기상청 Open API: 실시간 날씨 정보
- Google AdMob: 광고 수익화
주요 라이브러리
dio: HTTP 네트워킹flutter_blue_plus: Bluetooth 통신geolocator: 위치 서비스flutter_local_notifications: 로컬 알림table_calendar: 캘린더 UIadaptive_theme: 다크모드 지원
📁 프로젝트 구조
lib/
├── core/ # 공통 유틸리티, 상수, 위젯
│ ├── constants/ # 앱 상수, 컬러, 타이포그래피
│ ├── errors/ # 예외 처리
│ ├── network/ # 네트워크 클라이언트
│ ├── utils/ # 유틸리티 함수
│ └── widgets/ # 공통 위젯
├── data/ # 데이터 레이어
│ ├── api/ # API 클라이언트
│ ├── datasources/ # 데이터 소스 (로컬/원격)
│ ├── models/ # 데이터 모델
│ └── repositories/ # 레포지토리 구현
├── domain/ # 도메인 레이어
│ ├── entities/ # 비즈니스 엔티티
│ ├── repositories/ # 레포지토리 인터페이스
│ └── usecases/ # 유즈케이스
└── presentation/ # 프레젠테이션 레이어
├── pages/ # 화면
├── providers/ # Riverpod 프로바이더
└── widgets/ # UI 위젯
🚀 시작하기
요구사항
- Flutter SDK 3.8.1 이상
- Dart SDK 3.0 이상
- Android Studio / VS Code
- iOS: Xcode 14.0+ (iOS 빌드 시)
설치 방법
- 저장소 클론
git clone https://gitea.chizstudio.com/julian/lunchpick.git
cd lunchpick
- 의존성 설치
flutter pub get
- API 키 설정
lib/core/constants/api_keys.dart파일 생성:
class ApiKeys {
static const String naverClientId = 'YOUR_NAVER_CLIENT_ID';
static const String naverClientSecret = 'YOUR_NAVER_CLIENT_SECRET';
static const String weatherApiKey = 'YOUR_WEATHER_API_KEY';
static const String admobAppId = 'YOUR_ADMOB_APP_ID';
}
- 코드 생성
flutter pub run build_runner build --delete-conflicting-outputs
개발 모드 실행
# iOS
flutter run -d ios
# Android
flutter run -d android
# Web (실험적)
flutter run -d chrome
프로덕션 빌드
# Android APK
flutter build apk --release
# Android App Bundle
flutter build appbundle --release
# iOS
flutter build ios --release
🧪 테스트
단위 테스트 실행
flutter test
특정 테스트 파일 실행
flutter test test/unit/domain/usecases/recommendation_engine_test.dart
테스트 커버리지
flutter test --coverage
genhtml coverage/lcov.info -o coverage/html
📝 문서
자세한 문서는 doc/ 디렉토리를 참조하세요:
🤝 기여하기
브랜치 전략
main: 프로덕션 배포 브랜치develop: 개발 브랜치feature/*: 기능 개발bugfix/*: 버그 수정hotfix/*: 긴급 수정
커밋 컨벤션
type(scope): 간단한 설명
상세 설명 (선택사항)
Resolves: #이슈번호
타입:
feat: 새로운 기능fix: 버그 수정docs: 문서 수정style: 코드 포맷팅refactor: 리팩토링test: 테스트 코드chore: 빌드, 패키지 관련
Pull Request 가이드라인
develop브랜치에서 feature 브랜치 생성- 작업 완료 후 PR 생성
- 코드 리뷰 후 머지
- 브랜치 삭제
📄 라이센스
이 프로젝트는 MIT 라이센스 하에 배포됩니다. 자세한 내용은 LICENSE 파일을 참조하세요.
📞 연락처
- 개발자: NatureBridgeAI
- 이메일: contact@naturebridgeai.com
- 이슈 트래커: GitHub Issues
Built with ❤️ by NatureBridgeAI
Description
Languages
Dart
75.7%
HTML
17.5%
C++
3.3%
CMake
2.6%
Ruby
0.4%
Other
0.5%



