Firebase RealTime Database
- 데이터는 트리 구조로 저장
- 관계형 데이터보다 반정규화(denormalization)를 활용
- 중복을 허용하여 읽기 작업을 빠르게 처리
- 복잡한 쿼리는 애초에 피하고, 데이터를 필요한 방식으로 구조화
Firebase 설계 시 주요 전략
- 트리 구조 설계: 데이터를 JSON 객체처럼 계층적으로 설계
{ "users": { "user1": { "name": "rem", "age": 20 }, "user2": { "name": "ram", "age": 21 } } }
- 반정규화: SQL에서 관계를 맺는 데이터를 Firebase에서는 중복 저장하여 쿼리를 최소화
{ "posts": { "post1": { "title": "Post Title", "author": { "id": "user1", "name": "rem" } } } }
예를 들어, 게시글에 작성자 정보를 포함: - 필요한 데이터만 읽기: Firebase는 경로 기반으로 데이터를 가져오므로, 필요한 데이터만 가져오도록 설계
예: 특정 유저의 이름만 가져오기:
rootRef.child('users/user1/name').once('value', function(snapshot) {
console.log(snapshot.val());
});
- 데이터 업데이트와 동기화:
- 중첩된 데이터보다는 평평한(flattened) 구조로 설계해 업데이트를 쉽게 처리.
- 데이터가 중복된 경우, 트리의 여러 위치를 한 번에 업데이트하는 멀티패스 업데이트를 사용
멀티패스 업데이트란?
일반적으로 Firebase에서 데이터를 업데이트할 때, 트리 구조로 저장된 데이터가 중첩된 경우 특정 노드만 업데이트하기가 까다로울 수 있고, 이를 해결하기 위해 여러 경로(패스)에 걸쳐 데이터를 한 번에 업데이트하는 기능을 제공
기존 데이터 구조:
{
"users": {
"user1": {
"name": "rem",
"age": 20
}
},
"posts": {
"post1": {
"title": "zerokara",
"author": "rem",
"userId": "user1"
},
"post2": {
"title": "hiii",
"author": "rem",
"userId": "user1"
}
}
}
사용자가 이름을 변경하고 싶을 때:
- 목표: /users/user1/name와 /posts의 author 필드를 동시에 업데이트
const updates = {};
updates['/users/user1/name'] = 'rem';
updates['/posts/post1/author'] = 'rem';
updates['/posts/post2/author'] = 'rem';
rootRef.update(updates)
.then(() => {
console.log('Update successful');
})
.catch((error) => {
console.error('Update failed:', error);
});
멀티패스 업데이트의 동작 방식
- 병렬 경로 업데이트:
- update()에 전달된 객체의 각 키는 업데이트할 경로를 나타내고, 값은 해당 경로에 설정할 데이터
- Firebase는 한 번의 네트워크 요청으로 여러 경로를 처리
- 기존 데이터 유지:
- update() 메서드는 지정된 경로만 수정하며, 다른 데이터는 유지
- 예를 들어, /users/user1/age는 변경되지 않음
- 최상위 루트에서도 사용 가능:
- 필요한 경우 데이터베이스의 루트 경로에서 여러 노드를 동시에 업데이트 할 수 있음
멀티패스 업데이트와 데이터 일관성
- 동시에 여러 경로를 업데이트하므로, 데이터 일관성을 유지하는 데 적합
- 하지만, 트랜잭션 처리가 아님:
- 중간에 실패하면 일부 경로만 업데이트될 가능성이 있음
- 트랜잭션이 필요한 경우 runTransaction() 메서드를 사용해야 함
멀티패스 업데이트의 장점
- 네트워크 비용 절감:
- 한 번의 네트워크 호출로 여러 경로를 처리하여 성능을 최적화
- 데이터 일관성:
- 서로 관련된 데이터를 한 번에 업데이트할 수 있어 동기화 문제를 줄임
- 간편한 데이터 관리:
- 트리 구조의 특정 경로만 수정 가능
Reference
https://firebase.google.com/docs/database?hl=ko
https://firebase.google.com/docs/database/ios/structure-data?hl=ko