본문으로 바로가기

Firebase Realtimedatabase 를 페이징 하기 위해서는 Firebase Realtimedatabse 에 Rule을 추가해줘야 한다.

RTDB (Realtimedatabase) Rule이란 RTDB가 인덱싱을 할 때 참조하게 되는 일종의 룰이다.

 

앱에서 DB를 정렬해야하는 특정한 기준이 있다면 ( 좋아요, 타임스탬프 등 ) 이것을 RULE에 기록해둬야 한다.

 

만약 DB가 다음과 같이 정렬되어 있다고 가정하자.

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

앱에서 공룡의  몸무게는 상관없이 키, 길이로만 주로 정렬을 한다고 하면 다음과 같이 Rule에 추가해주면 

RTDB 색인에 상당한 도움이 된다.

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

 

만약 Nesting 레벨이 2단계 이상이라면 , $key 라는 변수를 사용하여 rule을 추가해 줄 수 있다. 

각 공룡에 관해 유저들이 조사를 해서 각각 기록을 남기는 앱이라고 생각하고, Nesting 레벨이 1단계인 위의 사례와 달리 Nesting 레벨이 다음과 같이 2단계라 생각하자.

{"dinosaurs":{
      "lambeosaurus": {
      	"user1UIDasdads":{
            "height" : 2.1,
            "length" : 12.5,
            "weight": 5000
        },
        "user2UIDqweadssa":{
            "height" : 1.5,
            "length" : 12.5,
            "weight": 5000
        }
       },
       "stegosaurus":{
        "user1UIDzxcxz":{
                 //......       
  }
}

Nesting 레벨이 2단계 이상이기 때문에 "dinosaurs": { ".indexOn": } 으로는 룰이 적용되지 않는다.

다음과 같이 $key를 사용하여 룰을 추가할 수 있다.

{
  "rules": {
  	"dinosaurs":{
            "$key": {
              ".indexOn": ["height", "length"]
            }
    	  }
  }
}

$key를 사용하라는 것은 공식 가이드에서도 찾을 수 없었기 때문에 스택오버플로우에서 찾아내 사용하였다.

 

공식가이드에도 나와 있듯이 RTDB 의 최대 Nesting 레벨은 32 이기 때문에, 너무 많이 Nested 된 구조는 피해야 한다. 

그리고 DB를 사용할 때는 보안문제를 필연적으로 중요하게 생각할 수 밖에 없는데, 공식가이드에도 나와있듯 RTDB와 같이 Nested한 데이터를 사용할 수 있는 DB는 최대한 Flat 하게 Data structure를 짜야한다.

 

data structure 가 Flat 해야하는 이유

 

 

RTDB 데이터 색인의 공식 가이드는 다음 사이트다.

데이터 색인 생성  |  Firebase Documentation (google.com)