응답 및 오류 처리¶
Snowflake Native SDK for Connectors 은 특히 UI에서 사용하도록 노출되고 설계된 프로시저에 대해 특정 표준 응답을 사용합니다. 또한 예외가 유효한 응답에 매핑되고 EVENT TABLE
에 로그인되는지 확인하는 방법을 제공합니다.
응답¶
SDK 프로시저(상위 수준 프로시저와 내부 프로시저)는 모두 특정 구조의 variant
를 사용하여 정보를 전달합니다. 이러한 variant
의 요구 사항은 response_code
필드를 포함해야 하며, 경우에 따라 응답 코드가 필수 message
필드에 있는 OK
와 다른 경우가 있습니다. 추가 필드를 포함할 수는 있지만 추가적인 사용자 지정 처리가 필요합니다. 응답 형식은 다음과 같습니다.
{
"response_code": "<response code>",
"message": "<message>"
}
프로시저와 오브젝트의 기본 구현을 바꿀 때 이 형식을 사용하는 것이 좋습니다.
오류 처리¶
Snowflake Native SDK for Connectors 은 런타임 중에 발생할 수 있는 예외를 처리하는 유용한 기본 메커니즘을 제공합니다. 이를 담당하는 클래스를 ConnectorErrorHelper
라고 하며 기본 구현은 DefaultConnectorErrorHelper
입니다. 이 기능은 2개의 사용자 지정 콜백을 제공합니다. 첫 번째인 ExceptionMapper
는 모든 예기치 않은 오류를 ConnectorException
형식으로 래핑하는 역할을 담당합니다. 이 기능은 주로 응답이 위에 언급된 형식을 준수하는지 확인하는 데 사용됩니다.
두 번째 콜백인 ExceptionLogger
는 오류가 기록되도록 합니다. 이 기능은 모든 표준 로그 항목이 Snowflake에 의해 EVENT TABLE
에 저장되어 애플리케이션 문제를 해결할 때 도움이 되므로 중요합니다.
도우미 사용 방법¶
도우미는 2가지 방법을 제공합니다.
withExceptionWrapping(Supplier<ConnectorResponse> action)
withExceptionLogging(Supplier<T> action)
이 메서드는 각각 위에서 언급한 mapper
및 logger
를 사용합니다. 또한 이러한 접근법을 혼합한 도우미 메서드의 기본 구현도 있습니다.
default ConnectorResponse withExceptionLoggingAndWrapping(Supplier<ConnectorResponse> action) {
return withExceptionWrapping(() -> withExceptionLogging(action));
}
handler
에서 메서드를 호출할 때는 이 래핑을 가능한 가장 높은 수준에서 사용하는 것이 좋습니다. 예를 들어, ConnectionConfigurationHandler 에서는 다음과 같이 사용됩니다.
public static Variant setConnectionConfiguration(Session session, Variant configuration) {
var handler = ConnectionConfigurationHandler.builder(session).build();
return handler.setConnectionConfiguration(configuration).toVariant();
}
public ConnectorResponse setConnectionConfiguration(Variant configuration) {
return errorHelper.withExceptionLoggingAndWrapping(
() -> setConnectionConfigurationBody(configuration)
);
}
SDK는 또한 빌더가 이 동작을 사용자 지정할 수 있도록 ConnectorErrorHelperBuilder
라는 기능을 노출합니다. 이 빌더를 사용하면 개발자가 mapper
및 logger
콜백의 동작을 사용자 지정할 수 있습니다. 사용자 지정이 완료되면 새 helper
를 해당 builders
의 handler
클래스에 전달할 수 있습니다. 예:
class CustomUnknownExceptionMapper implements ExceptionMapper<Exception> {
@Override
public ConnectorException map(Exception exception) {
return new CustomConnectorException(exception);
}
}
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 errorHelper = new ConnectorErrorHelperBuilder()
.withConnectorExceptionLogger(new CustomUnknownExceptionMapper())
.build();
var handler = ConnectionConfigurationHandler.builder(session)
.withErrorHelper(errorHelper)
.build();
return handler.connectionConfiguration(configuration).toVariant();
}
}