---
title: 안드로이드 앱에서 실시간 데이터 업데이트를 위한 라이브 쿼리 활용하기
slug: docs-kr/android/real-time/live-query
description: 안드로이드에서 Parse Live Query를 통해 실시간 데이터 업데이트 구현하기. 실시간 반응형 앱 개발을 위한 기술적 가이드라인 제공.
image: https://www.back4app.com/images/logo-social.png
createdAt: 2024-03-13T16:38:56.278Z
---

# 실시간 애플리케이션 사용하기 라이브 쿼리

## 소개

라이브 쿼리는 **실시간 반응형 애플리케이션**에서 사용되도록 설계되었으며, 전통적인 쿼리 패러다임을 사용하는 것에는 응답 시간 증가 및 높은 네트워크 및 서버 사용과 같은 몇 가지 문제가 발생할 수 있습니다. 라이브 쿼리는 데이터베이스에서 오는 최신 데이터로 페이지를 지속적으로 업데이트해야 하는 경우에 사용해야 하며, 이는 종종 온라인 게임, 메시징 클라이언트 및 공유 할 일 목록과 같은 경우에 발생하지만 이에 국한되지 않습니다.

이 섹션에서는 [Back4App](https://www.back4app.com/)의 라이브 쿼리를 Android 환경에서 사용하는 방법을 설명합니다.

이 튜토리얼은 <font color="#2166ae">`compileSdk 30`</font> , <font color="#2166ae">`minSdk 21`</font> 및 <font color="#2166ae">`targetSdk 30`</font>

:::hint{type="success"}
**언제든지 GitHub 리포지토리를 통해 전체 프로젝트에 접근할 수 있습니다.**

- [코틀린 예제 리포지토리](https://github.com/templates-back4app/android_crud_operations_kotlin)
- [자바 예제 리포지토리](https://github.com/templates-back4app/android_crud_operations_java)
:::

## 목표

우리가 달성할 목표의 미리보기입니다 :

::Image[]{src="https://api.archbee.com/api/optimize/yD3zCY-NNBBIfd0uqcfR5/lEZABE-g4Zzsl_m0EIWm9_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;[새 Parse 앱 튜토리얼](https://www.back4app.com/docs/get-started/new-parse-app)을 따라 Back4App에서 Parse 앱을 만드는 방법을 배우세요.
- Back4App에 연결된 안드로이드 앱.
  - **참고:&#x20;**&#x20;[Parse SDK 설치 튜토리얼](https://www.back4app.com/docs/android/parse-android-sdk)을 따라 Back4App에 연결된 Android Studio 프로젝트를 만드세요.
- Android 4.1 (젤리빈) 이상을 실행하는 장치(또는[ 가상 장치](https://developer.android.com/studio/run/managing-avds.html))입니다.
:::

## 1 - 라이브 쿼리 활성화

코딩을 시작하기 전에 라이브 쿼리를 활성화하기 위해 데이터베이스에 클래스가 필요합니다. 이를 위해 [Back4App 웹사이트](https://www.back4app.com/)에서 앱을 찾고 <font color="#2166ae">`대시보드`</font> > <font color="#2166ae">`클래스 생성`</font>을 클릭하세요. 다음과 같이 표시됩니다:

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

이제 Live Query 기능을 활성화하려면 [Back4App 웹사이트](https://www.back4app.com/), 앱을 찾아 <font color="#2166ae">`서버 설정`</font>, 그런 다음 “서버 URL 및 Live Query” 블록을 찾아 <font color="#2166ae">`설정`</font>을 클릭하세요.

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

그럼 아래와 같은 페이지에 도착하게 됩니다. 이 페이지에서 <font color="#2166ae">`Back4App 서브도메인 활성화`</font> 옵션과 <font color="#2166ae">`라이브 쿼리 활성화`</font> 옵션 및 라이브 쿼리를 활성화할 모든 클래스를 선택해야 합니다, 아래와 같이:

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

:::hint{type="info"}
라이브 쿼리를 사용하려면 **웹 호스팅**을 활성화해야 합니다, 왜냐하면 귀하의 도메인이 라이브 서버로 작동할 것이기 때문입니다.

- **참고:&#x20;**&#xC6F9; 호스팅에 대해 더 알고 싶다면 [Back4App 웹 호스팅 튜토리얼](https://www.back4app.com/docs/platform/activating-web-hosting).      &#x20;
:::

## 2 - 라이브 쿼리 클라이언트 설정하기

[Parse Server의 공식 GitHub](https://github.com/parse-community)에 라이브 쿼리 클라이언트 구현이 있습니다. [안드로이드](https://github.com/parse-community/ParseLiveQuery-Android)용 공식 라이브 쿼리 클라이언트를 구현해야 합니다. 이를 위해 앱 <font color="#2166ae">`app/build.gradle`</font> 파일의 종속성 섹션에 다음 줄을 추가하고 프로젝트를 동기화하세요:

:::CodeblockTabs
app/build.gradle

```java
1    dependencies {
2        ...
3       // Don't forget to change the line below with the latest version of Parse SDK for Android
4       implementation "com.github.parse-community.Parse-SDK-Android:parse:1.26.0"
5       implementation 'com.github.parse-community:ParseLiveQuery-Android:1.2.2'
6       ...
7    }
```
:::

이 프로젝트에서는 <font color="#2166ae">`Message`</font>라는 클래스를 생성하여 메시지를 포함할 것입니다.

## 3 - 쿼리 구독하기

라이브 쿼리를 사용하려면 먼저 <font color="#2166ae">`LiveQueryClient`</font>를 생성하여 웹소켓 연결을 관리해야 합니다. 이를 위해 애플리케이션 ID, JavaScript 키 및 첫 번째 단계에서 설정한 라이브 쿼리의 서버 URL을 제공해야 합니다.

:::CodeblockTabs
```java
1      Parse.initialize(new Parse.Configuration.Builder(this)
2                   .applicationId(getString(R.string.back4app_app_id))
3                   .clientKey(getString(R.string.back4app_client_key))
4                   .server(getString(R.string.back4app_server_url))
5                   .build());
```

```kotlin
1      Parse.initialize(Parse.Configuration.Builder(this)
2                   .applicationId(getString(R.string.back4app_app_id))
3                   .clientKey(getString(R.string.back4app_client_key))
4                   .server(getString(R.string.back4app_server_url))
5                   .build())
```
:::

초기화 코드<font color="#2166ae">`LiveQueryClient`</font>는 다음과 같습니다:

:::CodeblockTabs
```java
1     ParseLiveQueryClient parseLiveQueryClient = ParseLiveQueryClient.Factory.getClient();
```

```kotlin
1      val parseLiveQueryClient = ParseLiveQueryClient.Factory.getClient()
```
:::

&#x20;우리는 <font color="#2166ae">`MessageAdapter`</font>. messageAdapter.\* 함수는 객체가 추가, 삭제 또는 업데이트될 때 트리거됩니다. 여기서 우리의 <font color="#2166ae">`messageAdapter`</font> 함수입니다.

:::CodeblockTabs
```java
1      public void addItem(ParseObject t) {
2          this.list.add(t);
3          notifyItemInserted(list.size() - 1);
4      }
5
6      public void removeItem(ParseObject object) {
7          for (int i = 0; i < list.size(); i++) {
8              if (list.get(i).getObjectId().equals(object.getObjectId())){
9                  list.remove(i);
10                 notifyItemRemoved(i);
11                 notifyItemRangeChanged(i, list.size());
12                 return;
13             }
14         }
15     }
16     public void updateItem(ParseObject object) {
17         for (int i = 0; i < list.size(); i++) {
18             if (list.get(i).getObjectId().equals(object.getObjectId())){
19                 list.set(i,object);
20                 notifyDataSetChanged();
21                 return;
22             }
23         }
24     }
```

```kotlin
1      fun addItem(t: ParseObject?) {
2      list!!.add(t!!)
3      notifyDataSetChanged()
4      }
5  
6      fun removeItem(`object`: ParseObject) {
7          for (i in list!!.indices) {
8              if (list!![i].objectId == `object`.objectId) {
9                  list!!.removeAt(i)
10                 notifyItemRemoved(i)
11                 notifyItemRangeChanged(i, list!!.size)
12                 return
13             }
14         }
15     }
16
17     fun updateItem(`object`: ParseObject) {
18         for (i in list!!.indices) {
19             if (list!![i].objectId == `object`.objectId) {
20                 list!![i] = `object`
21                 notifyDataSetChanged()
22                 return
23             }
24         }
25     }
```
:::

그런 다음, 구독하고자 하는 객체의 유형에 대한 <font color="#2166ae">`ParseQuery`</font>를 생성해야 합니다. 구독은 이벤트 발신기로, 쿼리를 만족하는 객체에 변화가 생길 때 이벤트를 발생시킵니다.
이 예제에서는 기본 쿼리를 만들고 <font color="#2166ae">`Message`</font> 객체에 대한 모든 변경 사항을 구독할 것입니다.

:::hint{type="success"}
**쿼리 및 구독에 대한 자세한 내용은 [Parse 공식 쿼리 문서](http://docs.parseplatform.org/android/guide/#queries).**
:::

:::CodeblockTabs
```java
1        ParseQuery<ParseObject> parseQuery = new ParseQuery<>("Message");
2        subscriptionHandling = parseLiveQueryClient.subscribe(parseQuery);
3        subscriptionHandling.handleSubscribe(q -> {
4            subscriptionHandling.handleEvent(SubscriptionHandling.Event.CREATE, (query, object) -> {
5                MainActivity.this.runOnUiThread(() -> {
6                    messagesAdapter.addItem(object);
7                });
8            });
9            subscriptionHandling.handleEvent(SubscriptionHandling.Event.DELETE, (query, object) -> {
10                MainActivity.this.runOnUiThread(() -> {
11                    messagesAdapter.removeItem(object);
12                });
13            });
14            subscriptionHandling.handleEvent(SubscriptionHandling.Event.UPDATE, (query, object) -> {
15                MainActivity.this.runOnUiThread(() -> {
16                    messagesAdapter.updateItem(object);
17                });
18            });
19        });
```

```kotlin
1   val parseQuery = ParseQuery<ParseObject>("Message")
2           subscriptionHandling = parseLiveQueryClient!!.subscribe(parseQuery)
3           subscriptionHandling!!.handleSubscribe { subscriptionHandling!!.handleEvent(SubscriptionHandling.Event.CREATE
4               ) { _: ParseQuery<ParseObject?>?, `object`: ParseObject? ->
5                   runOnUiThread { messagesAdapter!!.addItem(`object`) }
6               }
7               subscriptionHandling!!.handleEvent(SubscriptionHandling.Event.DELETE
8               ) { _: ParseQuery<ParseObject?>?, `object`: ParseObject? ->
9                   runOnUiThread { messagesAdapter!!.removeItem(`object`!!) }
10              }
11              subscriptionHandling!!.handleEvent(SubscriptionHandling.Event.UPDATE
12              ) { _: ParseQuery<ParseObject?>?, `object`: ParseObject? ->
13                  runOnUiThread { messagesAdapter!!.updateItem(`object`!!) }
14              } 
15          }
```
:::

:::hint{type="info"}
**참고:&#x20;**&#xC6B0;리는 앱에서 모든 이벤트를 트리거합니다. 또한 Back4App(테이블 또는 자바스크립트 콘솔에서)에서 이 생성, 업데이트 및 삭제 이벤트를 트리거할 수 있습니다.
:::

## 완료되었습니다!

이 시점에서, 당신은 Android 환경에서 실시간 반응형 애플리케이션을 만들기 위해 Live Queries를 사용하는 방법과 Back4App을 사용하여 Live Query를 설정하는 방법에 대한 지식을 가지고 있습니다. 이제 이를 자신의 앱에 구현하기 시작할 수 있습니다.

이제 [Parse Server 핵심 기능](https://www.back4app.com/product/parse-server) 및 [Back4App 추가 기능](https://www.back4app.com/product/addons)을 탐색할 준비가 되었습니다.
