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

- 작성자: [고슴도치](https://community.clauders.ai/member/imported-member-K1mMNuMBsz)
- 공간: [Claude Code+n8n 자동화](https://community.clauders.ai/workflow-n8n)
- 게시: 2026-10-12
- 연재: [Claude Code+n8n 자동화](https://community.clauders.ai/series/workflow-n8n) 5/5편
- 태그: #업무자동화
- 주소: https://community.clauders.ai/workflow-n8n/post/%EA%B5%90%EC%9C%A1-%EB%8B%B4%EB%8B%B9%EC%9E%90%EC%9D%98-%EB%B0%98%EB%B3%B5%EC%97%85%EB%AC%B4-%EC%9B%8C%ED%81%AC%ED%94%8C%EB%A1%9C%EC%9A%B0-%EA%B5%AC%EC%84%B1%ED%95%B4%EB%B3%B4%EA%B8%B0-n8n-claude-code-47f26468-9b30-8f0b-9406-622dca765026

---

**신규입사자 온보딩 안내, 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일 면담 일정을 리더 캘린더에 미리 넣어 주는 것도 해볼 생각입니다.
