passQL
App Store 출시 · 웹 서비스
AI가 함정 오답을 만들고, 보기 SQL을 샌드박스 DB에서 실행해 확인하는 SQLD 학습 앱
배경
passQL은 SQLD 문제를 풀면서 보기 SQL을 실제로 실행해 보고, 틀린 이유를 AI 해설로 확인하는 학습 서비스입니다. iOS 앱과 웹으로 출시했고, Google Play는 준비 중입니다.
Twin-Fang 팀 2명이 2026년 4월부터 만들고 있습니다. 서버와 AI는 팀원이 맡았고, 저는 웹·앱 화면과 세컨드브레인 도입을 맡았습니다.
문제는 이렇게 만들어집니다
- AI가 함정 오답을 만듭니다. 정답 SQL을 먼저 실행하고, 그 결과를 보고 수험생이 헷갈리기 쉬운 지점(잘못된 JOIN 조건, GROUP BY 누락, NULL 처리 실수)을 겨냥합니다.
- 샌드박스 DB가 검증합니다. 문제마다 임시 PostgreSQL DB를 만들어 모든 선택지를 실행하고, 정답이 딱 하나일 때만 저장합니다.
- Oracle 문법은 바꿔서 실행합니다.
NVL·SYSDATE같은 함수는 PostgreSQL 문법으로 바꾸고, 바꿀 수 없는 문법은 개념 문제로 냅니다.
맡은 역할
- 웹 프론트엔드 (2026.04) — React·TypeScript. 문제 풀이, 설정, 건의사항 화면과 daisyUI 디자인 토큰 정리
- Flutter 앱 UI/UX (2026.10) — 신규 가입자 온보딩, 홈·하단 탭·내 프로필·토론 탭 개편
- 세컨드브레인 도입 — 이슈와 결정 기록을 에이전트가 꺼내 쓰는 볼트로
구현은 AI 에이전트에게 맡기고, 저는 원인을 좁히고 결과를 검증하는 일을 맡았습니다.
홈이 2.5초 동안 비어 있던 문제
- 상황앱을 켜면 홈이 3.5~4초 동안 스켈레톤으로만 보였습니다.
- 원인홈은 인사말·일정, 학습 현황, 추천 문제 세 묶음이 모두 와야 그려졌습니다. 추천 문제는 등급을 확인한 뒤에 요청해서 가장 늦었습니다. 맨 아래 섹션 하나가 맨 위 카드까지 붙잡고 있었습니다.
- 한 일추천 문제를 첫 표시 조건에서 빼고, 도착하면 맨 아래에 따로 채우게 했습니다. 다시 합쳐지지 않도록, 추천이 끝나지 않아도 홈이 뜨는지 보는 테스트를 넣었습니다. 이 테스트는 수정 전에 실패하고 수정 후에 통과합니다.
- 결과홈 내용이 뜨기까지 평균 2476ms에서 191ms로 줄었습니다. 추천 문제는 그대로 약 2.5초 뒤에 붙습니다.
iPhone 16 Pro 시뮬레이터 디버그 빌드에서 운영 API로 10회 잰 값입니다. 핫 리스타트로 재서 앱 시작 단계(Firebase 초기화, 세션 복원)는 빠져 있습니다.
세컨드브레인 도입
코드만 봐서는 "왜 이렇게 됐는지" 알 수 없었습니다. 이유는 GitHub 이슈와 작업 리포트 댓글에 흩어져 있었습니다. 그래서 제가 만든 Second Brain Template을 모노레포에 설치했습니다.
- 넣은 기록: 이슈 428개, 완료 리포트 347건, 결정 212개를 볼트에 넣었습니다.
- 바뀐 결정 잇기: 결정이 바뀐 곳은 대체 관계로 이어, 지금 유효한 결정과 지난 결정을 나눴습니다. 하단 탭 결정은 네 번 바뀌었는데, 어느 결정을 찾아도 현재 결정으로 이어집니다. 범위가 겹쳐 판단이 필요한 4건은 main 코드를 보고 정했습니다.
- 지어낸 이유 막기: 시험 삼아 5건을 넣고 원본과 대조하니, 원본에 없는 이유를 사실처럼 쓴 문장이 8곳 나왔습니다. 그래서 원본에 없는 이유는 "논의 기록 없음"으로 적게 했습니다. 배치마다 파일명·금액·버전을 원본과 대조했고, 마지막에 결정 19개를 다시 대조했습니다.
- 공개 저장소 정리: 저장소가 공개라서 NAS 경로, 운영 도메인, 내부 포트를 노트에서 가렸습니다. 현재 파일만이 아니라 브랜치의 커밋 전체에서 지웠습니다.
- 계속 쌓이게: 작업 리포트를 쓴 직후 지식화해 같은 PR에 담는 규칙을
CLAUDE.md에 넣었습니다. - 꺼내 보기: 볼트 검사 오류는 0입니다. "요금제"를 물으면 1·3개월 이용권 결정이, "결제 스위치"를 물으면 관련 이슈와 결정 두 개가 근거로 나옵니다.
이슈 노트 약 775개의 증상·원인 요약은 표본만 원본과 대조했습니다.
배운 점
- 첫 화면이 늦으면, 가장 느린 섹션이 전체를 붙잡고 있는지부터 봅니다. 실제 처리 시간이 같아도 기다리는 시간은 줄일 수 있습니다.
- AI가 정리한 기록도 원본과 대조합니다. 5건만 넣었는데도 지어낸 이유가 8곳 나왔습니다.






