SPI 개요

SPI 개요

Trino는 플러그인 아키텍처로 기능을 확장하고 다양한 데이터 소스·시스템과 통합해요. 플러그인은 서비스 프로바이더 인터페이스(SPI)가 정의한 인터페이스와 메서드를 구현해야 해요.

출처: 문서

본문

플러그인에 대한 일반 사용자 정보는 플러그인 문서에서 볼 수 있고, 각 플러그인에 대한 자세한 내용은 전용 페이지에 문서화돼 있어요.

이 섹션은 플러그인 개발을 자세히 다뤄요. 커스텀 플러그인을 만들면 다른 데이터 소스용 커넥터처럼 Trino에 추가 기능을 넣을 수 있어요.

코드 (Code)

SPI 소스는 Trino 소스 트리의 core/trino-spi 디렉터리에서 찾을 수 있어요.

플러그인 메타데이터 (Plugin metadata)

각 플러그인은 진입점을 식별하는데, 이는 Plugin 인터페이스의 구현이에요. 이 클래스 이름은 표준 Java ServiceLoader 인터페이스로 Trino에 제공돼요. 즉 클래스패스의 META-INF/services 디렉터리에 io.trino.spi.Plugin이라는 리소스 파일이 있어요. 이 파일의 내용은 플러그인 클래스 이름을 한 줄로 나열한 것이에요.

com.example.plugin.ExamplePlugin

Trino 소스 코드에 포함된 내장 플러그인의 경우, 플러그인의 pom.xml 파일에 다음 줄이 있으면 이 리소스 파일이 생성돼요.

<packaging>trino-plugin</packaging>

Plugin

Plugin 인터페이스는 Trino SPI를 이해하려는 개발자에게 좋은 출발점이에요. 여기에는 Plugin이 제공할 수 있는 다양한 클래스를 검색하는 접근 메서드가 들어 있어요. 예를 들어 getConnectorFactories() 메서드는 Trino가 카탈로그를 뒷받침할 커넥터 인스턴스를 만들 준비가 되면 ConnectorFactory를 검색하기 위해 호출하는 최상위 함수예요. Type, ParametricType, Function, SystemAccessControl, EventListenerFactory 객체에도 비슷한 메서드가 있어요.

Maven으로 플러그인 빌드하기 (Building plugins via Maven)

플러그인은 Trino의 SPI에 의존해요.

<dependency>
    <groupId>io.trino</groupId>
    <artifactId>trino-spi</artifactId>
    <scope>provided</scope>
</dependency>

플러그인은 Maven provided 스코프를 사용해요. Trino가 런타임에 SPI의 클래스를 제공하므로, 플러그인은 이를 플러그인 어셈블리에 포함하면 안 되기 때문이에요.

Slice와 Jackson 애노테이션을 포함한 몇 가지 다른 의존성도 Trino가 제공해요. 특히 Jackson은 커넥터 핸들 직렬화에 사용되므로 플러그인은 Trino가 제공하는 애노테이션 버전을 사용해야 해요.

그 외 모든 의존성은 플러그인이 자체 구현에 필요로 하는 것에 기반해요. 플러그인은 별도 클래스 로더에 로드되어 격리를 제공하고, Trino가 내부적으로 쓰는 라이브러리의 다른 버전을 쓸 수 있게 해줘요.

pom.xml 예시는 Trino 소스 트리의 plugin/trino-example-http 디렉터리의 예제 HTTP 커넥터를 참고하세요.

커스텀 플러그인 배포 (Deploying a custom plugin)

Trino 플러그인은 trino-maven-plugin이 제공하는 trino-plugin Maven 패키징 유형을 사용해야 해요. 플러그인을 빌드하면 필요한 서비스 디스크립터가 생성되고 Provisio를 호출해 target 디렉터리에 ZIP 파일을 만들어요. 이 파일은 플러그인 JAR과 모든 의존성을 JAR 파일로 포함하며, 플러그인 설치에 적합해요.

호환성 (Compatibility)

플러그인의 성공적인 다운로드·설치·사용은 플러그인과 대상 Trino 클러스터의 호환성에 달려 있어요. 플러그인 빌드와 배포에 같은 Trino 버전을 사용할 때만 완전한 호환성이 보장되므로, 같은 버전 사용을 권장해요.

예를 들어 Trino 470용으로 컴파일된 Trino 플러그인은 Trino 430이나 Trino 490 같은 이전·이후 버전에서 동작하지 않을 수 있어요. 이는 다른 프로젝트, 벤더, 또는 직접 개발한 플러그인을 설치할 때 특히 중요해요.

Trino 플러그인은 SPI를 구현하는데, 이 SPI는 Trino 릴리스마다 바뀔 수 있어요. 기본적으로 SPI 호환성에 대한 런타임 검사는 없으므로, 런타임 테스트로 호환성을 검증하는 것은 플러그인 작성자의 몫이에요.

플러그인의 소스 코드를 사용할 수 있다면 pom.xml을 조사해 Trino 버전을 확인할 수 있어요. 플러그인은 SPI에 의존성을 선언해야 하므로, version 태그에 지정된 Trino 릴리스와의 호환성을 확인할 수 있어요.

<dependency>
    <groupId>io.trino</groupId>
    <artifactId>trino-spi</artifactId>
    <version>470</version>
    <scope>provided</scope>
</dependency>

플러그인의 좋은 관행은 버전 값에 속성을 쓰는 거예요. 이 속성은 pom.xml의 다른 곳에서 선언돼요.

...
<dep.trino.version>470</dep.trino.version>
...
<dependency>
    <groupId>io.trino</groupId>
    <artifactId>trino-spi</artifactId>
    <version>${dep.trino.version}</version>
    <scope>provided</scope>
</dependency>

더 알아보기 (Learn more)

커넥터를 직접 만드는 방법은 커넥터 개발 문서와 예제들을 참고해 보세요.