5분 안에 Couchbase Lite 배우기 및 CRUD 따라하기
작성자: 마테오 시스트, 모바일 기술 리드, @MOLO17
훌륭한 모바일 앱을 만드는 방법을 배우는 데 있어 핵심 요소 중 하나는 좋은 데이터베이스를 사용하는 것입니다. 따라서 이 글에서는 iOS 앱에 Couchbase Lite를 쉽게 통합하는 방법을 보여드리겠습니다.
카우치베이스 라이트란 무엇인가요? 카우치베이스 라이트는 카우치베이스의 모바일 SDK입니다. 카우치베이스 모바일 제품군을 사용하면 개발자가 NoSQL 데이터베이스를 모바일 애플리케이션에 쉽게 통합할 수 있습니다.
이 블로그에서는 CRUD 작업(만들기, 읽기, 업데이트, 삭제)을 살펴보면서 각 필수 단계에 대한 자세한 내용과 팁과 요령을 제공하고, 제가 가장 좋아하는 기능 중 하나인 동기화 게이트웨이를 중점적으로 다룹니다.
C로 만들기
첫 번째 단계는 Couchbase로 문서를 만드는 것입니다. Couchbase에는 문서를 만드는 한 가지 방법이 있습니다, 저장 문서. 이 메서드는 두 가지 매개 변수를 허용합니다. 첫 번째는 문서( 카우치베이스라이트스위프트.뮤터블 도큐먼트) 를 저장하고, 두 번째는 선택적 매개변수( 카우치베이스라이트스위프트.동시성 제어 )를 설정하여 사용자가 충돌 가능성을 자동으로 해결하거나 예외를 던져 사용자가 수동으로 충돌을 해결할 수 있도록 선택할 수 있도록 합니다. 기본값은 "LastWriteWins“.
사용 방법 저장 문서 메서드를 사용하시나요?
먼저 데이터베이스 인스턴스( 카우치베이스라이트스위프트.데이터베이스 ), 새 데이터베이스를 시작하기만 하면 됩니다:
1 2 3 4 5 |
do { 데이터베이스 = 시도 데이터베이스(이름: "데이터베이스 이름") } catch { fatalError("데이터베이스 열기 오류") } |
그런 다음 저장하려는 문서를 만들어야 합니다. 따라서 새 문서를 만듭니다. 카우치베이스라이트스위프트.뮤터블 도큐먼트 를 클릭하고 몇 가지 필드를 추가합니다:
1 2 3 4 5 |
let doc = 뮤터블 도큐먼트(id: "내 고유 문서 식별자") doc.setString("미키", forKey: "name") doc.setString("마우스", forKey: "성") doc.setInt(91, forKey: "age") doc.setString("연락처", forKey: "type") |
마지막으로 저장하기만 하면 됩니다:
1 2 3 4 5 |
do { 시도 데이터베이스.저장 문서(doc, 동시성 제어: .마지막 쓰기 승리) } catch { fatalError("문서 저장 오류") } |
보시다시피 Couchbase 내에서 문서를 만들고 저장하는 것은 정말 간단하고 직관적입니다.
Couchbase Lite로 배우는 팁과 요령
– 입력: 문서에 다음과 같은 이름의 필드를 추가했습니다. 유형 doc.setString("연락처", forKey: "type") . 이것은 문서를 유형으로 쉽게 분할하고 읽기 작업을 용이하게 하는 트릭입니다. 나중에 이 필드를 사용하는 방법을 보여드리겠습니다.
– Id: 문서를 만들 때 ID를 입력할 필요는 없습니다. 이 필드는 선택 사항이며, 입력하지 않은 경우 Couchbase에서 UUID를 생성합니다.
– 문서 작성: 원하는 경우 문서 생성자에 사전을 매개변수로 전달하여 사전(또는 키-값 맵)으로 문서를 만들 수 있습니다.
R을 읽음으로
이제 첫 번째 문서를 만들었으니 이를 읽고 목록에 표시하고 싶습니다. 문서를 검색하는 방법에는 두 가지가 있습니다:
- 아이디로 로그인
- 쿼리
아이디로 로그인
ID를 사용하여 문서를 검색하려면 먼저 읽기 작업을 위한 데이터베이스 인스턴스가 필요합니다.
1 2 3 4 5 |
do { 데이터베이스 = 시도 데이터베이스(이름: "데이터베이스 이름") } catch { fatalError("데이터베이스 열기 오류") } |
그런 다음 다음과 같은 방법을 사용할 수 있습니다. 문서 를 호출해야 문서를 검색할 수 있습니다. 이 메서드의 반환 유형은 문서가 존재하지 않는 경우 nil이 되는 선택적 문서 객체(CouchbaseLiteSwift.Document?)입니다.
1 |
let doc = 데이터베이스.문서(withID: "내 고유 문서 식별자") |
쿼리
ID로 조회하기 작업의 경우 쿼리를 위한 데이터베이스 인스턴스도 필요합니다.
1 2 3 4 5 |
do { 데이터베이스 = 시도 데이터베이스(이름: "데이터베이스 이름") } catch { fatalError("데이터베이스 열기 오류") } |
다음 단계는 쿼리를 생성하는 것입니다. 이를 위해서는 메탈랭귀지인 **N1QL**을 사용해야 합니다. N1QL은 SQL을 JSON 데이터로 확장하는 Couchbase의 쿼리 언어로, 사용자는 NoSQL 데이터베이스에서 SQL과 유사한 구문으로 쿼리를 정의할 수 있습니다. 아래 예시를 참조하세요.
1 2 3 4 |
let 쿼리 = 쿼리 빌더 .선택(SelectResult.모두()) .에서(데이터 소스.데이터베이스(데이터베이스)) .어디(표현식.속성("type").equalTo(표현식.문자열("연락처"))) |
이러한 방식으로 데이터베이스에서 '유형' 필드가 '연락처'와 같은 모든 문서를 검색하는 간단한 쿼리를 정의했습니다(물론 모든 필드가 포함됨).
이제 쿼리를 실행하기만 하면 쿼리 옵션을 관찰하는 모든 문서가 포함된 결과 집합을 받게 됩니다.
1 2 3 4 5 |
do { 결과 = 시도 쿼리.실행() } catch { fatalError("잘못된 쿼리") } |
객체 결과는 이터레이터 프로토콜을 준수하므로 각 문서를 가져와서 작업을 수행하기 위해 반복할 수 있습니다. 쿼리에서 반환되는 결과는 실행 시점의 데이터 스냅샷입니다. 그 이후에 변경된 문서는 고려되지 않습니다.
팁 및 유용한 정보 카우치베이스 라이트로 학습하기
– 쿼리 리스너: 카우치베이스는 또한 사용자가 빌드된 쿼리에서 데이터를 검색할 뿐만 아니라 향후 변경 사항을 수신할 수 있는 쿼리를 실행하는 또 다른 방법을 제공합니다. 이 방법은 첫 번째 방법만큼이나 간단합니다. 한번 살펴보세요!
1 2 3 |
let 토큰 = 쿼리.추가 변경 리스너 { 쿼리 변경 in 결과 = 쿼리 변경.결과?.모든 결과() } |
리스너는 쿼리 결과에 포함된 문서가 변경될 때마다 호출됩니다. 토큰은 추가 변경 리스너
메서드를 사용하여 다음과 같이 청취를 중지할 수 있습니다:
1 |
쿼리.removeChangeListener(위드토큰: 토큰) |
– 문서 변환: 생성의 경우 다음을 사용하여 문서를 사전으로 쉽게 변환하거나 그 반대로 변환할 수 있습니다. toDictionary() 메서드를 사용합니다.
U로 업데이트
이제 Couchbase에 문서를 만들고 읽을 수 있게 되었으니 문서를 업데이트해 보겠습니다.
문서를 업데이트하는 것은 문서를 만드는 것과 매우 유사합니다. 업데이트할 문서를 가져온 다음 업데이트하고 다시 저장하기만 하면 됩니다. 방법을 살펴봅시다.
데이터베이스를 시작합니다:
1 2 3 4 5 |
do { 데이터베이스 = 시도 데이터베이스(이름: "데이터베이스 이름") } catch { fatalError("데이터베이스 열기 오류") } |
업데이트할 문서를 검색합니다:
1 |
let doc = 데이터베이스.문서(withID: "내 고유 문서 식별자") |
편집합니다.
1 2 |
let 문서 업데이트 = doc.toMutable() 문서 업데이트.setString("남성", forKey: "gender") |
물론 저장하세요:
1 2 3 4 5 |
do { 시도 데이터베이스.저장 문서(문서 업데이트, 동시성 제어: .마지막 쓰기 승리) } catch { fatalError("문서 업데이트 중 오류 발생") } |
D를 삭제
마지막으로, 일부 문서를 삭제하고 싶을 때 삭제하는 방법은 다음과 같습니다.
언제나 그렇듯이 데이터베이스가 필요합니다.
1 2 3 4 5 |
do { 데이터베이스 = 시도 데이터베이스(이름: "데이터베이스 이름") } catch { fatalError("데이터베이스 열기 오류") } |
업데이트 작업과 마찬가지로 삭제할 문서를 검색해야 합니다. 따라서 ID로 문서를 검색하는 방법을 사용합니다.
1 |
let doc = 데이터베이스.문서(withID: "내 고유 문서 식별자") |
이제 우리는 삭제 메서드를 사용하여 문서를 삭제할 수 있습니다. 와 마찬가지로 저장 문서를 사용하여 충돌을 수동 또는 자동으로 해결하도록 선택할 수 있습니다.
1 2 3 4 5 |
do { 시도 데이터베이스.삭제 문서(doc, 동시성 제어: .마지막 쓰기 승리) } catch { fatalError("문서 삭제 중 오류 발생") } |
카우치베이스 동기화 게이트웨이는 카우치베이스 라이트만큼 배우기 쉽습니다.
이제 CRUD를 사용하여 Couchbase Lite를 앱에 통합할 수 있습니다:
- 문서 만들기
- 원하는 경우 실시간 업데이트가 포함된 문서(또는 여러 개)를 읽습니다.
- 문서 업데이트(작성과 크게 다르지 않음)
- 문서 삭제
하지만 더 있습니다. Couchbase는 또 다른 멋진 기능을 제공합니다: 동기화 게이트웨이
동기화
동기화는 간단하면서도 효과적이기 때문에 제가 Couchbase에서 가장 좋아하는 기능 중 하나입니다. Couchbase Lite는 원격 데이터베이스를 구성하기 위해 이 기능을 제공합니다.
코드를 자세히 살펴보겠습니다.
데이터베이스 외에도 또 다른 객체, 즉 리플리케이터가 필요합니다.
1 2 3 4 5 |
do { 데이터베이스 = 시도 데이터베이스(이름: 데이터베이스 이름) } catch { fatalError("데이터베이스 열기 오류") } |
리플리케이터 개체(CouchbaseLiteSwift.Replicator)를 시작하기 위해 필요한 것은 동기화 게이트웨이의 URL이 유일한 필수 필드인 구성 개체입니다.
다른 선택적 필드는 다음과 같습니다. 복제기 유형에서 사용자가 복제를 위, 아래 또는 둘 다에서 수행할지 여부를 선택할 수 있습니다. 또 다른 필드는 연속플래그는 사용자가 복제를 한 번 실행할지 아니면 지속적으로 실행할지 여부를 구성할 수 있도록 합니다.
1 2 3 4 5 6 |
let 대상 엔드포인트 = URL엔드포인트(URL: "ws://localhost:4984/버킷이름/") let replConfig = 리플리케이터 구성(데이터베이스: 데이터베이스, 대상: 대상 엔드포인트) replConfig.복제기 유형 = .pushAndPull replConfig.연속 = true replConfig.인증자 = 기본 인증자(사용자 이름: 사용자 이름, 비밀번호: 비밀번호) 리플리케이터 = 리플리케이터(구성: replConfig) |
와 함께 리플리케이터 객체만 있으면 복제를 시작할 수 있습니다.
1 |
리플리케이터.시작() |
또는 복제를 중지합니다.
1 |
리플리케이터.중지() |
동기화로 배우는 팁과 요령
– 수신 복제 상태: 쿼리뿐만 아니라 복제에 대해서도 복제 상태의 변경 사항을 수신하는 수신기를 추가할 수 있습니다. 아래는 코드입니다.
1 2 3 |
let 토큰 = 리플리케이터.추가 변경 리스너 { 변경 사항 in 상태 = 변경 사항.상태 } |
쿼리의 경우 토큰을 사용하여 리플리케이터에서 리스너를 제거해야 합니다.
1 |
리플리케이터.removeChangeListener(위드토큰: 토큰) |
결론, Couchbase Lite는 배우기 쉽습니다.
카우치베이스 모바일 제품군의 일부인 카우치베이스 라이트는 모바일 개발자의 화살통에 있는 강력한 화살입니다. 배우기 쉽고, 이 글에서는 그 잠재력의 일부만 소개했기 때문에 모바일 앱을 지원하는 데이터베이스를 쉽게 통합하고 완벽하게 제어할 수 있는 Couchbase 기능을 더 자세히 살펴보는 것이 좋습니다.
마테오 시스트 소개, @MOLO17
마테오는 다음과 협업하기 시작했습니다. MOLO17 고등학교 재학 시절 정보 기술 과정을 통해 안드로이드 개발자로 활동했습니다. 2015년에 채용되어 모바일 개발팀에 합류한 그는 iOS와 Android 플랫폼의 핵심 개발자 역할을 맡고 있습니다. 다음 언어에 능숙합니다. 네이티브 모바일 앱 개발Java와 Objective-C부터 가장 최근의 Kotlin과 Swift에 이르기까지, 그는 소비자와 기업을 대상으로 하는 모바일 기기를 위한 여러 가지 성공적인 솔루션을 설계하고 개발했습니다. 2016년에는 모바일 앱 개발 팀을 관리하는 기술 책임자가 되었고, 2019년에는 MobileBridge(MOLO17 자매 회사)를 공동 설립했습니다.