00:00:00새로운 프로젝트를 시작할 때 데이터베이스가 필요하다면, 가장 먼저 떠오르는
00:00:03옵션은 무엇인가요? SQLite인가요? 아마 SQLite겠죠? 정말 훌륭하고 안정적인 데다
00:00:09설정도 필요 없는 업계 표준이니까요. 하지만 로컬 데이터가 무거워지고 쿼리가
00:00:14복잡해지면서, 단일 스레드 파일 잠금 엔진이 가진
00:00:20한계에 부딪히기 시작했습니다. 그런데 이제 이러한 문제를 해결하려는 새로운 강자가 나타났습니다.
00:00:25바로 'Stulab'입니다. Rust로만 작성된 데이터베이스 엔진으로, 최근에
00:00:31네이티브 Node.js 드라이버를 출시했는데 정말 놀라운 성능을 보여주고 있습니다.
00:00:36이 데이터베이스는 SQLite보다 138배나 빠릅니다. 그래서 이번 영상에서는
00:00:43Stulab의 내부 구조와 작동 원리를 살펴보고, 라이브 벤치마크 테스트를 통해
00:00:50정말로 주장만큼 강력한지 확인해 보겠습니다. 아주 재미있을 테니 바로 시작하죠. Stulab이란 정확히 무엇일까요?
00:01:00기본적으로 Stulab은 임베디드 OLAP, 즉 온라인 분석 처리 데이터베이스입니다.
00:01:06SQLite나 Postgres 같은 표준 데이터베이스에 익숙하시다면, 그것들은 보통
00:01:14이름 그대로 트랜잭션에 최적화된 OLTP, 즉 온라인 트랜잭션 처리 데이터베이스입니다.
00:01:20하지만 Stulab은 다릅니다. 분석 작업 부하를 위해 설계되었으며, 고속 데이터 처리에 중점을 두고
00:01:27Rust로 바닥부터 구축되었습니다. SQLite 파일의 휴대성을 갖추면서도
00:01:33DuckDB나 BigQuery 같은 강력한 분석 능력을 갖췄다고 생각하시면 됩니다. 하지만 가장 멋진 점은
00:01:39네이티브 Node 드라이버 덕분에 이제 Node.js에서도 사용할 수 있다는 것입니다.
00:01:45네이티브 드라이버라고 해서 일반적인 래퍼(wrapper)를 말하는 게 아닙니다. 보통 데이터베이스가
00:01:49Rust나 C++ 같은 다른 언어로 작성되면, Node.js 앱은 브릿지를 통해 통신해야 합니다.
00:01:56이는 종종 데이터를 JSON 등으로 변환하여 로컬 네트워크 소켓으로 보내고,
00:02:02반대편에서 다시 변환하는 과정을 의미합니다. 이를 직렬화 오버헤드라고 부르며
00:02:08성능을 크게 떨어뜨리는 요인이 됩니다. 하지만 Stulab Node는 다르게 작동합니다. 바로 NAPI-RS를 사용하는데,
00:02:15이는 Rust 엔진을 네이티브 바이너리로 컴파일하여 Node.js 프로세스에
00:02:21직접 로드할 수 있게 해주는 프레임워크입니다. 따라서 중간에 브릿지나 번역기가 필요 없습니다.
00:02:27쿼리를 보낼 때 Node.js와 Rust는 사실상 동일한 메모리 공간을 공유합니다. Stulab이
00:02:33압도적으로 빠른 데에는 세 가지 큰 이유가 있습니다. 첫째, MVCC(다중 버전 동시성 제어)를 사용합니다.
00:02:40단일 작성자가 데이터베이스 전체를 잠글 수 있는 SQLite와 달리, Stulab은 여러 명의
00:02:47판독자와 작성자가 동시에 작업할 수 있습니다. 둘째, 병렬 실행을 사용합니다. Stulab은
00:02:53Rayon이라는 스케줄러를 사용합니다. 대규모 쿼리를 실행할 때 단일 CPU 코어에 맡기는 대신,
00:03:00쿼리를 분해하여 장비의 모든 코어를 활용합니다. 셋째, 비용 기반
00:03:06최적화 도구를 사용합니다. SQL을 맹목적으로 실행하는 것이 아니라, 데이터를 분석하고
00:03:13다양한 경로의 비용을 추정하여 결과를 얻는 가장 빠른 방법을 선택합니다. 이것이 바로 Stulab이
00:03:19SQLite보다 훨씬 빠르다고 주장하는 이유입니다. 그럼 실제로 그런지 테스트해 봅시다.
00:03:25이 테스트를 위해 간단한 Node.js 프로젝트를 만들고 Stulab과
00:03:30SQLite를 모두 종속성으로 설치하겠습니다. Stulab이 정말 빛을 발하는 부분 중 하나는 count distinct입니다.
00:03:37그래서 정말 그런지 궁금하네요. 각 데이터베이스의 인메모리 버전을 실행하고
00:03:43간단한 판매(sales) 테이블을 생성하는 간단한 스크립트를 준비했습니다. 그런 다음 이 테이블에
00:03:4910,000행의 랜덤 판매 데이터를 채웁니다. 각 행은 ID가 0에서 1,000 사이인 사용자의 판매를 나타내며
00:03:56특정 카테고리를 가집니다. 두 데이터베이스에 데이터를 일괄 삽입한 다음,
00:04:03특정 카테고리의 특정 사용자가 수행한 판매의 고유 개수(distinct count)를 선택하는
00:04:10벤치마크를 실행하여 각 데이터베이스의 성능을 계산할 것입니다. 여기서 한 가지
00:04:16언급해야 할 점은, 현재 설치된 패키지가 제대로 작동하지 않아 좀 답답하다는 것입니다.
00:04:22지금 벤치마크 테스트를 실행하면 네이티브 바인딩이 누락되었다는 오류가 뜹니다.
00:04:28프로젝트 작성자가 바이너리를 추가하거나 패키지에 올바르게 연결하는 것을 잊은 게 분명합니다.
00:04:34그래서 제가 직접 소스에서 빌드해야 했습니다. 레포지토리를 클론하고 내부에서 빌드를 실행한 후,
00:04:39다시 제 벤치마크 프로젝트로 돌아와 소스 디렉토리를 종속성으로 연결했습니다.
00:04:44현재로서는 좀 번거로운 일이라, 향후 프로젝트 작성자들이 이 문제를 해결해 주길 바랍니다.
00:04:49어쨌든, 그렇게 하고 나서야 드디어 벤치마크를 실행할 수 있게 되었습니다. 그럼 시작해 보죠.
00:04:54보시는 것처럼 count distinct 작업은 Stulab에서 확실히 훨씬 빠르지만,
00:05:01광고만큼은 아닙니다. 4배 정도 빠르네요. 그럼 채우려는 데이터의 개수에
00:05:070을 하나 더 추가해서 1,000,000행으로 다시 테스트를 실행하면 어떨까요? 한번 해봅시다.
00:05:12백만 행에서도 Stulab은 138배가 아니라 6배 정도만 빠릅니다. 그럼에도 불구하고
00:05:20여전히 훌륭한 결과입니다. 여기까지가 count distinct 테스트였고요. 저는
00:05:26distinct + order by 작업을 테스트하기 위해 또 다른 벤치마크 테스트를 해보기로 했습니다.
00:05:33두 번째 테스트에서는 다양한 IP 주소와 상태 코드가 포함된 랜덤 로그를 수집한 다음,
00:05:39IP 주소와 상태 코드 쌍으로 고유한 로그를 찾고, IP는 오름차순,
00:05:47상태 코드는 내림차순으로 정렬했습니다. 테스트를 실행해 보니 Stulab이 여전히 SQLite보다
00:05:53성능이 좋지만, 14배가 아니라 1배에서 1.5배 정도 더 빠를 뿐입니다. 제 생각에
00:06:01여기에 나열된 수치들은 약간 부풀려진 것 같습니다. 하지만 보셨다시피 Stulab이 SQLite보다 빠른 것은 사실입니다.
00:06:08공정하게 말하자면, 원작자도 SQLite가 Stulab보다 더 나은 성능을 보이는 영역을 언급했습니다.
00:06:13대부분 단일 행 작업을 수행하는 상황들입니다. 즉, Stulab은
00:06:19분석적이고 복잡한 쿼리에 적합합니다. 그렇다면 Stulab이 SQLite 킬러일까요? 솔직히 아닙니다.
00:06:26두 데이터베이스는 용도가 완전히 다릅니다. SQLite는 여전히 트랜잭션을 위한 안정적인 도구이며,
00:06:32Stulab은 데이터 분석을 위한 고성능 레이싱 카라고 볼 수 있습니다. 하지만
00:06:38NAPI-RS를 통해 Node.js 프로젝트에 바로 적용할 수 있는 순수 Rust 분석 엔진이
00:06:45나왔다는 사실은 정말 멋진 일입니다. 프로젝트 소유자가 현재 NPM 패키지만 잘 수정해서
00:06:50소스에서 직접 빌드할 필요 없게 해주면 좋겠네요. 지금까지 Stulab에 대해 간단히 살펴보았습니다.
00:06:55여러분은 어떻게 생각하시나요? Stulab으로 전환할 만큼 성능 향상이 매력적인가요,
00:07:01아니면 여전히 신뢰할 수 있는 SQLite를 사용하실 건가요? 아래 댓글로 알려주세요. 여러분,
00:07:06이 영상이 유용했다면 영상 아래의 좋아요 버튼을 눌러서 표현해 주세요. 그리고
00:07:11저희 채널 구독도 잊지 마시고요. 지금까지 Better Stack의 Andris였고,
00:07:17다음 영상에서 뵙겠습니다.