발행일: 2026-10-06(화) 11:44
← 목차로 돌아가기|하루 30분 n8n 시리즈 ② 실무 자동화 레시피 100
RECIPE 001

매일 아침 오늘의 할 일 Slack 알림

  • ▸RSS Feed Read 노드로 외부 피드를 n8n에 연결할 수 있다
  • ▸SplitInBatches 노드로 대량 데이터를 안전하게 처리할 수 있다
  • ▸Google Sheets에 중복 없이 데이터를 누적 저장할 수 있다

✅사전 준비

  • □Google Sheets 자격증명(Credentials) 연결 완료
  • □수집할 RSS 피드 URL 1개 이상 준비
  • □Google Sheets에 시트 생성 후 1행에 헤더 입력 (제목 / 링크 / 발행일 / 수집일시)

Schedule Trigger — Cron 설정값

매일 오전 8시 실행
Cron Expression: 0 8 * * *
Timezone: Asia/Seoul

RSS Feed Read 노드 — URL 예시

블로터:        https://www.bloter.net/feed
ZDNet Korea:   https://zdnet.co.kr/rss.asp
Yonhap IT:     https://www.yna.co.kr/rss/it.xml

※ 모르면 사이트 주소 뒤에 /feed 또는 /rss.xml 을 붙여보세요

Google Sheets Append — 컬럼 매핑 표현식

제목:     {{ $json.title }}
링크:     {{ $json.link }}
발행일:   {{ $json.pubDate }}
수집일시: {{ $now.toFormat("yyyy-MM-dd HH:mm") }}
💡 TIPRSS 피드가 없는 사이트는 HTTP Request + HTML Extract 노드 조합으로 스크래핑할 수 있어요. 레시피 003에서 다룹니다.
⚠️ 주의Google Sheets API는 분당 호출 제한이 있습니다. 항목이 100개 이상이면 SplitInBatches 노드를 추가하고 Batch Size를 50으로 설정하세요.
⚡

워크플로우 JSON

아래 JSON을 복사해 n8n에 바로 임포트하세요

📥 n8n 임포트 방법
n8n 화면 우측 상단 메뉴 (⋮) → Import from JSON → 아래 JSON 전체 복사 후 붙여넣기 → Import 클릭
{
  "name": "recipe001_daily_todo_slack",
  "nodes": [
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "triggerAtHour": 9,
              "triggerAtMinute": 0
            }
          ]
        }
      },
      "id": "schedule-001-01",
      "name": "매일 오전 9시 트리거",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        200,
        400
      ]
    },
    {
      "parameters": {
        "resource": "sheet",
        "operation": "getRows",
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $env.TODO_SHEET_ID }}"
        },
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "할일목록"
        },
        "filtersUI": {
          "values": [
            {
              "lookupColumn": "날짜",
              "lookupValue": "={{ $now.format('yyyy-MM-dd') }}"
            }
          ]
        },
        "options": {}
      },
      "id": "sheets-001-02",
      "name": "오늘 할 일 가져오기",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [
        420,
        400
      ]
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": false,
            "leftValue": "",
            "typeValidation": "strict"
          },
          "conditions": [
            {
              "id": "cond-has-data",
              "leftValue": "={{ $json['할 일'] }}",
              "rightValue": "",
              "operator": {
                "type": "string",
                "operation": "notEquals"
              }
            }
          ],
          "combinator": "and"
        }
      },
      "id": "if-001-03",
      "name": "할 일 데이터 있는지 확인",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        640,
        400
      ]
    },
    {
      "parameters": {
        "jsCode": "const today = $now.setLocale('ko').toFormat('yyyy년 M월 d일 cccc');\nconst items = $input.all();\nconst todoLines = items.map(item => {\n  const todo = item.json['할 일'] || '';\n  const assignee = item.json['담당자'] || '';\n  return assignee ? `• ${todo} (${assignee})` : `• ${todo}`;\n}).join('\\n');\nreturn [{\n  json: {\n    message: `📅 *${today} 오늘의 할 일*\\n\\n${todoLines}\\n\\n화이팅! 💪`\n  }\n}];"
      },
      "id": "code-001-04",
      "name": "메시지 포맷 조합",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        860,
        300
      ]
    },
    {
      "parameters": {
        "resource": "message",
        "operation": "post",
        "channel": "#daily-todo",
        "text": "={{ $json.message }}",
        "otherOptions": {}
      },
      "id": "slack-001-05",
      "name": "Slack 할 일 알림 발송",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.2,
      "position": [
        1080,
        300
      ]
    },
    {
      "parameters": {
        "resource": "message",
        "operation": "post",
        "channel": "#daily-todo",
        "text": "📅 오늘 등록된 할 일이 없어요. 구글 시트를 확인해주세요!",
        "otherOptions": {}
      },
      "id": "slack-001-06",
      "name": "할 일 없음 처리",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.2,
      "position": [
        860,
        560
      ]
    }
  ],
  "connections": {
    "매일 오전 9시 트리거": {
      "main": [
        [
          {
            "node": "오늘 할 일 가져오기",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "오늘 할 일 가져오기": {
      "main": [
        [
          {
            "node": "할 일 데이터 있는지 확인",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "할 일 데이터 있는지 확인": {
      "main": [
        [
          {
            "node": "메시지 포맷 조합",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "할 일 없음 처리",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "메시지 포맷 조합": {
      "main": [
        [
          {
            "node": "Slack 할 일 알림 발송",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "timezone": "Asia/Seoul"
  },
  "meta": {
    "chapter": 1,
    "recipe": "001",
    "title": "매일 아침 오늘의 할 일 Slack 알림",
    "difficulty": "⭐",
    "estimatedTime": "15분",
    "apps": [
      "Google Sheets",
      "Slack"
    ],
    "workflowUrl": "www.koreaaitimes.com/books/n8n-vol2/recipe001"
  }
}
← 이전 레시피☰ 목차다음 레시피 →