---
title: 데이터 읽기 및 쓰기
slug: docs-kr/get-started/read-and-write-data
description: Back4App에서 Parse SDK로 데이터를 생성, 읽기, 업데이트, 삭제하세요.
image: https://www.back4app.com/_public/img/back4app-og.png
createdAt: 2024-01-23T18:25:46.036Z
---

이 가이드는 당신에게 **데이터 객체를 생성, 읽기, 업데이트 및 삭제하는 방법**을 Back4app에서 Parse SDK를 사용하여 가르쳐 줄 것입니다. Back4app의 데이터 저장은 `Parse.Object` 클래스 주위에서 이루어지며, 이는 JSON 호환 데이터의 키-값 쌍을 저장할 수 있게 해주어 데이터 관리의 유연성과 단순성을 제공합니다.

## 목표

- Back4app에서 Parse SDK를 사용하여 데이터 조작(CRUD)을 수행하는 방법을 이해합니다.
- 다양한 플랫폼에서 Parse SDK를 설정하고 사용하는 방법을 배웁니다.

## 전제 조건

:::hint{type="info"}
**Back4app의 앱**: Back4app에서 생성된 앱이 필요합니다.

- [새 앱 생성 가이드](https://www.back4app.com/docs/get-started/new-parse-app).

**Parse SDK 설치**:

- [Parse SDK 설치 가이드](https://www.back4app.com/docs/get-started/parse-sdk).
:::

## 1 - Parse 객체 생성

Back4app에 데이터를 저장하려면 특정 클래스와 연결된 `ParseObject`를 생성해야 합니다. 예를 들어, 축구 관련 애플리케이션에서는 선수에 대한 데이터를 저장하기 위해 `SoccerPlayers` 클래스를 생성할 수 있습니다.

:::CodeblockTabs
```javascript
async function saveNewPlayer() {
  const soccerPlayers = new Parse.Object("SoccerPlayers");
  soccerPlayers.set("playerName", "A. Wed");
  soccerPlayers.set("yearOfBirth", 1997);
  soccerPlayers.set("emailContact", "a.wed@email.io");
  soccerPlayers.set("attributes", ["fast", "good conditioning"]);

  try {
    const result = await soccerPlayers.save();
    console.log('New object created with objectId: ' + result.id);
  } catch (error) {
    console.error('Error: ' + error.message);
  }
}
```

Flutter

```dart
ParseObject soccerPlayers = ParseObject('SoccerPlayers')
  ..set('playerName', 'A. Wed')
  ..set('yearOfBirth', 1997)
  ..set('emailContact', 'a.wed@email.io')
  ..set('attributes', ['fast', 'good conditioning']);

ParseResponse response = await soccerPlayers.save();
if (response.success) {
  print('New object created with objectId: ${response.result.objectId}');
} else {
  print('Error: ${response.error.message}');
}
```

Android

```java
ParseObject soccerPlayers = new ParseObject("SoccerPlayers");
soccerPlayers.put("playerName", "A. Wed");
soccerPlayers.put("yearOfBirth", 1997);
soccerPlayers.put("emailContact", "a.wed@email.io");
soccerPlayers.put("attributes", Arrays.asList("fast", "good conditioning"));

soccerPlayers.saveInBackground(e -> {
  if (e == null) {
    Log.d("Parse", "New object created with objectId: " + soccerPlayers.getObjectId());
  } else {
    Log.e("ParseError", e.getMessage());
  }
});
```

iOS

```swift
let soccerPlayer = ParseObject(className: "SoccerPlayers")
soccerPlayer["playerName"] = "A. Wed"
soccerPlayer["yearOfBirth"] = 1997
soccerPlayer["emailContact"] = "a.wed@email.io"
soccerPlayer["attributes"] = ["fast", "good conditioning"]

soccerPlayer.save { result in
    switch result {
    case .success(let savedPlayer):
        print("New object created with objectId: \(savedPlayer.objectId!)")
    case .failure(let error):
        print("Error: \(error.localizedDescription)")
    }
}
```

PHP

```php
$soccerPlayers = new ParseObject("SoccerPlayers");
$soccerPlayers->set("playerName", "A. Wed");
$soccerPlayers->set("yearOfBirth", 1997);
$soccerPlayers->set("emailContact", "a.wed@email.io");
$soccerPlayers->setArray("attributes", ["fast", "good conditioning"]);

try {
    $soccerPlayers->save();
    echo 'New object created with objectId: ' . $soccerPlayers->getObjectId();
} catch (ParseException $ex) {
    echo 'Error: ' . $ex->getMessage();
}
```

.NET

```csharp
ParseObject soccerPlayers = new ParseObject("SoccerPlayers");
soccerPlayers["playerName"] = "A. Wed";
soccerPlayers["yearOfBirth"] = 1997;
soccerPlayers["emailContact"] = "a.wed@email.io";
soccerPlayers["attributes"] = new List<string> { "fast", "good conditioning" };

await soccerPlayers.SaveAsync();
Console.WriteLine("New object created with objectId: " + soccerPlayers.ObjectId);
```

REST API

```curl
curl -X POST \
  -H "X-Parse-Application-Id: APPLICATION_ID" \
  -H "X-Parse-REST-API-Key: REST_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "playerName": "A. Wed",
    "yearOfBirth": 1997,
    "emailContact": "a.wed@email.io",
    "attributes": ["fast", "good conditioning"]
  }' \
  https://parseapi.back4app.com/classes/SoccerPlayers
```
:::

이 코드를 실행한 후, Back4app 대시보드의 **Database** 섹션에서 새 객체를 확인할 수 있습니다. SoccerPlayers 클래스를 수동으로 생성할 필요는 없으며, 객체가 처음 저장될 때 자동으로 생성됩니다.

![](https://api.archbee.com/api/optimize/yD3zCY-NNBBIfd0uqcfR5/KuqRY-K2J4cJ0sP4doJuA_screenshot-2024-11-13-at-161114.png)

## 2 - 파스 객체 읽기

To retrieve saved data, you can use a `ParseQuery`. For instance, to fetch the player created above by its `objectId`:

:::CodeblockTabs
JS

```javascript
async function retrievePlayer() {
  const query = new Parse.Query("SoccerPlayers");
  
  try {
    const player = await query.get("HMcTr9rD3s");  // Replace with the actual objectId
    console.log("Player Name: " + player.get("playerName"));
    console.log("Year of Birth: " + player.get("yearOfBirth"));
    console.log("Email Contact: " + player.get("emailContact"));
  } catch (error) {
    console.error("Error retrieving object: " + error.message);
  }
}
```

Flutter

```dart
ParseResponse response = await ParseObject("SoccerPlayers").getObject("HMcTr9rD3s");  // Replace with the actual objectId

if (response.success) {
  ParseObject player = response.result;
  print("Player Name: ${player.get<String>('playerName')}");
  print("Year of Birth: ${player.get<int>('yearOfBirth')}");
  print("Email Contact: ${player.get<String>('emailContact')}");
} else {
  print("Error retrieving object: ${response.error.message}");
}
```

Android

```java
ParseQuery<ParseObject> query = ParseQuery.getQuery("SoccerPlayers");
query.getInBackground("HMcTr9rD3s", (player, e) -> {  // Replace with the actual objectId
  if (e == null) {
    Log.d("Parse", "Player Name: " + player.getString("playerName"));
    Log.d("Parse", "Year of Birth: " + player.getInt("yearOfBirth"));
    Log.d("Parse", "Email Contact: " + player.getString("emailContact"));
  } else {
    Log.e("ParseError", "Error retrieving object: " + e.getMessage());
  }
});
```

iOS

```swift
let query = ParseQuery(className: "SoccerPlayers")
query.get(objectId: "HMcTr9rD3s") { result in  // Replace with the actual objectId
    switch result {
    case .success(let player):
        print("Player Name: \(player["playerName"] ?? "No name")")
        print("Year of Birth: \(player["yearOfBirth"] ?? "No birth year")")
        print("Email Contact: \(player["emailContact"] ?? "No email")")
    case .failure(let error):
        print("Error retrieving object: \(error.localizedDescription)")
    }
}

```

PHP

```php
$query = new ParseQuery("SoccerPlayers");
try {
    $player = $query->get("HMcTr9rD3s");  // Replace with the actual objectId
    echo "Player Name: " . $player->get("playerName") . "\n";
    echo "Year of Birth: " . $player->get("yearOfBirth") . "\n";
    echo "Email Contact: " . $player->get("emailContact") . "\n";
} catch (ParseException $ex) {
    echo 'Error retrieving object: ' . $ex->getMessage();
}
```

.NET

```csharp
var query = ParseObject.GetQuery("SoccerPlayers");
var player = await query.GetAsync("HMcTr9rD3s");  // Replace with the actual objectId

Console.WriteLine("Player Name: " + player.Get<string>("playerName"));
Console.WriteLine("Year of Birth: " + player.Get<int>("yearOfBirth"));
Console.WriteLine("Email Contact: " + player.Get<string>("emailContact"));
```

REST API

```curl
curl -X GET \
  -H "X-Parse-Application-Id: APPLICATION_ID" \
  -H "X-Parse-REST-API-Key: REST_API_KEY" \
  https://parseapi.back4app.com/classes/SoccerPlayers/HMcTr9rD3s  # Replace with the actual objectId
```
:::

또한 `objectId`, 다른 매개변수(예: `yearOfBirth`, `playerName`)로도 쿼리할 수 있어 데이터 검색의 유연성이 더욱 향상됩니다.

## 3 - 파스 객체 업데이트

객체를 업데이트하려면 먼저 객체를 검색하고, 원하는 속성에 대한 새 값을 설정한 다음 `save()` 메서드를 호출합니다.

:::CodeblockTabs
```javascript
async function updatePlayer() {
  const query = new Parse.Query("SoccerPlayers");
  
  try {
    const player = await query.get("HMcTr9rD3s");  // Replace with the actual objectId
    player.set("yearOfBirth", 1998);
    await player.save();
    console.log("Object updated successfully!");
  } catch (error) {
    console.error("Error updating object: " + error.message);
  }
}
```

Flutter

```dart
ParseObject player = ParseObject("SoccerPlayers")..objectId = "HMcTr9rD3s";  // Replace with the actual objectId
player.set("yearOfBirth", 1998);

ParseResponse response = await player.save();
if (response.success) {
  print("Object updated successfully!");
} else {
  print("Error updating object: ${response.error.message}");
}

```

Android

```java
ParseQuery<ParseObject> query = ParseQuery.getQuery("SoccerPlayers");
query.getInBackground("HMcTr9rD3s", (player, e) -> {  // Replace with the actual objectId
  if (e == null) {
    player.put("yearOfBirth", 1998);
    player.saveInBackground(e1 -> {
      if (e1 == null) {
        Log.d("Parse", "Object updated successfully!");
      } else {
        Log.e("ParseError", "Error updating object: " + e1.getMessage());
      }
    });
  } else {
    Log.e("ParseError", "Error retrieving object: " + e.getMessage());
  }
});
```

iOS

```swift
let query = ParseQuery(className: "SoccerPlayers")
query.get(objectId: "HMcTr9rD3s") { result in  // Replace with the actual objectId
    switch result {
    case .success(var player):
        player["yearOfBirth"] = 1998
        player.save { saveResult in
            switch saveResult {
            case .success:
                print("Object updated successfully!")
            case .failure(let error):
                print("Error updating object: \(error.localizedDescription)")
            }
        }
    case .failure(let error):
        print("Error retrieving object: \(error.localizedDescription)")
    }
}
```

```php
$query = new ParseQuery("SoccerPlayers");
try {
    $player = $query->get("HMcTr9rD3s");  // Replace with the actual objectId
    $player->set("yearOfBirth", 1998);
    $player->save();
    echo "Object updated successfully!";
} catch (ParseException $ex) {
    echo 'Error updating object: ' . $ex->getMessage();
}
```

.NET

```csharp
var query = ParseObject.GetQuery("SoccerPlayers");
var player = await query.GetAsync("HMcTr9rD3s");  // Replace with the actual objectId

player["yearOfBirth"] = 1998;
await player.SaveAsync();
Console.WriteLine("Object updated successfully!");
```

REST API

```curl
curl -X PUT \
  -H "X-Parse-Application-Id: APPLICATION_ID" \
  -H "X-Parse-REST-API-Key: REST_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"yearOfBirth": 1998}' \
  https://parseapi.back4app.com/classes/SoccerPlayers/HMcTr9rD3s  # Replace with the actual objectId
```
:::

## 4 - 파스 객체 삭제

객체를 삭제하려면 `objectId`로 검색하고 `destroy()` 메서드를 사용하세요.

:::CodeblockTabs
```javascript
async function deletePlayer() {
  const query = new Parse.Query("SoccerPlayers");
  
  try {
    const player = await query.get("HMcTr9rD3s");  // Replace with the actual objectId
    await player.destroy();
    console.log("Object deleted successfully!");
  } catch (error) {
    console.error("Error deleting object: " + error.message);
  }
}
```

Flutter

```dart
ParseObject player = ParseObject("SoccerPlayers")..objectId = "HMcTr9rD3s";  // Replace with the actual objectId

ParseResponse response = await player.delete();
if (response.success) {
  print("Object deleted successfully!");
} else {
  print("Error deleting object: ${response.error.message}");
}
```

Android

```java
ParseQuery<ParseObject> query = ParseQuery.getQuery("SoccerPlayers");
query.getInBackground("HMcTr9rD3s", (player, e) -> {  // Replace with the actual objectId
  if (e == null) {
    player.deleteInBackground(e1 -> {
      if (e1 == null) {
        Log.d("Parse", "Object deleted successfully!");
      } else {
        Log.e("ParseError", "Error deleting object: " + e1.getMessage());
      }
    });
  } else {
    Log.e("ParseError", "Error retrieving object: " + e.getMessage());
  }
});
```

iOS

```swift
let query = ParseQuery(className: "SoccerPlayers")
query.get(objectId: "HMcTr9rD3s") { result in  // Replace with the actual objectId
    switch result {
    case .success(let player):
        player.delete { deleteResult in
            switch deleteResult {
            case .success:
                print("Object deleted successfully!")
            case .failure(let error):
                print("Error deleting object: \(error.localizedDescription)")
            }
        }
    case .failure(let error):
        print("Error retrieving object: \(error.localizedDescription)")
    }
}
```

PHP

```php
$query = new ParseQuery("SoccerPlayers");
try {
    $player = $query->get("HMcTr9rD3s");  // Replace with the actual objectId
    $player->destroy();
    echo "Object deleted successfully!";
} catch (ParseException $ex) {
    echo 'Error deleting object: ' . $ex->getMessage();
}
```

.NET

```csharp
var query = ParseObject.GetQuery("SoccerPlayers");
var player = await query.GetAsync("HMcTr9rD3s");  // Replace with the actual objectId

await player.DeleteAsync();
Console.WriteLine("Object deleted successfully!");
```

REST API

```curl
curl -X DELETE \
  -H "X-Parse-Application-Id: APPLICATION_ID" \
  -H "X-Parse-REST-API-Key: REST_API_KEY" \
  https://parseapi.back4app.com/classes/SoccerPlayers/HMcTr9rD3s  # Replace with the actual objectId
```
:::

:::hint{type="info"}
다시 말해, 객체를 <font color="#2166ae">`objectId`</font>로 검색할 필요는 없습니다. Parse는 <font color="#2166ae">`ParseObjects`</font>에서 정보를 검색하기 위한 다양한 검색 옵션을 제공합니다. 각 기술에 대한 공식 Parse 문서에서 더 많은 정보를 확인할 수 있습니다.
:::

## 모범 사례 및 추가 팁

- **명명 규칙**: 클래스를 위해 ClassNamesLikeThis를 사용하고, 키를 위해 keyNamesLikeThis를 사용하여 코드를 정리하고 읽기 쉽게 유지하세요.
- **일반 오류 확인**: Parse SDK에 연결하는 데 문제가 발생하면 [SDK 설치 및 구성](https://www.back4app.com/docs/get-started/parse-sdk)을 확인하세요.
- **자동 필드**: 각 Parse 객체는 자동으로 `createdAt`, `updatedAt`, 및 `objectId` 필드를 포함합니다.

## 다음 단계

Back4app에서 첫 번째 데이터를 저장하고 읽은 후, 아래 가이드를 사용하여 데이터 저장소를 계속 탐색하는 것을 권장합니다. 지원되는 데이터 유형을 저장하는 방법, 관계형 데이터를 저장하고 쿼리하는 방법, 지리적 포인트를 사용하는 방법, 최적화된 데이터 모델을 만드는 방법을 찾을 수 있습니다.

::::LinkArray
:::LinkArrayItem{headerType="IMAGE" headerImage="https://api.archbee.com/api/optimize/yD3zCY-NNBBIfd0uqcfR5/pEkmfq5PdkxC3lmfRzYsE_1.png"}
&#x20;       **[리액트 네이티브](https://www.back4app.com/docs/react-native/parse-sdk/react-native-sdk)**
:::

:::LinkArrayItem{headerType="IMAGE" headerImage="https://api.archbee.com/api/optimize/yD3zCY-NNBBIfd0uqcfR5/tPONkoW1aPPhiAdTvbvrx_sem-nome-rectangle-sticker-landscape.png"}
**[플러터](https://www.back4app.com/docs/flutter/parse-sdk/parse-flutter-sdk)**
:::

:::LinkArrayItem{headerType="IMAGE" headerImage="https://api.archbee.com/api/optimize/yD3zCY-NNBBIfd0uqcfR5/vqJJw7ljIhPJ1Yfz7mD9n_3.png"}
[안드로이드 ](https://www.back4app.com/docs/android/android-project-with-source-code-download)
:::

:::LinkArrayItem{headerType="IMAGE" headerImage="https://api.archbee.com/api/optimize/yD3zCY-NNBBIfd0uqcfR5/rzkB1YU-Feimt_SWfZUuC_4.png"}
[iOS](https://www.back4app.com/docs/ios/ios-app-template)
:::

:::LinkArrayItem{headerType="IMAGE" headerImage="https://api.archbee.com/api/optimize/yD3zCY-NNBBIfd0uqcfR5/GsQE6ru-jj2rRbUt7P3Tr_5.png"}
**[자바스크립트](https://www.back4app.com/docs/javascript/parse-javascript-sdk)**
:::

:::LinkArrayItem{headerType="IMAGE" headerImage="https://api.archbee.com/api/optimize/yD3zCY-NNBBIfd0uqcfR5/35IqTes9QhdmijlReYBYZ_6.png"}
[그래프QL](https://www.back4app.com/docs/parse-graphql/graphql-getting-started)
:::

:::LinkArrayItem{headerType="IMAGE" headerImage="https://api.archbee.com/api/optimize/yD3zCY-NNBBIfd0uqcfR5/CS13bUltyBMZaO7SPfWC0_1.png"}
[리액트JS](https://www.back4app.com/docs/react/data-objects/react-crud-tutorial)
:::
::::

## 결론

이 가이드는 Back4app에서 데이터 작업을 위한 확고한 출발점을 제공하며, Parse SDK를 사용하여 플랫폼 간 데이터 저장 및 조작을 쉽게 만듭니다. 질문이 있으시면 언제든지 [Back4app 지원](https://www.back4app.com/support)에 문의해 주세요!
