학교/학원용 “출석 체크 웹훅”은 “출석 페이지 → n8n 웹훅 → 시트/DB 기록 → 보호자 알림”까지 한 번에 처리하는 HTTP 기반 출석 자동화 흐름이다.n8n+1\
아래 문서는 이 흐름을 구현하기 위한 기술 설계와 n8n 워크플로우 구조, 필드 정의, 예시 요청/응답을 정리한 것이다.n8n-docs.teamlab+1
1. 전체 아키텍처 개요
-
클라이언트: 웹/모바일 출석 화면(예: React/Next.js, WebView, 간단한 HTML 폼 등)이 n8n Webhook URL로 JSON POST.
-
백엔드/오케스트레이션: n8n Webhook 트리거 → 학생 검증(시트/DB 조회) → 출석 기록 저장(Google Sheets 또는 RDB) → KakaoTalk/문자 발송(HTTP Request 노드).n8n+1
-
데이터 저장소:
-
학생 마스터:
students시트 또는 DB 테이블(학생 ID, 이름, 학년, 보호자 연락처 등).n8n+1 -
출석 로그:
attendance_logs시트 또는 DB 테이블(날짜, 시간, 학생 ID, 상태, 원본 요청 등).n8n
2. Webhook API 스펙
2.1 엔드포인트
-
메서드:
POST.n8n -
URL: n8n Webhook 노드가 생성하는 Production URL (예:
https://n8n.example.com/webhook/attendance-check).n8n+1 -
Content-Type:
application/json.
2.2 요청 바디 (예시 스키마)
json
{ "studentId": "S2025001", "timestamp": "2025-11-30T09:05:23+09:00", "status": "IN", "deviceId": "KIOSK-01", "meta": { "location": "MAIN_CAMPUS_1F", "classCode": "ENG-301" } }
권장 필드 정의:
-
studentId(string, required): 학원/학교 내부에서 사용하는 고유 학생 ID. -
timestamp(string, ISO-8601, required): 클라이언트 기준 출석 시각(예: 한국 시간). -
status(string, required):"IN"(입실),"OUT"(퇴실),"LATE"(지각) 등 사전 정의된 코드. -
deviceId(string, optional): 키오스크/단말기 식별자. -
meta(object, optional): 교실 코드, 캠퍼스, IP, 브라우저 정보 등 확장용.
2.3 응답
- 성공:
json
{ "success": true, "message": "ATTENDANCE_RECORDED", "studentName": "홍길동", "normalizedTimestamp": "2025-11-30T09:05:23+09:00", "status": "IN" }
- 오류(예시):
json
{ "success": false, "errorCode": "STUDENT_NOT_FOUND", "message": "Unknown studentId" }
Webhook 노드의 Response Data를 커스텀으로 설정하면 위와 같이 JSON 응답을 직접 구성할 수 있다.n8n-docs.teamlab+1
3. n8n 워크플로우 설계
3.1 노드 구성 개요
-
Webhook (Trigger) – 출석 요청 수신.n8n+1
-
Function / Set (입력 정규화) – 필드 이름/형식 정리, 기본값 설정.
-
학생 정보 조회 노드
-
Google Sheets 노드(
Get Row(s)) 또는 DB 노드(MySQL/Postgres 등)에서studentId로 학생 정보를 조회.youtuben8n -
IF (검증 분기) – 학생 존재 여부, 요청 유효성 검사.
-
출석 로그 저장 노드
-
Google Sheets
Append Row또는 DBINSERT.n8n+1 -
KakaoTalk/문자 발송 노드
-
HTTP Request 노드로 카카오톡 나에게 보내기/알림톡/문자 API 호출.wikidocs+1
-
Webhook 응답 노드(Respond to Webhook 또는 Webhook 노드 응답 설정) – 최종 JSON 응답 반환.n8n
4. 단계별 상세 설정
4.1 Webhook 노드
-
HTTP Method:
POST.n8n -
Authentication:
-
초간단 버전: 쿼리 파라미터/헤더의 사설 토큰 검사(예:
x-api-key). -
고급: IP 화이트리스트, 서명 검증, TLS 강제 등은 리버스 프록시 및 별도 로직으로 보강.n8n
-
Response Mode:
-
동기 응답: 출석 기록과 보호자 알림까지 모두 처리 후 한 번에 응답.
-
또는 “기록만 하고 바로 OK 응답, 알림은 비동기로 처리” 구조도 가능.
4.2 입력 정규화 (Function / Set)
예시 로직:
-
timestamp가 비어 있으면 서버 현재 시간을 사용. -
status값이 소문자일 경우 대문자로 변환. -
meta가 없으면 빈 객체 생성.
이 단계에서 내부 공통 필드 구조를 확정해 두면 이후 노드에서 필드 참조가 단순해진다.n8n-docs.teamlab
4.3 학생 정보 조회
Google Sheets 예시
-
노드: Google Sheets.n8n
-
Operation:
Get Row(s)또는Read에 해당하는 연산. -
필터:
studentId열이 Webhook에서 받은studentId와 같은 행. -
주요 컬럼:
-
studentId -
name -
grade -
parentName -
parentPhone -
kakaoUserId또는 보호자 카카오 식별값.
DB 예시
-
노드: MySQL/Postgres 노드.
-
쿼리 예시:\
SELECT * FROM students WHERE student_id = {{ $json.studentId }} LIMIT 1;
4.4 검증(IF 노드)
검증 조건:
-
학생 행이 1개 이상인지.
-
status가 허용된 코드 목록(IN, OUT, LATE 등)에 포함되는지. -
시간대(예: 새벽 2시 출석 시 경고 플로우) 검증 등.
분기:
-
학생 없음→ Webhook 응답에STUDENT_NOT_FOUND에러 반환, 로그 시트/DB에 에러 기록(선택). -
유효→ 출석 로그 저장 단계로 진행.
5. 출석 로그 저장
5.1 Google Sheets에 저장
-
노드: Google Sheets, Operation:
Append Row.youtuben8n -
대상 시트:
attendance_logs. -
예시 컬럼:
| 컬럼명 | 설명 |
|---|---|
| date | YYYY-MM-DD 형식 날짜 |
| time | HH:mm:ss 또는 ISO 타임 부분 |
| timestamp | 전체 ISO 타임스탬프 |
| studentId | 학생 ID |
| studentName | 학생 이름 |
| status | IN / OUT / LATE 등 |
| deviceId | 단말기 ID |
| classCode | 수업 코드 |
| location | 캠퍼스/교실 정보 |
| createdAt | 서버 기록 시간 |
- 값 매핑은 Webhook + 학생 정보 조회 결과를 조합해서 Expression으로 작성.
5.2 DB에 저장 (선택)
-
MySQL/Postgres 노드,
INSERT쿼리 사용. -
출석 통계를 복잡하게 낼 계획이면 DB를 기본 저장소로 두고 Sheets는 리포트/대시보드 용도로만 사용하는 것도 좋다.n8n
6. KakaoTalk/문자 발송
6.1 KakaoTalk “나에게 보내기” 또는 보호자에게 보내기
-
인증/토큰 발급 절차:
-
카카오 개발자 콘솔에서 앱 생성 → REST API 키 확보 → OAuth2로 액세스 토큰 발급 →
talk_message스코프 동의.wikidocs -
n8n 설정:
-
노드: HTTP Request.youtubewikidocs
-
Method:
POST. -
URL: 예)
https://kapi.kakao.com/v2/api/talk/memo/default/send(나에게 보내기 기준).wikidocs -
Headers:
-
Authorization: Bearer {{ $json.accessToken }} -
Content-Type: application/x-www-form-urlencoded
-
-
Body:
template_object에 JSON 문자열(텍스트, 링크 등)을 구성.wikidocs
메시지 텍스트 예시(구성 아이디어):
-
[출석 알림] 홍길동 학생이 11:05에 ENG-301 수업에 입실했습니다. -
[퇴실 알림] 홍길동 학생이 12:40에 학원을 퇴실했습니다.
보호자에게 직접 보내려면 카카오톡 비즈 메시지(알림톡/친구톡) 또는 문자 발송 업체(SMS 게이트웨이)의 HTTP API를 사용하고, 동일하게 HTTP Request 노드로 연동한다.inflearn+1
6.2 발송 실패 처리
-
IF 노드로 HTTP Request의 응답 코드/바디를 검사.
-
실패 시:
-
재시도 큐(예: 별도 시트/DB 테이블)에 적재.
-
관리자에게 슬랙/이메일로 “해당 보호자 알림 실패” 통지.
7. 보안·운영 고려 사항
-
Webhook 보호:
-
IP 화이트리스트(출석 키오스크/내부 서버 IP만 허용) 또는 API Key 검사.n8n+1
-
HTTPS 강제, 프록시 레벨에서 TLS 종료 설정.n8n
-
로그 및 모니터링:
-
n8n 실행 로그 + 출석 로그 시트/DB로 이중 기록.
-
예외 발생 시 슬랙/이메일 알림 워크플로우 추가.
-
재사용성:
-
같은 구조를 “입실/퇴실 전용 웹훅”, “온라인 수업 출석 웹훅” 등으로 분기해서 재사용 가능.n8n-docs.teamlab
8. 간단 시퀀스 흐름
-
학생이 출석 페이지에서 QR 스캔 → 출석 버튼 클릭.
-
프론트엔드가
POST /attendance-check-webhook에 JSON 전송. -
Webhook 노드가 요청 수신 → 입력 정규화.
-
학생 마스터 시트/DB 조회 → 검증.
-
유효하면 출석 로그 시트/DB에 Append.
-
KakaoTalk/문자 API 호출로 보호자에게 알림 전송.
-
Webhook 응답으로
{ success: true, ... }반환, 클라이언트에 “출석 완료” 표시.n8n+2 -
https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.webhook/
-
https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googlesheets/
-
https://docs.n8n.io/hosting/configuration/configuration-examples/webhook-url/
-
https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googledocs/
-
https://docs.n8n.io/integrations/builtin/trigger-nodes/n8n-nodes-base.googlesheetstrigger/
-
https://www.gpters.org/nocode/post/create-chatbot-n8n-create-efWD8L8dCetwryc
No responses yet