아키텍처, 질의 실행 엔진, 인덱싱 능력, 저장 계층, 벡터화 실행 모델에 배울 것이 훨씬 많다.
제10장 10.2절에서 조금 건드렸을 뿐이라고 스스로 평한다. 소스 코드와 블로그 글, 영상, 문서에 탐색할 것이 더 있다.
앞의 열 장에는 목록이 백여 건 있었다. 이 장에는 목록도, 도판도, 표도 하나 없다. 대신 네 가지를 한다. 배운 것을 요약하고, 다가올 판본을 예고하고, 다루지 않은 영역을 밝히고, DuckDB와 함께하는 데이터 엔지니어링의 미래를 논한다. 기술서의 맺음말은 흔히 형식적으로 흐르는데, 이 장은 그렇지 않다. 무엇을 다루지 않았는지를 두 쪽에 걸쳐 적어두는 정직함이 있고, 끝에는 예측이 있다. 그 예측 가운데 몇은 이미 판명되었다.
저자들이 독자에게 인사하며 시작한다. 『DuckDB in Action』을 통과하는 우리의 여정에 동행해준 것에 감사한다. 그리고 바람을 적는다. 여러분이 DuckDB에 대해, 그리고 그것이 날마다의 데이터 엔지니어링 생활을 더 생산적이고 즐겁게 만드는 데 어떻게 쓰일 수 있는지에 대해 많이 배웠기를 바란다.
이어지는 문장에 이 책의 성격이 담겨 있다. DuckDB의 힘과 유용함에 대한 우리의 흥분과 열정을 나눌 수 있어 기쁘고, 여러분이 그것으로 데이터 엔지니어링 문제를 풀고 놀라운 데이터 제품을 짓도록 힘을 실어줄 수 있어 기쁘다. "흥분과 열정(excitement and passion)"이라는 낱말을 맺음말에 쓰는 기술서는 드물다. 그런데 열 장을 읽고 온 독자에게는 그 말이 과장으로 들리지 않는다. 875배와 1.76배를 하나하나 적어둔 사람들이 하는 말이기 때문이다.
이 절은 열 장을 다섯 문단으로 압축한다. 260쪽을 한 쪽으로 줄이는 일이니 무언가는 빠질 수밖에 없다. 아래 장치는 그 다섯 문단이 각각 어느 장을 가리키는지 짚어준다. 걸음을 따라 누르면 언급된 장에 불이 켜지고, 이미 켜진 것은 켜진 채로 남는다.
다섯 문단을 다 눌러보면 불이 켜지지 않는 장이 하나 남는다. 제7장 「DuckDB in the cloud with MotherDuck」이다. 원서 144–162쪽, 열아홉 쪽에 걸친 온전한 한 장이며, MotherDuck의 착상과 아키텍처, 하이브리드 실행, 데이터베이스 생성·관리·공유, 사용 최적화 요령을 다룬다.
그런데 11.1절의 다섯 문단에는 MotherDuck도 cloud도 한 번도 나오지 않는다. CLI와 파이썬 API, CSV·JSON·Parquet, 윈도 함수와 CTE, dbt·dltHub·Dagster, Streamlit과 Superset, 그리고 대용량 데이터셋이 모두 호명되는데 클라우드만 호명되지 않는다.
이것이 사소해 보이지 않는 까닭이 있다. 제7장은 이 책에서 유일하게 로컬을 벗어나는 장이고, 제8장의 마지막 절(8.4.5 MotherDuck으로 올리기)과 제9장의 접속 문자열, 제10장의 데이터 공유가 모두 그 장에 기대고 있다. 게다가 바로 다음 절인 11.2절이 "이것은 MotherDuck 서비스에도 확장될 것"이라고 적는다. MotherDuck을 잊은 것이 아니라, 책이 무엇을 가르쳤는지 헤아리는 자리에서만 빠진 것이다.
덧붙이면 이 책의 기술 편집자가 Jordan Tigani이고, 11.3절이 그의 글 「Perf is not Enough」를 인용하며, 제10장이 그의 다른 글 「Big Data is Dead」를 인용한다. 그가 MotherDuck을 이끄는 사람이라는 점을 생각하면, 회고에서 MotherDuck 장이 빠진 것은 계산된 겸양이라기보다 목차를 손에 두지 않고 회고를 쓴 흔적으로 읽힌다. 요약을 쓸 때는 목차를 펴놓고 하나씩 지워가는 편이 안전하다.
빠진 것을 짚었으니 담긴 것도 보아야 한다. 이 절이 열 장에서 건져 올린 표현들이 저자들이 무엇을 이 책의 성취로 여겼는지 알려준다.
COLUMNS 람다, EXCLUDE, REPLACE, GROUP BY ALL, 별칭 재참조가 모두 여기 들어간다.짧은 절이지만 이 책의 시간적 위치를 못 박는다. 이 책이 출간되면 여러분은 곧 첫 안정 판본을 손에 쥐게 될 것이다. DuckDB 1.0이다. 그리고 자기 작업의 토대를 밝힌다. 우리의 작업은 집필 시점의 최신 사전 배포 판본인 0.10.0에 기반한다. 그 판본의 목적이 모든 기능과 API와 형식을 안정화하고 1.0 판본과 호환되게 하는 것이라고 적는다.
호환성에 대한 약속도 구체적이다. 이 판본들은 데이터베이스 판본 형식 변경을 자동으로 처리하고 하위 호환되며, 부분적으로는 상위 호환까지 된다는 뜻이다. 그리고 한마디를 덧붙인다. 그것이 MotherDuck 서비스에도 확장될 것이다.
이 절을 읽고 나면 앞의 장들에서 스쳐 지나갔던 숫자들이 제자리를 찾는다. 제5장 5.5.2절이 "0.10.0 이전 판본에서는 SECRET 객체를 하나만 가질 수 있다"고 적었고, 제10장 10.4.5절의 사이드바가 "DuckDB 0.10.0부터 SUMMARIZE를 SELECT의 원천으로 쓸 수 있다"고 적었다. 이 책은 0.10.0이라는 한 지점에서 찍은 사진이다.
그래서 제10장 10.4.1절이 비밀 기능을 두고 "duckdb 버전 0.1.0부터 사용 가능"이라고 적은 것이 오기라는 판단도 이 절에서 더 분명해진다. 0.10.0이 집필 시점의 최신 판본인데 그보다 앞선 어떤 기능이 0.1.0에 있을 수는 없다. 소수점 자리 하나가 빠진 것이다.
이 예고는 실현되었다. DuckDB 1.0.0이 2024년 6월 3일에 배포되었고, 저자들이 약속한 저장 형식의 안정화와 하위 호환이 그 배포의 핵심 내용이었다. 책이 자기 출간 시점과 도구의 성년식을 나란히 맞춘 셈이니, 맺음말의 예고가 이렇게 정확히 맞아떨어지는 경우는 흔하지 않다.
다만 그 뒤로도 판본은 계속 올라갔다. 이 문서를 읽는 시점의 최신 판본과 이 책의 0.10.0 사이에는 적잖은 거리가 있을 것이므로, 구체적인 문법이나 함수 이름은 공식 문서로 확인하는 편이 안전하다. 이 책이 가르친 것 가운데 오래 남을 것은 개별 함수가 아니라 사고의 틀이다.
이 절이 이 장에서 가장 길고, 가장 값지다. 책의 폭이 넓었음에도 DuckDB의 방대한 생태계에서 모든 것을 다룰 수는 없었다. 그리고 무엇을 뺐는지를 이유와 함께 밝힌다. 이 책의 초점이 입문적이고 실용적인 안내서에 있으므로 DuckDB의 내부, 그것이 어떻게 구현되었고 겉으로 드러나지 않는 곳에서 어떻게 작동하는지는 다루지 않았다.
기술서에서 이 절이 드문 까닭은, 다루지 않은 것을 적는 일이 다룬 것을 적는 일보다 어렵기 때문이다. 무엇이 남았는지 알려면 영역 전체의 지도를 갖고 있어야 한다. 저자들은 여섯 갈래를 짚는다.
아키텍처, 질의 실행 엔진, 인덱싱 능력, 저장 계층, 벡터화 실행 모델에 배울 것이 훨씬 많다.
제10장 10.2절에서 조금 건드렸을 뿐이라고 스스로 평한다. 소스 코드와 블로그 글, 영상, 문서에 탐색할 것이 더 있다.
Hannes와 Mark가 여러 팟캐스트에서 인터뷰했고 거기서 DuckDB의 세부를 파고든다.
제1장이 "DuckDB는 2018년 Mark Raasveldt와 Hannes Mühleisen이 만들었다"고 소개해둔 그 두 사람이다.
책은 주로 CLI와 파이썬 API를 썼고 부록에서 자바 접근을 다룬다.
그러나 C, R, Rust, Go, 자바스크립트와 그 밖의 여러 언어를 위한 API도 있어 좋아하는 환경에서 쓸 수 있다.
저자들의 표현이 재미있다. "다행히 DuckDB는 기본 상태로도 정말 잘 작동하므로 성능을 걱정할 일이 드물다."
그래도 질의와 데이터를 최적화해 DuckDB를 최대한 활용할 방법이 여전히 많다.
확장은 C++와 Rust 양쪽으로 쓸 수 있다.
이미 유용한 확장이 많은데 그중 공간 인덱스(spatial)는 PostGIS와 비슷한 많은 능력을 갖추어 고급 지리공간 애플리케이션을 지을 수 있다.
DuckDB는 고전적 SQL 카탈로그에 부합하는 information schema를 제공하고, 현재 설정에 접근하고 그것을 바꾸는 여러 테이블 함수도 준다.
그리고 DuckDB Labs와 MotherDuck이 50곳이 넘는 파트너를 열거한다.
④번 갈래의 첫 문장이 "우리가 더 깊이 파고들지 않은 또 하나의 영역은 성능 최적화와 고려사항(performance optimizations and considerations)이다"다. 그런데 바로 앞 장의 제목이 「Performance considerations for large datasets」이고, 11.1절 자신이 "마지막 장에서 대용량 데이터셋 처리의 세부를 성능 고려사항을 포함해 살펴보았다"고 적었다.
"더 깊이(deeper)"라는 한정이 붙어 있으니 정면 모순은 아니다. 그러나 바로 전 장의 제목과 같은 낱말을 "다루지 않은 영역"의 이름으로 쓰는 것은 독자를 헷갈리게 한다. 실제로 뜻하는 바는 질의별 튜닝과 데이터 배치 최적화일 텐데, 제10장이 다룬 것은 계측과 관찰이었다. "측정하는 법은 가르쳤고 튜닝하는 법은 가르치지 않았다"고 갈라 적었다면 두 문장이 다투지 않았을 것이다.
②번 갈래가 "Hannes와 Mark"라고 성 없이 적는다. 제1장이 Mark Raasveldt와 Hannes Mühleisen을 창시자로 소개해두었으니 책 안에서 해소되는 지시이기는 하다.
그런데 이 책의 공저자 가운데 한 사람의 이름도 Mark(Needham)다. 260쪽 앞에서 한 번 나온 성을 기억하지 못하는 독자라면 저자가 자기 자신을 3인칭으로 가리키는 것으로 읽을 수 있다. 맺음말처럼 앞을 되짚는 자리에서는 성을 함께 적는 편이 안전하다.
가장 짧은 절이며 네 갈래로 나뉜다. 저자들이 DuckDB 문서를 시작하기 좋은 곳이라 부르며 매우 포괄적이고 DuckDB의 모든 면을 아주 자세히 다룬다고 평한다. MotherDuck 문서에 대해서도 같은 말을 한다.
DuckDB 문서와 MotherDuck 문서. 둘 다 포괄적이고 자세하다는 평을 받는다.
duckdb.org/docs
motherduck.com/docs
MotherDuck과 DuckDB 사람들 또는 개인들이 운영하는 유튜브 채널 몇 개가 있고, DuckDB와 MotherDuck에 대한 튜토리얼과 강연과 발표가 여럿 올라와 있다.
활발한 공동체에서 빠른 답을 얻고 싶다면 DuckDB 디스코드와 MotherDuck 커뮤니티 슬랙을 보라.
discord.duckdb.org
slack.motherduck.com
DuckDB에 기여하고 싶다면 깃허브에서 소스 코드를 찾을 수 있다. 거기서 버그와 기능 요청도 올릴 수 있다.
github.com/duckdb
네 갈래의 순서가 눈에 걸린다. 문서 → 영상 → 공동체 → 기여다. 읽는 사람에서 묻는 사람으로, 묻는 사람에서 고치는 사람으로 옮겨가는 배열이며, 오픈소스 도구를 배우는 통상의 경로를 그대로 따른다. 마지막 갈래에 버그와 기능 요청을 함께 적어둔 것도 눈여겨볼 만하다. 기여가 코드만이 아니라는 뜻이다.
저자들의 판단은 분명하다. DuckDB는 데이터 엔지니어링의 미래에서 두드러진 구실을 할 매우 유망한 기술이라고 생각한다. 그 근거로 다재다능함을 든다. 중간 규모 데이터셋의 로컬 분석에서부터 데이터가 사는 곳 가까이 클라우드에서 이루어지는 대규모 데이터 처리까지, 아주 다른 여러 상황에 쓸 수 있는 도구다. 제1장의 임베디드 데이터베이스가 제7장의 하이브리드 실행을 거쳐 제10장의 S3 질의에 이르렀던 그 궤적을 한 문장으로 되짚은 것이다.
이 절이 내놓는 예측은 넷이다. 근거의 성격이 서로 다르므로 갈라 읽을 만하다.
이 문단이 이 책 전체의 논지를 한자리에 모은다. 제10장이 「빅데이터는 죽었다」는 글을 각주로 달고 5,800만 게시물을 랩톱에서 다뤘고, 이 절이 그것을 비용과 복잡도의 문제로 번역한다. 그리고 "훨씬 적은 복잡도"라는 마지막 항목이 실은 가장 무거운 항목이다. 비용은 청구서에 찍히지만 복잡도는 사람의 시간으로 지불되기 때문이다.
네 번째 전망의 임베딩 벡터 저장과 인덱싱은 실제로 현실이 되었다. DuckDB에 벡터 유사도 검색 확장이 더해져 임베딩 컬럼에 인덱스를 걸고 근사 최근접 이웃을 찾을 수 있게 되었다. 저자들이 "지켜볼 만한 혁신 영역"이라 적은 것이 책이 나온 해에 이미 착수되어 있었던 셈이다.
같은 문단의 스트리밍 데이터 처리는 성격이 다르다. DuckDB의 실행 모델은 배치 처리에 최적화된 모설 파이프라인이며, 제8장 8.1절이 "이 장은 배치 처리를 다루는 파이프라인을 본다"고 스스로 범위를 그었다. 스트리밍은 예측이라기보다 구조적으로 어려운 방향에 대한 희망으로 읽는 편이 정확하다.
여기 적은 두 가지는 이 문서를 쓰는 시점의 이해이므로, 지금의 실제 지원 범위는 공식 문서로 확인해야 한다. 예측을 다루는 절이니 그 예측을 검증하는 일도 계속 갱신될 수밖에 없다.
마지막으로 저자들이 바라는 방향을 적는다. DuckDB 팀이 사용성에 초점을 두는 것을 생각하면, SQL과 데이터 처리를 더 유연하고 접근하기 쉽고 사용자 친화적으로 만드는 그들의 착상도 기대된다. 그리고 그 작업의 일부로 더 많은 조합 가능성(composability)—시스템의 모든 면을 질의하고 유연하게 결합할 수 있게 되는 것을 예상한다고 적는다.
이 조합 가능성이라는 낱말이 이 책을 통과해온 독자에게는 구체적으로 들린다. 테이블처럼 보이면 질의할 수 있다는 제6장의 원칙, SUMMARIZE를 SELECT의 원천으로 쓸 수 있게 된 제10장의 변화, 데이터프레임을 SQL의 FROM에 이름으로 적는 제9장의 왕복이 모두 그 방향의 사례였다. 더 많은 조합 가능성이란, 더 많은 것이 FROM 뒤에 올 수 있게 된다는 뜻이다.
이제 DuckDB와 함께 데이터 엔지니어링의 미래를 만들어갈 차례는 여러분이다!
저자들이 남긴 마지막 두 문장이다. 앞 문장은 공을 독자에게 넘기는 통상의 맺음이지만, 뒤 문장은 이 책에만 있는 인사다. 오리가 우는 소리에 행복하라는 말을 붙인 것이며, 열 장에 걸쳐 D 프롬프트를 마주해온 독자에게는 농담이라기보다 작별로 들린다.
Happy Quacking!
기술서의 맺음말은 대개 건너뛰어도 되는 지면이다. 그런데 이 장은 네 쪽에 세 가지를 남긴다.
첫째, 좌표다. 11.2절이 이 책이 0.10.0에서 찍은 사진임을 못 박아주므로, 앞의 열 장에서 마주친 판본 관련 서술을 어떻게 받아들일지 정할 수 있다. 제10장의 0.1.0이 오기라는 판단도 이 절 덕에 단단해진다.
둘째, 지도의 여백이다. 11.3절이 다루지 않은 여섯 갈래를 적어두므로 다음에 무엇을 읽어야 하는지가 정해진다. 내부 구조, 다른 언어의 API, 질의 튜닝, 확장 작성, 메타데이터 함수, 그리고 오십 곳이 넘는 파트너 생태계다. 모르는 것을 목록으로 받는 것은 아는 것을 목록으로 받는 것보다 유용하다.
셋째, 논거다. 11.5절의 롱테일 문단은 이 도구를 남에게 설명할 때 쓸 수 있는 가장 간결한 문장이다. 대부분의 사람에게 데이터는 페타바이트가 아니다.
그리고 이 장에도 어긋남이 있었다. 회고에서 제7장이 빠졌고, 바로 전 장의 제목과 같은 낱말이 "다루지 않은 영역"의 이름으로 쓰였고, 창시자의 이름이 성 없이 적혀 공저자와 헷갈릴 수 있다. 열 장을 정독해온 뒤라 이런 것들이 눈에 걸리는데, 그렇게 걸리는 것 자체가 이 책을 끝까지 읽었다는 표시이기도 하다.