diff --git a/ideas/250914_rb8001_리팩토링_계획.md b/ideas/250914_rb8001_리팩토링_계획.md new file mode 100644 index 0000000..a53a28e --- /dev/null +++ b/ideas/250914_rb8001_리팩토링_계획.md @@ -0,0 +1,128 @@ +# 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 브랜치별 단계적 작업 +- 각 단계 완료 후 전체 테스트 +- 문제 발생 시 이전 커밋으로 복원 \ No newline at end of file