SDK 팀을 대표하여 Java SDK의 다음 대규모 릴리스인 2.2 버전. 개발팀은 새롭고 멋진 기능을 제공하기 위해 열심히 노력해 왔으며, 오늘 첫 번째 개발자 미리보기를 공개하여 그 내용을 알려드리고자 합니다.
2.2에는 다양한 새로운 기능이 추가되었습니다:
로 이동 결론 코드를 빨리 손에 넣을 수 있다면 :)
N1QL 관련 변경 사항
최근에 Couchbase Server v4.0 개발자 프리뷰가 출시되었습니다. 이 새 버전의 많은 기능 중 새로운 쿼리 언어인 "SQL for Documents"(코드명 N1QL)가 대표적인 예입니다.
이전 버전의 Java SDK에서는 이미 N1QL을 지원했으며(특히 올해 초 쿼리 팀에서 출시한 4번째 개발자 프리뷰에서), 이러한 방식으로 계속 지원했습니다.
N1QL DP4 이후, 우리는 DSL 확장에 대한 DSL을 추가했습니다. 인덱스 관리 를 추가하고 버킷 비밀번호 지원.
DSL 확장
DSL의 다양한 부분이 확장 및 개선되었습니다. 전체적으로 N1QL 튜토리얼 는 Java DSL을 통해 구현할 수 있습니다.
그리고 FROM 절을 통해 문서 ID를 참조할 수 있습니다. 사용 키 절과 다른 절( JOIN 또는 NEST) 반면에 문서 ID는 다음을 통해 참조합니다. 온키즈 절을 사용합니다.
이를 위한 기존 DSL은 키 키워드로는 충분하지 않으므로 두 가지 변형이 모두 사용키/사용키값 그리고 onKeys/onKeysValues 를 입력합니다.
N1QL에는 수집 술어(또는 컴포지션)의 개념으로 ANY, EVERY, ARRAY 및 FIRST 연산자가 있습니다. 미니 DSL을 도입했습니다, 컬렉션를 사용하여 이러한 술어를 작성하고 표현식 를 생성하여 나머지 DSL에서 사용할 수 있습니다.
경우에 따라 N1QL은 구문 대안과 기본값을 제공합니다. 그 중 세 가지가 떠오르는데, 이 두 가지를 약간 다르게 다루었습니다:
- 의
AS앨리어싱 구문은 때때로 다음과 같이 키워드를 완전히 생략할 수 있습니다.FROM 기본값 AS srcvsFROM 기본 src. 우리는 명시적인 양식만 생성하기로 결정했습니다.AS키워드를 호출해야 하므로(사용자가as(문자열 별칭)메서드). 사용 키그리고온키즈선택적 대체 구문이 있습니다.사용자 기본 키그리고기본 키에. 이들은 의미적으로 동일하며 첫 번째 양식만 생성합니다.주문 기준에는 명시적으로 요청하지 않는 기본 순서 방향이 있습니다.DESCnorASC. 이 옵션은정렬연산자와 함께def(표현식 onWhatToSort)메서드를 사용합니다.
몇 가지 기능 중 일부는 이전에는 기능 클래스에 추가/이동되었습니다. ...query.dsl.functions 패키지를 내부 함수의 범주와 일치하는 별도의 헬퍼 클래스(예를 들어 문자열 함수).
In 표현식에서 표현식을 구성하는 몇 가지 팩토리 메서드를 추가했습니다. 성명서 (예: 하위 쿼리 수행)를 수행하고 경로:
산술 연산자도 추가했습니다. 추가, 빼기, 곱하기 그리고 나누다:
마지막으로, 다른 미니-DSL을 추가했습니다. 사례 문을 사용할 수 있습니다. CASE는 조건에 따라 대체 결과를 생성하는 데 사용할 수 있습니다. 조건이 각 대안에 명시되어 있거나 언제 절(조건부 표현식이 있으며 이러한 형태의 CASE를 "검색 케이스"라고 함)이 있거나 조건이 CASE의 시작 부분에 주어진 식별자/표현식과 같거나(예 CASE user.gender WHEN "male" THEN 1). 다음은 작동 중인 DSL의 예입니다:
인덱스 관리 DSL
이미 N1QL을 사용해 보셨다면 인덱스를 생성하여 쿼리 속도를 크게 높일 수 있다는 것을 알고 계실 것입니다. 지금까지는 프로그래밍 방식으로 인덱스를 생성하는 유일한 방법은 원시 문자열 문을 발행하는 것이었습니다. 더 이상은 아닙니다!
인덱스 관리 DSL은 인덱스와 관련된 다양한 작업을 지원합니다:
인덱스 만들기:
만들기 기본 색인:
인덱스 삭제:
생성 시 연기된 인덱스를 구축합니다:
대부분의 식별자(인덱스 이름, 네임스페이스/키스페이스)가 백틱으로 자동 이스케이프되는 방식에 주목하세요.
버킷 비밀번호 지원
이제 N1QL 서비스를 쿼리할 때 호출에서 얻은 인증 정보로 요청 헤더를 자동으로 보강합니다. 버킷를 사용하면 비밀번호로 보호된 버킷을 투명하게 쿼리할 수 있습니다(이미 다음과 같이). ViewQuerys).
엔티티 매핑
이 기능은 과거에 많은 요청이 있었던 기능으로, 도메인 개체를 Couchbase 문서에 쉽게 매핑하거나 그 반대로 매핑할 수 있는 기능입니다.
우리는 이것을 탐구하기 시작했습니다. 엔티티 매핑 기능 (또는 ODM, 개체 문서 매핑) 2.2에서. 접근 방식은 다음과 유사한 API를 제공하는 것입니다. 버킷 ODM 전용입니다. 이 API는 리포지토리 인터페이스를 호출하여 버킷에서 리포지토리를 가져올 수 있습니다. bucket.repository().
리포지토리 API의 메서드는 새로운 유형의 문서에서 엔티티도큐먼트. 메타데이터와 콘텐츠(이 경우 도메인 객체)를 구분하는 문서 시맨틱을 고수합니다. 도메인 객체에 주석을 달아야 매핑이 작동할 것으로 예상됩니다(아래 참조).
엔티티도큐먼트 를 사용하여 명시적으로 id를 기본 키로 사용할 수 있지만, 다른 키와 반대로 문서 구현에 익숙한 경우 선택 사항입니다. 또는 다른 방법으로는 문자열 속성을 사용하여 도메인 클래스에서 @Id 를 문서 ID로 사용하세요. @Id 속성은 카우치베이스의 JSON 콘텐츠에 저장되지 않습니다...
로 표시된 속성만 필드 어노테이션이 고려되어 데이터베이스의 JSON 콘텐츠의 일부가 되거나 객체에 다시 주입됩니다. get. 이 주석은 필드 이름에 별칭을 붙일 수도 있습니다:
현재 제한 사항(일부는 향후 해제될 수 있음)은 다음과 같습니다:
필드는 기본 유형 속성(JsonObject), 일반적으로 이 ODM은 간단한 케이스에 사용됩니다. 지도, 목록 및 사용자 정의 변환기에 대한 지원은 준비 중입니다.- 생성자가 0인 클래스만 ODM에 지원됩니다.
- 매핑은 리플렉션을 통해 속성 값을 처음 가져오고 설정하는 방식으로 이루어집니다(이후 내부적으로 캐시됨).
API 개선 사항
기존 버킷 API가 몇 가지 개선되었습니다.
첫째, 실제 비용을 지불하지 않고도 키의 존재 여부를 쉽게 확인할 수 있는 새로운 작업이 도입되었습니다. get문서 내용을 표시합니다. 이것은 존재(문자열 키) 메서드를 사용합니다:
둘째, 다음과 관련된 기능입니다. 조회수 1.x 세대의 SDK에는 있었지만 2.x에는 없는 기능은 보기 쿼리를 수행할 때 문서의 대량 가져오기를 요청하는 기능입니다( 포함 문서 옵션).
2.x에서 이 작업을 수행하는 것은 그리 어렵지 않습니다. 비동기 API 사용( 대량 패턴 에 의존하는)가 있지만 동기화 API를 사용할 때는 부족합니다. 실제로 동기화 모드에서 각 행의 해당 문서를 가져오는 유일한 방법은 row.document()를 사용하면 행당 하나의 요청을 연속적으로 차단하고 실행합니다. 이는 매우 비효율적입니다!
그래서 저희는 포함 문서 옵션을 추가하세요. 이렇게 하면 백그라운드에서 각 행의 문서가 효율적으로 비동기식으로 로드되며, 차단 API도 이점을 얻게 됩니다(행에는 이미 행의 문서 호출 시 캐시 document() 를 클릭하세요). 비동기 API에서도 사용할 수 있지만, 비동기 API에서는 .document() 에서 비동기 뷰 행.
재시도 도우미
이것은 실제로 릴리스에 포함된 내용입니다. 2.1.2하지만 블로그 게시물에서 언급할 만한 가치가 있습니다.
사용의 이점 중 하나는 RxJava 는 Rx 연산자를 의미 있게 구성하고 고급 오류 처리 프리미티브의 이점을 활용할 수 있다는 것입니다. 그중에는 다시 시도 그리고 다시 시도할 때 변형을 사용하여 다양한 조건에서 비동기 흐름을 다시 시도할 수 있습니다.
예를 들어 다음과 같이 다시 시도할 수 있습니다. get 수신 시 요청 역압 예외 (요청 속도가 너무 빨라 SDK/서버가 처리할 수 없음) 또는 임시 실패 예외 (서버가 너무 바빠서 요청을 조금 지연해야 한다는 알림이 표시됨). 최대 4번까지만 재시도하고 그 전에 잠시 기다릴 수도 있습니다... 각 시도 사이에 이 지연이 길어지기를 원할 수도 있습니다(지수 백오프)?
이전에는 이를 구현하기 위해 약간의 Rx 지식이 필요했지만, 매우 일반적인 사용 사례이므로 이를 쉽게 수행할 수 있도록 헬퍼 클래스를 제공했습니다. com.couchbase.client.java.util.retry 패키지입니다.
도우미는 다음 중 하나를 생성할 수 있습니다. 기능 에 직접 전달할 수 있는 관찰 가능's 다시 시도할 때 연산자를 사용하거나 기존 관찰 가능 재시도를 소개합니다.
래핑하려면 관찰 가능사용 Retry.wrapForRetry(...) 정적 메서드를 사용할 수 있습니다. 이를 통해 최대 시도 횟수 재시도와 같은 기본 요구 사항을 처리할 수 있으며, 다음과 같은 종류의 지연 시도 사이에 원하는 것을 선택합니다.
더 고급 사용 사례의 경우에는 재시도 빌더 (이 함수는 Rx의 다시 시도할 때 연산자). 이 빌더를 사용하면 가능합니다:
- 다시 시도할 오류의 종류를 선택합니다(
any(),anyOf(...),allBut(...)). - 재시도 횟수를 선택합니다 (
once()또는최대(n)횟수). - 사용자 정의
지연그리고스케줄러를 눌러 기다립니다(지연(...)메소드).
다음은 위에 표현된 요구 사항과 일치하는 전체 예제입니다:
종속성 업데이트
이 버전에서는 RxJava 버전으로 변경되었습니다. 1.0.9. 또한 내부 종속성(리패키징되어 애플리케이션에 투명하게 표시됨)도 최신 버그 수정 릴리스로 업그레이드했습니다.
결론
2.2 릴리스의 새로운 기능을 즐겨보시기 바랍니다. 언제나 그렇듯이, 특히 엔티티 매핑 기능과 방향에 대한 피드백을 환영합니다. 직접 사용해 보시고 어떻게 생각하시는지 포럼 예를 들어!
2.2-dp를 손에 넣으려면 Maven pom.xml에서 다음을 사용하거나 다음 용기를 직접 다운로드하세요. 핵심 그리고 클라이언트):
물론 버그 수정 이번 개발자 프리뷰에서는 이 기능 또한 2.1.3 다음 주 정식 출시 예정.
2.2는 아직 끝나지 않았습니다! 다음과 같은 다양한 기능이 곧 추가될 예정입니다. 더 보기 N1QL 지원 및 기본 제공 프로파일링 및 메트릭.
행복한 코딩!
- Java SDK 팀