182 lines
4.9 KiB
Markdown
182 lines
4.9 KiB
Markdown
# 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` |