3주 동안 3명이서 AI 요금제 상담 → 가입 전환 → 관리자 모니터링까지 이어지는 풀사이클 서비스를 만들었다. 그 과정에서 배운 것들을 정리한다.
YOGODA(요고다) 는 통신사 요금제를 AI가 상담해주는 서비스다. 단순히 "이 요금제가 좋아요"라고 추천만 하는 게 아니라, 추천 → 비교 → 가입 → 모니터링 → 프롬프트 개선까지 하나의 순환 구조로 연결한 플랫폼이다.
기존 요금제 추천 서비스들의 문제는 "추천은 잘하는데, 그 뒤가 없다"는 거였다. 사용자가 추천을 받고 실제로 가입했는지, 어디에서 이탈했는지, 어떤 프롬프트가 더 나은 결과를 내는지 등 이런 데이터가 전혀 남지 않았다. 요고다는 이 빈자리를 채워서 추천 품질을 데이터로 계속 개선할 수 있는 구조를 만드는 게 목표였다.

Frontend : Next.js · React · TypeScript · TanStack Query · Zustand · Tailwind CSS · Storybook · next-intl
Backend : Node.js · Express · TypeScript · Socket.IO · JWT · Zod · Swagger
AI / Data : Gemini Interactions API · MongoDB Atlas · Mongoose · Azure Key Vault
Infra / Deploy : Vercel · Azure App Service
Auth : OAuth 2.0 (카카오 · 네이버 · 구글)
Quality / Collab : Vitest · Playwright · ESLint · Prettier · Husky · GitHub · Jira · Notion


나는 백엔드 초기 세팅, 소셜 로그인(구글/네이버/카카오), 그리고 관리자 페이지 전체를 담당했다.
관리자 페이지는 단순한 CRUD 어드민이 아니었다. 상담 퍼널 분석, UI 클릭률 추적, 프롬프트 버전 관리 및 A/B 테스트, 세션 로그 조회 등 이 모든 게 실제 채팅 데이터와 연결되어 돌아가야 했다. 프론트에서 데이터를 어떻게 보여줄지뿐 아니라, 백엔드에서 이벤트를 어떤 단위로 기록하고 어떻게 집계할지까지 설계해야 했기 때문에 풀스택 역할이 자연스러웠다.
각 주제는 별도 개발일지에 상세히 정리해뒀다. 여기서는 뭘 했고 뭘 느꼈는지만 짧게 남긴다.
카카오·구글·네이버 세 플랫폼 소셜 로그인을 모두 구현했다. 셋 다 OAuth 2.0 인가 코드 방식이라 핵심 로직은 동일했고, 코드보다 각 플랫폼 개발자 콘솔 세팅이 오히려 시간을 더 잡아먹었다. 하나의 표준을 제대로 이해하면 나머지는 따라온다는 걸 체감했다.

"비회원은 로컬에만 저장"이라는 초기 설계가 관리자 페이지를 만들면서 깨졌다. 비회원 이탈 데이터가 서버에 없으니 분석 자체가 불가능했기 때문이다. "연결 시점부터 저장"으로 바꾸면서 소켓 인증 타이밍, 세션 쪼개짐, 이탈 상태 되살아남 등 연쇄적인 문제를 해결해야 했다.
프롬프트 편집 화면에서 새로고침은 정상인데 탭 전환 후 돌아오면 텍스트박스가 비는 버그를 만났다. React Query 캐시가 재마운트 시 데이터를 즉시 채워주면서, useState 초기값 기반의 리셋 로직이 무력화되는 게 원인이었다. 초기값을 외부 데이터에서 유도하지 않고 undefined로 고정해서 해결했다.
AI 시스템 프롬프트 중 인사말+역할+규칙만 관리자 편집 범위로 열고, JSON 응답 형식은 코드에 고정시켰다. 관리자가 실수로 응답 형식을 건드리면 전체 채팅이 멈출 수 있기 때문이다. 세션 생성 시점에 프롬프트 버전을 고정하는 방식으로 대화 중 말투가 바뀌는 문제도 방지했다.

Hotjar 같은 히트맵 대신 직접 이벤트 추적을 구현했다. 채팅 화면은 동적 스크롤이라 히트맵이 강력한 조건이 아니었고, 관리자에게 필요한 건 이미 정해진 전환 버튼들의 CTR을 정밀하게 모니터링하는 것이었다. 퍼널은 순서 보장, UI 이벤트는 세션당 1건으로 중복 방지하며 기록했다.

대시보드 API가 3초대로 느려서 직렬 쿼리를 Promise.all로 병렬화했지만 2초대에서 멈췄다. 쿼리 하나당 왕복 220ms가 일정하게 나와서 인프라를 의심했고, MongoDB Atlas 클러스터가 미국 리전이었던 게 원인이었다. 서울로 옮기니 1초 미만으로 해결됐다.
| 항목 | 수치 |
|---|---|
| 페이지 수 | 38개 |
| API 수 (Swagger 문서화) | 59개 |
| 테스트 통과 | 64개 (FE 32 + BE 26 + E2E 6) |
| PR | 110개 |
| Lighthouse Performance | 95점 |
| Lighthouse Accessibility | 100점 |
관리자 페이지 UI를 처음부터 그리기 막막해서 Claude Design을 써봤다. 디자인 시스템(메인 컬러, 카드 스타일, 레이아웃)을 프롬프트 상단에 정의해두고 페이지 단위로 생성 → html to design 플러그인으로 Figma에 가져와서 다듬는 워크플로우를 사용했다.
디자이너 없이 백지부터 시작하는 막막함이 확 줄었고, 일관된 톤앤매너를 유지하는 데도 효과적이었다.

3주라는 시간이 길면서도 굉장히 짧게 느껴졌다. 매일 새로운 문제를 만나고 해결하면서 밀도 있게 보낸 건 맞는데, 돌이켜보면 좀 더 개발 속도를 냈어야 했다는 아쉬움이 남는다.
개발을 더 빨리 끝냈으면 테스트 기간을 충분히 확보할 수 있었을 거고, 사용자 입장에서 UI/UX를 다듬는 시간도 가질 수 있었을 텐데 후반으로 갈수록 기능 구현에 급급해진 느낌이 있었다. 다음 프로젝트에서는 개발을 일찍 마무리하고, 테스트와 사용자 관점의 개선에 시간을 더 쓸 수 있는 페이스를 만들고 싶다.
그래도 이번 프로젝트를 통해 정말 많이 배웠다. 설계가 뒤집히는 순간의 대응, 데이터를 기록하고 집계하는 구조 설계, 코드 너머의 인프라까지 시야를 넓히는 감각 이런 것들은 강의에서 배울 수 없는, 직접 부딪혀봐야 느는 종류의 경험이었다.
GitHub: yogoda-backend · yogoda-frontend