Skip to content

[1.95] 구형 v2 경로 제거와 fixture 모드 명시화 - #314

Merged
chowon442 merged 3 commits into
devfrom
worktree-task-1.95
Oct 20, 2026
Merged

chowon442 merged 3 commits into
devfrom
worktree-task-1.95

Conversation

@chowon442

@chowon442 chowon442 commented Oct 20, 2026 •

Copy link
Copy Markdown
Member

📌 관련 이슈

🏷️ PR 타입

  • ✨ 기능 추가 (Feature) — 개발 API 모드 명시 선택
  • 🐛 버그 수정 (Bug Fix)
  • ♻️ 리팩토링 (Refactoring)
  • 🗑️ 코드 제거 (Chore)
  • 📝 문서 수정 (Documentation)
  • 🎨 스타일 변경 (Style)
  • ✅ 테스트 추가 (Test)

📝 작업 내용

1.94 뒤 화면이 쓰지 않는 구형 v2 대화 경로를 지우고, 개발 서버의 MSW 자동 실행을 VITE_API_MODE 명시 선택으로 바꿨다. 새 기능은 없다.

1. 구형 v2 경로 제거 (02d66c5)

각 항목은 지우기 전에 grep으로 사용처를 확인했다. 지운 것은 모두 화면 import 0건이었고, 다른 기능이 쓰는 코드는 남겼다.

대상 처리
v2 SSE 타입·parser editor/types/sse_types.ts, editor/utils/parse_sse_stream.ts 파일 삭제, editor_types re-export 제거
토큰 누적·노드명 분기 chat/hooks/useChatMessages.ts 파일 삭제, hooks/index.ts export 제거
순환 진행 문구 rightpanel/{RightPanel,ChatMessages,ThinkingBar}.tsx 삭제. 이들만 쓰던 MessageContent·MessageAttachments·chat/types/chat_types.ts·rightpanel/index.ts도 삭제
구형 conversation 호출 editor_api createConversation·createConversationJson·getConversationDetail, useEditorQueries useCreateConversation·useConversationDetail 삭제. 이들만 쓰던 요청·상세 타입(conversation_types)도 삭제
Front 직접 차감 useUseCredit, credit_api.useCredit, CreditUsageRequest/Result·CreditBalanceDto 삭제. 잔액 표시(useCreditHistory, 프로필 credit, creditKeys)는 유지
Note 선생성 createNote·useCreateNote·generateNoteTitle, CreateNoteRequest/Response·GenerateTitleRequest와 그 응답 하위 타입 삭제
구형 이력 전체 조회 getNoteDetailWithAllConversations·useNoteDetail({ fetchAllConversations }) 삭제(useChatMessages만 썼다)
useHomeSend FirstMessageState(location.state 첫 대화) 삭제
구형 mock: editor.ts POST /api/conversations SSE·GET /api/conversations/:id·토큰 시나리오, notes.ts POST /api/notes, credit.ts POST /api/credits/use 삭제

남긴 것 (S08 밖 사용처)

  • searchConversations와 검색 타입: 검색(useConversationSearch)이 쓴다.
  • uploadCanvasImage·getTools·useNoteAssets: 입력창·@·# 메뉴가 쓴다.
  • 노트 상세 NoteDetailResponse.conversations 타입: 노트 상세 API 응답 형태다. useNoteDetail은 ChatPage 제목과 StorageContent가 쓴다.
  • features/assets/utils/upload_attachments.ts: 현재 사용처 0건이다(삭제된 useChatMessages만 썼다). 첨부 전송은 S09 범위라 남겼다 — S09 인계: 재사용하거나 지운다.
  • 같은 이유로 사용처가 0건이 된 SparkleIcon(삭제된 ChatMessages만 씀)은 1회차 리뷰 뒤 삭제했다.
  • 위치를 옮겨야 하는 공유 타입은 없었다. 지운 타입은 모두 구형 경로와 구형 mock만 썼다.

2. 개발 API 모드 명시 선택 (6b370bc)

  • src/app/api_mode.ts resolveApiMode:
    • 값이 없거나 server면 server, fixture면 fixture다.
    • 그 밖의 값은 오류를 던진다. fixtures 같은 오타가 조용히 다른 모드로 가지 않게 하려는 것이다.
    • vite.config.ts가 serve일 때 같은 함수로 검사해, 잘못된 값이면 pnpm run dev 시작이 실패한다.
  • main.tsx: import.meta.env.DEV && resolveApiMode(VITE_API_MODE) === "fixture"일 때만 ./mocks/browser를 동적 import해 worker를 시작한다.
    • 기본 pnpm run dev는 MSW 없이 vite proxy로 DEV_API_PROXY_TARGET(기본 http://localhost:8080)에 간다.
  • fixture handler 구성 (src/mocks/handlers.ts):
    • 1.93 createBrowserRunFixtureServer()를 그대로 쓴다. 위치는 src/features/run/session/mocks/에 두어 1.93·1.94 테스트 import를 건드리지 않았다.
    • 대화 밖 화면(인증·사용자·노트·스토리지·크레딧·도구·검색)은 남은 개발 mock으로 응답해, Server 없이도 화면이 뜬다. 인증도 mock이라 로그인·토큰이 mock 토큰으로 응답한다.
    • 개발 mock의 BASE_URL은 API client처럼 VITE_API_BASE_URL || ""다.
  • 운영 build: vite.config.ts에 build 전용 plugin을 넣어 public/mockServiceWorker.js를 dist에서 지운다. public 파일은 그대로 복사되기 때문이다.
  • README: 환경 변수(빈 VITE_API_BASE_URL, 필수 OAuth 변수, DEV_API_PROXY_TARGET)와 두 모드 실행법 표를 넣었다.

✅ 체크리스트

공통

  • 셀프 리뷰를 완료했습니다
  • 코드 리뷰를 받을 준비가 완료되었습니다
  • pnpm tsc --noEmit 타입 체크를 통과했습니다 (tsc -p tsconfig.app.json, tsconfig.test.json, tsconfig.node.json, pnpm run build의 tsc -b)
  • 브랜치명 컨벤션을 준수했습니다 — 오케스트레이터가 지정한 worktree-task-1.95 사용

인증 관련 변경 시

  • 카카오 / 네이버 로그인 흐름에 영향이 없음을 확인했습니다 — 인증 코드 변경 없음

🧪 검증

grep 결과 (DoD)

grep -rnE 'SSEv2|parseSSEStream|parse_sse_stream|sse_types|llm\.token|token\.delta|node\.started|node\.progress|isStreaming|statusText|streamingText|useChatMessages|ThinkingBar|LOADING_MESSAGES|loadingMessage|useUseCredit|credits/use|CreditUsage|useCreateNote|createNote\b|generateNoteTitle|generate-title|FirstMessageState|createConversationJson|getConversationDetail|isStream|fetchAllConversations|getNoteDetailWithAllConversations' src | grep -v '^src/test/contracts/'
src/shared/api/client.test.ts:90:          statusText: "OK",                       ← HTTP Response.statusText (무관)
src/shared/api/client.test.ts:97:        statusText: "Unauthorized",               ← HTTP Response.statusText (무관)
src/features/chat/run/conversation_screen.test.tsx:271:  call.includes("/generate-title") ||   ← 1.94 회귀 테스트: 호출되지 않음을 단언
src/features/chat/run/conversation_screen.test.tsx:272:  call.includes("/api/credits/use") ||   ← 1.94 회귀 테스트: 호출되지 않음을 단언
  • 제품 코드(src/** 테스트 밖)에서 v2 SSE·토큰 상태·순환 문구·직접 차감·Note 선생성 경로는 0건이다.
  • 계약 사본 src/test/contracts/에는 isStream 2건이 있다(requests/invalid/unknown-field.json:6, build_fixtures.py:1111). 둘 다 모르는 필드를 거부하는지 보는 invalid fixture라 제거 대상이 아니다.
  • 문자열 응답 fallback(typeof content === "string" 류)도 0건이다.
  • text/event-stream을 읽는 코드는 features/run(v1 parser) 하나뿐이다.

운영 build 산출물

pnpm run build 뒤 grep -rlE 'msw|setupWorker|mockServiceWorker|createBrowserRunMockServer|VITE_API_MODE|browser_run_stream' dist가 0건이다.

  • dist 목록: assets favicon.svg fonts index.html landing pdf.worker.min.mjs.
  • 변경 전에는 dist/mockServiceWorker.js가 있었다.

두 모드 브라우저 확인

vite --port 5195와 headless Chromium으로 확인했다(OAuth env는 더미 값).

  • 기본(server): 페이지에서 fetch('/api/conversations/1/messages?limit=1')을 보냈다.
    • service worker 등록 0개.
    • proxy가 localhost:8080으로 보냈고 ECONNREFUSED → 500이 났다(로컬 Server 미기동).
  • VITE_API_MODE=fixture: 같은 요청에 다음을 확인했다.
    • [MSW] Mocking enabled, 등록 1개, 페이지 controlled.
    • 응답 200(browser-run-v1 fixture).
  • VITE_API_MODE=fixtures(오타): VITE_API_MODE는 "server" 또는 "fixture"여야 합니다 오류가 났고, MSW는 등록되지 않았다.

로컬 실행

  • pnpm test(flock): 22 files, 843 passed / 2 skipped. 새 src/app/api_mode.test.ts 3건 포함.
    • 첫 실행에서 1.94 conversation_screen.test.tsx의 "홈 첫 질문" 1건이 실패했다.
    • 같은 코드로 다시 돌리니 통과했다. 다른 세션과 같이 돌던 부하 중의 timing flake로 본다(이 PR은 그 테스트와 대상 코드를 바꾸지 않았다). CI 결과로 확인한다.
  • 변경 파일 eslint --max-warnings=0, prettier --check 통과.
  • pnpm run build(flock) 통과(기존 chunk 크기 경고만).

CI 결과는 코멘트로 남긴다.

📎 기타 참고사항

1.96 인계 — 실행법

  • 실제 Server 연결(기본): 로컬 Server를 http://localhost:8080에 띄운 뒤 pnpm run dev. 다른 Server는 .env.local의 DEV_API_PROXY_TARGET으로 지정한다.

  • fixture: VITE_API_MODE=fixture pnpm run dev.

  • fixture run Server는 페이지 메모리에 있어 새로고침하면 run이 사라진다.

  • 이 worktree처럼 .env가 없으면 auth_api가 OAuth env 누락으로 import 시점에 throw해 앱이 뜨지 않는다(기존 동작). README에 필수로 적었다.

  • fixture 모드에서 대화로 새로 생긴 Note(9001~)는 노트 목록·상세 mock에 없다(1.94부터 있던 한계). 제목이 기본값으로 보이고, 이름 변경·삭제는 proxy로 나가 실패한다. README에 적었다.

리뷰 1회차 반영 (1f45c4b)

# 처리
R1 fixture 새 Note가 notes mock에 없음 반영 — README에 한계를 적었다. notes mock을 fixture와 잇는 작업은 하지 않았다(새 기능)
R2 mock BASE_URL fallback 반영 — mock 6개를 VITE_API_BASE_URL || ""로 바꿨다. .env 없는 상태로 fixture를 띄워 GET /api/users/me가 mock 200을 받는 것을 확인했다(전에는 undefined/api/...라 bypass)
R3 잘못된 VITE_API_MODE 반영 — dev server 시작 때 실패한다. VITE_API_MODE=fixtures vite → error when starting dev server: Error: VITE_API_MODE는 …, exit 1
R4 auth mock 포함 반영 — handlers 주석을 실제 동작에 맞췄고, README 표·메모에 인증 mock을 넣었다
R5 미사용 모듈 SparkleIcon 삭제. upload_attachments는 S09 인계로 명시
R6 note 상세 구형 conversations 미반영 — Server 응답에 이 필드가 남아 있는 동안 타입을 유지한다. 후속 메모: Server가 필드를 빼는 시점(S14 등)에 타입과 mock을 정리
R7 build 뒤 worker 삭제 방식 미반영 — 현재 구성에서는 정확하다. 후속 메모: worker를 dev 전용 디렉터리로 옮기거나 CI에 test ! -e dist/mockServiceWorker.js를 추가
R8 PR 본문 grep 문구 반영 — 계약 사본의 isStream 2건(unknown-field 거부 fixture)을 명시

로컬 결과:

  • pnpm test 22 files 843 passed / 2 skipped
  • 변경 파일 eslint·prettier, tsc app·node 통과
  • pnpm run build 통과. dist grep 0건, worker 없음

🤖 Generated with Claude Code

chowon442 and others added 2 commits October 20, 2026 16:16
…tPanel/ChatMessages/ThinkingBar 순환 문구, 직접 크레딧 차감, Note 선생성·제목 생성, 구형 conversation 호출과 mock (1.95)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…fixture), 기본은 실제 Server proxy, 운영 build에서 MSW worker 제외, README 두 모드 실행법 (1.95)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@chowon442

Copy link
Copy Markdown
Member Author

CI run 39385603000 통과: test 22 files 843 passed / 2 skipped(로컬 첫 실행의 1.94 timing flake는 CI에서 재현되지 않음), 변경 파일 eslint --max-warnings=0, typecheck:test, build.

…E_URL 빈 값 fallback, auth mock 포함 주석·README 정정, fixture 새 Note 한계 명시, 미사용 SparkleIcon 삭제

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@chowon442

Copy link
Copy Markdown
Member Author

리뷰 1회차 반영 1f45c4b push. CI run 39386854345(headSha 1f45c4b) 통과: test 22 files 843 passed / 2 skipped, 변경 파일 eslint, typecheck:test, build. 반영/미반영 표는 본문 '리뷰 1회차 반영' 절.

@chowon442
chowon442 merged commit 306c55a into dev Oct 20, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feat] 구형 v2 경로 제거와 fixture 모드 명시화 [1.95]

1 participant