개념 2026-09-08

n8n·스케줄링·호스팅

n8n 노드 개념, 저장과 Publish의 차이, Expression 모드, GitHub API 연동, 동시 요청 충돌, 배선 함정, 작업 스케줄러 체크리스트, "영구 무료"의 함정.

봇의 뼈대가 n8n입니다. 도구 자체에서 배운 것과, “사람 없이 계속 돌리기”(스케줄링·호스팅)에서 배운 것을 모았어요. → 상위: 개발 지식 지도

n8n이 뭔가, 왜 골랐나

  • n8n = 여러 서비스를 노드(블록)로 놓고 선으로 이어 자동화를 만드는 노코드 도구. 코드를 짜는 대신 화면에서 흐름을 그린다.
  • 도구 비교 (2026-08-02 재조사):
도구왜 안 됐나
Zapier무료 플랜이 트리거 1 + 액션 1, 2단계까지만
Make.com규모는 되지만 이 조합(RSS+AI 분류+텔레그램) 완성 템플릿이 없음
RSS.appRSS→텔레그램은 되지만 AI 분류 단계 자체가 없음
n8n이 조합에 맞는 템플릿이 있고 여러 단계를 자유롭게 이어붙임
  • 로컬 설치(npx n8n, Docker 불필요)는 컴퓨터가 켜져 있을 때만 작동하는 제약이 있다.

출처: 1주차 개념 — n8n 첫 연결과 Claude API 키

노드 기본 개념

용어쉬운 뜻
트리거 노드워크플로우가 “언제 시작할지”를 정하는 첫 노드 (버튼 / 매일 6시 등)
RSS ReadRSS 주소에서 최신 글 목록을 가져오는 노드
아이템(item)데이터 한 건을 세는 단위 (“50 items” = 기사 50개)
Execute step / Test workflow노드 하나만 실행 / 워크플로우 전체 실행
Aggregate필드를 배열로 묶는다. 여러 필드를 등록하면 각각 배열이 되고 같은 인덱스끼리 순서가 유지된다 (title[i]·link[i] 짝)
Merge여러 입력을 하나로 합침 (Mode: Append, Number of Inputs 지정)

“저장” ≠ “Publish”

n8n에서 저장과 Publish는 다르다. Schedule Trigger 같은 자동 트리거는 Publish를 해야 실제로 작동한다.

Expression 모드에서만 {{ }}가 값으로 바뀐다

  • 프롬프트·텍스트 칸이 Fixed 모드{{ JSON.stringify($json) }}글자 그대로 전달된다.
  • 실제로 겪은 버그: 위키용 LLM이 세 섹터를 전부 “없음”으로 답했는데, 같은 데이터로 텔레그램은 멀쩡했다. 원인은 프롬프트 칸이 Fixed 모드라 기사 목록이 글자로만 들어간 것.
  • 에러가 안 나고 조용히 이상한 결과만 나온다.

출처: n8n이 GitHub에 직접 글을 쓰게 만들기

GitHub API 연동 — 읽기 → 수정 → 쓰기

  • n8n에서는 GitHub 노드가 아니라 HTTP Request의 Generic Credential Type → Bearer Auth로 토큰을 등록한다.
  • 토큰: Fine-grained PAT, Repository access Only select repositories, Repository permissions → Contents: Read and write.
  • 파일을 수정하려면 GET(읽기) → 수정 → PUT(쓰기) 세 단계. PUT에는 message(커밋 메시지), base64로 인코딩한 content, 그리고 sha(GET에서 받은 값) 를 같이 보낸다. sha가 없으면 거절당한다.
  • 헤더 2개: Accept: application/vnd.github+json, X-GitHub-Api-Version: 2022-11-28.
  • PUT 노드가 초록인데 커밋이 없다 → Method가 아직 GET인 경우가 많다 (GET 노드를 복제해 만들며 안 바꿈). 출력에 commit 항목이 있으면 진짜 커밋된 것, content/sha만 있으면 읽기만 한 것.

동시 요청 409 충돌

세 파일을 거의 동시에 PUT하면:

409 - "is at ee01942... but expected d5ac83c..."

파일이 아니라 순서가 어긋난 것이다. 하나씩 간격을 두고 보내면 해결:

  • PUT 노드 → Options → Batching: Items per Batch 1, Batch Interval 1500
  • PUT 노드 → Settings → Retry On Fail: Max Tries 3, Wait 3000

배선 함정 — 노드를 건드린 뒤엔 선을 눈으로 본다

  • 중간 노드를 지우면 양옆이 자동으로 이어진다.
  • 연결선 위에 노드를 떨어뜨리면 그 사이에 끼워 넣어진다 → 엉뚱한 노드가 앞 노드의 출력을 입력으로 받게 된다.
  • 자동 생성된 노드 이름이 다 똑같다(Code in JavaScript, ...1, ...2) → 마지막 줄로 구분한다 (return results; = 섹터분리 / return out; = 병합 / return [{json:{text}}]; = 텔레그램).

출처: 근거 기사 링크 전수 검증기

RSS Read 노드는 User-Agent를 못 바꾼다

User-Agent가 비면 403을 뱉는 사이트(비즈니스포스트)가 있는데, RSS Read 노드는 옵션이 SSL 관련 하나뿐이라 바꿀 수가 없다. 우회하려면 노드 4개(HTTP Request → XML → Split Out → Limit)가 필요. 우회 비용이 크면 대체 소스를 찾는 게 합리적일 때가 있다 (한경 IT + 디일렉으로 교체).

스케줄링 — Windows 작업 스케줄러 체크리스트

자동 실행이 안 될 때 순서대로:

  1. 프로그램 경로에 띄어쓰기가 있으면 타이핑하지 말고 “찾아보기”로 파일 선택 (따옴표가 자동으로 붙는다)
  2. 인수 칸에 예전 잔여값이 없는지 확인
  3. “조건” 탭 — 배터리로 작동 중이면 시작 안 함 / 전환 시 중지 체크박스 두 개 해제
  4. “일반” 탭 — “숨김” 체크 (안 하면 뒤에서 뜨는 검은 콘솔 창을 닫을 때 n8n도 같이 꺼진다)

출처: 3섹터 분류 완성 + n8n 클라우드 전환

호스팅 — “영구 무료”도 조건이 조용히 바뀐다

  • Oracle Cloud 무료 티어는 2026년 6월에 공지 없이 사양이 반토막 났고(4 OCPU/24GB → 2 OCPU/12GB), 실제 발급 시 “용량 부족” 오류가 흔했다.
  • 클라우드 서비스는 기억으로 판단하지 말고 그때그때 공식 페이지에서 최신 상태를 확인한다.
  • 인스턴스를 옮길 때: 워크플로 구조(노드·표현식)는 Download / Import from File로 그대로 옮겨지지만, 크리덴셜(토큰·API 키)은 보안상 안 옮겨져서 새 인스턴스에서 다시 연결해야 한다.
  • 최종적으로 로컬 → 클라우드(GCP 무료 VM) 셀프호스팅으로 정착.