Repository navigation
docs: 서비스 기획과 화면별 사용자 흐름 정리 - #8
Merged
Merged
Conversation
bigmooon
marked this pull request as ready for review
October 11, 2026 06:08
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Changes
시스템 아키텍처를 사용자가 제공한 원본 PNG로 교체하고, 확대해서 볼 수 있는 원본 링크를 추가했습니다. 사용자 흐름 Mermaid와 구현 설명은 유지했습니다.
인증·세션 복구부터 TODO·퀘스트·보상·피드·댓글·포모도로·회고까지 10개 사용자 단계를 실제 API와 연결했습니다.
Celery 작업과 요청 내 AI 대기, Submit/Poll 중계, 저장·재시도·새로고침 복구를 구분했습니다.
기획 흐름도와 자기관리 × 정서적 연결 포지셔닝 그림을 추가하고, 관련 코드·Drive 문서·시장조사 출처를 연결했습니다.
기존 담당 내용, 리서치 수치, 모델 평가 결과·조건·한계, 실행 명령을 유지했습니다.
별도 교차검증 파일과 README의 내부 점검 절을 정리하고, 전체 검토 기록을 아래 Notes로 옮겼습니다.
Checklist
apps/,common/,config/,infrastructure/)config.settings.*문서와 SVG만 변경했습니다. 구현 동작과 모듈 경계는 유지하며, 기존 코드의 동작을 문서에 반영했습니다.
Test
make testmake lintgit diff --check미체크 항목은 이번 문서 수정에서 재실행하지 않았습니다. README의 기존 테스트·평가 수치는 당시 결과이며 이번 수정의 새 실행 결과가 아닙니다. 최초 검토에서는 코드 경로 82개를 확인했고, 검토 기록을 PR로 옮긴 뒤 저장소에 남은 코드 링크 76개와 상대 문서 링크를 다시 검사했습니다.
Notes
세 저장소 교차검증: 설계 차이, 코드 근거 및 검증 기록
몽글마을 Web·Server·AI README 교차검증
검토일: 2026-10-10. 소스 정적 검토 기준이며 실제 운영 서버·GPU·RDS 접속 검증이나 성능 재측정 결과가 아니다. 코드는 변경하지 않았고 README와 이 근거 기록만 수정한다.
기준 커밋
먼저 확인한 점검 결과
수정 계획과 적용
설계 문서와 현재 코드의 차이
원본: 시스템 아키텍처, 시스템 구성도, 화면 설계서, 시나리오 설계서. Drive 연결 도구로 본문을 읽었으며 시스템 아키텍처 PDF의 그림·본문도 렌더링해 확인했다. 원본 문서는 수정하지 않았다.
/posts/전체 배열 수신 후 Web visibleCount로 표시 분할; 서버 cursor pagination 없음전체 구조와 사용자 흐름
flowchart TB WEB["Web<br/>React · Phaser"] SERVER["Server<br/>Django · Celery"] AI["AI<br/>FastAPI · 추론"] DB["관계형 데이터<br/>MySQL"] MEDIA["이미지 객체<br/>S3"] WEB -->|제품 API| SERVER SERVER -->|내부 AI API| AI SERVER -->|도메인 저장| DB AI -->|생성 이미지 업로드| MEDIA이 그림은 요청·저장 방향을 요약합니다. Web은 AI API를 직접 호출하지 않습니다. 원본 사진은 Django가 발급한 presigned URL로 Web이 S3에 직접 PUT하며, Django는 이미지 키·메타데이터와 캐릭터 생성 감사 JSON을 관리합니다. AI가 결과를 HTTP 응답/폴링 결과로 반환하면 Django가 도메인 DB에 반영합니다. S3 정적 Web 배포와 미디어 객체 저장은 용도를 구분합니다. Redis는 Server의 Celery broker/result 및 인증 캐시이고, AI job·플래너 대화는 별도 메모리 상태입니다. 이 그림의 MySQL은 제품 DB 구성이며, Django 기본 settings는 DATABASE_URL 미설정 시 SQLite로 대체됩니다. 설정 근거.
근거: src/shared/api/client.ts · src/features/character/api.ts · apps/characters/tasks.py · infrastructure/storage/s3.py · api/deps.py
POST /characters/generation-jobs/→ 202;GET /characters/generation-jobs/{id}/POST /v1/character→ 202 후GET /v1/character/{id}폴링CharacterGenerationJobDB 상태 + AI 메모리 job. 성공 후 사용자의POST /characters/로 입주POST /todos/generate/의 최종 응답 대기POST /v1/todo/generate및GET /v1/todo/generate/{id}POST /todos/chat/→ 202;GET /todos/chat/{id}/폴링/v1/todo/chat제출·조회 중계/v1/quest/generate제출·조회POST /v1/feed/generate,/v1/reply/generate결과 대기Web → Django 경로에는
/api/v1을 앞에 붙입니다. 캐릭터의 Server job ID와 AI job ID는 서로 다르며, 플래너는 AI job ID를 중계합니다. Submit/Poll이 곧 Celery 사용이나 영속 복구를 뜻하지는 않습니다.근거: apps/todos/views.py · apps/todos/ai_client.py · apps/characters/tasks.py · apps/posts/tasks.py · api/todo_creation/router.py · api/quest_generation/router.py
auth/store.ts,auth/api.ts,shared/api/client.tsPOST /auth/login,/auth/token/refresh;GET /auth/me/; Kakao 교환·가입 보완src/features/auth/store.ts · apps/users/urls.py · apps/users/refresh_token_service.py
character/api.ts,pendingJob.ts,App.tsxPOST /characters/입주/v1/character→ persona·이미지·외형 결과src/features/character/api.ts · apps/characters/views.py · api/character_creation/router.py
todo/todoApi.ts,planner-chat/plannerApi.ts/todos/generate/,/todos/chat/및 job 조회src/features/planner-chat/plannerApi.ts · apps/todos/ai_client.py · agents/todo_creation/planner/pipeline.py
calendar/CalendarModal.tsx/todos/confirm/,/todos/planner-confirm/,/todos/,/schedules/,/calendar/,/tags//commit은 이 제품 경로에서 호출하지 않음apps/todos/views.py · apps/todos/schedule_urls.py · src/features/calendar/CalendarModal.tsx
previewTodoQuests, TODO·플래너 확정 UI/todos/quest-preview/또는 확정 중_assign_quests_to_todos/v1/quest/generate; TODO ID와 캐릭터 정보로 매핑. TODO 내용은 LLM에 전달하지 않음apps/todos/views.py · agents/quest_generation/pipeline.py
completeTodo, App/캘린더 상태 갱신PATCH /todos/{id}/complete/→ Todo·Quest 완료, 잔액·거래 기록 → DB commit 후 피드 예약src/features/todo/todoApi.ts · apps/todos/views.py
generate_feed_post→ AI 호출 → Post 저장·알림 생성/v1/feed/generate: 장면 프롬프트 → 이미지 → S3 → 캡션 → 결과apps/posts/tasks.py · agents/feed_generation/pipeline.py
feed/api.ts,FeedModal.tsx,PostScreen.tsx/posts/,/posts/{id}/comments/,/posts/{id}/like/; 댓글 commit 후 600초 지연 예약/v1/reply/generate→ Reply 저장. 자기 캐릭터의 개인 피드src/features/feed/api.ts · apps/posts/views.py · apps/posts/tasks.py
pomodoro/PomodoroHud.tsx: 25분/5분, 종료 시 다음 모드에서 정지localStorage의 종료 시각으로 복원src/features/pomodoro/PomodoroHud.tsx
reflection/api.ts: 당일 문맥·과거 회고 조회, 작성·수정/reflections/context/{date}/,/reflections/,/{id}/; Reflection·보상 거래 저장src/features/reflection/api.ts · apps/todos/reflection_views.py
저장·실패·배포 상세 근거
인증·영속화 경계
사용자 인증은 Access JWT(기본 1시간)와 opaque Refresh 토큰을 함께 사용합니다. Refresh 원문은 HttpOnly 쿠키(
mongle_refresh_token,/api/v1/auth, SameSite=Lax, 운영 Secure)에 넣고 DB에는 SHA-256 해시를 저장합니다. 갱신은 기존 행을 폐기하고 새 토큰으로 회전합니다. 자동 로그인은 2주, 일반 로그인은 3시간 수명을 사용하며 회전 시 갱신됩니다. AI 호출에는 사용자 JWT 대신 서비스 간X-API-Key를 사용합니다.근거: apps/users/views.py · apps/users/refresh_token_service.py · config/settings/base.py · api/security.py
source-images/직접 PUT, AI의characters/·feeds/생성 이미지, Server의log/character-gen/감사 JSON. 공통AWS_S3_PREFIX사용MemorySaver; Django 도메인 DB와 분리근거: apps/users/models.py · apps/characters/models.py · apps/todos/models.py · apps/tags/models.py · apps/quests/models.py · apps/posts/models.py · apps/users/signup_views.py · apps/users/rate_limit.py · agents/todo_creation/planner/graph.py
작업 실패·재시도와 복구 한계
QUEUED → IN_PROGRESS → SUCCEEDED → CONSUMED와FAILED를 관리합니다. Celery는 AI를 3초 간격·300초 제한으로 조회합니다. 실패/취소 시 생성 횟수를 환불하고 취소와 결과 저장을 행 잠금으로 조정합니다.max_retries=3선언은 있지만 이 task에self.retry()호출은 없어 자동 재제출을 보장하지 않습니다./todos/sync-quests/는 오늘의 미배정 Todo를 처리하는 API지만 현재 Web에서 호출하는 경로는 확인되지 않습니다. Schedule의 자동 Todo 전환 경로도 확인되지 않으므로 자동 복구로 기술하지 않습니다.근거: apps/characters/tasks.py · apps/characters/views.py · apps/todos/views.py · apps/posts/tasks.py · apps/posts/views.py · config/settings/base.py · docker-compose.yml · docker-compose.prod.yml · api/character_creation/jobs.py
/apiproxy →localhost:8000; 배포는 빌드 시VITE_API_BASE주입web:8000Gunicorn → Django. DB 주소는DATABASE_URL, AI 주소는 아래 두 설정군 사용8010/health확인. Compose의 단독 API 실행과 GPU 워커는 별도 구성v*태그 workflow에서 RunPod 템플릿 갱신. FastAPI가 RunPod endpoint를 호출하고 결과를 수집Server의 TODO·퀘스트는
MONGLE_AI_API_BASE/MONGLE_AI_API_KEY, 캐릭터·피드·답글은AI_SERVICE_URL/AI_SERVICE_TOKEN을 사용합니다. 두 키는 연결할 AI의MONGLE_API_KEY와 맞춰야 합니다. 컨테이너에서 호스트 AI에 연결할 때 loopback 대신 도달 가능한 호스트 주소를 설정해야 합니다.이 설명은 배포 설정 검증입니다. 실제 DNS·CloudFront origin·RDS 엔진 버전·RunPod 활성 모델·비밀 환경 변수는 저장소만으로 확정할 수 없습니다. Nginx 대기 제한(120초), Server AI 폴링 기본 예산(150초), Gunicorn 제한(180초)이 달라 동기 대기 경로의 타임아웃 위험도 남아 있습니다.
근거: .github/workflows/deploy-web.yml · vite.config.ts · .github/workflows/deploy-server.yml · nginx/api.conf · Dockerfile · .env.example · .github/workflows/deploy-api.yml · .github/workflows/deploy-workers.yml · docker-compose.yml
검증 기록
기존 Web 121 tests, Server 236 tests·84.16%, AI 3.672/5·0.90/0.90·1.00·SSIM 0.6712→0.8378·20/20·19/20 및 리서치 수치는 유지한다. 기존 평가 조건·한계 문단을 삭제하지 않는다. 이번 검토는 문서 수정이며 모델 성능이나 전체 E2E를 새로 측정하지 않는다.
이번 문서 수정에서 확인한 항목
git diff --check세 저장소 통과. 수정 대상은 README와 이 기록이다. 앱 테스트·GPU 추론·운영 E2E는 이번 문서 수정에서 재실행하지 않았다.기획 배경과 문체 보강
후속 요청에 따라 프로젝트 개요를 대상 사용자 → 사용 경험 → 저장소 역할 순서로 확장했다. 프로젝트 기획서의 1.3
1.4절, 2.12.3절, 4절을 바탕으로 시작·지속의 어려움과 제품 가설을 설명하고,images/product-concept.svg에 세 가지 문제의식과 접근을 시각화했다. 기획서·화면 설계서·시나리오 설계서 링크를 관련 문단에 배치했다. AI README에도 공통 리서치 배경을 추가했다.“이 설명은 … 검증입니다”, “결과를 보존합니다” 등의 편집 작업 중심 표현을 독자를 위한 문장으로 바꿨다. 평가 조건·한계와 코드 근거는 유지했다. 위의 “프로젝트 개요 동일” 검증은 최초 수정 시점의 기록이며, 이번 보강에서는 사용자 요청에 따라 개요를 재작성했다. 담당한 부분·기존 평가 표·리서치 수치·실행 명령은 그대로 유지했다. 제품 가설의 효과를 입증한 결과나 미구현 기능을 추가로 주장하지 않았다.
보강 후 검증: 기획 그림 3개가 동일한 SVG로 정상 로드되며 본문 폭 766px 안에서 760px로 표시된다. 줄바꿈을 다듬은 Mermaid 6개도 다시 렌더링해 문법 오류와 가로 overflow가 없음을 확인했다(시스템 약 370×550px, 사용자 흐름 약 238×406px). 기존 담당 내용·한계·평가 표·연구 백분율·실행 명령 보존 및 82개 코드 경로 검증을 재통과했다.
시장 수요에서 포지셔닝으로 이어지는 기획 논리 보강
후속으로 제공된 발표 캡처 5장과 사용자의 기획 의도를 반영해 README 앞부분을 수요 → 핵심 이용자층 → 지속률의 한계 → 이탈 원인 가설 → 경쟁 서비스 세 유형 → 생산성·키덜트 시장의 교차점 순서로 재구성했다. 개요에 자기관리와 정서적 연결의 결합, 20~30대 여성이라는 핵심 기획 대상을 명시했다. 기존 기능 소개 SVG를 기획 흐름도로 바꾸고 정성적 포지셔닝 SVG를 추가했다.
시장조사 출처 기록에 통계의 기간·모집단·확인 범위를 남겼다. 잡플래닛의 직장인 71.2%, 코리안클릭의 여성 55.8%·20~30대 55.0%, OneSignal의 2024년 리텐션을 구분했다. 기록·루틴 앱 성장 수치는 제공 슬라이드의 재인용 범위로 한정했고 원자료 URL과 지표 정의는 확인되지 않았다. 이탈 원인의 연결과 포지셔닝 좌표는 팀의 가설·목표로 표시했다.
기존 리서치 표는 README의 접을 수 있는 ‘추가 리서치와 저장소별 설계 반영’에 보존했다. 평가 표·조건·한계·담당 내용·실행 방법과 구현/API 설명은 유지했다. 두 SVG는 본문 폭 766px 내에서 760px로 표시되며, 기획 흐름도 글자 가로 넘침과 Mermaid 오류가 없음을 로컬 브라우저에서 확인했다.