Java 클라이언트
프로토콜을 통해 데이터베이스 서버와 통신하는 Java 클라이언트 라이브러리입니다. 현재 구현은 HTTP 인터페이스만 지원합니다. 이 라이브러리는 서버에 요청을 전송하기 위한 자체 API를 제공합니다. 또한 다양한 바이너리 데이터 형식(RowBinary* 및 Native*)을 처리할 수 있는 도구도 제공합니다.
설정
- Maven Central (프로젝트 웹 페이지): https://mvnrepository.com/artifact/com.clickhouse/client-v2
- Nightly 빌드(저장소 링크): https://central.sonatype.com/repository/maven-snapshots/
- 이전 Nightly 빌드용 Artifactory(저장소 링크): https://s01.oss.sonatype.org/content/repositories/snapshots/
- Maven
- Gradle (Kotlin)
- Gradle
초기화
Client 객체는 com.clickhouse.client.api.Client.Builder#build()에 의해 초기화됩니다. 각 클라이언트는 고유한 컨텍스트를 가지며 객체는 클라이언트 간에 공유되지 않습니다.
Builder는 편리한 설정을 위한 구성 메서드를 제공합니다.
예시:
Client는 AutoCloseable이며 더 이상 필요하지 않을 때에는 닫아야 합니다.
인증
인증은 초기화 단계에서 클라이언트별로 구성됩니다. 지원되는 인증 방법은 세 가지입니다: 비밀번호, 액세스 토큰, SSL 클라이언트 인증서.
비밀번호 기반 인증을 사용하려면 setUsername(String) 및 setPassword(String)을 호출하여 사용자 이름과 비밀번호를 설정해야 합니다:
액세스 토큰 인증을 사용하려면 setAccessToken(String)을 호출하여 액세스 토큰을 설정해야 합니다:
SSL 클라이언트 인증서를 통한 인증을 사용하려면 setUsername(String), useSSLAuthentication(boolean), setClientCertificate(String), setClientKey(String) 메서드를 호출해 사용자 이름을 설정하고 SSL 인증을 활성화하며, 클라이언트 인증서와 클라이언트 키를 설정해야 합니다:
SSL 인증은 프로덕션 환경에서 문제 해결이 어려울 수 있습니다. 이는 SSL 라이브러리에서 발생하는 많은 오류가 충분한 정보를 제공하지 않기 때문입니다. 예를 들어, 클라이언트 인증서와 키가 일치하지 않으면 서버가 즉시 연결을 종료합니다(HTTP의 경우 HTTP 요청이 전송되기 전에 이루어지는 연결 초기화 단계에서 연결이 종료되므로 서버에서 어떤 응답도 보내지 않습니다).
인증서와 키를 검증하려면 openssl과 같은 도구를 사용하십시오:
- 키 무결성 확인:
openssl rsa -in [key-file.key] -check -noout - 클라이언트 인증서의 CN이 사용자와 일치하는지 확인하십시오:
- 사용자 인증서에서 CN을 가져옵니다 -
openssl x509 -noout -subject -in [user.cert] - 데이터베이스에 동일한 값이 설정되어 있는지 확인합니다:
select name, auth_type, auth_params from system.users where auth_type = 'ssl_certificate'(쿼리는auth_params를{"common_names":["some_user"]}와 같은 형태로 출력합니다)
- 사용자 인증서에서 CN을 가져옵니다 -
구성
모든 설정은 인스턴스 메서드(구성 메서드)로 정의되며, 각 값이 적용되는 범위와 컨텍스트를 명확히 합니다. 주요 구성 매개변수는 하나의 범위(클라이언트 또는 작업)에서 정의되며, 서로를 덮어쓰지 않습니다.
구성은 클라이언트 생성 시 정의됩니다. com.clickhouse.client.api.Client.Builder를 참조하세요.
클라이언트 구성
- 연결 및 엔드포인트
- 인증
- 타임아웃 및 재시도
- 소켓 옵션
- 압축
- SSL/보안
- 프록시
- HTTP 및 헤더
- 서버 설정
- 시간대
- 고급
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
addEndpoint(String endpoint) | endpoint - URL 형식의 서버 주소 | 사용 가능한 서버 목록에 서버 엔드포인트를 추가합니다. 현재는 하나의 엔드포인트만 지원됩니다. | none | none |
addEndpoint(Protocol protocol, String host, int port, boolean secure) | protocol - 연결 프로토콜host - IP 또는 호스트 이름secure - HTTPS 사용 | 사용 가능한 서버 목록에 서버 엔드포인트를 추가합니다. 현재는 하나의 엔드포인트만 지원됩니다. | none | none |
enableConnectionPool(boolean enable) | enable - 활성/비활성 플래그 | 커넥션 풀 사용 여부를 설정합니다. | true | connection_pool_enabled |
setMaxConnections(int maxConnections) | maxConnections - 커넥션 개수 | 클라이언트가 각 서버 엔드포인트에 대해 열 수 있는 최대 커넥션 수를 설정합니다. | 10 | max_open_connections |
setConnectionTTL(long timeout, ChronoUnit unit) | timeout - 타임아웃 값unit - 시간 단위 | 지정된 시간 이후 연결을 비활성 상태로 간주할 TTL을 설정합니다. | -1 | connection_ttl |
setKeepAliveTimeout(long timeout, ChronoUnit unit) | timeout - 타임아웃 값unit - 시간 단위 | HTTP 커넥션 Keep-Alive 타임아웃을 설정합니다. Keep-Alive를 비활성화하려면 0으로 설정합니다. | - | http_keep_alive_timeout |
setConnectionReuseStrategy(ConnectionReuseStrategy strategy) | strategy - LIFO 또는 FIFO | 커넥션 풀에서 사용할 커넥션 재사용 전략을 선택합니다. | FIFO | connection_reuse_strategy |
setDefaultDatabase(String database) | database - 데이터베이스 이름 | 기본 데이터베이스를 설정합니다. | default | database |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
setUsername(String username) | username - username for authentication | 이후 구성에서 선택되는 인증 방법에 사용할 사용자 이름을 설정합니다. | default | user |
setPassword(String password) | password - secret value | 비밀번호 인증에 사용할 비밀값을 설정하고, 해당 인증 방법을 실질적으로 선택합니다. | - | password |
setAccessToken(String accessToken) | accessToken - access token string | 인증에 사용할 액세스 토큰을 설정하며, 이에 해당하는 인증 방법을 선택합니다. | - | access_token |
useSSLAuthentication(boolean useSSLAuthentication) | useSSLAuthentication - flag to enable SSL auth | SSL 클라이언트 인증서를 인증 방법으로 설정합니다. | - | ssl_authentication |
useHTTPBasicAuth(boolean useBasicAuth) | useBasicAuth - flag to enable/disable | 사용자-비밀번호 인증에 기본 HTTP 인증을 사용할지 여부를 설정합니다. 특수 문자가 포함된 비밀번호로 인한 문제를 방지합니다. | true | http_use_basic_auth |
useBearerTokenAuth(String bearerToken) | bearerToken - an encoded bearer token | Bearer 토큰 인증 사용 여부와 사용할 토큰을 지정합니다. 토큰은 있는 그대로 전송됩니다. | - | bearer_token |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
setConnectTimeout(long timeout, ChronoUnit unit) | timeout - 타임아웃 값unit - 시간 단위 | 모든 아웃바운드 연결에 대해 연결을 시작할 때의 타임아웃을 설정합니다. | - | connection_timeout |
setConnectionRequestTimeout(long timeout, ChronoUnit unit) | timeout - 타임아웃 값unit - 시간 단위 | 연결 요청 타임아웃을 설정합니다. 이 값은 커넥션 풀에서 연결을 가져올 때에만 적용됩니다. | 10000 | connection_request_timeout |
setSocketTimeout(long timeout, ChronoUnit unit) | timeout - 타임아웃 값unit - 시간 단위 | 읽기 및 쓰기 작업에 영향을 주는 소켓 타임아웃을 설정합니다 | 0 | socket_timeout |
setExecutionTimeout(long timeout, ChronoUnit timeUnit) | timeout - 타임아웃 값timeUnit - 시간 단위 | 쿼리의 최대 실행 타임아웃을 설정합니다 | 0 | max_execution_time |
retryOnFailures(ClientFaultCause ...causes) | causes - ClientFaultCause의 enum 상수 | 복구 가능하거나 재시도 가능한 오류 유형을 설정합니다. | NoHttpResponse ConnectTimeout ConnectionRequestTimeout | client_retry_on_failures |
setMaxRetries(int maxRetries) | maxRetries - 재시도 횟수 | retryOnFailures로 정의된 오류에 대해 허용되는 최대 재시도 횟수를 설정합니다. | 3 | retry |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
setSocketRcvbuf(long size) | size - 바이트 단위의 크기 | TCP 소켓 수신 버퍼를 설정합니다. 이 버퍼는 JVM 힙 메모리 외부에 있습니다. | 8196 | socket_rcvbuf |
setSocketSndbuf(long size) | size - 바이트 단위의 크기 | TCP 소켓 송신 버퍼를 설정합니다. 이 버퍼는 JVM 힙 메모리 외부에 있습니다. | 8196 | socket_sndbuf |
setSocketKeepAlive(boolean value) | value - 활성/비활성 플래그 | 모든 TCP 소켓에 대해 SO_KEEPALIVE 옵션을 설정합니다. TCP Keep Alive는 연결의 생존 여부를 확인하는 메커니즘을 활성화합니다. | - | socket_keepalive |
setSocketTcpNodelay(boolean value) | value - 활성/비활성 플래그 | 모든 TCP 소켓에 대해 SO_NODELAY 옵션을 설정합니다. 이 TCP 옵션은 소켓이 가능한 한 빨리 데이터를 전송하도록 합니다. | - | socket_tcp_nodelay |
setSocketLinger(int secondsToWait) | secondsToWait - 초 단위 대기 시간 | 클라이언트가 생성하는 모든 TCP 소켓의 linger 시간을 설정합니다. | - | socket_linger |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
compressServerResponse(boolean enabled) | enabled - 활성/비활성 플래그 | 서버가 응답을 압축할지 여부를 설정합니다. | true | compress |
compressClientRequest(boolean enabled) | enabled - 활성/비활성 플래그 | 클라이언트가 요청을 압축할지 여부를 설정합니다. | false | decompress |
useHttpCompression(boolean enabled) | enabled - 활성/비활성 플래그 | 해당 옵션이 활성화된 경우 클라이언트/서버 통신에 HTTP 압축을 사용할지 여부를 설정합니다. | - | - |
appCompressedData(boolean enabled) | enabled - 활성/비활성 플래그 | 압축을 애플리케이션에서 처리함을 클라이언트에 알립니다. | false | app_compressed_data |
setLZ4UncompressedBufferSize(int size) | size - 바이트 단위 크기 | 비압축 데이터 스트림의 일부를 수신할 버퍼의 크기를 설정합니다. | 65536 | compression.lz4.uncompressed_buffer_size |
disableNativeCompression | disable - 비활성화 플래그 | 기본(native) 압축을 비활성화합니다. true로 설정하면 기본 압축이 비활성화됩니다. | false | disable_native_compression |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
setSSLTrustStore(String path) | path - 로컬 시스템의 파일 경로 | 클라이언트가 서버 호스트 검증을 위해 SSL truststore를 사용하도록 설정합니다. | - | trust_store |
setSSLTrustStorePassword(String password) | password - 비밀값 | setSSLTrustStore로 지정한 SSL truststore의 잠금을 해제하는 데 사용할 비밀번호를 설정합니다. | - | key_store_password |
setSSLTrustStoreType(String type) | type - truststore 유형 이름 | setSSLTrustStore로 지정한 truststore의 유형을 설정합니다. | - | key_store_type |
setRootCertificate(String path) | path - 로컬 시스템의 파일 경로 | 클라이언트가 서버 호스트 검증을 위해 지정된 루트(CA) 인증서를 사용하도록 설정합니다. | - | sslrootcert |
setClientCertificate(String path) | path - 로컬 시스템의 파일 경로 | SSL 연결을 초기화하고 SSL 인증에 사용할 클라이언트 인증서 경로를 설정합니다. | - | sslcert |
setClientKey(String path) | path - 로컬 시스템의 파일 경로 | 서버와의 SSL 통신을 암호화하는 데 사용할 클라이언트 개인 키를 설정합니다. | - | ssl_key |
sslSocketSNI(String sni) | sni - 서버 이름 문자열 | SSL/TLS 연결에서 SNI(Server Name Indication)에 사용할 서버 이름을 설정합니다. | - | ssl_socket_sni |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
addProxy(ProxyType type, String host, int port) | type - 프록시 유형host - 프록시 호스트 이름 또는 IPport - 프록시 포트 | 서버와 통신할 때 사용할 프록시를 설정합니다. | - | proxy_type, proxy_host, proxy_port |
setProxyCredentials(String user, String pass) | user - 프록시 사용자 이름pass - 비밀번호 | 프록시 인증에 사용할 사용자 인증 정보를 설정합니다. | - | proxy_user, proxy_password |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
setHttpCookiesEnabled(boolean enabled) | enabled - 활성화/비활성화 플래그 | HTTP 쿠키를 저장하고 서버로 다시 전송할지 여부를 설정합니다. | - | - |
httpHeader(String key, String value) | key - HTTP 헤더 키value - 문자열 값 | 단일 HTTP 헤더의 값을 설정합니다. 이전 값은 덮어씁니다. | none | none |
httpHeader(String key, Collection values) | key - HTTP 헤더 키values - 문자열 값 목록 | 단일 HTTP 헤더의 여러 값을 설정합니다. 이전 값은 덮어씁니다. | none | none |
httpHeaders(Map headers) | headers - HTTP 헤더가 담긴 맵 | 여러 HTTP 헤더 값을 한 번에 설정합니다. | none | none |
useHttpFormDataForQuery(boolean enable) | enable - 활성화/비활성화 플래그 | 쿼리 파라미터를 URL 대신 요청 본문의 HTTP 폼 데이터로 전송할지 여부를 설정합니다. 서버 측 압축이 활성화된 경우에만 동작합니다. 클라이언트 수준 압축이 활성화된 경우, 각 파라미터가 multipart 콘텐츠로 전송되므로 파라미터가 있는 쿼리 요청에 대해서는 클라이언트 수준 압축이 비활성화됩니다. | false | client.http.use_form_request_for_query |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
serverSetting(String name, String value) | name - 설정 이름value - 설정 값 | 각 쿼리 실행 시 서버로 함께 전달할 설정을 지정합니다. 개별 작업 설정이 이를 재정의할 수 있습니다. 설정 목록 | none | none |
serverSetting(String name, Collection values) | name - 설정 이름values - 설정 값들 | 여러 값을 서버로 전달할 설정을 지정합니다. 예를 들어 roles와 같이 사용할 수 있습니다. | none | none |
setOption("custom_settings_prefix", value) | value - 접두어 문자열 | 서버로 전달되는 사용자 정의 설정에 사용할 접두어를 설정합니다. 서버 구성과 일치해야 합니다. ClickHouse 문서를 참조하십시오. | custom_ | custom_settings_prefix |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
useServerTimeZone(boolean useServerTimeZone) | useServerTimeZone - flag to enable/disable | DateTime 및 Date 컬럼 값을 디코딩할 때 클라이언트가 서버 타임존을 사용할지 설정합니다. | true | use_server_time_zone |
useTimeZone(String timeZone) | timeZone - java valid timezone ID | DateTime 및 Date 컬럼 값을 디코딩할 때 지정된 타임존을 사용할지 설정합니다. 서버 타임존 설정을 재정의합니다. | - | use_time_zone |
setServerTimeZone(String timeZone) | timeZone - java valid timezone ID | 서버 측 타임존을 설정합니다. 기본적으로 UTC 타임존이 사용됩니다. | UTC | server_time_zone |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
setOption(String key, String value) | key - 구성 옵션 키value - 옵션 값 | 클라이언트 옵션의 원시 값을 설정합니다. 속성 파일에서 구성을 읽어올 때 유용합니다. | - | - |
useAsyncRequests(boolean async) | async - 활성화/비활성화 플래그 | 클라이언트가 요청을 별도의 스레드에서 실행할지 여부를 설정합니다. 애플리케이션이 멀티 스레드 작업을 더 잘 구성할 수 있으므로 기본적으로 비활성화되어 있습니다. | false | async |
setSharedOperationExecutor(ExecutorService executorService) | executorService - ExecutorService 인스턴스 | 작업을 위한 ExecutorService를 설정합니다. | none | none |
setQueryIdGenerator(Supplier<String> supplier) | supplier - 쿼리 ID를 생성하는 Supplier<String> 구현체 | 작업 설정(InsertSettings, QuerySettings)에 쿼리 ID가 지정되지 않은 경우 사용될 사용자 정의 쿼리 ID 생성기를 설정합니다. | - | - |
setClientNetworkBufferSize(int size) | size - 바이트 단위 크기 | 소켓과 애플리케이션 사이에서 데이터를 복사하는 데 사용되는 애플리케이션 메모리 공간 내 버퍼의 크기를 설정합니다. | 300000 | client_network_buffer_size |
allowBinaryReaderToReuseBuffers(boolean reuse) | reuse - 활성화/비활성화 플래그 | 활성화된 경우 리더가 숫자 변환(transcoding)을 위해 미리 할당된 버퍼를 재사용합니다. 숫자 데이터에 대한 GC 부하를 줄여 줍니다. | - | - |
columnToMethodMatchingStrategy(ColumnToMethodMatchingStrategy strategy) | strategy - 매칭 전략 구현체 | DTO를 등록할 때 DTO 클래스 필드와 DB 컬럼을 매칭하기 위해 사용할 사용자 정의 전략을 설정합니다. | none | none |
setClientName(String clientName) | clientName - 애플리케이션 이름 문자열 | 호출하는 애플리케이션에 대한 추가 정보를 설정합니다. User-Agent 헤더로 전달됩니다. | - | client_name |
registerClientMetrics(Object registry, String name) | registry - Micrometer registry 인스턴스name - 메트릭 그룹 이름 | Micrometer(https://micrometer.io/) registry 인스턴스에 센서를 등록합니다. | - | - |
setServerVersion(String version) | version - 서버 버전 문자열 | 버전 자동 감지가 수행되지 않도록 서버 버전을 설정합니다. | - | server_version |
typeHintMapping(Map typeHintMapping) | typeHintMapping - 타입 힌트 맵 | ClickHouse 타입에 대한 타입 힌트 매핑을 설정합니다. 예를 들어, 다차원 배열이 Java 컨테이너로 표현되도록 할 수 있습니다. | - | type_hint_mapping |
클라이언트 식별
쿼리 로그에는 요청을 보낸 애플리케이션을 식별하는 두 가지 필드가 있습니다: client_name과 http_user_agent입니다. 네이티브 TCP 프로토콜은 애플리케이션을 식별하기 위해 client_name을 사용하고, HTTP 프로토콜은 http_user_agent를 사용합니다. 클라이언트 빌더에는 두 프로토콜 모두에 대해 올바른 값을 설정하는 setClientName 메서드가 있습니다.
http_user_agent 필드는 User-Agent 헤더의 공통 형식에 따라 설정됩니다: application-name[/version] [(operating-system; architecture; ...)].
이 값들의 집합은 각 계층(애플리케이션, 클라이언트 라이브러리, HTTP 클라이언트 라이브러리)마다 반복됩니다. setClientName 메서드로 설정한 값이 목록에서 가장 먼저 나타납니다.
예를 들어:
다음과 같은 http_user_agent 값이 설정됩니다:
애플리케이션은 자신을 식별하기 위해 HTTP 헤더 User-Agent를 직접 설정할 수 있습니다. 단, clickhouse-java-v2/0.9.6-SNAPSHOT 부분이 헤더 끝에 자동으로 추가됩니다.
작업 식별
쿼리 로그에는 작업을 식별하고 쿼리 로그에 추가 정보를 기록하는 데 사용할 수 있는 query_id 및 log_comment라는 두 개의 필드가 추가로 있습니다.
query_id는 작업의 고유 식별자입니다. 애플리케이션에서 QuerySettings 클래스의 setQueryId 메서드를 호출하여 설정할 수 있습니다.
log_comment은 쿼리 로그에 추가할 수 있는 주석입니다. 애플리케이션에서 QuerySettings 클래스의 logComment 메서드를 호출하여 설정할 수 있습니다.
서버 설정
서버 측 설정은 클라이언트 생성 시 한 번 클라이언트 수준에서 설정할 수 있으며(Builder의 serverSetting 메서드 참조), 작업 수준에서도 설정할 수 있습니다(작업 설정 클래스의 serverSetting 메서드 참조).
⚠️ setOption 메서드(Client.Builder 또는 작업 설정 클래스)를 통해 옵션을 설정하는 경우, 서버 설정 이름 앞에 clickhouse_setting_ 접두사를 붙여야 합니다. 이때 com.clickhouse.client.api.ClientConfigProperties#serverSetting() 메서드를 사용하면 편리합니다.
커스텀 HTTP 헤더
커스텀 HTTP 헤더는 모든 작업(클라이언트 수준)에 대해 또는 단일 작업(작업 수준)에 대해 설정할 수 있습니다.
setOption 메서드(Client.Builder 또는 작업 설정 클래스)를 통해 옵션을 설정하는 경우 사용자 정의 헤더 이름에는 http_header_접두사를 붙여야 합니다. 이 경우com.clickhouse.client.api.ClientConfigProperties#httpHeader()` 메서드가 유용할 수 있습니다.
공통 정의
ClickHouseFormat
지원되는 형식을 나타내는 열거형(Enum)입니다. ClickHouse가 지원하는 모든 형식을 포함합니다.
raw- 원시 데이터는 사용자가 직접 트랜스코딩해야 합니다full- 클라이언트가 데이터를 자체적으로 트랜스코딩할 수 있으며, 원시 데이터 스트림을 그대로 받아들입니다-- 이 형식에서는 ClickHouse가 해당 연산을 지원하지 않습니다
이 클라이언트 버전에서 지원하는 형식은 다음과 같습니다:
Insert API
insert(String tableName, InputStream data, ClickHouseFormat format)
지정된 형식으로 인코딩된 바이트를 담은 InputStream으로 데이터를 입력받습니다. data는 지정된 format으로 인코딩되어 있어야 합니다.
시그니처
매개변수
tableName - 대상 테이블 이름.
data - 인코딩된 데이터가 담긴 입력 스트림입니다.
format - 데이터가 인코딩된 형식입니다.
settings - 요청 설정입니다.
반환값
InsertResponse 타입의 Future로, 작업 결과와 서버 측 메트릭과 같은 추가 정보를 반환합니다.
예제
insert(String tableName, List<?> data, InsertSettings settings)
데이터베이스에 쓰기 요청을 보냅니다. 객체 목록은 효율적인 형식으로 변환된 후 서버로 전송됩니다. 목록 항목의 클래스는 register(Class, TableSchema) 메서드를 사용해 미리 등록해야 합니다.
시그니처
파라미터
tableName - 대상 테이블의 이름입니다.
data - DTO(Data Transfer Object) 객체 컬렉션입니다.
settings - 요청 설정입니다.
반환값
InsertResponse 타입의 Future — 작업 결과와 서버 측 메트릭과 같은 추가 정보를 포함합니다.
예시
InsertSettings
삽입 작업에 대한 구성 옵션입니다.
구성 방법
| 메서드 | 설명 |
|---|---|
setQueryId(String queryId) | 작업에 할당될 쿼리 ID를 설정합니다. 기본값은 null입니다. |
setDeduplicationToken(String token) | 중복 제거 토큰을 설정합니다. 이 토큰은 서버로 전송되어 쿼리를 식별하는 데 사용할 수 있습니다. 기본값은 null입니다. |
setInputStreamCopyBufferSize(int size) | 복사용 버퍼 크기입니다. 이 버퍼는 쓰기 작업 동안 사용자 제공 입력 스트림에서 출력 스트림으로 데이터를 복사하는 데 사용됩니다. 기본값: 8196. |
serverSetting(String name, String value) | 개별 작업에 대한 서버 설정을 지정합니다. |
serverSetting(String name, Collection values) | 단일 작업에 대해 여러 값을 사용하는 개별 서버 설정을 지정합니다. 컬렉션의 각 항목은 String 값이어야 합니다. |
setDBRoles(Collection dbRoles) | 작업을 실행하기 전에 적용할 DB 역할을 설정합니다. 컬렉션의 항목은 String 값이어야 합니다. |
setOption(String option, Object value) | 원시(raw) 형식으로 구성 옵션을 설정합니다. 서버 설정은 아닙니다. |
InsertResponse
삽입 작업 결과를 담는 응답 객체입니다. 클라이언트가 서버로부터 응답을 받은 경우에만 사용할 수 있습니다.
이전 응답의 모든 데이터를 끝까지 읽기 전에는 이 연결을 재사용할 수 없으므로, 연결을 해제하려면 이 객체를 가능한 한 빨리 닫아야 합니다.
| 메서드 | 설명 |
|---|---|
OperationMetrics getMetrics() | 작업 메트릭 객체를 반환합니다. |
String getQueryId() | 애플리케이션이(작업 설정 또는 서버를 통해) 작업에 할당한 쿼리 ID를 반환합니다. |
쿼리 API
query(String sqlQuery)
sqlQuery를 있는 그대로 전송합니다. 응답 형식은 쿼리 설정에 의해 지정됩니다. QueryResponse는 해당 형식을 지원하는 리더가 소비해야 하는 응답 스트림에 대한 참조를 유지합니다.
시그니처
파라미터
sqlQuery - 단일 SQL 문입니다. 쿼리는 있는 그대로 서버로 전송됩니다.
settings - 요청 설정입니다.
반환값
QueryResponse 타입의 Future로, 결과 데이터셋과 서버 측 메트릭과 같은 추가 정보를 포함합니다. 데이터셋을 모두 읽은 후 Response 객체를 닫아야 합니다.
예시
query(String sqlQuery, Map<String, Object> queryParams, QuerySettings settings)
sqlQuery를 그대로 전송합니다. 또한 서버가 SQL 표현식을 컴파일할 수 있도록 쿼리 매개변수도 함께 전송합니다.
시그니처
매개변수
sqlQuery - {} 플레이스홀더를 포함하는 SQL 표현식입니다.
queryParams - 서버 측에서 SQL 표현식을 완성하는 데 사용하는 변수 맵입니다.
settings - 요청 설정입니다.
반환값
QueryResponse 타입의 Future로, 결과 데이터셋과 서버 측 메트릭과 같은 추가 정보를 포함합니다. 데이터셋을 모두 소비한 후 Response 객체를 닫아야 합니다.
예시
queryAll(String sqlQuery)
RowBinaryWithNamesAndTypes 형식의 데이터를 조회합니다. 결과는 컬렉션으로 반환됩니다. 읽기 성능은 리더를 사용할 때와 동일하지만, 전체 결과 집합을 메모리에 유지해야 하므로 더 많은 메모리가 필요합니다.
시그니처
매개변수
sqlQuery - 서버에서 데이터를 조회하기 위한 SQL 표현식입니다.
반환값
결과 데이터를 행 형식으로 접근할 수 있도록 하는 GenericRecord 객체들의 목록으로 표현된 전체 데이터셋입니다.
예시
QuerySettings
쿼리 작업에 대한 구성 옵션입니다.
구성 방법
| 메서드 | 설명 |
|---|---|
setQueryId(String queryId) | 작업에 할당할 쿼리 ID를 설정합니다. |
setFormat(ClickHouseFormat format) | 응답 형식을 설정합니다. 사용 가능한 전체 형식 목록은 RowBinaryWithNamesAndTypes를 참조하십시오. |
setMaxExecutionTime(Integer maxExecutionTime) | 서버에서의 작업 최대 실행 시간을 설정합니다. 읽기 타임아웃에는 영향을 주지 않습니다. |
waitEndOfQuery(Boolean waitEndOfQuery) | 응답을 전송하기 전에 쿼리가 끝날 때까지 대기하도록 서버에 요청합니다. |
setUseServerTimeZone(Boolean useServerTimeZone) | 연산 결과의 날짜/시간 타입을 파싱할 때 서버 시간대(클라이언트 설정 참조)가 사용됩니다. 기본값은 false입니다. |
setUseTimeZone(String timeZone) | 시간 변환에 timeZone을 사용하도록 서버에 요청합니다. session_timezone을(를) 참조하십시오. |
serverSetting(String name, String value) | 작업에 대해 개별 서버 설정을 지정합니다. |
serverSetting(String name, Collection values) | 단일 작업에서 여러 값을 갖는 개별 서버 설정을 지정합니다. 컬렉션의 각 항목은 String 값이어야 합니다. |
setDBRoles(Collection dbRoles) | 작업 실행 전에 설정할 DB 역할을 지정합니다. 컬렉션의 항목은 String 값이어야 합니다. |
setOption(String option, Object value) | 구성 옵션을 원시(raw) 형식으로 설정합니다. 서버 설정이 아닙니다. |
QueryResponse
쿼리 실행 결과를 담고 있는 응답 객체입니다. 클라이언트가 서버로부터 응답을 받은 경우에만 사용 가능합니다.
이전 응답의 모든 데이터를 완전히 읽기 전까지는 연결을 재사용할 수 없으므로, 연결을 반환하려면 이 객체를 가능한 한 빨리 닫아야 합니다.
| Method | Description |
|---|---|
ClickHouseFormat getFormat() | 응답 데이터가 어떤 형식으로 인코딩되어 있는지 반환합니다. |
InputStream getInputStream() | 지정된 형식으로 인코딩된, 압축되지 않은 데이터 바이트 스트림을 반환합니다. |
OperationMetrics getMetrics() | 작업 메트릭을 포함하는 객체를 반환합니다. |
String getQueryId() | 애플리케이션이 작업에 할당한 쿼리 ID를 반환합니다(작업 설정 또는 서버를 통해 설정됨). |
TimeZone getTimeZone() | 응답의 Date/DateTime 타입을 처리할 때 사용할 시간대를 반환합니다. |
예시
공통 API
getTableSchema(String table)
table에 대한 테이블 스키마를 가져옵니다.
시그니처
파라미터
table - 스키마 데이터를 조회할 테이블 이름입니다.
database - 대상 테이블이 정의된 데이터베이스.
반환값
테이블의 컬럼 목록이 포함된 TableSchema 객체를 반환합니다.
getTableSchemaFromQuery(String sql)
SQL 문에서 스키마를 가져옵니다.
시그니처
파라미터
sql - 스키마를 반환하는 "SELECT" SQL 문입니다.
반환값
sql 표현식과 일치하는 컬럼들로 구성된 TableSchema 객체를 반환합니다.
TableSchema
register(Class<?> clazz, TableSchema schema)
Java 클래스가 schema를 사용하여 데이터를 쓰고 읽을 수 있도록 직렬화 및 역직렬화 레이어를 컴파일합니다. 이 메서드는 getter/setter 쌍과 해당 컬럼에 대한 직렬화기 및 역직렬화기를 생성합니다.
컬럼 매칭은 메서드 이름에서 컬럼 이름을 추출하여 수행됩니다. 예를 들어, getFirstName은 first_name 또는 firstname 컬럼에 대응됩니다.
시그니처
파라미터
clazz - 데이터를 읽고 쓰는 데 사용되는 POJO를 나타내는 클래스입니다.
schema - POJO 속성과 매칭하는 데 사용할 데이터 스키마입니다.
예시
사용 예제
전체 예제 코드는 저장소의 'example` 폴더에 저장되어 있습니다:
- client-v2 - 주요 예제 모음입니다.
- demo-service - Spring Boot 애플리케이션에서 클라이언트를 사용하는 예제입니다.
- demo-kotlin-service - Ktor(Kotlin) 애플리케이션에서 클라이언트를 사용하는 방법을 보여주는 예제입니다.
데이터 읽기
데이터를 읽는 대표적인 방법은 두 가지입니다:
query()메서드는 데이터가 들어 있는InputStream을 포함한 저수준의QueryResponse객체를 반환합니다. 일반적으로 스트리밍 읽기를 위해ClickHouseBinaryFormatReader와 함께 사용되지만 다른 사용자 정의 리더 구현과 함께 사용할 수도 있습니다.QueryResponse는 결과 집합의 메타데이터와 메트릭에 대한 접근도 제공합니다.queryAll()메서드와GenericRecord를 사용하면 행 단위로 데이터에 편리하게 접근할 수 있습니다. 이 경우 결과 집합 전체가 메모리에 로드됩니다.queryRecords()메서드는com.clickhouse.client.api.query.Records를 반환하며, 이는GenericRecord객체에 대한 이터레이터입니다. 이 메서드는 데이터를 메모리에 적재하지 않는 스트리밍 방식을 사용하며, 데이터에는GenericRecord를 통해 접근합니다.
참고: 스트리밍 방식은 데이터를 네트워크 스트림에서 직접 읽기 때문에 읽기 속도가 충분히 빠르지 않으면 서버 쓰기 타임아웃이 발생할 수 있습니다.
배열 읽기
ClickHouseBinaryFormatReader 메서드
getList(...)- 임의의Array(...)를List<T>형태로 읽습니다. 유연한 타입 읽기에 적합한 기본 옵션입니다. 중첩 배열을 지원합니다.getByteArray(...),getShortArray(...),getIntArray(...),getLongArray(...),getFloatArray(...),getDoubleArray(...),getBooleanArray(...)- 기본(primitive) 타입과 호환되는 값으로 이루어진 1차원 배열에 가장 적합합니다.getStringArray(...)-Array(String)(및 이름으로 표현되는 enum 값)을 위한 메서드입니다.getObjectArray(...)- 중첩 배열을 포함한 모든Array(...)요소 타입에 사용할 수 있는 범용 옵션입니다. 널 허용 값을 포함하는 배열과 중첩 배열을 읽을 때 사용합니다.
모든 메서드에는 인덱스 기반 및 이름 기반 오버로드가 제공됩니다. 인덱스는 1부터 시작합니다. 인덱스 기반 메서드는 열에 직접 접근합니다. 이름 기반 메서드는 매 호출마다 인덱스를 조회해야 합니다.
GenericRecord 메서드
getList(...)- 임의의Array(...)를List<T>형태로 읽습니다. 유연한 타입 읽기 작업에 적합한 기본 선택입니다. 중첩 배열을 지원합니다.getByteArray(...),getShortArray(...),getIntArray(...),getLongArray(...),getFloatArray(...),getDoubleArray(...),getBooleanArray(...)- 원시(primitive) 타입과 호환되는 값들로 구성된 1차원 배열에 가장 적합합니다.getStringArray(...)-Array(String)(및 이름으로 표현되는 enum 값)을 위한 메서드입니다.getObjectArray(...)- 중첩 배열을 포함한 모든Array(...)요소 타입에 사용할 수 있는 일반적인 옵션입니다. 널 허용 값이나 중첩 배열을 포함하는 배열을 읽는 데 사용합니다.
모든 메서드는 인덱스 기반 및 이름 기반 오버로드를 사용할 수 있습니다. 인덱스는 1부터 시작합니다. 인덱스 기반 방식은 컬럼에 직접 접근합니다. 이름 기반 메서드는 매번 인덱스를 조회해야 합니다.
V2 TSV 형식 데이터 삽입.
- 호출할 메서드는 하나뿐입니다. 별도의 요청 객체를 생성할 필요가 없습니다.
- 모든 데이터 복사가 완료되면 요청 본문(request body) 스트림이 자동으로 닫힙니다.
- 새로운 저수준 API인
com.clickhouse.client.api.Client#insert(java.lang.String, java.util.List<java.lang.String>, com.clickhouse.client.api.DataStreamWriter, com.clickhouse.data.ClickHouseFormat, com.clickhouse.client.api.insert.InsertSettings)를 사용할 수 있습니다.com.clickhouse.client.api.DataStreamWriter는 사용자 정의 데이터 쓰기 로직을 구현하도록 설계되었습니다. 예를 들어 큐에서 데이터를 읽어와 쓰는 로직을 구현할 때 사용할 수 있습니다.
데이터 읽기
- 데이터는 기본적으로
RowBinaryWithNamesAndTypes형식으로 읽어집니다. 현재 데이터 바인딩이 필요한 경우 이 형식만 지원됩니다. - 데이터는
List<GenericRecord> com.clickhouse.client.api.Client#queryAll(java.lang.String)메서드를 사용하여 레코드 컬렉션으로 읽을 수 있습니다. 이 메서드는 데이터를 메모리에 로드한 후 연결을 해제합니다. 추가 처리는 필요하지 않습니다.GenericRecord는 데이터에 접근할 수 있도록 하며, 일부 타입 변환 기능을 제공합니다.