응답 및 오류 처리

Snowflake Native SDK for Connectors 은 특히 UI에서 사용하도록 노출되고 설계된 프로시저에 대해 특정 표준 응답을 사용합니다. 또한 예외가 유효한 응답에 매핑되고 EVENT TABLE 에 로그인되는지 확인하는 방법을 제공합니다.

응답

SDK 프로시저(상위 수준 프로시저와 내부 프로시저)는 모두 특정 구조의 variant 를 사용하여 정보를 전달합니다. 이러한 variant 의 요구 사항은 response_code 필드를 포함해야 하며, 경우에 따라 응답 코드가 필수 message 필드에 있는 OK 와 다른 경우가 있습니다. 추가 필드를 포함할 수는 있지만 추가적인 사용자 지정 처리가 필요합니다. 응답 형식은 다음과 같습니다.

{
    "response_code": "<response code>",
    "message": "<message>"
}
Copy

프로시저와 오브젝트의 기본 구현을 바꿀 때 이 형식을 사용하는 것이 좋습니다.

오류 처리

Snowflake Native SDK for Connectors 은 런타임 중에 발생할 수 있는 예외를 처리하는 유용한 기본 메커니즘을 제공합니다. 이를 담당하는 클래스를 ConnectorErrorHelper 라고 하며 기본 구현은 DefaultConnectorErrorHelper 입니다. 이 기능은 2개의 사용자 지정 콜백을 제공합니다. 첫 번째인 ExceptionMapper 는 모든 예기치 않은 오류를 ConnectorException 형식으로 래핑하는 역할을 담당합니다. 이 기능은 주로 응답이 위에 언급된 형식을 준수하는지 확인하는 데 사용됩니다.

두 번째 콜백인 ExceptionLogger 는 오류가 기록되도록 합니다. 이 기능은 모든 표준 로그 항목이 Snowflake에 의해 EVENT TABLE 에 저장되어 애플리케이션 문제를 해결할 때 도움이 되므로 중요합니다.

도우미 사용 방법

도우미는 2가지 방법을 제공합니다.

  • withExceptionWrapping(Supplier<ConnectorResponse> action)

  • withExceptionLogging(Supplier<T> action)

이 메서드는 각각 위에서 언급한 mapperlogger 를 사용합니다. 또한 이러한 접근법을 혼합한 도우미 메서드의 기본 구현도 있습니다.

default ConnectorResponse withExceptionLoggingAndWrapping(Supplier<ConnectorResponse> action) {
    return withExceptionWrapping(() -> withExceptionLogging(action));
}
Copy

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)
    );
}
Copy

SDK는 또한 빌더가 이 동작을 사용자 지정할 수 있도록 ConnectorErrorHelperBuilder 라는 기능을 노출합니다. 이 빌더를 사용하면 개발자가 mapperlogger 콜백의 동작을 사용자 지정할 수 있습니다. 사용자 지정이 완료되면 새 helper 를 해당 buildershandler 클래스에 전달할 수 있습니다. 예:

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();
    }
}
Copy