SQL++/N1QL 쿼리

이제 N1QL에서 사용자 정의 함수 지원

선언적 쿼리 언어가 큰 변화를 가져왔습니다. 데이터베이스 엔진의 세계에서.

그리고 SQL++ 쿼리 언어 (이전의 N1QL)은 주로 선언적 쿼리 언어입니다. 쿼리에 무엇을 가져올지 알려주면 N1QL은 이를 실행하는 방법에 대한 나머지 세부 사항을 알아서 처리합니다.

하지만 데이터베이스 쿼리를 프로그래밍 방식으로 지시하는 기능은 여러 상황에서 유용합니다. 결국, 여러분은 자신의 비즈니스 로직을 알고 있지만 N1QL은 그렇지 않습니다.

입력 사용자 정의 함수(UDF). UDF를 사용하면 특정 쿼리를 더 잘 제어할 수 있고 특정 작업이 수행되는 방식을 쿼리 언어에 지시할 수 있습니다. Couchbase Server 7.0 릴리스 에는 N1QL 쿼리 언어에 대한 사용자 정의 함수가 포함되어 있습니다.

N1QL은 기본 프로그래밍 언어에 관해서는 다소 불가지론적입니다. N1QL은 자체 절차 언어를 지정하는 대신 언어 관리자즉, 이미 다양한 게스트 언어를 지원하도록 설계되어 있습니다.

현재 지원되는 언어는 다음과 같습니다. 인라인를 사용하여 유효한 모든 N1QL 식(하위 쿼리 포함)을 코딩할 수 있는 내부 언어와 자바스크립트. 먼저 N1QL UDF에 지원되는 이 두 가지 언어를 비교해 보겠습니다.

N1QL UDF 예제: 기본 사용법

비즈니스 로직을 추가하려면 다음과 같은 함수를 만들어야 합니다. 인라인 예제입니다:

그런 다음 표현식이 허용되는 모든 곳에서 비즈니스 로직을 자유롭게 사용하거나 직접 실행 함수 문을 사용합니다:

더 이상 사용할 일이 없으면 그냥 버리면 됩니다:

N1QL UDF 예제: JavaScript

자바스크립트 사용자 정의 함수를 생성하고 삭제하는 것은 다음 섹션에서 설명할 이유 때문에 약간 더 복잡합니다.

자바스크립트 UDF는 기술적으로 외부 함수를 사용할 수 없습니다. 이는 함수가 다른 언어로 작성되고 N1QL 쿼리 서비스와는 다른 프로세스에서 실행되기 때문입니다.

첫 번째 단계는 자바스크립트 코드를 만드는 것입니다:

다음으로 N1QL 함수를 만듭니다:

일단 생성되면 인라인 UDF와 똑같이 자바스크립트 UDF를 만들어 놓을 수 있습니다. 라이브러리가 더 이상 필요하지 않은 경우 이 명령을 사용하여 삭제할 수 있습니다:

Couchbase 7.0의 새로운 기능: 범위 및 컬렉션을 위한 사용자 정의 함수

카우치베이스 서버 7.0 릴리스의 주요 기능 중 하나는 다음과 같은 도입입니다. 범위 및 컬렉션 를 사용하여 JSON 문서에 저장할 수 있습니다. 컬렉션은 유사한 문서 그룹을 위한 저장소 단위이고, 범위는 여러 개의 컬렉션을 보관하는 더 큰 저장소 단위로, 애플리케이션을 분할할 수 있습니다.

범위 및 컬렉션 사용,
카우치베이스 서버
- 이제 스키마, 테이블, 열 등 관계형 모델의 모든 장점과 단점을 모두 갖춘 문서 데이터베이스를 제공합니다.

빠른 사이드 스텝: 이전 버전과의 호환성을 허용하기 위해 쿼리 서비스에는 이제 쿼리_컨텍스트 상대 키 공간 이름을 확인하는 데 사용할 버킷과 범위를 나타내는 REST API 매개변수입니다:

위 성명서에서 선택 문이 해결됩니다. 항공사 라는 컬렉션에 default:travel-sample.scope1.airlines.

이제 사용자 정의 함수로 돌아가 보겠습니다:

UDF를 사용한 범위 및 컬렉션의 논리는 동일한 애플리케이션의 개발, 사전 프로덕션 및 프로덕션 환경을 세 개의 다른 범위에서 동일한 로직으로 동일한 애플리케이션의 사본 세 개를 배포할 수 있다는 것입니다. 반대로, 서로 다른 비즈니스 로직이 필요한 경우(예: 서로 다른 할인 또는 배송 구조가 적용되는 온라인 상점 또는 서로 다른 과세 규칙이 적용되는 회계 애플리케이션) 동일한 애플리케이션의 서로 다른 배포를 Scope에 포함할 수 있습니다.

첫 번째 경우에는 비즈니스 로직이 동일하기 때문에 개별 기능에 대한 글로벌 정의만 있으면 충분합니다. 하지만 두 번째 경우를 지원하려면 UDF를 여러 스코프에 분할해야 했습니다. 각 범위에는 각각 다른 로직을 가진 동일한 UDF의 자체 인스턴스가 있을 수 있습니다.

또한 Couchbase Server 7.0에서는 범위 및 컬렉션으로 전환하도록 강제하지 않으므로 UDF를 컬렉션 기능에 묶어 두지 않는 것이 중요하다는 점도 주목할 필요가 있습니다.

글로벌 UDF에 대한 참고 사항

글로벌 UDF는 스코프에 종속되지 않으므로 6.5에 도입된 UDF와 이전 버전과 호환됩니다.

컬렉션을 사용하지 않는 경우에는 컬렉션을 사용하기 위해 특별한 조치를 취할 필요가 없습니다.
글로벌 UDF는 아래와 같이 두 부분으로 구성된 정규화된 이름을 사용하여 참조됩니다:

쿼리 컨텍스트 매개 변수의 중요성

"좋아요, 이제 헷갈리네요."라고 말하는 것이 들립니다. "이전 예제에서 어떤 기능을 사용하셨나요? 이름이 정규화되지 않았잖아요."

그 해답은 쿼리_컨텍스트 REST API 매개 변수 설정: 다음과 같은 경우 쿼리_컨텍스트 가 설정되지 않은 경우, N1QL 구문 분석기는 이름을 다음과 같이 해석합니다. 글로벌 함수. 만약 쿼리_컨텍스트 가 설정되어 있으면 구문 분석기는 쿼리_컨텍스트 값을 사용하여 정규화되지 않은 키 공간 이름과 마찬가지로 이름을 관련 범위 함수로 해석합니다.

범위 또는 버킷에 대한 설정을 변경하여 애플리케이션을 원활하게 배포할 수 있습니다. 쿼리_컨텍스트 REST API 매개변수입니다.

함수 내부의 객체 해상도

사용자 정의 함수가 정규화된 객체를 참조하는 경우, 어떤 객체를 의미하는지에 대한 모호함이 없습니다:

다음 질문은 함수는 그 안에서 참조된 객체를 어떻게 확인할까요? 예를 들어

여기서 핵심은 최소 놀라움의 원칙입니다. 사용자 정의 함수는 실행 중에 쿼리 컨텍스트를 생성된 경로로 전환하고 항상 해당 경로 내의 객체를 참조합니다.

상대 경로로 호출했는지 정규화된 경로로 호출했는지는 중요하지 않으며, 동일한 매개변수로 호출된 함수는 항상 동일한 객체에서 가져온 동일한 결과를 반환합니다.

위의 첫 번째 예시에서는 func2() 에 따라 전역 또는 범위 함수로 해결됩니다. 쿼리_컨텍스트 설정합니다.

For func3(), 키스페이스1 버킷이 될 것입니다. 키스페이스1.

전역 함수와 범위 함수 혼합

컬렉션 기능과 함께 글로벌 UDF를 사용하는 것을 막는 것은 없습니다. 정규화된 이름을 사용하기만 하면 됩니다.

마찬가지로 다른 스코프에서 만든 스코프 함수를 사용하려면 직접 참조하기만 하면 됩니다.

자바스크립트 함수, 다시 살펴보기

자바스크립트 함수를 본문과 별도의 함수 정의 두 부분으로 나눠야 하는 이유는 다음과 같습니다:

    • 함수 정의와 별도로 본문을 만들면 여러 곳에서 동일한 본문을 재사용할 수 있습니다. 여러 위치에서 동일한 함수가 동일한 본문을 참조할 수 있으며, 본문을 편집하거나 재정의하면 해당 변경 사항이 모든 관련 함수 정의에 자동으로 적용됩니다.
    • 마찬가지로 이 패턴은 함수를 삭제하거나 삭제할 때도 중요합니다. 함수의 한 인스턴스를 삭제해야 할 때 다른 인스턴스에서 사용하는 경우 본문을 그대로 유지해야 합니다.

카우치베이스 7.0에서 N1QL 사용자 정의 함수를 사용하기 위한 팁과 요령

UDF 이름 지정

UDF 이름은 식별자이며 미리 정의된 함수 이름과 일치할 수 없습니다. 이름 do 일치하는 경우 미리 정의된 함수가 우선하므로 UDF가 사용되지 않습니다.

미리 정의된 함수 이름을 사용하려는 경우(어떤 이유로든) 참조할 때 해당 이름을 정규화해야 합니다. 예를 들어

UDF 매개변수

N1QL 사용자 정의 함수는 세 가지 유형의 매개변수 목록을 지원합니다:

  1. 빈 매개 변수

    이 함수는 매개 변수를 받지 않습니다. 매개 변수를 전달하면 오류가 발생합니다.
  2. 다양한 매개 변수

    점 3개는 변동 함수를 나타냅니다. 모든 유형의 매개변수를 얼마든지 사용할 수 있습니다. 매개 변수는 배열 이름 args.
  3. 명명된 매개변수

    매개변수는 입력되지 않지만 전달된 인수의 개수가 적용됩니다.

과부하 및 유형 처리에 대한 몇 가지 팁

입력에 따라 다르게 작동할 수 있도록 동일한 함수를 다른 매개변수 목록 또는 다른 매개변수 유형으로 여러 번 정의하는 함수 오버로딩에 가장 가까운 것은 유형이 지정되지 않은 매개변수와 가변 함수입니다.

대신 이 N1QL 전략을 추천합니다: 수신된 인수를 확인하고 그에 따라 작동하는 단일 함수가 있습니다.

다음은 변동 함수의 예입니다:

그리고 비변수 함수입니다:

매개변수 이름과 문서 필드 비교

다음 함수를 고려하세요:

함수가 문서 필드와 같은 이름을 가진 매개변수를 선언한 것을 보셨나요? 둘을 구분할 방법이 없기 때문에 이 함수는 분명히 그 의도를 달성하지 못합니다.

매개변수 이름을 사용하여 이 문제를 해결하는 방법은 다음과 같습니다. 매개변수 이름은 문서 필드를 재정의합니다(어느 쪽이든 위의 쿼리는 여행 샘플 데이터 집합).

문서 필드에 액세스하려면 두 가지 선택지가 있습니다. 아래에서 볼 수 있듯이 정규화된 이름으로 문서 필드를 참조합니다:

또는 아래와 같이 매개변수의 이름을 변경하여 모호성을 제거할 수도 있습니다:

UDF를 사용한 반환 값

사용자 정의 함수는 어떤 유형이든 하나의 값만 반환합니다. 둘 이상의 값을 반환해야 하는 경우 배열이나 객체를 반환합니다.

하지만 반환 유형을 주의하세요! 다음 사항을 기억하세요. 선택 문은 배열을 반환하므로, UDF 내부에서 실행되는 선택 는 하나의 문서만 반환하며, 이는 하나의 요소 배열입니다. 대신 배열의 첫 번째 요소를 반환합니다.

예를 들어 아래의 이 함수는 원하는 기능을 수행하지 않습니다:

하지만 이건 그렇지 않습니다:

UDF 반환 값을 쿼리 데이터로 사용

스펙트럼의 반대편에 있는 UDF는 배열을 반환할 수 있으므로 다음 예제에서와 같이 테이블 함수 또는 컬렉션 파생 테이블과 같은 개념을 사용하여 관계형 엔진에서 하는 것처럼 쿼리할 데이터를 동적으로 생성하는 데 유용하게 사용할 수 있습니다.

예제 함수에서는 버킷에서 데이터를 선택하지만, 배열을 구성하는 모든 유효한 방법을 사용하여 데이터를 생성할 수 있습니다.

기존 함수를 업데이트해야 하는 경우

함수를 재정의해야 할 때가 있습니다. 함수의 또는 교체 조항의 만들기 함수 문을 사용하면 한 번에 이 작업을 수행할 수 있습니다:

사용자 액세스 권한

UDF 내에서 실행되는 모든 N1QL 문은 요청을 제출한 사용자와 동일한 권한으로 실행됩니다. 따라서 사용자는 지정된 UDF가 참조하는 모든 개체에 액세스하려면 적절한 권한이 있어야 합니다.

무엇보다도 사용자는 함수를 실행할 수 있는 권한이 있어야 합니다. 내부, 외부, 전역 및 범위 수준 함수에 대해 서로 다른 권한 수준이 존재합니다. 함수를 만들고 삭제하려면 사용자에게 함수 관리 권한이 부여되어야 합니다. 예를 들어

결론

이 게시물이 Couchbase 7.0에서 N1QL 사용자 정의 기능을 언제, 어떻게 활용할 수 있는지 이해하는 데 도움이 되었기를 바랍니다. 다음에 대한 설명서를 확인하세요. 사용자 정의 기능에 대한 자세한 정보컨텍스트 켜짐 N1QL 개체 및 쿼리_컨텍스트 그리고 UDF를 위한 보안 역할.

UDF를 직접 체험해보고 싶으신가요?
카우치베이스 7을 직접 사용해 보세요.

 

이 문서 공유하기
받은 편지함에서 카우치베이스 블로그 업데이트 받기
이 필드는 필수 입력 사항입니다.

작성자

게시자 마르코 그레코, 소프트웨어 아키텍트, 카우치베이스

전생에 마르코는 이탈리아 최대 방사선 치료 기관에서 CTO, 방사선 물리학자, 소프트웨어 설계자, 시스템 관리자, DBA, 트레이너, 일반 관리자로 일했습니다. 직업과 국가를 바꾼 그는 처음에는 Informix에서, 나중에는 IBM에서 20년 이상 다양한 지원 및 개발 직책을 맡다가 마침내 과감히 Couchbase에 합류하여 N1QL에서 금을 만드는 데 도움을 주었습니다. 그는 여러 개의 특허를 보유하고 있으며 직접 오픈 소스 프로젝트를 저술하기도 했습니다.

댓글 하나

  1. 이제 N1QL에서 사용자 정의 함수 지원 - 51posts 8월 25, 2021에서 12:27 오전

    [...] 포스트 N1QL, 이제 사용자 정의 기능 지원 첫 번째 등장 카우치베이스 [...]

댓글 남기기

카우치베이스 카펠라를 시작할 준비가 되셨나요?

구축 시작

개발자 포털에서 NoSQL을 살펴보고, 리소스를 찾아보고, 튜토리얼을 시작하세요.

카펠라 무료 사용

클릭 몇 번으로 Couchbase를 직접 체험해 보세요. Capella DBaaS는 가장 쉽고 빠르게 시작할 수 있는 방법입니다.

연락하기

카우치베이스 제품에 대해 자세히 알고 싶으신가요? 저희가 도와드리겠습니다.