Couchbase Server 7.0에 도입된 여러 가지 훌륭한 기능 중에서이후 릴리스에서 더 큰 영향을 미칠 가능성이 있습니다: N1QL 사용자 정의 함수입니다.
과거를 한눈에 살펴보기
N1QL은 선언적 언어로, 요청은 단순히 다음을 나타내는 것입니다. 무엇 를 지정할 필요 없이 사용자가 필요로하는 어떻게 요청을 수행해야 합니다.
이는 맞춤형 비즈니스 로직이 부족하다는 한계가 있긴 하지만 쿼리 언어에 매우 효과적이었습니다.
사용자 정의 함수는 이러한 격차를 해소합니다.
카우치베이스 서버 7.0의 UDF에 대한 전체 보기는 다음에서 확인할 수 있습니다. 이 블로그에 대한 자세한 내용은 다음에서 확인할 수 있지만, 앞뒤로 넘어가는 것을 방지하기 위해 몇 가지 중요한 사항을 간단히 알려드리겠습니다:
-
- UDF는 여러 언어로 제공됩니다. 이 블로그에서는 특히 JavaScript에 관심이 있습니다.
- UDF는 두 가지 맛으로 제공되며, 클러스터 와이드(또는 글로벌 UDF), 아직 컬렉션을 수용하지 않은 경우에 유용하며, 범위 바운드(또는 범위 UDF)를 사용하면 스코프당 하나씩, 잠재적으로 다른 로직을 가진 동일한 UDF의 복사본을 여러 개 가질 수 있습니다.
- N1QL은 UDF 오버로딩(동일한 이름과 다른 서명을 가진 여러 개의 UDF가 각각 입력에 특정한 로직을 지원하는 것)을 제공하지 않지만, 가변 UDF를 사용하면 동일한 기능을 구현할 수 있습니다.
- N1QL UDF는 N1QL 쿼리의 소스로 사용할 수 있는 동적 데이터를 생성할 수 있습니다.
자바스크립트 UDF
-
- 자바스크립트는 외부 언어를 사용하므로 JavaScript 라이브러리의 관리 및 실행이 N1QL 서비스와는 다른 엔티티에 위임됩니다. 이 엔티티는 jsevaluator.
- 자바스크립트 함수를 만드는 과정은 두 단계로 진행됩니다. 먼저 jsevaluator 인터페이스를 생성한 다음 이를 참조하여 N1QL UDF를 생성합니다.
- 외부에서 코드를 유지 관리할 때의 부수적인 이점 중 하나는 여러 UDF가 동일한 라이브러리와 동일한 코드를 공유할 수 있고 코드가 변경되면 모두 동시에 업데이트된다는 점입니다. 공유 라이브러리는 범위 스키마와 달리 애플리케이션과 보조를 맞출 수 있습니다.
- 7.0 릴리스에서는 jsevaluator 는 일반 자바스크립트만 지원합니다.
누락된 부분
앞서 살펴본 것처럼 동일한 라이브러리를 쿼리 서비스 전체에서 여러 요청이 동시에 사용할 수 있으므로 전역 변수에 값을 저장하고 검색하면 예기치 않은 결과가 발생할 수 있습니다.
이로 인한 부작용은 함수 참조가 전역 변수에 저장되므로 전역 화살표 함수가 지원되지 않는다는 것입니다.
로컬 화살표 함수(전역 함수 본문 안에 선언된 함수)는 예상대로 작동합니다.
실제 사례
먼저 JavaScript 라이브러리와 함수를 생성합니다:
1 2 3 |
curl -v -X POST http://localhost:8093/evaluator/v1/libraries/math \ -u 관리자:비밀번호 \ -d 'function add(a, b) { let data = a + b; return data; }' |
그런 다음 N1QL UDF를 생성합니다:
1 |
cbq> 만들기 기능 자바스크립트 추가(a, b) 언어 자바스크립트 AS "추가" AT "math"; |
UDF를 먼저 생성하고 라이브러리를 나중에 생성하는 것은 완벽하게 합법적이지만, 라이브러리를 생성하기 전까지는 UDF를 실행할 수 없습니다!
7.1의 새로운 기능!
사용자 인터페이스
더 이상 자바스크립트 라이브러리를 조작하기 위해 이상한 REST 엔드포인트와 curl 명령에 신경 쓸 필요가 없습니다. 쿼리 페이지에 새 탭이 생깁니다, UDF:
클릭하면 JavaScript 라이브러리 및 N1QL UDF 정의 목록이 표시됩니다:
JavaScript 라이브러리와 N1QL 사용자 정의 함수를 모두 추가하고 편집할 수 있는 버튼이 있습니다.
주의할 점은 개별 함수가 아닌 라이브러리를 편집하거나 추가하는 것이므로 JavaScript 라이브러리에 새 함수를 추가하려면 라이브러리 전체를 편집한 후 기존 함수와 새 함수를 모두 포함하여 다시 제출해야 합니다(새 함수만 제출하면 기존 함수가 삭제되므로 주의해야 합니다!).
UDF 자바스크립트 라이브러리 UI를 이벤트 UI와 같은 위치(예: 디버거)로 옮길 계획이 있지만, 아직 그 단계에 이르지 못했으며 결과적으로 UI의 형태와 위치가 변경될 가능성이 높다는 점에 유의하세요.
자바스크립트의 N1QL
7.0.x와 함께 제공되는 JavaScript 엔진은 바닐라 JavaScript만 실행할 수 있으며 N1QL 요청을 실행할 수 있는 기능이 없습니다.
7.1.x에서 JavaScript 엔진은 이제 여러 개의 N1QL 문을 실행할 수 있으며 반복자와 트랜잭션을 모두 지원합니다.
계층적 자바스크립트 라이브러리 저장소
7.0에서 JavaScript 라이브러리 스토어는 플랫 리포지토리로, 모든 라이브러리가 동일한 레벨에 위치하며 전역 및 범위 N1QL UDF 모두에서 볼 수 있습니다.
이러한 라이브러리는 공유됩니다.
7.1에서는 스토리지가 계층 구조로 확장되었습니다.
루트 레벨 라이브러리는 여전히 글로벌 및 스코프 N1QL UDF 모두에서 액세스할 수 있고 이전처럼 공유할 수 있으며, 특정 버킷 및 스코프에 특정 루트 레벨 라이브러리를 별도로 구현하거나 특정 스코프에만 액세스할 수 있는 사용자를 위한 비공개 라이브러리 스토리지로 라이브러리를 정의할 수도 있습니다.
결론
이 블로그에서는 카우치베이스 서버 7.1의 JavaScript 사용자 정의 함수 기능을 미리 살펴볼 수 있습니다.
다음 블로그에서 각각에 대해 자세히 살펴보겠습니다.
-
- 현재로서는 다음에 대해 자세히 알아보세요. 카우치베이스의 N1QL UDF