**task-1838_5.5 완료 보고** **task-1838_5.5 완료 보고서** **핵심 결과** routes_get.py(2448줄)와 routes_post.py(2107줄)로 핸들러를 추출하고, server.py를 1657줄 thin dispatcher로 축소 완료. 전체 360건 테스트 통과, 15+ 엔드포인트 curl 검증 완료. ## 작업 내용 ### 1. routes_get.py 생성 (신규, 2448줄) - do_GET의 68개 인라인 핸들러를 `handle_get_*` free function으로 추출 - 9개 헬퍼 함수 이동: `_get_usage_status`, `_parse_design_md_index`, `_parse_checklist_md`, `_get_campaign_data`, `_get_groupchat_*`, `_handle_watchdog_history`, `_handle_absorption_api` - ads_integration.py와 동일한 `(status_code, data)` 튜플 반환 패턴 적용 - 바이너리 응답(배너 이미지, ZIP 다운로드)은 `{"_binary": True, "content": bytes, ...}` 패턴 ### 2. routes_post.py 생성 (신규, 2107줄) - do_POST의 29개, do_PUT의 3개, do_DELETE의 3개 핸들러를 free function으로 추출 - `_toggle_checklist_item`, `_parse_checklist_md` 헬퍼 이동 - multipart upload 핸들러는 `raw_body`와 `content_type`을 인자로 받는 패턴 ### 3. server.py 리팩토링 ( **발견/해결 이슈 7건** 1. **handle_get_campaign 인자 누락** — server.py에서 `handle_get_campaign()` 호출 시 `data_loader` 인자 미전달. `handle_get_campaign(self.data_loader)`로 수정 2. **test_wiki_upload.py mock 대상 불일치** — mock 대상 모듈을 `dashboard.server`에서 `dashboard.routes_post`로 변경 3. **test_wiki_sync.py mock 대상 불일치** — `_WIKI_ENTRIES_PATH` 등 상수의 mock 대상을 `dashboard.routes_post`/`dashboard.wiki_engine`으로 변경 4. **test_groupchat_api.py/test_usage_status.py class method 참조** — 제거된 class method 대신 routes_get free function 호출로 변경 5. **_IMAGE_TASKS 상태 분리 버그 (마아트 발견)** — server.py가 자체 `_IMAGE_TASKS` dict를 정의하고 routes_post.py는 blog_writer의 dict를 사용하여 POST로 생성한 이미지 작업을 GET에서 조회 불가. server.py의 중복 정의를 제거하고 blog_writer에서 import하여 동일 객체 공유로 수정 6. **test_composite_status.py 4건 실패** — 미해결: data_loader 내부 composite tasks 로직. 본 작업 범위 외 7. **test_background_blog_generate_exception_sets_failed** — 미해결: blog_writer 에러 핸들링 동작. 본 작업 범위 외