docs: ID 체계 정리 및 conversation_logs 저장 문제 해결 문서화

- ID 타입 불일치 문제 분석 (UUID vs VARCHAR)
- 테이블별 ID 컬럼 현황 정리
- conversation_logs에 slack_user_id 추가 해결책
- 단기/중기/장기 정리 방안 제시
- State Service DB 설정 오류 포함
This commit is contained in:
happybell80 2025-08-26 00:20:39 +09:00
parent 93fcef1878
commit f65b2d186d

View File

@ -0,0 +1,231 @@
# ID 체계 정리 및 conversation_logs 저장 문제 해결
## 작성일: 2025-08-26
## 작성자: 서버 관리자
## 상태: 진행중
## 영향: 대화 저장 실패, ID 타입 불일치로 인한 데이터 무결성 문제
---
## 1. 문제 상황
### 1.1 발견된 문제들
1. **user_id UUID 타입 문제**
- PostgreSQL의 conversation_logs 테이블에서 user_id가 UUID 타입
- "system"이나 Slack user_id (예: U0925SXQFDK)는 UUID가 아님
- UUID 변환 시도 시 오류 발생
2. **대화 저장 전혀 안됨**
- conversation_logs 테이블 완전히 비어있음 (0 rows)
- 게이트웨이 로그에 저장 API 호출 없음
- State Service DB 설정 오류 (auth_db → main_db)
---
## 2. ID 체계 현황 분석
### 2.1 문제점
#### 다양한 ID 타입 혼재
- **UUID**: users.id, workspace_members.id, slack_user_mapping.user_id
- **VARCHAR**: robeing_id, slack_user_id, slack_id, channel_id
- **INTEGER**: conversation_logs.id, gmail_tokens.id
#### 동일 개념, 다른 이름
- `slack_user_id` (slack_user_mapping)
- `slack_id` (gmail_tokens)
- 둘 다 Slack 사용자 ID를 의미
#### 변환 문제
- UUID ↔ Slack ID 변환 로직 불일치
- conversation_logs의 user_id(UUID)에 Slack ID 저장 시도로 실패
### 2.2 테이블별 ID 현황
| 테이블 | Primary Key | 외래 키/참조 ID |
|--------|------------|---------------|
| **users** | id (UUID) | oauth_id (VARCHAR) |
| **workspace_members** | id (UUID) | user_id (UUID), workspace_id (UUID), robeing_id (VARCHAR) |
| **gmail_tokens** | 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_logs** | 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_tokens.slack_id]
└──> [conversation_logs.slack_user_id]
[users.id] ──┬──> [workspace_members.user_id]
├──> [gmail_tokens.user_id]
├──> [conversation_logs.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_logs ALTER COLUMN user_id DROP NOT NULL;
-- 2. slack_user_id 컬럼 추가
ALTER TABLE conversation_logs ADD COLUMN slack_user_id VARCHAR(100);
```
### 4.2 중기 해결책 (표준화)
**명명 규칙 통일**:
- `slack_user_id`: Slack 사용자 ID (모든 테이블)
- `user_id`: 시스템 UUID (모든 테이블)
- `robeing_id`: 로빙 식별자 (VARCHAR 유지)
**작업 필요**:
```sql
-- gmail_tokens 테이블 컬럼명 변경
ALTER TABLE gmail_tokens 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 users u
LEFT JOIN slack_user_mapping sum ON u.id = sum.user_id
LEFT JOIN workspace_members 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 State Service DB 설정
```bash
# /home/heejae/robeing-state-service/.env
# 변경 전 (잘못된 DB)
DATABASE_URL=postgresql://robeings:robeings@localhost:5433/auth_db
# 변경 후 (올바른 DB)
DATABASE_URL=postgresql://robeings:robeings@localhost:5433/main_db
```
---
## 6. 권장 작업 순서
1. ✅ conversation_logs에 slack_user_id 추가 (완료)
2. ⏳ gmail_tokens의 slack_id → slack_user_id로 컬럼명 변경
3. ⏳ 51124 서버 코드가 slack_user_id 사용하도록 수정
4. ⏳ 저장 후 배치 작업으로 slack_user_id → user_id 매핑
5. ⏳ State Service 환경변수 수정 (auth_db → main_db)
---
## 7. 검증 방법
### 7.1 대화 저장 확인
```sql
-- 저장된 대화 확인
SELECT COUNT(*) FROM conversation_logs;
-- 최근 대화 로그
SELECT
cl.slack_user_id,
cl.robeing_id,
cl.message,
cl.response,
cl.timestamp
FROM conversation_logs 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 users u ON sum.user_id = u.id
LEFT JOIN workspace_members 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)
- [State Service DB 설정](/home/admin/DOCS/troubleshooting/250825_gmail_token_null_daily_briefing_fix.md)
---
## 예상 소요 시간: 2시간
- DB 스키마 수정: 30분
- 51124 서버 코드 수정: 1시간
- 검증 및 테스트: 30분