diff --git a/plan/250907_company_x_news_implementation.md b/plan/250907_company_x_news_implementation.md index 7d61671..b2aa9dc 100644 --- a/plan/250907_company_x_news_implementation.md +++ b/plan/250907_company_x_news_implementation.md @@ -1,6 +1,6 @@ # Company-X 뉴스 시스템 구현 완료 -## 작성일: 2025-09-07 +## 작성일: 2025-09-07 (최종 업데이트: 2025-09-08) ## 작성자: Claude & happybell80 ## 목적: Company-X 뉴스 포스팅 시스템 구현 내역 기록 @@ -89,3 +89,106 @@ - parsed_date 필드 스크래핑 후 업데이트 - Slack 메시지: 3개 제한 제거, 모든 뉴스 표시 - 버튼 상태: 에러시에도 버튼 유지, 성공시 상태 텍스트만 추가 + +## 8. 2025-09-08 주요 문제 해결 + +### 8.1 Slack 메시지 전체 사라짐 문제 +#### 증상 +- 홈페이지 게시 버튼 클릭시 원본 메시지 전체가 사라지고 텍스트만 남음 +- "(편집됨)" 표시와 함께 버튼과 뉴스 내용이 모두 제거됨 + +#### 원인 +1. Slack Interactive 응답에 JSON 메시지 포함시 원본 교체로 해석 +2. response_url 사용시 replace_original 기본값이 true일 수 있음 +3. chat_update() 호출이 blocks 전체를 잘못 전달 + +#### 해결 +- rb8001/app/router/slack_handler.py Line 342: 빈 JSONResponse({}) 반환 +- rb8001/app/router/slack_handler.py Line 396-397: replace_original=False, delete_original=False 명시 +- chat_update() 호출 전면 제거 + +### 8.2 skill-publish 422 에러 +#### 증상 +- rb8001이 skill-publish 호출시 422 Unprocessable Entity 에러 + +#### 원인 +- rb8001이 news_id, title, url만 전송 +- content, summary, thumbnail_url 필수 필드 누락 + +#### 해결 +- rb8001/app/skills/news_posting_skill.py Line 282-285: skill-news에서 전체 데이터 조회 +- skill-news/app/api/news_endpoints.py Line 149-160: GET /api/news/google/companyx/{article_id} 추가 +- skill-news/app/api/news_endpoints.py Line 163-181: PATCH /api/news/google/companyx/{article_id} 추가 + +### 8.3 Gateway /slack/interactive 프록시 실패 +#### 증상 +- Slack Interactive 이벤트가 rb8001에 도달하지 않음 + +#### 원인 +- robeing-gateway에 /slack/interactive 엔드포인트 없음 +- FastAPI/Starlette가 헤더를 소문자로 변환 (X-Slack-Signature → x-slack-signature) + +#### 해결 +- robeing-gateway/app/main.py Line 239-283: /slack/interactive 프록시 엔드포인트 추가 +- Line 254-257: 헤더 소문자로 접근 (request.headers.get("x-slack-signature")) + +### 8.4 article_id None 문제 +#### 증상 +- skill-news GET /api/news/google/companyx/None 404 에러 + +#### 원인 +- 버튼 value에서 article_id 추출 실패 +- news_posting_skill.py Line 273: value_str이 이미 string인데 json.loads() 실패 + +#### 해결 +- rb8001/app/skills/news_posting_skill.py Line 107: article_id 사용 +- Line 150: action_data에 article_id 포함 +- Line 273: isinstance(value_str, str) 체크 추가 + +### 8.5 강원일보/강원도민일보 스크래핑 실패 +#### 증상 +- 본문 0자, 날짜 추출 실패 + +#### 원인 +- 기존 article/main/p 태그 셀렉터로 찾을 수 없음 +- 사이트별 특수한 HTML 구조 사용 + +#### 해결 +- skill-news/app/services/companyx_news_scraper.py Line 159-160: 특수 셀렉터 추가 + - 강원일보: div[itemprop='articleBody'] + - 강원도민일보: #article-view-content-div +- Line 266-277: HTML 전체에서 날짜 패턴 검색 추가 + +### 8.6 날짜 표시 오류 +#### 증상 +- Slack에 "강원도민일보 | 2025-09-08" (실제 기사는 2025-09-02) + +#### 원인 +1. Google News에서 "3일 전" 같은 상대 시간만 제공 +2. 스크래핑 후 실제 날짜 추출했지만 parsed_date 필드 업데이트 안 함 + +#### 해결 +- skill-news/app/services/companyx_news_scraper.py Line 106: parsed_date 전달 +- skill-news/app/services/companyx_news_collector.py Line 364: parsed_date 저장 + +### 8.7 Slack 요약 200자 제한 +#### 증상 +- 요약이 "..." 으로 끝남 + +#### 원인 +- rb8001/app/skills/news_posting_skill.py Line 110-111: 200자 초과시 197자로 자름 + +#### 현재 상태 +- 수정하지 않음 (가독성 위해 유지) + +## 9. 핵심 교훈 + +### 9.1 Slack Interactive 응답 규칙 +- 3초 내 빈 200 OK 응답 필수 +- JSON 메시지 반환시 원본 교체됨 +- response_url 사용시 replace_original=False 명시 필수 + +### 9.2 데이터 흐름 +- skill-news를 single source of truth로 사용 +- rb8001은 orchestrator 역할만 +- 모든 데이터는 skill-news에서 관리