LunchPick(오늘 뭐 먹Z?) Flutter 앱의 초기 구현입니다. 주요 기능: - 네이버 지도 연동 맛집 추가 - 랜덤 메뉴 추천 시스템 - 날씨 기반 거리 조정 - 방문 기록 관리 - Bluetooth 맛집 공유 - 다크모드 지원 기술 스택: - Flutter 3.8.1+ - Riverpod 상태 관리 - Hive 로컬 DB - Clean Architecture 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
110 lines
4.0 KiB
Dart
110 lines
4.0 KiB
Dart
import 'dart:convert';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:lunchpick/data/api/naver_api_client.dart';
|
|
import 'package:lunchpick/data/datasources/remote/naver_map_parser.dart';
|
|
|
|
void main() {
|
|
test('Debug: 네이버 검색 API 전체 응답 확인', () async {
|
|
final parser = NaverMapParser();
|
|
final apiClient = NaverApiClient();
|
|
|
|
try {
|
|
print('\n========== 네이버 검색 API 디버깅 시작 ==========\n');
|
|
|
|
// 테스트 URL
|
|
const testUrl = 'https://pcmap.place.naver.com/restaurant/1638379069/home';
|
|
const placeId = '1638379069';
|
|
|
|
// 1. 한글 텍스트 추출
|
|
print('1. 한글 텍스트 추출 중...');
|
|
final koreanData = await apiClient.fetchKoreanTextsFromPcmap(placeId);
|
|
|
|
print('\n추출된 한글 텍스트:');
|
|
if (koreanData['koreanTexts'] != null) {
|
|
final texts = koreanData['koreanTexts'] as List;
|
|
for (var i = 0; i < texts.length && i < 10; i++) {
|
|
print(' [$i] ${texts[i]}');
|
|
}
|
|
}
|
|
|
|
print('\nJSON-LD 상호명: ${koreanData['jsonLdName']}');
|
|
print('Apollo State 상호명: ${koreanData['apolloStateName']}');
|
|
|
|
// 2. 검색할 키워드 결정
|
|
String searchQuery = '';
|
|
if (koreanData['jsonLdName'] != null) {
|
|
searchQuery = koreanData['jsonLdName'] as String;
|
|
} else if (koreanData['apolloStateName'] != null) {
|
|
searchQuery = koreanData['apolloStateName'] as String;
|
|
} else if (koreanData['koreanTexts'] != null && (koreanData['koreanTexts'] as List).isNotEmpty) {
|
|
searchQuery = (koreanData['koreanTexts'] as List).first as String;
|
|
}
|
|
|
|
print('\n2. 검색 키워드: "$searchQuery"');
|
|
|
|
// 3. 네이버 로컬 검색 API 호출
|
|
print('\n3. 네이버 검색 API 호출 중...');
|
|
final searchResults = await apiClient.searchLocal(
|
|
query: searchQuery,
|
|
display: 10,
|
|
);
|
|
|
|
print('\n========== 검색 API 전체 응답 (JSON) ==========');
|
|
|
|
// 각 검색 결과를 자세히 출력
|
|
for (var i = 0; i < searchResults.length; i++) {
|
|
final result = searchResults[i];
|
|
print('\n--- 검색 결과 #$i ---');
|
|
print('상호명: ${result.title}');
|
|
print('카테고리: ${result.category}');
|
|
print('설명: ${result.description}');
|
|
print('전화번호: ${result.telephone}');
|
|
print('도로명주소: ${result.roadAddress}');
|
|
print('지번주소: ${result.address}');
|
|
print('링크: ${result.link}');
|
|
print('좌표 X (경도): ${result.mapx}');
|
|
print('좌표 Y (위도): ${result.mapy}');
|
|
|
|
// Place ID 추출
|
|
final extractedPlaceId = result.extractPlaceId();
|
|
print('추출된 Place ID: $extractedPlaceId');
|
|
print('타겟 Place ID와 일치?: ${extractedPlaceId == placeId}');
|
|
|
|
// 좌표 변환
|
|
if (result.mapx != null && result.mapy != null) {
|
|
final lat = result.mapy! / 10000000.0;
|
|
final lng = result.mapx! / 10000000.0;
|
|
print('변환된 좌표: $lat, $lng');
|
|
}
|
|
}
|
|
|
|
print('\n========== 분석 결과 ==========');
|
|
print('총 검색 결과 수: ${searchResults.length}');
|
|
|
|
// Place ID가 일치하는 결과 찾기
|
|
var matchingResults = <int>[];
|
|
for (var i = 0; i < searchResults.length; i++) {
|
|
final extractedId = searchResults[i].extractPlaceId();
|
|
if (extractedId == placeId) {
|
|
matchingResults.add(i);
|
|
}
|
|
}
|
|
|
|
if (matchingResults.isNotEmpty) {
|
|
print('✅ Place ID가 일치하는 결과: ${matchingResults.join(', ')}번째');
|
|
} else {
|
|
print('❌ Place ID가 일치하는 결과를 찾을 수 없음');
|
|
}
|
|
|
|
print('\n========== 테스트 완료 ==========\n');
|
|
|
|
} catch (e, stackTrace) {
|
|
print('\n❌ 오류 발생: $e');
|
|
print('\n스택 트레이스:');
|
|
print(stackTrace);
|
|
} finally {
|
|
parser.dispose();
|
|
apiClient.dispose();
|
|
}
|
|
});
|
|
} |