fix(privacy): 개인정보 처리방침 및 지오코딩 동작 정리

- 스토어 설명에 네이버 지도앱 공유 링크를 수정하지 않고 그대로 붙여넣어야 한다는 안내를 추가하고, 실제 동작과 맞는 URL 사용 조건을 명시했습니다.
- doc/store_desc/privacy_policy.md에 현재 구현 기준(키 기반 네이버 로컬 검색 미사용, 네이버 지도 웹/GraphQL 파싱, VWorld+Nominatim 지오코딩, 기상청 Open API, Google AdMob)을 반영한 개인정보 처리방침을 추가/정리했습니다.
- lib/data/api/naver_api_client.dart에서 searchLocal 구현을 변경하여 네이버 로컬 검색 Open API를 더 이상 호출하지 않고, 항상 빈 결과를 반환하면서 디버그 로그만 남기도록 비활성화했습니다.
- 네이버 URL/검색으로 가져온 식당 정보를 편집하는 뷰에서 위도/경도 필드를 선택 입력으로 완화하여, 지오코딩 실패 시에도 폼 검증만으로 저장이 막히지 않도록 조정했습니다.
- AddRestaurantViewModel._resolveCoordinates에 allowFallbackWhenGeocodingFails 플래그를 추가하고, 네이버 URL 기반 추가 시에는 지오코딩 실패를 현재 위치/기본 좌표로 자동 대체하지 않고 명시적인 오류로 처리하여, 잘못된 주소로 저장되지 않도록 했습니다.
This commit is contained in:
JiWoong Sul
2025-12-05 19:26:11 +09:00
parent 0c6b10d4f6
commit cf7e187985
5 changed files with 225 additions and 26 deletions

View File

@@ -183,12 +183,11 @@ class _FetchedRestaurantJsonViewState extends State<FetchedRestaurantJsonView> {
),
onChanged: widget.onFieldChanged,
validator: (value) {
if (value == null || value.isEmpty) {
return '위도를 입력해주세요';
}
final latitude = double.tryParse(value);
if (latitude == null || latitude < -90 || latitude > 90) {
return '올바른 위도값을 입력해주세요';
if (value != null && value.isNotEmpty) {
final latitude = double.tryParse(value);
if (latitude == null || latitude < -90 || latitude > 90) {
return '올바른 위도값을 입력해주세요';
}
}
return null;
},
@@ -208,14 +207,13 @@ class _FetchedRestaurantJsonViewState extends State<FetchedRestaurantJsonView> {
),
onChanged: widget.onFieldChanged,
validator: (value) {
if (value == null || value.isEmpty) {
return '경도를 입력해주세요';
}
final longitude = double.tryParse(value);
if (longitude == null ||
longitude < -180 ||
longitude > 180) {
return '올바른 경도값을 입력해주세요';
if (value != null && value.isNotEmpty) {
final longitude = double.tryParse(value);
if (longitude == null ||
longitude < -180 ||
longitude > 180) {
return '올바른 경도값을 입력해주세요';
}
}
return null;
},

View File

@@ -304,6 +304,7 @@ class AddRestaurantViewModel extends StateNotifier<AddRestaurantState> {
jibunAddress: state.formData.jibunAddress,
fallbackLatitude: fetchedData.latitude,
fallbackLongitude: fetchedData.longitude,
allowFallbackWhenGeocodingFails: false,
);
restaurantToSave = fetchedData.copyWith(
@@ -436,6 +437,7 @@ class AddRestaurantViewModel extends StateNotifier<AddRestaurantState> {
required String jibunAddress,
double? fallbackLatitude,
double? fallbackLongitude,
bool allowFallbackWhenGeocodingFails = true,
}) async {
final parsedLat = double.tryParse(latitudeText);
final parsedLon = double.tryParse(longitudeText);
@@ -468,8 +470,17 @@ class AddRestaurantViewModel extends StateNotifier<AddRestaurantState> {
);
} else {
state = state.copyWith(
geocodingStatus: '지오코딩 실패: $address, 현재 위치/기본 좌표로 대체',
geocodingStatus: '지오코딩 실패: $address, 주소를 다시 확인해 주세요.',
);
if (!allowFallbackWhenGeocodingFails) {
state = state.copyWith(
errorMessage:
'주소가 지도에서 인식되지 않습니다. '
'도로명 주소 전체를 정확히 입력했는지 확인해 주세요.',
);
throw Exception('지오코딩 실패: $address');
}
}
}