N1QL 쿼리 및 Couchbase를 사용한 RxJava의 단순성
쿼리를 시도해 본 적이 있나요? 카우치베이스 N1QL과 Java SDK의 동기식 API를 사용하나요? 잘 작동하고 특별히 어렵지는 않지만 약간 지저분하고 동기식이라는 점이 마음에 걸립니다. 이 문제를 해결하는 방법에는 몇 가지가 있습니다. 더 나은 코드를 작성하거나 최근에 관심을 갖기 시작한 RxJava를 살펴볼 수 있습니다.
RxJava에 익숙하지 않은 분들을 위해 설명하자면, Rx.NET 및 RxJS와 유사한 Java용 반응형 확장 프로그램 세트입니다. 가장 큰 장점은 Couchbase Java SDK가 이 확장 세트와 매우 잘 통합됩니다.. N1QL을 사용하여 RxJava를 최대한 활용하는 몇 가지 Java 코드 스니펫을 살펴보겠습니다.
다음과 같은 매우 간단한 동기식 쿼리 코드가 있다고 가정해 보겠습니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public 정적 목록<지도<문자열, 개체>> fetch(final 버킷 버킷) { 문자열 쿼리 문자열 = "SELECT META().id, title, description, type " + "FROM `" + 버킷.이름() + "` " + "WHERE type = 'task'"; N1qlQueryResult 결과 = 버킷.쿼리(N1qlQuery.simple(쿼리 문자열)); 목록<지도<문자열, 개체>> 콘텐츠 = new ArrayList<지도<문자열, 개체>>(); 에 대한(N1qlQueryRow 행 : 결과) { 콘텐츠.추가(행.값().toMap()); } 반환 콘텐츠; } |
위의 예제에는 간단한 N1QL 쿼리가 있습니다. 쿼리를 실행한 후 결과 집합을 얻고 이를 반복하여 Java 지도
에 추가하고 목록
. 마지막으로 구문 분석된 결과를 반환합니다. 이 구문 분석은 Spring Boot 애플리케이션으로 작업할 때 일반적이지만 이에 국한되지는 않습니다.
위의 코드는 특별히 어렵지는 않았지만 많은 일이 있었습니다. RxJava를 사용하면 위의 코드를 다음과 같이 변환할 수 있습니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public 정적 목록<지도<문자열, 개체>> getAll(final 버킷 버킷) { 문자열 쿼리 문자열 = "SELECT META().id, title, description, type " + "FROM `" + 버킷.이름() + "` " + "WHERE type = 'task'"; 반환 버킷.비동기().쿼리(N1qlQuery.simple(쿼리 문자열)) .플랫맵(AsyncN1qlQueryResult::행) .지도(결과 -> 결과.값().toMap()) .toList() .시간 초과(10, 시간 단위.초) .차단() .단일(); } |
알겠습니다! RxJava 코드가 더 많은 줄을 가지고 있지만 더 복잡하거나 지저분하다는 뜻인가요?
RxJava는 시간 경과에 따른 값으로 간주할 수 있는 관측값을 사용합니다. 이는 비동기식이며 데이터가 파이프라인을 통해 흐르면서 일련의 연산을 포함할 수 있습니다. 예를 들어, 위 코드에서는 N1QL 쿼리를 비동기적으로 실행합니다. 쿼리의 .flatMap
에서 쿼리로 반환된 데이터에 대해 비동기 변환을 수행합니다. AsyncN1qlQueryResult
를 입력하여 AsyncN1qlQueryRow
및 .map
은 반환된 각 행을 Java 지도
. 왜냐하면 우리는 목록
의 Java 지도
전화할 수 있습니다. toList
가 바로 그 역할을 합니다. 결국에는 관찰 가능 항목으로 작업하고 싶지 않으므로 다음을 호출합니다. 차단
를 사용하여 결과를 반복 가능한 값으로 변환하거나, 우리의 경우 부모 함수 또는 프런트엔드에서 작업할 수 있는 값으로 변환합니다. 마지막으로 .single
우리는 단 한 번만 돌아올 수 있다는 것을 알고 있기 때문입니다. 목록
.
RxJava는 강력하며 위의 예시보다 훨씬 더 복잡한 작업에도 적용할 수 있습니다. 여기서 중요한 점은 사용이 간편하고 비동기 데이터 조작에 대한 이벤트 기반 접근 방식을 제공한다는 점입니다.