Spring Data Couchbase 2.0은 기존 Spring Data Couchbase 1.4.x 커넥터를 재작성한 것입니다. 이 커넥터는 Couchbase Java 2.2 SDK를 기반으로 하며 새로운 쿼리 언어인 N1QL(Couchbase Server 4.0에 도입됨)을 많이 사용하여 Spring Data 사용자에게 더 많은 기능을 제공합니다.
그리고 첫 번째 마일스톤 지난 8월에 릴리스 후보가 출시된 이후 추가 기능(및 버그 수정)이 구현되어 이제 GA 릴리스를 공개할 수 있게 되었습니다.
변경된 사항을 간단히 살펴보겠습니다(각 기능이 얼마나 멋지고 중요하다고 생각하는지 ⭐를 ⭐로 표시하여 표시하세요):
스프링 데이터 카우치베이스 2.0의 새로운 기능
1.x 세대의 주요 차이점은 다음과 같습니다. Spring 데이터 카우치베이스 와 2.x 버전이 있습니다:
- 구성 요소는 Couchbase의 현실에 더 가깝습니다: 환경, 클러스터, 버킷(잠재적으로 생성할 수 있는
카우치베이스 템플릿
각각 다른 버킷에 연결하거나 심지어 다른 클러스터에 연결할 수도 있습니다!) - 사용자 지정 리포지토리 방법의 백업은 더 이상 뷰를 통해 수행되지 않으며, 이제 (기본적으로) 훨씬 더 유연하고 서버 측 유지 관리가 덜 필요한 N1QL을 통해 수행됩니다.
- 보기를 사용하는 사용자 정의 메서드가 Spring 데이터 철학에 더 잘 부합하도록 약간 수정되었습니다. 이로 인해 유연성이 약간 감소하지만, 메서드 이름에서 구현이 생성됩니다("쿼리 파생"을 통해).
- 이제 뷰를 사용하여 데이터의 지리공간 쿼리(또는 3차원을 넘어서는 경우 다차원 쿼리)를 수행할 수 있습니다.
물론 여전히 하위 수준 API에 액세스하려면 카우치베이스 템플릿
보다는 카우치베이스 리포지토리
인터페이스에 액세스할 수도 있습니다. 버킷
를 사용하세요.
N1QL을 통한 리포지토리 방법
⭐⭐⭐
Couchbase 4.0의 가장 큰 새로운 기능은 다음과 같습니다. N1QL는 JSON 문서에서 작동하는 SQL 확장 프로그램입니다(따라서 SQL에 JSON 관련 특수성을 추가했습니다).
특히 다음과 같은 경우에 유용합니다. 리포지토리
대부분의 쿼리 도출 키워드는 N1QL로 쉽게 변환할 수 있기 때문입니다.
이제 N1QL이 리포지토리 메서드에 대한 기본 지원 Couchbase 기능입니다. 실행되는 쿼리를 명시하고 싶다면 @Query 인터페이스를 사용하도록 선택할 수도 있습니다.
1 2 3 4 5 6 7 8 9 |
public 인터페이스 사용자 저장소 확장 리포지토리<사용자, 문자열> { 사용자 사용자명 동일 찾기(문자열 사용자 이름); 목록 사용자이름으로 찾기(문자열 포함); @쿼리 //선택 사항이지만 더 명시적인 N1QL 쿼리 도출을 위해 목록 findByAgeBetween(int minAge, int maxAge); } |
보기를 통한 리포지토리 방법
⭐⭐
이 버전의 큰 변화 중 하나는 이제 뷰를 기반으로 하는 리포지토리 쿼리(일명 사용자 정의 리포지토리 메서드)가 Spring 데이터 철학에 더 부합한다는 점입니다. 또한 이러한 쿼리에는 다음과 같이 명시적으로 주석을 달아야 합니다. @View(viewName="something")
.
즉, 리포지토리 인터페이스에 Couchbase 고유의 어떤 것도 유출되어서는 안 됩니다. 대신 대부분의 쿼리에 쿼리 파생 메커니즘을 사용할 수 있습니다.
쿼리 도출도 어느 정도 가능하며, 몇 가지 키워드는 뷰백 방식으로 허용됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 |
public 인터페이스 사용자 저장소 확장 리포지토리<사용자, 문자열> { @오버라이드 @보기(디자인 문서 = "user", 보기 이름 = "customFindAllView") 반복 가능 findAll(); @보기(보기 이름 = "customFindByNameView") 사용자 사용자이름으로 찾기(문자열 낮은 키); @보기(보기 이름 = "customFindByNameView") 목록 사용자 이름 사이로 찾기(문자열 낮은 키, 문자열 높은키); } |
보기에서 축소 기능 사용
⭐
이전에는 지원되지 않았던 또 다른 새로운 기능은 축소 기능이 있는 경우 실행하는 기능입니다. 이제 이 함수를 실행하려면 단순히 감소
플래그를 참으로 설정하고 @View
어노테이션.
메서드 앞에 "find" 대신 "count"를 붙이는 것이 의미 있는 경우(즉, 실제로 "count" 줄이기 함수를 사용하는 경우)에도 사용할 수 있습니다.
카우치베이스의 reduce 함수는 기존의 _count 하나가 아닌 다른 함수가 될 수 있으며, 심지어는 JsonObject
내장형과 같은 _stats
.
마찬가지로 메소드 이름에 "topX" 또는 "firstX" 변형을 추가하면 요청에 추가 제한이 설정됩니다(예. findFirst5By성
를 누르면 목록이 5개로 제한됩니다).
일관성 구성, 자체 쓰기 읽기
⭐⭐⭐
뷰나 GSI(N1QL을 지원하는 새로운 보조 인덱스 엔진)와 같이 비동기적으로 채워지는 보조 인덱스를 사용할 때 자주 발생하는 한 가지는 이전 쓰기 작업의 수정 사항을 즉시 읽어야 한다는 점입니다.
이는 데이터가 아직 색인되는 과정 중에 있는 한 뷰/N1QL이 응답하지 않아야 한다는 것을 의미하므로 일관성을 위해 약간의 성능을 희생합니다.
그 반대(그리고 스프링 데이터 카우치베이스의 현재 기본값)는 오래된 데이터를 반환하도록 허용하여 성능을 향상시키는 것입니다.
일관성 개념에 대한 작은 추상화를 제공하여 쿼리 도출을 통해 프레임워크에서 구성되는 모든 쿼리(보기 기반 또는 N1QL 기반)를 구성하기 위한 글로벌 시맨틱을 추가했습니다.
이 작업은 추상 카우치베이스 구성
's getDefaultConsistency()
메서드를 사용합니다. 일관성
은 다음 중 하나를 선택할 수 있는 열거형입니다. READ_YOUR_OWN_WRITES
, 강력하게_일관성
, UPDATE_AFTER
그리고 결국_일관성
. 정확한 작동 방식과 쿼리 시점에 미치는 영향에 대한 자세한 내용은 공식 문서를 참조하세요.
XML에서도 일관성 속성을 사용하여 이 작업을 수행할 수 있습니다. 태그.
GA 이후 리포지토리의 CRUD 메서드는 이제 기본 구성된 일관성도 고려합니다.
저장된 JSON의 유형 정보 필드 변경하기
⭐
일부 사용자는 Spring 데이터 및 Couchbase Mobile과 관련된 문제를 보고했으며, 동기화 게이트웨이에서 밑줄이 앞에 붙은 필드가 포함된 문서를 거부하는 문제가 발생했습니다.
스프링 데이터의 경우 기본적으로 유형 정보를 _class
필드 :(
해결책은 구성을 통해 해당 유형 정보 필드의 이름을 수정할 수 있도록 허용하는 것입니다. 이렇게 하려면 typeKey()
메서드의 추상 카우치베이스 구성
. 예를 들어 상수 매핑 카우치베이스 컨버터.TYPEKEY_SYNCGATEWAY_COMPATIBLE
("javaClass
“).
이 필드는 리포지토리의 엔티티에 해당하는 문서만 필터링하기 위해 생성된 N1QL 쿼리에서 사용되는 필드입니다.
지원 대상 페이지 가능
/페이지 요청
N1QL 파생 쿼리에서
⭐⭐
쿼리 도출을 통해 생성된 쿼리의 경우 N1QL을 사용합니다, 페이지 가능
그리고 정렬
매개 변수가 이제 지원됩니다.
- 지원 대상
페이징 및 정렬 저장소
N1QL을 기반으로 합니다. - 두 개 추가
findAll
메서드에서 페이징 및/또는 정렬을 위해 N1QL에 의존합니다. 기본 구성된 일관성을 사용합니다.
공간 뷰를 사용한 지리공간 및 다차원 쿼리
⭐⭐⭐
좌표를 사용하여 카우치베이스 쿼리하기! 엔티티에 포인트
(또는 x
그리고 y
) 위치를 사용하여 찾을 수 있습니다:
- 바운딩 박스입니다:
findByLocationWithin(박스 영역)
- 원입니다:
findByLocationWithin(원 영역)
,findByLocationWithin(포인트 중심, 거리 반경)
. - 다각형입니다:
findByLocationWithin(다각형 영역)
,findByLocationWithin(Point[] polygon)
. - 거리
findByLocationNear(가까운 지점, 최대 거리)
.
원 및 다각형과 같은 쿼리는 서버에서 바운딩 박스 근사치로 빠르게 수행된 다음 프레임워크에서 오탐을 제거한 후 결과를 표시합니다.
카우치베이스 공간 뷰의 다차원적 측면을 활용하여 쿼리에 추가 차원을 추가할 수 있습니다(예: 도시 내에서 밤늦게까지 영업하는 상점...).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public 인터페이스 차원 파티 저장소 확장 크러드 리포지토리<파티, 문자열> { @차원(디자인 문서 = "partyGeo", 공간 뷰 이름 = "byLocation") 목록 위치 근처 찾기(포인트 p, 거리 d); @차원(디자인 문서 = "partyGeo", 공간 뷰 이름 = "byLocation") 목록 findByLocationWithin(Box 바운딩박스); @차원(디자인 문서 = "partyGeo", 공간 뷰 이름 = "byLocation") 목록 findByLocationWithin(다각형 영역); @차원(디자인 문서 = "partyGeo", 공간 뷰 이름 = "byLocationAndAttendees", 치수 = 3) 목록 찾기 위치 내 및 참석자보다 더 큰(다각형 영역, double 최소 참석자); } |
참고: 어노테이션을 재사용하려는 경우에도 그렇게 할 수 있습니다( @View
그리고 쿼리
도):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public 인터페이스 차원 파티 저장소 확장 크러드 리포지토리<파티, 문자열> { //자체 메타 주석 정의하기 @차원(디자인 문서 = "partyGeo", 공간 뷰 이름 = "byLocation", 치수 = 2) @리텐션(보존 정책.런타임) @인터페이스 위치별 인덱싱 { } //사용 :) @위치별 인덱싱 목록 위치 근처 찾기(포인트 p, 거리 d); @위치별 인덱싱 목록 findByLocationWithin(Box 바운딩박스); @위치별 인덱싱 목록 findByLocationWithin(다각형 영역); //여기서는 3차원 변형을 사용하므로 @Dimensional로 되돌려야 합니다. @차원(디자인 문서 = "partyGeo", 공간 뷰 이름 = "byLocationAndAttendees", 치수 = 3) 목록 찾기 위치 내 및 참석자보다 더 큰(다각형 영역, double 최소 참석자); } |
인라인 N1QL
쿼리
이제 SpEL을 지원합니다.
⭐⭐⭐
인라인 쿼리에서 SpEL 표기법을 사용할 수 있습니다:
- 엔티티를 구성하고 반환하기 위해 문에 올바른 선택 및 필터링이 적용되었는지 확인하려면 다음을 사용하십시오.
#{#n1ql.selectEntity}
를 생성하려면에서 ... 선택 ...
절과#{#n1ql.filter}
에서어디
절을 사용하여 쿼리를 올바른 엔티티로 제한합니다. - 값을 계산하거나 Spring 컨텍스트에 구성된 외부 SpEL 값 제공에서 데이터를 검색합니다.
리포지토리 "메인" 인덱스 생성을 자동으로 트리거할 수 있습니다.
⭐⭐
⚠️ 중요: 개발/테스트 중에는 보조 도구로 간주되며 프로덕션에서는 사용하지 않는 것이 좋습니다.
특정 리포지토리에 있는 엔티티의 N1QL 인덱싱이 개발 또는 사전 프로덕션 환경에서 활성화되도록 하려면 다음과 같이 주석을 달 수 있습니다. @N1qlPrimaryIndexed
(버킷 전체에 대한 자유 형식 쿼리 가능) 및 @N1qlSecondaryIndexed
(이는 SpEL에서 생성된 WHERE 절과 유사하게 엔티티 유형에 해당하는 문서만 색인합니다. #{#n1ql.filter}
).
또한 리포지토리에 다음과 같이 주석을 달아 CRUD 작업을 위한 백킹 뷰를 자동으로 만들 수 있습니다. ViewIndexed
(엔티티의 간단한 클래스 이름에 해당하는 디자인 문서 이름을 소문자 첫 글자로 입력해야 합니다).
이 기능을 사용하려면 추가적으로 indexManager
콩의 추상 카우치베이스 구성
.
단순 반환 유형(프리미티브 및 문자열
) 이제 단일 행 투영을 사용할 때 지원됩니다.
⭐⭐
이는 특히 다음과 같은 집계 함수가 있는 인라인 N1QL 쿼리를 대상으로 합니다. COUNT(*)
, AVG(필드)
등... 쿼리는 단일 투영이 있는 단일 행을 반환해야 합니다.
N1QL 인라인 쿼리에서 명명된 매개 변수 지원
⭐⭐
명명된 매개변수 또는 위치 매개변수 중 하나만 사용하되 둘 다는 사용할 수 없습니다. 명명된 매개변수의 구문은 다음과 같습니다. $paramName
를 사용하여 각 메서드 매개변수에 다음과 같이 주석을 달아야 합니다. @Param("paramName")
.
기타 기능
⭐
기타 기능에는 다음이 포함됩니다:
- 스프링 데이터 카우치베이스에서 생성된 모든 빈의 접두사에 "" 가 붙도록 빈 이름 지정 수정
카우치베이스
'로 변경하여 다른 스토어와의 충돌을 피할 수 있습니다. - 이제 모든 리포지토리에 대한 베이스 클래스 변경이 지원됩니다(공통 스프링 데이터 문서에 설명된 프로세스에 따라).
- 인덱스가 오래된 경우, 삭제된 문서는
카우치베이스 템플릿
- 만료는
문서
로서long
+시간 단위
RC1에 비해 몇 가지 버그 수정 및 개선 사항도 구현되었습니다.
문서
⭐⭐⭐
문서 도 개선되어 리포지토리에 사용자 정의 메서드 구현을 추가하는 방법, 모든 리포지토리의 기본 클래스를 변경하는 방법, 인라인 쿼리에서 SpEL을 처리하는 방법 등에 대한 Couchbase 지향 예제를 추가했습니다.
스프링 캐시에 대한 참고 사항
그리고 스프링 캐시 지원이 Spring 데이터 리포지토리 밖으로 이전되었습니다. 아직 남아 있으며 계속 개선해 나갈 계획입니다. 지금은 Couchbase에서 찾을 수 있습니다. 저장소 가 github에 있지만 곧 공식 Spring 프로젝트 제품군에 다시 통합될 예정입니다.
Spring 데이터 카우치베이스 가져오기
프로젝트에 다음을 추가할 수 있습니다. pom.xml
를 클릭해 이 GA 릴리스를 받으려면 ( 종속성
섹션으로 이동합니다:
1 2 3 4 5 6 7 |
<!----> org.스프링 프레임워크.데이터 봄-데이터-카우치베이스 2.0.0.릴리스 <!----> |
이번 릴리스와 새로운 기능을 모두 즐겨보시기 바랍니다. 다음 단계는 다음과 같이 호퍼
버전이 있는 릴리스 트레인 2.1
여름 전에 예상됩니다.