# ID 체계 정리 및 conversation_log 저장 문제 해결

## 작성일: 2025-08-26 (수정: 2025-08-28)
## 작성자: 서버 관리자
## 상태: ⚠️ 부분 해결
## 영향: 대화 저장 실패, ID 타입 불일치로 인한 데이터 무결성 문제
## 최종 업데이트: 2025-08-26 21:00

---

## 1. 문제 상황

### 1.1 발견된 문제들
1. **user_id UUID 타입 문제**
   - PostgreSQL의 conversation_log 테이블에서 user_id가 UUID 타입
   - "system"이나 Slack user_id (예: U0925SXQFDK)는 UUID가 아님
   - UUID 변환 시도 시 오류 발생

2. **대화 저장 전혀 안됨**
   - conversation_log 테이블 완전히 비어있음 (0 rows)
   - 게이트웨이 로그에 저장 API 호출 없음
   - DB 설정 오류 (auth_db → main_db)

---

## 2. ID 체계 현황 분석

### 2.1 문제점
#### 다양한 ID 타입 혼재
- **UUID**: users.id, workspace_member.id, slack_user_mapping.user_id
- **VARCHAR**: robeing_id, slack_user_id, slack_id, channel_id  
- **INTEGER**: conversation_log.id, gmail_token.id

#### 2025-08-28 확인
- gmail_token.slack_user_id: VARCHAR(100) 
- gmail_token.user_id: UUID (FK → users.id)
- Slack ID와 UUID 동시 저장

#### 변환 문제
- UUID ↔ Slack ID 변환 로직 불일치
- conversation_log의 user_id(UUID)에 Slack ID 저장 시도로 실패

### 2.2 테이블별 ID 현황

| 테이블 | Primary Key | 외래 키/참조 ID |
|--------|------------|---------------|
| **users** | id (UUID) | oauth_id (VARCHAR) |
| **workspace_member** | id (UUID) | user_id (UUID), workspace_id (UUID), robeing_id (VARCHAR) |
| **gmail_token** | id (INT) | user_id (UUID), slack_id (VARCHAR), robeing_id (VARCHAR) |
| **slack_user_mapping** | id (UUID) | user_id (UUID), slack_user_id (VARCHAR), workspace_member_id (UUID) |
| **conversation_log** | id (INT) | user_id (UUID), slack_user_id (VARCHAR)*, robeing_id (VARCHAR) |

*slack_user_id는 이 문제 해결을 위해 새로 추가한 컬럼

---

## 3. 매핑 관계도

### 3.1 현재 구조
```
[Slack ID] ──┬──> [slack_user_mapping] ──> [users.id (UUID)]
             │
             ├──> [gmail_token.slack_id]
             │
             └──> [conversation_log.slack_user_id]

[users.id] ──┬──> [workspace_member.user_id]
             ├──> [gmail_token.user_id]
             ├──> [conversation_log.user_id]
             └──> [robeing_stats.user_id]
```

### 3.2 Slack 유저 매핑 현황
```
slack_user_id  | username
---------------+-------------
U091UNVE41M    | 0914eagle
U0925SXQFDK    | happybell80  
U092F7FQ55L    | cdctfm
```

---

## 4. 해결 방안

### 4.1 단기 해결책 (즉시 적용) ✅ 완료
```sql
-- 1. user_id를 nullable로 변경
ALTER TABLE conversation_log ALTER COLUMN user_id DROP NOT NULL;

-- 2. slack_user_id 컬럼 추가
ALTER TABLE conversation_log ADD COLUMN slack_user_id VARCHAR(100);
```

### 4.2 중기 해결책 (표준화)
**명명 규칙 통일**:
- `slack_user_id`: Slack 사용자 ID (모든 테이블)
- `user_id`: 시스템 UUID (모든 테이블)
- `robeing_id`: 로빙 식별자 (VARCHAR 유지)

**작업 필요**:
```sql
-- gmail_token 테이블 컬럼명 변경
ALTER TABLE gmail_token RENAME COLUMN slack_id TO slack_user_id;
```

### 4.3 장기 해결책 (구조 개선)
```sql
-- 중앙 ID 매핑 테이블 생성
CREATE TABLE id_mappings (
    user_uuid UUID PRIMARY KEY,
    slack_user_id VARCHAR(100) UNIQUE,
    robeing_id VARCHAR(50) UNIQUE,
    oauth_id VARCHAR(255),
    created_at TIMESTAMP DEFAULT NOW(),
    updated_at TIMESTAMP DEFAULT NOW()
);

-- 기존 데이터 마이그레이션
INSERT INTO id_mappings (user_uuid, slack_user_id, robeing_id)
SELECT DISTINCT 
    u.id,
    sum.slack_user_id,
    wm.robeing_id
FROM user u
LEFT JOIN slack_user_mapping sum ON u.id = sum.user_id
LEFT JOIN workspace_member wm ON u.id = wm.user_id;
```

---

## 5. 51124 서버 수정 필요 사항

### 5.1 rb8001 대화 저장 로직
```python
# 변경 전: user_id에 UUID 또는 Slack ID 혼용
conversation_data = {
    "user_id": user_id,  # UUID 또는 Slack ID
    "robeing_id": "rb8001",
    ...
}

# 변경 후: slack_user_id 명시적 사용
conversation_data = {
    "slack_user_id": slack_user_id,  # Slack ID만
    "user_id": user_uuid if user_uuid else None,  # UUID (있으면)
    "robeing_id": "rb8001",
    ...
}
```

### 5.2 robeing-monitor DB 설정
```bash
# robeing-monitor가 state 기능 통합
# /home/admin/ivada_project/robeing-monitor/.env
DATABASE_URL=postgresql://robeings:robeings@localhost:5433/main_db

# 대화 저장 엔드포인트 (robeing-monitor 내부)
# POST /api/logs/{robeing_id}/conversation
```

---

## 6. 작업 완료 현황

1. ✅ conversation_log에 slack_user_id 추가 (완료)
2. ✅ gmail_token의 slack_user_id 컬럼 확인 (이미 존재, slack_id 컬럼 없음 - 2025-08-27 확인)
3. ✅ **뉴스 키워드 하드코딩 제거** (2025-08-26 21:00 완료)
   - rb8001/app/skills/dm_skill.py 수정 (커밋: aed931e)
   - user_preference 테이블 활용
   - 사용자별 맞춤 키워드 설정 가능
4. ✅ **이메일 요약 프롬프트 수정** (2025-08-26 21:00 완료)
   - Slack mrkdwn 형식으로 변경 (커밋: 7103599)
5. ✅ robeing-monitor 환경변수 수정 (포트 9024로 실행 중)

---

## 7. 검증 방법

### 7.1 대화 저장 확인
```sql
-- 저장된 대화 확인
SELECT COUNT(*) FROM conversation_log;

-- 최근 대화 로그
SELECT 
    cl.slack_user_id,
    cl.robeing_id,
    cl.message,
    cl.response,
    cl.timestamp
FROM conversation_log cl
ORDER BY cl.timestamp DESC
LIMIT 5;
```

### 7.2 ID 매핑 확인
```sql
-- Slack ID → UUID 매핑 확인
SELECT 
    sum.slack_user_id,
    u.id as user_uuid,
    u.username,
    wm.robeing_id
FROM slack_user_mapping sum
JOIN user u ON sum.user_id = u.id
LEFT JOIN workspace_member wm ON u.id = wm.user_id;
```

---

## 8. 주의사항

### ⚠️ 데이터베이스 변경
- 스키마 변경 전 백업 필수
- 외래 키 제약 조건 확인
- NULL 허용 컬럼 변경 시 기존 데이터 영향 검토

### ⚠️ 하위 호환성
- 기존 코드가 user_id(UUID)를 의존하는 경우 확인
- slack_user_id 추가 후 점진적 마이그레이션

---

## 9. 관련 문서
- [Gmail Token Slack ID 마이그레이션](/home/admin/DOCS/gmail-token-slack-id-migration.md)
- [데이터베이스 관계도](/home/admin/DOCS/300_architecture/database/relationships.md)
- [UUID 변환 시스템](/home/admin/DOCS/300_architecture/uuid_conversion_system.md)
- [DB 설정](/home/admin/DOCS/troubleshooting/250825_gmail_token_null_daily_briefing_fix.md)

---

## 예상 소요 시간: 2시간
- DB 스키마 수정: 30분
- 51124 서버 코드 수정: 1시간
- 검증 및 테스트: 30분