데이터 검색

GET으로 데이터 읽기

URL 엔드포인트에 GET 요청을 전송하여 Firebase 데이터베이스에서 데이터를 읽을 수 있습니다. 앞 섹션의 블로그 예시를 계속 살펴보며 블로그 게시물 데이터를 읽는 방법을 알아보겠습니다.

curl 'https://docs-examples.firebaseio.com/fireblog/posts.json?print=pretty'

200 OK HTTP 상태 코드는 요청 성공을 나타내고 응답에는 검색 대상 데이터가 포함됩니다.

URI 매개변수 추가

Firebase 데이터베이스에서 데이터를 읽을 때 REST API는 몇 가지 쿼리 매개변수를 취합니다. 가장 흔히 사용되는 매개변수는 다음과 같습니다. 전체 목록은 REST API 참조에서 확인할 수 있습니다.

auth

auth 요청 매개변수는 Firebase 실시간 데이터베이스 보안 규칙으로 보호되는 데이터에 대한 액세스를 허용하며 모든 요청 유형에서 지원됩니다. 인수는 Firebase 프로젝트의 사용자에서 설명하는 Firebase 앱의 보안 비밀 또는 인증 토큰일 수 있습니다. 다음 예시에서는 auth 매개변수가 있는 GET 요청을 보냅니다. 여기서 CREDENTIAL는 Firebase 앱의 보안 비밀 또는 인증 토큰입니다.

curl 'https://docs-examples.firebaseio.com/auth-example.json?auth=CREDENTIAL'

출력하다

print=pretty를 지정하면 데이터가 사람이 읽을 수 있는 형태로 반환됩니다.

curl 'https://docs-examples.firebaseio.com/fireblog/posts.json?print=pretty'

print=silent를 지정하면 성공 시 204 No Content가 반환됩니다.

curl 'https://docs-examples.firebaseio.com/fireblog/posts.json?print=silent'

콜백

웹브라우저에서 도메인 간에 REST 호출을 수행하려면 JSONP를 사용하여 자바스크립트 콜백 함수에서 응답을 래핑합니다. REST API에 callback=을 추가하면 반환되는 데이터가 지정한 콜백 함수로 래핑됩니다. 예를 들면 다음과 같습니다.

<script>
  function gotData(data) {
    console.log(data);
  }
</script>
<script src="https://docs-examples.firebaseio.com/fireblog/posts.json?callback=gotData">

shallow

이 매개변수는 전체를 다운로드하지 않고도 대규모 데이터세트를 다룰 수 있도록 설계된 고급 기능입니다. 이 매개변수를 사용하려면 shallow=true를 매개변수로 추가하세요. 이렇게 하면 반환되는 데이터의 심도가 제한됩니다. 해당 위치의 데이터가 JSON 기본 요소(문자열, 숫자 또는 부울)이면 그 값이 반환됩니다. 해당 위치의 데이터 스냅샷이 JSON 객체이면 각 키의 값이 true로 잘립니다. 예를 들어 아래의 데이터를 살펴보세요.

{
  "message": {
    "user": {
      "name": "Chris"
    },
    "body": "Hello!"
  }
}

// A request to /message.json?shallow=true
// would return the following:
{
  "user": true,
  "body": true
}

// A request to /message/body.json?shallow=true
// would simply return:
"Hello!"

다음과 같은 curl 요청으로 확인해볼 수 있습니다.

curl 'https://docs-examples.firebaseio.com/rest/retrieving-data.json?shallow=true&print=pretty'

timeout

이 매개변수를 사용하여 서버 측의 읽기 소요 시간을 제한합니다. 읽기 요청이 할당된 시간 내에 완료되지 않으면 HTTP 400 오류로 종료됩니다. 이는 소규모 데이터 전송을 예상한 상황에서 잠재적으로 거대한 하위 트리를 가져오기 위해 너무 오래 기다리고 싶지 않을 때 특히 유용합니다. 실제 읽기 시간은 데이터 크기 및 캐싱에 따라 다를 수 있습니다.

숫자와 단위로 구성된 3ms, 3s 또는 3min 형식을 사용하여 timeouts를 지정합니다. 지정하지 않으면 15min의 최대 timeout이 적용됩니다. timeout이 양수가 아니거나 최대값을 초과하면 요청이 HTTP 400 오류로 거부됩니다. 다음 예시에서 GET 요청에는 10초의 timeout이 포함되어 있습니다.

curl 'https://docs-examples.firebaseio.com/rest/retrieving-data.json?timeout=10s'

데이터 필터링

다양한 요소를 기준으로 데이터를 필터링하는 쿼리를 작성할 수 있습니다. 우선 orderBy 매개변수를 사용하여 데이터를 필터링하는 방법을 지정합니다. 그런 다음 orderBy를 5가지 매개변수 limitToFirst, limitToLast, startAt, endAt, equalTo와 조합합니다.

공룡을 좋아하는 Firebase 개발팀의 취향에 따라 공룡 자료 샘플 데이터베이스의 스니펫을 사용하여 데이터를 필터링하는 방법을 시연해 보겠습니다.

{
  "lambeosaurus": {
    "height": 2.1,
    "length": 12.5,
    "weight": 5000
  },
  "stegosaurus": {
    "height": 4,
    "length": 9,
    "weight": 2500
  }
}

데이터를 필터링할 수 있는 기준은 하위 키, , 등 3가지입니다. 쿼리는 이러한 매개변수 중 하나로 시작하고 startAt, endAt, limitToFirst, limitToLast 또는 equalTo 매개변수 중 하나 이상과 조합되어야 합니다.

지정된 하위 키로 필터링

키를 orderBy 매개변수에 전달하여 공통 하위 키로 노드를 필터링할 수 있습니다. 예를 들어 키가 3을 초과하는 공룡을 모두 검색하려면 다음 쿼리를 실행합니다.

curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="height"&startAt=3&print=pretty'

필터링 기준이 되는 하위 키가 없는 노드는 null 값을 기준으로 정렬됩니다. 데이터 정렬 방식에 관한 자세한 내용은 데이터의 순서를 참조하세요.

Firebase는 바로 아래 수준의 하위 항목뿐 아니라 깊이 중첩된 하위 항목을 기준으로 하는 정렬도 지원합니다. 아래와 같이 데이터가 깊이 중첩된 경우 이 기능이 유용합니다.

{
  "lambeosaurus": {
    "dimensions": {
      "height" : 2.1,
      "length" : 12.5,
      "weight": 5000
    }
  },
  "stegosaurus": {
    "dimensions": {
      "height" : 4,
      "length" : 9,
      "weight" : 2500
    }
  }
}

이러한 경우 키를 쿼리하려면 단일 키가 아닌 개체에 대한 전체 경로를 사용합니다.

curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="dimensions/height"&startAt=3&print=pretty'

쿼리는 한 번에 하나의 키로만 필터링할 수 있습니다. 동일한 요청에서 orderBy 매개변수를 여러 번 사용하면 오류가 발생합니다.

키로 필터링

orderBy="$key" 매개변수를 사용하여 키를 기준으로 노드를 필터링할 수도 있습니다. 다음 예시는 이름이 a부터 m으로 시작하는 모든 공룡을 검색합니다.

curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="$key"&startAt="a"&endAt="m"&print=pretty'

값으로 필터링

orderBy="$value" 매개변수를 사용하여 하위 키 값을 기준으로 노드를 필터링할 수 있습니다. 공룡들이 운동경기를 펼친 결과 점수를 다음과 같은 형식으로 기록한다고 가정해 보겠습니다.

{
  "scores": {
    "bruhathkayosaurus": 55,
    "lambeosaurus": 21,
    "linhenykus": 80,
    "pterodactyl": 93,
    "stegosaurus": 5,
    "triceratops": 22
  }
}

점수가 50을 초과하는 공룡을 모두 검색하려면 다음 요청을 실행합니다.

curl 'https://dinosaur-facts.firebaseio.com/scores.json?orderBy="$value"&startAt=50&print=pretty'

orderBy="$value"를 사용할 때 null, 부울, 문자열, 객체 값이 정렬되는 방식에 대한 설명은 데이터의 순서 섹션을 참조하세요.

복잡한 필터링

여러 매개변수를 조합하여 복잡한 쿼리를 작성할 수 있습니다.

제한 쿼리

limitToFirstlimitToLast 매개변수는 데이터를 수신할 하위 항목의 최대 개수를 설정하는 데 사용됩니다. 제한을 100개로 설정하면 일치하는 하위 항목이 최대 100개만 수신됩니다. 데이터베이스에 저장된 메시지가 100개 미만이면 모든 하위 항목이 수신됩니다. 그러나 메시지가 100개를 넘으면 메시지 중 100개의 데이터만 수신됩니다. limitToFirst를 사용하면 정렬된 메시지 중 처음 100개가, limitToLast를 사용하면 정렬된 메시지 중 마지막 100개가 수신됩니다.

공룡 자료 데이터베이스와 orderBy를 사용하여 가장 무거운 두 공룡을 찾아낼 수 있습니다.

curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="weight"&limitToLast=2&print=pretty'

마찬가지로 limitToFirst를 사용하여 키가 가장 작은 두 공룡을 찾아낼 수 있습니다.

curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="height"&limitToFirst=2&print=pretty'

orderBy="$value"를 사용하여 제한 쿼리를 실행할 수도 있습니다. 공룡 운동경기 점수 1, 2, 3위를 포함하는 리더보드를 만들려면 다음 쿼리를 실행합니다.

curl 'https://dinosaur-facts.firebaseio.com/scores.json?orderBy="$value"&limitToLast=3&print=pretty'

범위 쿼리

startAt, endAt, equalTo를 사용하면 쿼리의 시작 및 종료 지점을 임의로 선택할 수 있습니다. 예를 들어 키가 3미터 이상인 공룡을 모두 검색하려면 orderBystartAt을 조합합니다.

curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="height"&startAt=3&print=pretty'

endAt을 사용하면 이름이 사전순으로 Pterodactyl보다 먼저 나오는 공룡을 모두 찾을 수 있습니다.

curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="$key"&endAt="pterodactyl"&print=pretty'

startAtendAt을 조합하여 쿼리의 양단을 모두 제한할 수 있습니다. 다음 예제에서는 이름이 'b'로 시작되는 공룡을 모두 검색합니다.

curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="$key"&startAt="b"&endAt="b\uf8ff"&print=pretty'

범위 쿼리는 데이터를 페이지화하는 경우에도 유용합니다.

하나로 결합

이러한 기법을 모두 조합하여 복잡한 쿼리를 만들 수 있습니다. 예를 들어 유명한 공룡인 스테고사우르스보다 키가 작거나 같은 모든 공룡의 이름을 검색할 수 있습니다.

MY_FAV_DINO_HEIGHT=`curl "https://dinosaur-facts.firebaseio.com/dinosaurs/stegosaurus/height.json"`
curl "https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy=\"height\"&endAt=${MY_FAV_DINO_HEIGHT}&print=pretty"

데이터의 순서

이 섹션에서는 3가지 필터링 매개변수를 사용할 때 데이터가 정렬되는 방식을 각각 설명합니다.

orderBy

orderBy를 하위 키 이름과 함께 사용하면 지정된 하위 키를 포함하는 데이터가 다음과 같이 정렬됩니다.

  1. 지정된 하위 키의 값이 null인 하위 항목이 맨 처음에 옵니다.
  2. 지정된 하위 키의 값이 false인 하위 항목이 그 다음에 옵니다. 값이 false인 하위 항목이 여러 개이면 키에 따라 사전순으로 정렬됩니다.
  3. 지정된 하위 키의 값이 true인 하위 항목이 그 다음에 옵니다. 값이 true인 하위 항목이 여러 개이면 키에 따라 사전순으로 정렬됩니다.
  4. 숫자 값을 갖는 하위 항목이 다음에 나오며 오름차순으로 정렬됩니다. 지정된 하위 노드의 숫자 값이 동일한 하위 항목이 여러 개이면 키에 따라 정렬됩니다.
  5. 숫자 다음에는 문자열이 나오며 사전순, 오름차순으로 정렬됩니다. 지정된 하위 노드의 값이 동일한 하위 항목이 여러 개이면 키에 따라 사전순으로 정렬됩니다.
  6. 마지막으로 객체가 나오며 키에 따라 사전순, 오름차순으로 정렬됩니다.
필터링된 결과는 정렬 없이 반환됩니다. 데이터의 순서가 중요한 경우 Firebase에서 결과가 반환된 후 애플리케이션에서 정렬해야 합니다.

orderBy="$key"

orderBy="$key" 매개변수를 사용하여 데이터를 정렬하면 다음과 같이 데이터가 키에 따라 오름차순으로 반환됩니다. 키는 항상 문자열입니다.

  1. 키가 32비트 정수로 파싱될 수 있는 하위 항목이 맨 처음에 나오며 오름차순으로 정렬됩니다.
  2. 키가 문자열 값인 하위 항목이 다음에 나오며 사전순, 오름차순으로 정렬됩니다.

orderBy="$value"

orderBy="$value" 매개변수를 사용하여 데이터를 정렬하면 하위 항목이 값에 따라 정렬됩니다. 정렬 기준은 데이터를 하위 키에 따라 정렬할 때와 동일하며, 지정된 하위 키의 값 대신 노드의 값이 사용된다는 점이 다릅니다.

orderBy="$priority"

orderBy="$priority" 매개변수를 사용하여 데이터를 정렬하면 다음과 같이 우선순위 및 키에 따라 하위 항목이 정렬됩니다. 우선순위 값은 항상 숫자 또는 문자열입니다.

  1. 우선순위가 없는(기본값) 하위 항목이 맨 처음에 옵니다.
  2. 우선순위가 숫자인 하위 항목이 다음에 옵니다. 우선순위에 따라 오름차순으로 정렬됩니다.
  3. 우선순위가 문자열인 하위 항목이 마지막에 옵니다. 우선순위에 따라 사전순으로 정렬됩니다.
  4. 우선순위가 없는 경우를 포함하여 두 하위 항목의 우선순위가 같은 경우 키에 따라 정렬됩니다. 오름차순으로 정렬된 숫자 키가 먼저 나오며 사전순으로 정렬된 나머지 키가 뒤에 나옵니다.

우선순위에 대한 자세한 내용은 API 참조에서 확인할 수 있습니다.

REST API에서 스트리밍

Firebase REST 엔드포인트는 EventSource / 서버 전송 이벤트 프로토콜을 지원하므로 Firebase 데이터베이스의 단일 위치에 대한 변경을 손쉽게 스트리밍할 수 있습니다.

스트리밍을 시작하려면 다음을 수행해야 합니다.

  1. 클라이언트의 Accept 헤더를 text/event-stream으로 설정합니다.
  2. HTTP 리디렉션, 특히 HTTP 상태 코드 307을 준수합니다.
  3. Firebase 데이터베이스 위치에 읽기 권한이 필요한 경우 auth 쿼리 매개변수를 포함합니다.

요청된 URL의 데이터 상태가 변경되면 서버에서 명명된 이벤트를 전송합니다. 이러한 메시지의 구조는 EventSource 프로토콜을 준수합니다.

event: event name
data: JSON encoded data payload

서버는 다음과 같은 이벤트를 전송할 수 있습니다.

put JSON 인코딩 데이터는 경로와 데이터라는 두 개의 키를 갖는 객체입니다.
경로는 요청 URL을 기준으로 하는 상대 위치를 가리킵니다.
클라이언트는 캐시에서 해당 위치의 모든 데이터를 메시지에 지정된 데이터로 대체합니다.
patch JSON 인코딩 데이터는 경로와 데이터라는 두 개의 키를 갖는 객체입니다.
경로는 요청 URL을 기준으로 하는 상대 위치를 가리킵니다.
데이터의 각 키에 대해 클라이언트는 캐시의 해당 키를 메시지의 해당 키 데이터로 대체합니다.
keep-alive 이 이벤트의 데이터는 null이며 어떠한 조치도 필요하지 않습니다.
cancel 이 이벤트의 데이터는 null입니다.
이 이벤트는 Firebase 실시간 데이터베이스 보안 규칙으로 인해 요청된 위치에서 읽기가 더 이상 허용되지 않을 때 전송됩니다.
auth_revoked 이 이벤트의 데이터는 사용자 인증 정보가 만료되었음을 나타내는 문자열입니다.
이 이벤트는 제공된 인증 매개변수가 더 이상 유효하지 않을 때 전송됩니다.

다음은 서버가 전송할 수 있는 이벤트 세트의 예시입니다.

// Set your entire cache to {"a": 1, "b": 2}
event: put
data: {"path": "/", "data": {"a": 1, "b": 2}}


// Put the new data in your cache under the key 'c', so that the complete cache now looks like:
// {"a": 1, "b": 2, "c": {"foo": true, "bar": false}}
event: put
data: {"path": "/c", "data": {"foo": true, "bar": false}}


// For each key in the data, update (or add) the corresponding key in your cache at path /c,
// for a final cache of: {"a": 1, "b": 2, "c": {"foo": 3, "bar": false, "baz": 4}}
event: patch
data: {"path": "/c", "data": {"foo": 3, "baz": 4}}

Go를 사용하는 경우 Firebase REST와 Streaming API를 기반으로 하는 타사 래퍼 Firego에 대해 알아보세요.