이 게시물에서는 Couchbase Mobile을 사용하여 iOS 기기에서 데이터 복제/동기화를 시작하는 방법을 살펴봅니다. Couchbase 모바일 스택은 Couchbase 서버, 동기화 게이트웨이 및 Couchbase Lite 임베디드 NoSQL 데이터베이스로 구성됩니다. 이전 post에서 Couchbase Lite를 iOS 앱에서 독립형 임베디드 NoSQL 데이터베이스로 사용하는 방법에 대해 설명했습니다. 이 게시물에서는 푸시 및 풀 복제, 인증 및 액세스 제어, 채널 및 동기화 기능의 핵심 개념을 보여주는 동기화 게이트웨이와 함께 샘플 iOS 앱을 안내합니다.

여기서는 Swift의 iOS 앱 컨텍스트에서 데이터 동기화를 살펴볼 것이지만, 여기서 설명하는 모든 내용은 다른 플랫폼(Android, iOS(ObjC), Xamarin)에서 개발된 모바일 앱에도 동일하게 적용됩니다. 편차는 이와 같이 명시됩니다.

참고: 현재 프로덕션 릴리스인 Couchbase Mobile v1.4에 대해 논의할 예정입니다. 최신 개발자 미리보기 새롭고 흥미로운 기능이 많이 포함된 Couchbase Mobile 버전 2.0을 출시했습니다.

카우치베이스 모바일

Couchbase 모바일 스택은 Couchbase 서버, 동기화 게이트웨이 및 Couchbase Lite 임베디드 NoSQL 데이터베이스로 구성됩니다. 이 게시물에서는 NoSQL의 기본 사항에 대해 설명합니다. 데이터 복제 및 동기화 카우치베이스 모바일을 사용합니다. 여기서는 iOS 앱 개발, Swift의 기본, NoSQL의 기본에 익숙하고 Couchbase에 대해 어느 정도 이해하고 있다고 가정하겠습니다. Couchbase Mobile에 대해 더 자세히 알고 싶으시다면 이 글의 끝부분에서 많은 리소스를 찾아보실 수 있습니다.

카우치베이스 동기화 게이트웨이

카우치베이스 동기화 게이트웨이는 장치 간은 물론 장치와 클라우드 간에 데이터를 안전하게 동기화하는 인터넷 기반 동기화 메커니즘입니다.

다음을 제공하는 웹 인터페이스를 노출합니다.

  • 디바이스 및 클라우드 간 데이터 동기화
  • 액세스 제어
  • 데이터 유효성 검사

모든 HTTP 클라이언트를 사용하여 인터페이스를 자세히 살펴볼 수 있습니다. 다음 내용을 확인하세요. post 인터페이스 쿼리를 위해 Postman을 사용하는 방법에 대해 설명합니다.

동기화 게이트웨이를 사용한 데이터 복제 또는 동기화와 관련된 세 가지 주요 개념이 있습니다.

채널

채널은 태그와 메시지 대기열의 조합으로 볼 수 있습니다. 모든 문서는 하나 이상의 채널에 할당할 수 있습니다. 문서는 문서에 액세스할 수 있는 사용자를 지정하는 채널에 할당됩니다. 사용자는 하나 이상의 채널에 대한 액세스 권한이 부여되며 해당 채널에 할당된 문서만 읽을 수 있습니다. 자세한 내용은 채널에 대한 문서를 참조하세요.

 

동기화 기능

동기화 함수는 동기화 게이트웨이에서 실행되는 JavaScript 함수입니다. 데이터베이스에 새 문서, 수정본 또는 삭제가 추가될 때마다 동기화 함수가 호출됩니다. 동기화 함수는 다음을 담당합니다.

  •  문서 유효성 검사,
  • 변경 승인하기
  • 채널에 문서 할당 및
  • 사용자에게 채널에 대한 액세스 권한을 부여합니다.

자세한 내용은 다음을 확인하세요. 동기화 기능에 대한 문서 .

 

복제

복제 또는 동기화는 로컬 데이터베이스와 원격 동기화 게이트웨이 간의 변경 사항을 동기화하는 프로세스입니다. 두 가지 종류가 있습니다.

  • 푸시 복제는 로컬 데이터베이스에서 원격 데이터베이스로 변경 사항을 푸시하는 데 사용됩니다.
  • 풀 복제는 원격 데이터베이스에서 로컬 데이터베이스로 변경 사항을 가져오는 데 사용됩니다.

자세한 내용은 다음을 확인하세요. 복제 관련 문서.

 

카우치베이스 동기화 게이트웨이 설치

다음을 따르십시오. 설치 가이드 를 클릭하여 동기화 게이트웨이를 설치합니다.

다음 구성 파일을 사용하여 동기화 게이트웨이를 시작합니다. 구성 파일의 정확한 위치는 플랫폼에 따라 다릅니다. 자세한 내용은 설치 가이드를 참조하세요.

동기화 게이트웨이 구성 파일

구성 파일에서 주목해야 할 몇 가지 주요 사항은 다음과 같습니다.

  • 8번째 줄: '서버'의 'walrus:' 값은 동기화 게이트웨이가 데이터를 인메모리에 유지해야 하며 Couchbase 서버에 의해 백업되지 않음을 나타냅니다.
  • 11줄: 게스트 사용자 액세스가 비활성화되었습니다.
  • 12-13줄: 시스템에 "Jane"과 "Joe"라는 두 명의 사용자가 구성되어 있습니다. 두 사용자 모두 "_public" 채널에 액세스할 수 있으며 각각 자신의 비공개 채널에 액세스할 수 있습니다.
  • 22-100 라인: 다음을 수행하는 간단한 동기화 기능
    1. 29-36줄 : 문서에 사용자 정의 '태그' 및 '소유자' 속성이 포함되어 있는지 확인하기 위한 문서 유효성 검사
      1. "태그" 속성은 문서가 모든 사용자에게 공개적으로 사용 가능한지 또는 사용자에게 비공개로 제공되는지 지정하는 데 사용됩니다.
      2. '소유자' 속성은 문서가 모든 사용자에게 공개적으로 사용 가능한지 또는 사용자에게 비공개로 제공되는지 지정하는 데 사용됩니다.
    2. 46줄: 사용자에게 '_공개' 및 비공개 채널(문서 소유자를 사용하여 식별됨)에 대한 액세스 권한을 부여합니다.
    3. 51-56줄 : 문서 업데이트인 경우 "태그" 속성이 여러 수정본에서 변경되지 않았는지 확인합니다.
    4. 66줄: '공개' 태그가 있는 모든 문서를 '_public' 채널에 할당합니다.
    5. 72줄: '공개' 이외의 태그가 있는 모든 문서를 비공개 채널에 할당합니다.
      1. 75번 라인: 비공개 채널 문서의 경우 먼저 문서 소유자가 요청을 한 사람인지 확인합니다.

카우치베이스 라이트

Couchbase Lite는 기기에서 실행되는 임베디드 NoSQL 데이터베이스입니다. Couchbase Lite는 여러 배포 모드에서 사용할 수 있습니다. Couchbase Lite 시작하기  post 에서 독립형 배포 모드에 대해 설명합니다. 카우치베이스 라이트는 여러 기기에서 데이터를 동기화할 수 있는 원격 동기화 게이트웨이와 함께 사용할 수 있습니다. 이 게시물에서는 동기화 게이트웨이를 사용한 배포 모드에 대해 설명합니다.

카우치베이스 라이트 프레임워크를 iOS 앱에 통합할 수 있는 다양한 옵션이 있습니다. Couchbase 모바일을 확인하세요. 시작하기 가이드 를 클릭해 다양한 통합 옵션을 확인하세요.

네이티브 API

카우치베이스 라이트는 앱이 카우치베이스 플랫폼과 쉽게 인터페이스할 수 있는 iOS, 안드로이드, 윈도우용 네이티브 API를 제공합니다. 앱 개발자는 Couchbase Lite 임베디드 데이터베이스의 내부에 대해 걱정할 필요 없이 멋진 앱 구축에만 집중할 수 있습니다. 기본 API를 사용하면 다른 플랫폼 프레임워크/서브시스템과 상호 작용할 때와 마찬가지로 Couchbase Lite 프레임워크와 상호 작용할 수 있습니다. 이 블로그 게시물에서는 다시 한 번 Couchbase Mobile v1.4에 대해 설명하겠습니다. 전체 API 목록은 Couchbase에서 확인할 수 있습니다. 개발자 사이트.

iOS 앱 데모

여기에서 데모 Xcode 프로젝트를 다운로드하세요. 깃허브 리포지토리 를 클릭하고 '동기화 지원' 브랜치로 전환합니다. 이 블로그의 나머지 부분에서는 이 앱을 예시로 사용하겠습니다. 이 앱은 Cocoapods를 사용하여 Couchbase Lite 프레임워크를 통합합니다.

 

사용자 간 문서 동기화

  1. 앱을 빌드하고 실행합니다. 로그인 알림이 표시되어야 합니다.
  2. 사용자 "jane"과 비밀번호 "password"를 입력합니다. 이 사용자는 동기화 게이트웨이 구성 파일에서 구성되었습니다.
  3. 오른쪽 상단의 '+' 버튼을 탭하여 첫 번째 문서를 추가합니다.
    1. 문서 이름과 한 줄 설명을 입력합니다.
    2. "비공개" 태그를 사용합니다.
    3. 푸시 리플리케이터가 문서를 동기화 게이트웨이로 푸시하고 동기화 기능에 의해 처리됩니다. 동기화 기능은 태그를 기반으로 문서를 사용자의 비공개 채널에 할당합니다.
  4. 오른쪽 상단의 '+' 버튼을 탭하여 두 번째 문서를 추가합니다.
    1. 문서 이름과 한 줄 설명을 입력합니다.
    2. "공개" 태그를 사용합니다.
    3. 푸시 리플리케이터가 문서를 동기화 게이트웨이로 푸시하고 동기화 기능에 의해 처리됩니다. 동기화 함수는 공개 태그를 기반으로 문서를 공개 채널에 할당합니다.
  5. 이제 Jane 을 "로그오프"합니다. 로그인 알림이 다시 표시됩니다.
  6. 사용자 "joe"와 비밀번호 "password"를 입력합니다. 이 사용자는 동기화 게이트웨이 구성 파일에서도 구성되었습니다.
  7. Jane이 만든 공개 문서가 나열됩니다.
    1.  그 뒤에서 풀 리플리케이터는 조의 비공개 채널과 공개 채널에서 모든 문서를 가져옵니다. Jane이 만든 공개 문서는 가져오기됩니다. 그러나 Joe는 Jane의 비공개 채널에 액세스할 수 없으므로 Jane이 만든 비공개 문서는 가져오지 않습니다.

동기화 게이트웨이의 상태를 확인하려면 Postman 또는 HTTP 클라이언트를 사용하여 관리자 REST 인터페이스에 쿼리할 수 있습니다.

다음은 동기화 게이트웨이에 대한 CURL 요청입니다.

동기화 게이트웨이의 응답에는 공개 및 Jane의 비공개 채널에 각각 할당된 두 개의 문서가 표시됩니다.

 

코드 살펴보기

이제 iOS 데모 앱의 관련 코드 스니펫을 살펴보겠습니다.

사용자별 데이터베이스 열기/생성 

열기 DocListTableViewController.swift 파일을 찾아 사용자에 대한 데이터베이스 열기 함수입니다.

  1. 데이터베이스와 연결할 옵션을 지정합니다. CBLDatabaseOptions 클래스에서 다른 옵션을 살펴보세요.
  2. 현재 사용자의 이름으로 데이터베이스를 만듭니다. 이렇게 하면 앱의 모든 사용자가 자신만의 로컬 데이터베이스 복사본을 갖게 됩니다. 해당 이름의 데이터베이스가 존재하면 기존 데이터베이스에 대한 핸들이 반환되고 그렇지 않으면 새 데이터베이스가 생성됩니다. 데이터베이스 이름은 소문자로 입력해야 합니다. 성공하면 로컬 데이터베이스가 존재하지 않으면 새 로컬 데이터베이스가 만들어집니다. 기본적으로 데이터베이스는 기본 경로(/도서관/응용 프로그램 지원)에 만들어집니다. 인스턴스화할 때 다른 디렉터리를 지정할 수 있습니다. CBLManager 클래스.
  3. 주어진 사용자 자격 증명에 대해 데이터베이스 복제 프로세스를 시작합니다. 다음 섹션에서 복제 코드에 대해 자세히 설명합니다.

문서 가져오기

DocListTableViewController.swif파일을 찾아 사용자 데이터베이스에 대한 모든 문서 가져오기  함수입니다.

  1. 지정된 이름의 데이터베이스에 대한 핸들 가져오기
  2. 쿼리 객체를 만듭니다. 이 쿼리는 모든 문서를 가져오는 데 사용됩니다. 동기화 게이트웨이의 동기화 기능은 사용자가 액세스할 수 있는 채널에서만 문서를 가져오도록 합니다. 일반 쿼리 개체 또는 "라이브" 쿼리 개체를 만들 수 있습니다. "라이브" 쿼리 개체는 다음과 같은 유형입니다. CBLLiveQuery 쿼리 결과에 영향을 미치는 방식으로 데이터베이스가 변경될 때마다 자동으로 새로 고쳐집니다. 쿼리에는 결과를 사용자 지정하기 위해 조정할 수 있는 여러 가지 속성이 있습니다. 속성을 수정하고 결과에 미치는 영향을 확인해 보세요.
  3. 데이터베이스 변경사항에 대한 알림을 받으려면 라이브 쿼리 개체에 옵저버를 명시적으로 추가해야 합니다. 이에 대해서는 "문서의 로컬 및 원격 동기화된 변경사항 관찰하기" 섹션에서 자세히 설명합니다. 관찰자가 더 이상 필요하지 않으면 관찰자를 제거하고 변경사항 관찰을 중지하는 것을 잊지 마세요!
  4. 쿼리를 비동기적으로 실행합니다. 원하는 경우 동기식으로 실행할 수도 있지만 데이터 집합이 큰 경우에는 비동기식으로 실행하는 것이 좋습니다.

쿼리가 성공적으로 실행되면 CBLQueryEnumerator 객체를 얻게 됩니다. 쿼리 열거자를 사용하면 결과를 열거할 수 있습니다. 결과를 표시하는 테이블 보기의 데이터 소스로 매우 적합합니다.

문서에 대한 로컬 및 원격 동기화 변경 사항 관찰하기 

열기 DocListTableViewController.swift 파일에서 addLiveQueryObserverAndStartObserving 함수를 찾습니다.

데이터베이스의 변경 사항은 로컬 장치에서 사용자가 수행한 작업의 결과일 수도 있고 다른 장치에서 동기화된 변경 사항의 결과일 수도 있습니다.

  1. 쿼리 결과에 영향을 미치는 데이터베이스의 변경 사항을 알림 받으려면 라이브 쿼리 개체에 옵저버를 추가하세요. 대신 iOS의 키-값-옵저버 패턴을 활용하여 변경 사항에 대한 알림을 받습니다. 라이브 쿼리 개체에 KVO 옵저버를 추가하여 라이브 쿼리 개체의 "행" 속성 변경 사항을 관찰하기 시작합니다. 이는 다음과 같은 다른 플랫폼의 적절한 이벤트 핸들러 API를 통해 처리됩니다. 추가 변경 리스너 함수를 호출합니다.
  2. 변경 사항 관찰 시작 .

LiveQuery 객체의 "행" 속성에 영향을 미치는 데이터베이스에 변경 사항이 있을 때마다 앱에 변경 알림이 전송됩니다. 변경 알림을 받으면 UI를 업데이트할 수 있으며, 이 경우 테이블 뷰를 다시 로드합니다.

 

복제 요청 인증

열기 DocListTableViewController.swift 파일 를 클릭하고 사용자에 대한 데이터베이스 복제 시작 함수입니다.

모든 복제 요청은 인증을 받아야 합니다. 이 앱에서는 HTTP 기본 인증을 사용합니다.

인증자 유형에는 기본, Facebook, OAuth1, 페르소나, SSL/TLS 인증서 등 여러 가지가 있습니다.

풀 복제

열기 DocListTableViewController.swift 파일 를 클릭하고 시작풀복제위드인증자 함수입니다.

  1. 원격 동기화 게이트웨이에서 변경 사항을 가져오려면 풀 리플리케이터를 만드세요. 원격 동기화 게이트웨이의 kRemoteSyncUrl 는 동기화 게이트웨이에 있는 원격 데이터베이스 엔드포인트의 URL입니다.
  2. 인증자를 풀 복제와 연결합니다. 선택적으로 문서를 가져올 채널을 설정할 수 있습니다.
  3. 복제를 '지속'으로 설정하면 명시적으로 중지하거나 데이터베이스를 닫지 않는 한 변경 내용 업데이트를 무기한 가져올 수 있습니다.
  4. 풀 복제 시작

푸시 복제

열기 DocListTableViewController.swift 파일 를 클릭하고 시작 푸시 복제 위드 인증자 함수입니다.

  1. 푸시 복제기를 만들어 원격 동기화 게이트웨이에 변경 사항을 푸시합니다. 푸시 복제기 kRemoteSyncUrl 는 동기화 게이트웨이에 있는 원격 데이터베이스 엔드포인트의 URL입니다.
  2. 인증자를 푸시 복제와 연결합니다.
  3. 복제를 '지속'으로 설정하면 명시적으로 중지하거나 데이터베이스를 닫지 않는 한 변경 사항 업데이트를 무기한 푸시할 수 있습니다.
  4. 푸시 복제 시작

복제 상태 모니터링

열기 DBListTableViewController.swift 파일을 열고 추가 원격 데이터베이스 변경 옵저버 및 시작 옵저빙 함수를 찾습니다.

 

iOS 알림 센터에 옵저버를 추가하여 복제 상태를 모니터링하여 다음 알림을 받을 수 있습니다. cbl복제변경 알림을 추가하세요. 예를 들어 알림 핸들러를 사용하여 사용자에게 적절한 진행률 표시기를 표시할 수 있습니다. 이는 다음과 같은 다른 플랫폼의 적절한 이벤트 핸들러 API를 통해 처리됩니다. 추가 변경 리스너 함수를 호출합니다.

다음 단계는 무엇인가요?

여러분의 의견을 듣고 싶습니다. 질문이나 피드백이 있으면 언제든지 트위터로 연락해 주세요. @rajagp 또는 이메일을 보내주세요. priya.rajagopal@couchbase.com. 데모 앱을 개선하고 싶으시면 풀 리퀘스트를 제출해 주세요. 깃허브 리포지토리.

그리고 카우치베이스 모바일 개발자 포럼 는 모바일 관련 질문에 대한 답변을 얻을 수 있는 또 다른 좋은 장소이며, 개발 포털에서 자세한 내용을 확인하세요. 동기화 게이트웨이 그리고 카우치베이스 라이트 . 여기서 논의된 모든 내용은 Couchbase Mobile 1.4의 컨텍스트에 관한 것입니다. Couchbase Mobile 2.0에는 새롭고 흥미로운 변경 사항이 많이 있습니다. 반드시  개발자 미리보기 카우치베이스 모바일 버전 2.0.

작성자

게시자 프리야 라자고팔, 제품 관리 부문 선임 이사

프리야 라자고팔은 클라우드 및 엣지용 개발자 플랫폼을 담당하는 Couchbase의 제품 관리 수석 이사입니다. 그녀는 20년 이상 여러 기술 및 제품 리더십 직책을 맡으며 전문적으로 소프트웨어를 개발해 왔으며, 그중 10년 이상은 모바일 기술에 집중했습니다. TISPAN IPTV 표준 대표로서 IPTV 표준 사양에 핵심적인 기여를 했습니다. 네트워킹 및 플랫폼 보안 분야에서 22개의 특허를 보유하고 있습니다.

댓글 하나

  1. 안녕하세요 프리야..!!!!

    Swift의 데이터 동기화에 대한 정말 좋은 포스트였습니다. 객관식 C로도 제공해 주시면 감사하겠습니다.

  2. 제인 아브라함 10월 23, 2019에서 3:10 오전

    안녕하세요 프리야,

    두 개의 시뮬레이터에서 동시에 실행하여 테스트를 시도했지만 유감스럽게도 응용 프로그램이 예상대로 작동하지 않습니다. 다른 시뮬레이터에서 동일한 자격 증명으로 로그인 할 때 데이터가 동기화되지 않습니다. 매번 로컬 DB에서 데이터를 가져 오지만 글로벌 동기화는 작동하지 않습니다 .이 문제에 대해 도와주세요.

  3. 귀하의 댓글은 이 블로그 게시물 및 튜토리얼과 관련이 없는 것 같습니다(실제로는 Couchbase Mobile 1.4의 기본 iOS용입니다). 이 Xamarin 튜토리얼의 지침을 따랐나요? https://docs.couchbase.com/userprofile-couchbase-mobile/sync/userprofile/xamarin/userprofile_sync.html. 해당 자습서에서 문제가 발생하는 경우 관련 로그와 함께 개발자 포럼(forums.couchbase.com)에 게시해 주세요.

댓글 남기기