소개
이전 사례글이었던 "수집과 작성까지만 하면 100점, 복습을 통한 진정한 내재화까지 하면 100억!!" 을
n8n을 이용해서 확장해 보고자 했습니다.
https://www.gpters.org/wealth/post/100-points-you-collect-p4ZDigs1uIuNF7j
사전 설정
옵시디언 및 구글드라이드 연동
옵시디언 대상 Volt 선정
옵시디언 md파일에 metadata(property) 설정
텔레그램 설치 및 채널/봇 등록
Googel Cloud OAuth 설정 (Google Drive API, Google Sheet API)
OpenAI API Credential 설정 완료
Google Drive 데스크톱 클라이언트로 Obsidian Vault 동기화
시나리오
n8n에서 매일 스케쥴러가 돌면서 지정된 옵시디어언 볼트 내 복습할 문서들을 찾아서 사용자의 텔레그램에 전송
사용자는 텔레그램을 통해 복습할 문서들 중 1개 선택
n8n에서 사용자의 선택을 수신받아서, 해당 문서에 대한 문제 제출하여 사용자 텔레그램에 전송
사용자는 답안을 reply형태로 작성해서 제출
n8n에서 사용자의 답안을 받아서, 원문과 문제랑 함께 비교해서 채점, 옵시디언 문서 메타 데이터 업데이트, 결과 전송
주요 내용
기본 흐름은 LLM에게 MVP수준으로 정리해 달라고 한 후 진행
막힐 때마다 LLM 들에게 물어봐가면서 수정함
가장 어려웠던 점.
n8n webhook이 가끔 동작하지 않음.(cloudflared 문제?)
노드 참조 시 item
```1. 현재 노드 내부 :
item이 보임-
item자동 바인딩됨 → 바로 접근 가능- {{$json.data.content}}
- {{$item.json.data.content}}
2. 다른 노드 참조 시 (`$('노드명')`)
-
item없음, 대신items배열 존재- 접근하려면 메서드 사용 필요
- {{ $('노드명').first().json.data.content }}
- {{ $('노드명').last().json.data.content }}
- {{ $('노드명').all()[0].json.data.content }}
- {{ $('Get Content Again').items[0].json.data.content }} // 첫 번째 아이템
- {{ $('Get Content Again').items[1].json.data.content }} // 두 번째 아이템
- {{ $('Get Content Again').items.map(i => i.json.data.content) }} // 모든 content 배열
```
데이터 문제 : json 안의 특수문자, 줄바꿈 표시 ("\n")
```
1. JSON에 들어가면 안 되는 문자들제어문자(ASCII 0~31번)
예:
\u0000(NULL),\u0001,\u0002…\u001F줄바꿈(
\n), 탭(\t), 캐리지리턴(\r)은 JSON에서는\n,\t,\r처럼 이스케이프 처리해야 함.
역슬래시(
\) → 반드시 이스케이프\\필요쌍따옴표(
") → 반드시 이스케이프\"필요잘못된 유니코드 시퀀스
예: 깨진 이모지, surrogate pair 불완전한 경우
2. n8n에서 자주 발생하는 문제
이메일/웹스크래핑 데이터 → 숨은 제어문자(
\u0008,\u000C등) 포함됨개행·탭이 원문에 그대로 들어감 → JSON 파싱 오류 발생
3. 제거 / 정리 방법
🔹 Function 노드에서 JS로 처리
// 모든 제어문자 제거 (ASCII 0~31) const clean = $json.content.replace(/[\u0000-\u001F]+/g, ""); // 필요시 쌍따옴표, 역슬래시 이스케이프 const escaped = clean.replace(/\\/g, "\\\\").replace(/"/g, '\\"'); return [{ json: { content: escaped } }];🔹 Expression에서 간단 처리
{{ $json.content.replace(/[\u0000-\u001F]+/g, "") }}
```telegram으로 전송 시 문자열 마지막 글자가 _ 가 잘리는 현상이 있었음.
옵시디언 노트 - reviewable 체 크한 문서만 복습 대상. 복습 끝나면 review_count, next_review_date를 업데이트 해줌.
Google Spread Sheet
Google Apps Script
- 오늘 복습할 노트 찾기
- 파일 내용 조회
- 노트 메타데이터 업데이트
앱배포
배포 클릭 -> 새배포
유형 선택 : "웹 앱" 선택
잘 배포되면, 배포 ID 및 URL 복사 하는 화면이 나옴.
n8n
복습할 글 찾기 workflow
- 테스트 목적으로 manual trigger 사용 --> schedule trigger로 바꿔야 함.
문제 내기/풀기 workflow
telegram 과의 대화창
느낀점
자동화에 대한 선입견이 완전히 깨짐 --> 자동화 결코 쉽지 않다!!
n8n에 대한 이해, 연동 대상 Tool에 대한 이해(telegram)
디버깅이 쉽지 않다.
테스트가 쉽지 않다.
눈으로만 본 워크플로우는 내 것이 아니다. 주도적으로 내게 필요한 걸 많이 만들어봐야 실력 이 쌓인다.
제대로 만들려면 순방향 만들기 시간의 몇 배는 걸릴 수도...ㅠㅠ
최고의 복습 방법
학습 시점이 제일 중요 : 배워서 남주자!!
옵시디언에 기록할 때 옵시디언 단축키 등을 이용해서 잘 정리하자!!
Next ToDo
옵시디언에 대한 웹서버용 Google Apps Script 를 로컬에 웹서버로 구축(프로그래밍)
이번 시나리오도 연습용이었으니, 좀 더 현실적인 시나리오.
복습 주기에 대한 고도화