[flutter] 플러터 geolocator를 이용한 위치 기반 실시간 도서 검색 애플리케이션 개발

이번 프로젝트에서는 플러터의 geolocator 패키지를 활용하여 위치 기반 실시간 도서 검색 애플리케이션을 개발해보려고 합니다. 이 애플리케이션은 사용자의 현재 위치를 기반으로 근처 도서 매장에서 판매되는 도서 목록을 실시간으로 보여줍니다.

1. geolocator 패키지 설치

먼저, pubspec.yaml 파일에 geolocator 패키지를 추가해야 합니다. 아래와 같이 dependencies 섹션에 패키지 이름과 버전을 추가합니다:

dependencies:
  flutter:
    sdk: flutter

  geolocator: ^7.0.3

이후 터미널을 열고 다음 명령어를 실행하여 패키지를 설치합니다:

flutter pub get

2. 위치 권한 요청

앱이 사용자의 위치 정보에 접근하기 위해서는 위치 권한을 요청해야 합니다. geolocator 패키지를 사용하여 위치 권한을 요청하는 코드를 작성해봅시다.

먼저, main.dart 파일의 StatefulWidget 클래스를 생성합니다. 그 다음, initState 메서드에서 geolocator 패키지를 초기화하고 위치 권한을 요청합니다.

import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';

class BookSearchApp extends StatefulWidget {
  @override
  _BookSearchAppState createState() => _BookSearchAppState();
}

class _BookSearchAppState extends State<BookSearchApp> {
  @override
  void initState() {
    super.initState();
    _initializeGeolocator();
  }

  void _initializeGeolocator() async {
    bool isLocationEnabled = await Geolocator.isLocationServiceEnabled();
    if (!isLocationEnabled) {
      // 위치 권한 요청
      LocationPermission permission = await Geolocator.requestPermission();
      if (permission == LocationPermission.denied) {
        // 권한 거부됨
        // TODO: 사용자에게 위치 권한이 필요하다는 메시지를 보여줌
      } else if (permission == LocationPermission.deniedForever) {
        // 영구히 권한 거부됨
        // TODO: 앱 설정으로 사용자를 안내하여 위치 권한을 허용할 수 있도록 함
      }
    }
  }
  
  // TODO: 애플리케이션 화면 구성 및 도서 검색 기능 구현
}

위 코드에서는 Geolocator.isLocationServiceEnabled() 메서드를 사용하여 사용자의 위치 서비스가 활성화되어 있는지 확인하고, 비활성화된 경우 위치 권한 요청을 합니다. 요청한 권한이 거부되었을 경우에 대한 처리도 함께 구현되어 있습니다.

3. 위치 정보 가져오기

위치 권한이 허용된다면, geolocator 패키지를 사용하여 사용자의 현재 위치 정보를 가져올 수 있습니다. Geolocator.getCurrentPosition() 메서드를 호출하여 사용자의 위도(latitude)와 경도(longitude)를 얻을 수 있습니다.

void _getCurrentLocation() async {
  Position position = await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
  double latitude = position.latitude;
  double longitude = position.longitude;
  
  // TODO: 위치 기반 도서 매장 검색 및 결과 처리
}

위 코드에서는 desiredAccuracy 매개변수를 사용하여 위치 정보의 정확도를 설정하고 있습니다. LocationAccuracy.high로 설정하여 최대한 정확한 위치 정보를 얻을 수 있도록 합니다.

4. 위치 기반 도서 매장 검색 및 결과 처리

위치 정보를 얻은 후에는 해당 위치 주변의 도서 매장에서 판매되는 도서 목록을 검색하여 애플리케이션에 표시하면 됩니다. 이 부분은 서버와의 통신이 필요하므로, API 요청 및 응답 처리 로직을 추가해야 합니다.

서버와의 통신은 http 패키지를 사용하여 구현할 수 있으며, 응답 데이터는 JSON 형식으로 주고 받을 수 있습니다. 예를 들어, 도서 매장 정보를 검색하는 API를 호출한 후에는 응답 데이터를 파싱하여 도서 목록을 얻고, 이를 화면에 표시하면 됩니다.

import 'package:http/http.dart' as http;
import 'dart:convert';

void _searchBookstores(double latitude, double longitude) async {
  String apiUrl = 'https://example.com/api/bookstores';
  Map<String, dynamic> requestBody = {
    'latitude': latitude,
    'longitude': longitude,
  };

  http.Response response = await http.post(
    Uri.parse(apiUrl),
    body: jsonEncode(requestBody),
    headers: {'Content-Type': 'application/json'},
  );

  if (response.statusCode == 200) {
    // 응답 데이터 파싱
    List<dynamic> bookstoreList = jsonDecode(response.body);
    
    // TODO: 도서 목록을 화면에 표시
  } else {
    // API 요청 실패
    // TODO: 사용자에게 실패 메시지를 보여줌
  }
}

위 코드에서는 http 패키지를 사용하여 POST 방식으로 API를 호출하고 있습니다. API 요청이 성공한 경우 응답 데이터를 파싱하여 도서 목록을 얻을 수 있습니다.

이제 애플리케이션의 화면 구성 및 검색 기능을 완성하면 됩니다. Scaffold, ListView.builder, TextFormField 등을 사용하여 UI를 작성하고, 위에서 작성한 메서드들을 적절히 활용하여 위치 정보를 가져오고 도서 매장 검색을 수행하면 됩니다.

여기까지 플러터 geolocator를 이용한 위치 기반 실시간 도서 검색 애플리케이션의 개발 방법에 대해 알아보았습니다. 이를 참고하여 자신만의 독특한 애플리케이션을 개발해보세요!

참고 자료