카우치베이스 모바일을 사용하면 생산성을 100배 높일 수 있습니다. 마찬가지로 웹 서비스에 대한 사고 방식을 혁신한 Ruby on Rails REST 기반 웹 애플리케이션 및 API 서버를 모델링하는 간결한 방법을 제공함으로써 Couchbase Sync Gateway의 핵심인 동기화 기능은 모바일 애플리케이션 데이터 관리 방식을 혁신적으로 개선할 수 있습니다.
API 서버와 모바일 REST 클라이언트 코드를 수기로 작성하던 시대는 지났습니다. 네트워크 운영 오류를 처리하는 데 할애했던 시간을 되돌릴 수는 없겠지만, 적어도 다시는 이런 일이 발생하지 않도록 할 수 있습니다.
휴대폰에 로컬 데이터베이스를 사용하면(2014년에는 코어 데이터나 SQLite보다 JSON 기반이 더 좋을 수 있습니다) 모델 객체에 저장을 요청하는 것만큼 간단할 수 있습니다. 휴대폰이 비행기 모드에 있든, 과부하 상태의 3G 연결에 있든, 고성능 Wi-Fi에 연결되어 있든, 사용자는 응답 속도에 차이를 느끼지 못할 것입니다.
클라우드의 장점은 포기하지 않으면서도 로컬 퍼스트 데이터의 성능과 안정성을 확보할 수 있는 방법이 있다면 얼마나 좋을까요? 동기화 가능한 로컬 데이터베이스를 사용하면 많은 네트워크 코드를 작성하지 않고도 변경 사항을 클라우드에 자동으로 동기화할 수 있습니다. 이렇게 하면 모바일 클라이언트 애플리케이션을 획기적으로 간소화할 수 있지만, 엣지는 절반의 이야기일 뿐입니다. 데이터가 클라우드에 도착하면 변경 사항이 유효한지 또는 거부해야 하는지 여부를 결정해야 합니다. 또한 클라우드는 누가 무엇을 볼 수 있는지 결정할 책임이 있습니다.
기존의 원격 데이터 아키텍처(모바일 앱에 네트워크 호출을 사용하는 방식)에서 업데이트 유효성 검사 및 읽기 액세스 제어는 일반적으로 다양한 백엔드 서비스 및 데이터베이스와 임시 관계를 갖는 사용자 지정 코드인 웹 애플리케이션 서버에 의해 적용됩니다. 우리는 이러한 방식으로 API 서버를 작성하는 데 익숙해졌지만, 그렇다고 해서 이 방식이 반드시 좋다는 의미는 아닙니다.
각 REST 엔드포인트에 사용자 지정 코드가 필요한 값비싼 접근 방식 대신, 동기화 게이트웨이는 Couchbase Mobile 동기화 프로토콜을 사용하며 유효성 검사, 액세스 제어 및 데이터 라우팅을 위한 자체적인 간결한 추상화를 제공합니다. 즉, 사용자 입력과 데이터베이스 작업 및 쿼리 간에 대부분의 로직을 변환하는 서버를 작성하는 대신 원하는 동작을 지정하기만 하면 동기화 게이트웨이가 세부 사항을 처리하도록 할 수 있습니다.
동기화 게이트웨이에서 사용자 지정 애플리케이션 동작은 데이터를 간단하지만 세밀하게 제어할 수 있는 JavaScript 함수로 표현됩니다. 자세한 내용 동기화 기능 문서를 참조하세요.지금은 하나만 보여주고 어떻게 작동하는지 설명하겠습니다.
다음은 예제 앱인 ToDo Lite의 동기화 기능입니다. 다음을 수행할 수 있습니다. 개발자 포털에서 ToDo Lite용 모바일 코드에 대해 알아보세요. 동일한 백엔드가 iOS, Android및 폰갭 버전.
if (doc.type == "task") {
if (!doc.list_id) {
throw({forbidden : "항목에 list_id가 있어야 합니다"})
}
requireAccess("list-"+doc.list_id);
channel("list-"+doc.list_id);
} else if (doc.type == "list") {
channel("list-"+doc._id);
if (!doc.owner) {
throw({forbidden : "목록에 소유자가 있어야 합니다"})
}
if (oldDoc) {
요구 사용자(oldDoc.소유자)
}
access(doc.owner, "list-"+doc._id);
if (Array.isArray(doc.members)) {
access(doc.members, "list-"+doc._id);
}
} else if (doc.type == "profile") {
채널("프로필");
var user = doc._id.substring(doc._id.indexOf(":")+1);
if (user !== doc.user_id) {
throw({forbidden : "프로필 user_id는 docid : " + user + " : " + doc.user_id}와 일치해야 합니다.")
}
requireUser(사용자);
액세스(사용자, "프로필");
}
}
한 번에 하나씩 살펴보면서 REST 웹 애플리케이션 서버가 수행하는 대부분의 작업을 코드 한 페이지에 어떻게 넣을 수 있는지 살펴봅시다.
동기화 함수는 각 변경에 대해 독립적으로 실행되며, 문서의 제안된 버전과 문서의 이전 버전(있는 경우)의 두 가지 인수를 받습니다. 이전 버전은 변경하는 사람이 이 문서를 소유한 사람인지 확인하거나 애플리케이션에서 문서의 특정 필드를 변경할 수 없도록 적용하는 등의 경우에 유용합니다.
if (!doc.list_id) {
throw({forbidden : "항목에 list_id가 있어야 합니다"})
}
requireAccess("list-"+doc.list_id);
channel("list-"+doc.list_id);
이 블록은 문서가 ToDo Lite의 개별 작업을 나타내는 경우 실행됩니다. 문서에 list_id 필드가 있어야 하고 작업을 업데이트하거나 생성하는 사용자에게 해당 목록에 대한 액세스 권한이 있어야 합니다. 유효성 검사를 통과하면 문서가 해당 목록의 채널로 라우팅됩니다. 다음에 목록에 액세스할 수 있는 사람이 연결하면 업데이트된 작업이 동기화됩니다.
channel("list-"+doc._id);
이 섹션은 목록과 관련된 메타데이터와 관련이 있습니다. "channel"을 호출하면 목록 메타데이터가 목록과 연결된 채널로 라우팅됩니다(이 문서에 대한 유효성 검사가 통과되었다고 가정할 때).
throw({forbidden : "목록에 소유자가 있어야 합니다"})
}
if (oldDoc) {
요구 사용자(oldDoc.소유자)
}
목록 문서에 대한 유효성 검사는 간단합니다. 모든 목록에는 소유자가 있어야 하며, 목록은 소유자만 업데이트할 수 있습니다. (유효성 검사와 라우팅은 어떤 순서로든 표현할 수 있습니다. 유효성 검사에 실패하면 이 동기화 함수 호출의 다른 호출은 아무런 영향을 미치지 않습니다.)
if (Array.isArray(doc.members)) {
access(doc.members, "list-"+doc._id);
}
마지막으로 할 일 목록 메타데이터 문서를 사용하여 적절한 사람들이 목록의 채널에서 읽을 수 있도록 액세스 권한을 부여하는 것입니다. 첫 번째 '액세스' 호출은 목록 소유자가 이 할 일 목록의 항목을 동기화할 수 있는지 확인합니다. 두 번째 호출은 멤버 배열을 전달하여 각 멤버에게 목록에 대한 액세스 권한을 부여합니다. 이러한 액세스 권한 부여는 이 함수의 첫 번째 블록에서 "requireAccess"를 호출했기 때문에 목록에 작업을 쓸 수 있는 사람에게도 영향을 미칩니다.
채널("프로필");
ToDo Lite 동기화 기능의 마지막 블록은 각 사용자가 애플리케이션 사용자 목록을 사용할 수 있도록 하여 사용자가 서로를 목록의 구성원으로 선택할 수 있도록 하는 역할을 담당합니다. 이 블록의 첫 번째 코드 줄은 사용자 프로필 문서를 '프로필' 채널로 라우팅합니다.
if (user !== doc.user_id) {
throw({forbidden : "프로필 user_id는 docid : " + user + " : " + doc.user_id}와 일치해야 합니다.")
}
requireUser(사용자);
프로필에 대한 유효성 검사는 문서가 스키마 요구 사항(문서 ID가 문서 작성자의 사용자 이름과 일치해야 함)을 충족하는지 확인합니다. 또한 누구도 다른 사람의 프로필을 편집할 수 없도록 방지합니다.
코드의 마지막 줄은 놀라울 정도로 간단할 수 있습니다. 사용자에게 '프로필' 채널에 대한 액세스 권한을 부여하는 것입니다. 즉, 새 사용자가 자신의 프로필을 만들면 시스템은 '프로필' 채널을 통해 다른 모든 사용자의 프로필에 대한 읽기 액세스 권한을 부여하는 방식으로 반응합니다.
}
}
이 예제 동기화 함수 둘러보기에서는 제공하는 도구의 대부분(전부는 아님)을 보여줍니다. 비슷한 규칙을 적용하는 REST API 서버를 작성하는 데 얼마나 많은 코드가 필요할지 상상할 수 있습니다. 훨씬 더 많습니다. 그리고 오프라인 동기화 문제를 해결하는 것은 여전히 할 일 목록에 남아 있을 것입니다.
그렇다면 카우치베이스 모바일을 사용하면 생산성이 100배 향상될까요?
또한 전체 스택은 오픈 소스이며 Apache 2 라이선스에 따라 사용할 수 있습니다!
\"100배 적은 코드!"는 말이 안 됩니다: http://timesless.com/
여기에 링크된 내 G+ 게시물(https://plus.google.com/+Aliak... ) 다음과 같은 댓글이 달렸습니다:
* 다른 가능한 옵션과의 차이점을 강조하는 것이 중요합니다(parse.com 언급됨)
* 특히 모바일에서 블로그의 서식을 더 잘 만들 수 있습니다.
Reddit의 피드백 중 일부는 이 글에 해결 방법에 대한 설명이 충분하지 않다는 것이었습니다. 저는 그 점을 해결하기 위해 글을 작성했습니다: http://tleyden.github.io/blog/…