지난 6월의 DP2에 이어 또 다른 개발자 프리뷰인 DP3가 출시됩니다. 이번 개발자 프리뷰에서는 수많은 버그 수정과 기능이 추가되었으며, 가장 중요한 것은 a) '문서' 작업 방법을 제공하고 b) 클러스터 객체가 인스턴스화되는 방식을 변경하는 등 공개 API에 대한 변경 사항입니다. 또한 리포지토리를 다음 위치로 옮겼습니다. 카우치베이스 랩카우치베이스 에 대한 자세한 내용은 나중에 다시 다루겠습니다.

문서, 어디에나 있는 문서!

이번 개발자 프리뷰의 주요 변경 사항 중 하나이자 이전 .NET SDK에서 벗어난 점은 Couchbase가 키/값 저장소에서 문서 데이터베이스로 진화한 것이며, 이는 공개 API에도 반영되어 있습니다. 즉, 이제 K/V 쌍이 아닌 문서 객체를 가져와 반환하는 메서드가 있다는 뜻입니다. CAS, 내구성 제약 조건 및 기타 기능과 같은 다른 모든 Couchbase의 장점은 여전히 제공되지만, 이제 이를 단일 "문서" 객체로 래핑하여 다양한 속성을 설정함으로써 원하는 동작을 얻을 수 있습니다.

"문서" 개념을 지원하기 위해 새로운 Document 클래스를 지원하는 일련의 문서 기반 메서드가 IBucket 인터페이스에 추가되었습니다:

 

document-classes

이러한 새로운 문서 메서드 중 하나를 사용한 호출의 결과는 다른 K/V 메서드에서 반환되는 OperationResult 객체와 유사한 DocumentResult 객체입니다. 차이점은 Document 필드가 문서 참조라는 점입니다. 문서에 있는 값(T의 값)을 직접 가져오고 싶다면 Value 필드를 사용하면 됩니다.

예를 들어, 다음은 (DP3를 사용하여) Upsert 메서드를 사용하여 Couchbase에 JSON 문서를 저장하는 방법입니다:

 사용 (var bucket = _cluster.OpenBucket())
{
var 문서 = new 문서<동적>
{
Id = "person1",
가치 = new
{
이름 = "Jeff", 나이 = 22
}
};var 결과 = 버킷.Upsert(문서);
}

궁금하신 분들을 위해 설명하자면, Upsert()는 문서의 존재 여부에 따라 문서를 삽입하거나 업데이트하는 메서드입니다. 다른 문서 기반 메서드는 다음과 같습니다:

  • Insert(): 문서 삽입, 실패 시 문서가 존재합니다.
  • Replace(): 기존 문서를 대체하며, 존재하지 않으면 실패합니다.
  • Remove(): 문서가 있는 경우 문서를 제거합니다.
  • GetDocument(): 주어진 ID에 대한 문서를 반환합니다.

이것은 Couchbase가 더 이상 기존의 K/V 기반 Memcached 운영을 지원하지 않는다는 것을 의미하나요? 절대 아닙니다! API는 여전히 이러한 작업을 지원할 것이지만, 새로운 "문서" 기반 접근 방식을 통해 개발자가 더 다양한 애플리케이션에서 API와 Couchbase를 더 쉽게 사용할 수 있기를 바랍니다. 적어도 JSON 문서 작업의 의미를 더 쉽게 파악하고 직관적으로 이해할 수 있게 될 것입니다.

싱글톤스? 냄새나는 싱글톤은 필요 없어요!

DP1과 DP2에서는 지연 로드된 싱글톤이었기 때문에, 먼저 ClientConfiguration을 생성하고 이를 정적 Initialize() 메서드에 전달한 다음 CouchbaseCluster 클래스에서 Get()을 호출하여 클러스터 객체에 대한 참조를 가져왔습니다. 의도는 좋았지만(CouchbaseCluster가 전역 객체인지 확인), 단점으로는 뛰어난 디자인 선택이라기보다는 AppDomain당 하나의 CouchbaseCluster 객체만 가질 수 있고(하나의 앱에서 두 개의 개별 Couchbase 클러스터를 사용하는 경우 어떻게 될까요?) 버킷 사용을 시작하는 데 약간 불편한 프로그래밍 환경이라는 점이 있었습니다.

DP3에서는 싱글톤에 대한 명시적인 요구 사항을 없애고 대신 인스턴스화할 수 있는 수에 제한이 없는 표준 CouchbaseCluster 클래스와 인스턴스만 생성되기를 원하는 경우 CouchbaseCluster의 래퍼 싱글톤인 ClusterHelper 클래스로 분할하기로 결정했습니다. 두 가지 장점을 모두 제공합니다.

다음은 DP3에서 CouchbaseCluster 객체를 만드는 예제입니다:

 var 구성 = new 클라이언트 구성();
var 클러스터 = new 카우치베이스클러스터(구성);

다음은 ClusterHelper 클래스를 사용하여 앱 도메인당 하나의 CouchbaseCluster 객체만 생성되도록 하는 예제입니다:

 클러스터 도우미.초기화();
var 클러스터 = 클러스터 도우미.Get();

ClusterHelper 객체를 포함하는 이유가 궁금하신가요? CouchbaseCluster 객체는 생성 비용이 매우 비싸고 애플리케이션이 시작될 때 생성되고 애플리케이션이 종료될 때 소멸될 때 가장 잘 작동하기 때문입니다. 이에 대해서는 다음 포스트에서 자세히 설명하겠습니다!

사용해 보시고 피드백을 남겨주세요!

아래에서 바이너리를 다운로드하거나 Github에서 소스를 확인하시고 의견을 알려주세요. 또한, 베타 버전이므로 베타 및 정식 출시 전에는 분명 변경될 수 있다는 점을 잊지 마세요. 대부분의 변경 사항은 내부적으로 이루어질 예정이며, 특히 IO 부분과 네임스페이스에 대한 변경이 주를 이룹니다. 커뮤니티 피드백에 따라 공개 인터페이스도 변경될 수 있습니다.

프로덕션에서 사용하지 마세요. 의 기본 기능은 작동하지만, 코드가 아직 철저한 상황별 테스트를 거치지 않았기 때문에 장애 조치/스왑/재조정 시나리오에서 실패하는 등의 문제가 발생할 수 있습니다.

소스 및 바이너리

  • SDK 2.0 개발 브랜치는 이제 마스터 브랜치로, 1.X 개발 브랜치는 이제 깃허브에서 release13.
  • 버그를 발견하면 풀 리퀘스트를 만들거나 그리고 NCBC.
  • 바이너리는 다음과 같이 찾을 수 있습니다. 여기를 클릭하세요.

작성자

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

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

댓글 하나

  1. 태스크<문서 결과>를 반환하는 모든 API 메서드의 비동기 버전이 있나요?

    1. David -

      예, 그렇게 할 계획입니다. 현재 구성 측면(스왑/재조정/장애 조치) 시나리오를 안정화하는 작업을 진행 중이며, 이 작업이 완료되면 TAP 방식으로 전환할 예정입니다. 초기에 수행한 몇 가지 경험적 작업은 아직 통합해야 할 부분이 있습니다.

      -Jeff

  2. 대량 업서트 작업이 가능한가요? 특히 고성능이 요구되는 시스템의 경우 1.3 SDK에 이러한 기능이 없다는 것은 큰 차이입니다.

    1. 참고로 이 예제는 더 이상 최신 git에서 작동하지 않습니다.

      1. 예, DP3, 베타 버전과 현재 개발 브랜치 사이에 변경 사항이 있습니다. 주목할 만한 점은 다른 SDK와 더 대칭적으로 사용할 수 있도록 CouchbaseCluster의 이름이 Cluster로 변경되었다는 점입니다.

    2. 예, 대량 가져오기/업저장 기능은 조만간 출시될 GA에 포함될 예정입니다.

댓글 남기기