교육 담당자의 반복업무 워크플로우 구성해보기 (n8n, Claude Code)

고슴도치 · Claude Code+n8n 자동화 · · 좋아요 0 · 답글 0

연재 Claude Code+n8n 자동화 6/12편

신규입사자 온보딩 안내, n8n으로 처음부터 자동화해 본 기록

사용한 도구

도구

쓴 곳

Claude Code (데스크톱 앱)

설치, 연결, 워크플로우 설계·생성·검증까지 대화로 진행

n8n (내 PC에 npm으로 설치)

워크플로우 실행

n8n-mcp

Claude가 n8n 노드 설정을 조회하고 검증하는 데 사용

Google 시트 · Gmail · Google 캘린더

입사자 명단, 안내 메일 발송, 일정 초대

Claude가 노드 설정을 조회·검증해서 n8n에 워크플로우를 만들면, 저는 n8n 화면에서 실행 버튼을 누르고 결과를 확인했습니다.

1) n8n 설치

공식 문서를 주고 설치를 맡겼습니다.

이어서 목적을 알려줬습니다. 운영용이 아닌 테스트 목적이라, Docker 대신 npm 설치를 그대로 쓰기로 했습니다.

2) n8n-mcp 연결 (API 키는 직접 입력)

API 키를 채팅에 넣지 않으려고 순서를 정해서 요청했습니다.

이 폴더에서 내 n8n에 워크플로우를 만들 수 있게 n8n-mcp를 연결해줘.

중요: n8n API 키는 채팅에 입력하지 않을 거야.

  1. 이 폴더에 .mcp.json 파일을 만들되, API 키 자리에는 YOUR_N8N_API_KEY 라고 적어줘.

  2. 그 파일을 내가 직접 열어서 키를 붙여넣을 수 있게 열어줘. (Mac은 open, Windows는 notepad로)

  3. 내가 저장했다고 말하면 그때 이어서 진행해줘. 키 값은 절대 읽거나 화면에 출력하지 마.

  4. n8n-mcp 실행에 필요한 것(npx/Node.js)이 없으면 먼저 알려주고 설치를 도와줘.

  5. 연결이 끝나면 내가 연결됐는지 확인하는 방법을 알려줘.

WEBHOOK_SECURITY_MODE: moderate는 처음에 없었는데, PC의 n8n에 접속하려면 꼭 필요해서 나중에 추가했습니다. (*시행착오에 정리)

준비해 둔 n8n 워크플로우 스킬(zip)도 설치했습니다.

스킬에 정리된 원칙(워크플로우는 꺼진 상태로 만들기, 계정 연결은 사용자가 직접 하기, 노드 사이 데이터 참조 주의)을 이번 작업에서도 따랐습니다.

3) 워크플로우 설계

1주차에 확정한 워크플로우 문서를 첨부하고, 뉴스레터 자동화 예시를 참고하라고 했습니다.

이 워크플로우를 n8n 이용해서 구체화하려고 하는데, 아래 예시 참고해줘

Schedule Trigger (매일 10시) → Set: 검색 키워드 (예: "마케팅") → RSS Read: Google 뉴스 검색 (키워드로 동적 URL 생성) → Code: 최근 뉴스 정리 (24시간 필터 + 중복 제거 + 따옴표 치환) → Google Gemini: AI 요약 (JSON 구조로 응답) → Code: 뉴스레터 HTML 생성 (카드형 레이아웃 조립) → Gmail: 이메일 발송 (HTML 메일)

"정해진 시간에 실행 → 설정값 → 데이터 읽기 → 가공 → 발송"이라는 뼈대를 가져오고, 설계하면서 다섯 가지를 정했습니다.

  • 받는 날과 보내는 날을 나눴습니다. 알림 메일을 받는 날과 리더에게 안내하는 날(입사 2주 전)이 다릅니다. 둘 사이를 시트로 잇고, 이번에는 "매일 시트 확인 → 안내" 쪽을 먼저 만들었습니다.

  • 예시의 AI 요약은 뺐습니다. 안내 메일은 매번 같은 양식이라 AI가 새로 쓸 필요가 없습니다. 입사자 정보를 외부 AI로 보내지 않아도 됩니다.

  • "발송일 = 오늘"이 아니라 "발송일 ≤ 오늘"로 걸렀습니다. 내 PC의 n8n은 PC가 꺼져 있으면 실행되지 않습니다. 알림 메일이 늦게 와서 발송일이 지난 경우도 있습니다. 두 경우 모두 다음 실행 때 발송됩니다.

  • 바뀔 수 있는 값은 한 노드에 모았습니다. 메일 문안, 제목, Day 1 교육 시간·장소를 '안내 설정값' 노드에 넣었습니다. 양식이 바뀌어도 이 노드만 고치면 됩니다.

  • Google로 먼저 만들고, 가상 데이터로 테스트했습니다. 사내 메일·캘린더(네이버 웍스) 연동은 아직 확인 전이고, n8n에 전용 노드도 없었습니다. 테스트는 가상 입사자 4명으로 하고, 리더 메일은 모두 제 메일로 넣었습니다.

4) 한 단계씩 만들기

단계

만든 것

확인한 것

1

가상 입사자 1명 → 발송일 계산

입사일 14일 전이 맞게 계산되는지

2

구글시트에서 명단 읽기 → 오늘 보낼 사람만 거르기

4명 중 2명만 걸러지는지

3

안내 메일 발송 → 시트에 "완료" 기록

메일이 오는지, 다시 실행해도 중복 발송이 없는지

4

캘린더 초대 추가

일정 시간·장소·설명이 맞게 들어가는지

5

시작을 "평일 오전 10시"로 변경

전체 흐름이 한 번에 동작하는지

3단계에서 Claude가 임시 메일 문안을 만들었는데, 실제로 보내던 상위조직장 안내 메일(멘토 지정 · 좌석 지정 요청, 30·60일 면담 안내)을 붙여넣어 양식으로 쓰게 했습니다.

사람마다 바뀌는 부분만 시트에서 자동으로 채웁니다.

  • 부서, 성함, 입사일, 입사일 요일 (예: 26년 10월 26일 (월))

  • Day 1 교육 일시

마지막으로 노드 이름을 하는 일이 바로 보이게 바꿨습니다.

최종 워크플로우

평일 오전 10시

→ 안내 설정값

→ 시트에서 신규입사자 명단 읽기

→ 안내 메일 발송일 계산 (D-14)

→ 안내 메일 발송 일정 체크, 오늘 보낼 사람만 소팅

→ 안내 메일 내용 구성하기

→ 캘린더에 온보딩 교육 일정 초대

→ 리더 대상 온보딩 안내 메일 발송

→ 시트에 발송 기록하기

핵심인 안내 메일 발송일 계산 (D-14) 노드의 코드입니다.

// 입사일 2주 전을 안내 발송일로 계산하고, 오늘 보낼 대상인지 표시합니다

const DAYS_BEFORE = 14;

const DAY = 86400000;

// '2026-10-26', '2026. 10. 26', '2026/10/26' 모두 읽을 수 있게 숫자만 뽑습니다

const toUtc = (value) => {

const m = String(value).match(/(\d{4})\D+(\d{1,2})\D+(\d{1,2})/);

return m ? Date.UTC(Number(m[1]), Number(m[2]) - 1, Number(m[3])) : null;

};

const today = toUtc($today.toFormat('yyyy-MM-dd'));

return $input.all().map((item) => {

const start = toUtc(item.json['입사일']);

if (start === null) {

return { json: { ...item.json, '안내 발송일': '입사일 확인 필요', '발송까지 남은 일수': null, '오늘 발송 대상': false } };

}

const send = start - DAYS_BEFORE * DAY;

const daysLeft = Math.round((send - today) / DAY);

return {

json: {

...item.json,

'안내 발송일': new Date(send).toISOString().slice(0, 10),

'발송까지 남은 일수': daysLeft,

// 발송일이 오늘이거나 지났고, 아직 안 보낸 사람만 대상

'오늘 발송 대상': daysLeft <= 0 && item.json['메일 발송'] === '대기',

},

};

});

[캡처: 구글시트 진행 현황] [캡처: 받은 안내 메일] [캡처: 캘린더 일정]

결과

가상 입사자 4명으로 테스트했습니다. (테스트일 10/12)

입사자

입사일

안내 발송일

시트 상태

결과

A

10/26

10/12 (당일)

대기

캘린더 초대 + 메일 발송 + 시트 기록

B

10/20

10/6 (지남)

대기

캘린더 초대 + 메일 발송 + 시트 기록

C

11/9

10/26

대기

대상 아님 (아직 발송일 전)

D

10/19

10/5

완료

대상 아님 (이미 발송)

  • 성공 기준(입사 2주 전 안내 메일 발송 + 캘린더 초대)을 가상 데이터로 확인했습니다.

  • 한 번 보낸 사람은 시트에 "완료"로 남아서, 다시 실행해도 중복 발송되지 않습니다.

  • 평일 10시 자동 실행 워크플로우는 만들어 두었습니다. 켜는 순간부터 실제 메일이 나가기 때문에 꺼진 상태로 두고, 켜기는 직접 하기로 했습니다.

배운 점과 나만의 꿀팁

  • 완성 설계를 한 번에 받지 말고, 작게 만들고 바로 실행해 보기. 단계마다 결과를 눈으로 보니 n8n 구조가 훨씬 빨리 이해됐습니다.

  • API 키는 채팅에 넣지 않기. "키 자리는 비워서 파일을 만들고, 메모장으로 열어줘. 저장했다고 하면 이어서 해줘"라고 순서를 정해 주면 됩니다.

  • AI가 노드는 만들어 줘도, 업무 기준은 스스로 정해야 합니다. 발송 시점(D-14), 실제 메일 문안, 노드 이름은 제가 정했습니다. 실제 쓰던 메일 문안을 주니 결과물이 바로 쓸 수 있는 수준이 됐습니다.

  • "보냈음/안 보냈음"을 시트에 남기기. 발송 여부 열 하나로 중복 발송도 막고, 조용히 안 나간 건도 찾을 수 있습니다.

  • 테스트는 가상 데이터로, 리더 메일은 내 메일로. 메일과 초대가 실제로 어떻게 보이는지 직접 받아 보면서 확인할 수 있습니다.

과정 중 겪은 시행착오

설치 · 연결

  • npm으로 설치했더니 "npm 설치는 n8n 3.0부터 지원 중단, 앞으로는 Docker"라는 경고가 나왔습니다. 학습용이라 그대로 진행했습니다.

  • n8n-mcp가 보안 설정 때문에 내 PC의 n8n(localhost) 접속을 막았습니다. 설정 파일에 WEBHOOK_SECURITY_MODE: moderate를 넣어 해결했습니다. 로컬 n8n에 n8n-mcp를 붙인다면 처음부터 넣어 두시는 걸 추천합니다!

  • 그 한 줄을 넣다가 쉼표 하나가 빠져 설정 파일 전체가 읽히지 않았습니다. API 키가 든 파일이라 Claude가 직접 고칠 수 없게 막혀 있었고, Claude가 만든 복구 스크립트를 제가 실행해서 고쳤습니다.

Google 연결

  • 첫 로그인에서 "403 액세스 차단됨"이 떴습니다. 테스트 사용자에 내 계정을 등록하지 않으면 생기는 오류였고, 등록하니 바로 해결됐습니다.

노드 설정

  • 캘린더 노드에 캘린더와 참석자를 넣는 형식이 맞지 않아 두 번 실패했습니다. 시험용 일정을 만들었다가 바로 지우는 방식으로 확인하고 고쳤습니다.

  • 노드를 하나 지날 때마다 다음 노드가 받는 데이터가 바뀝니다. 캘린더 다음에 오는 메일 노드는 캘린더 결과가 아니라, 앞에서 만든 메일 내용을 직접 가리켜야 했습니다.

  • 구글시트가 날짜를 "2026. 10. 26"처럼 바꿔 저장할 수 있어서, 날짜는 글자 그대로 저장하고 여러 형식을 모두 읽도록 했습니다.

앞으로의 계획

  1. 사내 시스템 연동 확인 — 메일·캘린더가 API로 연동되는지 확인합니다. 실제 입사자 정보로 운영하려면 개인 Google 계정이 아니라 사내 환경이어야 하고, 사내 보안 검토도 거쳐야 합니다. 연동이 확인되면 메일·캘린더 노드만 교체할 계획입니다.

  2. 알림 메일 자동 읽기 — 이번에 남겨 둔 1~2번 단계입니다. 알림 메일에서 입사일 등을 읽어 시트에 넣습니다. 알림 메일 양식 확인이 먼저입니다.

  3. 오류 알림 — 실패하면 바로 알려주는 기능입니다. Google 연결이 끊기면 알림 메일도 보낼 수 없어서 7일 만료 문제와 함께 풀어야 합니다. 그 전까지는 발송일이 지났는데 "대기"로 남은 사람이 있는지 시트에서 확인합니다.

  4. 인수인계 준비 — 운영 도움자가 이어받을 수 있도록 짧은 사용 안내서를 만듭니다.

  5. 확장 — 1주차 워크시트에서 확장 단계로 남긴 멘토 회신 처리 · 리마인드 · 안내 문자를 이어서 붙입니다. 메일에 안내하는 30·60일 면담 일정을 리더 캘린더에 미리 넣어 주는 것도 해볼 생각입니다.

태그: #업무자동화