docs: 문서 전면 재작성 및 간소화
- 제목 변경: ID 체계 표준화 및 사용자 설정 시스템 - 핵심 2가지 문제와 해결책만 정리 - 불필요한 내용 모두 제거 - 65줄로 압축
This commit is contained in:
parent
aff9ab1c0e
commit
faa9ce7ba9
@ -1,244 +1,67 @@
|
|||||||
# Slack ID 컬럼명 표준화 작업
|
# ID 체계 표준화 및 사용자 설정 시스템
|
||||||
|
|
||||||
## 작성일: 2025-08-26 21:30
|
## 작성일: 2025-08-26 22:00
|
||||||
## 작성자: 51123 서버 관리자
|
## 작성자: 51124 서버 담당
|
||||||
## 상태: 🔴 작업 필요
|
## 상태: 작업 필요
|
||||||
## 영향: 데이터 일관성, JOIN 쿼리 성능, 코드 유지보수성
|
## 영향: ID 일관성, 사용자 맞춤화
|
||||||
## 관련: 250826_id_체계_정리_및_conversation_logs_문제_해결.md에서 분리
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 1. 문제 정의
|
## 1. Slack ID 컬럼명 불일치
|
||||||
|
|
||||||
### 1.1 핵심 문제
|
### 현재 상태
|
||||||
동일한 Slack 사용자 ID가 테이블마다 다른 컬럼명으로 저장되어 있음
|
| 테이블 | 컬럼명 | 타입 |
|
||||||
|
|--------|--------|------|
|
||||||
|
| slack_user_mapping | slack_user_id | VARCHAR(100) |
|
||||||
|
| gmail_tokens | **slack_id** ❌ | VARCHAR(100) |
|
||||||
|
| conversation_logs | slack_user_id | VARCHAR(100) |
|
||||||
|
|
||||||
### 1.2 현재 상태
|
### 해결 방안
|
||||||
| 테이블 | 컬럼명 | 데이터 예시 | 타입 |
|
|
||||||
|--------|--------|------------|------|
|
|
||||||
| slack_user_mapping | **slack_user_id** | U091UNVE41M | VARCHAR(100) |
|
|
||||||
| gmail_tokens | **slack_id** ❌ | U091UNVE41M | VARCHAR(100) |
|
|
||||||
| conversation_logs | **slack_user_id** | U091UNVE41M | VARCHAR(100) |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 2. 시스템 영향도
|
|
||||||
|
|
||||||
### 2.1 데이터 흐름도
|
|
||||||
```
|
|
||||||
[Slack 사용자: U091UNVE41M]
|
|
||||||
│
|
|
||||||
├─→ slack_user_mapping.slack_user_id ✅
|
|
||||||
│ ↓ (JOIN 시 컬럼명 불일치)
|
|
||||||
├─→ gmail_tokens.slack_id ❌
|
|
||||||
│ ↓ (JOIN 시 컬럼명 불일치)
|
|
||||||
└─→ conversation_logs.slack_user_id ✅
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2.2 JOIN 복잡도 증가
|
|
||||||
```sql
|
```sql
|
||||||
-- 현재: 컬럼명이 달라서 복잡
|
-- gmail_tokens 컬럼명 변경
|
||||||
SELECT * FROM gmail_tokens g
|
|
||||||
JOIN slack_user_mapping s ON g.slack_id = s.slack_user_id
|
|
||||||
JOIN conversation_logs c ON s.slack_user_id = c.slack_user_id
|
|
||||||
|
|
||||||
-- 목표: 모든 테이블 동일 컬럼명
|
|
||||||
SELECT * FROM gmail_tokens g
|
|
||||||
JOIN slack_user_mapping s USING (slack_user_id)
|
|
||||||
JOIN conversation_logs c USING (slack_user_id)
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 3. 해결 방안
|
|
||||||
|
|
||||||
### 3.1 작업 순서
|
|
||||||
|
|
||||||
#### Phase 1: DB 스키마 변경 (51123 서버)
|
|
||||||
```sql
|
|
||||||
-- 1. 컬럼 추가
|
|
||||||
ALTER TABLE gmail_tokens ADD COLUMN slack_user_id VARCHAR(100);
|
ALTER TABLE gmail_tokens ADD COLUMN slack_user_id VARCHAR(100);
|
||||||
|
|
||||||
-- 2. 데이터 복사
|
|
||||||
UPDATE gmail_tokens SET slack_user_id = slack_id;
|
UPDATE gmail_tokens SET slack_user_id = slack_id;
|
||||||
|
|
||||||
-- 3. 제약조건 이동
|
|
||||||
ALTER TABLE gmail_tokens DROP COLUMN slack_id;
|
ALTER TABLE gmail_tokens DROP COLUMN slack_id;
|
||||||
|
|
||||||
-- 4. 인덱스 재생성
|
|
||||||
CREATE INDEX idx_gmail_tokens_slack_user_id ON gmail_tokens(slack_user_id);
|
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Phase 2: 코드 수정 (로컬 개발자)
|
|
||||||
| 파일 | 수정 내용 |
|
|
||||||
|------|----------|
|
|
||||||
| auth-server/models.py | slack_id → slack_user_id |
|
|
||||||
| robeing-monitor/database.py | slack_id → slack_user_id |
|
|
||||||
| skill-email/db_client.py | slack_id → slack_user_id |
|
|
||||||
|
|
||||||
#### Phase 3: 배치 매핑 (선택사항)
|
|
||||||
Slack ID를 가진 사용자를 UUID와 매핑하여 통합 관리
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 4. 현재 데이터 현황
|
## 2. 뉴스 키워드 하드코딩 문제
|
||||||
|
|
||||||
|
### 현재 상태
|
||||||
|
- rb8001이 `["AI", "기술", "IT"]`만 사용 (dm_skill.py:309)
|
||||||
|
- 매일 같은 뉴스 반복
|
||||||
|
|
||||||
|
### 해결 방안: user_preferences 테이블
|
||||||
|
|
||||||
### 4.1 영향받는 레코드 수
|
|
||||||
```sql
|
```sql
|
||||||
-- gmail_tokens 테이블
|
|
||||||
SELECT COUNT(*) FROM gmail_tokens WHERE slack_id IS NOT NULL;
|
|
||||||
-- 결과: 3건 (U091UNVE41M, U0925SXQFDK, U092F7FQ55L)
|
|
||||||
|
|
||||||
-- slack_user_mapping 테이블
|
|
||||||
SELECT COUNT(*) FROM slack_user_mapping;
|
|
||||||
-- 결과: 3건 (동일 사용자)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 4.2 서비스별 영향
|
|
||||||
| 서비스 | 영향도 | 수정 필요 |
|
|
||||||
|--------|--------|----------|
|
|
||||||
| auth-server | 높음 | Gmail 토큰 조회 로직 |
|
|
||||||
| robeing-monitor | 중간 | 토큰 관리 UI |
|
|
||||||
| skill-email | 높음 | 토큰 검증 로직 |
|
|
||||||
| rb8001 | 낮음 | 이미 slack_user_id 사용 |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 5. 위험 요소 및 대응
|
|
||||||
|
|
||||||
### 5.1 위험 요소
|
|
||||||
- **서비스 중단**: 컬럼명 변경 중 API 오류 가능
|
|
||||||
- **데이터 손실**: ALTER TABLE 실행 중 실수
|
|
||||||
- **캐시 문제**: 기존 ORM 캐시가 old 컬럼명 참조
|
|
||||||
|
|
||||||
### 5.2 대응 방안
|
|
||||||
1. **백업 우선**: `pg_dump main_db > backup_20250826.sql`
|
|
||||||
2. **점진적 마이그레이션**: 새 컬럼 추가 → 이중 운영 → 구 컬럼 제거
|
|
||||||
3. **캐시 초기화**: Docker 재시작으로 ORM 캐시 클리어
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 6. 검증 계획
|
|
||||||
|
|
||||||
### 6.1 변경 전 테스트
|
|
||||||
```sql
|
|
||||||
-- 데이터 무결성 확인
|
|
||||||
SELECT COUNT(*) FROM gmail_tokens
|
|
||||||
WHERE slack_id IS NOT NULL AND slack_user_id IS NULL;
|
|
||||||
```
|
|
||||||
|
|
||||||
### 6.2 변경 후 검증
|
|
||||||
- Gmail 토큰 조회 API 테스트
|
|
||||||
- Slack 사용자 매핑 확인
|
|
||||||
- JOIN 쿼리 성능 비교
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 7. 예상 효과
|
|
||||||
|
|
||||||
### 7.1 개발 효율성
|
|
||||||
- **Before**: 테이블마다 다른 컬럼명 기억 필요
|
|
||||||
- **After**: 모든 곳에서 `slack_user_id` 통일
|
|
||||||
|
|
||||||
### 7.2 쿼리 성능
|
|
||||||
- **Before**: 복잡한 ON 조건
|
|
||||||
- **After**: USING 절로 간단한 JOIN
|
|
||||||
|
|
||||||
### 7.3 유지보수성
|
|
||||||
- 신규 개발자 학습 곡선 감소
|
|
||||||
- 버그 발생 가능성 감소
|
|
||||||
- 코드 일관성 향상
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 8. 작업 체크리스트
|
|
||||||
|
|
||||||
- [ ] PostgreSQL 백업 수행
|
|
||||||
- [ ] gmail_tokens 테이블 스키마 변경
|
|
||||||
- [ ] 로컬 개발자에게 코드 수정 지시
|
|
||||||
- [ ] 테스트 환경에서 검증
|
|
||||||
- [ ] 프로덕션 배포
|
|
||||||
- [ ] 모니터링 및 롤백 준비
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 9. 관련 문서
|
|
||||||
- 원본: `/home/admin/DOCS/troubleshooting/250826_id_체계_정리_및_conversation_logs_문제_해결.md`
|
|
||||||
- 이 문서는 Slack ID 컬럼명 표준화 부분만 분리하여 작성됨
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 10. 뉴스 스킬 키워드 문제 분석
|
|
||||||
|
|
||||||
### 10.1 발견된 문제
|
|
||||||
**매일 같은 AI 뉴스만 반복되는 현상**
|
|
||||||
|
|
||||||
#### 원인
|
|
||||||
- rb8001의 dm_skill.py:309에 `["AI", "기술", "IT"]` 하드코딩
|
|
||||||
- 환경변수 NEWS_KEYWORDS 미사용
|
|
||||||
- 중복 방지로 인해 같은 뉴스 반복 표시
|
|
||||||
|
|
||||||
### 10.2 해결 방안: 사용자별 키워드 설정
|
|
||||||
|
|
||||||
#### DB 스키마
|
|
||||||
```sql
|
|
||||||
-- 사용자 선호도 테이블 (프론트엔드 설정 UI와 연동)
|
|
||||||
CREATE TABLE user_preferences (
|
CREATE TABLE user_preferences (
|
||||||
id SERIAL PRIMARY KEY,
|
id SERIAL PRIMARY KEY,
|
||||||
user_id UUID REFERENCES users(id),
|
user_id UUID REFERENCES users(id),
|
||||||
slack_user_id VARCHAR(100),
|
slack_user_id VARCHAR(100),
|
||||||
news_keywords TEXT[], -- 뉴스 관심 키워드
|
news_keywords TEXT[], -- 뉴스 키워드
|
||||||
email_filter TEXT[], -- 이메일 필터 키워드
|
email_filter TEXT[], -- 이메일 필터
|
||||||
briefing_enabled BOOLEAN DEFAULT true,
|
briefing_enabled BOOLEAN DEFAULT true,
|
||||||
briefing_time TIME DEFAULT '09:00',
|
briefing_time TIME DEFAULT '09:00',
|
||||||
created_at TIMESTAMP DEFAULT NOW(),
|
|
||||||
updated_at TIMESTAMP DEFAULT NOW()
|
updated_at TIMESTAMP DEFAULT NOW()
|
||||||
);
|
);
|
||||||
```
|
```
|
||||||
|
|
||||||
#### rb8001 수정 필요 코드
|
|
||||||
```python
|
```python
|
||||||
# dm_skill.py 수정
|
# rb8001/dm_skill.py 수정
|
||||||
async def get_user_keywords(slack_user_id: str) -> List[str]:
|
async def get_user_keywords(slack_user_id: str) -> List[str]:
|
||||||
"""사용자 설정에서 키워드 조회"""
|
|
||||||
db = SessionLocal()
|
db = SessionLocal()
|
||||||
result = db.execute(
|
result = db.execute(
|
||||||
text("SELECT news_keywords FROM user_preferences WHERE slack_user_id = :sid"),
|
text("SELECT news_keywords FROM user_preferences WHERE slack_user_id = :sid"),
|
||||||
{"sid": slack_user_id}
|
{"sid": slack_user_id}
|
||||||
).fetchone()
|
).fetchone()
|
||||||
|
return result[0] if result else ["AI", "기술", "IT"]
|
||||||
if result and result[0]:
|
|
||||||
return result[0]
|
|
||||||
return ["AI", "기술", "IT"] # 기본값
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 10.3 프론트엔드 연동
|
### 프론트엔드 연동
|
||||||
|
- ActivityPanel 설정 UI 활용 (250825 문서 참조)
|
||||||
#### 기존 UI 활용 (250825 문서 참조)
|
- Gateway API로 user_preferences CRUD 구현
|
||||||
- **위치**: frontend-customer의 ActivityPanel 설정 섹션
|
|
||||||
- **기능**: 관심 키워드 입력/수정
|
|
||||||
- **저장**: user_preferences 테이블로 직접 저장
|
|
||||||
|
|
||||||
#### API 엔드포인트
|
|
||||||
```python
|
|
||||||
# Gateway 또는 auth-server에 추가
|
|
||||||
@router.post("/api/users/preferences")
|
|
||||||
async def update_preferences(
|
|
||||||
keywords: List[str],
|
|
||||||
user_id: str = Depends(get_current_user)
|
|
||||||
):
|
|
||||||
# user_preferences 업데이트
|
|
||||||
pass
|
|
||||||
|
|
||||||
@router.get("/api/users/preferences")
|
|
||||||
async def get_preferences(
|
|
||||||
user_id: str = Depends(get_current_user)
|
|
||||||
):
|
|
||||||
# user_preferences 조회
|
|
||||||
pass
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*작성 완료: 2025-08-26 21:30*
|
*작성: 2025-08-26 22:00*
|
||||||
*뉴스 스킬 분석 추가: 2025-08-26 21:45*
|
|
||||||
Loading…
x
Reference in New Issue
Block a user