docs: ID 체계 정리 및 conversation_logs 저장 문제 해결 문서화
- ID 타입 불일치 문제 분석 (UUID vs VARCHAR) - 테이블별 ID 컬럼 현황 정리 - conversation_logs에 slack_user_id 추가 해결책 - 단기/중기/장기 정리 방안 제시 - State Service DB 설정 오류 포함
This commit is contained in:
parent
93fcef1878
commit
f65b2d186d
231
troubleshooting/250826_id_체계_정리_및_conversation_logs_문제_해결.md
Normal file
231
troubleshooting/250826_id_체계_정리_및_conversation_logs_문제_해결.md
Normal 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분
|
||||||
Loading…
x
Reference in New Issue
Block a user