1. 들어가며
이번 챌린지의 주제는 구글 뉴스 RSS -> Gmail 자동 발송 워크플로우 만들기입니다.
코드없이 노드를 연결하여 매일 원하는 주제의 뉴스를 자동으로 받아볼 수 있는 구조를 만들어봤습니다.
기본 미션을 통해 커리큘럼대로 따라 만들면서 각 노드의 역할과 연결 흐름을 파악했고,
심화 미션을 통해 제가 실제로 매일 챙겨보고 싶은 키워드인 AI와 미국주식으로 RSS를 커스텀하고 수신채널을 Discord로 변경해보았습니다.
기본 미션 워크플로우 구성부터 심화 미션 적용까지 순서대로 진행해보겠습니다.
해당 책을 보면서 진행하고 있습니다.
https://www.hanbit.co.kr/store/books/look.php?p_code=B5287461531
2. 기본 미션 - 구글 뉴스 RSS - Gmail
2.1 워크플로우 (노드 연결 화면)
총 6개의 노드로 구성됩니다.
Schedule Trigger → RSS Read → Limit → Edit Fields → Aggregate → Gmail

2.2 노드별 설정
2.2.1 Schedule Trigger
워크플로우를 언제 실행할지 결정하는 노드입니다.
매일 특정 시간에 자동으로 실행되도록 설정했습니다.

2.2.2 RSS Read
구글 뉴스 RSS URL을 입력해 뉴스 데이터를 수집하는 노드입니다.
실행 결과 총 108개의 아이템이 수집됐습니다.

2.2.3 Limit
RSS Read에서 수집된 108개 중 상위 5건만 남기는 노드입니다.
Max Items를 5로 설정하고 First Items 기준으로 유지했습니다.

2.2.4 Edit Fields
필요한 필드만 남기는 노드입니다.
title과 link 두 가지 필드만 추출해 이후 노드로 넘겼습니다.
{{ $json.title }}과 {{ $json.link }}를 사용해 Manual Mapping으로 설정했습니다.

2.2.5 Aggregate
5개의 개별 아이템을 하나의 배열(data)로 묶는 노드입니다.
All Item Data 옵션을 사용했고, 출력 결과는 data[0]~data[4] 형태로 정리됩니다.

2.2.6 Gmail
최종적으로 이메일을 발송하는 노드입니다.
제목은 {{ $now.format('yyyy-MM-dd') }} news 형식으로 날짜가 자동으로 들어가게 설정했고, 본문은 아래 Expression으로 뉴스 제목과 링크를 한 줄씩 나열했습니다.
{{ $json.data.map(item => `${item.title}\n${item.link}`).join('\n\n') }}

2.2.7 실제 수신화면
워크플로우 실행 후 Gmail에서 정상적으로 메일을 수신했습니다.
제목은 2026-05-16 news로 날짜가 자동 입력됐고, 본문에 뉴스 5건의 제목과 링크가 정상적으로 출력됐습니다.

오류 및 해결
실제 메일을 수신했을 때 발신자 이름이 깨져서 표시되는 문제가 있었습니다.
원인
Gmail 노드에서 발신자 이름을 별도로 설정하지 않으면 계정의 기본 표시
해결
Gmail 노드 설정에서 Add Option → From Name을 추가하고 영문으로 입력
3. 심화 미션 - 키워드 커스텀 + Discord 채널 변경
3.1 기본 미션에서 바꾼 것
1. RSS URL 교체
단일 키워드에서 AI·미국주식·GitHub 트렌딩으로 확장했습니다.
RSS 소스를 5개로 늘려 각 주제별로 병렬 수집하는 구조로 변경했습니다.
2.수신 채널 변경
Gmail 노드를 제거하고 HTTP Request 으로 교체했습니다.
3.2 워크플로우 구성
RSS 소스를 5개로 구성했습니다.
| 노드 | 키워드 | 언어 |
| RSS Read 1 | OpenAI, Anthropic, Gemini, Claude AI | 영문 |
| RSS Read 2 | Microsoft Copilot, Meta AI, Apple AI | 영문 |
| RSS Read 3 | OpenAI, Anthropic, 구글AI | 국문 |
| RSS Read 4 | 나스닥, SP500, 미국증시, 뉴욕증시 | 국문 |
| RSS Read 5 | GitHub Trending (Python) | 전체 |
각 RSS 노드 뒤에 Limit 노드를 연결해 피드당 최대 5건으로 제한했습니다.
병렬로 수집한 데이터는 Merge 노드에서 하나로 합친 뒤 Remove Duplicates → Wait → HTTP Request(Discord Webhook) 순서로 전송합니다.

3.2.1 노트 내용
AI, 미국주식 수집 봇 (심화미션)
Schedule Trigger (매일 08:00) RSS 1~5 병렬 수집 → Merge → Remove Duplicates → Wait(5s) → HTTP Request(Discord Webhook)
RSS 구성
- RSS 1: OpenAI / Anthropic / Gemini / Claude (en)
- RSS 2: Microsoft Copilot / Meta AI / Apple AI (en)
- RSS 3: OpenAI / Anthropic / 구글AI (ko)
- RSS 4: 나스닥 / SP500 / 미국증시 / 뉴욕증시 (ko)
- RSS 5: GitHub Trending Python (daily)
3.3 노드별 상세 설정
3.3.1 Merge
RSS 1~5에서 병렬로 수집된 데이터를 하나의 흐름으로 합치는 노드입니다.
Mode를 Combine → Append로 설정해 각 RSS 노드의 output을 순서대로 이어붙였습니다.
이 시점에서 최대 25건의 아이템이 하나의 리스트로 합쳐집니다.
3.3.2 Remove Duplicates
여러 RSS 피드에서 같은 기사가 중복으로 수집되는 경우를 걸러내는 노드입니다.
Fields to Compare에 link를 입력해 URL 기준으로 중복을 제거했습니다.
옵션은 Remove items processed in previous executions를 선택했습니다.
단순 중복 제거가 아니라 이전 실행에서 이미 전송한 기사까지 기억해서 걸러주기 때문에 매일 실행해도 어제 받은 기사가 오늘 다시 뜨지 않습니다.
3.3.3 Wait
Discord Webhook 전송 전에 강제로 대기 시간을 두는 노드입니다. Amount를 5, Unit을 Seconds로 설정했습니다.
Discord Webhook은 초당 전송 가능한 횟수에 제한(Rate Limit)이 있었습니다.
25건의 아이템이 대기 없이 한꺼번에 전송되어 The service is receiving too many requests 오류가 발생했습니다.
Wait 노드로 건당 5초 간격을 두어 이 문제를 해결하고자 했습니다.
처음에는 n8n 기본 제공 Discord 노드를 사용했는데, 이 노드는 Bot Token 방식으로 동작합니다.
Bot Token 방식은 Discord 봇을 별도로 만들고 서버에 초대하는 과정이 필요해서 설정이 복잡한데
반면 Webhook 방식은 Discord 채널 설정에서 URL 하나만 복사하면 바로 연결할 수 있어 훨씬 단순했습니다.
n8n Discord 노드가 Webhook 방식을 지원하지 않아서 대신 HTTP Request 노드에 Webhook URL을 직접 입력하는 방식을 선택했습니다.
3.3.4 HTTP Request
Rate Limit 오류가 일부 아이템에서 여전히 발생하고 있어서 Settings 탭에서 Continue On Fail → Continue using error output을 켜두었습니다.
오류가 나도 워크플로우가 멈추지 않고 다음 아이템으로 넘어갑니다.
| 항목 | 설정값 |
| Method | POST |
| URL | Discord Webhook URL |
| Send Body | ON |
| Body Content Type | JSON |
| Specify Body | Using Fields Below |
| Name | content |
| Value | {{ $json.title + "\n" + $json.link + "\n" + ($json.contentSnippet ?? "") }} |
3.4 노드 구성 시 주의사항
3.4.1 병렬 연결 구조
RSS 노드들은 서로 직렬로 연결하면 안 됩니다.
Schedule Trigger output을 각 RSS 노드 input에 개별 연결하고, 각 RSS 노드 output을 Merge input에 연결하는 구조가 맞습니다.
3.4.2 URL 인코딩
n8n RSS 노드 URL 필드에서 &를 %26으로 변경해야 합니다.
그대로 입력하면 Request path contains unescaped characters 오류가 발생합니다.
3.4.3 Discord 전송 방식
Body는 JSON으로 설정하고 아래 형식으로 입력했습니다.
Name: content
Value: {{ $json.title + "\n" + $json.link + "\n" + ($json.contentSnippet ?? "") }}
3.5 오류 및 해결
3.5.1 Rate Limit 오류
Discord Webhook은 초당 전송 가능한 횟수에 제한이 있었습니다.
한 번에 최대 25건(RSS 5개 × 5건)이 빠르게 전송되면서 The service is receiving too many requests 오류가 발생했습니다.
HTTP Request 노드 앞에 Wait 노드를 추가하고 5초로 설정해 해결했습니다.
일부 아이템에서 여전히 에러가 표시되더라도 HTTP Request 노드의 Continue On Fail 설정을 켜두면 워크플로우가 멈추지 않고 계속 진행되기 때문에 설정을 변경했습니다.
3.6 실제 수신 화면
Discord #일반 채널에 뉴스가 정상적으로 수신됐습니다.
제목, 링크, 요약이 함께 전송되며 링크 클릭 시 원문 기사로 바로 이동됩니다.

4. 마치며
커리큘럼을 동일하게 따라감에도 원하는 워크플로우가 다르면 노드도 달라지고 해야하는 설정이 달라지는 것이 신기했습니다.
생각하는 노드가 대부분 다 있는 것도 재밌었고 자유도가 높아서 선택할 수 있는게 많다는게 더 어려웠던 것 같습니다.
지금은 제목과 링크 위주로 전송되는데 본문 요약까지 받아보면 더 좋을 것 같습니다.
'바이브코딩_made in me' 카테고리의 다른 글
| [공지] 바이브코딩_made in me 업로드 방향성 공유 (0) | 2026.05.16 |
|---|