# task-1838_5.5 완료 보고서

## SCQA

**S**: dashboard/server.py가 4880줄로 비대해져 유지보수가 어렵다. Phase 2.4에서 7개 모듈 import 교체를 완료한 상태.

**C**: GET/POST 핸들러가 모두 server.py 한 파일에 인라인으로 존재하여, 코드 탐색과 수정 시 인지 부하가 높고 충돌 위험이 크다.

**Q**: GET/POST 핸들러를 별도 모듈로 추출하여 server.py를 2000줄 이하 core로 축소할 수 있는가?

**A**: 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 리팩토링 (4880줄 → 1657줄, -66%)
- do_GET/do_POST/do_PUT/do_DELETE를 thin dispatcher로 변환
- 핸들러 호출 → `(code, data)` 반환값으로 `send_api_response`/`_send_error_response` 디스패치
- handle_stream (SSE), 인증 로직, 정적 파일 서빙, DashboardServer 클래스는 server.py 잔류
- 이동된 헬퍼 메서드 및 모듈 레벨 글로벌 변수 제거

### 4. 테스트 파일 수정 (4개 파일)
- `test_wiki_upload.py`: mock 대상을 `dashboard.routes_post`로 변경
- `test_wiki_sync.py`: mock 대상을 `dashboard.routes_post`/`dashboard.wiki_engine`으로 변경
- `test_groupchat_api.py`: class method 호출을 free function 호출로 변경
- `test_usage_status.py`: `_get_usage_status` 호출을 routes_get free function으로 변경

## 산출물

- `/home/jay/workspace/dashboard/routes_get.py` (신규)
- `/home/jay/workspace/dashboard/routes_post.py` (신규)
- `/home/jay/workspace/dashboard/server.py` (수정)
- `/home/jay/workspace/dashboard/tests/test_wiki_upload.py` (수정)
- `/home/jay/workspace/dashboard/tests/test_wiki_sync.py` (수정)
- `/home/jay/workspace/dashboard/tests/test_groupchat_api.py` (수정)
- `/home/jay/workspace/dashboard/tests/test_usage_status.py` (수정)

## 검증 결과

### 테스트 결과
- pytest: **360 passed, 5 failed, 2 skipped** (5건 실패는 기존 실패 — 본 작업 범위 외)
  - `test_composite_status.py` (4건): data_loader 내부 로직, routes 분할 무관
  - `test_server.py::test_background_blog_generate_exception_sets_failed` (1건): blog_writer 에러 핸들링, routes 분할 무관

### curl 엔드포인트 테스트 (19건)
- GET 15건: `/api/status`, `/api/projects`, `/api/stats`, `/api/org`, `/api/teams`, `/api/tasks`, `/api/todo`, `/api/skills`, `/api/server-stats`, `/api/wiki/stats`, `/api/wiki/entries`, `/api/campaign`, `/api/absorption/status`, `/api/naver-blog/write/status`, `/api/banner-editor/list` — 전체 200 OK
- POST 2건: `/api/todo` (200 OK), `/api/wiki/refine/cancel` (400 — 정제 미진행으로 정상)
- PUT 1건: `/api/todo` (404 — 존재하지 않는 ID로 정상)
- DELETE 1건: `/api/todo` (404 — 존재하지 않는 ID로 정상)

### server.py 줄 수
- 변경 전: 4880줄
- 변경 후: 1657줄 (목표 2000줄 이하 달성)

## 발견 이슈 및 해결

### 자체 해결 (5건)
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하여 동일 객체 공유로 수정

### 범위 외 미해결 (2건)
1. **test_composite_status.py 4건 실패** — data_loader 내부 composite tasks 로직. 본 작업 범위 외
2. **test_background_blog_generate_exception_sets_failed** — blog_writer 에러 핸들링 동작. 본 작업 범위 외

## 모델 사용 기록
- 불칸(백엔드) / routes_get.py 생성 / sonnet
- 불칸(백엔드) / routes_post.py 생성 / sonnet
- 불칸(백엔드) / server.py 디스패처 리팩토링 / sonnet
- 아르고스(테스터) / test_wiki_upload.py 수정 / sonnet
- 아르고스(테스터) / test_wiki_sync.py 수정 / sonnet
- 아르고스(테스터) / test_groupchat_api.py 수정 / sonnet
- 아르고스(테스터) / test_usage_status.py 수정 / sonnet

## 세션 통계
- 총 도구 호출: 69회

### 수정 파일 목록
- bash_cmd: 25회 (Bash)
- /home/jay/workspace/dashboard/tests/test_wiki_upload.py: 19회 (Edit)
- /home/jay/workspace/dashboard/tests/test_wiki_sync.py: 11회 (Edit)
- /home/jay/workspace/dashboard/server.py: 6회 (Edit)
- /home/jay/workspace/dashboard/routes_post.py: 2회 (Edit, Write)
- /home/jay/workspace/memory/reports/task-1838_5.5.md: 2회 (Edit, Write)
- /home/jay/workspace/dashboard/routes_get.py: 1회 (Write)
- /home/jay/workspace/dashboard/tests/test_groupchat_api.py: 1회 (Edit)
- /home/jay/workspace/dashboard/tests/test_usage_status.py: 1회 (Write)
- /home/jay/workspace/memory/tasks/task-1838_5.5.md: 1회 (dispatch)

### 도구 사용 현황
- Edit: 39회
- Bash: 25회
- Write: 4회
- dispatch: 1회

