첫 번째 워크플로우 — Schedule + HTTP Request로 날씨 알림 만들기
이론은 끝났다. 지금부터 손을 움직여보자. 15분이면 "매일 아침 날씨를 알려주는 봇"을 만들 수 있다.
이번에 만들 워크플로우
완성된 워크플로우의 전체 구조는 이렇다:
[Schedule Trigger] → [HTTP Request] → [Set/Edit Fields] → [결과 확인]
매일 오전 8시 날씨 API 호출 데이터 정제 (나중에 Slack 등)
동작 흐름:
- 매일 오전 8시에 자동 시작
- OpenWeatherMap API를 호출해서 서울 날씨를 가져온다
- 응답 데이터에서 필요한 정보만 추출한다
- 결과를 확인한다 (이후에 Slack, Email 등으로 전송 가능)
사전 준비: OpenWeatherMap API 키 발급
날씨 데이터를 가져오려면 API 키가 필요하다. 무료로 발급받을 수 있다.
- OpenWeatherMap에 가입한다
- 로그인 후 API Keys 메뉴로 이동한다
- 기본 키가 이미 생성되어 있다. 복사해두자
API Key 예시: a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6
💡 무료 플랜(Free) 으로 분당 60회, 월 1,000,000회 호출이 가능하다. 우리 용도에는 충분하다.
Step 1: 새 워크플로우 생성
- n8n을 열고 "Add Workflow" 클릭
- 워크플로우 이름을 "☀️ 매일 날씨 알림" 으로 변경 (상단 바에서 이름 클릭)
깨끗한 캔버스가 준비되었다.
Step 2: Schedule Trigger 추가
매일 정해진 시간에 워크플로우를 시작할 Schedule Trigger 노드를 추가하자.
Tab키를 눌러 노드 검색 패널을 연다Schedule을 검색하고 Schedule Trigger를 클릭- 설정:
| 설정 | 값 | 설명 |
|---|---|---|
| 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 노드를 연결하자.
- Schedule Trigger 노드 오른쪽의
+버튼 클릭 HTTP검색 → HTTP Request 선택- 설정:
| 설정 | 값 |
|---|---|
| Method | GET |
| URL | https://api.openweathermap.org/data/2.5/weather |
- 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 응답에는 필요 없는 정보가 너무 많다. 꼭 필요한 것만 뽑아내자.
- HTTP Request 노드 오른쪽의
+클릭 Edit검색 → Edit Fields (Set) 선택- Mode: "Manual Mapping"
- 필드를 하나씩 추가:
| 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 | 풍속 |
- 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: 전체 워크플로우 실행
전체 워크플로우를 한 번에 실행해보자.
Ctrl+Enter(또는 상단의 "Execute Workflow" 버튼 클릭)- 모든 노드에 ✅ 표시가 되는지 확인
[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 문법의 모든 것, 내장 변수, 그리고 실수를 줄여주는 디버깅 팁까지.