데이터 모델링

카우치베이스와 함께하는 오스만 소개

Ottoman은 Couchbase의 Node.js SDK용 객체 데이터 모델러(ODM)로, NoSQL용 JSON 스키마 및 유효성 검사를 제공합니다.

카우치베이스에 ODM을 사용하는 이유

Ottoman을 사용하면 코드에서 스키마를 선언합니다. Couchbase에는 문서에 대한 스키마 적용이 없지만, 대부분의 애플리케이션은 NoSQL에서도 일정 수준의 스키마가 필요합니다. Ottoman과 Couchbase를 사용하여 NoSQL에서 스키마 및 유효성 검사를 수행하는 방법을 살펴보겠습니다.

문서가 특정 요구 사항을 충족하는지 확인한 후 지속하는 것이 중요합니다. Ottoman은 Couchbase SDK보다 추상화되어 있지만 이점이 단점보다 더 큽니다. 개발자는 문서 작성 및 업데이트, 사전/사후 수명 주기 작성, 데이터 구조 작업 및 유효성 검사와 관련하여 많은 로직을 생성합니다.

NoSQL 데이터베이스 및 스키마 설계

ODM은 관계형 데이터베이스에서와 마찬가지로 NoSQL에서도 비슷한 역할을 수행하지만 추가적인 이점이 있습니다. Couchbase는 스키마가 유연하기 때문에 유효성 검사를 강제하지 않습니다. 애플리케이션이 데이터를 지속할 때 특정 검사를 수행할 수 있습니다. 다양한 문서 유형에 대한 스키마와 모델을 정의하여 개별 필드에 대해 원치 않는 데이터 유형 및 형식에 대해 경고 및 오류를 발생시킬 수 있습니다.

서버 애플리케이션 코드는 비즈니스 로직과 유효성 검사를 적용하기 좋은 곳입니다. Ottoman의 목표는 더 나은 개발 환경을 제공하는 동시에 스키마 및 유효성 검사를 제어할 수 있는 기능을 제공하는 것입니다. 개발자에게 설계, 유지 관리 및 확장이 용이한 시스템을 구축할 수 있는 신뢰할 수 있는 도구를 제공하고자 합니다.

Object Data Mapping in Node.js with Ottoman for Couchbase

카우치베이스는 NoSQL 데이터베이스입니다.

CouchBase Server는 스키마가 없는 문서 데이터베이스로, NoSQL 데이터스토어로 분류되며, CouchBase는 쿼리를 위해 SQL의 변형을 사용하므로 다음과 같은 설명이 가장 적합하지 않습니다. N1QL. Couchbase와 같은 NoSQL 데이터베이스에서 스키마가 엄격하게 적용되지 않는다고 해서 스키마를 적용하지 말아야 한다는 의미는 아닙니다.

Couchbase를 사용하면 엔터프라이즈급 확장, 클러스터된 노드, JSON 형식으로 데이터를 저장하고 검색할 수 있는 기능의 이점을 누릴 수 있습니다.

몽고DB의 ODM인 몽구스에 익숙하다면, 둘 다 NodeJS용으로 만들어졌고 JSON 문서 지향 키-값 데이터베이스로 데이터를 모델링하고 지속하는 데 사용되기 때문에 중복되는 기능이 많기 때문에 Ottoman이 꽤 익숙하게 느껴질 것입니다.

문서 대 관계형 데이터베이스

카우치베이스와 NoSQL 데이터베이스 및 스키마 설계를 살펴보면서 먼저 문서 데이터 구조가 관계형 데이터베이스 설계와 어떻게 다른지 살펴보고, 아래 예제에서는 호텔을 나타내는 데이터를 나란히 비교해 보겠습니다.

왼쪽에는 전화번호를 배열에 저장하여 하나의 호텔에 대해 여러 전화번호를 저장할 수 있는 문서가 있습니다. 관계형 데이터베이스에서 이 작업을 수행하려면 새 테이블이 필요하고 기본 키를 사용하여 둘 사이의 관계를 유지해야 합니다.

NoSQL Documents vs. Relational Tables in SQL

문서 모델링에 대한 자세한 내용은 제가 블로그 게시물에 정리한 리소스를 참조하세요: JSON 데이터 모델링 가이드

Ottoman에는 애플리케이션 수준에서 스키마와 모델을 정의하는 데 도움이 되는 많은 구조가 있습니다. Ottoman에서 알아야 할 가장 중요한 용어 몇 가지를 살펴보겠습니다.

유형

위 이미지에서 분홍색으로 표시된 것처럼 Couchbase에서 이름 유형의 문서 속성은 관계형 데이터베이스의 테이블과 거의 동일합니다. 색인 목적으로 서로 다른 유형의 JSON 문서를 함께 그룹화하는 데 도움이 될 수 있습니다. Couchbase에서 보조 인덱스를 사용하면 문서의 모든 키에 대해 인덱싱할 수 있습니다. 데이터베이스의 10,000개 문서 중 100개만 '호텔' 유형을 사용하고 일반적으로 도시 또는 주를 기준으로 호텔을 검색하려는 경우, 도시 또는 주가 특정 값과 같은 100개 문서만 검색하면 되는 복합 보조 인덱스를 구축할 수 있습니다. 이는 예를 들어 기본 색인을 사용하는 것보다 훨씬 효율적입니다.

Couchbase의 인덱싱에 대해 자세히 알아보기!

컬렉션

위 그림에는 표시되지 않았지만 CouchBase 6.x(작성 시점의 최신 CouchBase 메이저 버전)의 유형과 유사하게 CouchBase 7에서는 컬렉션이 선호됩니다(이미 베타 버전). 컬렉션을 사용하는 경우 단순히 'type' 속성 대신 문서가 각 문서에 할당된 'hotel' 컬렉션.

문서

관계형 데이터베이스의 데이터 행에 비유할 수 있습니다. 기존 RDBMS 시스템은 위 그림에서 볼 수 있듯이 다른 테이블에서 관련 문서를 참조합니다. 하지만 호텔 문서의 전화번호 배열인 전화번호 속성에서 볼 수 있듯이 가능하면 해당 정보를 임베디드 문서로 포함시키는 것이 좋습니다. 아주 간단한 예이긴 하지만, 주소 속성 자체가 많은 속성을 가진 또 다른 JSON 객체라고 생각하면 이 속성을 자체 문서에 넣어야 한다고 생각할 수도 있지만 대부분의 경우 상위 문서에 해당 정보를 중첩해도 괜찮습니다.

필드

속성이라고도 하는 속성은 관계형 데이터베이스의 열과 유사하며, Ottoman을 사용하면 스키마의 일부로 필드 수준 요구 사항을 만들 수 있습니다.

스키마

Couchbase는 스키마가 없거나 스키마가 유연하지만, 문서에 대한 애플리케이션 수준에서 구조를 적용할 수 있습니다.

모델

스키마를 가져와 관계형 데이터베이스의 단일 레코드에 해당하는 문서 인스턴스를 생성하는 생성자 메서드입니다. 이 문서 인스턴스는 생성된 다음 Ottoman에 의해 Couchbase에 유지될 수 있습니다. 를 사용하여 저장() 메서드.

시작하기

객체 문서 매퍼로서 Ottoman에 익숙해지는 데 사용할 수 있는 데모 애플리케이션을 만들어 보겠습니다.

카우치베이스 설치

시작하기 전에 Couchbase를 설정해 보겠습니다.

다음 중에서 선택할 수 있습니다. 다음 옵션 중 하나를 선택합니다. (이 글에서는 #1 옵션을 사용하고 있습니다):

  1. Docker를 사용하여 카우치베이스 서버 설치하기
  2. 에서 사용 중인 OS에 맞는 Couchbase를 다운로드하세요. 카우치베이스 웹사이트

Couchbase의 Travel-Sample 데이터 집합을 사용하여 단순화된 항공사 예제의 데이터를 나타내는 모델을 구현하여 Ottoman의 몇 가지 기본 사항을 살펴보겠습니다.

저는 Visual Studio Code, NodeJS v12.14, NPM 6.14.8을 사용하고 있으므로 컴퓨터에 Node.js가 설치되어 있어야 합니다. 다음으로 빈 프로젝트를 만들고 코드 작성을 시작하겠습니다.

NPM으로 프로젝트 초기화하기

디렉터리를 만들고, 프로젝트를 초기화하고, Ottoman.js를 설치한 후 VS Code에서 엽니다.

원하는 편집기에서 터미널을 열면 마지막에 VS 코드에서 열리는 명령어를 추가했습니다.

오스만과 카우치베이스 연결

파일에서 작업을 시작합니다. ./createAirline.js 를 프로젝트 루트 아래에 추가하고 다음을 추가합니다(기본 구성 기준):

이렇게 하면 오스만 패키지를 가져오고 기본 컬렉션(Couchbase Server 6.x 스타일)을 지정합니다.

오스만 스키마 및 모델

모델은 스키마 정의에서 컴파일된 멋진 생성자입니다. 모델의 인스턴스를 문서라고 합니다. Ottoman의 모델을 사용하면 Couchbase 데이터베이스에서 문서를 쉽게 만들고, 읽고, 업데이트하고, 삭제할 수 있습니다.

오스만 모델은 몇 가지 요소로 구성됩니다:

문서 스키마 정의

스키마는 키 이름이 컬렉션의 속성 이름에 해당하는 객체를 통해 문서 속성을 정의합니다.

여기서는 세 가지 속성을 정의합니다. (콜사인, 국가, 이름) 스키마 내에서 모든 유형의 문자열. 각 모델 속성에 대한 유형을 지정합니다,  는 모델이 데이터베이스에 저장될 때 트리거되고 값의 데이터 유형이 유형이 아닌 경우 실패하는 내부 유효성 검사기에 매핑됩니다. 문자열.

허용되는 스키마 유형은 다음과 같습니다:

문서 모델 정의

오스만 인스턴스에서 모델 생성자를 호출하고 컬렉션의 이름과 스키마 정의에 대한 참조를 전달해야 합니다.

전화할 때 모델() 함수를 호출하면 스키마 복사본을 생성하고 모델을 컴파일합니다.

또한 항공사 스키마 전화 번호 속성을 추가할 수 있습니다. 값이 유효한 전화번호인지 확인하는 유효성 검사 함수를 추가할 수 있습니다. 유효성 검사 함수를 항공사 스키마 섹션에 이 세 가지 코드 블록이 있습니다:

위의 예제에서는 사용자 지정 유효성 검사기를 만드는 방법을 보여드리고 있는데, 유효성 검사기 체크인에 정규식을 사용하고 있으므로 이러한 유효성 검사기 안에 어떤 로직이든 넣을 수 있다는 점을 이해하고 잠시 후 전화 번호 매칭에 정규식을 사용한다는 점을 고려하여 코드를 줄이는 멋진 트릭을 보여드리겠습니다.

유효성 검사기 정의

유효성 검사기 오스만에 등록되어 있습니다 ( ottoman.addValidators() 메서드)는 문서의 프로퍼티가 배열에 있는 모든 값에 대해 한 번씩 호출됩니다. 프로퍼티에 배열이 없고 단일 문자열 값만 있는 경우 유효성 검사기는 한 번만 실행됩니다. 이러한 이유로 유효성 검사에 실패하면 문제가 있는 전화번호를 출력합니다.

그러나 수행 중인 검사에서 정규식을 사용하는 한 문서 속성 값의 유효성을 검사하는 더 쉬운 방법이 있습니다. 정규식을 사용하는 경우 유효성 검사기 옵션regexp 그리고 메시지 를 인수로 사용하여 코드를 다음과 같이 줄일 수 있습니다:

보시다시피, 새 스키마를 만들 때 이전에 하던 모든 작업을 인라인으로 수행할 수 있습니다. 하지만 사용자 정의 유효성 검사기를 만드는 방법을 이해하는 데 방해가 되지 않도록 하세요. 때로는 추가 로직이 필요하기 때문에 첫 번째 예제는 여전히 알아둘 가치가 있습니다.

기본 NoSQL의 문서 작업

대부분의 기본 작업은 Ottoman V2 문서에서 다루고 있으며, 여기서는 그 중 일부를 다룰 것이지만 자유롭게 오스만 V2 (알파) 문서 를 클릭하고 찾을 수 없거나 이해되지 않는 내용이 있으면 알려주세요.

문서 만들기

스키마, 모델 및 유효성 검사기를 생성하는 코드를 위에서 이미 살펴본 것을 고려해 보겠습니다. 모델을 저장하고 데이터베이스에 유지하는 것은 매우 쉽습니다. 새 항공사 모델을 사용하여 스키마 를 클릭한 다음 데이터베이스에 저장/보존합니다.

왜 우리가 그냥 저장문서() 함수를 단독으로 사용하지 않습니다. 대신 ottoman.start() 가 완료되었습니다. The 시작 메서드를 실행하는 바로 가기입니다. 보장 컬렉션 그리고 보장 인덱스. 지금 알아야 할 것은 이 방법을 사용하면 Couchbase에서 적절한 Ottoman 관련 인덱스가 생성되었는지 확인할 수 있으며 이는 다음과 같은 작업을 실행하는 데 중요하다는 것입니다. find() 메서드와 같은 도구를 사용하고 쿼리 빌더 에 대한 자세한 내용은 이 글의 마지막 부분에서 다룰 예정입니다.

이 시점에서 Node를 사용하여 작성한 모든 코드를 실행하면 문서가 데이터베이스에 저장됩니다:

이 작업의 결과입니다:

다음 필드가 반환됩니다:

  1. 콜사인, 국가 및 이름 필드는 모두 문자열로, 문서에서 사용할 수 있는 가장 기본적인 값입니다.
  2. ID 필드는 카우치베이스에서 자동 생성되며 고유 키입니다. ID 값은 다음과 같은 메서드에서 Ottoman이 있는 문서를 찾을 때 어떤 경우에도 사용됩니다. findByID 또는 removeByID
  3. 전화 필드는 배열로 표시되며 유효한 전화번호를 포함합니다.
  4. 그리고 유형 필드를 사용하면 관계형 데이터베이스의 테이블처럼 문서를 정리할 수 있습니다, 카우치베이스 7에서는 컬렉션과 범위를 사용할 수 있습니다..
유효성 검사 오류

잘못된 전화번호를 입력하고 다음을 실행하면 노드 createAirline.js 이 파일을 다시 실행하면 오류 메시지가 표시됩니다:

팁: 연결, 스키마 및 모델을 별도의 파일에 정의하고 내보낸 다음 다른 파일에서 사용할 수 있습니다. 다음과 같은 이름의 새 파일을 만듭니다. airline-schema-model.js 를 만들고 스키마와 모델 정의를 여기로 옮깁니다:

이제 몇 개의 새 파일을 만들 수 있습니다, findAirline.js, updateAirline.jsremoveAirline.js 를 클릭하고 각 파일을 다음과 같이 채웁니다:

이렇게 하면 일부 코드를 분리하여 각 파일에서 반복하지 않고 각 CRUD 작업을 진행할 때 각 파일에 일부 코드를 추가하기만 하면 스키마와 모델을 이미 가져올 수 있습니다.

문서 찾기

앞서 데이터베이스에 저장한 레코드를 검색해 보겠습니다. 모델 클래스는 데이터베이스에서 작업을 수행할 수 있는 여러 정적 메서드와 인스턴스 메서드를 노출합니다. 이제 find 메서드를 사용하여 이전에 생성한 레코드를 찾고 콜사인을 검색어로 전달해 보겠습니다. 다음과 같은 이름의 새 파일을 만들어 보겠습니다. findAirline.js 에 다음 코드를 추가하면 됩니다:

문서 결과 찾기:

문서 업데이트

콜사인을 사용하여 위의 레코드를 찾아서 수정해 보겠습니다. 콜사인이 데이터의 고유 필드라고 가정하면 한 번의 작업으로 문서를 모두 업데이트할 수 있습니다.

문서 찾기 및 결과 업데이트

문서 제거

오스만에는 문서 제거를 처리하는 몇 가지 방법이 있습니다: 제거, removeById 그리고 removeMany. 지금까지 살펴본 많은 예제를 고려할 때 각 예제는 사용 방법을 매우 쉽게 이해할 수 있으므로 여기서는 간단한 예제를 제공하여 이미 찾은 문서를 제거하는 방법을 보여 드리겠습니다. find() 메서드를 사용합니다.

문서 제거 결과는 간단합니다. CAS 값를 사용하여 Couchbase 문서의 변경 사항을 추적합니다.

미들웨어

우리는 이미 미들웨어가 작동하는 것을 보았습니다. 처음에 만든 유효성 검사기는 비동기 함수를 실행하는 동안 제어를 전달하는 파이프라인의 특정 단계에서 실행되는 함수를 사용하는 미들웨어를 활용할 수 있습니다.

사용 가능한 후크

  • 유효성 검사
  • 저장
  • 업데이트
  • 제거

미들웨어의 예(일명 사전 및 사후 후크)

문서 생성(저장) 전후에 콘솔에서 로그를 생성하는 간단한 예제를 만들어 보겠습니다. createWithHooks.js라는 새 파일을 만들겠습니다. 저장 전 문서 이름과 저장 후 문서 ID를 보고하는 사전 및 사후 후크를 추가한 것을 제외하면 대부분의 코드가 익숙해 보일 것입니다:

문서 결과 저장:

저장 전후에 메시지를 받았습니다. 유효성 검사를 통해 특정 문서 속성 값이 기준을 충족하는지 확인할 수 있습니다. 문서가 저장, 업데이트, 제거될 때의 라이프사이클을 활용하면 Ottoman 미들웨어를 파악하는 데도 도움이 되었습니다! 

쿼리 빌딩

Ottoman은 Couchbase와 N1QL에서 지원하는 많은 복잡한 작업을 처리하는 매우 풍부한 API를 제공합니다. 백그라운드에서 쿼리 빌더가 N1QL 문을 생성합니다. 쿼리 빌더를 사용할 때 사용할 모드에는 세 가지 옵션이 있습니다. 

  1. 매개 변수 사용
  2. 액세스 기능
  3. 또는 매개변수 및 액세스 함수 사용

다음 세 가지 예제에서는 각각 다른 세 가지 쿼리 빌더 모드(매개 변수, 액세스 함수 및 혼합 모드)를 사용하여 동일한 작업을 수행하겠습니다. 각 예제에서는

  1. 선택 이름 그리고 국가 항공사에서
  2. 여기서 국가 값은 "미국"
  3. 그리고 결과를 10으로 제한합니다.

먼저 이름이 지정된 새 파일을 만들어 보겠습니다: findWithQueryBuilder.js를 클릭하고 다음 코드를 추가합니다:

이 파일 중간에 다음과 같은 주석이 있습니다: "쿼리 빌더 예제로 바꾸기". 이 섹션의 다음 예제 중 하나를 파일의 해당 영역에 복사하면 됩니다.

매개변수

액세스 기능

혼합 모드

생성한 후에는 생성 쿼리() 함수를 호출하는 경우, 위의 혼합 모드 중 하나를 사용하여 비동기적으로 생성 쿼리 그리고 실행 쿼리 그리고 앞서 말씀드린 것처럼 그 코드는 위의 코드의 다양한 버전에서 작동합니다:

위의 세 가지 모드 중 하나에 해당하는 결과입니다:

리소스

결론

Ottoman의 여러 개념을 이해하는 데 도움이 되는 가이드 투어를 진행했습니다. 스키마, 모델, 미들웨어, 플러그인, 후크 및 쿼리 작성.

Ottoman에서 Couchbase에 연결하는 방법을 살펴봤습니다. 정의된 스키마 및 모델. NoSQL 데이터베이스 스키마 및 설계의 다양한 기본 사항을 다루었습니다. 마지막으로 가장 유용한 CRUD 작업 몇 가지를 살펴봤습니다. Ottoman을 통해 Couchbase에서 문서를 빠르게 만들고, 읽고, 업데이트하고, 삭제할 수 있도록 돕기 위한 모든 노력입니다.

피드백 제공 및 기여

이 글이 Couchbase에 Ottoman과 ODM을 사용하는 이유와 방법을 이해하는 데 도움이 되었기를 바랍니다. 위에서 살펴본 바와 같이 Ottoman을 사용하여 NoSQL 데이터베이스 스키마 설계, 유효성 검사 및 보일러 플레이트 감소를 수행할 수 있습니다. CRUD 작업을 간단하게 작성할 수 있어 신속한 개발에 도움이 됩니다.

Ottoman에 대해 궁금한 점이 있거나 이 오픈소스 프로젝트에 기여하고 싶거나 그냥 인사만 하고 싶으시다면, 제 이름은 Eric Bishard이고 Couchbase에서 Node.js 및 JavaScript 개발자 경험에 중점을 둔 개발자 옹호자이며, 제 DM은 항상 다음 주소에서 열려 있습니다. 트위터/@httpJunkie.

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

작성자

게시자 에릭 비샤드

국제 연사, 블로그 운영, JavaScript, React, GraphQL 및 NoSQL 커뮤니티를 위한 옹호 활동, Couchbase의 선임 개발자 옹호자로 활동하고 있습니다.

댓글 남기기

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

구축 시작

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

카펠라 무료 사용

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

연락하기

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