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:
@@ -34,9 +34,12 @@ class NaverApiClient {
|
||||
_proxyClient = NaverProxyClient(networkClient: _networkClient);
|
||||
}
|
||||
|
||||
/// 네이버 로컬 검색 API 호출
|
||||
/// 네이버 로컬 검색 API 호출 (현재 비활성화됨)
|
||||
///
|
||||
/// 검색어와 좌표를 기반으로 주변 식당을 검색합니다.
|
||||
/// 개인정보 처리방침 및 운영 정책에 따라
|
||||
/// 네이버 로컬 검색 Open API(키 기반 검색)는 사용하지 않는다.
|
||||
/// 이 메서드는 네트워크 요청을 보내지 않고 항상 빈 리스트를 반환한다.
|
||||
/// (향후 정책 변경 시, 기존 구현을 복원하여 사용할 수 있다.)
|
||||
Future<List<NaverLocalSearchResult>> searchLocal({
|
||||
required String query,
|
||||
double? latitude,
|
||||
@@ -45,14 +48,10 @@ class NaverApiClient {
|
||||
int start = 1,
|
||||
String sort = 'random',
|
||||
}) async {
|
||||
return _localSearchApi.searchLocal(
|
||||
query: query,
|
||||
latitude: latitude,
|
||||
longitude: longitude,
|
||||
display: display,
|
||||
start: start,
|
||||
sort: sort,
|
||||
AppLogger.debug(
|
||||
'[NaverApiClient] searchLocal 호출됨 - 로컬 검색 Open API는 현재 비활성화 상태입니다.',
|
||||
);
|
||||
return <NaverLocalSearchResult>[];
|
||||
}
|
||||
|
||||
/// 단축 URL을 실제 URL로 변환
|
||||
|
||||
@@ -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;
|
||||
},
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user