발행일: 2026-08-04(화) 03:14
도서하루 30분 n8n ①DAY 28
챕터 4 — 미니 프로젝트 : AI 이메일 비서난이도 ★★★
DAY 28

프로젝트 고도화 : 나만의 기능 추가

📥 DAY 28 워크플로우 JSON 다운로드
이론5
실습20
미션5

"프로그램은 사람이 읽을 수 있도록 작성돼야 하고, 기계가 실행하는 것은 부수적인 일이다."

헤럴드 에이블슨 (Harold Abelson, MIT 교수·컴퓨터과학자)
🎯 오늘의 학습 목표
  • 첨부파일 자동 감지 및 Google Drive 저장 기능을 추가할 수 있다
  • VIP 발신자 목록을 Sheets에서 관리하고 즉시 Slack DM을 보낼 수 있다
  • 주간 요약 리포트 워크플로우를 독립적으로 만들고 GitHub에 JSON을 업로드할 수 있다
Edit Fields(AI 분석용 필드 정리)에 추가할 필드
text
첨부파일수:
{{ $json.payload?.parts?.filter(p => p.filename && p.filename.length > 0).length ?? 0 }}

첨부파일명목록:
{{ $json.payload?.parts?.filter(p => p.filename && p.filename.length > 0).map(p => p.filename).join(', ') ?? '없음' }}
All Items 모드 / VIP 목록과 발신자 비교
javascript
const vipList = $input.all();
const senderEmail = $('Edit Fields (AI 분석용 필드 정리)').item.json.발신자.toLowerCase();
const matched = vipList.find(row => row.json.이메일주소.toLowerCase() === senderEmail);
const isVip = !!matched;

return [{
  json: {
    ...$('Edit Fields (AI 분석용 필드 정리)').item.json,
    VIP여부: isVip,
    VIP이름: matched ? matched.json.이름 : '',
    VIP관계: matched ? matched.json.관계 : '',
    VIP메모: matched ? matched.json.메모 : ''
  }
}];
All Items 모드 / Sheets 로그 집계
javascript
const rows = $input.all();
const today = new Date();
const sevenDaysAgo = new Date(today.getTime() - 7 * 24 * 60 * 60 * 1000);

const filtered = rows.filter(r => {
  const d = new Date(r.json.수신시각);
  return d >= sevenDaysAgo && d <= today;
});

const total = filtered.length;
const byCategory = {};
let totalScore = 0;
let draftCount = 0;

filtered.forEach(r => {
  const cat = r.json.분류 || '미분류';
  byCategory[cat] = (byCategory[cat] || 0) + 1;
  totalScore += Number(r.json.긴급도점수) || 0;
  if (r.json.초안저장여부 === '저장완료') draftCount++;
});

return [{
  json: {
    총수신건수: total,
    긴급건수: byCategory['긴급'] || 0,
    일반건수: byCategory['일반'] || 0,
    광고건수: byCategory['광고'] || 0,
    스팸건수: byCategory['스팸'] || 0,
    평균긴급도점수: total > 0 ? (totalScore / total).toFixed(1) : 0,
    초안저장건수: draftCount,
    조회기간: `${sevenDaysAgo.toISOString().slice(0,10)} ~ ${today.toISOString().slice(0,10)}`
  }
}];
3가지 방법
text
방법 1 — UI에서 직접
캔버스 오른쪽 상단 ⋯ → Download → .json 파일 저장

방법 2 — 캔버스에서 복사
Ctrl+A → Ctrl+C → 텍스트 편집기에 붙여넣기 → .json 저장

방법 3 — CLI (자체 호스팅)
n8n export:workflow --id=워크플로우ID --output=./backup/ai-email-assistant.json

파일명 규칙: YYYYMMDD_워크플로우이름_v버전.json
예시: 20260628_AI이메일비서_v1.json
🛠️ 실습
STEP 1기능 1 — 첨부파일 자동 감지 및 Google Drive 저장
  1. Edit Fields에 첨부파일수·첨부파일명목록 필드 추가
  2. IF 노드 추가: {{ $json.첨부파일수 }} > 0
  3. True 경로: Gmail Get Attachment → Google Drive Upload → Sheets 로그 → Slack 알림
  4. False 경로: 기존 OpenAI 노드로 연결
  5. 첨부파일 포함 테스트 메일 발송 후 Drive 저장 확인
  6. 캡처: n8n_day28_attachment_drive.png
STEP 2기능 2 — VIP 발신자 특별 처리
  1. Sheets VIP발신자목록 탭 생성 (헤더: 이메일주소/이름/관계/메모)
  2. 본인 이메일 주소를 VIP로 등록
  3. Google Sheets Get Rows (VIP 목록 조회) → Code (VIP 여부 확인) → IF (VIP 분기)
  4. True 경로: Slack DM 알림 → 기존 OpenAI 흐름과 Merge
  5. 캡처: n8n_day28_vip_alert.png
STEP 3기능 3 — 주간 요약 리포트 워크플로우
  1. 새 워크플로우 'AI 이메일 비서 — 주간 요약 리포트' 생성
  2. Schedule Trigger (Cron: 0 9 * * 1, Timezone: Asia/Seoul)
  3. Edit Fields (조회기간 계산) → Sheets Get Rows (로그 조회) → Code (통계 집계)
  4. OpenAI (인사이트 생성) → Edit Fields (파싱) → Slack (리포트 발송) → Sheets (기록)
  5. Manual Trigger로 테스트 후 Slack 리포트 확인
  6. 캡처: n8n_day28_weekly_report.png
STEP 4워크플로우 JSON 내보내기 & GitHub 업로드
  1. AI 이메일 비서 v1 워크플로우 JSON 내보내기
  2. 주간 요약 리포트 워크플로우 JSON 내보내기
  3. GitHub에 n8n-workflows Repository 생성
  4. JSON 파일 2개 업로드 (파일명 규칙 적용)
  5. 캡처: n8n_day28_github_upload.png
🚀 오늘의 미션
  1. 아래 미션 체크리스트를 모두 완료하고 SNS에 인증샷을 올려보세요!
  2. □ 기능 1 (첨부파일 감지 및 Google Drive 저장) 구현 완료
  3. □ 기능 2 (VIP 발신자 특별 처리) 구현 완료
  4. □ 기능 3 (주간 요약 리포트 워크플로우) 구현 완료
  5. □ 워크플로우 JSON 파일 내보내기 완료
  6. □ GitHub Repository에 JSON 업로드 완료
  7. 추천 해시태그: #n8n #자동화 #AI이메일비서 #노코드 #업무자동화
📋 워크플로우 임포트 방법
  1. 위 버튼으로 JSON 파일을 다운로드합니다.
  2. n8n 캔버스 오른쪽 상단 Import from file 클릭
  3. 다운로드한 JSON 파일을 선택하면 워크플로우가 즉시 열립니다.
  4. 빨간 느낌표(!)가 보이면 Credentials을 본인 계정으로 재연결하세요.
💡 먼저 직접 만들어보고, 막혔을 때 정답지로만 활용하세요!
n8n 계정이 없으신가요?n8n 무료 시작하기 ↗
← DAY 27
프로젝트 완성 : 에러 처리 & 안정화
목차로DAY 29
트러블슈팅 : 막혔을 때 이렇게 해요