소개
시도하고자 했던 것과 그 이유
CTO 관점에서 매일 확인해야 하는 에너지 신기술과 정책 뉴스는 양이 많고 출처도 흩어져 있습니다. 사람이 매일 여러 매체를 직접 검색하고, 비슷한 기사를 걸러내고, 중요한 내용과 시사점을 정리해 이메일로 공유하는 데는 반복적인 시간이 듭니다.
이 프로젝트에서는 다음 과정을 하나의 자동화 흐름으 로 만들고자 했습니다.
1. 전력·전력망·전기요금·재생에너지·ESS·VPP·AI·SMR 등 핵심 주제로 Google News RSS를 검색합니다.
2. 설정한 시간 범위 밖의 기사와 중복 기사를 제거합니다.
3. 중요도와 주제 균형을 반영해 후보 기사를 선별합니다.
4. 기사 본문을 바탕으로 주요 내용, 시사점, CTO 관점 액션을 작성합니다.
5. HTML/TXT 브리핑을 저장하고 지정된 수신자에게 SMTP 이메일로 발송합니다.
6. Windows 작업 스케줄러를 통해 월~금 오전 7시에 자동 실행합니다.
7. 비개발자도 운영할 수 있도록 설정, 수동 실행, 보고서 열람, 로그 확인 기능을 웹 대시보드로 제공합니다.
핵심 목표는 단순한 뉴스 모음이 아니라 의사결정자가 짧은 시간 안에 기술·정책·사업 영향을 파악할 수 있는 데일리 브리핑을 만드는 것이었습니다.
진행 방법
사용한 도구와 활용 방법
- ChatGPT/Codex: 요구사항 구체화, Node.js 기반 프로그램 구현, 프런트엔드 적용, SMTP 및 실행 스크립트 점검, 테스트 작성, 문서화를 진행했습니다.
- Node.js 18 이상: 별도 대형 프레임워크 없이 RSS 수집, HTTP 요청, 기사 본문 추출, 중복 제거, 보고서 생성, SMTP 전송, 로컬 웹 서버를 구현했습니다.
- Google News RSS: 한국어·영어 검색어 11개로 국내외 전력·에너지 관련 기사를 수집합니다.
- HTML/CSS/JavaScript: 보고서 생성·발송, 설정 변경, 최근 보고서 확인, 로그 및 작업 스케줄 확인을 위한 로컬 운영 대시보드를 만들었습니다.
- Windows 작업 스케줄러: 월~금 오전 7시에 브리핑이 자동 실행되도록 등록했습니다.
- SMTP: 수신자별로 이메일을 개별 발송하며, Gmail 사용 시 앱 비밀번호를 활용하도록 구성했습니다.
- Node.js 내장 테스트 러너: 중복 기사 판별, 본문 요약, 월요일 조회 범위, 주제 편중 제한 등 핵심 로직을 자동 검증했습니다.
전체 처리 흐름
```text
작업 스케줄러(평일 07:00)
↓
Google News RSS 검색 11개
↓
시간 범위 필터링
(월요일 84시간 / 화~금 36시간)
↓
제목 유사도 기반 중복 기사 병합
↓
중요도 점수 + 주제 균형 선별
(후보 최대 40건)
↓
기사 본문 추출 및 요약
↓
상세 브리핑 최대 12건 작성
↓
HTML/TXT 저장 → SMTP 이메일 발송
```
현재 기사 수집 한도
현재 설정은 다음과 같습니다.
- 중복 제거와 중요도 평가 후 유지하는 후보 기사: 최대 40건 (`maxItems`)
- 최종 보고서에 자세히 싣는 기사: 최대 12건 (`reportItems`)
- 원시 RSS 수집 건수: 11개 검색 결과에서 들어오는 만큼 수집하므로 고정 상한이 없으며, 이후 시간 범위·중복 제거·균형 선별 단계에서 최대 40건으로 줄어듭니다.
- 최근 실제 결과: 2026년 7월 25일 보고서는 후보 19건을 확보했고 그중 12건을 상세 브리핑으로 작성했습니다.
현재 설정 전문은 아래와 같습니다.
{
"reportTitle": "CTO 전력·에너지 데일리 브리핑",
"recipients": [
"[email protected]",
"[email protected]"
],
"lookbackHours": 36,
"mondayLookbackHours": 84,
"maxItems": 40,
"reportItems": 12,
"timezone": "Asia/Seoul",
"googleNews": {
"hl": "ko",
"gl": "KR",
"ceid": "KR:ko",
"queries": [
"전력 에너지 신기술 정책",
"전력망 계통 송전 배전 투자 정책",
"전력시장 요금 규제 전력거래 정책",
"전기요금",
"한전 부채 전기요금 인상",
"가정용 전기요금 인상 한전 부채 에너지고속도로",
"재생에너지 ESS VPP 수요반응 분산에너지",
"AI 데이터센터 전력수요 전력망",
"원전 SMR 수소 탄소중립 전력",
"smart grid power grid energy technology policy",
"renewable energy storage grid policy Korea"
]
},
"priorityKeywords": [
"한국전력",
"한전",
"KEPCO",
"전력망",
"계통",
"송전",
"배전",
"전력시장",
"요금",
"규제",
"정책",
"재생에너지",
"분산에너지",
"ESS",
"VPP",
"수요반응",
"AI",
"스마트그리드",
"원전",
"SMR",
"수소",
"탄소중립",
"grid",
"storage",
"renewable",
"nuclear",
"hydrogen",
"policy",
"regulation"
]
}
```코드 구성
- src/kepco-energy-briefing.js: RSS 수집, URL 해석, 본문 추출, 중복 판별, 점수화, 주제 균형, 요약, 보고서 생성, SMTP 발송
- src/server.js: 정적 파일 제공과 설정·보고서·로그·실행 API
- public/index.html, public/styles.css, public/app.js: 운영 대시보드
- config/news-config.json: 검색어, 우선 키워드, 조회 기간, 기사 수, 수신자 설정
- scripts/register-task.ps1: Windows 작업 스케줄러 등록
- test/*.test.js: 중복 제거, 요약 문장 완결성, 주제 균형 등 자동 테스트
결과와 배운점
결과
- Google News RSS 검색어 11개를 기반으로 국내외 전력·에너지 뉴스를 수집합니다.
- 월요일에는 주말을 포함해 최근 84시간, 화~금에는 최근 36시간 기사를 조회합니다.
- 유사 제목과 공통 토큰을 이용해 같은 사건을 다룬 기사를 하나로 합치면서 발행 매체 목록은 보존합니다.
- 후보 기사 최대 40건 가운데 상세 브리핑 최대 12건을 선정합니다.
- 데이터센터 기사가 지나치게 많아지지 않도록 최종 선별 비중을 최대 40% 수준으로 제한합니다.
- 기사별 주요 내용, KEPCO 시사점, CTO 관점 액션, 출처, 날짜, 원문 링크를 포함한 HTML/TXT 보고서를 생성합니다.
- Windows 작업 스케줄러에 월~금 오전 7시 자동 실행 작업이 등록되어 있습니다.
- 2026년 7월 26일 기준 자동 테스트 18개가 모두 통과했습니다.
배운 점과 꿀팁
1. 수집량보다 중복 제거 품질이 중요했습니다. 같은 사건이 여러 매체에서 반복 보도되기 때문에 단순히 기사 수만 늘리면 브리핑의 정보 밀도가 떨어집니다. 제목 정규화, 토큰 겹침 비율, 문자열 유사도를 조합하고 발행 매체를 병합하는 방식이 효과적이었습니다.
2. 월요일은 별도 조회 범위가 필요했습니다. 평일 36시간만 조회하면 주말 기사가 누락되므로 한국시간 기준 월요일에는 84시간을 적용했습니다.
3. 중요도 순 정렬만으로는 주제 편중이 생겼습니다. AI 데이터센터 뉴스가 몰릴 때 전체 브리핑이 한 주제로 채워지는 문제를 막기 위해 데이터센터 기사 비중을 제한했습니다.
4. 본문을 못 가져오는 상황을 전제로 설계해야 했습니다. 언론사별 HTML 구조와 접근 정책이 다르므로 JSON-LD, 메타 태그, 본문 후보를 순서대로 탐색하고, 실패 시 RSS 설명과 제목 기반 요약으로 내려가는 다단계 대체 전략을 사용했습니다.
5. 자동 발송은 ‘보고서 생성’과 분리해 시험해야 안전했습니다. npm run dry-run으로 먼저 결과 파일을 검토하고 SMTP 발송은 그다음에 실행하면 잘못된 보고서를 여러 수신자에게 보내는 위험을 줄일 수 있습니다.
6. 비밀정보는 문서와 코드에서 분리해야 합니다. SMTP 비밀번호는 .env에만 두고, UI에서도 저장 여부만 보여주며 실제 값을 다시 표시하지 않도록 했습니다.
시행착오
- Google News 링크가 실제 언론사 URL이 아닌 리디렉션 주소여서 원문 해석 로직이 필요했습니다.
- 같은 사건의 제목이 매체마다 달라 단순 완전 일치 비교만으로는 중복 제거가 되지 않았습니다.
- 영문 기사 본문이 그대로 보고서에 들어가거나 문장 길이 제한에서 한국어 문장이 중간에 끊기는 문제가 있어 변환 및 문장 경계 테스트를 추가했습니다.
- AI·데이터센터 기사가 중요도 점수를 독식해 다른 전력망·요금·ESS 이슈가 밀리는 문제가 있어 균형 선별 규칙을 추가했습니다.
- 현재 대시보드 초기 렌더링에서 public/app.js가 존재하지 않는 recipientCount 요소에 값을 쓰려고 하면서 Cannot set properties of null (setting 'textContent') 오류가 발생합니다. 그 결과 최근 보고서 목록과 일부 설정값이 화면에 채워지지 않습니다.
- src/kepco-energy-briefing.js에는 개발 과정에서 scoreItem, formatDate, buildInsights, buildReport가 여러 번 선언되어 있으며 JavaScript에서는 뒤쪽 선언이 앞쪽 선언을 덮어씁니다. 현재 테스트는 통과하지만 유지보수를 위해 하나의 구현으로 정리할 필요가 있습니다.
도움이 필요한 부분
- 언론사별 본문 추출 성공률과 실패 원인을 수치화하는 모니터링이 필요합니다.
- 규칙 기반 한국어 요약의 사실 정확도, 문장 자연스러움, 출처 신뢰도를 평가할 검수 기준이 필요합니다.
- 생성된 ‘시사점’과 ‘CTO 관점 액션’이 기사 주제와 어긋나는 경우를 줄이기 위한 주제 분류 개선이 필요합니다.
- SMTP 발송 성공뿐 아니라 실제 수신 여부, 반송, 스팸 분류까지 확인할 운영 지표가 필요합니다.
- 대시보드의 recipientCount 오류와 핵심 파일 내 중복 함수 선언을 우선 정리하는 것이 좋습니다.
향후 계획
1. 대시보드 초기 렌더링 오류를 수정하고 설정·최근 보고서 표시를 회귀 테스트합니다.
2. 중복 선언된 핵심 함수를 하나로 통합하고 함수별 책임을 파일 단위로 분리합니다.
3. 기사 출처별 신뢰도와 공식기관 우선순위를 점수에 반영합니다.
4. 본문 추출 실패율, 검색 실패, 중복 압축률, 이메일 성공률을 대시보드 지표로 추가합니다.
5. 브리핑 발송 전 승인 모드와 수신자 그룹별 맞춤 요약 기능을 검토합니다.
6. 장기적으로는 과거 기사와 정책 변화를 검색할 수 있는 데이터베이스와 주간·월간 트렌드 보고서를 추가합니다.