저장 프로시저 및 핸들러 사용자 지정¶
Snowflake Native SDK for Connectors 은 커넥터의 일반적인 정형 구조를 제공하지만 소스 시스템과 개발자의 실제 요구 사항에 따라 일부 사용자 지정을 허용합니다. 이러한 이유로 일부 기능은 기본 구현이 비어 있으며, 이를 사용자 지정 논리로 덮어쓸 수 있습니다. 또한, 특정 요구 사항에 따라 구성 요소를 활성화하거나 비활성화할 수 있습니다. 자세한 내용은 구성 요소 선택 섹션을 참조하십시오.
저장 프로시저¶
SDK가 제공하는 저장 프로시저는 다음의 두 가지 카테고리로 나눌 수 있습니다.
Java로 구현된 로직에 대한 상위 수준 진입점
범위가 작은 내부 프로시저
두 프로시저는 책임이 다르기 때문에 사용자 지정 프로세스도 다릅니다.
상위 수준의 프로시저 사용자 지정¶
상위 수준의 프로시저는 Java로 구현된 실제 논리에 대한 진입점으로만 사용됩니다. 따라서 기본 논리를 변경하려면 저장 프로시저를 다시 만들 때 새 핸들러에 대한 경로를 지정해야 합니다. 이 프로시저는 setup.sql
스크립트에 사용자 지정 코드로 추가해야 합니다. 이를 위해서는 새로운 Java 구현이 제공되어야 하며, 처음부터 새로 만들거나 아래에 설명된 SDK builders
에 제공된 구현을 사용하여 만들 수 있습니다.
CREATE OR REPLACE PROCEDURE PUBLIC.CONFIGURE_CONNECTOR(input VARIANT)
RETURNS VARIANT
LANGUAGE JAVA
RUNTIME_VERSION = '11'
PACKAGES = ('com.snowflake:snowpark:1.11.0')
IMPORTS = ('/jar_with_custom_code.jar')
HANDLER = 'com.custom.handler.CustomHandler.configure';
더 작은 범위의 프로시저 사용자 지정¶
Snowflake Native SDK for Connectors 에서 제공하는 프로시저 중 일부는 SQL만 사용하여 쉽게 작성할 수 있을 정도로 논리가 거의 없습니다. 이러한 프로시저의 경우 SQL만 사용하여 기본 구현을 대체할 수 있습니다. 예를 들어, _VALIDATE
또는 _INTERNAL
접미사가 있는 일부 프로시저는 이 방법으로 다시 구현할 수 있습니다. 이러한 모든 프로시저는 Builders
를 통해 Java 전용 접근법을 사용하여 사용자 지정할 수도 있습니다. 이러한 접근법은 아래에 설명되어 있습니다. 또한 일반 SQL만 사용하던 프로시저를 핸들러로 대체할 수도 있습니다. 이 경우에는 위의 상위 수준 저장 프로시저와 동일합니다.
CREATE OR REPLACE PROCEDURE PUBLIC.CONFIGURE_CONNECTOR_INTERNAL(config VARIANT)
RETURNS VARIANT
LANGUAGE SQL
EXECUTE AS OWNER
AS
BEGIN
-- input some custom logic here
RETURN OBJECT_CONSTRUCT('response_code', 'OK');
END;
핸들러¶
Snowflake Native SDK for Connectors 은 저장 프로시저의 기본 핸들러를 정의합니다. 그대로 사용하거나 사용자 지정하거나 완전히 바꿀 수 있습니다. 후자의 경우 전체 사용자 지정 구현은 SDK에서 정의한 표준을 따를 필요가 없으며, 상위 수준 프로시저를 사용자 지정하려면 위에서 언급한 대로 사용자 지정 구현을 SQL에 지정해야 합니다.
그러나 SDK에서 정의한 커넥터의 흐름을 따르려면 흐름의 일부만 사용자 지정하는 방법이 있습니다. 기존의 각 핸들러는 여러 개의 기본 오브젝트를 사용하며, 대부분의 경우 validator
, callback
또는 helper
클래스입니다. 각각은 일부 인터페이스를 충족하며, 기본 구현을 인터페이스의 사용자 지정 구현으로 대체하는 것이 가능합니다.
빌더¶
사용자 지정 중에 커넥터에서 SDK 정의 흐름을 유지할 수 있도록 builders
도우미 오브젝트가 제공됩니다. 각 handler
클래스에는 고유 builder
번들이 있습니다. 이를 통해 사용자는 기본 Java 오브젝트를 사용자 지정 방식으로 구현할 수 있습니다. 이렇게 하면 개발자는 커넥터 내부 흐름에 손을 대지 않고 필요한 부분만 사용자 지정하는 데 집중할 수 있습니다. builders
를 사용하는 경우에는 사소한 문제가 있으며, 이 접근법의 경우 개발자가 저장 프로시저에서 참조할 새로운 진입점 메서드를 지정해야 한다는 점입니다.
예를 들어, builder
를 사용하여 사용자 지정 validator
를 사용하는 handler
는 다음과 같습니다.
class CustomConnectionConfigurationInputValidator implements ConnectionConfigurationInputValidator {
@Override
public ConnectorResponse validate(Variant config) {
// CUSTOM LOGIC
return ConnectorResponse.success();
}
}
class CustomHandler {
// Path to this method needs to be specified in the PUBLIC.SET_CONNECTION_CONFIGURATION procedure using SQL
public static Variant configureConnection(Session session, Variant configuration) {
//Using builder
var handler = ConnectionConfigurationHandler.builder(session)
.withInputValidator(new CustomConnectionConfigurationInputValidator())
.build();
return handler.connectionConfiguration(configuration).toVariant();
}
}
그런 다음 진입점 메서드를 SQL로 다음과 같이 지정해야 합니다.
CREATE OR REPLACE PROCEDURE PUBLIC.SET_CONNECTION_CONFIGURATION(input VARIANT)
RETURNS VARIANT
LANGUAGE JAVA
RUNTIME_VERSION = '11'
PACKAGES = ('com.snowflake:snowpark:1.11.0')
IMPORTS = ('/jar_with_custom_code.jar')
HANDLER = 'com.custom.handler.CustomHandler.configureConnection';