현 프로젝트 시작단계

8. 탈퇴하기 로직 / 네이버 지도 길찾기 제작

깡 딱 2025. 3. 14. 23:40
728x90

 

느낀 점

이제 기초적인 건 전부 다 만들었는데

진짜 세부적인 게 너무 힘들다는 느낌이 든다 ㅋㅋㅋㅋㅋ

일단 오늘 리스트 불러와서 마커에 데이터를 넣는 거까지는 그래도 할만했는데 

네이버지도 진짜 왜 안되는지 전혀 모르겠다.. 아직 잘 몰라서 그런가 3트째 실패다.

 

 

 

 

 

탈퇴하기 

탈퇴하기 로직인데 뭐 설명할 게 많이 없는 거 같다.

누르면 UI 색 변하게 하는 건 쉬웠는데 

데이터베이스를 만들어야 된다는 게 조금 까다롭다.

CREATE TABLE withdrawal_reasons (
  id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,  -- 고유 ID
  user_id UUID REFERENCES auth.users(id) ON DELETE CASCADE,  -- 유저 ID (외래키)
  reason TEXT NOT NULL,  -- 탈퇴 사유
  created_at TIMESTAMP DEFAULT timezone('utc', now())  -- 저장 시간
);

 

 

외래키와 기본키를 설정해 주고 

 

 

 

 

 

탈퇴를 하면 사용자 UUID와 이유를 저장했다.

만약 두 개 이상을 선택하면 

데이터베이스에 두 개가 생기는 구조다. 

이건 뭐 많이 받으면 피드백이 되니까 다중 선택이 가능하게 하였다.

 

 

탈퇴하기를 하면 

Future<void> saveWithdrawalReason() async {
  final supabase = Supabase.instance.client;
  final user = supabase.auth.currentUser;

  if (user == null) {
    print("사용자가 로그인되어 있지 않습니다.");
    return;
  }

  try {
    List<String> selectedReasonsList = selectedIndexes.map((index) => reasons[index]).toList();
    String? otherText = selectedIndexes.contains(reasons.length - 1) ? otherReasonController.text.trim() : null;

    for (String reason in selectedReasonsList) {
      await supabase.from('withdrawal_reasons').insert({
        'user_id': user.id,
        'reason': reason == '기타' ? otherText : reason,
      });
    }
    print("탈퇴 사유가 성공적으로 저장되었습니다.");

    // 탈퇴 후 로그인 화면으로 이동
    Navigator.push(
      context,
      MaterialPageRoute(builder: (context) => login_total_screen()), // Mmmm4는 이동할 화면의 위젯입니다.
    );
  } catch (e) {
    print("탈퇴 사유 저장 중 오류 발생: $e");
  }
}

 

 

탈퇴하기 실제로 로직은 넣지 않았다. 

7일 뒤에 정보를 삭제해야 된다. 사용자가 다시 돌아올 수 있으니까.

또한 다시 돌아왔을 때 7일 뒤에 삭제되는 로직을 따로 넣어줘야 된다.

 

 

 

 

 

 

 

 

 

 

 

 

네이버 길찾기

 

 

길 찾기 버튼을 눌렀을 때 

네이버지도앱으로 이동 > 도착지에 내가 누른 마커정보를 넣기

 

간단한 로직인줄알았는데 

https://lpla.tistory.com/131

 

네이버 지도 API 길찾기 - 출발지와 도착지 입력

1. Nclound 웹페이지에 길찾기 버튼을 만들고 클릭하면 네이버 지도 어플을 실행하여 출발지는 GPS상 내 현재 위치, 목적지는 미리 정해둔 어떤 장소로 하여 길찾기 기능을 만들고자 한다. 일반적인

lpla.tistory.com

 

이거 참고해서 만들었는데 

자꾸 도착지에 정보가 안 간다.

 

 

 

 

 

 

위치 권한 요청하고 현재 위치를 가져와서 출발지까지는 아무 문제 없이 된다.

// 📌 1️⃣ 위치 권한 요청 + 현재 위치 가져오는 함수
Future<Position?> getCurrentLocation() async {
  bool serviceEnabled;
  LocationPermission permission;

  // ✅ 위치 서비스 활성화 여부 확인
  serviceEnabled = await Geolocator.isLocationServiceEnabled();
  if (!serviceEnabled) {
    print("❌ 위치 서비스가 비활성화됨");
    return null;
  }

  // ✅ 위치 권한 확인 및 요청
  permission = await Geolocator.checkPermission();
  if (permission == LocationPermission.denied) {
    permission = await Geolocator.requestPermission();
    if (permission == LocationPermission.denied) {
      print("🚨 사용자가 위치 권한을 거부함");
      return null;
    }
  }

  // ✅ 권한이 영구적으로 거부된 경우
  if (permission == LocationPermission.deniedForever) {
    print("🚨 위치 권한이 영구적으로 거부됨");
    return null;
  }

  // ✅ 최종적으로 위치 가져오기
  return await Geolocator.getCurrentPosition(
    desiredAccuracy: LocationAccuracy.high,
  );
}

 

 

근데 도착지가 자꾸 안 들어가진다. 진짜 속 터지는 게 

I/flutter ( 1672): 🚀 출발지 위도: 37.6119938, 경도: 127.0582237
I/flutter ( 1672): 🏁 도착지 위도: 36.1234229, 경도: 128.1146402
I/flutter ( 1672): 📍 도착지 이름: 123

 

또 위도 경도 값은 잘 받아오는데 

 

도착지가 안 들어간다는 게 말이 안돼서 

 

찾아 본결과 

내가 볼 땐 위도 경도값이 부족한가? 생각했다.

그리고 도착지 코드를 잘못 적었나? 생각했고 

 

둘 다 안된다..

 

코드는 

 

도착지 코드인데 내가 생각했을 때 문제는 URI 갈 때 오류 나는 거 같다.

APP NAME도 잘 적었고.. 대체 왜..?

 

내일은 일단 도착지도 위도경도로 넣어봐야겠다 현재는 도착지는 주소값으로 넣었는데 그게 문제가 되는 건가 생각이 든다.

// 📌 2️⃣ 네이버 지도 길찾기 실행 함수 (도착지 주소 포함)
Future<void> navigateToDestination(double latitude, double longitude, String destinationName) async {
  try {
    Position? currentPosition = await getCurrentLocation();
    if (currentPosition == null) {
      print("⚠️ 위치 정보를 가져올 수 없음");
      return;
    }

    double startLat = double.parse(currentPosition.latitude.toStringAsFixed(7));
    double startLng = double.parse(currentPosition.longitude.toStringAsFixed(7));
    double endLat = double.parse(latitude.toStringAsFixed(7));
    double endLng = double.parse(longitude.toStringAsFixed(7));

    print("🚀 출발지 위도: $startLat, 경도: $startLng");
    print("🏁 도착지 위도: $endLat, 경도: $endLng");
    print("📍 도착지 이름: ${Uri.encodeComponent(destinationName)}");

    final url = Uri.parse(
      "nmap://route/public?slat=$startLat&slng=$startLng&dlat=$endLat&dlng=$endLng&rname=${Uri.encodeComponent(destinationName)}&appname=앱이름",
    );

    print("🔗 네이버 지도 URL: $url");

    if (await canLaunchUrl(url)) {
      await launchUrl(url);
    } else {
      final webUrl = Uri.parse(
        "https://map.naver.com/v5/directions/-/-/$latitude,$longitude?name=${Uri.encodeComponent(destinationName)}",
      );
      print("🌍 웹 URL: $webUrl");
      await launchUrl(webUrl);
    }
  } catch (e) {
    print("🚨 길찾기 실행 오류: $e");
  }
}
728x90