컬렉션은 Couchbase 6.5의 새로운 기능입니다. 컬렉션을 사용하면 관계형 데이터베이스의 테이블이 각 데이터베이스 내에서 유사한 레코드를 수집하는 것처럼 각 버킷 내에서 유사한 문서를 그룹화할 수 있습니다. 컬렉션은 Couchbase 7.0에서 완전히 지원될 예정이지만, 지금 바로 Couchbase 6.5 릴리스에서 개발자 프리뷰 기능으로 사용해 볼 수 있습니다. 데모 애플리케이션에서는 이미 컬렉션을 사용하고 있습니다.

컬렉션이란 무엇인가요?
관계형 데이터베이스의 세계에서 왔다면 컬렉션을 테이블로 생각할 수 있습니다. 관계형 테이블의 모든 레코드가 같은 유형인 것처럼 카우치베이스 컬렉션 내의 모든 문서는 같은 유형이어야 합니다. 관계형 스키마에는 '고객' 테이블이나 '제품' 테이블이 있을 수 있고, 마찬가지로 카우치베이스 버킷에는 '고객' 컬렉션이 있을 수 있습니다.

이전 버전의 Couchbase에서는 데이터가 다음과 같이 구성되었습니다:

  • 클러스터
    • 버킷
      • 문서

Couchbase 6.5에서는 다음과 같이 두 개의 레이어가 더 있습니다:

  • 클러스터
    • 버킷
      • 범위
        • 컬렉션
          • 문서

컬렉션은 어떻게 유용할까요?

컬렉션은 가장 낮은 수준의 문서 정리이며 문서를 직접 포함합니다. 컬렉션은 이전보다 더 정확하게 문서를 그룹화할 수 있기 때문에 유용합니다. 다양한 유형의 문서(제품, 주문, 고객)를 모두 하나의 버킷에 덤프하고 유형 필드로 구분하는 대신 각 유형에 대해 컬렉션을 만들 수 있습니다. 그리고 쿼리할 때 전체 버킷이 아닌 컬렉션을 대상으로 쿼리할 수 있습니다. 또한 궁극적으로는 컬렉션 수준에서 액세스를 제어할 수 있게 됩니다.

범위는 컬렉션보다 상위의 조직 수준입니다. 범위에는 컬렉션이 포함되고 컬렉션에는 문서가 포함됩니다. Couchbase 클러스터의 용도에 따라 범위를 사용하는 방법은 여러 가지가 있습니다. 회사의 다양한 내부 애플리케이션을 지원하는 경우 각 애플리케이션마다 고유한 범위를 가져야 합니다. 클러스터가 각각 애플리케이션의 자체 복사본을 실행하는 여러 클라이언트 조직에 서비스를 제공하는 데 사용되는 경우, 각 복사본은 자체 범위를 가져야 합니다. 마찬가지로, 개발 그룹에서 클러스터를 테스트용으로 사용하는 경우 할당 단위는 스코프여야 합니다. 각각의 경우에 소유자는 할당된 범위 내에서 원하는 컬렉션을 만들 수 있습니다.

범위는 해당 버킷 내에서 고유해야 하고 컬렉션은 해당 범위 내에서 고유해야 합니다. 따라서 '기본' 버킷에는 각각 고유한 '제품' 및 '고객' 컬렉션이 있는 두 개의 범위 'dev'와 'prod'가 포함될 수 있습니다.

컬렉션 사용

최신 버전의 카우치베이스 데모 애플리케이션에서 사용 중인 컬렉션과 범위는 여기에서 확인할 수 있습니다:

https://github.com/couchbaselabs/try-cb-java/tree/6.5.0-branch

이 애플리케이션은 기존의 '여행 샘플' 버킷을 그대로 사용하여 사용자가 항공편과 호텔을 검색할 수 있도록 하되, 자체 사용자 및 예약 데이터를 컬렉션에 저장합니다. 사용 중인 구조는 다음과 같습니다:

  • 버킷: 기본값
    • 범위: 라슨 여행
      • 수집: 사용자
      • 수집: 항공편

사용자가 계정을 만들면 '사용자' 컬렉션에 문서가 생성됩니다. 사용자가 항공편을 예약하면 '항공편' 컬렉션에 문서가 생성되고 '사용자' 컬렉션의 사용자 문서에서 참조할 수 있습니다.

이 디자인을 사용하면 여러 애플리케이션이 동일한 버킷을 공유할 수 있습니다. 다른 여행사에서 사용하는 데모 앱의 두 번째 인스턴스가 있는 경우, 자체 "사용자" 및 "항공편" 컬렉션이 있는 다른 범위를 만들고 application.properties 파일을 업데이트하여 두 번째 인스턴스가 이 범위를 가리키도록 하면 됩니다. 두 인스턴스는 서로 간섭하지 않고 나란히 작동합니다.

코드 예시

우선, 사용자 및 예약 정보가 포함된 버킷과 범위의 이름은 application.properties 파일에 지정됩니다:

이러한 구성 값은 Database.java 파일에서 가져옵니다:

User.java에서는 사용자에 대한 새 항공편이 등록되는 방법을 볼 수 있습니다. 위에서 생성한 범위 빈이 전달됩니다. 사용자 이름은 사용자가 로그인한 아이디입니다.

사용자 문서의 ID는 사용자의 사용자 이름입니다. 애플리케이션은 애플리케이션에서 사용하는 컬렉션의 "사용자" 컬렉션에서 가져오는 것을 알고 있습니다.

사용자가 예약한 항공편은 사용자 문서에 '항공편'이라는 이름의 배열로 저장됩니다.

기존 항공편에 새 항공편을 추가합니다.

그런 다음 새 버전의 사용자 문서를 저장합니다.

바로 아래에서 사용자의 항공편이 검색되는 방식을 확인할 수 있습니다.

'사용자' 컬렉션에서 사용자 문서를 가져옵니다.

사용자 문서에서 '항공편' 배열을 가져옵니다. 여기에는 항공편 ID 목록이 포함됩니다.

ID로 '항공편' 컬렉션에서 각 항공편 문서를 검색합니다.

이전 코드에서 변경된 사항

컬렉션을 사용하지 않았던 이전 버전에서는 사용자 및 사용자 항공편에 대한 작업 코드가 상당히 달랐습니다. 이전 버전에서는 예약된 항공편이 사용자 문서에 직접 저장되었습니다. 사용자 문서는 '여행 샘플' 테이블에 직접 저장되었습니다. 다음은 registerFlightForUser() 함수의 원본 코드입니다.

문서 유형을 표시하기 위해 접두사를 사용하는 것을 주목하세요. 컬렉션을 사용할 수 있게 되면 이 접두사는 필요하지 않습니다.

문서에 이미 있는 항공편 배열을 검색합니다.

예약된 항공편 배열에 항공편을 추가합니다.

그리고 사용자 문서를 저장합니다.

물론 장난감 애플리케이션에서 예약된 항공편을 사용자로부터 분리하는 것은 그다지 매력적이지 않습니다. 하지만 각 사용자에 대한 다양한 유형의 정보를 저장하는 프로덕션 애플리케이션에서는 일부 기록, 특히 규모가 크거나 수가 많거나 자주 변경되기 쉬운 기록은 사용자 문서 외부에 저장하는 것이 합리적일 수 있습니다.

범위 및 컬렉션 문서

범위 및 컬렉션으로 직접 작업하는 방법에 대해 자세히 알아보려면 다음을 참조하세요. 이 문서에서 두 가지 작업을 위한 RESTful API, 관련 CLI 명령 및 다음에서 사용할 수 있는 컬렉션에 대한 정보를 설명합니다. cbstats.

요약

테이블과 스키마로 관계형 데이터베이스 내에서 행을 정리하는 것처럼 컬렉션과 범위를 사용하면 Couchbase 버킷 내에서 문서를 정리할 수 있습니다. 현재 Couchbase 6.5 GA 릴리즈는 개발자 프리뷰 기능으로 컬렉션 및 범위를 제한적으로 초기 지원합니다. 컬렉션 및 범위를 시작하려면 지금 바로 Java 데모 애플리케이션으로 작업을 시작할 수 있습니다.

리소스

다운로드

Couchbase Server 6.5 다운로드

 문서

카우치베이스 컬렉션 6.5 문서

카우치베이스 서버 6.5 릴리스 노트

카우치베이스 서버 6.5의 새로운 기능

블로그

컬렉션 소개 - 카우치베이스 서버 6.5의 개발자 프리뷰

Couchbase Server 6.5 발표 - 새로운 기능 및 개선 사항

6.5 블로그 모두 보기

작성자

게시자 요한 라슨

요한 라슨은 카우치베이스의 선임 소프트웨어 엔지니어입니다. Johan은 분산형 NoSQL 시스템에서 JSON 데이터를 위한 SQL 기반 쿼리 언어를 구축하는 업무를 담당하고 있습니다.

댓글 하나

  1. 우마이르 말릭 8월 16, 2019에서 2:46 오전

    안녕하세요 요한, 이것은 데이터 판별자 속성을 기반으로 다중 테넌시를 구현하는 애플리케이션을 위해 특별히 좋은 기능입니다. 그래서 한 가지 알고 싶은 것은 여러 범위에서 쿼리를 실행할 수 있습니까? 일부 쿼리의 경우 여러 범위에서 데이터를 가져오고 다른 쿼리의 경우 단일 범위에서 데이터를 가져와야하는 것처럼. 그렇다면 카우치베이스 6.5 버전에서 가능한가요? 고마워요

  2. 안녕하세요, Malik. 6.5에서는 컬렉션에 대해 N1QL 쿼리를 작성할 수 없습니다. 현재 N1QL 쿼리는 과거와 마찬가지로 컬렉션에 대해서는 작동하지 않고 버킷에 대해서만 작동합니다. 컬렉션에 대한 N1QL은 7.0에서 제공될 예정이며, 아마도 2020년에 출시될 것입니다.

    컬렉션에서 N1QL이 작동하게 되면, 현재 여러 버킷에 걸쳐 있는 N1QL 쿼리를 작성할 수 있는 것처럼 여러 범위에 걸쳐 있는 쿼리를 작성할 수 있게 됩니다.

  3. "관계형 테이블의 모든 레코드가 동일한 유형인 것처럼 카우치베이스 컬렉션 내의 모든 문서는 동일한 유형이어야 한다"는 의미는 컬렉션 내의 모든 문서가 동일한 필드를 가져야 한다는 의미인가요?

    고마워요

댓글 남기기