브라우저에서 진짜 Postgres로 SQL 문제를 풀고 채점받기
SQL 연습할 곳은 많은데 정작 테이블을 보고 내 쿼리를 돌려볼 수 있는 곳은 드물다. 그래서 브라우저 안에서 진짜 Postgres(PGlite)로 실행되고 결과셋으로 채점되는 SQL 드릴을 만들었다.
SQL 연습할 곳은 많다. 그런데 써 보면 대부분 똑같은 게 아쉬웠다. 문제랑 정답은 주는데, 정작 테이블을 볼 수가 없다. 내 쿼리를 돌려볼 수도 없고. 그냥 눈으로 SQL을 읽고 “이거 맞겠지” 하고 넘어가는 건데, 그건 연습이 아니라 독해다.
그래서 그냥 만들었다 → web-sql-drill (오픈소스, MIT)
열면 이렇게 생겼다.

문제 하나에 진짜 테이블이 딸려 온다(위 화면의 departments, employees 탭). 그 밑 에디터에 SQL을 쓰고 실행한다.
브라우저 안에서 도는 게 진짜 Postgres다
여기서 도는 건 Postgres 흉내가 아니다. PGlite라고, Postgres를 WASM으로 컴파일해서 브라우저 안에서 통째로 돌리는 게 있다. 문제마다 인메모리 DB가 하나씩 뜨고, 스키마랑 시드 데이터가 그 안에 들어간다. 그래서 실제 테이블을 눈으로 보고, 틀리면 진짜 Postgres 에러 메시지를 받는다.
쿼리를 쓰고 실행하면:

결과가 나오고 채점이 된다. 채점은 LLM한테 “이거 맞아?” 물어보는 방식이 아니다. 내가 낸 결과셋과 정답 쿼리의 결과셋을 그냥 비교한다. 같으면 정답, 다르면 오답. 결정적이라 애매할 일이 없다(정렬이 중요한 문제면 순서까지 본다).
LLM이 낸 걸 그대로 믿지는 않는다
문제는 로컬 Claude Code가 만든다. {schema, seed, prompt, solution} 형태로 생성하는데, 여기에 내가 도구 만들 때 늘 지키는 규칙이 하나 들어간다.
LLM이 만든 건, 실행 검증을 통과한 것만 사용자한테 보낸다.
생성된 문제는 사용자한테 가기 전에 서버에서 PGlite로 한 번 돌려본다. 스키마가 제대로 서는지, 시드가 들어가는지, 정답 쿼리가 실제로 도는지. 안 되면 최대 두 번 자가수리하고, 그래도 안 되면 버린다. 그러니까 깨진 문제는 사용자가 아예 못 본다.
이게 사실 회사에서 만드는 분석 도구들이랑 같은 생각이다. LLM한테 뭘 시킬 때, 그 출력을 그냥 믿고 흘려보내면 안 된다고 본다. AI는 “대신 해주는” 게 아니라 “사람이 검증할 수 있는 형태로 준비해 주는” 쪽이어야 한다. 신뢰 못 할 출력을 그대로 내보내는 도구는 없느니만 못하다.
왜 굳이
계정도 없고 호스팅 DB도 없다. 클론해서 로컬에서 돌리면 끝이다. 서버는 문제 생성할 때 로컬 Claude를 부르는 얇은 Express 하나뿐이고.
솔직히 SQL 드릴 사이트가 없어서 만든 건 아니다. 그냥 내가 반복해서 겪는 불편은 도구로 만드는 게 제일 빠르다. 분석하다 SQL 컨텍스트가 매번 흩어져서 Text-to-SQL 도구를 만들었고, 랭킹 로직 얘기가 말로만 돌아서 시뮬레이터를 만들었다. 이것도 그 연장이다.
만들다 보면 부수적으로 하나 남는 게 있다. 결과셋 비교를 제대로 하려고 정렬·NULL·중복을 파다 보니 “두 결과가 같다는 게 뭔지”가 훨씬 또렷해졌다. 도구를 쓰는 것보다 만드는 게 그 도메인을 더 깊이 이해하게 만든다.
코드랑 실행법은 저장소에 있다. 이슈·PR 환영.