봇의 뼈대가 n8n입니다. 도구 자체에서 배운 것과, “사람 없이 계속 돌리기”(스케줄링·호스팅)에서 배운 것을 모았어요. → 상위: 개발 지식 지도
n8n이 뭔가, 왜 골랐나
- n8n = 여러 서비스를 노드(블록)로 놓고 선으로 이어 자동화를 만드는 노코드 도구. 코드를 짜는 대신 화면에서 흐름을 그린다.
- 도구 비교 (2026-08-02 재조사):
| 도구 | 왜 안 됐나 |
|---|---|
| Zapier | 무료 플랜이 트리거 1 + 액션 1, 2단계까지만 |
| Make.com | 규모는 되지만 이 조합(RSS+AI 분류+텔레그램) 완성 템플릿이 없음 |
| RSS.app | RSS→텔레그램은 되지만 AI 분류 단계 자체가 없음 |
| n8n | 이 조합에 맞는 템플릿이 있고 여러 단계를 자유롭게 이어붙임 |
- 로컬 설치(
npx n8n, Docker 불필요)는 컴퓨터가 켜져 있을 때만 작동하는 제약이 있다.
노드 기본 개념
| 용어 | 쉬운 뜻 |
|---|---|
| 트리거 노드 | 워크플로우가 “언제 시작할지”를 정하는 첫 노드 (버튼 / 매일 6시 등) |
| RSS Read | RSS 주소에서 최신 글 목록을 가져오는 노드 |
| 아이템(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 모드라 기사 목록이 글자로만 들어간 것.
- 에러가 안 나고 조용히 이상한 결과만 나온다.
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 Interval1500 - PUT 노드 → Settings → Retry On Fail: Max Tries
3, Wait3000
배선 함정 — 노드를 건드린 뒤엔 선을 눈으로 본다
- 중간 노드를 지우면 양옆이 자동으로 이어진다.
- 연결선 위에 노드를 떨어뜨리면 그 사이에 끼워 넣어진다 → 엉뚱한 노드가 앞 노드의 출력을 입력으로 받게 된다.
- 자동 생성된 노드 이름이 다 똑같다(
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 작업 스케줄러 체크리스트
자동 실행이 안 될 때 순서대로:
- 프로그램 경로에 띄어쓰기가 있으면 타이핑하지 말고 “찾아보기”로 파일 선택 (따옴표가 자동으로 붙는다)
- 인수 칸에 예전 잔여값이 없는지 확인
- “조건” 탭 — 배터리로 작동 중이면 시작 안 함 / 전환 시 중지 체크박스 두 개 해제
- “일반” 탭 — “숨김” 체크 (안 하면 뒤에서 뜨는 검은 콘솔 창을 닫을 때 n8n도 같이 꺼진다)
호스팅 — “영구 무료”도 조건이 조용히 바뀐다
- Oracle Cloud 무료 티어는 2026년 6월에 공지 없이 사양이 반토막 났고(4 OCPU/24GB → 2 OCPU/12GB), 실제 발급 시 “용량 부족” 오류가 흔했다.
- 클라우드 서비스는 기억으로 판단하지 말고 그때그때 공식 페이지에서 최신 상태를 확인한다.
- 인스턴스를 옮길 때: 워크플로 구조(노드·표현식)는 Download / Import from File로 그대로 옮겨지지만, 크리덴셜(토큰·API 키)은 보안상 안 옮겨져서 새 인스턴스에서 다시 연결해야 한다.
- 최종적으로 로컬 → 클라우드(GCP 무료 VM) 셀프호스팅으로 정착.