From 5279944279fe4bcae9cc7f12732610f08e041107 Mon Sep 17 00:00:00 2001 From: 0914eagle <0914eagle@gmail.com> Date: Sun, 7 Sep 2025 20:33:00 +0900 Subject: [PATCH] compaany vs workspace --- plans/250831_workspace_unification_plan.md | 182 +++++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 plans/250831_workspace_unification_plan.md diff --git a/plans/250831_workspace_unification_plan.md b/plans/250831_workspace_unification_plan.md new file mode 100644 index 0000000..170aac3 --- /dev/null +++ b/plans/250831_workspace_unification_plan.md @@ -0,0 +1,182 @@ +# Workspace 테이블 통합 계획 + +## 작성일: 2025년 8월 31일 + +## 🎯 목표 +`companies` 테이블과 `workspaces` 테이블을 `workspaces`로 통합하여 DB 스키마 일관성 확보 + +## 📊 현재 상황 + +### 테이블 구조 비교 +| 구분 | companies | workspaces | +|------|-----------|------------| +| **포트 컬럼** | `container_port` | `robeing_port` | +| **FK 참조** | `slack_workspaces.company_id` | `workspace_members.workspace_id` | +| **추가 컬럼** | - | `robeing_id`, `robeing_url`, `max_members`, `workspace_type` | +| **데이터** | 4개 레코드 | 2개 레코드 | + +### 문제점 +1. 중복 데이터 (Company-X가 양쪽 테이블에 존재) +2. FK 관계 불일치 (slack_workspaces → companies, workspace_members → workspaces) +3. 코드에서 잘못된 참조 (`workspace.workspace`, `workspace.robeing_port`) + +## 🔧 작업 계획 + +### Phase 1: DB 백업 및 준비 +```bash +# 백업 생성 +sudo -u postgres pg_dump -t companies -t workspaces -t slack_workspaces main_db > /home/admin/backup_workspace_$(date +%Y%m%d_%H%M%S).sql +``` + +### Phase 2: DB 스키마 변경 +```sql +-- 1. companies 데이터를 workspaces로 이동 +INSERT INTO workspaces (id, name, subdomain, robeing_port, status, created_at, updated_at) +SELECT id, name, subdomain, container_port, status, created_at, updated_at +FROM companies +WHERE id NOT IN (SELECT id FROM workspaces); + +-- 2. slack_workspaces 테이블 수정 +ALTER TABLE slack_workspaces + ADD COLUMN workspace_id UUID; + +UPDATE slack_workspaces + SET workspace_id = company_id; + +ALTER TABLE slack_workspaces + DROP COLUMN company_id, + ADD CONSTRAINT slack_workspaces_workspace_id_fkey + FOREIGN KEY (workspace_id) REFERENCES workspaces(id); + +-- 3. companies 테이블 제거 +DROP TABLE companies CASCADE; +``` + +### Phase 3: 코드 수정 + +#### 3.1 모델 파일 수정 +**파일**: `/home/admin/auth-server/app/models/workspace.py` + +```python +# Line 44: company_id를 workspace_id로 변경 +workspace_id = Column(UUID(as_uuid=True), ForeignKey("workspaces.id"), nullable=False) + +# Line 45 아래: relationship 추가 +workspace = relationship("Workspace", back_populates="slack_workspaces") + +# Workspace 클래스 (Line 35 아래): relationship 추가 +slack_workspaces = relationship("SlackWorkspace", back_populates="workspace") +``` + +#### 3.2 라우터 파일 수정 +**파일**: `/home/admin/auth-server/app/api/slack_router.py` + +```python +# Line 97: workspace 직접 참조로 변경 +workspace_obj = workspace # workspace.workspace 제거 + +# Line 123: 엔드포인트 경로 수정 (선택사항) +container_url = f"http://localhost:{workspace.robeing_port}/api/slack/events" +``` + +#### 3.3 Provider 파일 수정 +**파일**: `/home/admin/auth-server/app/providers/slack.py` + +```python +# Line 542: company_id를 workspace_id로 변경 +existing_workspace.workspace_id = workspace.id + +# Line 557: company_id를 workspace_id로 변경 +workspace_id=workspace.id, +``` + +### Phase 4: 테스트 및 검증 + +#### 4.1 DB 검증 +```sql +-- workspace 통합 확인 +SELECT * FROM workspaces; + +-- FK 관계 확인 +SELECT + sw.team_name, + w.name as workspace_name, + w.robeing_port +FROM slack_workspaces sw +JOIN workspaces w ON sw.workspace_id = w.id; +``` + +#### 4.2 API 테스트 +```bash +# Slack 로그인 테스트 +curl https://auth.ro-being.com/auth/slack/login/ + +# Event 라우팅 테스트 +curl -X POST https://auth.ro-being.com/slack/events/router \ + -H "Content-Type: application/json" \ + -d '{"type":"url_verification","challenge":"test"}' +``` + +### Phase 5: 배포 + +1. Git commit & push +```bash +cd /home/admin/auth-server +git add -A +git commit -m "refactor: companies 테이블을 workspaces로 통합" +git push origin main +``` + +2. Docker 재시작 +```bash +docker compose down +docker compose up -d --build +``` + +## ⚠️ 주의사항 + +### 롤백 계획 +문제 발생 시 백업에서 복원: +```bash +sudo -u postgres psql main_db < /home/admin/backup_workspace_YYYYMMDD_HHMMSS.sql +``` + +### 영향받는 서비스 +- auth-server: 모델 및 라우터 수정 +- rb8001: 영향 없음 (직접 연결 방식 사용 중) +- frontend-customer: 영향 없음 + +### 예상 다운타임 +- DB 마이그레이션: 약 1-2분 +- 코드 배포: 약 2-3분 +- 총 예상 시간: 5분 이내 + +## 📝 체크리스트 + +- [ ] DB 백업 완료 +- [ ] companies → workspaces 데이터 이동 +- [ ] slack_workspaces FK 변경 +- [ ] companies 테이블 삭제 +- [ ] workspace.py 모델 수정 +- [ ] slack_router.py 수정 +- [ ] slack.py provider 수정 +- [ ] 테스트 완료 +- [ ] Git push +- [ ] Docker 재배포 + +## 🎯 완료 후 상태 + +### 통합된 DB 구조 +- 단일 `workspaces` 테이블 +- 모든 FK가 `workspaces.id` 참조 +- 일관된 컬럼명 (`robeing_port`) + +### 개선된 코드 +- 명확한 relationship 정의 +- 올바른 속성 참조 +- 통일된 엔드포인트 + +## 📚 참고 문서 +- `/home/heejae/DOCS/plans/250831_todo_and_tech_debt.md` +- `/home/heejae/DOCS/300_architecture/380_authentication_system.md` +- `/home/heejae/DOCS/300_architecture/database/tables.md` \ No newline at end of file