포스트그레SQL 19, 관계형 DB에 '그래프 질의' 담는다...한 개발자가 새 기능 직접 써 보고 해설...데이터 옮기지 않고 기존 표를 점·선으로 다뤄, "한 표가 점이면서 동시에 선일 수 있다"
관계형 데이터베이스가 그래프 질문에 답하기 시작한다.
[한국정보기술신문] 관계형 데이터베이스의 대표 격인 포스트그레SQL(PostgreSQL)의 다음 버전에 '그래프 질의' 기능이 들어온다. 데이터 인프라 분야에서 일하는 개발자 리마스 실카이티스는 지난 7월 5일 자신의 블로그에 올린 글에서, 올 하반기 정식 공개를 앞둔 포스트그레SQL 19의 새 기능 '프로퍼티 그래프(Property Graph)'를 직접 써 본 경험을 정리해 소개했다. 프로퍼티 그래프란 이미 표(테이블)에 담겨 있는 데이터를 점과 선으로 이뤄진 '그래프'처럼 다룰 수 있게 해 주는 기능으로, 별도의 그래프 전용 데이터베이스를 새로 들이지 않고도 데이터 사이의 관계를 따라가는 질의를 던질 수 있게 한다.
관계형 데이터베이스란 데이터를 여러 개의 표로 나눠 저장하고, 표와 표를 서로 연결해 관리하는 방식의 데이터베이스를 말한다. 반면 그래프 데이터베이스는 데이터를 점(정점)과 그 점들을 잇는 선(간선)의 그물망 형태로 저장한다. 사람 사이의 친구 관계, 상품 사이의 함께 구매 관계처럼 '무엇이 무엇과 이어져 있는가'를 다루는 데 강점이 있다. 그동안 이런 그래프식 질문에 답하려면 관계형 데이터베이스와 별개로 그래프 전용 데이터베이스를 따로 두는 경우가 많았는데, 이번 기능은 그럴 필요를 상당 부분 덜어 준다는 것이 실카이티스의 설명이다.

표로 쌓인 데이터는 이미 하나의 '그래프'
실카이티스는 논의의 출발점으로 "잘 정리된 표 구조는 그 자체로 이미 그래프"라는 점을 든다. 일반적인 데이터베이스에는 운전자·제조사·경기장처럼 개별 대상을 담은 표가 있고, 경기 결과나 예선 기록처럼 사건을 담은 표가 있다. 이들 표는 '외래키'로 서로 이어져 있다. 외래키란 한 표의 행이 다른 표의 특정 행을 가리키도록 연결해 주는 열을 말한다. 예컨대 경기 결과를 담은 행에는 운전자 번호, 경기 번호, 소속팀 번호가 들어 있고, 각각은 다른 표의 한 행을 가리키는 이정표 노릇을 한다.
이렇게 보면 표의 각 행은 그래프의 점이 되고, 외래키 하나하나는 점과 점을 잇는 선이 된다. "이 결과의 소속팀을 알려 달라"는 물음은 사실 그래프를 따라가는 탐색이며, 관계형 데이터베이스에서는 이를 두 표를 이어 붙이는 '조인(JOIN)' 질의로 풀어 왔다. 조인이란 서로 다른 표를 공통된 값을 기준으로 연결해 하나의 결과로 묶는 작업을 말한다. 실카이티스는 이번 기능이 데이터에 없던 그래프 구조를 새로 만들어 내는 것이 아니라, 조인을 일일이 적지 않고도 '그래프식 질문'을 던질 수 있게 해 주는 문법일 뿐이라고 짚었다.
데이터는 그대로 둔 채 '그래프처럼' 묻는다
프로퍼티 그래프는 이미 있는 표 위에 '어느 표를 점으로 보고, 어느 표를 선으로 볼지'를 선언하는 방식으로 만들어진다. 중요한 점은 이 선언이 데이터를 전혀 옮기지 않는다는 것이다. 행은 원래의 표에 그대로 남아 있고, 새로운 저장 공간이나 사본을 만들지도 않는다. 그래서 이 기능은 데이터를 복제하는 것이 아니라, 기존 데이터를 그래프로 '읽는 방법'을 덧씌운 얇은 겉면에 가깝다. 여러 자료는 이를 표 위에 씌운 읽기 전용 뷰(view)에 빗대는데, 뷰란 실제 데이터를 새로 저장하지 않고 기존 표를 특정한 관점으로 보여 주기만 하는 가상의 표를 말한다.
이렇게 정의한 그래프에는 전용 질의문으로 물음을 던진다. 질의는 마치 문장을 읽듯 '한 운전자가 어떤 결과를 통해 어떤 경기와 이어져 있는가' 하는 식으로 관계의 모양을 그려 넣으면 된다. 그래프를 이루는 요소는 오직 점과 선 두 가지뿐이며, 점과 선에 붙는 이름표나 속성 값은 그 두 가지에 딸린 부가 정보일 뿐 별도의 제3의 요소가 아니다.
주목할 대목은 이 그래프 질의가 내부적으로는 결국 조인으로 바뀌어 실행된다는 점이다. 실카이티스가 실제 실행 계획을 들여다보니, 그래프 형태로 적은 질의가 손으로 직접 쓴 조인과 똑같은 형태로 변환돼 있었다. 그래프 질의를 위한 별도의 실행 장치가 새로 붙는 것이 아니라, 포스트그레SQL이 원래 쓰던 최적화 기술과 인덱스, 통계를 그대로 활용한다는 뜻이다. 인덱스란 데이터를 빠르게 찾기 위해 미리 만들어 두는 색인이다. 그는 이 때문에 그래프 질의가 느리다면 그 이유도, 해결하는 방법도 일반 조인이 느릴 때와 똑같다고 설명했다.
어느 표가 점이고, 어느 표가 선인가
실카이티스가 가장 공을 들인 대목은 '이미 가진 표들을 어떻게 점과 선으로 나눌 것인가' 하는 문제다. 그는 이를 세 가지 경우로 나눠 설명한다. 첫째, 운전자표나 경기장표처럼 개별 대상을 담은 표는 자연스럽게 점이 된다. 각 행이 고유한 이름과 속성을 가진 하나의 대상이기 때문이다. 둘째, 학생과 강의를 잇는 수강표처럼 두 대상을 연결하는 것이 유일한 역할인 '중간 다리' 표는 그대로 선이 된다. 그 표의 각 행 자체가 곧 관계를 나타내기 때문이다.
문제는 셋째, 여러 대상을 동시에 가리키면서 자기만의 데이터도 지닌 '사건' 표다. 경기 결과표가 그 예로, 한 행이 운전자·경기·소속팀 세 가지를 한꺼번에 가리키는 데다 출발 순위·최종 순위·점수 같은 고유한 값도 함께 담고 있다. 그런데 이번 기능에서 선은 반드시 출발점 하나와 도착점 하나만 잇는 이음새로 정의된다. 세 곳을 가리키는 결과 행은 선 하나로 담기 어렵고, 담더라도 점수 같은 고유 데이터를 걸어 둘 자리가 마땅치 않다. 그래서 이런 사건 표는 점으로 삼는 편이 낫다. 결과 자체를 하나의 점(중심축)으로 두고, 그 결과에서 운전자·경기·소속팀으로 뻗어 나가는 얇은 선들을 따로 두는 식이다. 실카이티스는 결국 판단은 하나의 물음으로 좁혀진다고 정리했다. 관계 그 자체가 관심사라면 선이고, 그 행이 지닌 사건 자체가 관심사라면 점이라는 것이다.
"한 표가 점이면서 동시에 선일 수 있다"
이번 탐색에서 그가 얻은 가장 큰 배움은, 하나의 표가 같은 그래프 안에서 점이면서 동시에 선일 수 있다는 사실이다. 그는 처음에 표마다 점이나 선 어느 한쪽을 골라야 한다고 여겼지만, 실제로는 '점이냐 선이냐'의 구분이 표 자체가 아니라 그래프를 이루는 각 요소에 적용된다는 점을 확인했다. 같은 표를 서로 다른 이름으로 두 번 선언하면, 한 번은 점으로 또 한 번은 선으로 쓸 수 있다는 것이다.
이 방식을 쓰면 결과표는 결과라는 점이 되는 동시에, 자기 자신이 이미 지닌 열들을 이용해 운전자·경기로 향하는 선의 출발점도 될 수 있다. 별도의 연결용 표를 만들어 저장할 필요 없이, 같은 표에 이름만 여러 개 붙여 쓰는 셈이다. 실카이티스는 이 사례가 표는 본래 점도 선도 아니며, 단지 행의 묶음일 뿐이라는 사실을 잘 보여 준다고 평가했다. 그것을 점으로 읽을지 선으로 읽을지, 아니면 둘 다로 읽을지는 그래프마다 사용자가 정하기 나름이라는 것이다. 그는 이 점에서 관계형 모델과 그래프 모델이 사실은 같은 것의 두 얼굴이라고 봤다.
잘 맞는 물음과 안 맞는 물음
실카이티스는 이 기능이 특정한 모양의 질문에 강하다고 짚었다. 'X와 이런 형태로 이어진 것들을 찾아 달라'처럼, 찾으려는 관계의 모양이 미리 정해져 있는 경우다. 이를테면 한 운전자가 어떤 팀들에서 뛰었는지, 같은 경기에 함께 나선 경쟁자가 누구인지, 특정 조건을 만족하는 결과만 골라내는 물음 등이 여기에 해당한다. 손으로 조인을 여러 번 겹쳐 써야 하는 복잡한 물음도 그래프 질의로는 문장 한 줄처럼 읽기 쉽게 표현된다는 것이 그의 설명이다.
반면 관계의 모양 자체를 모를 때는 힘을 잃는다. 두 대상 사이의 최단 경로를 찾거나, 몇 단계 안에 닿을 수 있는 모든 대상을 훑는 물음이 그렇다. 이런 물음은 선을 몇 번이고 되풀이해 따라가는 '가변 길이 탐색'을 필요로 하는데, 포스트그레SQL 19의 첫 구현에는 이 기능이 빠져 있다. 이 경우에는 그래프 문법 대신, 스스로를 반복해 불러 가며 표를 파고드는 '재귀 질의' 방식으로 돌아가야 한다. 데이터의 중요도를 매기는 순위 계산이나 무리 짓기 같은 그래프 전용 알고리즘도 이번 기능이 다루는 영역이 아니다.
베타 거쳐 하반기 정식 공개 예정
포스트그레SQL 19의 프로퍼티 그래프 기능은 국제 표준화 기구가 정한 SQL 표준(SQL:2023)의 한 부분인 'SQL/PGQ'를 구현한 것이다. 이 표준은 관계형 데이터베이스를 벗어나거나 데이터를 복제하지 않고도 그래프 질의를 표준 방식으로 표현하도록 하는 것을 목표로 한다. 특정 회사의 그래프 데이터베이스가 저마다 다른 질의 언어를 쓰는 것과 달리, 표준을 따르면 여러 데이터베이스에서 같은 질의를 쓸 수 있다는 장점이 있다.
포스트그레SQL 19는 지난 6월 4일 첫 시험판(베타 1)이 공개됐으며, 정식판은 올 9월경 나올 것으로 예상된다. 그래프 질의 기능은 피터 아이젠트라우트와 아슈토시 바팟 등이 주도해 수년간 개발해 온 것으로 전해졌다. 다만 개발진과 여러 자료는 이번 첫 구현이 고정된 길이의 관계 탐색에 초점을 맞추고 있어, 앞서 언급된 가변 길이 탐색이나 최단 경로 같은 무거운 작업은 여전히 전용 그래프 데이터베이스가 더 나을 수 있다고 본다.
한국정보기술신문 정보기술분과 전호재 기자 news@kitpa.org











