# server.py do_GET 리팩토링 — 3,222줄 단일 메서드 분리

## Lv.3 작업

## 문제
`/home/jay/workspace/dashboard/server.py`의 `do_GET` 메서드가 **3,222줄** (line 1251~4473)로 pyright "Code too complex to analyze" 경고 발생. 모든 GET 엔드포인트가 하나의 if-elif 체인으로 연결.

## 현재 구조
```python
def do_GET(self):
    if self.path == "/api/campaign":
        ...  # 50줄
    elif self.path.startswith("/api/naver-blog/"):
        ...  # 200줄
    elif self.path == "/api/absorption/status":
        ...  # 100줄
    # ... 총 50+ 분기, 3,222줄
```

## 목표 구조
```python
def do_GET(self):
    # 라우터 패턴으로 분리
    route_handlers = {
        "/api/campaign": self._handle_campaign,
        "/api/records": self._handle_records,
        "/api/absorption": self._handle_absorption,
        "/api/naver-blog": self._handle_naver_blog,
        "/api/todo": self._handle_todo,
        "/api/wiki": self._handle_wiki,
        # ...
    }
    for prefix, handler in route_handlers.items():
        if self.path == prefix or self.path.startswith(prefix):
            return handler()
    # static files
    return self._handle_static_files()
```

## 구현 원칙
1. **기능 변경 없음**: 순수 리팩토링 — 모든 API 동작 동일 유지
2. **도메인별 핸들러 분리**: `_handle_campaign()`, `_handle_naver_blog()`, `_handle_absorption()` 등
3. **prefix 매칭**: 정확 매칭 + startswith 매칭 2단계
4. **정적 파일 핸들러 분리**: dashboard/ 하위 파일 서빙 로직 별도
5. **단계적 분리**: 한 번에 전체 리팩토링하지 말고, 가장 큰 블록부터 순차 추출
6. **테스트 회귀 0건**: 기존 test_server.py 전체 통과 필수

## 주의사항
- server.py는 **시스템 공유 파일** — 변경 시 모든 팀에 영향
- `do_POST`, `do_PUT`, `do_DELETE`도 같은 패턴이지만, 이번에는 `do_GET`만 분리
- helpers.py에 이미 분리된 함수들은 유지, 추가 분리만
- 리팩토링 후 pyright 경고 해소 확인

## 참조 파일
- server.py: `/home/jay/workspace/dashboard/server.py`
- 기존 테스트: `/home/jay/workspace/dashboard/tests/test_server.py`
- helpers.py: `/home/jay/workspace/dashboard/helpers.py`

## 테스트
1. 기존 test_server.py 전체 통과
2. 각 API 엔드포인트 수동 curl 테스트 (최소 5개)
3. pyright: "Code too complex" 경고 해소 확인
4. 정적 파일 서빙 정상 동작

## 보고서
`/home/jay/workspace/memory/reports/task-{TASK_ID}.md`