첫 번째 워크플로우 — Schedule + HTTP Request로 날씨 알림 만들기

첫 번째 워크플로우 — Schedule + HTTP Request로 날씨 알림 만들기

이론은 끝났다. 지금부터 손을 움직여보자. 15분이면 "매일 아침 날씨를 알려주는 봇"을 만들 수 있다.

이번에 만들 워크플로우

완성된 워크플로우의 전체 구조는 이렇다:

[Schedule Trigger]  →  [HTTP Request]  →  [Set/Edit Fields]  →  [결과 확인]
  매일 오전 8시           날씨 API 호출       데이터 정제           (나중에 Slack 등)

동작 흐름:

  1. 매일 오전 8시에 자동 시작
  2. OpenWeatherMap API를 호출해서 서울 날씨를 가져온다
  3. 응답 데이터에서 필요한 정보만 추출한다
  4. 결과를 확인한다 (이후에 Slack, Email 등으로 전송 가능)

사전 준비: OpenWeatherMap API 키 발급

날씨 데이터를 가져오려면 API 키가 필요하다. 무료로 발급받을 수 있다.

  1. OpenWeatherMap에 가입한다
  2. 로그인 후 API Keys 메뉴로 이동한다
  3. 기본 키가 이미 생성되어 있다. 복사해두자
API Key 예시: a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6

💡 무료 플랜(Free) 으로 분당 60회, 월 1,000,000회 호출이 가능하다. 우리 용도에는 충분하다.


Step 1: 새 워크플로우 생성

  1. n8n을 열고 "Add Workflow" 클릭
  2. 워크플로우 이름을 "☀️ 매일 날씨 알림" 으로 변경 (상단 바에서 이름 클릭)

깨끗한 캔버스가 준비되었다.


Step 2: Schedule Trigger 추가

매일 정해진 시간에 워크플로우를 시작할 Schedule Trigger 노드를 추가하자.

  1. Tab 키를 눌러 노드 검색 패널을 연다
  2. Schedule 을 검색하고 Schedule Trigger를 클릭
  3. 설정:
설정 설명
Trigger Interval Days 매일 실행
Days Between Triggers 1 1일마다
Trigger at Hour 8 오전 8시
Trigger at Minute 0 정각

이제 매일 오전 8시에 이 워크플로우가 자동으로 시작된다.

🔍 Cron 모드: 더 세밀한 스케줄링이 필요하면 "Trigger Times" → "Custom (Cron)" 을 선택할 수 있다. Cron에 대해서는 12편에서 자세히 다룬다.


Step 3: HTTP Request 노드 — 날씨 API 호출

Schedule Trigger 다음에 HTTP Request 노드를 연결하자.

  1. Schedule Trigger 노드 오른쪽의 + 버튼 클릭
  2. HTTP 검색 → HTTP Request 선택
  3. 설정:
설정
Method GET
URL https://api.openweathermap.org/data/2.5/weather
  1. Send Query Parameters 를 ON으로 설정하고 파라미터 추가:
Parameter Value 설명
q Seoul,KR 도시명, 국가코드
appid (발급받은 API 키) 인증 키
units metric 섭씨 온도 사용
lang kr 한국어 설명

완성된 URL은 이런 형태가 된다:

https://api.openweathermap.org/data/2.5/weather?q=Seoul,KR&appid=YOUR_KEY&units=metric&lang=kr

테스트 실행

노드를 클릭하고 상단의 "Test step" 버튼을 눌러보자. (또는 노드 우클릭 → Execute Node)

성공하면 JSON 뷰에서 이런 데이터가 보인다:

{
  "coord": { "lon": 126.9778, "lat": 37.5683 },
  "weather": [
    {
      "id": 800,
      "main": "Clear",
      "description": "맑음",
      "icon": "01d"
    }
  ],
  "main": {
    "temp": 18.5,
    "feels_like": 17.2,
    "temp_min": 16.0,
    "temp_max": 20.1,
    "humidity": 45
  },
  "wind": { "speed": 3.5, "deg": 270 },
  "name": "Seoul"
}

축하한다! 첫 번째 API 호출에 성공했다. 🎉


Step 4: Edit Fields 노드 — 데이터 정제

API 응답에는 필요 없는 정보가 너무 많다. 꼭 필요한 것만 뽑아내자.

  1. HTTP Request 노드 오른쪽의 + 클릭
  2. Edit 검색 → Edit Fields (Set) 선택
  3. Mode: "Manual Mapping"
  4. 필드를 하나씩 추가:
Field Name Value (Expression) 설명
도시 {{ $json.name }} 도시명
날씨 {{ $json.weather[0].description }} 날씨 설명 (한글)
현재온도 {{ $json.main.temp }}°C 현재 온도
체감온도 {{ $json.main.feels_like }}°C 체감 온도
최저온도 {{ $json.main.temp_min }}°C 최저 온도
최고온도 {{ $json.main.temp_max }}°C 최고 온도
습도 {{ $json.main.humidity }}% 습도
풍속 {{ $json.wind.speed }}m/s 풍속
  1. Keep Only Set Fields 옵션을 ON으로 설정 (다른 필드는 제거)

Expression 작성법

위에서 {{ $json.weather[0].description }} 같은 문법이 나왔다. 이것이 n8n의 Expression이다.

핵심 문법 3가지만 기억하자:

{{ $json.필드명 }}              → 현재 아이템의 필드 참조
{{ $json.객체.중첩필드 }}        → 중첩 객체 접근
{{ $json.배열[인덱스].필드 }}    → 배열의 특정 요소 접근

💡 쉽게 입력하는 법: 필드 값 입력란에서 = 아이콘을 클릭하면 Expression 모드로 전환된다. 왼쪽 패널에서 이전 노드의 출력 필드를 드래그 앤 드롭으로 끌어올 수 있다.

테스트 결과

"Test step"을 실행하면 정제된 결과가 나온다:

{
  "도시": "Seoul",
  "날씨": "맑음",
  "현재온도": "18.5°C",
  "체감온도": "17.2°C",
  "최저온도": "16°C",
  "최고온도": "20.1°C",
  "습도": "45%",
  "풍속": "3.5m/s"
}

깔끔하다. 필요한 정보만 남았다.


Step 5: 전체 워크플로우 실행

전체 워크플로우를 한 번에 실행해보자.

  1. Ctrl+Enter (또는 상단의 "Execute Workflow" 버튼 클릭)
  2. 모든 노드에 ✅ 표시가 되는지 확인
[Schedule Trigger] ✅ ──▶ [HTTP Request] ✅ ──▶ [Edit Fields] ✅
     1 item                    1 item                1 item

완벽하다!


보너스: 알림 전송 추가하기

지금은 결과를 눈으로만 확인하고 있다. 실제로 알림을 받으려면 마지막에 전송 노드를 추가하면 된다.

옵션 A: 이메일 전송

Edit Fields 뒤에 Gmail 또는 Send Email 노드를 연결:

[Edit Fields] ──▶ [Send Email]

옵션 B: Slack 메시지

Edit Fields 뒤에 Slack 노드를 연결:

[Edit Fields] ──▶ [Slack: 메시지 전송]

옵션 C: Telegram 메시지

[Edit Fields] ──▶ [Telegram: 메시지 전송]

각 서비스의 상세 설정법은 Part 3(13~16편)에서 다루니, 지금은 워크플로우 구조를 이해하는 데 집중하자.


메시지 포맷팅 (미리보기)

전송할 메시지를 예쁘게 만들고 싶다면, Edit Fields에 메시지 필드를 추가하자:

{{ "☀️ 오늘의 서울 날씨\n\n" +
   "날씨: " + $json.weather[0].description + "\n" +
   "온도: " + $json.main.temp + "°C" +
   " (체감 " + $json.main.feels_like + "°C)\n" +
   "최저/최고: " + $json.main.temp_min + "°C / " +
   $json.main.temp_max + "°C\n" +
   "습도: " + $json.main.humidity + "%\n" +
   "풍속: " + $json.wind.speed + "m/s" }}

결과:

☀️ 오늘의 서울 날씨

날씨: 맑음
온도: 18.5°C (체감 17.2°C)
최저/최고: 16°C / 20.1°C
습도: 45%
풍속: 3.5m/s

트러블슈팅

처음 만들다 보면 에러를 만날 수 있다. 흔한 문제와 해결법:

401 Unauthorized

ERROR: Request failed with status code 401

원인: API 키가 잘못되었거나 아직 활성화되지 않았다.
해결: OpenWeatherMap 가입 후 API 키가 활성화되려면 최대 2시간이 걸릴 수 있다. 잠시 기다린 후 다시 시도하자.

404 Not Found

ERROR: Request failed with status code 404

원인: 도시명이 잘못되었다.
해결: q 파라미터를 Seoul,KR 형식으로 정확히 입력했는지 확인.

Expression 에러

ERROR: [Edit Fields] $json.weather[0].description is undefined

원인: HTTP Request 노드가 실패했거나 데이터 구조가 예상과 다르다.
해결: HTTP Request 노드를 먼저 단독 실행하고, JSON 뷰에서 데이터 구조를 확인하자.


🧪 직접 해보기

과제 1: 다른 도시 추가

q 파라미터를 바꿔서 도쿄(Tokyo,JP), 뉴욕(New York,US), 런던(London,GB)의 날씨도 가져와보자.

과제 2: 여러 도시 동시에

HTTP Request 노드를 3개 만들어 Merge 노드로 합쳐보자. (Merge 노드는 9편에서 자세히 배운다)

         ┌──▶ [서울 날씨] ──┐
[Trigger] ──▶ [도쿄 날씨] ──▶ [Merge] ──▶ [결과]
         └──▶ [런던 날씨] ──┘

과제 3: 조건 분기 추가

온도가 30°C 이상이면 "🔥 폭염 주의!", 0°C 이하면 "🥶 한파 주의!" 메시지를 추가해보자. (IF 노드는 9편에서 배운다)


📝 정리

  • [x] Schedule Trigger: 매일/매시간 등 정해진 시간에 워크플로우를 시작하는 트리거
  • [x] HTTP Request: 외부 API를 호출하여 데이터를 가져오는 만능 노드
  • [x] Edit Fields(Set): 필요한 데이터만 추출·가공하는 데이터 정제 노드
  • [x] Expression: {{ $json.필드명 }}으로 이전 노드의 데이터를 참조하는 문법
  • [x] 워크플로우 테스트: 노드별 단독 실행 → 전체 실행 순서로 디버깅

다음 편 예고

5편: 데이터의 흐름을 이해하자 — Expression, 변수, JSON 경로

n8n의 가장 중요한 개념인 "데이터 흐름"을 깊이 파헤친다. Expression 문법의 모든 것, 내장 변수, 그리고 실수를 줄여주는 디버깅 팁까지.