프로젝트 기록/누구나법률 서비스 개발기

법 앞에 누구나 — AI 법률 서비스 하루 만에 MVP 완성기 (1장)

makewithai 2026. 8. 4. 14:44

하루 만에 완성된 MVP, 그리고 하루 만에 시작된 오류들

2026년 4월 16일 오후 2시 56분. AI 법률 서비스의 첫 커밋을 올렸다.

 
Initial commit — 누구나법률 (Law For Everyone) MVP

법 앞에 누구나 — 취약계층·외국인 노동자 대상 무료 AI 법률 상담 및 계약서 검토 서비스

88개 파일, 19,209줄. 커밋 메시지에 적어놓은 기능 목록만 봐도 이미 꽤 갖춰져 있었다.

  • 취약계층 상담(주거·근로·소상공인) + 비즈니스 5개 카테고리
  • AI 계약서 자동 분석(조항 추출·위험 분류·법제처 조문 매칭)
  • 법제처 Open API 연동
  • 다국어(한·영·베·중) UI + AI 답변
  • 실제 피해사례 30건 + 정부 보도자료 RSS 자동 수집
  • PII 자동 마스킹 + 원본 파일 즉시 삭제
  • rate limiting, 세션 토큰 인가, XSS 방어

PM으로 몇 년을 일하면서 기획서는 수백 장 써봤지만, 이번엔 기획서 대신 코드가 나왔다. 스택은 React 18 + FastAPI + SQLite. 요즘 흔한 조합이지만, 나한테는 "이걸 내가 직접 짰다"는 사실 자체가 낯설었다.

왜 하필 "누구나법률"이었나

시작은 단순했다. 전세사기, 임금체불, 부당계약 — 이런 일을 겪는 사람들은 보통 변호사 상담료부터 걱정한다. 청년, 어르신, 외국인 노동자일수록 더 그렇다. "법 앞에 누구나"라는 이름을 붙인 이유도 여기서 나왔다. 법률 정보 자체는 법제처가 이미 API로 공개해두고 있었다. 문제는 그걸 읽고 해석해서 "지금 내 상황에 뭘 해야 하는지" 알려주는 사람이 없다는 거였다. AI가 그 역할을 할 수 있지 않을까 — 그게 전부였다.

ROADMAP.md에 처음부터 이렇게 적어뒀다.

취약계층 대상은 영구 무료 유지, 비즈니스는 합리적 구독으로 지속가능성 확보.

지금 와서 다시 읽으면 좀 웃긴 게, 이 한 줄이 몇 달 뒤에 벌어질 일(그랜트 시도, 실패, 결국 이 문장 그대로 돌아오기)을 이미 예언하고 있었다. 그 이야기는 4장에서 다룬다.

개인정보는 일단 만지지 않는 게 낫다

계약서를 업로드받아 AI가 읽는 서비스를 만들면서 제일 먼저 정한 원칙은 "개인정보는 최대한 안 보이게 하자"였다. 주민등록번호, 전화번호, 이메일, 계좌번호를 정규식으로 걸러내는 마스킹 로직을 첫날부터 넣었다.

 
python
# 주민등록번호: 뒤 7자리는 전부 마스킹, 앞 6자리(생년월일)만 남김
_RRN_RE = re.compile(r"(\d{6})[-\s]?([1-8]\d{6})")

# 휴대폰: 010/011/016~019 - 3~4 - 4
_MOBILE_RE = re.compile(r"(01[016789])[-\s.]?(\d{3,4})[-\s.]?(\d{4})")

# 계좌번호: 3구간 숫자 패턴 (과잉 매칭 방지용 최소 10자리 이상)
_ACCOUNT_RE = re.compile(r"(\d{3,6})[-\s](\d{2,6})[-\s](\d{4,8})")

완벽하지 않다는 것도 알고 있었다. 이름이나 주소까지 잡아내진 못한다. 그래도 "일단 최소한은 막고, 원본 파일은 분석 끝나면 즉시 삭제한다"는 정책을 첫날부터 코드에 박아둔 게, 나중에 실제 사용자 계약서를 받기 시작했을 때 마음의 부담을 꽤 덜어줬다.

근데 배포는 하루 종일 삐걱댔다

기능은 그럴듯하게 갖췄는데, 정작 첫날 오후 내내 씨름한 건 "이걸 어떻게 세상에 띄우느냐"였다.

  • 오후 3시 06분 — Render.com 무료 호스팅 설정 추가
  • 오후 3시 15분 — README에 배포 가이드 추가
  • 오후 3시 19분 — fix: inline build commands in render.yaml (CRLF fix)

윈도우에서 작업하다 보니 줄바꿈 문자(CRLF)가 껴서 빌드 스크립트가 깨졌다. 배포 파이프라인을 완성한 지 13분 만에 그걸 고치는 커밋이 올라갔다.

  • 오후 3시 31분 — fix: replace broken RSS URLs with korea.kr feeds
  • 오후 3시 32분 — fix: hide Settings from sidebar nav
  • 오후 6시 10분 — fix: RSS collector User-Agent + timeout + progress display

 

정부 보도자료를 자동 수집하겠다고 넣은 RSS 피드 URL이 애초에 죽어있었고, 실수로 화면에 노출시킨 관리자 설정 메뉴는 부랴부랴 숨겼고, RSS 수집기는 User-Agent 헤더가 없어서 차단당하고 있었다.

첫날의 교훈은 명확했다. AI가 코드를 짜는 속도와, 그 코드가 실제로 인터넷 위에서 살아남는 속도는 완전히 다른 문제였다. 기능 목록은 커밋 메시지 한 번에 다 나열할 수 있었지만, "그게 실제로 켜져 있게 만드는 일"은 그날 오후 내내 하나씩 두들겨 맞으면서 배웠다.

다음 장 예고

진짜 문제는 기술이 아니라 돈이었다 — 무료 호스팅의 한계와, LLM 하나를 통째로 빼버린 이야기가 이어진다.


이 글은 개인 개발 프로젝트의 기록이며, 실제 코드는 일부 축약·각색되었습니다. 서비스 이용이 법률 자문을 대체하지는 않습니다.