5강

AI Agent 실전 예제 5선

시나리오 — 휴가/근태 문의 상담 챗봇

사내 임직원의 휴가·근태 문의를 24시간 응대하는 AI Agent 를 만듭니다. AI 가 스프레드시트에서 직원 정보와 휴가 사용 이력을 스스로 조회하고, 남은 연차를 계산하고, 필요 시 담당자에게 Gmail 로 신청 접수까지 자동으로 처리하는 흐름.

  • Chat Model — OpenAI GPT
  • Memory — Simple Memory (대화 이어가기)
  • Tool 1: Google Sheets — 직원 정보 / 휴가 사용 내역 조회
  • Tool 2: Calculator — 남은 연차 자동 계산
  • Tool 3: Gmail — 담당자에게 신청 메일 발송
💡
이 예제 하나만 익히면 사내 정보 조회 + 계산 + 알림 발송 세 가지가 결합된 어떤 챗봇도 만들 수 있습니다.

실습 데이터 — 스프레드시트 준비

구글 시트에 2개의 시트 탭을 만듭니다. 하나는 직원 정보, 하나는 휴가 사용 이력. 아래 표를 그대로 📋 시트에 복사 로 눌러 각각의 탭 A1 셀에 붙여넣으면 실습 데이터가 바로 세팅됩니다.

① Employees 탭 — 직원 정보 (35명)

Employees 탭 — 직원 정보 35명 (사번 · 이름 · 부서 · 이메일 · 연간 부여 연차)

📊 시트 데이터 · 35행 × 5열
EmployeeIdNameDepartmentEmailAnnualLeave
E001김민수개발팀minsu.kim@example.com15
E002이서연마케팅팀seoyeon.lee@example.com15
E003박준호영업팀junho.park@example.com16
E004최지우개발팀jiwoo.choi@example.com15
E005정현우디자인팀hyunwoo.jung@example.com17
E006한유진인사팀yujin.han@example.com15
E007강민재개발팀minjae.kang@example.com16
E008윤서진마케팅팀seojin.yoon@example.com15
E009송지훈영업팀jihoon.song@example.com18
E010김하늘디자인팀haneul.kim@example.com15
E011오세훈개발팀sehoon.oh@example.com17
E012임수빈인사팀subin.lim@example.com15
E013조현민영업팀hyunmin.cho@example.com16
E014신예은마케팅팀yeeun.shin@example.com15
E015백승우개발팀seungwoo.baek@example.com19
E016장다은디자인팀daeun.jang@example.com15
E017문재현마케팅팀jaehyun.moon@example.com16
E018서유나인사팀yuna.seo@example.com17
E019권도윤개발팀doyoon.kwon@example.com15
E020홍지수영업팀jisoo.hong@example.com18
E021김도현경영지원팀dohyun.kim@example.com20
E022이주원개발팀juwon.lee@example.com15
E023박서현마케팅팀seohyun.park@example.com16
E024최민호영업팀minho.choi@example.com15
E025정유림디자인팀yurim.jung@example.com17
E026한지민인사팀jimin.han@example.com15
E027강서준개발팀seojun.kang@example.com18
E028윤다영경영지원팀dayoung.yoon@example.com16
E029송현석영업팀hyunseok.song@example.com15
E030김아린마케팅팀arin.kim@example.com17
E031오지훈개발팀jihoon.oh@example.com15
E032임채원디자인팀chaewon.lim@example.com16
E033조민석경영지원팀minseok.cho@example.com18
E034신유진인사팀yujin.shin@example.com15
E035백지민개발팀jimin.baek@example.com20

💡 사용법 — 구글 스프레드시트에서 A1 셀 클릭 → Ctrl+V (Mac: Cmd+V) 로 붙여넣기.

② LeaveHistory 탭 — 휴가 사용/신청 내역

LeaveHistory 탭 — 휴가 사용 내역 71건(승인) + 신청 대기 4건 (뒤에서 AI 가 남은 연차 계산할 때 이 표를 조회)

📊 시트 데이터 · 75행 × 8열
LeaveIdEmployeeIdNameStartDateEndDateDaysTypeStatus
L001E001김민수2026-01-162026-01-161연차승인
L002E001김민수2026-03-102026-03-101연차승인
L003E001김민수2026-06-192026-06-190.5오전반차승인
L004E002이서연2026-02-062026-02-061연차승인
L005E002이서연2026-04-152026-04-150.5오후반차승인
L006E003박준호2026-01-262026-01-272연차승인
L007E003박준호2026-05-082026-05-081연차승인
L008E004최지우2026-02-202026-02-201연차승인
L009E004최지우2026-07-032026-07-031연차승인
L010E005정현우2026-03-022026-03-043연차승인
L011E005정현우2026-06-122026-06-120.5오후반차승인
L012E006한유진2026-01-092026-01-091연차승인
L013E006한유진2026-04-242026-04-241연차승인
L014E007강민재2026-02-122026-02-132연차승인
L015E007강민재2026-05-292026-05-291연차승인
L016E008윤서진2026-03-202026-03-201연차승인
L017E008윤서진2026-07-102026-07-100.5오전반차승인
L018E009송지훈2026-01-192026-01-213연차승인
L019E009송지훈2026-06-052026-06-051연차승인
L020E010김하늘2026-02-272026-02-271연차승인
L021E010김하늘2026-05-152026-05-150.5오후반차승인
L022E011오세훈2026-03-062026-03-061연차승인
L023E011오세훈2026-07-172026-07-171연차승인
L024E012임수빈2026-01-302026-01-300.5오전반차승인
L025E012임수빈2026-04-032026-04-031연차승인
L026E013조현민2026-02-092026-02-102연차승인
L027E013조현민2026-06-262026-06-261연차승인
L028E014신예은2026-03-132026-03-131연차승인
L029E014신예은2026-05-222026-05-220.5오후반차승인
L030E015백승우2026-01-122026-01-165연차승인
L031E015백승우2026-04-102026-04-101연차승인
L032E016장다은2026-02-162026-02-161연차승인
L033E016장다은2026-07-242026-07-241연차승인
L034E017문재현2026-03-272026-03-271연차승인
L035E017문재현2026-06-152026-06-162연차승인
L036E018서유나2026-01-232026-01-231연차승인
L037E018서유나2026-05-042026-05-040.5오전반차승인
L038E019권도윤2026-02-232026-02-253연차승인
L039E019권도윤2026-07-312026-07-311연차승인
L040E020홍지수2026-03-092026-03-102연차승인
L041E020홍지수2026-06-082026-06-081연차승인
L042E021김도현2026-01-052026-01-073연차승인
L043E021김도현2026-04-172026-04-171연차승인
L044E022이주원2026-02-022026-02-021연차승인
L045E022이주원2026-05-112026-05-110.5오후반차승인
L046E023박서현2026-03-162026-03-172연차승인
L047E023박서현2026-07-062026-07-061연차승인
L048E024최민호2026-01-292026-01-302연차승인
L049E024최민호2026-06-222026-06-221연차승인
L050E025정유림2026-02-052026-02-050.5오전반차승인
L051E025정유림2026-05-182026-05-203연차승인
L052E026한지민2026-03-052026-03-051연차승인
L053E026한지민2026-07-132026-07-131연차승인
L054E027강서준2026-01-142026-01-152연차승인
L055E027강서준2026-04-272026-04-270.5오후반차승인
L056E028윤다영2026-02-182026-02-181연차승인
L057E028윤다영2026-06-292026-06-302연차승인
L058E029송현석2026-03-232026-03-231연차승인
L059E029송현석2026-05-252026-05-251연차승인
L060E030김아린2026-01-082026-01-092연차승인
L061E030김아린2026-07-202026-07-200.5오전반차승인
L062E031오지훈2026-02-262026-02-272연차승인
L063E031오지훈2026-06-112026-06-111연차승인
L064E032임채원2026-03-302026-03-312연차승인
L065E032임채원2026-05-282026-05-280.5오후반차승인
L066E033조민석2026-01-202026-01-223연차승인
L067E033조민석2026-07-012026-07-011연차승인
L068E034신유진2026-02-112026-02-111연차승인
L069E034신유진2026-04-202026-04-200.5오전반차승인
L070E035백지민2026-03-112026-03-133연차승인
L071E035백지민2026-06-012026-06-022연차승인
L072E001김민수2026-08-182026-08-203연차신청
L073E008윤서진2026-08-212026-08-211연차신청
L074E015백승우2026-08-242026-08-252연차신청
L075E021김도현2026-08-282026-08-280.5오후반차신청

💡 사용법 — 구글 스프레드시트에서 A1 셀 클릭 → Ctrl+V (Mac: Cmd+V) 로 붙여넣기.

AI Agent 기본 세팅

새 워크플로우에 Chat Trigger + AI Agent 를 배치하고, 하위에 Chat Model(OpenAI) + Memory(Simple Memory) 를 붙입니다.

Chat Trigger → AI Agent · Chat Model + Memory 연결

Tool 1 — Google Sheets 툴 연결

AI Agent 의 Tool 슬롯에 Google Sheets Tool 을 붙입니다. AI 가 필요할 때 시트를 스스로 조회할 수 있게.

Tool 슬롯 → Google Sheets Tool 추가
Sheet URL + Operation(Get Rows) 지정, 나머지 파라미터는 AI 자동
💡
직원 정보와 휴가 내역이 두 개의 시트 탭에 있으므로, Google Sheets Tool 도 탭마다 하나씩 총 2개 붙이는 게 정석입니다.

Tool 2 — Calculator 툴 추가

남은 연차, 사용률 등 수치 계산을 AI 가 정확히 하려면 Calculator Tool 을 붙여줍니다. GPT 는 산수에 약해서 큰 숫자·정확한 계산은 이 도구에 맡기는 게 안전.

Tool 슬롯 → Calculator 추가
Calculator 는 별도 설정 없음 — 붙이면 AI 가 필요 시 스스로 호출

Tool 3 — Gmail 툴 추가

AI 가 담당자에게 휴가 신청 이메일을 대신 보낼 수 있도록 Gmail Tool 을 붙입니다.

Tool 슬롯 → Gmail 추가

받는 사람만 고정하고, 제목·본문은 AI 자동 정의 모드로 두면 상황에 맞춰 AI 가 매번 다르게 씁니다.

받는사람 고정 · 제목/본문은 'let AI define' 활성
💡
실무: To 자리에 hr@회사.com 처럼 고정 담당자 지정. 여러 담당자가 필요하면 부서 판단 후 다른 Gmail Tool 이 실행되도록 프롬프트에서 분기.

Tools 세팅 완료 — 오버뷰

3개 Tool(Sheets · Calculator · Gmail) 이 모두 붙은 상태.

AI Agent · Chat Model / Memory / Tool 3개 연결 완료

AI Agent 지침서 세팅

AI 가 사용자 문의를 어떻게 이해하고 어떤 Tool 을 언제 써야 하는지를 System Message 에 자세히 명시합니다.

System Message — 역할·조회 규칙·계산 규칙·이메일 규칙
System Message (전체 지침서) text
너는 회사의 인사팀 휴가/근태 담당 AI 어시스턴트입니다.

직원의 질문을 이해하고 필요한 경우 연결된 도구를 사용하여
직원 정보와 휴가 사용 내역을 조회하고 정확하게 답변하세요.

[데이터]

직원정보 시트
- EmployeeId
- Name
- Department
- Email
- AnnualLeave

휴가사용내역 시트
- LeaveId
- EmployeeId
- Name
- StartDate
- EndDate
- Days
- Type
- Status

[연차 계산 규칙]

1. 직원의 연차 정보를 확인할 때는 직원정보 시트에서 해당 직원을 조회하세요.

2. 휴가사용내역 시트에서 해당 직원의 휴가 기록을 조회하세요.

3. 기본 잔여 연차 계산에서는 Status가 "승인"인 기록만 사용한 연차로 계산하세요.

4. 사용자가 "신청 중인 휴가까지 포함"하라고 요청하면
Status가 "승인" 또는 "신청"인 기록을 모두 포함하세요.

5. 잔여 연차는 다음과 같이 계산합니다.

잔여 연차 = AnnualLeave - 사용한 휴가 일수 합계

계산이 필요한 경우 Calculator 도구를 사용하세요.

6. 반차는 Days 값을 그대로 사용합니다.
예: Days가 0.5이면 0.5일입니다.

7. 데이터에 존재하지 않는 내용은 추측하지 마세요.


[휴가 신청 이메일]

사용자가 명확하게 휴가 신청을 요청하면 Gmail 도구를 사용하세요.

이 워크플로우는 교육 및 테스트용입니다.
실제 직원이나 인사담당자의 이메일 주소로 절대 발송하지 마세요.

Gmail 도구의 수신자는 미리 설정된 테스트 이메일 주소만 사용합니다.
수신자 주소를 변경하거나 다른 이메일 주소를 선택하려고 하지 마세요.

메일 제목은 다음 형식을 사용하세요.

[휴가신청] 직원이름 / 휴가종류 / 시작일

메일 본문에는 다음 내용을 포함하세요.

- 직원 이름
- EmployeeId
- 부서
- 휴가 종류
- 시작일
- 종료일
- 사용 일수
- 현재 잔여 연차
- 신청 후 예상 잔여 연차

메일 발송 후에는 사용자에게
어떤 내용의 테스트 이메일을 발송했는지 알려주세요.

실행 시 오류 — 한글 시트 이름

테스트로 채팅을 보내면 이런 오류를 만납니다.

Tool 실행 실패 — 시트 참조 오류
💡
원인: 시트 탭 이름이 한글이라 AI 가 Tool 호출 시 인자를 넘길 때 인코딩 이슈 발생. 실제로 자주 만나는 함정입니다.

오류 해결 — 시트 이름 영문화

구글 시트 탭 이름을 Employees, LeaveHistory 처럼 영문으로 바꿉니다.

탭 이름 영문화 후 정상 동작
💡
실무 규칙: Tool 로 노출되는 리소스 이름은 무조건 영문 · CamelCase. 폼 컬럼도 마찬가지.

채팅으로 이어서 휴가 신청 — 시연 시나리오

Memory 가 붙어있으면 같은 세션에서 대화를 이어갈 때 이전 맥락을 기억합니다. 이 챗봇의 진가는 한 질문씩 따로 던지지 않고 대화를 이어갈 때 나옵니다. 아래 5단계를 순서대로 입력해보면 Memory + Sheets + Calculator + Gmail 이 순차적으로 어떻게 작동하는지 한눈에 보입니다.

"그럼 다음주 월~수 3일 신청해줘" → AI 가 이름·부서를 이미 알고 있음
💡
⭐ 팁 — 2~5단계에서 '김민수'를 다시 말하지 마세요. Simple Memory 가 왜 필요한지 바로 체감할 수 있습니다.

① 첫 질문 — 조회 + 계산

① 채팅 입력 text
김민수 연차 몇 일 남았어?
  • 사용 도구: EmployeeInfo → LeaveHistory → Calculator
  • AI 가 시트에서 김민수 정보와 사용 이력을 각각 조회 후 잔여 연차 계산

② 신청 중인 휴가까지 포함 — Memory 첫 등장

② 채팅 입력 text
그럼 신청해둔 휴가까지 포함하면?
  • 사용 도구: Memory → LeaveHistory → Calculator
  • "김민수" 를 다시 말하지 않아도 Memory 가 앞 대화 대상자를 기억
  • LeaveHistory 를 다시 조회하되 Status "신청" 포함해서 재계산

③ 가상 사용량 계산 — 순수 Calculator

③ 채팅 입력 text
거기서 2일 더 쓰면 얼마나 남아?
  • 사용 도구: Memory → Calculator
  • 시트 조회 없이 앞 계산 결과 - 2 만 계산 → Calculator 하나로 답변

④ 날짜 지정 — 실제 신청 시뮬레이션

④ 채팅 입력 text
그러면 9월 17일부터 18일까지 쓰는 걸로 계산해줘.
  • 사용 도구: Memory → Calculator
  • 날짜 · 2일 · 예상 잔여 연차를 한 번에 정리해 안내

⑤ 이메일 발송 — Gmail Tool 실행

⑤ 채팅 입력 text
좋아. 그 내용으로 휴가 신청 메일 보내줘.
  • 사용 도구: Memory → Gmail
  • 앞에서 나온 김민수 + 날짜 + 2일 + 예상 잔여 연차를 Memory 로 이어받아 이메일 본문 자동 작성
  • 수신자는 고정된 테스트 이메일 (지침서 안전장치)
💡
이 흐름을 다 태우고 나면 학생들이 "AI Agent = 도구 오케스트레이션" 이라는 감을 확실히 잡습니다. Memory 없이 5번 다 처음부터 조회했다면 이런 대화가 성립하지 않는다는 것도 함께 강조하세요.

AI Agent 가 고정된 메일로 신청 메일 발송

AI 가 판단 후 Gmail Tool 을 스스로 호출해 담당자(hr@...)에게 신청 이메일을 보냅니다. 받는 사람만 고정이고, 제목·본문은 상황에 맞게 AI 가 작성.

받는사람 고정 / AI 가 신청자·기간·사유를 정리한 이메일 자동 작성
💡
여기까지 만들면 사내 챗봇 = 정보 조회 + 계산 + 신청 접수 3가지가 대화 하나로 처리됩니다. Slack 봇으로 붙이면 임직원이 별도 시스템 없이 슬랙에서 바로 상담·신청 가능.

시나리오 — 영업팀 미팅 준비 어시스턴트

영업 담당자가 "9월 1일에 고객 미팅 뭐 있어?" 처럼 물으면, AI Agent 가 구글 캘린더에서 일정을 조회하고 구글 컨택트에서 담당자 정보를 찾아 답변하는 챗봇을 만듭니다.

  • Chat Model — OpenAI GPT
  • Memory — Simple Memory
  • Tool 1: Google Calendar — 미팅 일정 조회
  • Tool 2: Google Contacts — 고객 담당자 정보 조회
💡
이 예제는 외부 SaaS(구글 캘린더·주소록)를 AI Agent 의 Tool 로 연결하는 패턴을 보여줍니다. 같은 방식으로 노션·에어테이블·슬랙 등 어떤 서비스든 붙일 수 있어요.

실습 데이터 — 구글 캘린더·컨택트 CSV 가져오기

실습에 쓸 더미 데이터 CSV 2개입니다. 다운받아 각각 구글 캘린더와 구글 주소록에 가져오기(Import) 하면 실습 준비 완료.

📎 google_calendar_dummy_2026_09.csv 구글 캘린더 가져오기용 · 2026년 9월 고객 미팅 일정 더미 (5KB) ⬇ 다운로드 📎 google_contacts_dummy_20.csv 구글 주소록 가져오기용 · 고객사 담당자 20명 더미 (2KB) ⬇ 다운로드

① 구글 캘린더에 CSV 넣기 — 아래 링크로 바로 가져오기 페이지로 이동합니다.

🔗 calendar.google.com/calendar/u/0/r/settings/export — 가져오기 → 컴퓨터에서 파일 선택 → 위 CSV 업로드 → 대상 캘린더 선택 → 가져오기.

구글 캘린더 설정 → 가져오기/내보내기 → 파일 업로드

② 구글 주소록에 CSV 넣기 — 아래 링크로 이동.

🔗 contacts.google.com — 좌측 가져오기 → 파일 선택 → 위 CSV 업로드 → 가져오기.

구글 주소록 → 좌측 가져오기 → 파일 선택
💡
가져오기 후 캘린더에는 2026년 9월 한 달치 고객 미팅이, 주소록에는 고객사 담당자 20명이 들어갑니다. 실습 후에는 라벨로 묶어 한번에 삭제하기 좋습니다.

n8n 에서 구글 캘린더·컨택트 인증정보 등록

n8n Credentials 탭에서 Google Calendar OAuth2 · Google Contacts OAuth2 두 개를 등록합니다. 각각 구글 로그인 팝업이 뜨면 승인.

Credentials → Google Calendar / Google Contacts OAuth2 각각 생성
💡
실무에선 Google Cloud Console 에서 OAuth 클라이언트 ID 를 먼저 만들어야 하는 경우가 많습니다. n8n Cloud 는 built-in credential 이라 그 과정이 생략되어 편함.

Tool 1 — Google Calendar 툴 연결

AI Agent 하위 Tool 슬롯에 Google Calendar 를 붙입니다.

Tool 슬롯 → Google Calendar 검색·선택

Operation 을 Get Many Events 로 두면 AI 가 필요한 기간을 넣어 스스로 조회. Calendar 는 본인 계정의 기본 캘린더로 지정.

Resource: Event · Operation: Get Many · 나머지는 AI 자동

Tool 2 — Google Contacts 툴 연결

같은 방식으로 Google Contacts 를 두 번째 Tool 로 붙입니다.

Tool 슬롯 → Google Contacts 검색·선택

노드 파라미터는 Resource = Contact · Operation = Get Many · Return All 켬 으로 두고, Fields 에 AI 가 실제로 필요로 하는 필드만 골라 담습니다 — Names / Email Addresses / Organizations / Phone Numbers 4개.

Return All · Fields = Names / Email Addresses / Organizations / Phone Numbers
💡
Fields 를 비워두면 API 응답이 지나치게 커져서 AI 컨텍스트를 낭비합니다. 실제 프롬프트에 쓸 이름·이메일·소속·전화번호 만 명시적으로 골라두는 게 정답.

AI Agent 지침 입력

AI Agent 의 System Message 에 역할·응답 규칙을 정합니다.

역할 · 사용 가능한 도구 · 응답 규칙 명시
System Message (샘플) text
너는 영업팀의 미팅 준비 AI 비서입니다.

사용자의 질문을 이해하고 필요한 도구를 선택하여
고객 미팅과 담당자 정보를 찾아 답변하세요.

사용 가능한 도구:
- Google Calendar: 고객 미팅 일정 조회
- Google Contacts: 고객사 담당자 정보 조회

[응답 규칙]
1. 시간대는 한국시간(KST) 기준으로 답변하세요.
2. 일정 답변에는 시간·제목·장소·간단 설명을 포함하세요.
3. 담당자 조회 요청이 나오면 이름 + 회사 + 직책 + 이메일을 정리해 안내하세요.
4. 미팅과 담당자가 함께 필요한 질문이면 두 도구를 순차 사용하세요.
5. 데이터에 없는 정보는 추측하지 마세요.

Agent 실행 — 영업팀 미팅 준비 시연 시나리오

채팅으로 물어보면 AI 가 Calendar Tool → Contacts Tool 을 스스로 호출합니다. 아래 5단계로 던지면 CalendarSearch → ContactsSearch → Memory 가 순차적으로 어떻게 쓰이는지 자연스럽게 시연됩니다.

AI Agent 가 Get many events + Get many contacts 를 순차 호출 → 정리된 답변
💡
⭐ 팁 — 짧고 실무에서 말하듯 이어가는 게 핵심. 2번부터 구체 회사명·이름을 다시 말하지 않아도 Memory 가 이어받아주는 걸 확인할 수 있습니다.

① 캘린더 조회 — 오전 시간대 필터

① 채팅 입력 text
9월 1일 오전에 고객 미팅 있나?
  • 사용 도구: Google Calendar (Get Many Events)
  • AI 가 9월 1일 09~12시 범위로 이벤트 조회

② 이전 결과 참조 — Memory 첫 등장

② 채팅 입력 text
첫 번째 미팅 뭐였지?
  • 사용 도구: Memory
  • "9월 1일", "오전" 을 다시 말하지 않아도 Memory 가 이어받아 첫 이벤트 재안내
  • 학생들이 "Memory 가 실제로 동작한다" 를 확인하는 결정적 순간

③ 회사명 자동 인식 → 담당자 조회

③ 채팅 입력 text
그 회사 담당자 누구야?
  • 사용 도구: Memory → Google Contacts (Get Many)
  • 앞서 나온 회사 이름을 Memory 가 넘겨줌 → Contacts 에서 해당 회사 담당자 검색

④ 담당자 상세 요청

④ 채팅 입력 text
담당자 연락처까지 보여줘.
  • 사용 도구: Memory → Contacts (필요 시 재조회)
  • 이름 + 회사 + 직책 + 이메일 + 전화번호 정리

⑤ 종합 브리핑 요청 — Agent 진가

⑤ 채팅 입력 text
좋아. 미팅 전에 체크할 것 5개만 정리해줘.
  • 사용 도구: Memory (도구 미호출)
  • 지금까지 확인한 미팅 · 담당자 정보로 사전 준비 체크리스트를 정리
  • 체크리스트 자동 생성이 AI Agent 를 단순 조회 챗봇 이상으로 만드는 순간
💡
이 구조를 확장하면 미팅 30분 전 담당자 정보를 슬랙으로 자동 브리핑 하거나, 미팅 후 회의록을 노션에 자동 정리 하는 것까지 이어붙일 수 있습니다.

시나리오 — 컴플레인 자동 접수·분류·긴급 알림

고객센터로 들어오는 컴플레인 폼 을 AI Agent 가 자동으로 분류·저장·(필요 시)담당자 알림 까지 처리합니다. 지금까지 배운 폼 트리거 · 시트 조회 · 시트 저장 · Gmail · System Message 로직 분기 가 한 워크플로우에 통합되는 실전 예제.

  • Chat Model — OpenAI GPT (Memory 필요 없음: 폼 1건 처리 후 종료)
  • Trigger — n8n Form (고객이 폼 제출 시 실행)
  • Tool 1: 주문 시트 조회 — 폼에 적힌 주문번호 검증
  • Tool 2: 컴플레인 시트 조회 — 과거 이력 참조
  • Tool 3: 컴플레인 시트 저장 — 신규 컴플레인 append
  • Tool 4: Gmail — 긴급 판정 시에만 담당자에게 발송 (AI 가 판단)
💡
핵심 포인트: AI Agent 가 System Message 만 보고 Gmail 을 보낼지 말지 스스로 결정. 하드코딩된 if/else 없이도 자연어 규칙만으로 분기 처리 가능.

실습 데이터 — 주문 시트 · 컴플레인 시트 2개

구글 시트에 2개 탭을 만듭니다. 이번 예제는 시트 2개 + 폼 트리거 하나의 상호작용이 핵심.

아래 두 표를 그대로 📋 시트에 복사 로 눌러 각각의 탭 A1 셀에 붙여넣으면 실습 데이터가 바로 세팅됩니다.

① 주문 탭(Orders) — 20건

Orders 탭 — 주문 20건 · AI Agent 가 OrderId 로 조회해서 실주문 여부를 검증

📊 시트 데이터 · 20행 × 6열
OrderIdCustomerNameOrderDateProductAmountShippingStatus
ORD-1001김민수2026-08-01무선이어폰89000배송완료
ORD-1002이서연2026-08-02기계식키보드129000배송중
ORD-1003박준호2026-08-02모니터320000배송준비중
ORD-1004최지우2026-08-03웹캠74000배송완료
ORD-1005정현우2026-08-03노트북거치대49000배송중
ORD-1006한유진2026-08-04블루투스스피커99000배송완료
ORD-1007강민재2026-08-0427인치모니터289000배송준비중
ORD-1008윤서진2026-08-05무선마우스59000배송완료
ORD-1009송지훈2026-08-05USB허브39000배송중
ORD-1010김하늘2026-08-06태블릿549000배송준비중
ORD-1011오세훈2026-08-06헤드셋119000배송완료
ORD-1012임수빈2026-08-07외장SSD159000배송중
ORD-1013조현민2026-08-07스마트워치239000배송준비중
ORD-1014신예은2026-08-08블루투스키보드79000배송완료
ORD-1015백승우2026-08-08노이즈캔슬링이어폰199000배송준비중
ORD-1016장다은2026-08-09휴대용모니터249000배송중
ORD-1017문재현2026-08-09게이밍마우스69000결제완료
ORD-1018서유나2026-08-09HDMI케이블19000배송완료
ORD-1019권도윤2026-08-09노트북1290000결제완료
ORD-1020홍지수2026-08-09모니터암109000배송준비중

💡 사용법 — 구글 스프레드시트에서 A1 셀 클릭 → Ctrl+V (Mac: Cmd+V) 로 붙여넣기.

② 컴플레인 탭(Complaints) — 20건 과거 이력

Complaints 탭 — 과거 컴플레인 20건 · AI Agent 가 같은 OrderId·Email 의 반복 컴플레인 여부를 참고하며, 신규 컴플레인도 이 탭에 append

📊 시트 데이터 · 20행 × 10열
ComplaintIdOrderIdNameEmailCategoryMessageSeverityReasonCreatedAtStatus
C001ORD-1003박준호junho@example.com배송주문한 지 며칠이 지났는데 아직 배송 준비중입니다.높음장기 배송 지연2026-08-07 10:15처리중
C002ORD-1007강민재minjae@example.com배송언제 출고되는지 확인 부탁드립니다.보통출고 지연 문의2026-08-07 11:20접수
C003ORD-1002이서연seoyeon@example.com배송배송중이라고 뜨는데 위치 확인이 안 됩니다.낮음배송 조회 문의2026-08-07 13:05완료
C004ORD-1008윤서진seojin@example.com상품마우스 클릭이 제대로 안 됩니다.높음초기 불량 의심2026-08-07 14:30처리중
C005ORD-1010김하늘haneul@example.com배송태블릿 배송이 너무 늦습니다.높음고가 상품 배송 지연2026-08-07 15:40접수
C006ORD-1011오세훈sehoon@example.com상품헤드셋 한쪽에서 소리가 안 납니다.높음제품 불량2026-08-07 16:25처리중
C007ORD-1001김민수minsu@example.com환불상품을 잘못 주문했습니다. 환불하고 싶습니다.보통단순 변심2026-08-08 09:10완료
C008ORD-1012임수빈subin@example.com배송택배가 오늘 온다고 했는데 아직 안 왔습니다.낮음배송 일정 문의2026-08-08 10:45접수
C009ORD-1013조현민hyunmin@example.com배송배송 준비중 상태가 너무 오래 유지됩니다.높음장기 배송 지연2026-08-08 11:30처리중
C010ORD-1014신예은yeeun@example.com상품키보드 일부 키가 입력되지 않습니다.높음초기 불량2026-08-08 13:10접수
C011ORD-1015백승우seungwoo@example.com배송고가 상품인데 계속 배송 준비중이라 불안합니다.긴급고가 상품 장기 배송 지연2026-08-08 14:20처리중
C012ORD-1004최지우jiwoo@example.com교환웹캠 화질이 설명과 너무 다릅니다.보통상품 품질 불만2026-08-08 15:35완료
C013ORD-1005정현우hyunwoo@example.com배송오늘 받을 수 있는지 확인해주세요.낮음배송 일정 문의2026-08-08 16:15완료
C014ORD-1016장다은daeun@example.com배송배송이 멈춘 것 같습니다. 확인 부탁드립니다.보통배송 추적 이상2026-08-09 09:05접수
C015ORD-1017문재현jaehyun@example.com결제결제는 됐는데 주문 상태가 결제완료에서 안 바뀝니다.보통주문 처리 지연2026-08-09 10:25접수
C016ORD-1019권도윤doyoon@example.com결제노트북 결제 완료됐는데 출고 예정일을 알고 싶습니다.보통출고 일정 문의2026-08-09 11:40접수
C017ORD-1020홍지수jisoo@example.com배송배송 준비중인데 언제 출고되나요?보통출고 일정 문의2026-08-09 13:15접수
C018ORD-1006한유진yujin@example.com상품스피커 충전이 제대로 되지 않습니다.높음제품 불량2026-08-09 14:50처리중
C019ORD-1009송지훈jihoon@example.com배송택배 조회가 이틀째 같은 위치입니다.보통배송 지연2026-08-09 16:10접수
C020ORD-1018서유나yuna@example.com환불상품 포장을 뜯지 않았는데 환불 가능한가요?낮음환불 정책 문의2026-08-09 17:25완료

💡 사용법 — 구글 스프레드시트에서 A1 셀 클릭 → Ctrl+V (Mac: Cmd+V) 로 붙여넣기.

💡
탭 이름은 영문 (Orders / Complaints) 로 통일 권장. 예제 1 에서 겪은 한글 시트 오류와 동일한 함정 방지.

폼 트리거 + Agent 기본 세팅

새 워크플로우에 Form Trigger → AI Agent 를 연결. Chat Model 만 필요하고 Memory 는 붙이지 않습니다 — 이번 예제는 폼 1건마다 독립 실행이므로 이전 대화 기억이 오히려 방해가 됩니다.

Form Trigger → AI Agent (Chat Model 만 연결, Memory 없음)

폼 필드 작성 — Label 은 한글, Custom Field Name 은 시트 헤더 영문

폼 필드마다 Label 과 Custom Field Name 두 값을 지정해야 합니다. 역할이 다르니 혼동하지 않게 원칙을 잡고 시작하세요.

  • Label — 폼에서 사용자에게 보이는 문구. 고객이 편하게 읽을 수 있도록 한글 로 씁니다. (예: "이름", "이메일", "주문번호", "문의 유형", "문의 내용")
  • Custom Field Name — 뒤 노드로 넘어가는 데이터 필드 이름. AI Agent 프롬프트와 시트 저장 매핑에서 이 이름 그대로 참조되므로, 스프레드시트 헤더와 완벽히 일치하는 영문 으로 지정합니다.
💡
🎯 왜 이렇게 나누나? — 사용자용 표시(한글) 와 AI·시스템용 키(영문) 를 분리하기 위함. Custom Field Name 을 한글로 두면 AI 가 프롬프트에서 $json["이메일"] 같은 값을 참조할 때 인코딩/오타로 헷갈릴 가능성이 크고, 시트 헤더와 자동 매핑도 안 됩니다.
Label(한글) vs Custom Field Name(영문, 시트 헤더와 일치)

이 예제에서 잡을 5개 필드 는 다음과 같이 지정합니다. 아래 표를 n8n 폼 필드에 하나씩 그대로 입력하세요. 오른쪽 컬럼(Custom Field Name)은 앞서 만든 Complaints 시트의 헤더와 정확히 동일합니다.

📌 폼 필드 5개 (n8n 에 입력할 값)
Label (폼 표시 · 한글)Custom Field Name (시트 헤더 · 영문)Element Type
이름NameText Input
이메일EmailText Input
주문번호OrderIdText Input
문의 유형CategoryDropdown
문의 내용MessageTextarea

문의 유형(Category)은 자유 입력 대신 Dropdown 으로 옵션을 제한해 AI 분류 정확도를 올립니다.

문의 유형(Category): Dropdown → 배송/환불/상품/결제/교환 등 옵션 추가

문의 내용(Message)은 길어질 수 있으므로 Textarea 로.

문의 내용(Message): Textarea (여러 줄 입력 허용)
💡
이 원칙만 지키면 뒤 소섹션에서 나올 User Prompt 표현식 {{ $json["OrderId"] }} 와 Append Tool 컬럼 매핑 이 헤더명 그대로 깔끔하게 이어집니다.

Tool 1·2 — 주문·컴플레인 시트 조회 툴 2개

AI 가 주문 존재 확인 과 과거 컴플레인 이력 참조 를 하려면 Sheet Tool 을 2개 붙여야 합니다. 각각 다른 워크시트를 가리키게.

Tool 슬롯에 Google Sheets Tool 2개 배치
Tool 1: 주문 시트(Orders) · Operation: Get Rows
Tool 2: 컴플레인 시트(Complaints) · Operation: Get Rows

Tool 3 — 컴플레인 시트 저장(Append) 툴

폼으로 들어온 신규 컴플레인을 시트에 저장하기 위해 3번째 Sheet Tool 을 붙입니다. 액션은 Append Row.

Append 전용 Sheet Tool 을 별도 배치

매핑 방식에서 가장 중요한 세팅 이 있습니다.

💡
⚠️ Mapping Column Mode 를 반드시 Map Each Column Manually 로 선택하세요. 기본값인 Map Automatically 로 두면 AI 가 기존 컬럼에 매핑하지 않고, 시트에 새로운 헤더 컬럼을 임의로 만들어서 추가 해버릴 수 있습니다. 그러면 컴플레인 시트가 매 실행마다 이상한 컬럼이 생겨 지저분해집니다.

Manually 로 두면 아래처럼 기존 시트 헤더 순서 그대로 각 컬럼이 나열되고, 값 필드에 Let AI define 을 켜서 AI 가 판단·계산한 값을 넣도록 합니다.

Mapping Column Mode: Map Each Column Manually → 각 컬럼별 값은 'let AI define' (ComplaintId·OrderId·Name·Email·Category·Message·Severity·Reason·CreatedAt·Status)
💡
왜 AI 값 매핑? ComplaintId 생성, Severity(높음/보통/낮음) 판단, CreatedAt 시각 등 AI 가 계산·판단해야 하는 값 이 섞여있기 때문. 컬럼 자체는 수동으로 고정 + 그 안에 들어갈 값만 AI 자동 — 이게 Manually + Let AI define 조합의 핵심.

Tool 4 — Gmail (긴급 시에만 발송)

네 번째 툴로 Gmail 을 붙입니다. 이 툴은 AI 가 '긴급' 판정을 내렸을 때만 호출 되도록 System Message 에서 조건을 명시합니다.

Tool 슬롯에 Gmail 추가
받는사람 고정 · 제목/본문은 'let AI define' (AI 가 상황 맞춰 작성)

4개 툴 세팅 완료 — 오버뷰

Form Trigger → AI Agent · Chat Model / (Memory 없음) / Tool 4개 (Get Orders / Get Complaints / Append Complaint / Send Gmail).

4개 Tool 이 AI Agent 하위에 연결된 최종 구성

Agent 지침서 세팅 — User + System

폼에서 들어온 값을 User Message 로 넘기고, 처리 규칙은 System Message 에 정의합니다.

User Prompt = 폼 제출 값 매핑 / System Message = 처리 규칙

User Prompt (Prompt · User Message)

User Prompt (폼 제출 값) n8n expression
다음 고객 문의를 시스템 지침에 따라 처리하세요.

Name: {{ $json["Name"] }}
Email: {{ $json["Email"] }}
OrderId: {{ $json["OrderId"] }}
Category: {{ $json["Category"] }}
Message: {{ $json["Message"] }}

System Message (전체 지침서)

System Message (전체 지침서) text
너는 온라인 쇼핑몰 고객센터의 1차 CS 담당 AI Agent입니다.

고객이 문의 폼을 제출하면 문의 내용을 확인하고,
연결된 도구 중 필요한 도구를 사용하여
실제 주문 정보와 고객 정보를 확인한 뒤
문의의 심각도를 판단하고 필요한 후속 조치를 수행하세요.


[폼에서 들어오는 데이터]

폼에는 다음 5개의 필드가 있습니다.

- Name
- Email
- OrderId
- Category
- Message

각 필드의 값을 정확하게 사용하세요.

특히 주문 조회 시 반드시 폼의 OrderId 값을 사용하세요.


[연결된 도구의 역할]

연결된 도구 중 다음 역할에 해당하는 도구를 찾아 사용하세요.

1. 주문 조회용 도구
- OrderId를 기준으로 실제 주문 정보를 조회합니다.
- 주문일, 상품명, 결제금액, 배송상태 등을 확인하세요.

2. 고객 조회용 도구
- Name, Email, OrderId 등을 이용하여 고객 정보를 추가 확인합니다.

3. 문의 저장용 도구
- 고객이 제출한 모든 문의를 Complaints 스프레드시트에 저장합니다.
- 모든 문의는 심각도와 관계없이 반드시 저장하세요.

4. 이메일 발송용 도구
- 긴급 문의 발생 시 담당자에게 알림을 보냅니다.
- Severity가 "긴급"인 경우에만 사용하세요.


[처리 절차]

1. 폼에서 Name, Email, OrderId, Category, Message를 확인하세요.

2. 주문 조회용 도구를 사용하여
OrderId에 해당하는 실제 주문 정보를 조회하세요.

3. 필요한 경우 고객 조회용 도구를 사용하여
고객 정보를 추가 확인하세요.

4. 고객의 Message와 실제 주문 상태를 비교하세요.

5. Severity를 판단하세요.

Severity는 반드시 다음 중 하나만 사용하세요.

- 낮음
- 보통
- 높음
- 긴급

6. 모든 문의를 반드시 Complaints 시트에 저장하세요.

7. Severity가 "긴급"인 경우에만
저장 완료 후 이메일을 발송하세요.


[심각도 판단 기준]

낮음
- 단순 배송 일정 문의
- 상품 정보 문의
- 환불 가능 여부 문의
- 정상적으로 처리 중인 주문 상태 확인

보통
- 배송이 다소 지연된 경우
- 주문 상태가 일정 기간 변경되지 않은 경우
- 교환 또는 환불 요청
- 결제 후 처리 상태 문의

높음
- 제품 불량이 의심되는 경우
- 배송준비중 상태가 장기간 지속되는 경우
- 배송 추적 문제가 있는 경우
- 고가 상품의 출고가 지연되는 경우

긴급
- 심각한 장기 배송 지연
- 고가 상품이 장기간 출고되지 않는 경우
- 고객 피해 가능성이 큰 경우
- 즉시 담당자 확인이 필요한 경우


[Complaints 시트 구조]

Complaints 시트에는 다음 컬럼이 있습니다.

ComplaintId
OrderId
Name
Email
Category
Message
Severity
Reason
CreatedAt
Status

반드시 위 컬럼에 맞춰 저장하세요.


[ComplaintId 생성 규칙]

ComplaintId는 반드시 다음 형식을 사용하세요.

C001
C002
C003
C004
...

즉:

- 영문 대문자 C로 시작
- 뒤에는 숫자 3자리
- 숫자가 한 자리이면 앞에 00을 붙임
- 숫자가 두 자리이면 앞에 0을 붙임

예:

1번째 문의 → C001
2번째 문의 → C002
9번째 문의 → C009
10번째 문의 → C010
20번째 문의 → C020
21번째 문의 → C021

새로운 문의를 저장할 때는
기존 Complaints 데이터의 가장 마지막 ComplaintId를 확인하고
숫자 부분에 1을 더하여 새로운 ComplaintId를 생성하세요.

예:

현재 마지막 ComplaintId가 C020이면
새 문의의 ComplaintId는 C021입니다.

현재 마지막 ComplaintId가 C029이면
새 문의의 ComplaintId는 C030입니다.

기존 ComplaintId와 중복되는 값을 생성하지 마세요.


[저장 규칙]

모든 문의는 반드시 다음 구조로 저장하세요.

ComplaintId
→ 기존 마지막 ComplaintId 다음 번호

OrderId
→ 폼의 OrderId

Name
→ 폼의 Name

Email
→ 폼의 Email

Category
→ 폼의 Category

Message
→ 폼의 Message 원문 그대로

Severity
→ 판단한 심각도

Reason
→ 해당 심각도로 판단한 이유

CreatedAt
→ 현재 접수 날짜와 시간

Status
→ 접수


예를 들어 기존 마지막 데이터가 C020이고
다음 문의가 들어왔다면 다음과 같이 저장합니다.

ComplaintId: C021
OrderId: ORD-1002
Name: 이서연
Email: seoyeon@example.com
Category: 배송
Message: 배송중이라고 나오는데 언제쯤 도착할까요?
Severity: 낮음
Reason: 실제 주문 상태가 배송중인 정상적인 배송 일정 문의
CreatedAt: 현재 날짜와 시간
Status: 접수


[이메일 발송 규칙]

Severity가 "긴급"인 경우에만 이메일을 발송하세요.

낮음 → 이메일 발송 금지
보통 → 이메일 발송 금지
높음 → 이메일 발송 금지
긴급 → 저장 후 이메일 발송

긴급 문의도 반드시 먼저 Complaints 시트에 저장한 뒤
이메일을 발송하세요.

이메일 수신자는 도구에 미리 설정된 수신자만 사용하세요.


[중요 규칙]

- 모든 폼 문의는 반드시 저장하세요.
- 문의 1건당 저장용 도구는 1회만 사용하세요.
- ComplaintId는 반드시 C + 숫자 3자리 형식을 사용하세요.
- 기존 ComplaintId와 중복되면 안 됩니다.
- Message는 고객이 입력한 원문을 그대로 저장하세요.
- Status는 항상 "접수"로 저장하세요.
- 데이터에 없는 정보는 추측하지 마세요.
- 긴급이 아닌 문의에는 이메일을 발송하지 마세요.


[최종 응답]

처리가 완료되면 다음 내용을 간단히 출력하세요.

- 생성된 ComplaintId
- 주문 확인 결과
- 심각도
- 저장 여부
- 이메일 발송 여부
💡
핵심: Severity 4단계(낮음/보통/높음/긴급) 중 긴급 일 때만 Gmail 발송. 나머지는 시트 저장까지만. 모든 문의는 심각도와 관계없이 반드시 저장 — 저장 1회 + 조건부 이메일 이라는 규칙이 지침서 전체를 관통합니다.

실행 ① — 단순 배송 문의 (보통)

먼저 단순 배송 문의 를 폼으로 제출해봅니다.

예: '배송이 언제 도착하나요?' 같은 낮은 심각도

AI 가 주문 조회 → Severity: 낮음/보통 판단 → 시트에 append 만 하고 Gmail 은 호출하지 않습니다.

실행 로그: Get Orders · Append Complaint 만 실행, Send Gmail 미실행
컴플레인 시트 마지막 행에 자동 저장됨

실행 ② — 긴급 컴플레인

이번엔 고가 상품 장기 배송 지연 처럼 Severity: 긴급 판정이 나올 만한 문의를 제출.

예: 고가 상품이 일주일째 배송준비중

AI 가 Severity 를 긴급 으로 판단 → 시트 저장 + Gmail Tool 자동 호출.

실행 로그: Get Orders · Get Complaints · Append Complaint · Send Gmail 모두 실행
컴플레인 시트에 Severity: 긴급 으로 저장
담당자 메일함에 [긴급컴플레인] 자동 발송 확인
💡
같은 워크플로우 · 같은 AI Agent 인데 System Message 의 규칙 하나 로 단순 문의는 조용히 저장, 긴급은 즉시 알림 이 나뉩니다. 이게 규칙 기반 노드 배치 없이 AI Agent 로만 구현되는 지능형 분기의 힘.

실습용 폼 입력 예시 — Severity 4단계 시연

AI 가 4단계 Severity(낮음/보통/높음/긴급) 를 정말로 잘 구분하는지 확인하려면, 각 등급마다 예상되는 문의 데이터를 직접 던져보는 게 가장 확실합니다. 아래 표의 4건을 순서대로 폼에 입력해서 실제 판정 결과 · 시트 저장 · 이메일 발송 여부 를 눈으로 확인하세요.

📊 시트 데이터 · 4행 × 7열
Severity 예상이름이메일주문번호카테고리문의내용실제 주문 정보
낮음이서연seoyeon@example.comORD-1002배송배송중이라고 나오는데 언제쯤 도착할까요?기계식키보드 / 129,000원 / 배송중
보통문재현jaehyun@example.comORD-1017결제결제는 완료됐는데 주문 상태가 계속 결제완료로 되어 있습니다. 언제 출고되는지 확인해주세요.게이밍마우스 / 69,000원 / 결제완료
높음윤서진seojin@example.comORD-1008상품무선마우스를 받았는데 왼쪽 클릭이 계속 안 됩니다. 다시 연결해도 똑같아요. 불량 확인 부탁드립니다.무선마우스 / 59,000원 / 배송완료
긴급박준호junho@example.comORD-1003배송주문한 지 일주일이 지났는데 아직도 배송준비중입니다. 계속 출고가 안 되고 있으니 빠르게 확인해주세요.모니터 / 320,000원 / 배송준비중

각 케이스별 기대 동작 은 다음과 같습니다.

  • 낮음 · 이서연 — 실제 배송 상태(배송중)와 문의가 정합. Severity 낮음으로 저장만, 이메일 X
  • 보통 · 문재현 — 결제 후 정체 상태. 처리 지연 문의로 보통 판정, 저장만, 이메일 X
  • 높음 · 윤서진 — 초기 불량 의심. 높음 판정, 저장만, 이메일 X (높음도 이메일 발송 안 함 — 긴급만 발송)
  • 긴급 · 박준호 — 고가 상품 장기 배송 지연. 긴급 판정, 저장 + 이메일 발송
💡
⭐ 팁 — 4건을 순서대로 던져보세요. 시트에 Severity 컬럼이 낮음 → 보통 → 높음 → 긴급 으로 저장되는 걸 실시간으로 확인할 수 있고, Gmail 은 4번째에서만 도착 — "저장은 4번, 이메일은 1번" 규칙이 눈으로 증명됩니다.
💡
AI 가 Severity 를 실제로 어떻게 판단했는지 궁금하면 저장된 Reason 컬럼을 확인하세요. 왜 그 등급으로 판단했는지 근거가 자연어로 남아있어 디버깅에 매우 유용 합니다.

시나리오 — PDF 이력서 자동 심사 → 등급별 메일 발송

지원자가 이력서 PDF 를 폼으로 제출하면, n8n 이 자동으로 PDF 를 파싱하고 AI Agent 로 스킬·경력을 구조화 하고, Code 노드로 점수 계산 후 Switch 노드로 적합/검토/탈락 3-way 라우팅 하여 등급별로 다른 Gmail 을 자동 발송하는 실전 채용 자동화 파이프라인.

  • Form Trigger — 지원 폼 (이름·이메일·지원직무 dropdown · 이력서 File 업로드)
  • Extract from File (PDF) — 업로드된 PDF 를 텍스트로 파싱
  • AI Agent + Structured Output Parser — 이력서 텍스트에서 스킬·경력·프로젝트를 JSON 스키마로 강제 추출
  • Code 노드 — n8n 경력·API·언어·클라우드 등에 점수 배정 → 총점 + 평가결과(적합/검토/탈락) 계산
  • Google Sheets Append — 심사 결과 저장
  • Switch 노드 — 평가결과에 따라 3방향 라우팅
  • Gmail 3개 — 등급별로 다른 톤의 담당자 알림 메일 자동 발송
💡
🎯 이 예제의 새 기술 4가지 — ① 폼 File 업로드, ② Extract from File PDF 노드, ③ Structured Output Parser (AI 결과를 JSON 스키마로 강제), ④ Switch 노드 다중 라우팅. 앞 3개 예제(1~3)를 다 익힌 다음에 도전하는 걸 권장합니다.

📎 실습용 이력서 PDF 5개 — 아래 파일을 다운받아 폼 제출 실습 때 이력서 업로드 필드에 하나씩 넣어보세요. 스킬·경력 조합이 다양해서 적합/검토/탈락 판정이 각각 나오는 걸 확인할 수 있습니다.

📎 지원자 A · 김도윤 (n8n 4년 · 시니어 스펙) n8n·Python·API·Google Workspace 다수 경험 — 적합 후보 ⬇ 다운로드 📎 지원자 B · 이서현 실전 지원자 이력서 (자동 심사 파이프라인 테스트용) ⬇ 다운로드 📎 지원자 C · 박준혁 실전 지원자 이력서 (자동 심사 파이프라인 테스트용) ⬇ 다운로드 📎 지원자 D · 최민지 실전 지원자 이력서 (자동 심사 파이프라인 테스트용) ⬇ 다운로드 📎 지원자 E · 정우진 실전 지원자 이력서 (자동 심사 파이프라인 테스트용) ⬇ 다운로드
💡
💡 사용법 — 5개를 순서대로 폼 제출 해서 각각 어떤 등급으로 분류되는지 시트에서 확인. 파일이 담긴 서버는 Content-Disposition 응답 헤더로 저장 시 원본 한글 파일명(지원자_A_김도윤.pdf) 을 그대로 유지합니다.

폼 세팅 — Text · Dropdown · File 조합

새 워크플로우를 만들고 On form submission 트리거를 추가합니다.

트리거 목록에서 On form submission 선택

Form Title 을 "자동화 엔지니어 채용 지원" 으로 두고 Form Elements 를 추가합니다.

Form Title + Add Form Element

지원직무는 Dropdown, 이력서는 File 타입으로 지정합니다.

지원직무=Dropdown, 이력서=File

Dropdown 에는 회사가 채용 중인 직무를 옵션으로 등록합니다 (예: 업무자동화 엔지니어 / n8n 자동화 개발자 / 백엔드 자동화 개발자).

Values 1~3 에 직무명 입력

⚠️ File 필드에는 반드시 Custom Field Name 을 data 로 설정 하세요. 뒤에 붙일 Extract from File 노드의 기본 입력 필드명이 data 라서 이걸 맞춰야 자동 연결됩니다.

File 필드 → Custom Field Name: data (필수)
💡
폼 필드는 최소 3개 — 이름 · 이메일 · 지원직무 · 이력서(File). Custom Field Name 을 이름은 name, 이메일은 email 로 두면 뒤에서 표현식 참조가 편합니다.

PDF 파싱 — Extract from File 노드

폼 트리거 뒤에 Extract from File 노드를 추가합니다.

12가지 파일 형식 중 Extract from PDF 선택

노드 파라미터는 Input Binary Field Name = data (폼의 Custom Field Name 과 일치) 만 확인하면 됩니다. 나머지 옵션은 기본값 유지.

Operation: Extract from PDF
고급 옵션은 손대지 않고 그대로
💡
실행하면 output 에 text, numpages, info 등의 필드가 나옵니다. text 필드에 PDF 전체 텍스트가 하나의 긴 문자열로 담겨 다음 AI Agent 로 흘러갑니다.

AI Agent — 이력서에서 구조화된 스킬·경력 추출

Extract 노드 뒤에 AI Agent 를 붙입니다.

Extract from PDF → AI Agent

Source for Prompt 를 Define below 로 두고, User Message 에는 앞 노드의 text 필드를 넘깁니다. 옵션에서 System Message 를 추가하는 것도 잊지 마세요.

Prompt + Options → System Message 추가
📋 User Message — 이력서 텍스트 넘기기
지원자 이름: {{ $("On form submission").item.json["이름"] }}
지원 직무: {{ $("On form submission").item.json["지원직무"] }}

이력서 원문:
{{ $json.text }}
📋 System Message — 채용 담당 AI
당신은 기업의 채용 담당 AI입니다.

지원자의 이력서를 읽고 채용 평가에 필요한 정보를 객관적으로 추출하세요.

추측하지 마세요.
이력서에 없는 정보는 null 또는 0으로 처리하세요.

다음 항목을 분석하세요.

1. 지원자 이름
2. 총 경력 연수
3. n8n 실무 경력 연수
4. Python 사용 경험 여부
5. JavaScript 사용 경험 여부
6. REST API 연동 경험 여부
7. Google Workspace 연동 경험 여부
8. 데이터베이스 경험 여부
9. Docker 또는 Linux 경험 여부
10. 자동화 프로젝트 개수
11. 자동화 프로젝트 요약
12. 주요 강점
13. 우려사항

최종 채용 여부는 판단하지 마세요.
평가에 필요한 사실만 추출하세요.

다음으로 AI Agent 하단의 Chat Model 과 Output Parser 슬롯을 각각 연결합니다.

OpenAI Chat Model + Structured Output Parser 붙이기
AI Agent 하위 두 슬롯이 모두 채워진 상태
System Message 최종 확인

Structured Output Parser — JSON 스키마 강제

AI Agent 하위에 붙인 Structured Output Parser 노드를 열어, Schema Type 을 Generate From JSON Example 로 두고 아래 예시를 붙여넣으세요. n8n 이 이걸 스키마로 변환해서 AI 결과가 이 구조에 맞도록 강제 합니다.

Schema Type: Generate From JSON Example
📋 JSON Example — 이력서 추출 스키마
{
  "name": "김도윤",
  "totalCareerYears": 4,
  "n8nYears": 3,
  "hasPython": true,
  "hasJavaScript": true,
  "hasApiExperience": true,
  "hasGoogleWorkspace": true,
  "hasDatabaseExperience": true,
  "hasDockerLinux": true,
  "automationProjectCount": 4,
  "projectSummary": "고객 문의 자동화, 영업 미팅 어시스턴트 등",
  "strengths": [
    "n8n 실무 경험",
    "API 연동 경험",
    "운영 자동화 경험"
  ],
  "concerns": []
}
💡
이제 AI 가 반환하는 결과는 항상 이 JSON 구조 를 따르므로, 뒤 Code 노드에서 data.hasPython 같이 안심하고 필드 접근 이 가능합니다. Structured Output 이 없으면 AI 마다 필드명·타입이 매번 달라져 시트 저장 노드가 깨집니다.

Code 노드 — 점수 배정 + 평가결과 자동 판정

AI Agent 뒤에 Code 노드를 추가합니다.

AI Agent → Code (JavaScript)

각 스킬·경력에 점수를 배정하고 총점으로 적합 / 검토 / 탈락 3단계 결과를 판정합니다.

Run Once for All Items · JavaScript
📋 Code 노드 — 이력서 점수 자동 계산
return $input.all().map(item => {

  const data = item.json.output;

  let score = 0;
  let scoreReasons = [];

  // n8n 실무 경력
  if (data.n8nYears >= 2) {
    score += 30;
    scoreReasons.push('n8n 경력 2년 이상 +30점');
  } else if (data.n8nYears >= 1) {
    score += 15;
    scoreReasons.push('n8n 경력 1년 이상 +15점');
  }

  // API 경험
  if (data.hasApiExperience === true) {
    score += 20;
    scoreReasons.push('API/Webhook 경험 +20점');
  }

  // Python
  if (data.hasPython === true) {
    score += 15;
    scoreReasons.push('Python 경험 +15점');
  }

  // JavaScript
  if (data.hasJavaScript === true) {
    score += 10;
    scoreReasons.push('JavaScript 경험 +10점');
  }

  // Google Workspace
  if (data.hasGoogleWorkspace === true) {
    score += 10;
    scoreReasons.push('Google Workspace 경험 +10점');
  }

  // DB
  if (data.hasDatabaseExperience === true) {
    score += 5;
    scoreReasons.push('DB 경험 +5점');
  }

  // Docker / Linux
  if (data.hasDockerLinux === true) {
    score += 5;
    scoreReasons.push('Docker/Linux 경험 +5점');
  }

  // 자동화 프로젝트
  if (data.automationProjectCount >= 2) {
    score += 5;
    scoreReasons.push('자동화 프로젝트 2개 이상 +5점');
  }

  // 최종 평가
  let result;

  if (score >= 80) {
    result = '적합';
  } else if (score >= 60) {
    result = '검토';
  } else {
    result = '탈락';
  }

  return {
    json: {
      name: data.name,
      totalCareerYears: data.totalCareerYears,
      n8nYears: data.n8nYears,
      hasPython: data.hasPython,
      hasJavaScript: data.hasJavaScript,
      hasApiExperience: data.hasApiExperience,
      hasGoogleWorkspace: data.hasGoogleWorkspace,
      hasDatabaseExperience: data.hasDatabaseExperience,
      hasDockerLinux: data.hasDockerLinux,
      automationProjectCount: data.automationProjectCount,
      projectSummary: data.projectSummary,
      strengths: data.strengths,
      concerns: data.concerns,
      score,
      result,
      scoreReasons
    }
  };

});
💡
점수 기준은 회사·직무에 맞게 자유롭게 조절하세요. 지금은 80+ 적합 / 60~79 검토 / 60 미만 탈락 인데, 신입 채용이면 기준을 낮추고 시니어면 높이는 식.

Google Sheets Append — 심사 결과 시트 저장

Code 노드 뒤에 Google Sheets · Append row in sheet 노드를 붙입니다.

Code → Google Sheets (Append Row)

설정: Document = 채용 심사 시트, Sheet = 시트1, Mapping Column Mode = Map Each Column Manually, 각 컬럼에 Code 노드가 만든 필드를 표현식으로 매핑.

name·totalCareerYears·n8nYears·… 16개 컬럼 매핑
📋 시트 헤더 (탭 이름: 시트1)
name	totalCareerYears	n8nYears	hasPython	hasJavaScript	hasApiExperience	hasGoogleWorkspace	hasDatabaseExperience	hasDockerLinux	automationProjectCount	projectSummary	score	result	strengths	concerns	scoreReasons
💡
헤더를 Code 노드 반환 필드명(영문)과 정확히 일치 시켜야 자동 매핑이 됩니다. 배열 타입(strengths·concerns·scoreReasons) 은 시트에 저장될 때 자동으로 문자열로 직렬화됩니다.

Switch + Gmail — 평가결과별 3방향 메일 발송

시트 저장 뒤에 Switch 노드를 붙입니다.

Google Sheets → Switch

Mode = Rules, Routing Rules 를 3개 추가합니다 — 각각 적합·검토·탈락.

Add Routing Rule × 3

각 룰의 조건 표현식은 {{ $json['result'] }} 가 적합 / 검토 / 탈락 문자열과 각각 일치하는지 확인. Rename Output 을 켜서 Output Name 을 적합 · 검토 · 탈락 으로 두면 시각적으로 명확.

조건: {{ $json['result'] }} is equal to 적합 / 검토 / 탈락 · Output Name 동일

Switch 의 3개 출력마다 Gmail 노드 를 각각 붙입니다.

적합 출력 → Gmail 첫 번째
적합 · 검토 · 탈락 각각 별도 Gmail

각 Gmail 은 To(담당자 이메일) 를 고정하고, Subject 와 Message 는 표현식으로 지원자 정보를 동적으로 채웁니다.

To 고정 · Subject/Message 는 표현식 · Email Type: Text 또는 HTML
📋 Gmail Subject — 적합/검토/탈락 공통 형식 (예)
[면접 추천] {{ $json['name'] }} 지원자 - {{ $json['score'] }}점
📋 Gmail Message HTML 예시 (적합용)
<div style="font-family: Arial, sans-serif; max-width: 650px; margin: 0 auto; color: #222; line-height: 1.7;">
  <h2 style="margin-bottom: 6px;">✅ 면접 추천 지원자</h2>
  <p><b>이름:</b> {{ $json["이름"] }}</p>
  <p><b>총경력:</b> {{ $json["총경력"] }}년 · <b>n8n 경력:</b> {{ $json["n8n경력"] }}년</p>
  <p><b>점수:</b> {{ $json["점수"] }}점 · <b>평가:</b> {{ $json["평가결과"] }}</p>
  <h3>강점</h3>
  <ul>{{ $json["강점"].map(s => `<li>${s}</li>`).join("") }}</ul>
  <h3>평가 근거</h3>
  <ul>{{ $json["평가근거"].map(s => `<li>${s}</li>`).join("") }}</ul>
</div>
💡
3개 Gmail 은 제목·본문 톤만 다르게 하면 됩니다. 적합=면접 추천 / 검토=추가 검토 요청 / 탈락=참고 저장. 발송 방향은 모두 담당자 이메일 고정 (지원자에게 자동 발송은 다음 확장 단계에서).

최종 실행 — 이력서 PDF 하나로 파이프라인 검증

이력서 PDF (샘플 지원자 하나) 를 준비해 폼 Test URL 로 제출합니다. 몇 초 안에 파이프라인 전체가 자동 실행됩니다.

담당자 Gmail 함에 자동 발송된 지원자 요약 메일
💡
🎯 완성. PDF 하나만 넣으면 → 파싱 → AI 스킬 추출 → 점수 계산 → 시트 저장 → 등급 판정 → 담당자 메일까지 사람 손 없이 자동으로 흘러갑니다. 실무에서 채용 초기 스크리닝의 80%를 이 파이프라인 하나로 대체 가능합니다.
  • 확장 아이디어 ① Switch 마지막 브랜치에 지원자 자동 응답 메일 (탈락도 정중한 안내 자동 발송)
  • 확장 아이디어 ② AI Agent 앞에 이력서 언어 감지 Agent 추가 → 한국어/영어 이력서 모두 처리
  • 확장 아이디어 ③ Google Sheets 시트를 Slack 알림 과 연동해 적합 지원자만 채용팀 채널에 즉시 공유
  • 확장 아이디어 ④ 지원자에게 Google Calendar 초대장 자동 발송 (적합 등급만)
  • 확장 아이디어 ⑤ 이력서 원본 PDF 를 Google Drive 에 지원자명 폴더로 자동 정리