# 동남아 스타트업 뉴스 아침 브리핑 **작성일**: 2026-01-29 **작성자**: happybell80 **관련**: `rb8001`, `skill-news`, `daily_headlines`, `560_컴퍼니엑스_개요.md` **이전 아이디어**: `journey/ideas/260125_동남아_스타트업_뉴스.md` --- ## 1. UX 기대효과 - 매일 아침 뉴스 브리핑에 **「동남아 소식」** 섹션을 넣어, 컴퍼니엑스가 **동남아 기회를 탐색**하는 데 도움이 되는 뉴스를 **3개 꼭지**로 제공한다. - 깡프로 헤드라인과 동일한 채널·동일한 아침 스케줄에 포함되며, 별도 채널·별도 job 없이 **기존 daily_headlines 메시지 안에** 섹션으로 삽입된다. --- ## 2. UI (깡프로 뉴스와 동일한 단순 형식) - **동남아 소식** 섹션만 추가하고, 나머지 구조(오프닝, 출처, 클로징, 명언)는 깡프로 포맷 유지. - 동남아 뉴스 3건: `01. `, `02. `, `03. ` 한 줄씩. **제목은 한국어로 번역**하여 표기(원문 영문인 경우). **날짜 병기·출판사/신문사·부가 설명 없음**. - 삽입 위치: **깡프로 헤드라인 목록 끝** → 빈 줄 2개 → `*동남아 소식*` → `01.` ~ `03.` → 빈 줄 2개 → `*오늘의 키워드*` (있으면) → 빈 줄 2개 → 클로징 → 명언. **표시 예시** (24시간 이내 수집, 컴퍼니엑스 투자 분야 기준 선별): ``` *동남아 소식* 01. 02. 03. ``` - **참고**: `skill_news/app/services/naver_startup_news_service.py` `format_startup_news_for_slack`, `rb8001/app/services/skills/startup_news_skill.py` `run_headlines_job`. --- ## 3. 수집·선별 상세 ### 3.1 수집 (skill-news) **신규 파일**: `skill_news/app/services/sea_news_collector.py` **구현 방식**: `google_news_collector.py:55-91` 패턴 재사용 - Playwright로 Google News 검색 - URL 파라미터: `q={keyword}%20when%3A1d&hl=en&gl=SG` (24시간 필터) - 키워드: `Singapore startup funding`, `Malaysia startup investment`, `Indonesia startup VC`, `SEA biotech healthcare` **환경변수** (`.env`): ``` SEA_NEWS_KEYWORDS=Singapore startup funding,Malaysia startup investment,Indonesia startup VC,SEA biotech healthcare SEA_NEWS_REGION=SG SEA_NEWS_DAYS_BACK=1 ``` **데이터 모델**: `news_models.py:6-26` `NewsArticle` 재사용 ### 3.2 선별 (skill-news) **신규 파일**: `skill_news/app/services/sea_news_filter.py` **필터링 로직**: 1. **키워드 매칭**: 제목/본문에 기회 탐색 키워드 포함 여부 확인 - 기회 키워드: `funding`, `investment`, `VC`, `accelerator`, `Series A/B`, `M&A`, `expansion`, `policy` - 분야 키워드: `biotech`, `healthcare`, `medical`, `manufacturing`, `e-commerce` 2. **본문 검증**: `companyx_news_collector.py:396-413` `_remove_duplicates` 패턴 참고 - 트러블슈팅 교훈: 검색어 부분 매칭만으로 무관 기사 수집 문제 (`250916_claude_companyx_wrong_news.md`) - 본문 검증 로직 필수 3. **상위 3건 선정**: 기회 키워드 매칭 점수 기준 정렬 ### 3.3 제목 번역 (LLM) **구현 위치**: `skill_news/app/services/sea_news_filter.py` **LLM 호출**: Gemini API 사용 (311 원칙: LLM 우선 접근) - 프롬프트: "Translate the following news title to Korean. Return only the translated title without explanation: {title}" - 3건 배치 처리 (단일 호출로 통합, 311 원칙 섹션 14) ### 3.4 포맷 (skill-news) **신규 함수**: `skill_news/app/services/sea_news_service.py` `format_sea_news_for_slack()` **참조**: `naver_startup_news_service.py:333-343` 포맷 로직 ```python lines = ["", "", "*동남아 소식*", ""] for i, article in enumerate(articles[:3], 1): lines.append(f"{i:02d}. <{article.url}|{article.title_ko}>") ``` ### 3.5 중복 제거 및 이력 관리 **파일**: `skill_news/data/sea_news_posting.json` **참조**: `companyx_news_collector.py:396-413` 중복 제거 패턴 - URL + 제목 기준 중복 확인 - 전송 이력 저장 (날짜, URL, 제목) --- ## 4. Phase 및 필요 작업 | Phase | 필요 작업 | |-------|-----------| | **Phase 1** | `skill_news/app/services/sea_news_collector.py` 신규 생성. `google_news_collector.py:55-91` 패턴 복사 후 키워드·지역 파라미터 변경. 환경변수 `.env`에 `SEA_NEWS_*` 추가. | | **Phase 2** | `skill_news/app/services/sea_news_filter.py` 신규 생성. 기회 키워드 매칭 + 본문 검증 + LLM 제목 번역(Gemini, 3건 배치). `sea_news_service.py`에 `format_sea_news_for_slack()` 추가. | | **Phase 3** | `rb8001/app/services/skills/startup_news_skill.py:11-93` `run_headlines_job` 수정. 깡프로 텍스트 생성 후 동남아 섹션 삽입. 삽입 위치: 명언(`>` 시작) 앞 2줄. `startup_news_skill.py:37-52` 키워드 섹션 삽입 로직 참고. | | **Phase 4** | 기존 daily_headlines 스케줄 유지(09:10). 동남아 수집 실패 시 `try-except`로 동남아 섹션만 생략, 깡프로만 전송. | --- ## 5. 테스트 계획 **315 원칙 준수**: pytest 자동 테스트, conftest.py fixtures 사용 | 테스트 | 파일 | 내용 | |--------|------|------| | 수집 단위 테스트 | `skill_news/tests/test_sea_news_collector.py` | 키워드 검색, 24시간 필터, NewsArticle 반환 확인 | | 선별 단위 테스트 | `skill_news/tests/test_sea_news_filter.py` | 기회 키워드 매칭, 본문 검증, LLM 번역 모킹 | | 포맷 단위 테스트 | `skill_news/tests/test_sea_news_service.py` | `01. ` 형식 확인 | | 연동 E2E 테스트 | `rb8001/tests/e2e/test_sea_news_headlines.py` | 깡프로 + 동남아 섹션 통합 Slack 메시지 확인 | **conftest.py fixtures**: - `mock_playwright`: Playwright 모킹 - `mock_gemini`: Gemini API 모킹 - `sample_sea_articles`: 테스트용 NewsArticle 3건 --- ## 6. 주의사항 (트러블슈팅 교훈) | 교훈 | 출처 | 적용 | |------|------|------| | 검색어 부분 매칭 → 무관 기사 수집 | `250916_claude_companyx_wrong_news.md` | 본문 검증 로직 필수 | | OOM → 리소스 경합 | `250908_headline_failure_memory_error.md` | 깡프로(09:10) 이후 동남아 수집 (동일 job 내 순차 처리) | | 좀비 프로세스 | `250904_admin_skill-news_zombie_process_gitea_actions.md` | docker-compose.yml `init: true` 확인 | | 워크스페이스별 토큰 분리 | `250909_slack_briefing_failure.md` | `COMPANYX_SLACK_BOT_TOKEN` 사용 확인 | --- ## 7. 참고 파일 | 파일 | 참조 내용 | |------|----------| | `skill_news/app/services/google_news_collector.py:55-91` | 뉴스 검색 패턴 | | `skill_news/app/services/google_news_collector.py:100` | URL 파라미터 (when:Nd) | | `skill_news/app/services/companyx_news_collector.py:396-413` | 중복 제거 패턴 | | `skill_news/app/services/naver_startup_news_service.py:333-343` | Slack 포맷 (`01. `) | | `rb8001/app/services/skills/startup_news_skill.py:11-93` | run_headlines_job 구조 | | `rb8001/app/services/skills/startup_news_skill.py:37-52` | 섹션 삽입 로직 (명언 앞) | | `DOCS/book/500_business/560_컴퍼니엑스_개요.md` | 컴퍼니엑스 투자 분야 |