파이어베이스 & 그래프QL
GraphQL과 Firebase에 대한 경험이 있는 사람이 있습니까?저는 구성 요소의 소품에서 쿼리의 인수로 일부 변수를 전달하면서 관련 필드의 해결기에 파이어베이스 호출을 배치할 것이라고 생각합니다.
GraphQL을 사용하여 Firebase에 새로운 데이터를 삽입하려면 어떻게 해야 합니까?
당신의 질문에 대답하자면, 당신이 이것을 처리할 수 있는 세 가지 방법이 있습니다.
파이어베이스 & 그래프QL
Firebase 사용을 시작한 경우 Firebase의 API를 GraphQL 쿼리 및 돌연변이로 일대일 매핑할 수 있습니다.
Firebase API를 GraphQL 리졸버로 랩하고, 그런 식으로 호출할 수 있습니다.다음은 이에 대한 좋은 예입니다.
const ref = path => firebase.database().ref(path)
const getValue = path => ref(path).once('value')
const mapSnapshotToEntities = snapshot => snapshot.val().map((value, id) => ({ id, ...value }))
const getEntities = path => getValue(path).then(mapSnapshotToEntities)
const resolvers = {
Author: {
posts(author) {
return getEntities('posts').then(posts => filter(posts, { authorId: author.id }))
},
},
Post: {
author(post) {
return getEntities('authors').then(posts => filter(authors, { id: authorId }))
},
},
};
기본적으로 여기서 수행하는 작업은 Firebase를 데이터베이스로 사용하는 것입니다. 이 데이터베이스는 Resolver에서 관계형 방식으로 데이터를 쿼리할 때까지 작동합니다.데이터 저장소 위의 서버 측에서 조인을 수행할 수 없는 경우, 단일 요청을 수행하기 위해 해상도의 Firebase에 수많은 왕복 요청을 할 수 있습니다.
대부분의 사용자가 Firebase를 사용하는 이유는 실시간 기능 때문이 아니라 데이터 관계형 모델링 도구가 매우 부족하기 때문입니다.따라서 다른 데이터 원본을 사용하여 GraphQL로 마이그레이션하는 것이 좋습니다.
GraphQL 서비스형 백엔드
Firebase와 같은 BaaS 제품을 사용할 의향이 있는 경우 GraphQL BaaS로 전환하는 것이 좋습니다.
자체 호스팅 그래프QL
자체 데이터 저장소를 사용하여 자체 호스팅 솔루션으로 전환할 수 있다면 여러 가지 이점도 있습니다.여기 몇 명의 거물들이 있습니다.
특정 애플리케이션의 요구에 맞게 자체 데이터 저장소와 여러 개의 데이터 저장소를 유연하게 사용할 수 있습니다.
사용자 지정 쿼리 및 돌연변이
API의 웹 훅에 연결된 마이크로서비스를 통해 사용자 지정 로직을 기본적으로 추가
사용자 고유의 인증 및 권한 메커니즘 롤
더 저렴한 솔루션일 가능성이 높습니다.
저는 여기에 있는 몇 가지 권고 사항에 강력히 반대합니다.GraphQL은 관계형 방식으로 사용할 수 있지만 NoSQL 방식으로도 사용할 수 있습니다.RTD(Real Time Database)와 Firestore가 포함된 Firebase는 NoSQL 데이터베이스이므로 NoSQL 데이터베이스로 모델링해야 합니다!이 접근 방식에는 다음과 같은 단점이 있습니다.
최적화된 읽기:
NoSQL 데이터베이스로서 컬렉션은 클라이언트(모바일 또는 웹)의 뷰로 모델링되어야 하므로 쿼리를 만들 때 모든 것이 이미 병합되고 클라이언트 또는 Firebase 함수에서 계산된 소품을 만들 필요가 없습니다.이 접근법은 독서를 정말 빠르게 만듭니다.
최적화되지 않은 쓰기:
여기서 중요한 장점은 사용자 이름, 프로필 사진 등의 관련 데이터를 터치할 경우 데이터베이스의 모든 문서를 업데이트해야 한다는 것입니다.이 경우 데이터베이스에서 모든 문서(예: 게시물, 주석 등)를 찾아 원자성을 보장해야 합니다.이 접근 방식은 쓰기 작업보다 읽기 작업이 훨씬 많은 앱이 있는 경우에 권장됩니다(블로그와 같이 7,000개의 읽기에서 1개의 쓰기).
확장이 용이함:
귀하의 컬렉션은 다른 문서와 밀접한 관계가 없기 때문에 하나의 서버에서만 전체 컬렉션을 가질 수도 있고 여러 서버에서 전체 컬렉션을 분할할 수도 있습니다. (이것이 바로 Firebase가 DynamoDB와 같이 확장 비용이 저렴한 이유입니다.
GraphQL은 쿼리 언어일 뿐입니다.이 기능을 사용하면 쿼리를 쉽게 수행할 수 있지만 데이터베이스 모델링 방법을 지정할 수는 없습니다.데이터베이스, 쿼리 및 돌연변이를 모델링하는 방법을 지시해야 합니다.
TL;DR: 그래프QL은 Firebase가 부족한 부분에서 빛납니다.강력한 데이터 모델링, 유연하고 효율적인 쿼리 및 개방형 사양은 모두 Firebase에서 부족한 GraphQL의 필수 부분입니다.
강력한 데이터 모델링
Firebase는 제한된 데이터 모델링을 기반으로 많은 비판을 받았습니다.기본적으로 데이터는 동일한 데이터를 여러 번 나타내는 하나의 거대한 JSON으로 구성됩니다.처음에는 데이터를 업데이트해야 할 때마다 클라이언트 코드를 관리할 수 없습니다. 동일한 데이터에 대한 모든 참조를 수동으로 추적해야 하기 때문입니다.
반면에 GraphQL에서 사용되는 데이터 구조는 그래프로 모델링되므로 매우 직관적이고 생각하기에 친숙합니다.IDL 구문을 사용하여 GraphQL 스키마라고 하는 데이터 모델을 쉽게 설명할 수 있습니다.Twitter 앱의 경우 스키마는 다음과 같습니다.
type Tweet {
id: ID!
title: String!
author: User! @relation(name: "Tweets")
}
type User {
id: ID!
name: String!
tweets: [Tweet!]! @relation(name: "Tweets")
}
여기서 우리는 두 가지 유형을 정의했습니다.Tweet
그리고.User
일부 스칼라 속성 및 사이의 일대일 관계를 사용합니다.User
그리고.Tweet
단일 데이터 항목을 노드라고 하며, 사용자 노드를 많은 트윗 노드에 연결할 수 있습니다.이 데이터 구조는 Firebase의 JSON 접근 방식을 제외하면 단순하면서도 유연합니다.
유연하고 효율적인 쿼리
GraphQL의 유연한 쿼리 기능은 주요 이점 중 하나입니다.쿼리는 계층적이므로 그래프 구조를 미러링하는 데이터 요구 사항을 지정할 수 있습니다.Twitter 예제에서는 모든 사용자와 해당 트윗을 가져오는 쿼리가 있을 수 있습니다.
query {
allUsers {
id
name
tweets {
title
}
}
}
쿼리할 필드를 자유롭게 포함하거나 생략할 수 있으며 관계 전반에 걸쳐 쿼리할 수도 있습니다.즉, 여러 쿼리를 수행할 필요도 없고 불필요한 데이터를 쿼리하지도 않으므로 GraphQL 쿼리를 매우 효율적으로 수행할 수 있습니다.
쿼리 인수를 혼합에 추가하면 사용자 지정 주문 또는 필터와 같은 기능을 추가하여 강력한 GraphQL API를 얻을 수 있습니다.
Firebase에서는 이 모든 것이 불가능합니다.
실시간 데이터
Firebase의 실시간 기능은 이를 매우 인기 있게 만들었습니다. 하지만 GraphQL 커뮤니티가 실시간에 대한 합의에 도달하려고 하기 때문에 Firebase의 가장 큰 장점도 무효화됩니다.기본 개념을 더 잘 이해하기 위해 GraphQL 구독에 대한 이 비디오 튜토리얼을 추천합니다.
결론
따라서, 당신의 질문에 대답하자면, GraphQL은 대부분의 측면에서 Firebases를 능가하여 선호되는 선택입니다.
GraphQL에 관심이 있으시다면 GraphQL의 장점과 내장 인증, AWS Lambda에 대한 유연한 후크 등 강력한 기능이 결합된 Graphcool을 통해 맞춤형 비즈니스 로직을 구현해 보시기 바랍니다.
고지 사항:저는 그래프쿨에서 일합니다 :)
로컬에서 graphql & firebase를 사용할 수 있습니다.요청을 해결할 때 UI를 차단하지 않도록 웹 작업자에서 모든 무거운 작업을 수행할 수 있습니다.
"요청을 해결하는 데 필요한 많은 왕복"에 대한 한 마디: 전송된 데이터에 대해 신경 쓰지 않는다면, 모든 "왕복"이 동일한 소켓 프레임에 병합되기 때문에 큰 문제가 되지 않습니다.하지만 큰 프레임을 피하고 싶다면, 조금만 넣으면 됩니다.dataloader
당신의 소방 데이터베이스 앞에.
실시간 업데이트의 경우 파이어베이스에서 실시간 이벤트를 구독하고 웹워커로 전송하여 스키마를 통해 해결할 수 있는 실제 graphql 구독으로 변환하면 됩니다.
바로 이 문제에 대한 자세한 내용은 내 매체 게시물에서 찾을 수 있습니다: Firebase, GraphQL 및 아폴로-클라이언트 2.0이 있는 "클라이언트 측 전용" 실시간 웹 애플리케이션.
도움이 되길 바랍니다!
당신은 소방대를 사용해야 합니까?원하는 것을 제공할 수 있는 GraphQL에 더 구체적인 서비스가 있습니다.https://scaphold.io 은 특히 유망해 보이는 YC 펠로우십 회사로, 파이어베이스와 같은 경험을 제공하지만 GraphQL을 기반으로 합니다.
언급URL : https://stackoverflow.com/questions/37535374/firebase-graphql
'programing' 카테고리의 다른 글
레일즈의 현재 경로는 어떻게 알 수 있습니까? (0) | 2023.06.06 |
---|---|
목록에서 단어 빈도를 세고 빈도별로 정렬 (0) | 2023.06.06 |
개발자 연결에서 앱 ID를 제거하는 중 (0) | 2023.06.06 |
다음 SDK 구성 요소의 라이센스 계약에 동의하지 않았습니다. (0) | 2023.06.06 |
SQL Server에 열 추가 (0) | 2023.06.06 |