---
title: 안드로이드 앱에서 Parse 이용한 고급 GeoPoint 쿼리 방법
slug: docs-kr/android/data-objects/geopoint-queries
description: 이 가이드에서는 Android 앱에서 Back4App을 사용하여 GeoPoint 쿼리를 수행하는 기술적 방법을 설명합니다.
image: https://www.back4app.com/images/logo-social.png
createdAt: 2024-03-13T16:10:32.675Z
---

# 지오쿼리

## 소개

이 가이드에서는 Android 애플리케이션에서 Parse를 사용하여 GeoPoint 쿼리를 수행하는 방법을 배웁니다.

이 튜토리얼은 <font color="#2166ae">`compileSdk = 30`</font>로 생성된 Android Studio Arctic Fox -2020.3.1에서 만든 앱을 사용합니다.<font color="#2166ae">`minSdk = 23`</font> 및 <font color="#2166ae">`targetSdk = 30`</font>

:::hint{type="success"}
언제든지 이 튜토리얼로 구축된 전체 Android 프로젝트에 대한 액세스를 Github 리포지토리에서 확인할 수 있습니다.

- [코틀린 예제 리포지토리](https://github.com/templates-back4app/Android-Parse-Sdk-Kotlin)
- [자바 예제 리포지토리](https://github.com/templates-back4app/Android-Parse-Sdk-Java)
:::

## 목표

Back4App에 저장된 지오포인트와 Android 지리 위치를 사용하여 지오쿼리를 수행합니다.

우리가 달성할 목표의 미리보기는 다음과 같습니다:

::Image[]{src="https://api.archbee.com/api/optimize/yD3zCY-NNBBIfd0uqcfR5/lxHemJkbJ5XFw2D12fph8_image.png" size="50" width="346" height="750" position="center" showCaption="false"}

## 전제 조건

:::hint{type="info"}
**이 튜토리얼을 완료하려면 다음이 필요합니다:**

- [안드로이드 스튜디오](https://developer.android.com/studio/index.html)
- Back4App에서 생성된 앱.
  - **참고:&#x20;**&#x20;[새 파스 앱 튜토리얼](https://www.back4app.com/docs/get-started/new-parse-app)을 따라 Back4App에서 파스 앱을 만드는 방법을 배우세요.
- Back4App에 연결된 안드로이드 앱.
  - **참고:&#x20;**&#x20;[파스 SDK 설치 튜토리얼](https://www.back4app.com/docs/android/parse-android-sdk)을 따라 Back4App에 연결된 안드로이드 스튜디오 프로젝트를 만드세요.
- 안드로이드 4.1 (젤리빈) 이상에서 실행되는 장치 (또는[ 가상 장치](https://developer.android.com/studio/run/managing-avds.html))
:::

## 시작해봅시다!

:::hint{type="info"}
다음 단계 전에, 우리는 <font color="#2166ae">`Back4App`</font>을(를) 우리의 애플리케이션에 연결해야 합니다. <font color="#2166ae">`appId`</font>와 <font color="#2166ae">`clientKey`</font>를 <font color="#2166ae">`Back4App`</font>에서 <font color="#2166ae">`string.xml`</font> 파일에 저장한 후, <font color="#2166ae">`Parse`</font>를 우리의 <font color="#2166ae">`App.java`</font> 또는 <font color="#2166ae">`App.kt`</font> 파일에서 초기화해야 합니다.
[새 Parse 앱 튜토리얼](https://www.back4app.com/docs/android/parse-android-sdk)을(를) 따라가세요, 만약 <font color="#2166ae">`Parse`</font>를(을) 당신의 앱에 초기화하는 방법을 모른다면.

또는 위에 공유한 github 링크에서 프로젝트를 다운로드하고 <font color="#2166ae">`appId`</font>와 <font color="#2166ae">`clientKey`</font> 부분만 수정할 수 있습니다.
:::

## 1 - Back4App에 데이터 저장하기

:::hint{type="info"}
이 단계에서는, 우리는 <font color="#2166ae">`Parse`</font>가 제공하는 JS 콘솔과 자바스크립트 코드를 사용하여 클래스를 생성하고, 이 클래스에 대한 쿼리를 생성할 것입니다.
:::

클래스를 생성해 보겠습니다. 이 클래스는 이 가이드에서 우리의 쿼리 대상이 될 것입니다. Parse JS 콘솔에서는 JavaScript 코드를 직접 실행하여 JS SDK 명령을 사용하여 애플리케이션 데이터베이스 내용을 쿼리하고 업데이트할 수 있습니다. 아래 코드를 JS 콘솔에서 실행하고 Back4App에 데이터를 삽입하세요.

대시보드에서 JS 콘솔이 어떻게 보이는지 확인해 보세요:



![](https://api.archbee.com/api/optimize/yD3zCY-NNBBIfd0uqcfR5/DCDrBaQtQqrMGcKXZ6hsO_image.png)

다음 예제 내용을 사용하여 <font color="#2166ae">`City`</font> 클래스를 생성하세요:

```java
1   // Add City objects and create table
2   // Note how GeoPoints are created, passing latitude and longitude as arguments
3   // Montevideo
4   City = new Parse.Object('City');
5   City.set('name', 'Montevideo - Uruguay');
6   City.set('location', new Parse.GeoPoint(-34.85553195363169, -56.207280375137955));
7   await City.save();
8
9   // Brasília
10  City = new Parse.Object('City');
11  City.set('name', 'Brasília - Brazil');
12  City.set('location', new Parse.GeoPoint(-15.79485821477289, -47.88391074690196));
13  await City.save();
14
15  // Bogotá
16  City = new Parse.Object('City');
17  City.set('name', 'Bogotá - Colombia');
18  City.set('location', new Parse.GeoPoint(4.69139880891712, -74.06936691331047));
19  await City.save();
20
21  // Mexico City
22  City = new Parse.Object('City');
23  City.set('name', 'Mexico City - Mexico');
24  City.set('location', new Parse.GeoPoint(19.400977162618933, -99.13311378164776));
25  await City.save();
26
27  // Washington, D.C.
28  City = new Parse.Object('City');
29  City.set('name', 'Washington, D.C. - USA');
30  City.set('location', new Parse.GeoPoint(38.930727220189944, -77.04626261880388));
31  await City.save();
32
33  // Ottawa
34  City = new Parse.Object('City');
35  City.set('name', 'Ottawa - Canada');
36  City.set('location', new Parse.GeoPoint(45.41102167733425, -75.695414598736));
37  await City.save();
38
39  console.log('Success!');
```

## &#x20;2 - Android 앱에서 데이터 쿼리하기

이제 클래스에 데이터가 채워졌으므로, GeoPoint 쿼리를 수행할 수 있습니다. 자메이카 킹스턴(위도 18.01808695059913, 경도 -76.79894232253473)에서 가장 가까운 <font color="#2166ae">`City`</font> 결과를 정렬해 보겠습니다. <font color="#2166ae">`ParseQuery.whereNear`</font> 메서드를 사용합니다:

:::CodeblockTabs
```java
1       ParseQuery<ParseObject> query = new ParseQuery<>("City");
2       query.whereNear("location",new ParseGeoPoint(18.018086, -76.798942));
3       query.findInBackground((objects, e) -> {
4           if (e==null){
5               initData(objects);
6           } else {
7               Toast.makeText(MainActivity.this, e.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
8           }
9       });
```

```kotlin
1      val query = ParseQuery<ParseObject>("City")
2      query.whereNear("location", ParseGeoPoint(18.018086, -76.798942))
3      query.findInBackground { objects: List<ParseObject>?, e: ParseException? ->
4          if (e == null) {
5              initData(objects!!)
6          } else {
7              Toast.makeText(this@MainActivity, e.localizedMessage, Toast.LENGTH_SHORT)
8                  .show()
9          }
1 0    }
```
:::

이제 <font color="#2166ae">`ParseQuery.whereWithinKilometers`</font>, 메서드를 사용하여 쿼리를 수행해 보겠습니다. 이 메서드는 GeoPoint 필드가 최대 거리 내에 위치한 모든 결과를 검색합니다. 킹스턴을 다시 참조로 사용하고 거리 제한은 3000km로 설정하겠습니다.

:::CodeblockTabs
```java
1       ParseQuery<ParseObject> query = new ParseQuery<>("City");
2       query.whereWithinKilometers("location",new ParseGeoPoint(18.018086, -76.798942),3000);
3       query.findInBackground((objects, e) -> {
4           if (e==null){
5              initData(objects);
6           } else {
7               Toast.makeText(MainActivity.this, e.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
8           }
9       });
```

```kotlin
1      val query = ParseQuery<ParseObject>("City")
2     query.whereWithinKilometers(
3         "location",
4         ParseGeoPoint(18.018086, -76.798942),
5         3000.0
6     )
7     query.findInBackground { objects: List<ParseObject>?, e: ParseException? ->
8         if (e == null) {
9             initData(objects!!)
10        } else {
11            Toast.makeText(this@MainActivity, e.localizedMessage, Toast.LENGTH_SHORT)
12                .show()
13        }
14    }
```
:::

또 다른 유용한 쿼리 메서드는 <font color="#2166ae">`ParseQuery.whereWithinPolygon`</font>, 이 메서드는 GeoPoint 필드 값이 지정된 다각형 내에 있는 결과를 쿼리합니다. 이 다각형은 최소 세 개의 GeoPoints로 구성된 배열로 이루어져 있습니다. 다각형 경로가 열려 있으면 Parse가 마지막 점과 첫 번째 점을 연결하여 자동으로 닫습니다.
이 예제에서는 대략적으로 남미 대륙을 포함하는 간단한 다각형을 사용하며, 이는 바다에 있는 5개의 먼 GeoPoints로 구성됩니다.

:::CodeblockTabs
```java
1       ParseQuery<ParseObject> query = new ParseQuery<>("City");
2
3       ParseGeoPoint geoPoint1 = new ParseGeoPoint(15.822238344514378, -72.42845934415942);
4       ParseGeoPoint geoPoint2 = new ParseGeoPoint(-0.7433770196268968, -97.44765968406668);
5       ParseGeoPoint geoPoint3 = new ParseGeoPoint(-59.997149373299166, -76.52969196322749);
6       ParseGeoPoint geoPoint4 = new ParseGeoPoint(-9.488786415007201, -18.346101586021952);
7       ParseGeoPoint geoPoint5 = new ParseGeoPoint(15.414859532811047, -60.00625459569375);
8       ParseGeoPoint geoPoint6 = new ParseGeoPoint(41.015137, 28.97953);
9    
10      List<ParseGeoPoint> list = new ArrayList<>();
11      list.add(geoPoint1);
12      list.add(geoPoint2);
13      list.add(geoPoint3);
14      list.add(geoPoint4);
15      list.add(geoPoint5);
16      list.add(geoPoint6);
17      query.whereWithinPolygon("location",list);
18
19      query.findInBackground((objects, e) -> {
20          if (e==null){
21              initData(objects);
22          } else {
23              Toast.makeText(MainActivity.this, e.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
24          }
25      });
```

```kotlin
1      val query = ParseQuery<ParseObject>("City")
2      val geoPoint1 = ParseGeoPoint(15.822238344514378, -72.42845934415942)
3      val geoPoint2 = ParseGeoPoint(-0.7433770196268968, -97.44765968406668)
4      val geoPoint3 = ParseGeoPoint(-59.997149373299166, -76.52969196322749)
5      val geoPoint4 = ParseGeoPoint(-9.488786415007201, -18.346101586021952)
6      val geoPoint5 = ParseGeoPoint(15.414859532811047, -60.00625459569375)
7      val geoPoint6 = ParseGeoPoint(41.015137, 28.97953)
8      val list: MutableList<ParseGeoPoint> =
9          ArrayList()
10     list.add(geoPoint1)
11     list.add(geoPoint2)
12     list.add(geoPoint3)
13     list.add(geoPoint4)
14     list.add(geoPoint5)
15     list.add(geoPoint6)
16     query.whereWithinPolygon("location", list)
17     query.findInBackground { objects: List<ParseObject>?, e: ParseException? ->
18         if (e == null) {
19             initData(objects!!)
20         } else {
21             Toast.makeText(this@MainActivity, e.localizedMessage, Toast.LENGTH_SHORT)
22                .show()
23         }
24     }
```
:::

## 완료되었습니다!

이 가이드를 마치면, Parse에서 GeoPoint 데이터 쿼리가 어떻게 작동하는지와 Android 앱에서 Back4App으로 이를 수행하는 방법을 배웠습니다. 다음 가이드에서는 Parse에서 사용자를 생성하고 관리하는 방법을 확인할 것입니다.
