수영장(Sooyoung Archive)
홈개발일지이번캠App소개
전체보기
프로젝트
블로그 만들기그림톡캠핑 인스타
개발

© 2026 수영장 (Sooyoung Archive). All rights reserved.

개인정보처리방침연락처
개발일지 목록
개발

삼문판결 만들기 2편: 만든 다음부터가 진짜 시작이었다

2026년 3월 10일약 4분 소요45회 조회
목차
1) 정책 먼저: “무제한 체험”을 버리고, 무료 쿼터로 전환2) 기능보다 전환: 결제 대신 베타 대기 등록 UX3) 모델 실전 적용: Gemini 연동 + 실패 시 폴백4) 저장소도 MVP답게: 파일에서 DB 중심으로 이동5) UI 리프레시: 화려함보다 판결 전달력이번 라운드에서 얻은 결론

삼문판결 만들기 2편: 만든 다음부터가 진짜 시작이었다

1편에서 나는 ‘좋은 말’ 대신 ‘판결문 형식’을 만들었다. 그런데 MVP를 실제로 돌려보니, 문제는 판결 생성 이전이 아니라 운영 정책에서 터졌다.

판결은 잘 나오는데, 서비스는 쉽게 흔들렸다.

그래서 2편의 핵심은 모델 튜닝이 아니라, MVP를 버티게 만드는 운영 설계다.


1) 정책 먼저: “무제한 체험”을 버리고, 무료 쿼터로 전환

초기에는 한 번만 쓰게 막는 강한 제한이 있었다. 그런데 이 방식은 간단한 대신, 학습 데이터가 너무 적게 쌓였다.

그래서 지금은 세션 기준으로 이렇게 바꿨다.

  • FREE_JUDGE_QUOTA (기본 1)
  • FREE_JUDGE_WINDOW_HOURS (기본 24)

즉, “평생 1회”가 아니라 **“24시간 롤링 윈도우 내 N회”**로 바꾼 것.

핵심은 사용자 입장에서 공정하고, 운영자 입장에서도 실험이 가능한 균형점이었다.


2) 기능보다 전환: 결제 대신 베타 대기 등록 UX

아직 제품이 날카롭게 고정되지 않았는데 결제부터 열면, 돈은 받을 수 있어도 학습은 느려진다.

그래서 유료 버튼을 전면 오픈하는 대신, 프리미엄 베타 대기 등록 플로우로 바꿨다.

결과 페이지에서 확장 기능을 누르면:

  • 결제 화면으로 직행하지 않고
  • 연락처 + 지불 의향 + 필요한 기능 1개를 받는 모달이 뜬다

이건 매출 버튼이 아니라, 수요 검증 폼을 제품 안으로 붙인 구조다.


3) 모델 실전 적용: Gemini 연동 + 실패 시 폴백

이번 라운드에서 생성부는 Gemini 호출을 붙였다. 다만 LLM 앱의 기본은 항상 같다.

성공 경로만 설계하면 반드시 깨진다.

그래서 지금 구조는 다음처럼 잡았다.

  • Gemini 호출
  • JSON 파싱 + badge/axis 정규화
  • 길이/금지표현/단일 axis 등 가드레일 검사
  • 위반 시 1회 재생성
  • 그래도 실패하면 deterministic fallback 생성

한마디로, 모델 성능에 기대는 게 아니라 출력 계약을 강제하는 방식이다.


4) 저장소도 MVP답게: 파일에서 DB 중심으로 이동

초기 파일 저장은 빠르게 시작하기엔 좋다. 하지만 쿼터, 중복 입력 캐시, 재심 체인 같은 기능이 늘어나면 결국 데이터 모델이 필요해진다.

지금은 verdict/limit 저장이 DB 스키마 기반으로 움직이게 바꿨고, 세션 사용량·입력 해시·재심 인덱스를 서버에서 일관되게 다룬다.

즉, “돌아가는 데모”에서 운영 가능한 MVP로 한 단계 올라온 셈이다.


5) UI 리프레시: 화려함보다 판결 전달력

최근 커밋에서 랜딩/결과 페이지 비주얼을 여러 번 손봤다. 포인트는 장식이 아니라 전달력이다.

  • 판결 배지 인지성 강화
  • 문장 위계 정리(1문장 우선)
  • 입력 피드백 개선
  • 결과 카드 임팩트 조정

결국 목표는 하나다. 읽은 뒤 남는 감정이 “예쁘다”가 아니라, “그래서 지금 뭘 할지 알겠다.”


이번 라운드에서 얻은 결론

MVP의 핵심은 기능 수가 아니라 운영 규칙 + 출력 규격 + 학습 루프다.

삼문판결은 지금, 판결 생성기에서 조금 더 나아가 ‘판결 포맷을 중심으로 한 실험 시스템’이 되어가고 있다.

다음 편에서는 재심(appeal) 흐름을 어떻게 제품화할지, 그리고 어떤 지표로 “계속/중단”을 진짜 결정할지 정리해볼 생각이다.

클릭할 때마다 작가에게 따뜻한 응원이 전달됩니다 ❤️

이 글이 유익하셨나요?
동료 개발자들과 경험과 노하우를 공유해 보세요.
이전 글개발
개인 블로그 만들기부터 AdSense 수익화까지: 완벽 가이드
개발다음 글
삼문판결 만들기 3편: 재심(appeal)을 기능이 아니라 장치로 설계한 이유

함께 읽으면 좋은 다른 개발일지

'개발' 및 추천 아카이브 글 모음

Next.js App Router에서 구글 서치 콘솔 '적절한 표준 태그가 포함된 대체 페이지' 해결기
개발
Next.js App Router에서 구글 서치 콘솔 '적절한 표준 태그가 포함된 대체 페이지' 해결기
Next.js App Router의 메타데이터 상속 구조로 인해 모든 블로그 포스트의 canonical URL이 홈으로 고정되어 검색 색인에서 누락되던 문제를 self-referencing canonical과 한글 슬러그 인코딩으로 해결한 실전 트러블슈팅 기록.
2026. 9. 7.0회
🏊‍♂️
개발
Next.js 16과 Tailwind CSS에서 다크/라이트 테마 깜빡임(FOUC) 없이 구현하기
Next.js 16 App Router 환경에서 localStorage 기반 다크 모드 전환 시 발생하는 첫 화면 깜빡임(FOUC) 문제를 인라인 스크립트와 CSS 변수로 깔끔하게 해결한 과정.
2026. 9. 4.2회
🏊‍♂️
개발
React 마크다운 렌더러에 스마트 목차(TOC)와 스크롤 스파이(Scroll-Spy) 적용기
긴 기술 블로그 아티클을 읽기 편하게 만들기 위해 마크다운 헤딩(#, ##)을 자동 추출하여 동적 목차(TOC)를 생성하고 IntersectionObserver로 실시간 스크롤 스파이를 구현한 경험.
2026. 9. 4.2회

댓글

목차
1) 정책 먼저: “무제한 체험”을 버리고, 무료 쿼터로 전환2) 기능보다 전환: 결제 대신 베타 대기 등록 UX3) 모델 실전 적용: Gemini 연동 + 실패 시 폴백4) 저장소도 MVP답게: 파일에서 DB 중심으로 이동5) UI 리프레시: 화려함보다 판결 전달력이번 라운드에서 얻은 결론