최근 later-you-said와 Emova라는 두 개의 프로젝트를 만들었습니다.
later-you-said는 저장만 해두고 다시 보지 않는 링크, 글, 영상을 다시 보게 만드는 React Native 앱입니다. Emova는 감정 상태를 고르면 지금 할 수 있는 작은 회복 퀘스트를 추천하고, 실행과 회고까지 이어지게 만드는 감정 기반 루틴 코칭 웹앱입니다.
이번 글에서 말하고 싶은 핵심은 “AI로 빠르게 만들었다”가 아닙니다. 더 정확히는 아직 익숙하지 않은 에이전트 기반 개발 도구들을 실제 프로젝트에서 어떻게 써볼 수 있을까를 고민한 기록에 가깝습니다.
빠르게 만드는 것만 목표였다면 AI가 준 코드를 그대로 붙이면 됐을지도 모릅니다. 하지만 제가 원한 것은 “빠른 MVP”와 동시에 결과의 정확도를 높이는 것이었습니다. 그래서 AI가 만든 결과를 그대로 믿기보다, 어떤 도구를 어떤 상황에 쓰고, 어떤 기준을 통과했을 때 프로젝트에 반영할지 계속 확인했습니다.
1. AI를 어떻게 사용하려고 했나
이 글에서 다루는 프로젝트 화면


AI를 사용한 가장 큰 이유는 MVP를 빠르게 만들기 위해서였습니다.
혼자 사이드 프로젝트를 만들면 기획, 디자인, 프론트 구현, 데이터 설계, 디버깅, 문서화까지 전부 직접 해야 합니다. 하나하나 완벽하게 하려고 하면 실제 사용 흐름을 확인하기 전부터 지치기 쉽습니다.
그래서 AI를 “대신 만들어주는 도구”라기보다 MVP를 빠르게 실험하게 해주는 실행 도구로 사용하려고 했습니다. 다만 빠르기만 해서는 부족했습니다. AI가 만든 코드가 실제 프로젝트 구조에 맞는지, 최신 라이브러리 사용 방식과 맞는지, 사용자 플로우에서 문제없이 동작하는지까지 확인해야 했습니다.
이 과정에서 자연스럽게 고민한 질문은 이런 것이었습니다.
에이전트, 스킬, 커맨드, 훅, MCP 서버 같은 도구들은 분명 개발에 도움이 될 것 같았습니다. 여기에 MAS처럼 여러 에이전트가 역할을 나눠 일하는 협업 구조까지 더하면, 실제 프로젝트에서 어떻게 써야 빠르고 정확하게 만들 수 있을지가 궁금했습니다.
다만 처음부터 모든 것을 다 쓰는 것이 좋은 방식은 아니라고 봤습니다. MVP 단계에서는 현재 필요한 도구만 작게 붙이고, 프로젝트가 커지면서 반복 작업이나 검증 지점이 늘어날 때 MCP 서버, MAS, 하네스 같은 구조를 확장하는 편이 더 현실적이라고 생각했습니다. 작은 프로젝트에 과한 자동화와 협업 구조를 먼저 얹으면, 오히려 만드는 속도보다 관리 비용이 커질 수 있기 때문입니다.
용어 정리
에이전트 목표를 받아 파일을 읽고, 코드를 수정하고, 실행 결과를 확인하는 작업 단위입니다. 저는 “한 번에 답을 받는 챗봇”보다, 실제 프로젝트 안에서 작업을 이어가는 실행자에 가깝게 이해했습니다.
스킬 특정 작업을 더 잘하기 위한 사용법 묶음입니다. 예를 들어 UI를 다듬을 때, 타입을 확인할 때, 최신 라이브러리 사용 방식을 볼 때처럼 상황별로 참고하는 작업 가이드에 가까웠습니다.
커맨드 반복해서 쓰는 작업을 명령처럼 꺼내 쓰는 방식입니다. 매번 길게 설명하지 않고, 정해진 흐름으로 실행하거나 점검할 때 도움이 됐습니다.
훅 특정 시점에 자동으로 실행되는 안전장치입니다.
CLAUDE.md가 “이렇게 해줘”라고 알려주는 가이드에 가깝다면, 훅은 작업 전후에 실제 명령이나 검사를 실행해서 더 강하게 막아주는 장치에 가깝습니다. 예를 들어 수정 후 테스트를 돌리거나, 위험한 명령을 감지하거나, 정해진 규칙을 어겼을 때 작업을 멈추게 할 수 있습니다.
MCP 서버 AI가 외부 도구나 데이터에 접근할 수 있게 해주는 연결 통로입니다. 모델 혼자 기억하는 정보에만 의존하지 않고, 필요한 도구를 불러와 작업 범위를 넓히는 방식으로 이해했습니다.
MAS Multi-Agent System의 줄임말입니다. 스킬이나 커맨드처럼 하나의 도구라기보다, 여러 에이전트가 역할을 나눠 협업하는 구조에 가깝습니다. 한 에이전트가 모든 일을 다 하기보다, 계획·구현·검토·리팩토링처럼 역할을 나누면 더 안정적인 작업 흐름을 만들 수 있다고 봤습니다.
later-you-said에서는 저장한 콘텐츠를 다시 보게 만들기 위해 어떤 입력값이 필요한지, 알림 문구는 어떤 톤이어야 행동을 유도할 수 있을지, 로컬 저장과 백업 방식을 어떻게 가져갈지 빠르게 시도했습니다.
Emova에서는 감정 선택부터 AI 루틴 추천, 퀘스트 등록, 회고까지 이어지는 흐름을 만들면서 서버 액션, Supabase 데이터 모델, 상태 전환 로직, 테스트 방식을 함께 잡아야 했습니다.
두 프로젝트 모두 처음부터 완성된 정답이 있었던 것은 아닙니다. AI는 초안을 만들고, 에이전트와 스킬은 파일 탐색·코드 수정·검증 흐름을 도왔습니다. 커맨드는 반복 작업을 줄이는 데, 훅은 규칙을 안내하는 데서 끝나지 않고 실제 검사로 막아주는 안전장치로, MCP 서버는 외부 도구와 연결하는 통로로 이해했습니다. 저는 그 결과를 사용자 흐름, 구현 복잡도, 데이터 처리 방식, 유지보수 가능성을 기준으로 걸러서 반영했습니다.
2. AI와 함께 개발하기 위해 사용한 도구들
AI와 함께 개발할 때는 프롬프트만 잘 쓰는 것보다, AI가 만든 결과를 확인할 기준을 갖는 것이 중요했습니다. 저는 도구들을 “코드를 대신 짜주는 것”보다, 제가 놓칠 수 있는 위험을 찾고 판단을 보조하는 용도로 사용했습니다.
실제로 사용한 도구는 react-doctor, typescript-lsp, frontend-design, 그리고 OpenClaw였습니다. context7은 아직 본격적으로 쓰지는 않았지만, 이후 문서 검증 단계에 붙이려고 넣어둔 도구입니다.
react-doctor는 GitHub 트렌드를 보다가 알게 됐고, typescript-lsp, context7, frontend-design은 Claude 플러그인 목록에서 알게 됐습니다.
react-doctor
react-doctor는 AI가 만든 React 코드의 문제를 빠르게 훑어보는 보조 리뷰어처럼 사용했습니다. 공식 설명상 상태와 이펙트, 성능, 아키텍처, 보안, 접근성, 프레임워크별 패턴을 정적으로 점검하는 도구였고, 제가 만든 MVP에서도 서버 액션, 데이터 로딩, 접근성, 거대 컴포넌트처럼 어디부터 확인해야 할지 우선순위를 잡는 데 도움이 될 수 있다고 봤습니다.
또 react-doctor를 선택한 이유 중 하나는 정량적인 평가가 가능했기 때문입니다. React Doctor의 score는 스캔 결과를 0~100점으로 요약해 보여주는 지표입니다. 점수가 높다는 것은 점수에 반영되는 진단 항목이 상대적으로 적거나 심각도가 낮다는 의미이고, 점수가 낮다는 것은 우선적으로 확인해야 할 문제가 더 많다는 신호로 볼 수 있습니다. 다만 이 점수를 절대적인 품질 판단 기준으로 보지는 않았고, 이전 스캔과 비교해 코드 상태가 어떤 방향으로 변하고 있는지 확인하는 추세 지표로 이해했습니다.
저에게는 이 점이 꽤 중요했습니다. AI가 만든 코드를 볼 때 “괜찮아 보인다”는 감각만으로는 부족했기 때문입니다. react-doctor의 진단 목록과 점수를 함께 보면, 리팩토링 전후에 코드 상태가 어느 정도 개선됐는지 더 알기 쉬웠습니다.
자세히 보기
react-doctor가 특히 도움이 된 부분은 “일단 돌아가는 코드”에서 위험도가 높은 부분을 먼저 찾아내는 일이었습니다.
Before — 클라이언트에서 대시보드 데이터 fetch
"use client";
import { useEffect, useState } from "react";
export default function DashboardPage() { const [data, setData] = useState<DashboardData | null>(null);
useEffect(() => { fetch("/api/dashboard") .then((res) => res.json()) .then(setData); }, []);
if (!data) return <div>로딩 중...</div>;
return <ChartArea data={data} />;}After — 서버 컴포넌트에서 데이터 로딩, 차트만 클라이언트 컴포넌트로 분리
export default async function DashboardPage() { const data = await loadDashboardDataOnServer();
return <ClientOnlyChart data={data} />;}이 선택을 한 이유는 명확했습니다. 대시보드 페이지는 사용자가 지표를 확인하기 위해 들어오는 화면이었기 때문에, 세션 수나 완료율 같은 데이터가 페이지의 핵심 콘텐츠였습니다. 따라서 이 데이터는 사용자의 추가 행동 이후에 필요한 값이 아니라, 첫 화면을 구성할 때부터 필요한 초기 데이터에 가까웠습니다.
클라이언트에서 useEffect로 불러오면 브라우저가 먼저 로딩 화면을 그리고, JavaScript가 실행된 뒤 다시 /api/dashboard를 호출해야 합니다. 반면 서버 컴포넌트에서 데이터를 불러오면 서버가 데이터를 채운 상태로 페이지를 내려줄 수 있어, 불필요한 클라이언트 요청과 초기 로딩 상태를 줄일 수 있습니다. 차트 라이브러리는 차트가 필요한 화면에서만 로드되도록 클라이언트 컴포넌트로 분리했습니다.
또 클릭 가능한 div를 button으로 바꾸는 접근성 개선도 react-doctor의 지적을 기준으로 우선순위를 잡았습니다.
code-review는 나중에 알게 된 Claude 플러그인이라 이번 작업에서는 아직 사용하지 않았습니다. react-doctor를 먼저 사용한 이유는 GitHub 트렌드에서 먼저 발견했고, React 코드베이스를 정적으로 훑어 위험 지점을 보여주는 방식이 당시 필요한 작업과 잘 맞아 보였기 때문입니다.
둘을 완전히 같은 층위의 도구로 보기는 어렵다고 생각했습니다. react-doctor는 CLI로 코드베이스를 스캔하고, 필요하면 에이전트가 참고할 수 있는 스킬 흐름으로 이어지는 도구에 가깝습니다. 반면 code-review는 Claude 플러그인 안에서 변경사항이나 코드 품질을 리뷰받는 흐름에 더 가깝다고 이해했습니다.
그래서 이번에는 react-doctor로 현재 코드베이스의 위험한 부분을 빠르게 훑고, 점수와 진단 결과를 함께 보며 우선순위를 잡는 데 집중했습니다. code-review는 이후 변경사항을 리뷰받는 단계에서 추가로 써볼 후보로 남겨두었습니다.
typescript-lsp
typescript-lsp는 타입과 참조 관계를 확인하는 데 사용했습니다. 리팩토링할 때 AI가 제안한 구조를 바로 믿지 않고, 실제 타입 정의와 사용처를 확인하는 용도였습니다.
자세히 보기
later-you-said에서는 알림 데이터 모델을 다룰 때 특히 유용했습니다. 처음에는 화면에 보여주는 문구와 실제 알림 예약에 필요한 값이 같은 문자열로 섞여 있었습니다. 예를 들어 "오늘 밤 9시", "2026.05.24 21:00 · 매일" 같은 문구를 그대로 저장하고, 알림 예약 함수도 그 문자열을 다시 해석해야 하는 구조였습니다.
Before — 화면용 문구를 알림 로직에서도 그대로 쓰는 구조
const reminderText = "2026.05.24 21:00 · 매일";
// scheduleNotification 내부에서// 이 문자열이 날짜인지, 매일 반복인지, 매주 반복인지 다시 판단해야 한다.await scheduleNotification(reminderText);이 방식은 구현은 빠르지만, 문자열 형식이 조금만 바뀌어도 알림 로직이 같이 흔들릴 수 있습니다. UI 문구를 바꾸는 일이 곧 예약 로직을 바꾸는 일이 되어버리기 때문입니다.
After — 문자열을 먼저 구조화된 예약 정보로 바꾸는 구조
type ReminderSchedule = | { kind: "date"; date: Date } | { kind: "daily"; hour: number; minute: number } | { kind: "weekly"; weekday: number; hour: number; minute: number };
const schedule: ReminderSchedule = { kind: "daily", hour: 21, minute: 0,};
await scheduleNotification(schedule);수정 후에는 화면용 문구와 알림 예약 정보를 분리했습니다. 사용자에게는 "오늘 밤 9시"처럼 자연스러운 문구를 보여주되, 실제 예약 로직에는 { kind: "daily", hour: 21, minute: 0 }처럼 타입이 있는 데이터를 넘기는 방식입니다. 이렇게 바꾸면 UI 문구가 달라져도 알림 예약 로직은 덜 흔들리고, TypeScript로 가능한 예약 형태를 더 명확하게 확인할 수 있습니다.
이후 항목 추가·수정·삭제·완료 처리 시 알림을 예약하거나 취소하도록 정리했습니다. 이때 저장 항목 타입, 폼 입력 타입, 알림 예약 함수 사이의 연결을 확인하면서 수정했습니다.
Emova에서는 큰 화면을 나눌 때 props 타입과 사용처를 확인하는 데 썼습니다. 덕분에 JSX만 잘라내는 식의 리팩토링이 아니라, 기존 타입 경계를 유지하면서 화면을 분리할 수 있었습니다.
context7
context7은 아직 본격적으로 사용하지는 않았습니다. 다만 AI 답변이 최신 문서와 어긋나는 경우가 있어서, 앞으로 공식 문서 기준을 빠르게 확인하기 위해 넣어둔 도구입니다.
제가 context7을 쓰려는 지점은 기술 선택 자체가 아니라, 선택한 기술을 실제로 구현할 때의 최신 사용 방식과 제약을 확인하는 단계입니다.
예를 들면 이런 식입니다.
- Next.js 현재 버전에서 Server Action을 어떻게 선언하는지 확인하기
- Server Component에서 데이터 fetch를 어떻게 하는지 확인하기
- App Router에서 권장하는 패턴이 뭔지 확인하기
- Tailwind v4에서 CSS 변수, theme 설정, 디자인 토큰을 어떤 방식으로 가져가는지 확인하기
자세히
데이터를 수정할 때 API Route를 따로 만들고 클라이언트에서 fetch로 호출하는 흐름을 많이 사용했습니다.
// client componentawait fetch("/api/quests", { method: "POST", body: JSON.stringify({ title }),});export async function POST(request: Request) { const { title } = await request.json(); await createQuest(title);
return Response.json({ ok: true });}App Router에서는 이런 저장/수정 작업을 Server Action으로 처리할 수도 있습니다.
"use server";
export async function createQuestAction(formData: FormData) { const title = String(formData.get("title")); await createQuest(title);}import { createQuestAction } from "./actions";
export default function QuestPage() { return ( <form action={createQuestAction}> <input name="title" /> <button type="submit">추가</button> </form> );}이처럼 Next.js는 Pages Router에서 App Router로 넘어오면서 데이터 로딩과 서버 작업을 작성하는 방식이 달라졌습니다. 그래서 context7로 현재 문서 기준의 예시를 확인하고, AI가 예전 방식만 기준으로 답하지 않도록 하려 했습니다.
즉, context7은 “무슨 기술을 쓸지 골라주는 도구”라기보다, 이미 선택한 기술을 구현할 때 AI가 오래된 방식으로 답하지 않도록 문서 기준을 붙여주는 용도로 쓰려고 했습니다.
frontend-design
frontend-design은 UI를 더 세련되게 다듬고, 화면의 첫인상을 개선하는 용도로 사용했습니다. 다만 아직 이 도구만의 뚜렷한 효과를 크게 체감했다고 보기는 어렵습니다.
Claude가 기본적으로 디자인 제안을 꽤 잘해주기 때문에, frontend-design은 완전히 다른 결과를 만들어준다기보다 거기에 플러스 알파를 더해주는 느낌에 가까웠습니다. 그래서 이번 프로젝트에서는 “이 도구 덕분에 크게 바뀌었다”기보다는, UI 톤이나 시각적 디테일을 한 번 더 점검하는 보조 도구로 이해했습니다.
OpenClaw
OpenClaw는 두 프로젝트를 만들 때 가장 자주 사용한 AI 작업 환경이었습니다.
가장 도움이 됐던 점은 긴 컨텍스트를 유지한 채 프로젝트 파일을 직접 읽고 수정할 수 있다는 점이었습니다. 일반적인 채팅형 AI 도구에서는 매번 파일 구조와 이전 결정을 다시 설명해야 하는 경우가 많지만, OpenClaw에서는 파일 탐색 → 코드 수정 → 실행 확인 → 재수정 → 문서화 흐름을 한 작업 안에서 이어갈 수 있었습니다.
그래서 OpenClaw는 저에게 “답변을 받는 도구”라기보다, AI의 제안을 실제 프로젝트 변경으로 옮기고 검증하는 작업 환경에 가까웠습니다.
3. AI를 작업 흐름에 넣은 방식
AI를 따로 떼어놓고 “질문에 답해주는 도구”처럼 쓰기보다, 개발 흐름 안에 넣어 사용하려고 했습니다.
처음에는 MVP에 어떤 기술 구성이 맞을지부터 AI와 함께 비교했습니다. 웹앱으로 만들지 앱으로 만들지, Supabase를 쓸지 다른 DB를 쓸지, 별도 Node.js 서버를 둘지 Next.js 안에서 서버 기능을 처리할지 같은 선택지를 먼저 열어두고 봤습니다.
이 단계에서 중요했던 것은 정답을 바로 고르는 것이 아니라, MVP에서 감당할 수 있는 복잡도를 보는 일이었습니다. 빠르게 검증해야 하는 프로젝트라면 별도 서버를 두는 것보다 Next.js 안에서 처리하는 편이 나을 수 있고, 로그인 장벽을 낮춰야 한다면 익명 인증을 먼저 고려할 수 있다고 봤습니다.
그다음에는 레이아웃을 빠르게 그렸습니다. 처음부터 완성도 높은 화면을 만들기보다, 사용자가 어떤 순서로 움직이는지 확인할 수 있는 정도로 먼저 구성했습니다. 이후 frontend-design으로 UI 톤과 시각적 디테일을 한 번 더 다듬고, 그 위에 실제 기능을 붙였습니다.
기능이 어느 정도 붙은 뒤에는 react-doctor로 리팩토링할 지점을 찾았습니다. 서버 컴포넌트로 옮길 수 있는 부분, 접근성 문제, 너무 커진 컴포넌트, 데이터 로딩 위치처럼 눈으로만 보면 지나치기 쉬운 부분을 먼저 확인했습니다.
그다음 typescript-lsp로 타입과 참조 관계를 확인했습니다. AI가 제안한 리팩토링이 실제 타입 정의와 사용처를 깨뜨리지 않는지, 함수나 컴포넌트를 옮겼을 때 연결이 유지되는지 보는 용도였습니다.
4. Emova에서 커맨드와 에이전트를 나눠 쓴 방식
Emova에서는 기능을 어느 정도 붙인 뒤, 작업을 더 잘게 나눠서 다뤘습니다. 이때 /emova-component-split 커맨드와 planner, refactorer 에이전트를 사용했습니다.
먼저 /emova-component-split은 진단과 계획을 위한 커맨드로 사용했습니다. 큰 컴포넌트나 역할이 많이 섞인 파일을 찾고, 렌더링, 상태 관리, API 호출, 모달, 이벤트 핸들러, 순수 로직이 한 파일에 섞여 있는지 확인했습니다. 중요한 점은 이 커맨드가 바로 코드를 수정하는 역할은 아니라는 점입니다. “어디를 어떤 순서로 나누면 안전한가”를 먼저 보는 용도였습니다.
/emova-component-split 커맨드에 넣은 기준
Emova의 큰 컴포넌트/파일을 찾아 역할 분리 후보를 제안한다.
## 목적- 400줄 초과 파일 또는 역할이 과도하게 섞인 파일을 조기에 발견- 리팩토링 전에 안전한 분리 순서 제안
## 절차1. `find src -type f \( -name "*.tsx" -o -name "*.ts" \) -exec wc -l {} + | sort -nr | head -30` 실행2. 200줄 이상 파일부터 읽고 역할을 분류한다3. 아래 기준으로 판단한다 - 렌더링 - 상태 관리 - API 호출 - 모달/토스트/네비게이션 - 복잡한 이벤트 핸들러 - 순수 비즈니스 로직4. 400줄 초과 파일은 반드시 사용자에게 알린다5. 테스트 가능한 순수 로직부터 분리하는 계획을 우선 제안한다
## 출력 형식- 파일명 / 줄 수 / 섞인 역할- 위험도: 높음/중간/낮음- 추천 분리 단위- 안전한 작업 순서- 분리 후 실행할 검증 명령
바로 파일을 삭제하거나 대규모 이동하지 말고, 먼저 분리 계획을 확인받는다.planner 에이전트는 구현 전 작업 범위를 정리하는 역할이었습니다. 사용자 흐름, 필요한 기능, 엣지 케이스, 우선순위를 먼저 정리하게 해서 바로 코드부터 쓰기보다 어떤 순서로 만들지 잡는 데 사용했습니다.
refactorer 에이전트는 계획이 잡힌 뒤 실제 구조를 고치는 역할이었습니다. component-split이 찾아낸 분리 후보를 바탕으로, 동작은 유지한 채 파일 분리, 네이밍, 타입 정리, 중복 제거를 진행했습니다. 즉 component-split이 “어디를 나눌지 찾는 도구”라면, refactorer는 “정해진 범위 안에서 실제로 고치는 에이전트”에 가까웠습니다.
이렇게 나눠보니 한 에이전트에게 모든 일을 맡기는 것보다 작업 의도가 더 분명해졌습니다. 진단, 계획, 실행을 분리하니 AI 결과를 검토하기도 쉬웠고, 이후 테스트와 빌드로 리팩토링 결과를 확인할 수 있었습니다.
5. 제품 관점에서 배운 점
두 프로젝트를 만들면서 기획적으로 가장 많이 본 것은 퍼널, 전환율, 리텐션이었습니다. 기능을 많이 붙이는 것보다 사용자가 어느 단계에서 멈추는지 확인하는 것이 더 중요하다고 봤습니다.
퍼널, 전환율, 리텐션이란?
퍼널(Funnel) 사용자가 목표 행동까지 가는 단계를 나눠 보는 방식입니다. 예를 들어 Emova에서는
세션 시작 → 플로우 완료 → 회고 완료처럼 볼 수 있습니다. 어느 단계에서 사용자가 많이 멈추는지 확인하기 좋습니다.
전환율(Conversion Rate) 한 단계에서 다음 단계로 넘어간 비율입니다. 예를 들어 세션을 시작한 사람 중 몇 명이 퀘스트 완료까지 갔는지, 퀘스트를 완료한 사람 중 몇 명이 회고까지 갔는지를 보는 식입니다.
리텐션(Retention) 사용자가 다시 돌아오는지를 보는 지표입니다. 한 번 사용하고 끝나는지, 다음 날이나 다음 주에도 다시 들어와 같은 행동을 반복하는지 확인합니다.
later-you-said에서는 카드 본문을 서버로 보내지 않았습니다. 제목, 링크, 메모 같은 개인 데이터는 기기 안에 두고, Supabase에는 사용자가 새 카드를 추가했는지, 저장한 링크를 다시 열었는지, 항목을 완료 또는 미완료로 바꿨는지 같은 익명 사용 이벤트와 카테고리·소요 시간 같은 메타데이터만 선택적으로 쌓는 방식으로 설계했습니다. 저장 수보다 중요한 것은 저장한 항목을 다시 열고 완료 처리하는지였습니다.
Emova에서는 감정 선택부터 회고까지 하나의 session_id로 묶었습니다. 익명 인증과 client_id를 사용해 가입 장벽은 낮추되, 감정 선택 → 생각 선택 → AI 추천 → 퀘스트 등록 → 완료 → 회고 흐름이 DB에 남도록 했습니다. 그래야 단순히 “감정을 몇 번 선택했는지”가 아니라 사용자가 어디까지 도달했는지 볼 수 있기 때문입니다.
Emova 대시보드에서는 실제로 이런 지표를 확인하도록 만들었습니다.
- 루프 완주 퍼널: 세션 시작 → 플로우 완료 → 회고 완료
- 전환율: 시작 → 완료, 완료 → 회고, 전체 완주율
- 리텐션 힌트: 기기별 첫 접속, 마지막 접속, 세션 수, 활동 시간대
- 행동 지표: 퀘스트 상태 분포, 감정/생각 선택 분포
이 지표를 보면서 수정할 것도 README의 TODO에 남겼습니다. 예를 들어 회고로 이어지는 액션 버튼 패턴, 첫 화면 선택지 확장, 감정 복수 선택 같은 항목은 단순 기능 추가가 아니라 사용자가 퍼널 중간에서 멈추는 이유를 줄이기 위한 후보였습니다.
결국 제품은 기능 목록이 아니라 사용자가 반복해서 행동하게 만드는 흐름으로 봐야 한다고 느꼈습니다.
6. 결론
이번 프로젝트를 만들면서 AI에 대해 느낀 점은 크게 세 가지였습니다.
첫째, AI를 쓰기 전에 만들고 싶은 것을 먼저 정해야 했습니다. AI는 코드를 빠르게 만들고 아이디어도 많이 제안해줍니다. 하지만 어떤 기능이 꼭 필요한지, 어디까지 만들고 멈출지는 제가 정해야 했습니다. 기준 없이 맡기면 기능은 늘어나지만, MVP는 오히려 복잡해질 수 있었습니다.
둘째, AI가 만든 코드는 다시 확인해야 했습니다. 겉으로는 잘 돌아가 보여도 파일이 너무 커지거나, 상태 관리와 UI가 한곳에 섞이는 문제가 생길 수 있었습니다. 그래서 react-doctor처럼 점수와 진단 결과를 보여주는 도구로 한 번 더 확인했습니다. 덕분에 감으로만 보지 않고, 어디부터 고칠지 정하기 쉬웠습니다.
셋째, AI가 정리한 내용도 제 말로 다시 바꿔야 했습니다. AI가 써준 문장이 그럴듯해도 제가 설명하지 못하면 의미가 없었습니다. 그래서 문서나 코드 설명도 그대로 쓰지 않고, 제가 이해한 이유와 흐름으로 다시 고쳤습니다.
결국 AI는 혼자 제품을 완성해주는 도구라기보다, 제가 만들고 싶은 것을 더 빨리 실험하게 도와주는 도구에 가까웠습니다. 앞으로도 AI를 쓰더라도, 마지막에는 제가 이해하고 설명할 수 있는 형태로 만들고 싶습니다.
ari Space