카우치베이스 LINQ 제공자 GA: LINQ, N1QL 및 Couchbase, 오 마이!

오늘 Couchbase는 Couchbase Server용 공식 LINQ 제공자와 JSON 문서용 핫 쿼리 언어인 N1QL의 GA 릴리스를 발표하게 되어 기쁩니다! 이 공급자의 목표는 장황하고 복잡할 수 있는 엔티티프레임워크나 NHibernate보다 Linq2SQL에 더 가까운 간단하고 사용하기 쉬운 ORM/ODM을 제공하는 것입니다.

단순함이 목표이긴 하지만, N1QL의 모든 멋진 기능에 대한 확장된 지원을 제공하는 완전한 기능의 Linq 구현인 Linq2Couchbase의 힘을 과소평가하지 마세요!

이 글에서는 Linq2Couchbase 시작하기의 기본 사항, API의 주요 요소, ASP.NET 및 Owin/Katana와의 통합에 대해 살펴봅니다. 이후 게시물에서는 Linq2Couchbase의 구체적인 사항과 세부 사항에 대해 자세히 살펴보겠습니다!

아키텍처

공급자는 쿼리 구문 분석 및 쿼리 생성을 처리하고 SDK는 결과의 요청 및 매핑을 처리하므로 공급자는 SDK 위에 있는 또 다른 계층에 불과합니다. 공급자는 다음을 사용합니다. Re-linq 를 내부적으로 사용하여 Linq 쿼리에서 추상 구문 트리(AST)를 생성한 다음, 이 트리를 사용하여 N1QL 문을 출력합니다. Re-linq는 NHibernate와 EntityFramework에서 모두 사용되므로 안심하고 사용하세요!

시작하기

소스는 다음에서 사용할 수 있습니다. Github 에서 패키지를 사용할 수 있습니다. NuGetNuGet 패키지 관리자를 사용하여 Linq2Couchbase를 설치하는 경우 Couchbase.NET SDK를 포함한 모든 종속성이 자동으로 처리됩니다.

NuGet 패키지 관리자를 사용하여 Linq2Couchbase를 설치하려면(이미 Visual Studio 프로젝트를 만들었다는 가정 하에) "Nuget 패키지 관리"를 마우스 오른쪽 버튼으로 클릭하고 Linq2Couchbase를 검색하거나 패키지 관리자 명령줄을 사용하여 패키지 관리자를 열면 됩니다:

이 작업을 완료하면 프로젝트에 필요한 모든 종속성이 생깁니다. 다음으로 로컬 또는 가상 머신을 통해 Couchbase Server를 설치해야 합니다. Couchbase Server의 다운로드 링크는 다음과 같습니다. 여기. 가상 머신의 경우 방랑자 를 사용하여 Couchbase 서버 클러스터를 설치합니다. Couchbase 4.0을 설치해야 합니다! Vagrants를 사용하는 경우 클러스터를 프로비저닝하세요:

Couchbase 서버 또는 클러스터가 있으면 서버 또는 클러스터를 설정하고 적어도 하나의 노드는 인덱스 노드이고 하나의 노드는 쿼리 노드인지 확인합니다.. "서버 설정"의 첫 번째 단계 또는 클러스터에 서버를 추가할 때 이 작업을 수행합니다. 또한 설정 중에 또는 클러스터 또는 인스턴스를 설정한 후 설정>샘플 탭에서 "맥주 샘플" 데이터 세트를 클러스터에 추가합니다.

이제 Couchbase 인스턴스 또는 클러스터가 설정되었으므로, "beer-sample" 버킷에 기본 인덱스를 만들어야 합니다. 이렇게 하려면 다음 중 하나로 이동합니다. C:프로그램 파일카우치베이스서버빈 또는 방랑자를 사용하는 경우 (또는 Linux) /옵츠/카우치베이스/bin를 입력합니다. 그런 다음 cbq 또는 ./cbq(Linux의 경우)를 입력하여 CIL 쿼리를 시작한 다음:

이렇게 하면 맥주 샘플 버킷에 기본 인덱스가 생성됩니다. 맥주 샘플에서 "-"를 이스케이프하는 데 필요한 백틱 "`"에 주목하세요. 이제 코드를 작성할 준비가 되었습니다!

버킷 컨텍스트 생성

버킷 작업을 위한 주요 객체는 BucketContext입니다. 버킷 컨텍스트는 Linq2Sql의 데이터 컨텍스트와 엔티티 프레임워크의 Db 컨텍스트와 유사합니다. 이 객체의 주요 목적은 쿼리를 작성하고 이를 Couchbase 서버에 제출하기 위한 인터페이스를 제공하는 것입니다.

버킷 컨텍스트를 독립형 객체로 사용할 수도 있고, 이 객체에서 파생하여 버킷 및 도메인 모델의 유형에 속성을 매핑하는 강력한 유형 객체를 만들 수도 있습니다. 이 예에서는 후자를 사용하겠습니다:

public class BeerSample : BucketContext { public BeerSample() : this(ClusterHelper.GetBucket("beer-sample")) { } public BeerSample(IBucket bucket) : base(bucket) { DocumentFilterManager.SetFilter(new BreweryFilter()); } public IQueryable Beers { get { return Query(); } } public IQueryable Breweries { get { return Query(); } } }

맥주 샘플 버킷(버킷은 RDBMS 시스템의 데이터베이스와 유사합니다)에는 '양조장'과 '맥주'로 '유형화'된 문서가 포함되어 있으며, 이 비공식 유형 시스템을 사용하면 버킷을 쿼리하고 술어(예: WHERE type="beer")를 통해 양조장 문서 또는 맥주 문서를 반환할 수 있습니다. 위 코드에서는 IQueryable을 반환하는 명시적 속성을 정의했습니다.

쿼리 예시

Linq2Couchbase를 사용하는 것은 Linq2SQL 또는 EF와 거의 동일하다는 것을 알 수 있습니다:

BucketContext 참조가 있으면 다른 Linq 공급자처럼 쿼리하기만 하면 됩니다. 모든 Linq 키워드는 물론 ON KEYS, NEST 및 UNNEST와 같은 N1QL 구조도 지원됩니다! 다음 포스트에서 이 모든 것을 훨씬 더 자세히 살펴보겠습니다!

문서 모델

위의 BeerSample 컨텍스트에서 Beer 및 Brewery 객체는 Linq 투영의 대상이 되며, 버킷(beer-sample)의 동등한 JSON 문서에 대응하거나 매핑됩니다. 다음은 각각에 대한 목록입니다(이것은 부분적인 목록이며, 전체 클래스는 다음에서 찾을 수 있습니다. 여기):

물론 이것은 "맥주" 문서에 매핑됩니다. DocumentTypeFilter 속성에 주목하세요. 이렇게 하면 해당 문서를 대상으로 하는 모든 쿼리에 "맥주" 유형을 기준으로 필터링하는 술어 또는 WHERE 절이 "자동 마법처럼" 추가됩니다. 각 쿼리에 술어를 수동으로 추가하지 않는 한, DocumentTypeFilter 속성은 필터를 적용하는 두 가지 방법 중 하나입니다.

이것은 "양조장" 문서가 매핑될 객체입니다. 명시적으로 정의된 DocumentTypeFilter 속성이 없다는 점에 유의하세요. 이는 BeerSample 컨텍스트의 생성자가 DocumentFilterManager에 필터를 추가하기 때문입니다. 이것은 순전히 동일한 문제에 대한 다른 접근 방식이며, 쿼리에 술어를 추가하여 유형별로 필터링하는 것입니다.

ASP.NET 또는 Owin/Katana와 통합

ASP.NET 또는 Katana/OWin 프로젝트에서 Couchbase .NET SDK를 사용하는 패턴은 매우 뚜렷합니다. BucketContext는 Couchbase .NET SDK를 사용하므로 이 패턴을 따라야 SDK 내의 객체 캐싱과 공유 TCP 연결을 활용할 수 있습니다. 다행히도 이 패턴은 매우 간단합니다:

ASP.NET에서 Global.asax 사용

Global.asax를 사용하는 ASP.NET 애플리케이션에서는 Application_Start 및 Application_End 이벤트 핸들러를 활용하여 BucketContext가 종속하는 클러스터 및 버킷 개체를 생성 및 소멸합니다.

여기서는 구성을 생성한 다음(App.Config에서도 구성을 생성할 수 있음) ClusterHelper 객체를 초기화합니다. 마지막으로 애플리케이션이 종료되면 Application_End 핸들러에서 수명이 긴 클러스터 및 버킷 객체를 소멸시킵니다. 이것은 정상적으로 종료되며 OS 수준 구성은 적시에 다시 OS로 반환됩니다.

Owin/Katana에서 Setup.cs 사용

Owin/Katana 호스팅 애플리케이션에서도 비슷한 패턴을 따르지만 다른 메서드인 Setup.cs 클래스를 사용할 뿐입니다.

여기서는 구성 메서드가 시작 시 실행될 때 클러스터 헬퍼를 생성하고 초기화한 다음, 애플리케이션이 종료될 때 실행될 델리게이트를 등록하여 클러스터 헬퍼를 닫고 리소스를 확보합니다.

컨트롤러에 주입하기

버킷 컨텍스트 자체는 작업 단위 패턴의 특성을 취합니다. 각 요청에 대해 하나씩 생성할 수 있으며, 클러스터 헬퍼가 참조를 관리하므로(위의 조언을 따른다고 가정할 때) 요청이 끝나면 인스턴스가 간단히 GC'됩니다.

이 작업을 수행하는 가장 간단한 방법은 종속성 주입 (패턴)을 사용하여 컨트롤러가 생성될 때 인스턴스를 만들 수 있습니다:

이제 액션 메서드 내에서 버킷 컨텍스트를 사용하기만 하면 됩니다:

다시 한번 말하지만, 컨텍스트는 수명이 짧은 경량 객체이므로 요청으로 범위를 지정하고 해당 요청 내에서 호출되는 모든 컨트롤러에 재사용하여 삽입할 수 있습니다.

앞으로의 계획은 무엇인가요?

매우 빠르게 다음 주요 기능은 프록시를 사용한 변경 추적 기능이 될 것입니다. 또한 버그 수정, 성능 향상 및 기타 기능을 통해 Linq2Couchbase를 완전한 기능을 갖춘 경량 ODM/ORM으로 만들 수 있을 것으로 기대하세요!

원하는 기능이나 버그 수정이 있거나 기여하고 싶은 내용이 있다면 좋은 피드백이든 나쁜 피드백이든 모두 환영합니다.

Linq2Couchbase는 커뮤니티가 주도하는 오픈 소스 프로젝트이므로 한번 살펴보고 기여하고 싶으시다면 꼭 참여해 주세요!

특별 감사

프로젝트에 기여해주신 모든 분들께 특별히 감사드립니다(결국 오픈소스입니다!). 특히 다음 분들께 감사드립니다. 브랜트 버넷Centeredge 소프트웨어 프로젝트와 NuGet의 문서화에 크게 기여한 분들!

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

작성자

게시자 Jeff Morris, 수석 소프트웨어 엔지니어, Couchbase

Jeff Morris는 Couchbase의 수석 소프트웨어 엔지니어입니다. Couchbase에 입사하기 전에는 6년 동안 Source Interlink에서 엔터프라이즈 웹 아키텍트로 근무했습니다. Jeff는 Couchbase SDK 개발과 N1QL(쿼리 언어)과 통합하는 방법을 담당하고 있습니다.

댓글 남기기

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

구축 시작

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

카펠라 무료 사용

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

연락하기

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