n8n 실습 편: 사이트 상태 점검 자동화 만들기 (스크린샷 따라하기)

시리즈 3편이다. 비개발자 편에서 무엇을 자동화할지 고르는 법을, 개발자 편에서 구조와 기능을 다뤘다. 이번엔 실제로 하나 만든다.

만들 것은 사이트 상태 점검이다. 6시간마다 사이트를 호출해서 응답이 정상이 아니면 알림 내용을 만든다.

이걸 고른 이유가 있다. 외부 계정이 하나도 필요 없어서 누구나 그대로 따라 할 수 있고, 그러면서 n8n 의 핵심 네 가지(스케줄 트리거·HTTP 요청·조건 분기·오류 설정)를 전부 쓴다.

아래 화면은 전부 실제로 만들면서 찍은 것이다. n8n 1.120 기준이라 버전이 다르면 위치가 조금 다를 수 있다.

0. 띄우기

Docker 가 있으면 한 줄이다.

docker run -d --name n8n -p 5678:5678 -v n8n_data:/home/node/.n8n -e GENERIC_TIMEZONE=Asia/Seoul -e TZ=Asia/Seoul n8nio/n8n

-v 를 빼면 워크플로가 컨테이너와 함께 사라진다. 시간대를 안 넣으면 스케줄이 UTC 로 돌아서 “9시에 설정했는데 18시에 온다” 가 된다.

브라우저에서 localhost:5678 을 열면 계정 만드는 화면이 나온다. 이건 이 인스턴스의 관리자 계정이고 외부 서비스와 무관하다.

들어가면 이 화면이다.

n8n 첫 화면. 워크플로·자격증명·실행 이력 탭이 보인다
n8n 첫 화면. 워크플로·자격증명·실행 이력 탭이 보인다

위쪽 지표는 아직 전부 0이다. Create workflow 를 누른다.

1. 빈 캔버스

비어 있는 n8n 워크플로 캔버스
비어 있는 n8n 워크플로 캔버스

가운데 Add first step 이 첫 노드, 즉 트리거를 고르라는 뜻이다. 워크플로는 반드시 트리거로 시작한다.

누르면 패널이 열린다.

노드 추가 패널. 트리거와 앱을 검색해 고른다
노드 추가 패널. 트리거와 앱을 검색해 고른다

여기서 검색해서 고른다. 이번엔 Schedule Trigger 를 쓴다. 목록을 훑어보면 어떤 트리거가 있는지 감이 온다 — 시간, 웹훅, 앱 이벤트, 폼, 챗.

2. 워크플로 조립

노드 네 개를 이어 붙인다.

순서노드하는 일
1Schedule Trigger6시간마다 시작
2HTTP Request사이트를 GET 으로 호출
3IF상태 코드가 200인지 판단
4Edit Fields (Set) ×2정상 기록 / 알림 내용 만들기

하나씩 추가해도 되지만, 완성본 JSON 을 캔버스에 그대로 붙여넣을 수도 있다. 아래를 복사해서 캔버스를 클릭하고 Ctrl+V(맥은 Cmd+V) 하면 그대로 생긴다. 처음 만들 때는 손으로 해보고, 두 번째부터 이 방법을 쓰면 빠르다.

{"name":"사이트 상태 점검","nodes":[{"parameters":{"rule":{"interval":[{"field":"hours","hoursInterval":6}]}},"name":"Schedule Trigger","type":"n8n-nodes-base.scheduleTrigger","typeVersion":1.2,"position":[-240,0]},{"parameters":{"url":"https://example.com/","options":{"response":{"response":{"fullResponse":true,"neverError":true}}}},"name":"HTTP Request","type":"n8n-nodes-base.httpRequest","typeVersion":4.2,"position":[-20,0],"retryOnFail":true,"maxTries":3},{"parameters":{"conditions":{"options":{"version":2,"typeValidation":"strict"},"conditions":[{"leftValue":"={{ $json.statusCode }}","rightValue":200,"operator":{"type":"number","operation":"equals"}}],"combinator":"and"}},"name":"정상인가?","type":"n8n-nodes-base.if","typeVersion":2.2,"position":[200,0]}],"connections":{"Schedule Trigger":{"main":[[{"node":"HTTP Request","type":"main","index":0}]]},"HTTP Request":{"main":[[{"node":"정상인가?","type":"main","index":0}]]}}}

붙여넣고 나면 이렇게 된다.

완성된 워크플로. 스케줄 트리거에서 HTTP 요청, IF 분기로 이어진다
완성된 워크플로. 스케줄 트리거에서 HTTP 요청, IF 분기로 이어진다

왼쪽부터 오른쪽으로 흐르고, IF 노드에서 true / false 두 갈래로 갈린다.

3. HTTP Request 설정 — 여기가 함정이다

노드를 더블클릭하면 설정이 열린다.

HTTP Request 노드 파라미터 설정 화면
HTTP Request 노드 파라미터 설정 화면

URL 만 넣으면 될 것 같지만 옵션 두 개를 반드시 봐야 한다.

Never Error. 이걸 켜지 않으면 사이트가 500 을 반환하는 순간 노드가 실패로 처리되어 워크플로가 거기서 멈춘다. 그러면 “문제를 감지하는 자동화” 가 정작 문제일 때 죽는다. 상태 코드를 판단 재료로 쓰려면 오류도 데이터로 받아야 한다.

Full Response. 기본값은 응답 본문만 준다. 상태 코드를 보려면 이걸 켜서 헤더와 코드까지 받아야 한다. 켜면 $json.statusCode 로 접근할 수 있다.

이 둘을 모르면 IF 노드에서 statusCode 가 계속 비어 있어서 한참 헤맨다.

4. 조건 분기

IF 노드 조건 설정. 상태 코드가 200인지 비교한다
IF 노드 조건 설정. 상태 코드가 200인지 비교한다

왼쪽 값에 {{ $json.statusCode }}, 비교는 Number → is equal to, 오른쪽에 200.

{{ }} 가 표현식이다. 앞 노드가 넘긴 데이터를 참조할 때 쓴다. 왼쪽 패널에 앞 노드의 실제 출력이 보이니, 필드 이름이 헷갈리면 거기서 확인하면 된다.

5. 실패에 대비하기

이 절을 건너뛰면 자동화가 아니라 시한폭탄이다.

노드 설정 창 위쪽의 Settings 탭으로 간다.

노드 Settings 탭. Retry On Fail, Max Tries, On Error 설정
노드 Settings 탭. Retry On Fail, Max Tries, On Error 설정
설정이번에 쓸 값이유
Retry On Fail네트워크는 가끔 그냥 실패한다. 한 번 실패로 알림을 보내면 늑대 소년이 된다
Max. Tries3기본값
Wait Between Tries1000ms즉시 재시도는 같은 이유로 또 실패한다
On ErrorStop Workflow기본값. 여기선 그대로 둔다

On Error 에는 세 가지가 있다.

  • Stop Workflow — 전체 중단 (기본)
  • Continue — 오류를 무시하고 직전 유효 데이터로 진행
  • Continue (using error output) — 오류를 별도 출력선으로 흘려보냄

세 번째가 특히 쓸모 있다. 성공과 실패 흐름을 화면에서 갈라 놓을 수 있어서, 실패했을 때만 다른 처리를 붙일 수 있다.

6. 실행해보기

아래 Execute workflow 를 누른다. 스케줄 트리거가 있어도 수동 실행이 된다.

실행 결과. 노드마다 초록 체크와 1 item 배지가 붙고 true 분기만 실행됐다
실행 결과. 노드마다 초록 체크와 1 item 배지가 붙고 true 분기만 실행됐다

노드마다 초록 체크가 붙고 연결선에 1 item 이 표시된다. 그리고 중요한 게 하나 보인다 — true 쪽만 초록이고 false 쪽은 회색이다. 사이트가 정상이라 위쪽으로만 흐른 것이다.

이게 IF 노드가 실제로 동작한 증거다. 조건이 맞는지 확인하려면 이 색만 보면 된다.

데이터를 자세히 보려면 아래 Logs 를 연다.

실행 로그 패널. 노드별 입출력 데이터를 확인한다
실행 로그 패널. 노드별 입출력 데이터를 확인한다

노드별 입력과 출력이 그대로 남는다. 어디서 값이 틀어졌는지 여기서 찾는다.

7. 조용한 실패 막기 — 가장 중요한 단계

지금 이 워크플로에는 문제가 하나 있다. 워크플로 자체가 죽으면 아무도 모른다.

n8n 에 로그인해서 실행 이력을 매일 확인할 사람은 없다. 그래서 실패를 알려줄 장치가 따로 필요하다.

먼저 워크플로를 저장한다. 저장 전에는 설정 메뉴가 비활성이다. 그다음 우측 상단 Settings.

워크플로 설정. Error Workflow 항목에서 실패 시 실행할 워크플로를 지정한다
워크플로 설정. Error Workflow 항목에서 실패 시 실행할 워크플로를 지정한다

Error Workflow 항목이 그것이다. 여기에 지정한 워크플로가 이 워크플로 실패 시 대신 실행된다.

만드는 법은 간단하다.

  1. 새 워크플로를 만들고 첫 노드로 Error Trigger 를 고른다.
  2. 그 뒤에 알림 노드(메신저·메일 등)를 붙인다.
  3. 이름을 공통 에러 알림 같은 걸로 저장한다.
  4. 각 워크플로의 Settings 에서 이걸 지정한다.

하나 만들어서 전 워크플로에 같은 걸 지정하면 된다. Error Trigger 는 이런 데이터를 받는다.

{
  "execution": {
    "id": "231",
    "url": "https://n8n.example.com/execution/231",
    "error": { "message": "Example Error Message" },
    "lastNodeExecuted": "Node With Error"
  },
  "workflow": { "id": "1", "name": "Example Workflow" }
}

lastNodeExecutedurl 이 있어서 알림에 “어느 워크플로의 어느 노드에서 터졌고, 여기 링크” 까지 담을 수 있다.

한 가지 주의. 트리거 노드 자체에서 실패하면 execution.idurl 이 안 들어온다. 실행이 시작되지도 않았기 때문이다. 알림 문구를 만들 때 이 필드가 없는 경우를 고려해야 한다.

8. 켜기

캔버스 우측 상단의 Inactive 토글을 켜면 스케줄이 실제로 돌기 시작한다.

순서를 지키자. 만들고 → 실행해보고 → Error Workflow 붙이고 → 그다음에 켠다. 켜는 걸 먼저 하면 오류 알림 붙이는 걸 잊는다.

다음에 바꿔볼 것

이 워크플로를 뼈대로 조금씩 바꾸면 그대로 쓸 수 있는 것들이 나온다.

  • URL 을 여러 개로. 앞에 목록을 만들어 넣으면 여러 사이트를 한 번에 점검한다. 아이템이 여러 개면 뒤 노드가 그만큼 반복 실행되는 게 n8n 의 기본 동작이다
  • 조건을 바꾸기. 상태 코드 대신 응답 시간이나 본문에 특정 문자열이 있는지로
  • 알림을 실제로 보내기. false 쪽 끝에 메신저 노드를 붙인다. 이때 자격증명을 한 번 등록하면 다른 워크플로에서도 쓴다

정리

만든 것은 노드 다섯 개짜리 워크플로다. 그런데 여기에 n8n 을 쓸 때 실제로 필요한 게 거의 다 들어 있다 — 트리거, 외부 호출, 조건 분기, 재시도, 그리고 실패 알림.

첫 자동화는 이 정도면 충분하다. 두 번째는 이게 2주 굴러간 뒤에 만드는 게 좋다. 하나가 실제로 도는 걸 봐야 다음에 뭘 자동화할지 제대로 고를 수 있다.