배경 저는 java 기반 자체 프레임워크를 쓰는 회사에서 프레임워크 코어 개발자 역할 겸임으로 일하고 있습니다. 해당 프레임워크는 내부적으로 mybatis/ibatis 와 비슷한 xml 문법으로 쿼리를 작성하고 여느 SI 회사처럼 수천줄 이상의 긴 SQL에 대부분의 로직을 작성합니다. 개인프로젝트 할 때는 js 쪽을 자주 다루는데요, typescript에서 db를 다룰 때 제가 익숙한 방식으로 쿼리를 짤 방법이 마땅치 않더라고요. ORM 은 복잡한 쿼리를 다루기가 어려워서 쿼리 빌더를 찾아봤는데, 얘네들도 결국 CTE나 함수, 복잡한 조건이 들어가는 경우는 한번에 쿼리를 만들지 못하고 변수를 나눠서 만든 다음 합성해서 써야하는게 불편했습니다. 그래서 없으면 내가 만들어봐야지 하고 SQL을 그대로 쓸 수 있지만 raw driver를 직접 쓰진 않고, 업무에 꼭 필요한 dynamic SQL 기능은 mybatis 처럼 하나의 SQL statement 에 모두 코딩할 수 있는 라이브러리를 만들었습니다. 만들다보니 node 계열은 드라이버마다 인터페이스가 제각각이라, 어쩌다보니 드라이버 호출 인터페이스 추상화도 들어가고, java에서처럼 공통된 트랜잭션 관리가 없어서 트랜잭션 추상화도 들어갔습니다. 사용법 Tagged template 를 적극적으로 사용해서 기본적으로 모든 statement 를 Prepared Statement 로 처리합니다. 예시: const users = await db.all(sql.rows<UserRow>` SELECT id, name FROM users WHERE organization_id = ${organizationId} AND status = ${status} `); 일반적으로 ${value} 는 항상 bind parameter 로 처리되고, 각 드라이버별 placeholder는 자동으로 처리해줍니다. 만약 table 명을 동적으로 처리하고 싶다거나 fragment 를 사용하실 때를 위해서 sql.ident, sql.fragment, sql.list 같은 헬퍼도 미리 마련해두었습니다. Why SQL first? raw sql vs query builder vs orm 은 어디서나 논쟁이 되는 주제입니다. 레딧에서도 논의가 많은 주제고, go의 sqlc나 rust 의 sqlx를 추천하는 사람들을 많이 봤습니다. 어떤 게 무조건 정답이라고 하긴 어렵습니다. 각자의 장단점이 있으니까...
Show GN: SQLBraid - SQL을 그대로 쓰는 TypeScript 라이브러리
2 weeks ago
22
Related
Brut - Unix 도구를 위한 Brutal Router
17 minutes ago
0
Norm Macdonald 관련 게시물 때문에 2년간 55차례 스와팅을 당한 부부
39 minutes ago
0
ESP32-C3 광고 차단기
42 minutes ago
0
클래식 Commodore 64 키캡 사진으로 재현한 폰트
45 minutes ago
0
Show GN: 해외 직구한 내 소포, 어디쯤 있을까요?
2 hours ago
4
x32에서 실행한 Janet: 32비트 포인터, 64비트 속도, RAM 25% 절감
3 hours ago
5
노트북 도둑과 함께 일했던 때 (2025)
3 hours ago
4
D2Coding 폰트 1.4.0 릴리즈 소식을 전합니다.
4 hours ago
6
Tips
click
Popular
프로들도 줄지어 샷 점검… KLPGA 스타 사랑방 된 더헤븐CC 연습장
2 weeks ago
74
iOS 27, iPadOS 27, macOS 27
3 weeks ago
69
손흥민 선제골 발판·골대 불운…LAFC, 7경기 만에 승리
3 weeks ago
65
영림원소프트랩, 나람 통합 ERP 구축…사료 제조·물류·회계 데이터 하나로
2 weeks ago
62
'이 악문' 김영범, 자유형 50m '대회 신기록' 금메달
2 weeks ago
56
Accelerate your SAP modernization with Kiro
1 week ago
55
© Clint IT 2026. All rights are reserved









English (US) ·