카우치베이스 모바일

카우치베이스 모바일 101: 첫 번째 앱 구축 방법 [카우치베이스 라이브 뉴욕]

101 세션의 카우치베이스 라이브 뉴욕 모바일 트랙에서 Couchbase Lite를 iOS 및 Android 프로젝트에 통합하는 방법을 살펴봤습니다. 에서 "카우치베이스 모바일 101: 첫 번째 모바일 앱 구축 방법" 슬라이드에 대한 깃허브 리포지토리에서 찾을 수 있는 Grocery 동기화 샘플 애플리케이션을 살펴보면서 Couchbase Mobile의 API를 살펴봤습니다. iOS 그리고 Android. 이 블로그에서는 Couchbase 101 세션에서 소개된 Couchbase Lite 기능 및 API와 Grocery Sync 샘플에 있는 일부 코드를 개괄적으로 요약해 보겠습니다. 시작하려면 다음과 같이 하세요. 카우치베이스 라이트 다운로드 개발 중인 플랫폼에 맞는 엔터프라이즈 에디션을 다운로드하고 iOS 튜토리얼 또는 Android 튜토리얼을 따라 Couchbase Lite를 모바일 프로젝트에 통합하세요.

모바일 프로젝트에 Couchbase Lite를 도입한 후에는 Couchbase Lite를 초기화하고 데이터베이스를 검색하거나 만들어야 합니다. 다음은 우리에게 필요한 몇 가지 Couchbase Mobile 개념과 요구 사항입니다.

[1] 관리자

그리고 관리자 는 데이터베이스 네임스페이스를 생성할 때 참조할 최상위 클래스입니다. 데이터베이스를 생성하는 것은 아래와 같이 문자열 이름을 참조하는 것입니다:

iOS

Android

이 코드를 사용하면 데이터베이스에서 JSON이 포함된 문서를 적절히 검색할 수 있습니다. 데이터베이스는 복제를 위한 소스 및 대상 역할도 합니다. 문서에는 각각 고유한 이름과 고유 ID가 있습니다. 그 외에도 JSON 객체는 이름 속성 집합으로, 그 값은 이름이나 문자열, 숫자, 배열, 딕셔너리 등이 될 수 있습니다.

[2] 문서

그리고 문서 문서 본문이 키-값 쌍의 JSON 중첩 객체 형태를 취하는 데이터베이스 내에 불변의 문서 ID를 포함합니다. 데이터베이스에 다양한 유형의 문서가 공존할 수 있도록 하기 위해 일반적으로 사용되는 규칙은 문서의 유형을 정의하는 문자열이 있는 'type'이라는 속성을 포함하는 것입니다. 이는 데이터베이스에 두 가지 이상의 문서 유형이 있는 경우 다양한 문서 유형을 추적하고 색인화에도 도움이 되는 기술입니다. 문서에는 다음도 포함됩니다. 개정판 변경 내역과 충돌을 추적하기 위한 목적이므로 복제가 작동하는 방식의 핵심입니다.

문서를 삽입하려면 'createDocument()' 메서드는 무작위로 생성된 UUID 형식의 문서 ID를 반환합니다. iOS용 샘플 앱에서는 'text', 'check' 및 'created_at' 속성이 정의된 Objective-C의 'NSObject'에 대응하는 'NSDictionary'가 생성됩니다. 아래는 ...

iOS

를 호출하면 새 문서의 속성을 생성한 다음 'createDocument()' 메서드에 대한 날짜베이스를 참조하여 문서를 저장합니다. 'JSONObjectWithDate'는 Cocao 날짜 객체를 가져오는 유틸리티 함수이며, 날짜는 JSON에서 네이티브 객체로 저장할 수 없으므로 ISO8601 문자열 형식으로 변환합니다.

안드로이드의 경우, 'SimpleDateFormat' 클래스는 'Calendar' 클래스의 'currentTime'과 'randomUUID()' 메서드의 UUID를 조합하여 문서 ID가 구성되는 객체에 대한 'currentTimeString'을 생성하고 있습니다. Manager 클래스에서 생성된 '데이터베이스'를 참조하여 iOS에서와 동일한 'createDocument()' 메서드를 호출하여 문서를 생성합니다. Android에서 키-값 페어링은 해시맵 객체 구조와 유사하므로 'properties' 변수에 JSON 객체에 해당하는 Java 객체인 맵을 생성합니다. 동일한 세 가지 속성이 'put()' 메서드를 통해 Java 맵에 삽입된 다음, 디스크에 지속하기 위해 'putProperties()' 메서드에 Map 객체가 전달됩니다. 아래 그림과 같습니다:

Android

[3] 첨부 파일

그리고 첨부 파일 기능은 샘플에서는 사용되지 않았지만 문서에 임의의 크기의 바이너리 블롭을 첨부할 수 있으므로 문서 업데이트가 JSON 본문과 별도로 저장되어 첨부파일 업데이트와 독립적인 복제를 최적화하는 기술입니다. 예를 들어, 연결된 첨부파일에서 메타데이터인 문서 JSON이 변경되어 첨부파일에 대한 변경 없이 문서가 업데이트되는 경우 리플리케이터가 첨부파일 전송을 생략할 수 있는 사용 사례에 해당할 수 있습니다.

[4] 조회수

그리고 보기 를 사용하면 애플리케이션이 맵 & 축소 기법을 사용해 보조 인덱스를 생성하고 유지할 수 있습니다. 먼저 JSON 문서로 시작하며, 맵 함수는 해당 문서를 입력으로 받아 키-값 쌍을 출력하는 함수를 작성하는 것입니다. 데이터베이스의 모든 문서에서 실행되는 이 맵 함수의 출력은 인덱스를 생성합니다. Grocery 동기화 샘플 애플리케이션에서는 할 일 항목을 만든 날짜별로 색인화하는 맵 함수가 있는 보기를 정의하고 있습니다. 다음에 대한 보기 만들기...

iOS

iOS의 경우 먼저 데이터베이스에 '뷰'를 생성합니다. 데이터베이스는 '뷰'를 위한 컨테이너 또는 네임스페이스이기도 하므로 'viewNamed: @"byDate"'라고 말하며, 뷰가 아직 존재하지 않으면 뷰를 생성하고 존재하면 반환합니다. 나머지 코드 블록은 맵 블록을 설정하는 것입니다. 이것은 MapReduce 뷰이므로 지도 함수가 있다는 뜻입니다. 'created_at' 속성을 보고 문서에서 날짜를 가져옵니다. 그리고 문서에 날짜가 있는 경우 이를 키로 내보냅니다. Grocery 동기화 앱에서는 실제로 문서 자체를 다시 가져와 나머지 데이터를 가져오기 때문에 값에 대해 아무 것도 방출하지 않습니다. 끝에 있는 버전 문자열인 '@"1.1″'은 지도 기능이 변경되었는지 여부에 대해 데이터베이스와 통신하는 데 사용됩니다. 데이터베이스는 맵 함수가 한 실행에서 다음 실행으로 변경된 시점을 알 수 없으므로 버전 문자열을 늘려 데이터베이스에 현재 인덱스를 버리고 다시 빌드하도록 지시하는 기법을 사용합니다.

Android

이것은 iOS와 유사하게 'database.getView()'를 호출한 다음 내부 클래스 구문을 사용하여 '맵 함수'를 생성하는 Java-Android 버전으로, Java에서는 'Mapper()' 객체로 존재합니다. 인덱스는 필요에 따라 업데이트할 수 있으며 인덱싱하려는 문서에서 유용한 정보를 추출한 다음 키-값을 출력할 수 있습니다. 무언가 변경될 때마다 지도 함수에 해당 문서가 공급됩니다. 맵 함수는 '키와 값'을 매개변수로 받는 'emit()'이라는 함수를 호출합니다.

여기서 Grocery 동기화 애플리케이션이 하는 일은 '키'로 단축된 모든 할 일 항목의 색인을 생성하는 것이며, 키는 타임스탬프이므로 값 문자열이 '할 일' 항목의 이름인 항목은 시간순으로 정렬됩니다. 인덱스는 해당 키-값 쌍을 생성한 문서의 문서 ID도 기억합니다. 따라서 쿼리 중 쿼리에 행이 있을 때 이를 사용해 문서로 돌아가서 원할 경우 데이터베이스에서 해당 행 전체를 가져올 수 있습니다. 여기서 아이디어는 일단 이 인덱스가 있으면 쿼리한다는 것입니다. 쿼리 사고방식은 "특정 키가 있는 모든 인덱스 항목, 키 집합 또는 키 범위를 원합니다."라고 말함으로써 이루어집니다.

[5] 쿼리

그런 다음 쿼리는 뷰에서 행 범위를 조회하고 행의 키와 값을 직접 사용하거나 문서 ID에서 해당 행의 출처가 된 문서를 가져올 수 있습니다. 아래 코드에서는 최신 항목이 먼저 표시되는 날짜 내림차순으로 정렬되는 쿼리를 만들어 뷰 쿼리에서 테이블을 구동하고 있습니다.

iOS

인덱스에 있는 항목을 사용하여 해당 인덱스를 사용하여 기본 Grocery 동기화 UI인 테이블 보기를 구동하려고 합니다. iOS에서는 'viewNamed: @"byDate"'라는 쿼리를 생성하고 쿼리를 생성하는 쿼리를 호출합니다. 그런 다음 시간 경과에 따라 실제로 뷰를 추적하는 쿼리의 특수한 하위 집합인 '라이브 쿼리'를 볼 수 있습니다. 가장 최근에 생성된 항목을 맨 위에 표시하기 위해 날짜의 내림차순으로 행을 가져오기 위해 쿼리의 'descending' 속성을 'yes'로 설정했습니다. 마지막으로 iOS 전용 코드를 사용하여 'dataSource'에 쿼리에 대한 정보를 전달하고 테이블 보기에서 어떤 속성을 레이블로 표시할지 지정합니다.

Android

마찬가지로, 자바-안드로이드 버전은 쿼리가 생성되는 동일한 방식으로 시작되며, 뷰에서 'toLiveQuery()'를 호출하여 'liveQuery'를 생성합니다. 그런 다음 해당 liveQuery에 대해 'addChangeListener()'가 실행되고, 쿼리 결과가 변경될 때마다 쿼리 업데이트를 위해 'changed()' 메서드가 호출됩니다. 그리고 쿼리를 실행할 때 출력되는 것은 'QueryRows'의 배열로, 각 QueryRow는 객체이며 키와 값, DocumentID와 같은 속성과 함께 문서를 데이터베이스에서 다시 로드하는 문서 속성도 가지고 있습니다. 쿼리에서 모든 행을 가져와 데이터 집합을 저장하기 위한 사용자 정의 클래스인 'grocerySyncArrayAdapter'에 추가하기 위해 'Iterator()'를 거칩니다.
[6] 라이브 쿼리

LiveQuery는 데이터베이스의 변경 알림을 수신하는 쿼리를 둘러싼 래퍼로 생각할 수 있습니다. 따라서 데이터베이스가 변경되면 LiveQuery는 쿼리를 다시 시작하여 백그라운드에서 비동기적으로 다시 실행합니다. 그런 다음 쿼리 결과를 이미 가지고 있던 이전 결과와 비교합니다. 결과가 변경된 경우 LiveQuery는 자체 알림 이벤트를 전송하고 애플리케이션은 새로운 쿼리를 기반으로 UI를 다시 그리는 등 그에 따라 처리할 수 있습니다. 아래 코드는...에 대한 테이블 셀을 표시하는 방법을 보여줍니다.

iOS

여기 샘플 애플리케이션의 경우, Couchbase Lite의 'CBLUITableSource'가 라이브 쿼리와 UITableView 사이의 중개자 역할을 하여 변경 알림을 수신하고 쿼리를 기반으로 테이블을 구동합니다. 또한 테이블뷰의 데이터 소스 객체 역할을 하는데, 이는 테이블뷰가 행에 대한 모든 데이터를 제공하도록 요청하는 객체라는 의미입니다. 그런 다음 '컨트롤러' 객체는 사용자가 행 중 하나를 탭할 때 TableView로부터 알림을 받는 UITableView의 델리게이트가 됩니다.

Android

다음은 Grocery 동기화 어댑터 클래스의 안드로이드 버전입니다. 테이블의 행 번호를 기반으로 'getItem()'을 호출하여 'QueryRow'를 가져옵니다. 그런 다음 쿼리 행에서 문서를 가져와 현재 리비전을 가져옵니다. 그런 다음 체크 및 텍스트 속성을 사용하여 행의 UI 컨트롤을 채웁니다.

마지막으로 Grocery 동기화 샘플 애플리케이션의 경우 테이블의 행을 탭하면 확인 표시를 토글하는 등 실제로 응답해야 합니다. 아래에서는 특정 인덱스에서 QueryRow를 참조하여 문서를 검색하여 이를 수행하는 방법을 설명합니다.

iOS

이것은 델리게이트에서 UITableView 자체에 대한 메서드 호출입니다. 행이 선택되었다는 것은 '탭됨'을 의미하므로 데이터 소스로 이동합니다. UI 테이블 소스 객체인 데이터 소스로 가서 해당 인덱스의 쿼리 행을 요청하고 거기서 문서를 가져옵니다. 이제 기본적으로 해당 문서에 대해 읽기, 쓰기, 수정 주기를 수행합니다. 속성을 가져오는 곳... 속성의 변경 가능한 복사본을 만들어 업데이트할 수 있는 변경 가능한 사전을 갖게 됩니다. 체크된 프로퍼티를 부울로 읽고 그 반대로 다시 씁니다. 즉, 체크된 프로퍼티의 부울 값을 반전시키는 것입니다. 그런 다음 마지막에 putProperties를 호출하여 해당 값을 다시 저장합니다.

Android

이제 안드로이드 버전으로 넘어가면 안드로이드 GUI에서 호출되는 'onItemClick()'이 있습니다. 이 함수는 해당 위치에서 쿼리 행을 가져오고, 문서를 가져오고, 속성을 꺼낸 다음 속성을 넣을 것입니다. Java API에서는 객체형 C가 아닌 경우 예외를 사용하는 것이 관용적이므로 문서를 저장할 때 핸들을 감싸는 try-catch가 있습니다. 시간 창에서 다른 것(아마도 리플리케이터)이 문서를 수정한 경우 오류가 발생합니다. 충돌 오류가 발생합니다.

다음으로 Couchbase Lite Replicator 클래스와 카우치베이스 모바일 개발자 포털 는 시작하기에 좋은 리소스입니다.

 이제부터는 다음과 같이 자세히 살펴보겠습니다. 카우치베이스 동기화 게이트웨이 102회 세션에서는 다음 주제에 대해 이야기할 예정입니다. "모바일 애플리케이션에 보안 동기화를 추가하는 방법."  103번 세션에서는 Couchbase Mobile의 피어투피어 기능을 활성화하는 방법과 함께 하루를 마무리합니다. 오스틴 고니유에서 "Couchbase Mobile로 피어 투 피어 앱 구축"을 통해 고유한 소셜 인앱 경험을 만들 수 있습니다.

이 문서 공유하기
받은 편지함에서 카우치베이스 블로그 업데이트 받기
이 필드는 필수 입력 사항입니다.

작성자

게시자 윌리엄 호앙, 모바일 개발자 옹호자, Couchbase

윌리엄은 카우치베이스의 모바일 엔지니어링/개발자 경험 팀의 개발자 옹호자였습니다. 커피와 코드에 대한 그의 사랑은 오프라인 대면 경험을 즐기면서 모바일의 세계로 넘어왔습니다. 그 전에는 Twitter, BlackBerry, Microsoft에서 개발자 관계 팀에서 일했으며, Research In Motion에서 소프트웨어 임베디드 GPS 엔지니어로 근무하기도 했습니다. 윌리엄은 맥길 대학교에서 전기 소프트웨어 공학을 전공했습니다.

댓글 남기기

카우치베이스 카펠라를 시작할 준비가 되셨나요?

구축 시작

개발자 포털에서 NoSQL을 살펴보고, 리소스를 찾아보고, 튜토리얼을 시작하세요.

카펠라 무료 사용

클릭 몇 번으로 Couchbase를 직접 체험해 보세요. Capella DBaaS는 가장 쉽고 빠르게 시작할 수 있는 방법입니다.

연락하기

카우치베이스 제품에 대해 자세히 알고 싶으신가요? 저희가 도와드리겠습니다.