N1QL + Go + JSON 마샬링
Couchbase에서 Couchbase Server와 함께 사용하기 위해 개발했습니다, N1QL 은 분산된 문서 지향 데이터베이스를 위한 공통 쿼리 언어와 JSON 기반 데이터 모델을 제공합니다. N1QL은 강력하고 표현력이 뛰어난 쿼리 언어입니다. N1QL이 제공하는 수많은 이점 중에서도 개발자에게 풍부한 애드혹 쿼리 환경을 제공합니다. Go에서는 문서의 스키마/구조를 미리 알고 있을 때 JSON과 상호 작용하기가 가장 쉽습니다. 쿼리가 애플리케이션 내에서 런타임에 동적으로 작성되면 어떻게 될까요? 결과가 잘 정의된 스키마에 강력하게 입력되지 않으면 어떻게 될까요? Go에서 알 수 없는 JSON 구조와 상호 작용하기 위한 전략은 무엇인가요? Couchbase에서 N1QL로 쿼리를 발행하는 세 가지 일반적인 사용 패턴을 살펴봄으로써 이러한 질문에 답해 보겠습니다.
설정
그리고 코드 이 블로그의 다른 유용한 예제와 함께 개발자 가이드에서 확인할 수 있습니다. 저장소 를 찾아보세요. 이 블로그에서 설명하는 세 가지 예제 각각에 대해 Couchbase의 여행 샘플 버킷과 Go SDK를 사용하겠습니다. 여행 샘플 데이터 세트는 모든 Couchbase 인스턴스에 기본으로 제공됩니다. 여기에는 애플리케이션 프로토타이핑에 유용한 공항, 항공사, 항공편 및 관심 지점의 광범위한 JSON 문서 모음이 포함되어 있습니다. 개발 머신에 Couchbase를 설치했는데 여행 샘플 버킷이 구성되어 있지 않더라도 괜찮습니다. 사용하고자 할 때 언제든지 쉽게 로드할 수 있습니다. 관리자 UI에서 "설정" 탭-> "샘플 버킷"을 클릭하고 "여행 샘플" 상자를 선택하기만 하면 됩니다. 또한 가져오기 섹션에서 Go 애플리케이션에서 참조할 수 있는 Go SDK를 다음과 같이 설치해야 합니다: "github.com/couchbase/gocb". 여기까지입니다!
쿼리
Couchbase와 N1QL 쿼리 언어의 성능과 유연성을 보여주기 위해 의도적으로 모호하고 개방적인 쿼리를 사용하겠습니다. 특정 문자 문자열이 포함된 공항 또는 이름이 있는 모든 문서를 검색하겠습니다.
애플리케이션 부트스트랩
시작하려면 먼저 종속성과 Couchbase에 대한 연결을 설정해 보겠습니다. 프런트엔드 자바스크립트 웹 프레임워크에서 하는 것과 똑같이 http 요청에 대해 curl 명령을 실행할 수 있는 간단한 REST API를 구축해야 합니다. Go에는 이를 위한 훌륭한 패키지가 포함되어 있습니다: "net/http".
항상 애플리케이션에서 Couchbase를 한 번 인스턴스화하여 애플리케이션 전체에서 참조로 사용하세요. 이렇게 하면 Couchbase가 비동기적으로 작동하면서 매번 클러스터에 대한 새 연결을 스핀업/스핀다운할 필요가 없어 시간을 절약할 수 있습니다. 또한 애플리케이션이 토폴로지 변경이 발생할 때 이를 인식할 수 있습니다. Couchbase 연결 및 요청 핸들러의 주요 기능은 다음과 같이 빌드됩니다:
사례 1 강력하게 입력됨(내가 찾고 있는 것이 무엇인지 알고 있습니다!)
사용자가 어떤 쿼리를 할 것인지 정확히 알고 있고, 매우 구조화된 방식으로 쿼리를 수행할 것이라는 것을 알고 있는 완벽한 세계에서는 결과를 접을 수 있는 엄격한 스키마를 설정할 수 있습니다. 먼저 구조체를 설정합니다:
Go에서 JSON의 장점은 Couchbase와 마찬가지로 기본적으로 지원된다는 점입니다. 쿼리에서 반환된 JSON 문서의 구조가 무엇이든, 결과를 반복하여 애플리케이션에서 사용하는 엄격한 스키마에 대해 '필터링'할 수 있습니다. 반복하는 동안 현재 결과 문서가 JSON 구조에 정의된 것과 일치하면 반환 문서 배열에 추가됩니다. 불필요한 다른 필드는 무시됩니다.
그런 다음 배열은 JSON으로 마샬링되어 응답으로 다시 전송됩니다. 제목에 Portland가 포함된 모든 공항에 대한 API 요청을 curl http://localhost:3000/api/query/typed?search=Portland 하면 응답으로 강력하게 입력/정의된 JSON 문서 배열이 반환됩니다:
사례 2 입력되지 않음(정확히 모르겠습니다. 그냥 다 알려주세요!)
안타깝게도 모든 것이 명시적인 스키마와 강력한 유형 구조에 맞는 것은 아닙니다. 때로는 서로 다른 스키마를 가진 다양한 문서를 반환하는 쿼리를 실행해야 할 수도 있습니다. 동일한 쿼리이지만 프런트엔드 프레임워크가 이름에 포틀랜드가 포함된 공항, 항공사 또는 관심 지점을 찾고자 한다고 가정해 보겠습니다. Go의 유연성 덕분에 쿼리 결과를 반복하고 각 문서를 인터페이스 변수의 배열로 스트리밍할 수 있습니다. 스키마를 미리 알 필요가 없습니다.
그 결과 다양한 스키마의 혼합이 마샬링되어 응답으로 다시 전송됩니다. http://localhost:3000/api/query/untyped?search=Portland 으로 요청하면 다양한 스키마 배열이 응답으로 반환됩니다.
사례 3 리트리브 원(첫 번째 것만 되찾고 싶어요!)
마지막 예를 들어 쿼리 결과에서 첫 번째 항목만 반환하는 것으로 단순화해 보겠습니다. Go SDK에는 N1QL에 ".One()"이라는 메서드가 있습니다.
http://localhost:3000/api/query/one?search=Portland 으로 요청을 보내면 응답에서 하나의 결과만 반환되는 것을 확인할 수 있습니다.
이제 어떻게 할까요?
Couchbase, N1QL, Go의 조합은 놀라울 정도로 효율적이고 간소화된 환경으로, 다음 Go 애플리케이션을 구축하기에 완벽합니다. 다음과 같은 많은 예제 개발자 가이드와 웹사이트의 다양한 시작하기 정보를 참조하세요. 카우치베이스와 Go로 무엇을 하고 있는지 @Couchbase 트윗으로 알려주세요!