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 static List<Map<String, Object>> fetch(final Bucket bucket) { String queryStr = "SELECT META().id, title, description, type " + "FROM `" + bucket.name() + "` " + "WHERE type = 'task'"; N1qlQueryResult result = bucket.query(N1qlQuery.simple(queryStr)); List<Map<String, Object>> content = new ArrayList<Map<String, Object>>(); for(N1qlQueryRow row : result) { content.add(row.value().toMap()); } return content; } |
위의 예제에는 간단한 N1QL 쿼리가 있습니다. 쿼리를 실행한 후 결과 집합을 얻고 이를 반복하여 Java 지도 에 추가하고 목록. 마지막으로 구문 분석된 결과를 반환합니다. 이 구문 분석은 Spring Boot 애플리케이션으로 작업할 때 일반적이지만 이에 국한되지는 않습니다.
위의 코드는 특별히 어렵지는 않았지만 많은 일이 있었습니다. RxJava를 사용하면 위의 코드를 다음과 같이 변환할 수 있습니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public static List<Map<String, Object>> getAll(final Bucket bucket) { String queryStr = "SELECT META().id, title, description, type " + "FROM `" + bucket.name() + "` " + "WHERE type = 'task'"; return bucket.async().query(N1qlQuery.simple(queryStr)) .flatMap(AsyncN1qlQueryResult::rows) .map(result -> result.value().toMap()) .toList() .timeout(10, TimeUnit.SECONDS) .toBlocking() .single(); } |
알겠습니다! RxJava 코드가 더 많은 줄을 가지고 있지만 더 복잡하거나 지저분하다는 뜻인가요?
RxJava는 시간 경과에 따른 값으로 간주할 수 있는 관측값을 사용합니다. 이는 비동기식이며 데이터가 파이프라인을 통해 흐르면서 일련의 연산을 포함할 수 있습니다. 예를 들어, 위 코드에서는 N1QL 쿼리를 비동기적으로 실행합니다. 쿼리의 .flatMap 에서 쿼리로 반환된 데이터에 대해 비동기 변환을 수행합니다. AsyncN1qlQueryResult 를 입력하여 AsyncN1qlQueryRow 및 .map 은 반환된 각 행을 Java 지도. 왜냐하면 우리는 목록 의 Java 지도 전화할 수 있습니다. toList 가 바로 그 역할을 합니다. 결국에는 관찰 가능 항목으로 작업하고 싶지 않으므로 다음을 호출합니다. 차단 를 사용하여 결과를 반복 가능한 값으로 변환하거나, 우리의 경우 부모 함수 또는 프런트엔드에서 작업할 수 있는 값으로 변환합니다. 마지막으로 .single 우리는 단 한 번만 돌아올 수 있다는 것을 알고 있기 때문입니다. 목록.
RxJava는 강력하며 위의 예시보다 훨씬 더 복잡한 작업에도 적용할 수 있습니다. 여기서 중요한 점은 사용이 간편하고 비동기 데이터 조작에 대한 이벤트 기반 접근 방식을 제공한다는 점입니다.