---
title: 안드로이드 앱에서 Parse를 활용한 관계형 쿼리 구현하기
slug: docs-kr/android/data-objects/query-relations
description: Back4App 사용하여 안드로이드에서 Parse 관계형 쿼리 설정 및 구현 방법 학습.
image: https://www.back4app.com/images/logo-social.png
createdAt: 2024-03-13T15:21:17.973Z
---

# 안드로이드에서의 관계형 쿼리

## 소개

이 가이드에서는 Parse에서 관계형 쿼리를 수행하고 이러한 쿼리를 사용하여 안드로이드 앱을 구현합니다. Back4App과 안드로이드를 사용하여 현실적인 데이터를 설정하고 쿼리하는 방법을 배웁니다.

이 튜토리얼은 <font color="#2166ae">`compileSdk = 30`</font>로 생성된 앱을 사용합니다. <font color="#2166ae">`minSdk = 23`</font> 및 <font color="#2166ae">`targetSdk = 30`</font>

:::hint{type="success"}
언제든지 이 튜토리얼로 구축된 전체 안드로이드 프로젝트에 접근할 수 있습니다. 우리의 Github 저장소에서 확인하세요.

- [코틀린 예제 저장소](https://github.com/templates-back4app/Android-Parse-Sdk-Kotlin)
- [자바 예제 저장소](https://github.com/templates-back4app/Android-Parse-Sdk-Java)
:::

## 목표

우리의 목표는 <font color="#2166ae">`Back4App`</font>에서 데이터를 쿼리하는 것입니다. <font color="#2166ae">`안드로이드`</font> 앱에서.

우리가 달성할 목표의 미리보기를 보여드립니다:

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

## 필수 조건

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

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

## 시작해봅시다!

다음 단계에 앞서, 우리는 <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>를(을) 앱에 초기화하는 방법을 모른다면.

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

:::hint{type="success"}
언제든지 이 튜토리얼로 구축된 전체 Android 프로젝트에 접근할 수 있습니다. 우리의 깃허브 저장소에서 확인하세요.

- [코틀린 예제 저장소](https://github.com/templates-back4app/Android-Parse-Sdk-Kotlin)
- [자바 예제 저장소](https://github.com/templates-back4app/Android-Parse-Sdk-Java)
:::

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

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

이 가이드에서 쿼리의 대상이 될 다양한 클래스를 생성해 보겠습니다. 클래스는 다음과 같습니다: <font color="#2166ae">`저자`</font>, <font color="#2166ae">`책`</font>, <font color="#2166ae">`출판사`</font> 및 <font color="#2166ae">`서점`</font>, 여기서 <font color="#2166ae">`책`</font>은 <font color="#2166ae">`출판사`</font>와 1\:N 관계를 가지며 <font color="#2166ae">`저자`</font>와 N\:N 관계를 가집니다. 그리고 <font color="#2166ae">`서점`</font>은 <font color="#2166ae">`책`</font>과 N\:N 관계를 가집니다.

Parse JS 콘솔에서는 JavaScript 코드를 직접 실행하여 JS SDK 명령을 사용하여 애플리케이션 데이터베이스 내용을 쿼리하고 업데이트할 수 있습니다. 아래 코드를 JS 콘솔에서 실행하고 Back4App에 데이터를 삽입하세요. 대시보드에서 JS 콘솔은 다음과 같이 보입니다:

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

다음 예제 내용을 사용하여 클래스를 생성하세요:

```java
1   // Add objects and create tables
2   // Authors
3   const AuthorA = new Parse.Object('Author');
4   AuthorA.set('name', 'Aaron Writer');
5   await AuthorA.save();
6 
7   const AuthorB = new Parse.Object('Author');
8   AuthorB.set('name', 'Beatrice Novelist');
9   await AuthorB.save();
10
11  const AuthorC = new Parse.Object('Author');
12  AuthorC.set('name', 'Casey Columnist');
13  await AuthorC.save();
14
15  // Publishers
16  const PublisherA = new Parse.Object('Publisher');
17  PublisherA.set('name', 'Acacia Publishings');
18  await PublisherA.save();
19
20  const PublisherB = new Parse.Object('Publisher');
21  PublisherB.set('name', 'Birch Distributions');
22  await PublisherB.save();
23
24  // Books
25  const BookA = new Parse.Object('Book');
26  BookA.set('title', 'A Love Story');
27  BookA.set('publisher', PublisherA);
28  BookA.set('publishingDate', new Date('05/07/1998'));
29  const BookARelation = BookA.relation("authors");
30  BookARelation.add(AuthorA);
31  await BookA.save();
32  
33  const BookB = new Parse.Object('Book');
34  BookB.set('title', 'Benevolent Elves');
35  BookB.set('publisher', PublisherB);
36  BookB.set('publishingDate', new Date('11/31/2008'));
37  const BookBRelation = BookB.relation("authors");
38  BookBRelation.add(AuthorB);
39  await BookB.save();
40
41  const BookC = new Parse.Object('Book');
42  BookC.set('title', 'Can You Believe It?');
43  BookC.set('publisher', PublisherB);
44  BookC.set('publishingDate', new Date('08/21/2018'));
45  const BookCRelation = BookC.relation("authors");
46  BookCRelation.add(AuthorA);
47  BookCRelation.add(AuthorC);
48  await BookC.save();
49
50  // BookStore
51  const BookStoreA = new Parse.Object('BookStore');
52  BookStoreA.set('name', 'Books of Love');
53  const BookStoreARelation = BookStoreA.relation("books");
54  BookStoreARelation.add(BookA);
55  await BookStoreA.save();
56
57  const BookStoreB = new Parse.Object('BookStore');
58  BookStoreB.set('name', 'Fantasy Books');
59  const BookStoreBRelation = BookStoreB.relation("books");
60  BookStoreBRelation.add(BookB);
61  await BookStoreB.save();
62
63  const BookStoreC = new Parse.Object('BookStore');
64  BookStoreC.set('name', 'General Books');
65  const BookStoreCRelation = BookStoreC.relation("books");
66  BookStoreCRelation.add(BookA);
67  BookStoreCRelation.add(BookC);
68  await BookStoreC.save();
69
70  console.log('Success');
```

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

모든 클래스를 채웠으니, 이제 몇 가지 관계형 쿼리를 수행할 수 있습니다. 출판사에 따라 결과를 필터링해 보겠습니다. <font color="#2166ae">`책`</font>을 검색하여 <font color="#2166ae">`출판사`</font> “Acacia Publishings” (또는 “출판사 A”)에 속하는 책을 찾기 위해 기본 <font color="#2166ae">`ParseQuery.equalTo`</font> 메서드를 사용합니다:

:::CodeblockTabs
```java
1       progressDialog.show();
2       ParseQuery<ParseObject> publisherQuery = new ParseQuery<>("Publisher");
3       publisherQuery.whereEqualTo("name", "Acacia Publishings");
4       try {
5           ParseObject publisher = publisherQuery.getFirst();
6           ParseQuery<ParseObject> bookQuery = new ParseQuery<ParseObject>("Book");
7           bookQuery.whereEqualTo("publisher", publisher);
8           bookQuery.findInBackground((objects, e) -> {
9               progressDialog.hide();
10              if (e == null) {
11                  initData(objects);
12              } else {
13                  Toast.makeText(this, e.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
14              }
15          });
16      } catch (ParseException e) {
17          progressDialog.hide();
18          e.printStackTrace();
19      }
```

```kotlin
1      progressDialog?.show()
2      val publisherQuery = ParseQuery<ParseObject>("Publisher")
3      publisherQuery.whereEqualTo("name", "Acacia Publishings")
4      try {
5          val publisher = publisherQuery.first
6          val bookQuery = ParseQuery<ParseObject>("Book")
7          bookQuery.whereEqualTo("publisher", publisher)
8          bookQuery.findInBackground { objects: List<ParseObject>?, e: ParseException? ->
9              progressDialog?.hide()
10             if (e == null) {
11                initData(objects!!)
12             } else {
13                 Toast.makeText(this, e.localizedMessage, Toast.LENGTH_SHORT).show()
14             }
15         }
16     } catch (e: ParseException) {
17         progressDialog?.hide()
18         e.printStackTrace()
19     }
```
:::

이제 <font color="#2166ae">`BookStore`</font> 객체가 <font color="#2166ae">`Book`</font> 객체를 포함하고 있는지 쿼리해 보겠습니다. 출판 날짜가 2010년 1월 1일 이후인 객체를 찾기 위해 <font color="#2166ae">`ParseQuery.whereGreaterThan`</font> 메서드와 <font color="#2166ae">`ParseQuery.whereMatchesQuery`</font> 메서드를 사용합니다:

:::CodeblockTabs
```java
1       progressDialog.show();
2       ParseQuery<ParseObject> bookQuery = new ParseQuery<>("Book");
3
4       Calendar calendar = Calendar.getInstance();
5       calendar.set(2010,1,1,59,59,59);
6       Date date = calendar.getTime();
7
8       bookQuery.whereGreaterThan("publishingDate", date);
9
10      ParseQuery<ParseObject> bookStoreQuery = new ParseQuery<>("BookStore");
11      bookStoreQuery.whereMatchesQuery("books",bookQuery);
12      bookStoreQuery.findInBackground((objects, e) -> {
13          progressDialog.hide();
14          if (e==null){
15              initData(objects);
16          } else {
17              Toast.makeText(this, e.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
18          }
19      });
```

```kotlin
1      progressDialog?.show()
2      val bookQuery = ParseQuery<ParseObject>("Book")
3      val calendar = Calendar.getInstance()
4      calendar[2010, 1, 1, 59, 59] = 59
5      val date = calendar.time
6      bookQuery.whereGreaterThan("publishingDate", date)
7      val bookStoreQuery = ParseQuery<ParseObject>("BookStore")
8      bookStoreQuery.whereMatchesQuery("books", bookQuery)
9      bookStoreQuery.findInBackground { objects: List<ParseObject>?, e: ParseException? ->
10         progressDialog?.hide()
11         if (e == null) {
12             initData(objects!!)
13         } else {
14             Toast.makeText(this, e.localizedMessage, Toast.LENGTH_SHORT).show()
15         }
16     }
```
:::

이제 더 복잡한 관계형 쿼리를 만들어 보겠습니다. <font color="#2166ae">`서점`</font> 객체를 찾고 있습니다. 이 객체는 최소한 하나의 <font color="#2166ae">`책`</font>이 “ <font color="#2166ae">`작가`</font> “Aaron Writer” (또는 “AuthorA”)에 의해 작성되었습니다. <font color="#2166ae">`whereEqualTo`</font> 및 <font color="#2166ae">`whereMatchesQuery`</font>:

:::CodeblockTabs
```java
1       progressDialog.show();
2       ParseQuery<ParseObject> authorQuery = new ParseQuery<>("Author");
3       authorQuery.whereEqualTo("name","Aaron Writer");
4       try {
5           ParseObject authorA = authorQuery.getFirst();
6           ParseQuery<ParseObject> bookQuery = new ParseQuery<>("Book");
7           bookQuery.whereEqualTo("authors",authorA);
8
9           ParseQuery<ParseObject> bookStoreQuery = new ParseQuery<>("BookStore");
10          bookStoreQuery.whereMatchesQuery("books",bookQuery);
11
12          bookStoreQuery.findInBackground((objects, e) -> {
13             progressDialog.hide();
14             if (e==null){
15                  initData(objects);
16             } else {
17                 Toast.makeText(this, e.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
18             }
19         });
20
21
22     } catch (ParseException e) {
23         progressDialog.hide();
24         e.printStackTrace();
25     }
```

```kotlin
1      progressDialog?.show()
2     val authorQuery = ParseQuery<ParseObject>("Author")
3     authorQuery.whereEqualTo("name", "Aaron Writer")
4     try {
5         val authorA = authorQuery.first
6         val bookQuery = ParseQuery<ParseObject>("Book")
7         bookQuery.whereEqualTo("authors", authorA)
8         val bookStoreQuery = ParseQuery<ParseObject>("BookStore")
9         bookStoreQuery.whereMatchesQuery("books", bookQuery)
10        bookStoreQuery.findInBackground { objects: List<ParseObject>?, e: ParseException? ->
11            progressDialog?.hide()
12            if (e == null) {
13                initData(objects!!)
14            } else {
15                Toast.makeText(this, e.localizedMessage, Toast.LENGTH_SHORT).show()
16            }
17        }
18    } catch (e: ParseException) {
19        progressDialog?.hide()
20        e.printStackTrace()
21    }
```
:::

## 완료되었습니다!

이 가이드를 마치면, Parse에서 관계형 쿼리가 어떻게 작동하는지와 Android 앱에서 Back4App에서 이를 수행하는 방법을 배웠습니다.
