docs: deepen workspace-team-project impact research

This commit is contained in:
happybell80 2026-03-16 13:26:13 +09:00
parent 8074f9d236
commit 76380737a9

View File

@ -35,7 +35,10 @@ tags: [workspace, team, project, database, slack, auth, gateway, rag, research]
| `slack_workspace` | 2 |
| `workspace_member` | 9 |
| `team_document` | 145 |
| `startup_valuation` | 13 |
| `slack_channel` | 6 |
| `slack_canvas` | 2 |
| `coldmail_list_config` | 2 |
### 2. `Company-X`는 현재 `company`이면서 동시에 단일 `team`에 거의 모든 실무 데이터가 묶여 있습니다.
- `company.name='Company-X'` 아래에 `team.name='Company-X Team'` 한 건이 존재합니다.
@ -44,7 +47,9 @@ tags: [workspace, team, project, database, slack, auth, gateway, rag, research]
- `user`: 8명
- `slack_workspace`: 1건 (`slack_team_id=T09C98KB933`)
- `team_document`: 129건
- `startup_valuation`: 13건
- `slack_channel`: 4건
- 같은 `slack_workspace.id=59f4aeda-8ad0-4ab7-a818-5ee8dd14f5d1` 아래에는 `coldmail_list_config` 1건도 연결돼 있습니다.
- 즉 현재 운영 현실에서 `Company-X Team`은 단순 팀이 아니라, 사실상 Company-X 전체 실행 컨텍스트처럼 쓰이고 있습니다.
### 3. `workspace_member`는 이름과 달리 현재 `workspace_id` FK가 없습니다.
@ -68,36 +73,53 @@ tags: [workspace, team, project, database, slack, auth, gateway, rag, research]
- 하지만 현재 `main_db`에는 `company`, `team`, `workspace_member`, `slack_workspace`가 존재하고 `workspaces`, `workspace_members`, `slack_workspaces`는 없습니다.
- 즉 auth 문서/마이그레이션 설계와 실제 운영 DB가 이미 어긋나 있습니다.
### 7. `robeing-gateway`는 사용자 라우팅, Slack 토큰 조회, Slack UUID 변환을 모두 `team` 전제로 수행합니다.
### 7. `auth-server` Slack 라우터도 `team``workspace`를 혼용한 상태입니다.
- `auth-server/app/api/slack_router.py`는 Slack 이벤트 payload의 `team_id(T...)`를 읽고도 `SlackWorkspace.team_id == team_id`로 조회하는 경로를 포함합니다.
- `auth-server/app/providers/slack.py`에는 `SlackWorkspace.workspace_id`를 참조하는 제거 경로가 남아 있지만 실제 모델 컬럼은 `team_id`입니다.
- `auth-server/app/models/user.py``WorkspaceMember.__repr__`도 실제로 존재하지 않는 `workspace_id`를 문자열에 포함합니다.
- 즉 인증 서버 안에서도 `workspace`라는 이름과 실제 컬럼 구조가 서로 맞지 않는 코드가 이미 공존합니다.
### 8. `robeing-gateway`는 사용자 라우팅, Slack 토큰 조회, Slack UUID 변환을 모두 `team` 전제로 수행합니다.
- `robeing-gateway/app/database.py``get_user_workspace()``user -> team -> company` 조인으로 사용자 소속을 조회합니다.
- 같은 파일의 `slack_user_to_uuid()``user.team_id -> team.id -> slack_workspace.team_id` 조인으로 Slack 사용자 UUID를 변환합니다.
- `get_slack_bot_token()`은 Slack `team_id(T...)`를 받아 `slack_workspace.slack_team_id`로 토큰을 찾습니다.
- `assign_user_to_workspace()`는 함수 이름과 달리 현재 `workspace_member``user_id`만 기록하며 `workspace_id`를 저장하지 않습니다.
### 8. `rb8001`은 Slack 팀을 내부 `team_id`로 바꾸는 경로와 Company-X 전용 로직 모두를 `team` 중심으로 가정합니다.
### 9. `rb8001`은 Slack 팀을 내부 `team_id`로 바꾸는 경로와 Company-X 전용 로직 모두를 `team` 중심으로 가정합니다.
- `rb8001/app/state/slack_repository.py``slack_workspace.slack_team_id -> slack_workspace.team_id` 조회로 `team UUID`를 반환합니다.
- `rb8001/app/router/slack_handler.py`, `app/services/slack/message_service.py`, `app/services/slack/file_service.py`는 Slack 요청 처리에서 이 변환을 그대로 사용합니다.
- `rb8001/app/services/companyx_grounding_service.py``COMPANYX_TEAM_ID = 79441171-...` 상수를 기준으로 Company-X 사용자 여부를 판정합니다.
- `app/services/naverworks_file_processor.py`, `app/services/ir_deck_analyzer.py`, `app/services/startup_valuation.py`도 문서/분석/RAG 흐름에서 `team_id`를 핵심 인자로 사용합니다.
### 9. RAG/문서 계층은 `team_document`와 컬렉션명 모두 `team_id`에 고정돼 있습니다.
### 10. RAG/문서 계층은 `team_document`와 컬렉션명 모두 `team_id`에 고정돼 있습니다.
- `skill-rag-file/app/api/upload.py`는 업로드 시 `X-Team-Id` 헤더를 필수로 받으며, 먼저 `SELECT 1 FROM team WHERE id = :team_id`로 팀 존재를 검증합니다.
- 같은 서비스는 DB 레코드를 `team_document.team_id`로 저장하고, Chroma 컬렉션 이름도 `skill_rag_file_{team_id}_documents`를 사용합니다.
- `team_document` 145건 중 `Company-X Team` 소속이 129건으로 가장 큽니다.
- 따라서 `Company-X Team`의 의미를 바꾸면 저장 경로, 컬렉션명, 업로드 검증, 재인덱싱 스크립트가 모두 영향권입니다.
### 10. 관리자 대시보드도 사용자/로빙 통계를 `team_id` 기준으로 집계합니다.
### 11. `skill-slack`도 내부 식별자를 `team_id`로 받아 Slack workspace로 역변환합니다.
- `skill-slack/app/state/slack_workspace_repository.py``get_slack_team_id_by_team_id(team_id)`로 내부 팀 UUID를 Slack `slack_team_id`로 바꿉니다.
- `skill-slack/app/api/endpoints/lists.py`를 포함한 Slack Lists 경로는 `X-Team-Id`를 받아 이 변환 결과로 Slack API를 호출합니다.
- 따라서 조직 축을 재정의할 때 `rb8001`뿐 아니라 `skill-slack`도 함께 병행 지원 대상에 넣어야 합니다.
### 12. 운영 DB의 FK는 이미 `company -> team -> slack_workspace -> channel/canvas``team -> document/valuation` 축으로 닫혀 있습니다.
- `team.company_id -> company.id`
- `user.team_id`, `robeing.team_id`, `slack_workspace.team_id`, `team_document.team_id`, `startup_valuation.team_id`가 모두 `team.id`를 참조합니다.
- `slack_channel.slack_workspace_id -> slack_workspace.id`, `slack_canvas.slack_channel_id -> slack_channel.id`, `coldmail_list_config.slack_workspace_id -> slack_workspace.id`도 운영 중입니다.
- 즉 이번 문제는 일부 화면만 바꾸는 수준이 아니라 실제 FK 그래프 자체를 재배치하는 작업입니다.
### 13. 관리자 대시보드도 사용자/로빙 통계를 `team_id` 기준으로 집계합니다.
- `admin-dashboard/backend/state/user_repository.py`는 사용자 응답 모델에 `team_id`를 노출하고 `COUNT(DISTINCT team_id)`를 통계로 사용합니다.
- `admin-dashboard/backend/state/robeing_repository.py``team_id`를 그대로 응답하고 `teams_with_robeings`를 집계합니다.
- 대응 Pydantic 스키마 역시 `team_id: UUID`를 필수 필드로 고정합니다.
### 11. Slack 채널/Canvas 계층은 이미 `project_name`을 임시 보강했지만 FK는 여전히 `team` 계층 위에 걸려 있습니다.
### 14. Slack 채널/Canvas 계층은 이미 `project_name`을 임시 보강했지만 FK는 여전히 `team` 계층 위에 걸려 있습니다.
- `slack_channel``slack_workspace_id -> slack_workspace.id` FK를 가집니다.
- `slack_canvas``slack_channel_id -> slack_channel.id` FK를 가집니다.
- 현재 `C0ALCV5S0FL` 채널에는 `project_name='xvaluelab'`이 들어가 있고, Canvas 2건도 같은 채널에 연결돼 있습니다.
- 하지만 이 `project_name`은 FK가 아니라 보강 필드라서 현재 조직 구조를 교정하지는 못합니다.
### 12. 관련 문서 계층도 이미 `workspace``team`을 혼용하고 있습니다.
### 15. 관련 문서 계층도 이미 `workspace``team`을 혼용하고 있습니다.
- [380_authentication_system.md](../../book/300_architecture/380_authentication_system.md)는 `company vs workspaces 테이블 공존`을 미해결로 적고 있습니다.
- [database/relationships.md](../../book/300_architecture/database/relationships.md)는 `workspaces`, `workspace_member.workspace_id` 같은 구조를 설명하지만, 현재 실DB와 다릅니다.
- [251015_slack_install_workspace_id_error.md](../troubleshooting/251015_slack_install_workspace_id_error.md)와 [251016_troubleshooting_summary.md](../troubleshooting/251016_troubleshooting_summary.md)는 실제 `workspace_member.workspace_id`가 없어서 `user.team_id`를 대신 사용했다고 기록합니다.
@ -117,12 +139,17 @@ tags: [workspace, team, project, database, slack, auth, gateway, rag, research]
- 현재 Company-X 내부문서, 채널, Canvas, grounding 로직이 모두 `Company-X Team UUID`를 사실상 고객/워크스페이스 식별자처럼 사용하고 있습니다.
- 따라서 `team_document`, Chroma 컬렉션명, `COMPANYX_TEAM_ID` 상수, `X-Team-Id` 헤더 규약을 병행 지원 없이 바꾸면 Company-X 질문 응답과 업로드 파이프가 곧바로 회귀할 가능성이 큽니다.
### 4. `workspace_member`는 구조상 가장 위험한 부채 지점입니다.
### 4. 부수 업무 테이블도 이미 `team` 또는 `slack_workspace`에 붙어 있어서 영향 범위가 예상보다 넓습니다.
- `startup_valuation`은 현재 전량이 `Company-X Team`에 연결돼 있습니다.
- `coldmail_list_config``slack_workspace_id`에 묶여 있어 Slack workspace 재배치와 함께 검토해야 합니다.
- 따라서 이번 변경은 Slack 채널만이 아니라 valuation, 콜드메일 운영 설정, 대시보드 집계까지 함께 영향권입니다.
### 5. `workspace_member`는 구조상 가장 위험한 부채 지점입니다.
- 이름은 workspace membership이지만 실제 DB에는 `workspace_id`가 없습니다.
- 코드도 이를 일관되게 다루지 못하고 `workspace_member`를 사용자-로빙 매핑처럼 쓰는 구간과, `user.team_id`를 workspace처럼 대체하는 구간으로 나뉘어 있습니다.
- 따라서 계획 문서에서는 `workspace_member`를 유지/교체/재정의 중 무엇으로 갈지 먼저 고정해야 합니다.
### 5. 문서 SSOT도 함께 교정하지 않으면 재발 가능성이 큽니다.
### 6. 문서 SSOT도 함께 교정하지 않으면 재발 가능성이 큽니다.
- 현재 DOCS 안에서도 `company -> workspaces 통합 완료`처럼 남아 있는 문서와, 실제 DB 현실이 다릅니다.
- 이번 문제를 푸는 동안 코드를 고쳐도 상위 해석 문서와 하위 구조 문서가 계속 엇갈리면 같은 혼선이 다시 발생할 가능성이 높습니다.
@ -173,13 +200,16 @@ tags: [workspace, team, project, database, slack, auth, gateway, rag, research]
### 변경 도중 발생 가능
- Slack 로그인은 되지만 사용자 `team_id`/`workspace_id` 매핑이 어긋나 `team_not_found` 또는 403이 발생할 수 있습니다.
- gateway가 Slack `team_id(T...)`는 받지만 내부 UUID 변환을 못 해서 사용자 미등록 오류가 날 수 있습니다.
- `auth-server`의 Slack 이벤트/설치 해제 경로처럼 이미 혼용된 코드가 먼저 터져 특정 API만 500이 날 수 있습니다.
- `skill-rag-file`가 새 조직 ID를 인식하지 못해 업로드 404 또는 검색 0건이 될 수 있습니다.
- `skill-slack` Lists 경로가 새 식별자를 Slack `slack_team_id`로 바꾸지 못해 리스트 조회/동기화가 실패할 수 있습니다.
- Company-X 전용 상수가 남아 있으면 일부 경로만 옛 `team_id`를 계속 사용해 이중 상태가 생길 수 있습니다.
### 변경 후 발생 가능
- 관리자 대시보드의 `total_teams`, `teams_with_robeings` 같은 통계가 새 해석과 맞지 않아 숫자가 왜곡될 수 있습니다.
- 기존 Chroma 컬렉션명과 스토리지 경로가 `team_id` 기반이라 과거 문서 검색이 누락될 수 있습니다.
- `workspace_member` 정리가 불완전하면 사용자-로빙 배정과 권한 판정이 일부 사용자에서만 깨질 수 있습니다.
- `startup_valuation`, `coldmail_list_config`를 이관 목록에서 빼먹으면 Company-X 운영 기능 일부만 조용히 실패하는 비대칭 회귀가 생길 수 있습니다.
- 문서 SSOT를 함께 갱신하지 않으면 이후 운영자가 `workspace`, `team`, `project`를 다시 혼용할 수 있습니다.
## 이번 리서치의 닫힘 조건