SQL 쿼리 빌더는 데이터를 다루는 방식에 따라 크게 두 가지 유형으로 나뉩니다. 하나는 호출 순서대로 데이터 처리 단계를 연결하는 '데이터 지향(Data-Oriented)' 방식이고, 다른 하나는 WHERE, ORDER BY 같은 SQL 절(clause)을 채워나가는 '구문 지향(Syntax-Oriented)' 방식입니다. 이 두 유형은 같은 메서드를 사용하더라도 연산 순서를 바꾸면 결과가 달라질 수 있어, 개발자가 의도한 바를 정확히 구현하려면 각 빌더의 특성을 이해하는 것이 중요합니다.
데이터 지향 빌더인 FunSQL, EF/LINQ, dbplyr 등은 파이프라인(pipeline)처럼 데이터 처리 순서를 반영합니다. 예를 들어, 필터링(filtering) 전에 정렬(sorting)과 개수 제한(limiting)을 수행하면 '가장 나이 많은 환자 100명 중 남성'을 구하게 되어, '가장 나이 많은 남성 환자 100명'과는 다른 결과를 얻을 수 있습니다. 반면 Active Record나 Laravel 같은 구문 지향 빌더는 SQL 절에 해당하는 슬롯을 채우는 방식이므로, 호출 순서를 바꿔도 최종 SQL 구문이 같다면 결과도 동일합니다. 구문 지향 빌더는 구현이 쉽고 SQL의 모든 기능을 지원할 수 있다는 장점이 있지만, SQL 문법의 고정된 절 순서 같은 제약을 그대로 물려받아 복잡한 데이터 처리 파이프라인 구성이 어려울 수 있습니다.
데이터 지향 빌더는 파이프라인 노드 순서에 제약을 두지 않아 복잡성을 줄일 수 있으며, 필요한 경우 중첩 쿼리(nested query)를 자동으로 생성하여 SQL의 고정된 절 순서 문제를 해결합니다. 특히 FunSQL은 기존 쿼리 프레임워크를 변환하는 대신, SQL의 전체 표현력을 데이터 지향 인터페이스로 제공하도록 처음부터 설계되었습니다. 상관 서브쿼리(correlated subquery), 래터럴 조인(lateral join), 윈도 함수(window function), 재귀 쿼리(recursive query) 등 SQL의 폭넓은 기능을 조합 가능한 파이프라인 형태로 제공하여, 개발자가 더 직관적이고 효율적으로 복잡한 쿼리를 작성할 수 있도록 돕습니다. 이는 SQL의 오랜 문제점인 복잡하고 불명확한 문법을 개선하고, 더 일관되고 표현력 높은 쿼리 언어로 SQL을 대체할 잠재력을 보여줍니다.