Windows 및 .NET을 사용하는 Couchbase - 4부 - Linq2Couchbase

이 블로그 게시물에서는 3부에서는 다음과 같은 내용을 소개합니다. Linq2Couchbase. 또한 Couchbase를 컨트롤러에서 꺼내서 매우 기본적인 저장소 클래스입니다. 이 블로그 게시물의 목표는 Couchbase와 Linq2Couchbase의 기본 사항에 익숙해져서 웹 애플리케이션에 적용할 수 있도록 하는 것입니다.

컨트롤러에서 카우치베이스 이동하기

컨트롤러의 역할은 들어오는 요청을 받아 모델에 전달한 다음 결과를 뷰에 제공하는 등 트래픽을 지시하는 것입니다. 이를 위해 견고한 원칙 (특히 단일 책임 원칙)에 따라 데이터 액세스는 컨트롤러가 아닌 '모델'의 어딘가에서 이루어져야 합니다.

첫 번째 단계는 기존 코드를 리팩터링하는 것입니다. 파트 3의 '정말 간단한 예제'는 그대로 유지하되 다른 클래스의 메서드로 옮겨야 합니다. 다음은 리팩터링된 HomeController와 새로운 PersonRepository입니다:

몇 가지 주의해야 할 사항:

  • HomeController는 더 이상 Couchbase에 직접 의존하지 않습니다. 예를 들어 Couchbase API가 변경되는 경우, HomeController가 아닌 PersonRepository만 변경하면 됩니다.
  • PersonRepository를 인스턴스화하는 방법을 StructureMap에 명시적으로 알려줄 필요가 없었습니다. PersonRepository는 "자체 바인딩"이 가능하기 때문입니다. 대신 인터페이스를 사용하려면(예: IPersonRepository), StructureMap에 이를 알리기 위해 DefaultRegistry를 변경해야 합니다. 다른 IoC 컨테이너를 사용하는 경우에는 상황이 달라질 수 있습니다.

Person 클래스 사용을 위한 리팩터링

위의 예제에서 저는 동적 객체입니다. 동적 는 일부 상황에 적합하지만 이 경우에는 '사람'이 무엇인지에 대한 보다 구체적인 정의를 내리는 것이 좋습니다. C# 클래스로 이 작업을 수행할 수 있습니다.

또한 이 클래스를 사용하도록 개인 저장소도 업데이트하겠습니다.

이왕 하는 김에 몇 가지 단계를 거쳐 제대로 된 MVC 앱으로 만들어 보겠습니다. Content()를 반환하는 대신 Index 액션이 View를 반환하도록 하고, 여기에 목록 를 추가합니다. person.cshtml의 일부에 위임할 Index.cshtml 파일을 만들겠습니다. 또한 부트스트랩을 사용하는 레이아웃을 추가하겠습니다. 이 마지막 부분은 완전히 무료이지만 스크린샷을 좀 더 멋지게 보이게 해줄 것입니다.

새로운 인덱스 작업:

Index.cshtml:

person.cshtml:

 

이제 좀 더 멋지게 보입니다. 또한 데모 후반부에서는 전체 개인 문서 목록을 보여드릴 수 있습니다.

The Index view of Couchbase Person documents in Bootstrap

Linq2Couchbase 소개

카우치베이스 서버는 다음과 같은 쿼리 언어를 지원합니다. N1QL. 이는 SQL의 상위 집합으로, 기존의 SQL 지식을 활용하여 Couchbase에서 JSON 문서에 대해 매우 강력한 쿼리를 구성할 수 있습니다. Linq2Couchbase는 여기서 한 걸음 더 나아가 Linq 쿼리를 N1QL 쿼리로 변환합니다(엔티티 프레임워크가 Linq 쿼리를 SQL 쿼리로 변환하는 것과 마찬가지로).

Linq2Couchbase는 카우치베이스 랩는 아직 핵심적으로 지원되는 Couchbase .NET SDK 라이브러리의 일부가 아닙니다. 하지만 엔티티 프레임워크, NHibernate.Linq 또는 기타 Linq 공급자에 익숙하다면 Couchbase에 입문하는 데 좋은 방법입니다. 일부 작업의 경우 여전히 핵심 Couchbase .NET SDK를 사용해야 하지만, Linq2Couchbase로 할 수 있는 일이 많습니다.

아직 추가하지 않았다면 NuGet으로 Linq2Couchbase를 추가하는 것으로 시작하세요.

Install Linq2Couchbase with NuGet

N1QL(및 따라서 Linq2Couchbase)은 색인되는 버킷. Couchbase 콘솔로 이동하여 '쿼리' 탭을 클릭하고, 기본 인덱스를 생성합니다. 헬로 카우치베이스 버킷.

Create a primary index on a Couchbase bucket

인덱스가 없는 경우 Linq2Couchbase는 "키 스페이스 hello-couchbase에 기본 인덱스가 없습니다."와 같은 유용한 오류 메시지를 표시합니다. 기본 인덱스 생성을 사용해서 생성하세요."

Linq2Couchbase를 가장 효과적으로 사용하려면 먼저 Couchbase 문서에 "유형" 필드를 지정해야 합니다. 이렇게 하면 예를 들어 '사람' 문서와 '위치' 문서를 구분할 수 있습니다. 이 예에서는 "사람" 문서만 만들겠지만 처음부터 이렇게 하는 것이 좋습니다. 유형 필드를 만들고 "사람"으로 설정하겠습니다. 또한 이 클래스가 특정 유형의 문서에 대한 것임을 Linq2Couchbase가 이해할 수 있도록 C# 클래스에 속성을 넣겠습니다.

이러한 변경을 수행해도 앱은 계속 작동합니다. 여전히 키로 문서를 검색하고 있기 때문입니다. 하지만 이제 모든 사람 문서를 가져오도록 색인 작업을 변경해 보겠습니다.

새로운 GetAll 리포지토리 메서드를 구현해야 합니다:

이 예제에서는 모든 결과를 이름별로 정렬하도록 Couchbase에 지시하고 있습니다. 원하는 경우 익숙한 일반 Linq 메서드를 사용하여 실험해 볼 수 있습니다: 어디서, 선택, 가져 오기, 건너 뛰기 등.

지금은 스캔 일관성을 무시하세요: 나중에 자세히 설명하겠습니다. 하지만 IBucketContext는 어떨까요? IBucketContext는 엔티티 프레임워크의 DbContext 또는 NHibernate의 ISession과 유사합니다. IBucketContext를 가져오려면 DefaultRegistry를 업데이트해야 합니다.

이것은 새 BucketContext를 생성하고 각 HTTP 요청으로 범위가 지정되기를 원한다는 것을 StructureMap에 알리는 것입니다. 구조 맵에서 HttpContextScoped를 사용하는 경우, 또한 HttpContextLifecycle.DisposeAndClearAll() 를 추가합니다. 다른 IoC 컨테이너를 사용하는 경우에는 다르게 관리해야 합니다.

이제 웹 앱을 다시 컴파일하고 실행하면 "아직 사람이 없습니다"라는 메시지가 표시됩니다. 내가 어디로 갔지?! "foo::123" 문서에 아직 "type" 필드가 없기 때문에 표시되지 않았습니다. Couchbase 콘솔로 이동하여 추가하세요.

Adding a type field to a Couchbase document

그렇게 한 후 웹 페이지를 새로고침하면 그 사람이 다시 나타납니다.

스캔 일관성에 대한 간단한 참고 사항

Linq2Couchbase는 쿼리를 생성하고 실행하기 위해 인덱스에 의존합니다. 새 문서를 추가하면 색인을 업데이트해야 합니다. 인덱스가 업데이트될 때까지 아직 인덱싱되지 않은 문서는 (기본적으로) Linq2Couchbase에서 반환되지 않습니다. 요청 플러스의 스캔 일관성(스캔 일관성에 대한 자세한 내용은 Couchbase 설명서를 참조하세요.), Linq2Couchbase는 쿼리를 실행하고 응답을 반환하기 전에 인덱스가 업데이트될 때까지 효과적으로 대기합니다. 이것은 애플리케이션을 설계할 때 고려해야 할 장단점입니다. 원시 속도와 완전한 정확도 중 어느 것이 더 중요할까요?

간단한 예로 콘텐츠 관리 시스템을 만든다고 가정해 보겠습니다:

  • 관리 도구를 만들고 있다면 성능보다 완벽한 정확성을 더 중요하게 여길 것입니다.
    • 관리자는 데이터를 효과적으로 관리하기 위해 데이터의 내용을 정확히 파악해야 합니다.
    • 관리자 기능은 공개 기능에 비해 사용 빈도가 낮기 때문에 어느 정도의 지연은 용인할 수 있습니다.
  • 모든 콘텐츠를 나열하는 공개 페이지를 만드는 경우 원시 속도가 더 중요할 수 있습니다.
    • 새 콘텐츠 페이지가 대중에게 표시되는 데 1~2초 정도 시간이 더 걸리더라도 괜찮습니다.
    • 사이트의 공개 부분은 매우 자주 액세스되므로 성능이 중요한 요소입니다.
  • 이는 예시일 뿐이며 어떤 유형의 스캔 일관성을 사용해야 하는지는 사용자와 사용 사례에 따라 달라집니다.

결론

Linq2Couchbase는 친숙한 방식으로 Couchbase와 함께 작업할 수 있는 강력한 도구입니다. 오픈 소스이지만 아직 Couchbase에서 공식적으로 지원하지는 않습니다. 이 블로그 게시물의 모든 코드는 다음에서 사용할 수 있습니다. Github.

다음 글에서는 Linq2Couchbase를 사용하여 문서를 만들고, 업데이트하고, 삭제하는 방법을 보여드리겠습니다. 또한 SQL Server와 같은 기존 RDBMS와 비교하여 Couchbase가 제공하는 유연성의 차이점도 살펴보겠습니다.

질문이 있으신가요? 기대한 대로 작동하지 않나요? 의견을 남겨 주세요, 트위터에서 나를 핑하기를 참조하거나 이메일(matthew.groves AT couchbase DOT com)로 문의하시면 도와드리겠습니다!

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

작성자

게시자 매튜 그로브스

Matthew D. Groves는 코딩을 좋아하는 사람입니다. C#, jQuery, PHP 등 무엇이든 풀 리퀘스트를 제출할 정도로 코딩을 좋아합니다. 90년대에 부모님의 피자 가게를 위해 QuickBASIC POS 앱을 만든 이후로 전문적으로 코딩을 해왔습니다. 현재 Couchbase의 선임 제품 마케팅 관리자로 일하고 있습니다. 여가 시간에는 가족과 함께 축구 경기를 관람하고 개발자 커뮤니티에 참여하며 시간을 보냅니다. 그는 .NET의 AOP, .NET의 프로 마이크로서비스, Pluralsight 저자, Microsoft MVP의 저자이기도 합니다.

댓글 남기기

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

구축 시작

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

카펠라 무료 사용

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

연락하기

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