N8N 눈으로만 해보다가 손으로 직접 해 보기(feat. obsidian , telegram)..넘 어렵네요ㅠㅠ

소개

이전 사례글이었던 "수집과 작성까지만 하면 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 문서의 Ossidian 검토 설정

Google Docs Korean 검토 설정

Google Apps Script

- 오늘 복습할 노트 찾기
- 파일 내용 조회
- 노트 메타데이터 업데이트

앱배포

앱 스크립트 설정 페이지의 스크린 샷

  • 배포 클릭 -> 새배포

  • 유형 선택 : "웹 앱" 선택

한국어 앱의 스크린 샷
  • 잘 배포되면, 배포 ID 및 URL 복사 하는 화면이 나옴.

    한국어를 가진 한국 웹 사이트 스크린 샷

n8n

복습할 글 찾기 workflow

전보 생성 과정을 보여주는 다이어그램

- 테스트 목적으로 manual trigger 사용 --> schedule trigger로 바꿔야 함.

문제 내기/풀기 workflow

기계 학습 시스템의 프로세스를 보여주는 다이어그램

telegram 과의 대화창

한국어 문자 메시지의 스크린 샷

느낀점

  • 자동화에 대한 선입견이 완전히 깨짐 --> 자동화 결코 쉽지 않다!!

    • n8n에 대한 이해, 연동 대상 Tool에 대한 이해(telegram)

    • 디버깅이 쉽지 않다.

    • 테스트가 쉽지 않다.

  • 눈으로만 본 워크플로우는 내 것이 아니다. 주도적으로 내게 필요한 걸 많이 만들어봐야 실력이 쌓인다.

  • 제대로 만들려면 순방향 만들기 시간의 몇 배는 걸릴 수도...ㅠㅠ

  • 최고의 복습 방법

    • 학습 시점이 제일 중요 : 배워서 남주자!!

    • 옵시디언에 기록할 때 옵시디언 단축키 등을 이용해서 잘 정리하자!!

Next ToDo

  • 옵시디언에 대한 웹서버용 Google Apps Script 를 로컬에 웹서버로 구축(프로그래밍)

  • 이번 시나리오도 연습용이었으니, 좀 더 현실적인 시나리오.

  • 복습 주기에 대한 고도화

4개의 답글

뉴스레터 무료 구독