작년에 저는 다음과 같은 방법을 설명하는 글을 썼습니다. AngularJS와 PouchDB만으로 플랫폼과 카우치베이스 간 동기화 가능. 그 당시 AngularJS는 호황을 누리고 있었고 아마도 제가 가장 좋아하는 프레임워크였을 것입니다. 1년이 지난 지금도 AngularJS는 여전히 사용되고 있지만, 인기 있는 프레임워크의 다음 버전인 Angular 2로 서서히 대체되고 있습니다. Angular 2를 사용한 후 AngularJS 1.0을 되돌아보면 Angular 2는 정말 대단하기 때문에 제 머릿속에서 무슨 일이 벌어지고 있는지 궁금합니다.

이번에는 Angular 2, PouchDB 및 Couchbase Mobile만을 사용하여 동기화되는 간단한 웹 애플리케이션을 만드는 방법을 살펴보겠습니다.

요구 사항

이 프로젝트를 성공적으로 수행하기 위한 몇 가지 요건은 다음과 같습니다:

  • Node.js 4.0+
  • Angular 2 CLI
  • 타이핑
  • 카우치베이스 동기화 게이트웨이

Angular 2 CLI는 Node.js에 포함된 Node 패키지 관리자(NPM)를 사용하여 설치할 수 있습니다. NPM은 다양한 프로젝트 종속성을 수집할 때도 사용됩니다. 이 예제에서는 Couchbase Server를 사용하지 않겠지만, 사용할 수도 있습니다. 대신 Couchbase 동기화 게이트웨이와 프로토타이핑 기능만 사용하겠습니다.

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

모든 동기화를 처리하려면 Couchbase 동기화 게이트웨이가 필요합니다. 이 기능이 없으면 웹 애플리케이션에 로컬 저장소만 있고, 솔직히 말해서 로컬 저장소만 원한다면 PouchDB보다 훨씬 더 나은 솔루션이 있습니다.

다운로드 최신 동기화 게이트웨이를 다운로드하고 다음 구성으로 배포하세요:

라는 파일에 저장합니다. 동기화 게이트웨이-config.json 를 사용할 수 있습니다. 이것은 매우 기본적인 구성으로, 여기서는 인메모리 데이터베이스 호출 예제. 읽기 및 쓰기 권한이 없으므로 무엇이든 가능합니다. 이 구성의 맨 아래에는 CORS(교차 출처 리소스 공유)와 관련된 몇 가지 항목이 있습니다. 애플리케이션을 로컬에서 서비스할 것이므로 JavaScript 오류를 방지하기 위해 이를 식별해야 합니다.

새 Angular 2 프로젝트 만들기

이해하기 쉽도록 매우 단순한 디자인의 프로젝트를 만들어 보겠습니다. 간단한 사용자 관리 애플리케이션을 만들어 사람들을 추가하고 원하는 곳으로 동기화할 수 있도록 하겠습니다. 예를 들어 아래 애니메이션을 확인하세요:

Couchbase with PouchDB and Angular 2

위의 애니메이션에는 두 개의 웹 브라우저가 있습니다. 한 쪽에 사람을 추가하면 다른 쪽과 동기화됩니다. 이것은 Couchbase가 없었다면 특히 어려웠을 기능입니다.

먼저 Angular CLI를 사용하여 새 Angular 2 프로젝트를 생성해 보겠습니다. 명령 프롬프트(Windows) 또는 터미널(Mac 및 Linux)에서 다음을 실행합니다:

시간이 좀 걸릴 수 있지만 프로젝트가 생성되면 PouchDB와 필요한 종속 요소를 설치하려고 합니다. 다음을 실행하여 최신 PouchDB를 설치합니다:

PouchDB의 유지 관리자는 Angular 2 개발에서 중요한 기술인 TypeScript에 대해 여러 가지 감정을 가지고 있습니다. 이러한 이유로 신뢰할 수 있는 타입 정의가 없습니다. 하지만 이것은 큰 문제가 아닙니다.

타이핑을 사용하여 다음을 설치하겠습니다:

위의 유형 정의를 통해 우리는 require 키워드를 추가합니다. 이를 통해 다운로드한 PouchDB를 프로젝트에 가져올 수 있습니다.

이제 프로젝트 개발을 시작할 수 있습니다!

데이터 유지를 위한 Angular 2 공급자 개발하기

데이터로 작업할 때는 항상 프로바이더라고도 하는 Angular 2 서비스를 생성하는 것이 좋습니다. 이렇게 하면 싱글톤 인스턴스와 나머지 코드와 분리된 클래스를 가질 수 있습니다. 이는 유지보수성 측면에서 매우 좋습니다.

공급자는 수동으로 만들거나 CLI를 사용하여 만들 수 있습니다. CLI에서 다음을 실행합니다:

프로젝트에 두 개의 파일을 만들어야 합니다. src/app 디렉토리에 있습니다. 디렉터리가 있어야 합니다. pouchdb.service.tspouchdb.service.spec.ts 파일에 저장합니다. 이름이 비슷할 수도 있지만 이름은 크게 중요하지 않습니다.

그리고 사양 파일은 단위 테스트 파일로, 이 예제에서는 걱정하지 않겠습니다. 대신에 이 예제에서는 pouchdb.service.ts 파일을 만듭니다.

파일을 열고 다음 TypeScript 코드를 포함합니다:

각 메서드를 채우기 전에 우리가 무엇을 하려는지 알아봅시다. 애플리케이션이 실행되는 동안에는 하나의 데이터베이스 인스턴스만 필요합니다. 이 작업은 생성자 메서드를 사용합니다:

이 경우 로컬 데이터베이스가 호출됩니다. nraboy. 이제 PouchDB에는 정말 훌륭한 API가 있습니다. 다만 Angular 2에 최적화되지 않았기 때문에 프로젝트에서 바닐라 상태의 PouchDB로 작업할 때 약간의 문제가 발생할 수 있습니다.

모든 로컬 문서를 가져오려는 시나리오에서는 다음과 같은 작업을 수행할 수 있습니다:

저희는 include_docs 속성을 사용하여 문서가 ID 값만이 아닌 결과에도 포함되도록 할 수 있습니다. 따라서 하나의 문서만 가져오고 싶을 수도 있습니다. 다음과 같은 작업을 수행할 수 있습니다:

지금까지는 문서에서 권장하는 대로 PouchDB API를 사용했습니다. 조금 바꿔보는 것은 어떨까요? API는 문서를 생성하거나 업데이트하는 방법을 제공하지만 이를 하나의 방법으로 결합해 보겠습니다:

put 메서드는 문서 ID를 기준으로 문서가 존재하는지 확인합니다. 문서가 있으면 수정본을 새 데이터에 복사하고 다시 저장합니다. 문서가 존재하지 않으면 리비전 없이 문서를 만듭니다.

여러분은 아마도 이벤트 이미터 를 클릭하세요. 이는 Angular 2 페이지에서 변경 이벤트를 구독하는 데 필요합니다. 다음을 수행합니다. 동기화 메서드를 예로 들 수 있습니다:

여기서는 원격 데이터 소스를 정의하고, Couchbase 동기화 게이트웨이가 될 원격 데이터 소스를 정의하고, 실시간 양방향 동기화를 선택하고, 변경 사항이 발견될 때마다 이를 내보냅니다.

변경 리스너는 모든 페이지에서 다음에 액세스하여 액세스할 수 있습니다:

위에서는 청취자를 구독하는 것으로 끝납니다.

공급자가 생성되었지만 아직 모든 페이지에서 사용할 수 있는 것은 아닙니다. 프로젝트의 @NgModule 에서 찾을 수 있습니다. src/app/app.module.ts 파일을 만듭니다. 이 파일은 다음과 같은 모양입니다:

공급자 클래스를 가져와서 공급자 클래스를 공급자 배열의 @NgModule 블록을 추가합니다. 이제 애플리케이션 전체에서 공급자를 사용할 수 있습니다.

Angular 2 애플리케이션 내에서 데이터베이스 공급자 적용하기

간단하게 설명하기 위해 한 페이지짜리 애플리케이션으로 만들겠습니다. 나머지 시간은 프로젝트의 src/app/app.component.ts 그리고 src/app/app.component.html 파일.

프로젝트의 src/app/app.component.ts 파일을 열고 다음 TypeScript 코드를 포함합니다:

우리가 가져오는 것을 알 수 있습니다. PouchDBService 다른 몇 가지 사항과 함께요. 차근차근 살펴보도록 하겠습니다.

내부 앱 컴포넌트 라는 공용 배열이 있습니다. 사람들 를 생성하여 UI에 바인딩합니다. 여기에는 저장 및 동기화되는 모든 데이터가 포함됩니다. 그리고 양식 변수는 각 양식 요소를 포함하는 객체를 나타냅니다. 문자열로 분할할 수도 있지만, 결국 전체 객체를 Couchbase에 문서로 저장할 것이므로 객체가 더 편리합니다.

에서 생성자 메서드에 파우치DB 서비스를 주입하고 NgZone. 우리는 NgZone 를 사용하여 이벤트 및 기타 종류의 리스너로 작업할 때 때때로 모양이 휘어지는 각도 2 영역을 새로 고칩니다. 곧 알게 되겠지만 그리 큰 문제는 아닙니다. 마지막으로 생성자 메서드는 두 변수를 초기화합니다.

에 데이터를 로드하는 것은 잘못된 관행입니다. 생성자 메서드를 사용하므로 대신 ngOnInit 메서드를 사용합니다:

대부분의 애플리케이션 잡일 작업은 위에서 이루어집니다. 위 코드에서는 원격 동기화 게이트웨이 호스트와 데이터베이스 이름을 정의하고 있습니다. 로컬 데이터베이스의 이름과 일치할 필요는 없습니다. 그런 다음 리스너를 구독하고 변경 사항이 들어올 때마다 반복합니다. 모든 변경 사항은 공용 배열 내의 NgZone 를 클릭하면 화면에서 새로 고침됩니다.

변경 이벤트가 발생할 때만 트리거되므로 애플리케이션을 처음 초기화할 때 모든 문서를 가져와야 합니다.

이로 인해 삽입 메서드를 사용합니다:

양식 요소가 비어 있지 않으면 데이터를 데이터베이스에 문서로 저장할 수 있습니다. 저장되면 변경 이벤트가 트리거되고 데이터가 공개 배열에 추가되어 화면에 표시됩니다.

이 모든 것이 웹 애플리케이션과 카우치베이스 동기화 게이트웨이 간에 원활하게 이루어집니다.

시승 체험하기

이 Angular 2 및 PouchDB 가이드에는 많은 내용이 담겨 있습니다. I 작업 중인 프로젝트를 업로드했습니다. 를 직접 사용해보고 싶으시다면 GitHub로 이동하세요.

프로젝트를 다운로드하고 터미널 또는 명령 프롬프트에서 다음을 실행합니다:

위의 명령은 모든 프로젝트 종속성을 가져옵니다. 프로젝트의 src/app/app.component.ts 파일을 동기화 게이트웨이의 올바른 호스트 이름을 반영하도록 수정하면 정상적으로 작동합니다.

프로젝트를 실행하여 실행할 수 있습니다:

봉사하는 동안 프로젝트는 http://localhost:4200 에서 액세스할 수 있습니다.

결론

방금 PouchDB를 사용하여 데이터를 동기화하는 간단한 웹 애플리케이션을 구축하는 방법과 카우치베이스. 이것은 한 단계 업그레이드된 Angular 2 애플리케이션입니다. 작년에 쓴 가이드 는 AngularJS 1.0을 사용했습니다.

작성자

게시자 Nic Raboy, 개발자 옹호자, Couchbase

닉 라보이는 최신 웹 및 모바일 개발 기술을 옹호하는 사람입니다. 그는 Java, JavaScript, Golang 및 Angular, NativeScript, Apache Cordova와 같은 다양한 프레임워크에 대한 경험이 있습니다. Nic은 웹 및 모바일 개발을 보다 쉽게 이해할 수 있도록 자신의 개발 경험에 대해 글을 쓰고 있습니다.

댓글 하나

  1. 안녕하세요! 튜토리얼에 감사드립니다. 제안 된 명령에 따라 "필요"를 설치하려고하지만 운이 좋지 않습니다. 앵귤러 5를 실행 중입니다.

    입력 설치 dt~-require -save -global

    "ng serve"에서 다음과 같은 결과가 표시됩니다:

    "src/app/services/pouchdb.service.ts(3,17)의 오류: 오류 TS2304: 'require'라는 이름을 찾을 수 없습니다."

    아이디어가 있으신가요?

    1. 나도 같은 문제가 있습니다! 나는 제거해야 할 오래된 angular-cli를 포함하여 오래된 npm 패키지를 발견하고 @angular / cli로 대체해야했는데, 타이핑을 설치할 때 @types를 사용하기 위해 더 이상 사용되지 않는다는 알림을 받았기 때문에 비슷한 것인지 궁금합니다. 한번 시도해 보겠습니다...

  2. 이제 PouchDB는 require.js를 사용하지 않고도 TypeScript와 함께 작동합니다. PouchDB 설명서를 참조하세요: https://pouchdb.com/guides/setup-pouchdb.html#typescript

    단계:
    1. PoutchDB 설치
    > npm 설치 pouchdb -save
    2. PouchDB 유형 설치
    > npm 설치 pouchdb @types/pouchdb
    3. tsconfig.json을 편집하고 합성 기본 가져오기를 활성화합니다.
    {
    "컴파일러옵션": {
    "허용 합성 기본값 가져오기": true
    }
    }
    4. 타입스크립트 클래스에서 PouchDB를 가져옵니다: pouchdb.service.ts.
    'pouchdb'에서 PouchDB를 가져옵니다;

댓글 남기기