DOCS/plans/250831_workspace_unification_plan.md
happybell80 97e0888ce0 Fix more incorrect table names in documentation
- users → user in SQL contexts (94 occurrences)
- robeings → robeing in SQL contexts
- user_preferences → user_preference (14 files)
- slack_workspaces → slack_workspace in SQL contexts (17 files)

All table names now correctly match PostgreSQL schema
2025-09-26 00:52:15 +09:00

4.9 KiB

Workspace 테이블 통합 계획

작성일: 2025년 8월 31일

🎯 목표

company 테이블과 workspaces 테이블을 workspaces로 통합하여 DB 스키마 일관성 확보

📊 현재 상황

테이블 구조 비교

구분 company workspaces
포트 컬럼 container_port robeing_port
FK 참조 slack_workspaces.company_id workspace_member.workspace_id
추가 컬럼 - robeing_id, robeing_url, max_members, workspace_type
데이터 4개 레코드 2개 레코드

문제점

  1. 중복 데이터 (Company-X가 양쪽 테이블에 존재)
  2. FK 관계 불일치 (slack_workspaces → company, workspace_member → workspaces)
  3. 코드에서 잘못된 참조 (workspace.workspace, workspace.robeing_port)

🔧 작업 계획

Phase 1: DB 백업 및 준비

# 백업 생성
sudo -u postgres pg_dump -t company -t workspaces -t slack_workspaces main_db > /home/admin/backup_workspace_$(date +%Y%m%d_%H%M%S).sql

Phase 2: DB 스키마 변경

-- 1. company 데이터를 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 company 
WHERE id NOT IN (SELECT id FROM workspaces);

-- 2. slack_workspaces 테이블 수정
ALTER TABLE slack_workspace 
  ADD COLUMN workspace_id UUID;

UPDATE slack_workspace 
  SET workspace_id = company_id;

ALTER TABLE slack_workspace 
  DROP COLUMN company_id,
  ADD CONSTRAINT slack_workspaces_workspace_id_fkey 
    FOREIGN KEY (workspace_id) REFERENCES workspaces(id);

-- 3. company 테이블 제거
DROP TABLE company CASCADE;

Phase 3: 코드 수정

3.1 모델 파일 수정

파일: /home/admin/auth-server/app/models/workspace.py

# 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

# 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

# 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 검증

-- workspace 통합 확인
SELECT * FROM workspaces;

-- FK 관계 확인
SELECT 
    sw.team_name,
    w.name as workspace_name,
    w.robeing_port
FROM slack_workspace sw
JOIN workspaces w ON sw.workspace_id = w.id;

4.2 API 테스트

# 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
cd /home/admin/auth-server
git add -A
git commit -m "refactor: company 테이블을 workspaces로 통합"
git push origin main
  1. Docker 재시작
docker compose down
docker compose up -d --build

⚠️ 주의사항

롤백 계획

문제 발생 시 백업에서 복원:

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 백업 완료
  • company → workspaces 데이터 이동
  • slack_workspaces FK 변경
  • company 테이블 삭제
  • 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