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이며 더 이상 필요하지 않을 경우 닫아야 합니다.
인증
인증은 초기화 단계에서 클라이언트별로 구성됩니다. 지원되는 인증 방법은 세 가지입니다: 비밀번호, 액세스 토큰(Access Token), SSL 클라이언트 인증서(SSL Client Certificate).
비밀번호 인증을 사용하려면 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 - 인증에 사용할 사용자 이름 | 추가 설정을 통해 선택되는 인증 방법에 사용할 사용자 이름을 설정합니다. | default | user |
setPassword(String password) | password - 비밀 값 | 비밀번호 인증에 사용할 비밀 값을 설정하고, 해당 인증 방법을 실질적으로 선택합니다. | - | password |
setAccessToken(String accessToken) | accessToken - 액세스 토큰 문자열 | 인증에 사용할 액세스 토큰을 설정하며, 이에 상응하는 인증 방법을 선택합니다. | - | access_token |
useSSLAuthentication(boolean useSSLAuthentication) | useSSLAuthentication - SSL 인증 사용 여부 플래그 | SSL 클라이언트 인증서를 인증 방법으로 설정합니다. | - | ssl_authentication |
useHTTPBasicAuth(boolean useBasicAuth) | useBasicAuth - 활성화/비활성화 플래그 | 사용자-비밀번호 인증에 기본 HTTP 인증을 사용할지 여부를 설정합니다. 특수 문자가 포함된 비밀번호로 인한 문제를 방지합니다. | true | http_use_basic_auth |
useBearerTokenAuth(String bearerToken) | bearerToken - 인코딩된 bearer 토큰 | 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 |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
serverSetting(String name, String value) | name - 설정 이름value - 설정 값 | 각 쿼리 실행 시 서버로 함께 전달할 설정을 지정합니다. 개별 작업 설정이 이를 재정의할 수 있습니다. 설정 목록 | none | none |
serverSetting(String name, Collection values) | name - 설정 이름values - 설정 값들 | 여러 값을 서버로 전달할 설정을 지정합니다. 예를 들어 roles와 같이 사용할 수 있습니다. | none | none |
| Method | Arguments | Description | Default | Key |
|---|---|---|---|---|
useServerTimeZone(boolean useServerTimeZone) | useServerTimeZone - 활성/비활성 플래그 | DateTime 및 Date 컬럼 값을 디코딩할 때 클라이언트가 서버 타임존을 사용할지 설정합니다. | true | use_server_time_zone |
useTimeZone(String timeZone) | timeZone - 유효한 Java 타임존 ID | DateTime 및 Date 컬럼 값을 디코딩할 때 지정된 타임존을 사용할지 설정합니다. 서버 타임존 설정을 재정의합니다. | - | use_time_zone |
setServerTimeZone(String timeZone) | timeZone - 유효한 Java 타임존 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 |
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 |
서버 설정
서버 측 설정은 클라이언트 생성 시 한 번 설정할 수 있으며(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) | 원시 형식으로 구성 옵션을 설정합니다. 서버 설정은 아닙니다. |
QueryResponse
쿼리 실행 결과를 담고 있는 응답 객체입니다. 클라이언트가 서버로부터 응답을 받은 경우에만 사용 가능합니다.
이전 응답의 모든 데이터를 완전히 읽기 전까지는 연결을 재사용할 수 없으므로, 연결을 해제하기 위해 이 객체를 가능한 한 빨리 닫으십시오.
| 메서드 | 설명 |
|---|---|
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) 애플리케이션에서 클라이언트 사용 방법을 보여주는 예제입니다.
마이그레이션 가이드
이전 클라이언트(V1)는 com.clickhouse.client.ClickHouseClient#builder를 시작점으로 사용했습니다. 새 클라이언트(V2)는 com.clickhouse.client.api.Client.Builder를 사용하여 유사한 패턴을 따릅니다. 주요 차이점은 다음과 같습니다:
- 구현을 로드하기 위해 서비스 로더를 사용하지 않습니다.
com.clickhouse.client.api.Client는 향후 모든 종류의 구현을 포괄하는 파사드 클래스입니다. - 구성 소스의 수가 줄었습니다. 하나는 빌더에 제공되고, 다른 하나는 동작 설정(
QuerySettings,InsertSettings)으로 제공됩니다. 이전 버전에서는 노드별로 구성이 있었고, 일부 경우에는 환경 변수를 로드하고 있었습니다.
구성 매개변수 일치 확인
V1에는 구성과 관련된 3개의 enum 클래스가 있습니다:
com.clickhouse.client.config.ClickHouseDefaults- 대부분의 사용 사례에서 설정하도록 되어 있는 구성 매개변수입니다. 예를 들어USER와PASSWORD등이 있습니다.com.clickhouse.client.config.ClickHouseClientOption- 클라이언트 전용 구성 매개변수입니다. 예를 들어HEALTH_CHECK_INTERVAL등이 있습니다.com.clickhouse.client.http.config.ClickHouseHttpOption- HTTP 인터페이스 전용 구성 매개변수입니다. 예:RECEIVE_QUERY_PROGRESS.
이들은 매개변수를 그룹화하고 명확하게 분리하도록 설계되었습니다. 그러나 일부 경우 혼란을 초래했습니다(com.clickhouse.client.config.ClickHouseDefaults#ASYNC와
com.clickhouse.client.config.ClickHouseClientOption#ASYNC 사이에 차이가 있습니까?). 새로운 V2 클라이언트는 com.clickhouse.client.api.Client.Builder를 모든 클라이언트 구성 옵션을 담은 단일 딕셔너리로 사용합니다. 모든 구성 매개변수 이름은
com.clickhouse.client.api.ClientConfigProperties에 나열되어 있습니다.
아래 표는 새 클라이언트에서 지원되는 이전 옵션과 새로운 의미를 보여줍니다.
범례: ✔ = 지원됨, ✗ = 지원되지 않음
- 연결 및 인증
- SSL 및 보안
- 소켓 옵션
- 압축
- 프록시
- 타임아웃 및 재시도
- 시간대
- 버퍼 및 성능
- 스레딩 및 비동기 처리
- HTTP 및 헤더
- 형식 및 쿼리
- 노드 디스커버리 및 로드 밸런싱
- 기타
| V1 설정 | V2 Builder 메서드 | 설명 |
|---|---|---|
ClickHouseDefaults#HOST | Client.Builder#addEndpoint | |
ClickHouseDefaults#PROTOCOL | ✗ | V2에서는 HTTP만 지원합니다 |
ClickHouseDefaults#DATABASEClickHouseClientOption#DATABASE | Client.Builder#setDefaultDatabase | |
ClickHouseDefaults#USER | Client.Builder#setUsername | |
ClickHouseDefaults#PASSWORD | Client.Builder#setPassword | |
ClickHouseClientOption#CONNECTION_TIMEOUT | Client.Builder#setConnectTimeout | |
ClickHouseClientOption#CONNECTION_TTL | Client.Builder#setConnectionTTL | |
ClickHouseHttpOption#MAX_OPEN_CONNECTIONS | Client.Builder#setMaxConnections | |
ClickHouseHttpOption#KEEP_ALIVEClickHouseHttpOption#KEEP_ALIVE_TIMEOUT | Client.Builder#setKeepAliveTimeout | |
ClickHouseHttpOption#CONNECTION_REUSE_STRATEGY | Client.Builder#setConnectionReuseStrategy | |
ClickHouseHttpOption#USE_BASIC_AUTHENTICATION | Client.Builder#useHTTPBasicAuth |
| V1 Configuration | V2 Builder Method | 설명 |
|---|---|---|
ClickHouseDefaults#SSL_CERTIFICATE_TYPE | ✗ | |
ClickHouseDefaults#SSL_KEY_ALGORITHM | ✗ | |
ClickHouseDefaults#SSL_PROTOCOL | ✗ | |
ClickHouseClientOption#SSL | ✗ | Client.Builder#addEndpoint를 참조하십시오 |
ClickHouseClientOption#SSL_MODE | ✗ | |
ClickHouseClientOption#SSL_ROOT_CERTIFICATE | Client.Builder#setRootCertificate | SSL 인증은 useSSLAuthentication으로 활성화해야 합니다 |
ClickHouseClientOption#SSL_CERTIFICATE | Client.Builder#setClientCertificate | |
ClickHouseClientOption#SSL_KEY | Client.Builder#setClientKey | |
ClickHouseClientOption#KEY_STORE_TYPE | Client.Builder#setSSLTrustStoreType | |
ClickHouseClientOption#TRUST_STORE | Client.Builder#setSSLTrustStore | |
ClickHouseClientOption#KEY_STORE_PASSWORD | Client.Builder#setSSLTrustStorePassword | |
ClickHouseClientOption#SSL_SOCKET_SNI | Client.Builder#sslSocketSNI | |
ClickHouseClientOption#CUSTOM_SOCKET_FACTORY | ✗ | |
ClickHouseClientOption#CUSTOM_SOCKET_FACTORY_OPTIONS | ✗ | SNI를 설정하려면 Client.Builder#sslSocketSNI를 참조하십시오 |
| V1 구성 | V2 Builder 메서드 | 설명 |
|---|---|---|
ClickHouseClientOption#SOCKET_TIMEOUT | Client.Builder#setSocketTimeout | |
ClickHouseClientOption#SOCKET_REUSEADDR | Client.Builder#setSocketReuseAddress | |
ClickHouseClientOption#SOCKET_KEEPALIVE | Client.Builder#setSocketKeepAlive | |
ClickHouseClientOption#SOCKET_LINGER | Client.Builder#setSocketLinger | |
ClickHouseClientOption#SOCKET_IP_TOS | ✗ | |
ClickHouseClientOption#SOCKET_TCP_NODELAY | Client.Builder#setSocketTcpNodelay | |
ClickHouseClientOption#SOCKET_RCVBUF | Client.Builder#setSocketRcvbuf | |
ClickHouseClientOption#SOCKET_SNDBUF | Client.Builder#setSocketSndbuf |
| V1 Configuration | V2 Builder Method | Comments |
|---|---|---|
ClickHouseClientOption#COMPRESS | Client.Builder#compressServerResponse | useHttpCompression도 함께 참조하십시오 |
ClickHouseClientOption#DECOMPRESS | Client.Builder#compressClientRequest | useHttpCompression도 함께 참조하십시오 |
ClickHouseClientOption#COMPRESS_ALGORITHM | ✗ | HTTP가 아닌 경우(non-http)는 LZ4 사용, HTTP는 Accept-Encoding 사용 |
ClickHouseClientOption#DECOMPRESS_ALGORITHM | ✗ | HTTP가 아닌 경우(non-http)는 LZ4 사용, HTTP는 Content-Encoding 사용 |
ClickHouseClientOption#COMPRESS_LEVEL | ✗ | |
ClickHouseClientOption#DECOMPRESS_LEVEL | ✗ |
| V1 설정 | V2 빌더 메서드 | 설명 |
|---|---|---|
ClickHouseClientOption#PROXY_TYPE | Client.Builder#addProxy | |
ClickHouseClientOption#PROXY_HOST | Client.Builder#addProxy | |
ClickHouseClientOption#PROXY_PORT | Client.Builder#addProxy | |
ClickHouseClientOption#PROXY_USERNAME | Client.Builder#setProxyCredentials | |
ClickHouseClientOption#PROXY_PASSWORD | Client.Builder#setProxyCredentials |
| V1 Configuration | V2 Builder Method | 비고 |
|---|---|---|
ClickHouseClientOption#MAX_EXECUTION_TIME | Client.Builder#setExecutionTimeout | |
ClickHouseClientOption#RETRY | Client.Builder#setMaxRetries | 또한 retryOnFailures를 참조하십시오 |
ClickHouseHttpOption#AHC_RETRY_ON_FAILURE | Client.Builder#retryOnFailures | |
ClickHouseClientOption#FAILOVER | ✗ | |
ClickHouseClientOption#REPEAT_ON_SESSION_LOCK | ✗ | |
ClickHouseClientOption#SESSION_ID | ✗ | |
ClickHouseClientOption#SESSION_CHECK | ✗ | |
ClickHouseClientOption#SESSION_TIMEOUT | ✗ |
| V1 구성 | V2 Builder 메서드 | 설명 |
|---|---|---|
ClickHouseDefaults#SERVER_TIME_ZONEClickHouseClientOption#SERVER_TIME_ZONE | Client.Builder#setServerTimeZone | |
ClickHouseClientOption#USE_SERVER_TIME_ZONE | Client.Builder#useServerTimeZone | |
ClickHouseClientOption#USE_SERVER_TIME_ZONE_FOR_DATES | ||
ClickHouseClientOption#USE_TIME_ZONE | Client.Builder#useTimeZone |
| V1 설정 | V2 빌더 메서드 | 비고 |
|---|---|---|
ClickHouseClientOption#BUFFER_SIZE | Client.Builder#setClientNetworkBufferSize | |
ClickHouseClientOption#BUFFER_QUEUE_VARIATION | ✗ | |
ClickHouseClientOption#READ_BUFFER_SIZE | ✗ | |
ClickHouseClientOption#WRITE_BUFFER_SIZE | ✗ | |
ClickHouseClientOption#REQUEST_CHUNK_SIZE | ✗ | |
ClickHouseClientOption#REQUEST_BUFFERING | ✗ | |
ClickHouseClientOption#RESPONSE_BUFFERING | ✗ | |
ClickHouseClientOption#MAX_BUFFER_SIZE | ✗ | |
ClickHouseClientOption#MAX_QUEUED_BUFFERS | ✗ | |
ClickHouseClientOption#MAX_QUEUED_REQUESTS | ✗ | |
ClickHouseClientOption#REUSE_VALUE_WRAPPER | ✗ |
| V1 Configuration | V2 Builder Method | 설명 |
|---|---|---|
ClickHouseDefaults#ASYNCClickHouseClientOption#ASYNC | Client.Builder#useAsyncRequests | |
ClickHouseDefaults#MAX_SCHEDULER_THREADS | ✗ | setSharedOperationExecutor를 참조하십시오 |
ClickHouseDefaults#MAX_THREADS | ✗ | setSharedOperationExecutor를 참조하십시오 |
ClickHouseDefaults#THREAD_KEEPALIVE_TIMEOUT | setSharedOperationExecutor를 참조하십시오 | |
ClickHouseClientOption#MAX_THREADS_PER_CLIENT | ✗ | |
ClickHouseClientOption#MAX_CORE_THREAD_TTL | ✗ |
| V1 설정 | V2 Builder 메서드 | 설명 |
|---|---|---|
ClickHouseHttpOption#CUSTOM_HEADERS | Client.Builder#httpHeaders | |
ClickHouseHttpOption#CUSTOM_PARAMS | ✗ | Client.Builder#serverSetting을 참조하십시오 |
ClickHouseClientOption#CLIENT_NAME | Client.Builder#setClientName | |
ClickHouseHttpOption#CONNECTION_PROVIDER | ✗ | |
ClickHouseHttpOption#DEFAULT_RESPONSE | ✗ | |
ClickHouseHttpOption#SEND_HTTP_CLIENT_ID | ✗ | |
ClickHouseHttpOption#AHC_VALIDATE_AFTER_INACTIVITY | ✗ | Apache Http Client를 사용할 때 항상 활성화됩니다 |
| V1 구성 | V2 Builder 메서드 | 설명 |
|---|---|---|
ClickHouseDefaults#FORMATClickHouseClientOption#FORMAT | ✗ | 연산 설정(QuerySettings 및 InsertSettings)으로 이동되었습니다 |
ClickHouseClientOption#QUERY_ID | ✗ | QuerySettings 및 InsertSettings를 참조하십시오 |
ClickHouseClientOption#LOG_LEADING_COMMENT | ✗ | QuerySettings#logComment 및 InsertSettings#logComment를 참조하십시오 |
ClickHouseClientOption#MAX_RESULT_ROWS | ✗ | 서버 측 설정입니다 |
ClickHouseClientOption#RESULT_OVERFLOW_MODE | ✗ | 서버 측 설정입니다 |
ClickHouseHttpOption#RECEIVE_QUERY_PROGRESS | ✗ | 서버 측 설정입니다 |
ClickHouseHttpOption#WAIT_END_OF_QUERY | ✗ | 서버 측 설정입니다 |
ClickHouseHttpOption#REMEMBER_LAST_SET_ROLES | Client#setDBRoles | 이제 런타임 설정입니다. 또한 QuerySettings#setDBRoles 및 InsertSettings#setDBRoles를 참조하십시오 |
| V1 설정 | V2 빌더 메서드 | 비고 |
|---|---|---|
ClickHouseClientOption#AUTO_DISCOVERY | ✗ | |
ClickHouseClientOption#LOAD_BALANCING_POLICY | ✗ | |
ClickHouseClientOption#LOAD_BALANCING_TAGS | ✗ | |
ClickHouseClientOption#HEALTH_CHECK_INTERVAL | ✗ | |
ClickHouseClientOption#HEALTH_CHECK_METHOD | ✗ | |
ClickHouseClientOption#NODE_DISCOVERY_INTERVAL | ✗ | |
ClickHouseClientOption#NODE_DISCOVERY_LIMIT | ✗ | |
ClickHouseClientOption#NODE_CHECK_INTERVAL | ✗ | |
ClickHouseClientOption#NODE_GROUP_SIZE | ✗ | |
ClickHouseClientOption#CHECK_ALL_NODES | ✗ |
| V1 구성 | V2 Builder 메서드 | 설명 |
|---|---|---|
ClickHouseDefaults#AUTO_SESSION | ✗ | 세션 지원은 추후 검토될 예정입니다 |
ClickHouseDefaults#BUFFERING | ✗ | |
ClickHouseDefaults#MAX_REQUESTS | ✗ | |
ClickHouseDefaults#ROUNDING_MODE | ||
ClickHouseDefaults#SERVER_VERSIONClickHouseClientOption#SERVER_VERSION | Client.Builder#setServerVersion | |
ClickHouseDefaults#SRV_RESOLVE | ✗ | |
ClickHouseClientOption#CUSTOM_SETTINGS | ||
ClickHouseClientOption#PRODUCT_NAME | ✗ | 클라이언트 이름을 사용합니다 |
ClickHouseClientOption#RENAME_RESPONSE_COLUMN | ✗ | |
ClickHouseClientOption#SERVER_REVISION | ✗ | |
ClickHouseClientOption#TRANSACTION_TIMEOUT | ✗ | |
ClickHouseClientOption#WIDEN_UNSIGNED_TYPES | ✗ | |
ClickHouseClientOption#USE_BINARY_STRING | ✗ | |
ClickHouseClientOption#USE_BLOCKING_QUEUE | ✗ | |
ClickHouseClientOption#USE_COMPILATION | ✗ | |
ClickHouseClientOption#USE_OBJECTS_IN_ARRAYS | ✗ | |
ClickHouseClientOption#MAX_MAPPER_CACHE | ✗ | |
ClickHouseClientOption#MEASURE_REQUEST_TIME | ✗ |
일반적인 차이점
- 클라이언트 V2는 이식성을 높이기 위해 전용 클래스 사용을 줄였습니다. 예를 들어, V2는 서버에 데이터를 쓸 때
java.io.InputStream의 모든 구현체와 함께 동작합니다. - Client V2의
async설정은 기본적으로off입니다. 이는 추가 스레드를 사용하지 않고 클라이언트에 대한 제어권을 애플리케이션이 더 많이 갖게 됨을 의미합니다. 대부분의 사용 사례에서는 이 설정을off로 두는 것이 좋습니다.async를 활성화하면 요청마다 별도의 스레드가 생성됩니다. 이는 애플리케이션이 제어하는 executor를 사용할 때만 의미가 있습니다 (com.clickhouse.client.api.Client.Builder#setSharedOperationExecutor참조).
데이터 쓰기
java.io.InputStream의 임의의 구현을 사용할 수 있습니다. V1com.clickhouse.data.ClickHouseInputStream도 지원되지만 사용을 권장하지 않습니다.- 입력 스트림의 끝이 감지되면 이에 맞게 처리합니다. 그에 앞서 요청의 출력 스트림을 닫아야 합니다.
V1 TSV 형식의 데이터를 삽입합니다.
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는 데이터에 대한 접근을 제공하며, 일부 변환 기능을 구현합니다.