Apache Arrow ADBC 24: 컬럼형 DB 연결 표준의 성숙과 드라이버 생태계 재편
요약
데이터 분석 워크로드에서 데이터베이스와 DataFrame 사이의 직렬화 병목은 오래된 문제다. JDBC·ODBC는 행 단위로 데이터를 전달해 Arrow 기반 분석 스택에 붙이면 반드시 행→열 변환 비용이 발생한다.
ADBC(Arrow Database Connectivity)는 이 변환을 없애기 위해 설계된 컬럼형 데이터베이스 연결 API다. 2026년 7월 28일 릴리스된 ADBC 24는 57개 이슈·142개 PR을 처리하며, Java 드라이버 예외 처리 개선, PostgreSQL 레이지 트랜잭션 지원, Python 패키지 재구성을 포함한다. 이번 릴리스에서는 DataFusion, BigQuery, Databricks, Snowflake 드라이버가 ADBC Driver Foundry로 이관되어 Apache Arrow 메인 저장소는 PostgreSQL, SQLite, Flight SQL 세 드라이버만 유지한다.
배경: JDBC·ODBC의 컬럼형 분석 워크로드 병목
행 기반 전송의 비용
JDBC와 ODBC는 행 단위로 데이터를 가져온다. 분석 쿼리가 수백만 행을 반환하면 드라이버 레이어에서 행→열 변환이 일어나고, 이 과정에서 불필요한 복사와 타입 변환 비용이 누적된다.
JDBC / ODBC 경로
DB → [행 버퍼] → [Java 객체 배열] → [열 변환] → DataFrame
↑ 직렬화 + GC 압박파이썬 생태계에서는 fetchall() 로 행 튜플을 받아 pandas에 넣는 패턴이 흔하다. 1천만 행 결과에서는 이 왕복 비용이 실질적인 지연으로 나타난다.
Arrow IPC와 제로카피
Apache Arrow는 메모리 내 컬럼형 포맷을 정의한다. 같은 포맷을 공유하는 프로세스 간에는 포인터만 전달하면 데이터를 복사하지 않아도 된다. 이 원리를 데이터베이스 연결에 적용한 것이 ADBC다.
ADBC 아키텍처
ADBC는 세 계층으로 구성된다.
1. ADBC API (공통 인터페이스)
언어별(Python, Java, Go, R, C) 공통 인터페이스를 정의한다. 핵심 메서드는 execute_query, execute_partitions, ingest 세 가지다.
execute_query: 쿼리 실행 후 Arrow RecordBatch 스트림 반환execute_partitions: 병렬 읽기를 위한 파티션 엔드포인트 반환ingest: Arrow 배치를 테이블에 벌크 삽입
2. ADBC 드라이버 (백엔드별 구현)
각 데이터베이스에 맞게 ADBC API를 구현한 드라이버다. Arrow 포맷을 직접 지원하는 서버에는 변환 없이 연결하고, 그렇지 않은 서버에는 드라이버 내부에서 변환을 처리한다.
3. C Data Interface (제로카피 경계)
언어 간 Arrow 버퍼를 공유하는 규격이다. C 구조체(ArrowArray, ArrowSchema)를 직접 전달해 Python ↔ C++ ↔ Java 사이에 복사 없이 Arrow 배치를 이동시킨다.
Python (pandas, Polars)
↕ C Data Interface (포인터)
ADBC 드라이버 (C/C++)
↕ Arrow IPC or Wire Protocol
데이터베이스 서버Arrow Flight SQL
Arrow Flight SQL은 Arrow Flight 위에 구현된 SQL 와이어 프로토콜이다. 서버가 Flight SQL을 지원하면 ADBC Flight SQL 드라이버가 클라이언트로 동작한다.
| 항목 | JDBC | ADBC + Flight SQL |
|---|---|---|
| 전송 단위 | 행 | Arrow RecordBatch |
| 직렬화 | 행 객체 → 바이트 | Arrow IPC (제로카피 가능) |
| 병렬 읽기 | 비표준 | execute_partitions 내장 |
| 트랜잭션 | JDBC 표준 | Flight SQL 액션 |
Flight SQL 서버 구현체로는 DuckDB, Ballista, Dremio 등이 있다.
아키텍처 다이어그램
ADBC 24 주요 변경사항
Driver Foundry 분리
가장 큰 구조적 변화다. DataFusion, BigQuery, Databricks, Snowflake 드라이버가 Apache Arrow 저장소에서 독립적인 ADBC Driver Foundry 저장소로 이관됐다.
이전까지는 Apache Arrow 프로젝트 내에 모든 드라이버가 함께 존재했다. 이 구조는 드라이버별 릴리스 속도 차이, 벤더별 클라우드 인증 의존성, Apache 정책 제약을 함께 감당해야 했다.
Driver Foundry 분리 이후 Apache Arrow는 PostgreSQL, SQLite, Flight SQL 세 드라이버만 유지하며 핵심 스펙과 ABI에 집중한다. 외부 드라이버는 ADBC 스펙을 구현하는 독립 프로젝트로 운영된다.
Java 드라이버 예외 처리 개선
AutoCloseable 구현에서 close() 메서드가 발생시키는 예외 타입을 Exception에서 좁은 타입으로 변경했다. Java try-with-resources 블록에서 Exception을 잡아야 했던 불편함이 해소된다.
// ADBC 24 이전: Exception 처리 필요
try (AdbcConnection conn = driver.open(options)) {
// ...
} catch (Exception e) { ... }
// ADBC 24 이후: 구체적 예외 타입
try (AdbcConnection conn = driver.open(options)) {
// ...
} catch (AdbcException e) { ... }PostgreSQL 레이지 트랜잭션
PostgreSQL 드라이버가 레이지 트랜잭션(lazy transaction) 시작을 지원한다. 기존에는 연결 시 즉시 트랜잭션이 시작되어, 읽기 전용 쿼리에서도 불필요한 트랜잭션 오버헤드가 발생했다. 레이지 모드에서는 실제 쓰기 연산이 등장할 때만 트랜잭션을 시작한다.
Python 패키지 재구성
adbc-driver-manager와 개별 드라이버 패키지의 의존성 구조가 정리됐다. ADBC 24에서 Driver Foundry 드라이버는 별도 PyPI 패키지로 배포된다.
# Arrow-유지 드라이버
pip install adbc-driver-postgresql
pip install adbc-driver-sqlite
pip install adbc-driver-flightsql
# Driver Foundry (별도 패키지)
pip install adbc-driver-datafusion # Foundry
pip install adbc-driver-bigquery # FoundryADBC vs JDBC·ODBC 성능 특성
행 기반 드라이버와의 차이를 이해하는 데 중요한 특성이 있다.
대량 읽기에서의 이점
열 단위로 결과를 전달하므로 분석 쿼리에서 역직렬화 비용이 낮다. PostgreSQL 드라이버 기준, COPY 프로토콜로 Arrow 배치를 직접 구성해 중간 행 객체를 생성하지 않는다.
스트리밍 결과
execute_query는 Arrow RecordBatch 스트림을 반환한다. 전체 결과를 메모리에 올리지 않고 배치 단위로 처리할 수 있다.
import adbc_driver_postgresql.dbapi as pg
with pg.connect("postgresql://...") as conn:
with conn.cursor() as cur:
cur.execute("SELECT * FROM large_table")
reader = cur.fetch_record_batch() # Arrow RecordBatchReader
for batch in reader:
# 배치 단위 처리: 복사 없이 Arrow 포맷 그대로
process(batch)단건 OLTP 쿼리
단건 INSERT/SELECT는 Arrow 배치 구성 오버헤드가 오히려 불리할 수 있다. ADBC는 대량 데이터 이동 워크로드에 적합하며, 세션 관리 위주의 OLTP 워크로드는 JDBC·ODBC가 여전히 효율적이다.
운영 관점
도입이 적합한 상황
- pandas, Polars, DuckDB 등 Arrow 기반 스택과 데이터베이스를 연결하는 경우
- 수백만 행 이상의 분석 쿼리 결과를 로컬로 내려받는 ETL·ELT 파이프라인
- Arrow Flight SQL을 지원하는 서버(DuckDB, Ballista, Dremio)를 클라이언트에서 접근하는 경우
- Python ↔ C++ ↔ Java 간 제로카피 데이터 교환이 필요한 경우
주의사항
Driver Foundry 전환: ADBC 24부터 BigQuery, Databricks, Snowflake 드라이버는 Apache Arrow 릴리스 주기를 따르지 않는다. 기존에 Arrow 릴리스를 기준으로 드라이버 버전을 관리했다면, Driver Foundry 저장소의 별도 릴리스 채널을 확인해야 한다.
ABI 안정성: C Data Interface는 안정적인 ABI를 제공하지만, ADBC 드라이버 ABI는 메이저 버전 간 호환이 보장되지 않는다. 드라이버와 드라이버 매니저의 버전을 일치시켜야 한다.
트랜잭션 시맨틱: ADBC의 트랜잭션 모델은 JDBC와 다르다. autocommit 기본값과 레이지 트랜잭션 동작을 각 드라이버 문서에서 확인한다.
정리
ADBC는 데이터베이스 연결의 단위를 행에서 Arrow RecordBatch로 바꾸는 것이 핵심이다. JDBC·ODBC가 행 직렬화로 비용을 지불하는 워크로드, 특히 분석 쿼리의 대량 결과를 Arrow 기반 도구로 가져오는 경로에서 의미 있는 차이를 만든다. ADBC 24의 Driver Foundry 분리는 생태계가 Apache Arrow 프로젝트 경계 밖으로 성장하는 신호로, 드라이버 선택과 버전 관리 전략이 이전보다 복잡해진다는 점을 인식해야 한다.
References
- Apache Arrow 블로그. "Apache Arrow ADBC 24 (Libraries) Release." July 28, 2026. https://arrow.apache.org/blog/2026/07/28/adbc-24-release/
- Apache Arrow 공식 문서. "ADBC: Arrow Database Connectivity." https://arrow.apache.org/adbc/
- Apache Arrow 공식 문서. "Arrow Flight SQL." https://arrow.apache.org/docs/format/FlightSql.html
- Apache Arrow 공식 문서. "C Data Interface." https://arrow.apache.org/docs/format/CDataInterface.html
- ADBC Driver Foundry GitHub. https://github.com/apache/arrow-adbc-driver-foundry