배경
카우치베이스 + Nodejs = 신속한 개발
작년에 Couchbase의 모든 nodejs의 소유자인 브렛 로슨은 곧 출시될 Node.js용 ODM(객체 데이터 매퍼)인 "Ottoman"의 프리뷰를 선보였습니다. 그 이후로 Couchbase 노드 개발자들로부터 가장 많은 요청을 받은 항목 중 하나가 "언제 Ottoman을 사용할 수 있나요?"였습니다. 드디어 그 때가 왔습니다! 이제 Ottoman이 공식 출시됨에 따라 샘플 nodejs 애플리케이션을 구축하는 방법과 특히 REST API를 구축하고 복잡한 데이터 모델을 프로토타이핑할 때 Couchbase와 Ottoman을 사용하면 어떻게 강력하고 신속한 개발 환경을 조성할 수 있는지 소개해 드리게 되어 기쁘게 생각합니다.
왜 오스만인가요?
이미 매우 성숙한 Couchbase용 Node.js 클라이언트가 있는데 ODM을 사용하는 것이 왜 그렇게 바람직할까요? 이 질문에 대한 답을 이해하기 위해 오토바이 대리점을 위해 구축된 인벤토리 애플리케이션의 실제 사례를 살펴보겠습니다. Node.js 사용 및 Couchbase.
더 많이 타고, 더 적게 코딩하기
- ODM을 통해 개발자는 다음을 수행할 수 있습니다:
- 객체에서 기본적으로 작업하세요. nodejs v0.12부터는 이 기능이 점점 더 중요해질 것입니다.
- 관계를 포함한 데이터 모델을 신속하게 프로토타이핑하고 정의하기
- 힘들고 지루한 작업은 다른 사람에게 맡기세요.
- 다양한 데이터 유형을 지원하며, 그 중 일부는 Ottoman에 미리 정의되어 있습니다.
- 사용자 지정 유효성 검사기를 포함한 사용자 지정 데이터 유형 지원
- 객체 또는 참조를 포함하기 위해 데이터를 모델링하고 이러한 관계를 선명하게 유지하세요.
- 일반 검색에 대한 지원 제공
- 기본적으로 여러 인덱싱 전략 지원
- 애플리케이션 내에서 데이터 모델을 제어하고 적용합니다.
- 데이터 모델에 매핑되는 객체 메서드를 프로그래밍 방식으로 정의합니다.
ODM 및 Couchbase를 사용하여 Node.js 애플리케이션 빌드하기
참고로 샘플 코드는 다음 링크에서 확인할 수 있습니다. github Couchbase로 노드 애플리케이션 구축을 시작하는 세 가지 쉬운 단계가 있습니다. 더 진행하기 전에 이 단계를 먼저 살펴보겠습니다:
CB 4.0 Enterprise를 다운로드하여 설치합니다. 엔터프라이즈 버전은 모든 개발 역량에서 무료로 사용할 수 있습니다. 최신 버전은 웹사이트에서 다운로드할 수 있습니다. 설치 후 브라우저를 Couchbase가 설치된 포트 8091로 열면 그래픽 UI가 설정 과정을 안내합니다. 이 안내 및 애플리케이션의 목적상 애플리케이션을 개발할 OS에 Couchbase가 설치되어 있다고 가정하겠습니다. 설치된 Couchbase 인스턴스에 연결하려면 브라우저를 열어 http://127.0.0.1:8091 으로 이동합니다. "새 클러스터 시작" 아래의 "서버 구성" 페이지에서 데이터, 인덱스, 쿼리 서비스를 모두 선택해야 합니다. 샘플 애플리케이션을 빌드하기 위해 이 서비스들이 필요합니다.
이 튜토리얼에서는 포함된 샘플 버킷 중 하나를 사용할 필요가 없습니다. 아무 것도 선택하지 않고 "샘플 버킷"이라고 표시된 페이지에서 다음을 클릭하세요. 설정을 계속 진행하여 기본 버킷을 추가하면 이제 애플리케이션 구축을 계속할 준비가 된 것입니다.
노드 웹사이트에서 nodejs를 설치합니다. nodejs가 설치되면 애플리케이션을 부트스트랩할 수 있습니다. 애플리케이션을 부트스트랩하려면 디렉토리를 만들고 github에서 리포지토리를 복제합니다. 터미널에서
1 2 |
mkdir ~/바이크샵-cb git 복제 https://github.com/ToddGreenstein/bikeshop-cb.git ~/bikeshop-cb/ |
애플리케이션의 루트 디렉터리에 있는 package.json 파일에는 애플리케이션의 종속성이 나열되어 있습니다. 현재 github에 저장된 베타 브랜치로 Ottoman이 나열되어 있으며, 다른 종속 요소는 최신 버전이 설치됩니다.
1 2 3 4 5 |
"종속성": { "express": "*", "couchbase": "*", "body-parser": "*", "ottoman":"git+https://github.com/couchbaselabs/node-ottoman.git#refactor" |
다음 단계는 종속성을 설치하는 것입니다. 터미널 실행에서
1 |
npm 설치 |
bikeshop-cb
이 애플리케이션의 요구 사항은 다음과 같습니다:
- 자전거 카탈로그를 위한 인벤토리 애플리케이션.
- 애플리케이션은 시승 및 구매 정보를 추적하기 위해 고객 및 영업사원 정보를 저장해야 합니다.
- 카우치베이스가 기록 시스템이 될 것입니다.
- 애플리케이션은 프론트엔드 프레임워크에서 분리되어야 하며, HTTP REST API를 통해 다른 백엔드 시스템과의 통합을 지원해야 합니다.
데이터 모델
NOSQL 문서 데이터베이스와 JSON의 유연성과 동적 특성은 데이터 모델 구축을 간소화합니다. 바이크샵 애플리케이션에서는 세 가지 유형의 객체를 사용하며, 노드 애플리케이션의 특정 모듈에서 이를 정의할 것입니다.
- 고객
- 직원
- 자전거
애플리케이션의 루트 아래에 있는 /schema라는 폴더에 데이터 모델이 정의되어 있으며, /schema/model에는 각 개체에 대한 별도의 모델 파일이 정의되어 있습니다. customer.js 모듈부터 데이터 모델을 살펴보겠습니다.
고객 모델
customer.js 모듈의 첫 번째 섹션은 모듈 종속성을 인스턴스화하며, 여기에는 이 특정 예제에 대한 Couchbase 인스턴스의 정보가 저장되는 데이터베이스 파일과 Ottoman이 포함됩니다.
다음으로 표준 미국 형식의 전화번호가 생성되도록 사용자 지정 유효성 검사기 함수를 정의합니다.
Customer 객체의 모델은 Ottoman이 지원하는 몇 가지 기본 제공 유형을 사용하여 정의됩니다. 추가 참조는 ottomanjs.com을 참조하세요. 모델과 함께 여러 인덱스가 정의됩니다. 인덱스는 고객 개체의 각 인스턴스에 대한 메서드로 활용됩니다. Ottoman은 복잡한 데이터 유형, 다른 모델에 대한 임베디드 참조 및 사용자 지정을 지원합니다.
위의 고객 모델에는 4개의 명시적 인덱스가 정의되어 있습니다. 기본적으로 인덱스 유형이 지정되지 않은 경우, Ottoman은 현재 Couchbase 클러스터 내에서 지원되는 가장 빠른 사용 가능한 인덱스를 선택합니다. Couchbase 내에서 기본 제공되는 보조 인덱스 지원을 활용하는 것 외에도, Ottoman은 참조 문서를 활용하고 업데이트 및 삭제에 대한 참조 무결성을 유지할 수 있습니다. 이는 특정 필드별로 매우 빠르게 조회할 수 있는 강력한 기능입니다. 위의 예에서 고객 ID나 이메일 주소와 같은 고유 필드로 특정 개체를 찾을 때 Ottoman의 이러한 유형의 인덱스가 유용합니다. 명시적 인덱스 외에도 Ottoman은 쿼리 API와 N1QL을 사용하여 일반적인 찾기 기능도 제공합니다.
Customer 모델의 다음 코드 블록은 애플리케이션이 한 단계로 고객의 새 인스턴스를 생성하고 저장할 수 있도록 하는 함수입니다. "create" 메서드는 Ottoman에서 편의상 객체에 대해 제공하는 기본 메서드입니다. 또한 새 객체를 인스턴스화하고 모든 필드를 할당한 다음 Ottoman이 각 객체에 대해 제공하는 "저장" 메서드를 사용하여 객체를 저장할 수도 있습니다. 이 방법의 예는 아래의 자전거 모델에 포함되어 있습니다. 마지막으로, 다른 모듈에서 사용할 수 있도록 고객에 대한 오스만 모델을 내보냅니다.
자전거 모델
bike.js 모듈은 customer.js 모듈과 거의 같은 방식으로 시작됩니다. 여기서 중요한 점은 다른 오트만 객체에서 참조하는 객체는 다른 모듈 내에서 노드 종속성 모듈로 특별히 선언할 필요가 없다는 점입니다. 예를 들어 Bike 모델에서 위에 정의된 Customer 모듈에 대한 참조로 필드를 정의하려면 Customer 모듈을 참조로 포함할 필요가 없습니다.
Customer 모델 예시에서와 같이, Bike 객체는 여러 가지 데이터 유형, 다른 오스만 모델에 대한 임베디드 참조 및 명시적으로 정의된 보조 인덱스로 정의되어 있습니다.
고객 예제에서와 같이 인덱스는 refdoc과 기본 보조 인덱스가 혼합되어 있습니다. 고객 모듈에서와 마찬가지로 Bike 객체의 새 인스턴스를 인스턴스화하기 위해 속기 생성 및 저장 메서드가 사용됩니다.
새 객체를 인스턴스화하고, 모든 필드에 값을 할당하고, 위의 속기 함수에 사용된 객체를 저장하는 동일한 순서의 예가 참조용으로 표시되어 있습니다.
자전거 모듈에는 자전거 객체의 새로운 인스턴스가 생성될 때마다 인스턴스화되는 특수 메서드가 있습니다. 이 메서드를 사용하면 테스트 라이딩 배열에 테스트 라이딩을 추가하여 특정 자전거의 각 특정 테스트 라이딩을 기록할 수 있습니다. 마지막으로 다른 모듈에서 사용할 수 있도록 자전거 모델을 내보냅니다.
애플리케이션 및 경로
위에서 모델이 정의되었으므로 이제 컨트롤러 기능은 / root 디렉터리의 app.js 파일과 / routes 디렉터리의 routes.js 파일에 정의되어 있습니다.
앱 모듈
app.js 파일은 애플리케이션의 시작점이며 애플리케이션의 작동 방식을 정의합니다. 파일 내 코드는 다음과 같습니다:
경로
단순화를 위해 대부분의 애플리케이션 로직은 라우트 핸들러 자체에서 이루어집니다. 프로덕션 노드 애플리케이션에서 이 기능은 일반적으로 미들웨어를 사용하여 인증과 같은 작업을 처리하는 것과 함께 추상화됩니다. 애플리케이션에서 새 문서를 만드는 방법에 대한 예시를 살펴보겠습니다. 애플리케이션에 새 자전거가 추가되는 방법에 대한 기능은 routes.js 모듈에서 시작하기에 좋은 곳입니다:
bike.js 모듈에 정의된 createAndSave 메서드를 사용하면 이 항목을 데이터베이스에 쉽게 추가할 수 있습니다. 항목이 추가되면 자전거 모델용 Ottoman을 사용하여 정의한 인덱스를 메서드로 사용하여 자전거 목록 또는 특정 자전거를 쿼리할 수 있습니다. routes.js 모듈의 이 예제에서는 자전거 모델에서 stockID에 대해 정의된 refdoc 인덱스를 사용합니다:
버전 4.0 이상에서 가장 강력한 기능 중 하나는 쿼리 API입니다. N1QL 언어의 SQL 쿼리를 사용하면 Couchbase에 저장된 JSON 문서에 대해 구조화된 쿼리를 수행할 수 있습니다. Ottoman은 Ottoman 모델로 정의한 각 개체 유형에 대해 기본 일반 쿼리 방법을 제공하여 이 기능을 활용합니다. 이 기능을 자전거 모델에 사용하는 방법에 대한 예제는 routes.js 모듈에도 있습니다:
모델에서 정의한 다른 두 가지 객체 유형인 고객과 직원에 대해서도 비슷한 경로와 기능이 routes.js 모듈에 정의되어 있습니다. 객체 매퍼는 개발 시간을 빠르게 단축하고 애플리케이션이 스토리지 계층에서 완전히 추상화되면서 복잡한 객체와 상호 작용할 수 있는 강력한 패턴 언어를 만드는 데 도움이 됩니다. 예를 들어 자전거 모델에 정의된 임베디드 객체의 탈것 배열을 들 수 있습니다. 이를 통해 애플리케이션은 특정 고객, 특정 직원에 매핑되고 각 자전거와 함께 저장된 테스트 라이딩 목록을 효과적으로 기록할 수 있습니다. Ottoman을 사용하여 카우치베이스 위에 객체를 모델링하면 복잡한 관계가 스토리지 계층에 저장되는 방식에 대해 걱정할 필요가 없으며, 저장된 항목을 추출하여 애플리케이션에 표현하는 코드를 모두 작성할 필요가 없습니다. 예를 들어, routes.js 모듈에 새로운 테스트 라이딩을 추가하는 경로가 있습니다:
- 지정된 차량 번호에 맞는 자전거가 있는지 확인합니다.
- 지정된 고객 이메일 주소에 대한 고객이 존재하는지 확인합니다.
- 지정된 직원 이메일 주소에 직원이 존재하는지 확인합니다.
- 위의 정보, 마일리지, 라이딩 날짜를 기반으로 라이딩 기록에 항목을 추가합니다.
스토리지 계층에 대한 객체 매핑을 처리하면 작업이 훨씬 쉬워지고 신속한 프로토타이핑이 가능합니다. 다음은 위의 단계를 수행하는 routes.js 모듈의 예제입니다:
애플리케이션 실행
실제 데이터를 사용하여 실제 예시를 보려면 애플리케이션을 실행하고 REST API를 호출해 보세요. 아래 예제에서는 OSX의 터미널에서 실행되는 curl을 사용하여 출력을 파이썬 스크립트 "-mjson.tool"로 파이프하여 읽을 수 있는 JSON으로 변환합니다.
요약
Ottoman은 Node.js와 함께 Couchbase를 사용하는 신속한 프로토타이핑 시장 출시 전략을 개선합니다. ODM은 개발자에게 참조 무결성 유지 및 종속성 관리에 대한 코드 부담 없이 애플리케이션을 빠르게 설계, 프로토타이핑 및 빌드할 수 있는 강력한 패턴 언어를 제공합니다. 더 많이 활용하고 코딩은 줄이세요.