# RB8001 리팩토링 계획

**작성일**: 2025-09-14
**목표**: 로빙 철학 반영, 역할 기반 명명, main.py 최소화

## 현재 문제점
- main.py 732줄 (과도한 책임)
- service/manager/handler 등 모호한 용어 혼재
- 파일당 500줄 이상 대형 파일 다수
- 스킬/커맨드/라우터 역할 중복

## 제안 구조

```
rb8001/
├── main.py                    # 앱 부팅만
├── body/                      # 로빙의 몸 (순수 로직)
│   ├── brain.py              # 의사결정
│   ├── memory/
│   │   ├── store.py          # 메모리 저장/검색
│   │   └── scoring.py        # 중요도 계산
│   ├── emotion/              # 감정 시스템
│   └── stats.py              # 5대 스탯
│
├── soul/                      # 로빙의 영혼 (DB/정체성)
│   ├── persistence.py        # PostgreSQL
│   ├── identity.py           # ROBEING_ID, DID
│   └── state_client.py       # State Service 연동
│
├── skills/                    # 능력 (내부 실행 or 외부 호출)
│   ├── email.py              # skill-email 연동
│   ├── news.py               # skill-news 연동
│   ├── slack_dm.py           # DM 전송
│   └── companyx_news.py      # 컴퍼니엑스 뉴스
│
├── interfaces/                # 세상과의 접점
│   ├── slack.py              # Slack 이벤트/인터랙티브
│   ├── api.py                # REST 라우트
│   └── gateway.py            # Frontend 연동
│
├── tools/                     # 도구 (함수형)
│   ├── llm/
│   │   ├── gemini.py
│   │   ├── claude.py
│   │   ├── openai.py
│   │   └── selector.py      # 모델 선택
│   ├── http.py               # 공용 AsyncClient
│   └── slack_client.py       # Slack API 클라이언트
│
├── jobs/                      # 스케줄 작업
│   ├── headlines.py          # 깡프로 뉴스 (9:10)
│   ├── daily_summary.py      # 일일 브리핑 (9:01)
│   └── companyx.py           # 컴퍼니엑스 (10:00)
│
├── config/
│   ├── settings.py           # 환경 설정
│   └── constants.py          # 상수
│
└── utils/
    ├── logger.py             # 로깅
    ├── auth.py               # JWT/서명 검증
    └── validators.py         # 입력 검증
```

## 주요 매핑 (현재 → 제안)

| 현재 경로 | 제안 경로 | 이유 |
|----------|----------|------|
| app/brain/decision_engine.py | body/brain.py | 의사결정=뇌 |
| app/memory/manager.py | body/memory/store.py | 기억 저장 |
| app/core/emotion/* | body/emotion/* | 감정=몸의 일부 |
| app/state/database.py | soul/persistence.py | DB=영혼 보존 |
| app/router/slack_handler.py | interfaces/slack.py | Slack=인터페이스 |
| app/skills/dm_skill.py | skills/slack_dm.py | 명확한 역할 |
| app/llm/* | tools/llm/* | LLM=도구 |
| main.py 스케줄 함수들 | jobs/* | 관심사 분리 |

## 이행 단계

### 1단계: main.py 슬림화
- 스케줄 등록 → jobs/__init__.py
- 엔드포인트 정의 → interfaces/api.py
- 목표: 100줄 이하

### 2단계: 인터페이스 분리
- Slack 이벤트 → interfaces/slack.py
- Frontend API → interfaces/gateway.py
- 입력만 받고 body/* 호출

### 3단계: 스킬 정리
- 뉴스 조립 → jobs/headlines.py
- 용어 추출 → tools/llm 활용
- DM 로직 → skills/slack_dm.py

### 4단계: 영혼 통합
- DB 저장 → soul/persistence.py 단일 경유
- 스탯 관리 → soul/state_client.py

### 5단계: 의도 분석
- interfaces/api.py 진입점에서 처리
- 프리필터 → 제로샷 → 임계치 체크

## 설계 원칙

1. **1파일 1역할**: 200-400줄 유지
2. **함수형 우선**: 순수 함수, 부작용 최소화
3. **NO HARDCODING**: config/settings.py만 참조
4. **명확한 명명**: service/manager/handler 금지
5. **HTTP 스킬**: 외부 스킬은 HTTP로만

## 예상 효과

- 코드 가독성 향상
- 테스트 용이성 증대
- 로빙 철학과 코드 구조 일치
- 신규 개발자 온보딩 단순화

## 위험 요소

- 대규모 파일 이동으로 인한 import 오류
- 기존 테스트 코드 수정 필요
- CI/CD 파이프라인 경로 업데이트

## 롤백 계획

- Git 브랜치별 단계적 작업
- 각 단계 완료 후 전체 테스트
- 문제 발생 시 이전 커밋으로 복원