소개
지난 주, 저는 글로벌 뉴스와 매일경제신문 뉴스 요약본을 각각 이메일로 받는 자동화 사례를 발표 발표했습니다.
[지난주 베스트 발표 사례]
이어, 이번에는 4대 국내 주요 신문사 뉴스의 요약과 링크를 하나의 이메일로 받아보는 심화 과제에 도전했습니다. 매일 아침 여러 사이트를 방문하는 비효율을 없애고 정보 과부하를 해결하는 것이 주된 목표였습니다. 이 과정에서 신문사마다 다른 데이터 형식과 웹사이트 차단 문제를 해결해야만 했습니다. 수많은 시행착오 끝에, 마침내 4개 신문사의 맞춤형 요약본을 단 한 통의 이메일로 받아보는 워크플로우를 완성했습니다.
진행 방법
1. 1차 시도 : 간단한 통합 처리 방식의 실패
📌 워크플로우 구성 (1차 시도)
1차 시도에는 다음과 같은 도구와 노드를 활용하여 단일 처리 흐름을 만들고자 했습니다.
*Schedule Trigger: 원하는 시간에 워크플로우를 자동으로 시작(아침 8시)
*RSS Read (x4): 4개 언론사의 RSS 피드를 동시에 수집
*HTTP Request: (수정 시도) RSS에 내용이 없는 기사의 본문을 가져오기 위해 추가
*Filter : 특정 조건을 설정, 조건을 통과하는 데이터만 다음 단계로 넘겨주는 역할
*Basic LLM Chain & Google Gemini: 통합된 데이터를 AI를 통해 요약
*Code: 데이터수 5개로 줄이고, HTML 형식으로 만들고, 데이터 합치기
*Google Sheets: 이메일 수신자 목록 관리
*Gmail: 최종 결과물 내용을 이메일로 발송
📈 진행했던 워크플로우 구성도 (1차 시도)
🛠️ 진행 방법 및 실패 원인 (1차 시도)
데이터 통합 수집 (RSS Read & Merge): 4개 신문사의 RSS 피드를 RSS Read 노드로 각각 읽어온 뒤, code 노드를 이용해 통합하고자 했습니다.
문제 발견 및 수정 시도 (HTTP Request 추가): 실행 결과, 일부 신문사(한국경제, 한겨레 등)의 RSS 피드에는 요약할 만한 텍스트가 전혀 없다는 사실을 발견했습니다. 이를 해결하기 RSS 다음에 HTTP Request 노드를 추가하여, 각 기사의 링크(link)에 직접 방문해 원문을 가져오는 '웹 스크래핑' 방식을 도입하려 했습니다.
하지만 HTTP Request 노드는 대부분의 언론사 웹사이트에서 즉시 차단(403 Forbidden Error)되었습니다. User-Agent 헤더를 추가하는 등의 시도 없이는 자동화된 접근이 불가능하다는 것을 확인했습니다.
2. 2차 시도 : 합치지 못하고 개별 도착(실패)
📌 워크플로우 구성 (2차 시도)
2차 시도에는 다음과 같은 도구와 노드를 활용하여 단일 처리 흐름을 만들고자 했습니다.
*Schedule Trigger: 원하는 시간에 워크플로우를 자동으로 시작
*RSS Read (x2): 2개 언론사의 RSS 피드를 동시에 수집
*HTTP Request: 네이버 뉴스의 API를 통해 뉴스 받아오는 역할
*Split Out: 여러 기사 꾸러미를 풀어서 5개의 개별 기사 아이템으로 분리해 주는 역할
*Basic LLM Chain & Google Gemini: 통합된 데이터를 AI를 통해 요약
*Code: 데이터수 5개로 줄이고, HTML 형식으로 만들고, 데이터 합치기(제대로 작동 안함)
*Gmail: 최종 결과물을 이메일로 발송
📈 진행했던 워크플로우 구성도 (2차 시도)
🛠️ 진행 방법 및 실패 원인 (2차 시도)
1차 시도에서 얻은 교훈을 바탕으로 각 신문사의 RSS 피드 데이터 구조를 분석하여, 텍스트가 풍부한 '매일경제'와 '조선일보'는 RSS를 직접 활용하고,
텍스트가 부족한 '한국경제'와 '한겨레'는 네이버 뉴스 API를 통해 데이터를 가져오도록 처리 방식을 이원화했습니다. 여기까지는 좋았습니다.
2차 시도에서 '데이터를 합치는' 노드가 합치는 역할을 하지 않고, 도착하는 데이터마다 개별적으로 실행되었다. 개별로 요약문을 만들었지만 이 노드는 4개의 결과물을 기다렸다가 하나로 합치는 것이 아니라, 결과물이 도착할 때마다 한 번씩, 총 4번을 실행했습니다. 결과적으로 4개의 분리된 이메일이 만들어졌고, 각각의 이메일에는 신문사 하나의 내용만 담겨있습니다.
Merge노드나Code노드의Run Once for All Items모드 등 다양한 방법을 시도했지만, 이 노드들이 '기다렸다가 합치는' 동기화 기능을 제대로 수행하지 못하고 각자 실행되어 버린 것이 실패 원인입니다.
3. 3차 시도 : 직렬방식으로 결과물 누적시켜 성공
🛠️ 진행 방법 및 성공 원인 (3차 시도 - 성공)
📌 워크플로우 구성 (3차 시도)
Schedule Trigger, RSS Read, HTTP Request, Basic LLM Chain & Google Gemini, Google Sheets, Gmail
Code1,2,3,4: 각 신문사별 요약 결과를 HTML 형식으로 만들며, 이전 단계의 결과물에 새로운 결과물을 누적시키는 핵심적인 역할을 수행했습니다.
📈 진행했던 워크플로우 구성도 (3차 시도 - 성공)
Code1에서 전달받은 내용(
previousHtml) 뒤에 Code2에서 새로 만든 자신의 결과물(html)을 덧붙여서(+), 더 길어진 바통을 다음 주자(혹은 결승선)로 넘겨주는 것이 핵심입니다.
[ 아침에 도착한 4개 신문 요약과 링크 ]
※ n8n 뉴스 수집 3가지 방법 비교
여러 신문사의 뉴스를 가져올 때, 어떤 방법을 사용하느냐에 따라 설정법과 데이터의 특징이 다름
1. RSS: 가장 쉽고 정확한 '직접 구독' (매일경제신문, 조선일보)
* 작동 방식: 각 신문사의 공식 채널(RSS)을 직접 구독하여 정보를 받는 방식.
* n8n 설정: RSS Feed Read 노드에 RSS 주소만 넣으면 끝나므로 매우 간단함.
* 핵심 특징: 해당 신문사 기사만 100% 들어와 데이터가 가장 정확하고 깔끔함.
2. News API: 똑똑한 '뉴스 전문 비서' (글로벌 뉴스)
* 작동 방식: 전 세계 뉴스를 수집하는 전문 데이터 회사의 'API 키'를 가지고 원하는 뉴스를 요청해서 받는 방식.
* n8n 설정: HTTP Request 노드를 사용하며, 서비스 가입 후 받은 'API 키'가 필요함.
* 핵심 특징: 키워드, 국가 등 다양한 조건으로 뉴스를 검색할 수 있어 기능이 강력함.
3. 네이버 뉴스 API: 편리한 '포털 검색 대행' (한국경제신문, 한겨레)
* 작동 방식: 네이버 포털에 특정 키워드(예: '한겨레')로 뉴스를 '검색'해서 결과 받음.
* n8n 설정: HTTP Request 노드와 네이버에서 발급받은 'API 키'가 필요함.
* 핵심 특징: RSS가 막힌 언론사의 기사를 가져올 수 있는 좋은 대안이지만, 검색 결과이므로 불필요한 기사가 섞일 수 있음. 따라서, 원하는 기사만 골라내는 별도의 필터링 작업이 필요함.
아래 네이버 개발자 센터(https://developers.naver.com/main/)에서 네이버 뉴스API 발급받아야 함.
결과와 배운 점
결과
수많은 시행착오 끝에, 매일 아침 지정된 시간에 4개 신문사의 최신 뉴스 각 5개를 AI로 요약하고, 깔끔하게 정리된 하나의 이메일로 받아보는 자동화 워크플로우를 완성했습니다.
배운 점
데이터 소스를 분석하는 것이 먼저다 : 자동화 설계를 시작하기 전에, 내가 사용할 데이터(RSS, API)의 구조와 제약 조건을 명확히 파악하는 '정찰' 과정이 가장 중요합니다.
하나의 방법론을 고집하지 마라 : 모든 데이터 소스에 맞는 '만능 열쇠'는 없습니다. 각 소스의 특성에 맞춰 RSS, API, 웹 스크래핑 등 다양한 방법을 조합하는 유연성이 필요합니다.
가장 확실한 방법은 '직렬 처리'다 : 여러 단계에 걸쳐 데이터를 누적하거나 가공해야 할 때, 한 단계의 결과물이 다음 단계의 입력이 되도록 의존성을 만들어주는 직렬(순차) 방식이 가장 안정적이고 예측 가능합니다.
AI(Gemini)는 훌륭한 페어 프로그래머다 : 복잡한 코드 작성이나 에러 발생 시, 문제를 구체적으로 설명하고 Gemini에게 계속 질문하며 답을 찾아가는 과정이 매우 중요했습니다. 막혔을 때 포기하지 않고 계속 대화하며 수정하는 반복적인 과정이 없었다면 이 워크플로우는 완성되지 못했을 것입니다.
도움 받은 글 (옵션)
매번 스터디에 참석하면서 스터디장님(멍멍님, 올마이티님)과 스터디원 여러분들의 열정이 자극이 되어 저도 분발했습니다. 감사합니다.