#노션 #Notion #옵시디언 #Obsidian #n8n #유튜브 #Youtube #크롤링 #자동화
![[miro_image_02.jpg]]
## 전체 워크플로우 이미지
![[miro_image_04.png]]
## 데이터 흐름 3단계
1. **수집 단계**
- 워크플로우 트리거 → FastAPI 댓글 수집 → 언어별 그룹 분류
2. **분석 단계**
- 데이터 통합 → AI 에이전트 분석 → 인사이트 생성
3. **저장 단계**
- **옵시디언:** 노트 생성 → 구글 드라이브 → 옵시디언 저장소
- **노션:** 노트 생성 → 블록 포맷팅 → 블록 콘텐츠
## Step 1: FastAPI 서버 설정
### 1-1. YouTube Video Extractor
![[miro_image_05.png]]
>[!info] YouTube Video Extractor는 파이썬 라이브러리를 기반으로 유튜브 자막, 댓글, 메타데이터를 추출하는 FastAPI 서버입니다. n8n에서 HTTP Request로도 간단히 호출할 수 있으며, 복잡한 크롤링 로직을 백엔드에서 처리하여 워크플로우 실행 속도와 안정성을 향상시킵니다.
>[!summary] 기능 설명
>- 깃허브 저장소
> - https://github.com/daniel8824-del/youtube-transcript-api
>- 주요 기능
> - YouTube 자막 텍스트 추출
> - YouTube 댓글 수집 및 언어 그룹 분류
> - YouTube 메타데이터 파싱
>- 기술 스택
> - 프레임워크: FastAPI
> - 크롤링: Yt-dlp, Youtube-transcript-api
> - 언어 감지: Langdetect
> - 배포: Docker (n8n 연동)
>- API 엔드포인트
> - POST /extract - 단일 영상 자막 추출
> - POST /transcript - 여러 영상 자막 추출
> - POST /subtitle-url - 한국어 자막 URL 반환
> - POST /comments - 단일 영상 댓글 수집
>- 코드 파일
> - [[유튜브 자막 댓글 수집 API 스크립트]]
### 1-2. GitHub 저장소 클론
- [Python 다운로드](https://www.python.org/downloads/)
- Python 3.11 이상 버전 다운로드
- 권장 버전 - [Python 3.12.9](https://www.python.org/downloads/release/python-3129)
- Windows: 64-bit installer 선택
- Mac: macOS installer 선택
- [Git 다운로드](https://git-scm.com/downloads)
- 운영체제에 맞는 설치 파일을 다운로드
- Windows - x64 Setup 선택
- 저장소 복제 및 실행
- Windows PowerShell 관리자 권한 실행
- ⬇️⬇️⬇️ 아래 명령어 순차적으로 입력
`
```PowerShell
# Python 터미널 빠른 설치 (선택사항)
winget install Python.Python.3.12
# Git 터미널 빠른 설치 (선택사항)
winget install Git.Git
# 저장소 복제
git clone https://github.com/daniel8824-del/youtube-transcript-api.git
# 디렉토리 이동
cd youtube-transcript-api
# Python 가상환경 생성
python -m venv venv
# 가상환경 활성화 (Windows)
venv\Scripts\activate
# pip 버전 업그레이드
python.exe -m pip install --upgrade pip
# 패키지 설치
pip install -r requirements.txt
# 서버 실행
python main.py
```
![[miro_image_08.png]]
> [!quote] 가상환경을 활성화하면 프로젝트마다 독립된 파이썬 패키지 환경을 만들어 버전 충돌을 방지합니다. VSCode, Cursor 등 에디터를 사용할 경우 Ctrl + Shift + P를 눌러 Python: Select Interpreter를 검색한 후, 가상환경을 지정해야 합니다.
### 1-3. Localhost API 테스트
- Uvicorn 서버 실행 상태 유지
- 웹브라우저 접속 - http://localhost:8000
- API 문서 확인 - http://localhost:8000/docs
- [크롬 웹 스토어](https://chromewebstore.google.com) - [JSON-handle](https://chromewebstore.google.com/detail/json-handle/iahnhfdhidomcpggpaimmmahffihkfnj?hl=ko&utm_source=ext_sidebar) - 크롬에 추가 - 확장 프로그램 추가
- 자막 추출 테스트 - http://localhost:8000/test/H5TAW-0X7eQ
- `https://www.youtube.com/watch?v={id}`
- 메타데이터 + 자막 텍스트 추출
- JSON 형식으로 응답 반환
- 댓글 수집 테스트 - http://localhost:8000/test-comments/H5TAW-0X7e
- `https://www.youtube.com/watch?v={id}`
- 댓글 100개 수집 + 7개 언어 그룹 자동 분류
- 언어별 통계 및 댓글 내용 확인
![[miro_image_09.png]]
![[miro_image_10.png]]
> [!warning] 자막 추출을 200~300회 이상 대량으로 반복하면 Youtube IP 차단 위험이 있으며, 프록시 우회도 완벽하지 않습니다. 본 강의에서는 차단 위험이 낮은 댓글 수집을 중심으로 진행합니다.
### 1-4. Docker 환경 구성
- Dockerfile
- FastAPI 서버를 Docker 컨테이너로 패키징하는 설정 파일
- docker-compose.yml
- 컨테이너를 8000번 포트로 실행
- n8n과 같은 네트워크(n8n-network)에 연결하여 내부 통신 가능
```YAML
version: '3.8'
services:
youtube-api:
build: .
container_name: youtube-api
ports:
- "8000:8000"
volumes:
- ./main.py:/app/main.py
environment:
- PYTHONUNBUFFERED=1
restart: unless-stopped
networks:
- youtube-net
networks:
youtube-net:
name: youtube-net
external: false
```
### 1-5. Docker n8n 연동
- 설치 디렉토리 이동 - `cd youtube-transcript-api`
- Docker 이미지 빌드 및 실행
- Windows PowerShell 관리자 권한 실행
- ⬇️⬇️⬇️ 아래 명령어 순차적으로 입력
- 자막 추출 테스트 - http://localhost:8000/test/H5TAW-0X7eQ
- 댓글 수집 테스트 - http://localhost:8000/test-comments/H5TAW-0X7e
- Docker 컨테이너 로그에서 테스트 결과 확인
```PowerShell
# Docker 이미지 빌드
docker build -t youtube-api .
# Docker 네트워크 생성
docker network create youtube-net
# YouTube API 컨테이너 실행
docker run -d --name youtube-api --network youtube-net -p 8000:8000 youtube-api
# n8n 컨테이너를 같은 네트워크에 연결
docker network connect youtube-net n8n
# 네트워크 연결 확인
docker network inspect youtube-net
## 코드 변경 후 재시작할 경우
docker build -t youtube-api .
docker rm -f youtube-api
docker run -d --name youtube-api --network youtube-net -p 8000:8000 youtube-api
```
![[miro_image_12.png]]
> [!example] n8n 워크플로우에서 데이터를 수집하려면, n8n이 FastAPI 서버와 통신할 수 있어야 합니다. 같은 Docker 네트워크에 연결하면 컨테이너끼리 이름으로 통신이 가능하며, 이후 n8n에서http://youtube-api:8000으로 API를 호출할 예정입니다.
## Step 2: YouTube 댓글 수집
### 2-1. Docker Filter (Deactivated)
- 노드 기능 - Filter
- 노드 이름 - Docker Filter
- 노드 설정
- Conditions - Add Condition
- `{{ $json.number }}` - (Number) is greater than or equal to - `1`
- AND
- `{{ $json.number }}`- (Number) is less than or equal to - `2`
- Convert types where required - 🟢활성화
>[!warning] 현재 비활성화된 테스트용 필터입니다. 특정 범위의 데이터만 처리할 때 사용합니다.
### 2-2. Docker Loop
- 노드 기능 - Loop Over Items (Split In Batches)
- 노드 이름 - Docker Loop
- 노드 설정
- Batch Size - 1
> [!done] 짧은 시간에 대량으로 요청하게 되면 YouTube에서 봇으로 인식하여 IP 차단될 수 있습니다. 한 개씩 순차 처리하여 자연스러운 접속 패턴을 유지합니다.
### 2-3. Docker Comments
- 노드 기능 - HTTP Request
- 노드 이름 - Docker Comments
- 노드 연결 - Docker Loop (loop) ▶️ Docker Comments
- 노드 설정
- Method - POST
- URL - `http://youtube-api:8000/comments`
- Authentication - None
- Send Query Parameters - 🔴비활성화
- Send Headers - 🟢활성화
- Header Parameters - Add Parameter
- Content-Type - `application/json`
- Send Body - 🟢활성화
- Body Content Type - JSON
- Specify Body - Using JSON
- JSON - ⬇️⬇️⬇️ 아래 코드 입력
- Options - Add Option - Batching
- Items per Batch - 1
- Batch Interval (ms) - 1000
- Options - Add Option - Response
- Include Response Headers and Status - 🔴비활성화
- Never Error - 🟢활성화
- Response Format - JSON
- Options - Add Option - Timeout
- Timeout - 300000
- 노드 세팅
- Always Output Data - 🟢활성화
```JSON
{
"video_url": "https://www.youtube.com/watch?v={{ $json.youtubeId }}",
"max_comments": 100
}
```
>[!info] 같은 Docker 네트워크에 연결된 컨테이너끼리는 컨테이너 이름으로 통신할 수 있습니다. localhost:8000는 내 컴퓨터(호스트 머신)에서 FastAPI 서버에 접근할 때, youtube-api:800는 n8n 컨테이너에서 youtube-api 컨테이너로 접근할 떄 사용합니다.
### 2-4. Docker Wait
- 노드 기능 - Wait
- 노드 이름 - Docker Wait
- 노드 연결 - Docker Wait ▶️ Docker Loop
- 노드 설정
- Resume - After Time Interval
- Wait Amount - 5.00
- Wait Unit - Seconds
- 노드 세팅
- Always Output Data - 🟢활성화
> [!summary] 댓글 수집이 완료된 후 5초 대기하여 YouTube 서버에 부담을 줄이고, 연속 요청으로 인한 봇 탐지를 방지합니다. 이후 Docker Loop로 돌아가 다음 영상을 처리합니다.
### 2-5. Comments Data
- 노드 기능 - Code - Code in JavaScript
- 노드 이름 - Comments Data
- 노드 연결 - Docker Loop (done) ▶️ Comments Data
- 노드 설정
- Mode - Run Once for All Items
- Language - JavaScript
- JavaScript - [[유튜브 댓글 분류 및 통계 분석 스크립트]]
> [!quote] 수집된 댓글을 7개 언어 그룹(Korean, Japanese, Chinese, ASEAN, Western, Latin, Others)으로 분류하고, 각 언어별 댓글 개수와 전체 대비 비율을 자동 계산합니다.
## Step 3: 노션 블록 콘텐츠 추가
### 3-1. Comments Block
- 노드 기능 - Code - Code in JavaScript
- 노드 이름 - Comments Block
- 노드 설정
- Mode - Run Once for All Items
- Language - JavaScript
- JavaScript - [[유튜브 댓글 데이터 노션 블록 스크립트]]
### 3-2. Notion Loop
- 노드 기능 - Loop Over Items (Split In Batches)
- 노드 이름 - Notion Loop
- 노드 설정
- Batch Size - 10
### 3-3. Notion Block
- 노드 기능 - HTTP Request
- 노드 이름 - Notion Block
- 노드 연결 - Notion Loop (loop) ▶️ Notion Block
- 노드 연결 - Notion Block ▶️ Notion Loop
- 참조 문서 - [노션 개발자 API 레퍼런스](https://developers.notion.com/reference/patch-block-children)
- 노드 설정
- Method - PATCH
- URL - `https://api.notion.com/v1/blocks/{{ $('When Executed by Another Workflow').item.json.pageId }}/children`
- Authentication - Generic Credential Type
- Generic Auth Type - Header Auth
- Header Auth - Create new credential
- 계정 이름 - Header Notion account
- Name - Authorization
- Value - `Bearer YOUR_NOTION_API_KEY`
- API Key - [프라이빗 API 통합 시크릿](https://www.notion.so/profile/integrations)
- Send Query Parameters - 🔴비활성화
- Send Headers - 🟢활성화
- Specify Headers - Using Fields Below
- Header Parameters - Add Parameter
- Notion-Version - `2025-09-03`
- Content-Type - `application/json`
- Send Body - 🟢활성화
- Body Content Type - JSON
- Specify Body - Using JSON
- JSON - `{{ $('Comments Block').item.json }}
> [!example] 기존 생성된 노션 페이지에 댓글 블록을 추가합니다. Comments Block의 JSON을 Notion API로 전송하여 콘텐츠를 완성합니다.
## Step 4: 데이터 변환 및 통합
### 4-1. Comments Transform
- 노드 기능 - Code - Code in JavaScript
- 노드 이름 - Comments Transform
- 노드 설정
- Mode - Run Once for All Items
- Language - JavaScript
- JavaScript - [[유튜브 댓글 데이터 추출 및 변환 스크립트]]
> [!info] 언어별 댓글을 텍스트 형식으로 변환합니다. 언어별 댓글 내용과 좋아요 수를 하나의 문자열로 결합하고, 통계를 별도 필드로 추출하여 AI 분석에 사용할 수 있는 평탄한 데이터 구조로 만듭니다.
### 4-2. Youtube Merge
- 노드 기능 - [[Merge]]
- 노드 이름 - Youtube Merge
- 노드 설정
- Mode - Combine
- Combine By - Position
- Number of Inputs - 2
- Input 1 - Comments Transform ▶️ Youtube Merge
- Input 2 - When Executed by Another Workflow ▶️ Youtube Merge
> [!done] 두 개의 데이터 소스를 위치 기준으로 병합합니다. Input 1의 댓글 데이터와 Input 2의 상위 워크플로우에서 가져온 데이터를 하나의 객체로 결합합니다.
### 4-3. Youtube Data
- 노드 기능 - Code - Code in JavaScript
- 노드 이름 - Youtube Data
- 노드 설정
- Mode - Run Once for All Items
- Language - JavaScript
- JavaScript - [[유튜브 데이터 통합 및 토큰 최적화 스크립트]]
> [!warning] 모든 영상의 자막과 댓글을 통합하고, 입력 토큰 한계(100만)를 초과하지 않도록 텍스트 정리 후 80만 토큰 목표에 맞춰 언어별 비율로 자동 분배합니다.
## Step 5: 글로벌 팬덤 분석 노트 생성
### 5-1. Zettlekasten Fandom Note
- 노드 기능 - AI Agent
- 노드 이름 - Zettlekasten Fandom Note
- 노드 설정
- Source for Prompt - Define below
- Prompt (User Message) - [[유튜브 분석 옵시디언 노트 유저 메시지]]
- Require Specific Output Format - 🟢활성화
- Options - Add Option
- System Message - [[Obsidian 유튜브 글로벌 팬덤 분석 프롬프트]]
- Chat Model - ⬇️⬇️⬇️ 5-2. Fandom Model 참조
- Tool - ⬇️⬇️⬇️ 5-3. Fandom Chart 참조
- Output Parser - ⬇️⬇️⬇️ 5-4. Fandom Parser 참조
>[!summary] AI 에이전트가 통합 데이터를 분석하여 Zettelkasten 방식의 구조화된 팬덤 문화 분석 노트를 자동 생성합니다.
### 5-2. Fandom Model
- 모델 설정 - OpenAI Chat Model
- 노드 이름 - Fandom Model
- 계정 연결 - Credential to connect with
- Create new credential
- API Key - [OpenAI 플랫폼 API Keys](https://platform.openai.com/settings/organization/api-keys)
- 노드 설정
- Model - From list - gpt-4.1
- Options - Add Option
- Maximum Number of Tokens - 32768
- Sampling Temperature - 0.2
- Timeout - 180000
- Top P - 1.0
> [!quote] GPT-4.1 파라미터 설정
>
|설정 항목|값|설명|
|---|---|---|
|Max Tokens|32768|약 25,000~30,000자 출력|
|Temperature|0.2|창의성 낮음, 사실 기반 분석 우선|
|Top P|1|확률 분포 전체 사용|
|Timeout|180000 ms|3분, 장문 생성 시간 확보|
### 5-3. Fandom Chart
- 툴 설정 - QuickChart Tool
- 노드 이름 - Fandom Chart
- 노드 설정
- Description - 언어권별 댓글 분포를 Bar Chart로 시각화합니다. Korean, Japanese, Chinese, ASEAN, Western, Latin, Others 7개 언어권의 댓글 수를 막대 그래프로 생성하며, 댓글 수가 많은 순으로 자동 정렬됩니다. 각 막대에는 구체적인 개수가 표시되고, 차트 제목에 총 댓글 수가 포함됩니다. 생성된 차트는 분석 보고서의 "언어권별 참여 패턴 및 반응 분석" 섹션 최상단에 삽입됩니다.
- Chart Type - Bar Chart
- Add Labels - Manually
- Labels - Add Label
- Korean
- Japanese
- Chinese
- ASEAN
- Western
- Latin
- Others
- Data - `{{ [$json.koreanCount, $json.japaneseCount, $json.chineseCount, $json.aseanCount, $json.westernCount, $json.latinCount, $json.othersCount] }}`
- Put Output In Field - data
- Dataset Options - Add Option
- Background Color - `#36A2EB`
### 5-4. Fandom Parser
- 파서 설정 - Structured Output Parser
- 노드 이름 - Fandom Parser
- 노드 설정
- Schema Type - Define using JSON Schema
- IInput Schema - ⬇️⬇️⬇️ 아래 코드 입력
- Auto-Fix Format - 🔴비활성화
```JSON
{
"type": "object",
"properties": {
"id": { "type": "string" },
"title": { "type": "string" },
"content": { "type": "string" },
"tags": {
"type": "array",
"items": { "type": "string" }
}
},
"required": ["id", "title", "content", "tags"]
}
```
### 5-5. Fandom Content
- 노드 기능 - Edit Fields (Set)
- 노드 이름 - Fandom Content
- 노드 설정
- Mode - Manual Mapping
- Fields to Set - Add Field
- markdown_file (String) - ⬇️⬇️⬇️ 아래 코드 입력
- Include Other Input Fields - 🔴비활성화
```Json
{{ $json.output.tags.map(t => `#${t}`).join(' ') }}

{{ $json.output.content }}
```
> [!example] 태그, 썸네일, 본문을 결합하여 최종 마크다운 파일을 완성합니다. 태그는 해시태그 형식으로 변환되어 문서 상단에 배치됩니다.
### 5-6. Fandom File
- 노드 기능 - Convert to File - Convert to text file
- 노드 이름 - Fandom File
- 노드 설정
- Operation - Convert to Text File
- Text Input Field - markdown_file
- Put Output File in Field - data
- Options - Add option
- File Name - `{{ $('Zettlekasten Fandom Note').item.json.output.title }}`
### 5-7. Fandom Upload
- 노드 기능 - Google Drive - Upload a file
- 노드 이름 - Fandom Upload
- 계정 연결 - Credential to connect with
- Create new credential
- Connect using - OAuth2
- Client ID & Client Secret - [[n8n과 Google 계정 연동하기]]
- 노드 설정
- Resource - File
- Operation - Upload
- Input Data Field Name - data
- File Name - `{{ $('Zettlekasten Fandom Note').item.json.output.title }}.md`
- Parent Drive - From list - My Drive
- Parent Folder - From list - 새 폴더
- 내 컴퓨터 - 새 폴더 생성
- 새 폴더와 구글 드라이브 동기화 - [[로컬 폴더와 Google Drive 연동하기]]
- 구글 드라이브와 옵시디언 Vault 동기화 - [[옵시디언 Vault와 Google Drive 연동하기]]
> [!info] 업로드된 Markdown 파일이 Google Drive를 통해 로컬 폴더로 동기화되며, 해당 폴더를 Obsidian Vault로 지정하면 실시간으로 노트를 확인할 수 있습니다.
## Step 6: 트렌드 예측 분석 노트 생성
### 6-1. Zettlekasten Trend Note
- 노드 기능 - AI Agent
- 노드 이름 - Zettlekasten Trend Note
- 노드 설정
- Source for Prompt - Define below
- Prompt (User Message) - [[유튜브 분석 옵시디언 노트 유저 메시지]]
- Require Specific Output Format - 🟢활성화
- Options - Add Option
- System Message - [[Obsidian 유튜브 트렌드 예측 분석 프롬프트]]
- Chat Model - ⬇️⬇️⬇️ 6-2. Trend Model 참조
- Tool - ⬇️⬇️⬇️ 6-3. Trend Research 참조
- Tool - ⬇️⬇️⬇️ 6-4. Think 참조
- Output Parser - ⬇️⬇️⬇️ 6-5. Trend Parser 참조
>[!summary] AI 에이전트가 통합 데이터를 분석하여 Zettelkasten 방식의 구조화된 트렌드 리서치 노트를 자동 생성합니다.
### 6-2. Trend Model
- 모델 설정 - OpenAI Chat Model
- 노드 이름 - Trend Model
- 계정 연결 - Credential to connect with
- Create new credential
- API Key - [OpenAI 플랫폼 API Keys](https://platform.openai.com/settings/organization/api-keys)
- 노드 설정
- Model - From list - gpt-4.1
- Options - Add Option
- Maximum Number of Tokens - 32768
- Sampling Temperature - 0.2
- Timeout - 180000
- Top P - 1.0
### 6-3. Trend Research
- 툴 설정 - Perplexity Tool
- 노드 이름 - Trend Research
- 계정 연결 - Credential to connect with
- Create new credential
- API Key - [Perplexity API 키](https://www.perplexity.ai/account/api/keys)
- Billing - [Perplexity API 청구](https://www.perplexity.ai/account/api/billing)
- 노드 설정
- Tool Description - Set Manually
- Description - Perplexity Deep Research Tool
- Operation - Message a Model
- Model - Sonar Deep Research
- Messages - Add Message
- Text - 🌟Let the model define this parameter
- Description - Perplexity Deep Research Tool을 사용하여 케이팝데몬헌터스를 조사하세요.
- Role - User
- Simplify Output - 🌟Let the model define this parameter
>[!quote] Perplexity Deep Research는 단순 검색이 아닌 실시간 출처 기반 심층 조사를 수행합니다. Let the model define this parameter 설정으로 에이전트가 분석 맥락에 따라 검색 쿼리와 출력 형식을 자율적으로 결정하여, 최적의 외부 데이터를 자동 탐색합니다.
### 6-4. Think
- 툴 설정 - Think Tool
- 노드 이름 - Think
- 노드 설정
- Think Tool Description
```Plain Text
Use the tool to think about something. It will not obtain new information or change the database, but just append the thought to the log. Use it when complex reasoning or some cache memory is needed.
```
>[!example] Think Tool은 AI 에이전트가 복잡한 작업을 수행할 때 중간 사고 과정을 명시적으로 기록하는 메타인지 도구입니다. Chain-of-Thought 방식으로 단계별 추론 과정을 남기며 작업합니다.
### 6-5. Trend Parser
- 파서 설정 - Structured Output Parser
- 노드 이름 - Trend Parser
- 노드 설정
- Schema Type - Define using JSON Schema
- IInput Schema - ⬇️⬇️⬇️ 아래 코드 입력
- Auto-Fix Format - 🔴비활성화
```JSON
{
"type": "object",
"properties": {
"id": { "type": "string" },
"title": { "type": "string" },
"content": { "type": "string" },
"tags": {
"type": "array",
"items": { "type": "string" }
}
},
"required": ["id", "title", "content", "tags"]
}
```
### 6-6. Trend Content
- 노드 기능 - Edit Fields (Set)
- 노드 이름 - Trend Content
- 노드 설정
- Mode - Manual Mapping
- Fields to Set - Add Field
- markdown_file (String) - ⬇️⬇️⬇️ 아래 코드 입력
- Include Other Input Fields - 🔴비활성화
```Json
{{ $json.output.tags.map(t => `#${t}`).join(' ') }}

{{ $json.output.content }}
```
### 6-7. Trend File
- 노드 기능 - Convert to File - Convert to text file
- 노드 이름 - Trend File
- 노드 설정
- Operation - Convert to Text File
- Text Input Field - markdown_file
- Put Output File in Field - data
- Options - Add option
- File Name - `{{ $('Zettlekasten Trend Note').item.json.output.title }}`
### 6-8. Trend Upload
- 노드 기능 - Google Drive - Upload a file
- 노드 이름 - Trend Upload
- 계정 연결 - Credential to connect with
- Create new credential
- Connect using - OAuth2
- Client ID & Client Secret - [[n8n과 Google 계정 연동하기]]
- 노드 설정
- Resource - File
- Operation - Upload
- Input Data Field Name - data
- File Name - `{{ $('Zettlekasten Trend Note').item.json.output.title }}.md`
- Parent Drive - From elist - My Drive
- Parent Folder - From list - 새 폴더
- 내 컴퓨터 - 새 폴더 생성
- 새 폴더와 구글 드라이브 동기화 - [[로컬 폴더와 Google Drive 연동하기]]
- 구글 드라이브와 옵시디언 Vault 동기화 - [[옵시디언 Vault와 Google Drive 연동하기]]
## Step 7: 글로벌 팬덤 분석 블록 생성
### 7-1. Zettlekasten Notion Block
- 노드 기능 - AI Agent
- 노드 이름 - Zettlekasten Notion Block
- 노드 설정
- Source for Prompt - Define below
- Prompt (User Message) - [[유튜브 분석 노션 블록 유저 메시지]]
- Require Specific Output Format - 🟢활성화
- Options - Add Option
- System Message - [[Notion 유튜브 글로벌 팬덤 분석 프롬프트]]
- Chat Model - ⬇️⬇️⬇️ 7-2. Notion Model 참조
- Output Parser - ⬇️⬇️⬇️ 7-3. Notion Parser 참조
### 7-2. Notion Model
- 노드 기능 - OpenAI Chat Model
- 노드 이름 - Notion Model
- 계정 연결 - Credential to connect with
- Create new credential
- API Key - [OpenAI 플랫폼 API Keys](https://platform.openai.com/settings/organization/api-keys)
- 노드 설정
- Model - From list - gpt-4.1
- Options - Add Option
- Maximum Number of Tokens - 32768
- Sampling Temperature - 0.2
- Timeout - 180000
- Top P - 1.0
### 7-3. Notion Parser
- 노드 기능 - Structured Output Parser
- 노드 이름 - Notion Parser
- 노드 설정
- Schema Type - Define using JSON Schema
- IInput Schema - ⬇️⬇️⬇️ 아래 코드 입력
- Auto-Fix Format - 🔴비활성화
```JSON
{
"type": "object",
"properties": {
"id": { "type": "string" },
"title": { "type": "string" },
"content": { "type": "string" },
"tags": {
"type": "array",
"items": { "type": "string" }
}
},
"required": ["id", "title", "content", "tags"]
}
```
> [!info] Obsidian 노트와의 차이점
>
|구분|Obsidian 노트|Notion 블록|
|---|---|---|
|헤딩 규칙|## 제목 사용|Heading 2 또는 Heading 3 사용|
|표 형식|들여쓰기 허용|들여쓰기 금지, 테이블 헤더 필수|
|마크다운 문법|느슨한 검증|모든 구문을 정확히 닫아야 함|
|콜아웃/인용|Obsidian 전용 형식|표준 마크다운 인용 블록|
|불렛 계층|제한 없음|최대 2계층까지만|
|포맷 반복|허용|섹션별 포맷이 연속되지 않도록 강제|
### 7-4. Block Format
- 노드 기능 - Code - Code in JavaScript
- 노드 이름 - Block Format
- 노드 설정
- Mode - Run Once for All Items
- Language - JavaScript
- JavaScript - [[마크다운 to Notion API 유튜브 블록 스크립트]]
> [!warning] Markdown 문법을 Notion 블록 타입으로 변환합니다. 제목, 리스트, 콜아웃, 테이블, 서식 등을 지원하며, 100개 블록 단위로 자동 분할하여 Notion API 제한을 준수합니다.
### 7-5. Block Update
- 노드 기능 - HTTP Request
- 노드 이름 - Block Update
- 참조 문서 - [노션 개발자 API 레퍼런스](https://developers.notion.com/reference/patch-block-children)
- 노드 설정
- Method - PATCH
- URL - `https://api.notion.com/v1/blocks/{{ $('Youtube Data').item.json.notionId }}/children`
- Authentication - Generic Credential Type
- Generic Auth Type - Header Auth
- Header Auth - Create new credential
- 계정 이름 - Header Notion account
- Name - Authorization
- Value - `Bearer YOUR_NOTION_API_KEY`
- API Key - [프라이빗 API 통합 시크릿](https://www.notion.so/profile/integrations)
- Send Query Parameters - 🔴비활성화
- Send Headers - 🟢활성화
- Specify Headers - Using Fields Below
- Header Parameters - Add Parameter
- Notion-Version - `2025-09-03`
- Content-Type - `application/json`
- Send Body - 🟢활성화
- Body Content Type - JSON
- Specify Body - Using JSON
- JSON - `{{$json}}`
- Options - Add Option - Timeout
- Timeout - 60000
>[!abstract] 워크플로우 최종 단계입니다. 블록 JSON을 Notion API로 전송하여 키워드 페이지에 글로벌 팬덤 분석 리포트를 추가합니다.
## 실습 파일
### 관련 파일 및 URL
- [n8n 구글 뉴스 데이터 수집 워크플로우](https://github.com/daniel8824-del/n8n-datawave/blob/02c9f31497fc43aa69e57684acca328c3904e779/Google%20News%20Scraper.json) - Import from File
- [트렌드 분석 키워드](https://romantic-recorder-6ef.notion.site/29a6162243bc802090bdf074a40c210b) - 복제 - 개인 페이지 추가
- [뉴스 크롤링 데이터](https://romantic-recorder-6ef.notion.site/29a6162243bc8089885ef45d0e1b32d0) - 복제 - 개인 페이지 추가
- 추가 프롬프트
- 콘텐츠 전략 수립 - [[Obsidian 유튜브 콘텐츠 전략 수립 프롬프트]]
- 비즈니스 인사이트 - [[Obsidian 유튜브 비즈니스 인사이트 프롬프트]]
- 분석 리포트 예시
- 글로벌 팬덤 분석 - [[K-POP 데몬 헌터스 글로벌 팬덤 문화·참여 패턴 완전 분석]]
- 콘텐츠 전략 수집 - [[K-POP 데몬 헌터스 유튜브 생태계 분석 문화적 파급력 총정리]]
- 비즈니스 인사이트 - [[케이팝데몬헌터스 타겟 오디언스 분석 및 브랜드 협업 전략]]
- 트렌드 예측 발굴 - [[K-콘텐츠 글로벌 신드롬의 해부 케이팝 데몬 헌터스, 팬덤, AI, 시장 확산의 모든 것]]
### 관련 노트
[[데이터 클래스 Chapter 1]] - [[데이터 클래스 Chapter 10-1]] - [[데이터 클래스 Chapter 11]] - [[데이터 클래스 Chapter 12]] - [[데이터 클래스 Chapter 2]] - [[데이터 클래스 Chapter 3]] - [[데이터 클래스 Chapter 4]] - [[데이터 클래스 Chapter 5]]
## 🧠 Connected Insights
> 📅 Last analyzed: 2026. 4. 24. 오후 3:36:47
> 💰 Analysis cost: $0.0185
### 🔗 Related Notes
- 🔼 [[데이터 클래스/데이터 클래스 Chapter 10-1.md]]
- extends: Chapter 10-2는 Chapter 10-1의 내용을 구체적으로 확장하며, 동일한 Notion 데이터 자동화 워크플로우의 다음 단계를 다룸. 태그, 기술 스택, 데이터 흐름 등에서 연속성을 보임.
- Confidence: █████ (90%)
- 🔗 [[데이터 클래스/데이터 클래스 Chapter 9-3.md]]
- related: Chapter 9-3은 Notion, Obsidian, n8n, 크롤링 등 유사한 자동화 및 데이터 처리 워크플로우를 다루며, 텍스트 마이닝과 NLP 등 분석 단계에서 개념적 연관성이 높음.
- Confidence: ████░ (80%)
- 🔗 [[데이터 클래스/데이터 클래스 Chapter 6.md]]
- related: Chapter 6은 크롤링, n8n, Obsidian 등 유사한 도구와 데이터 흐름을 다루며, 데이터 수집 및 자동화라는 상위 개념에서 연결됨.
- Confidence: ████░ (70%)
- 🔗 [[데이터 클래스/데이터 클래스 Chapter 8.md]]
- related: Chapter 8 역시 크롤링, Notion, n8n, 데이터 분석 등 유사한 데이터 파이프라인을 다루며, 뉴스 등 타 데이터 소스 활용의 사례로 확장 가능성이 있음.
- Confidence: ████░ (80%)
- ✅ [[자동화 스크립트/유튜브 데이터 노션 블록 스크립트.md]]
- supports: 유튜브 데이터의 노션 블록화 자동화 스크립트는 본 노트의 FastAPI 기반 데이터 추출 및 Notion 저장 단계의 구체적 구현 예시로 기능적 지원 관계에 있음.
- Confidence: ████░ (75%)
### 📚 Knowledge Gaps
- 🔴 **에러 처리 및 예외 상황 자동화**
- 대량 크롤링, API 호출 등에서 발생할 수 있는 에러 및 예외 상황에 대한 자동화된 대응 전략이 부족함. 이는 데이터 파이프라인의 신뢰성과 운영 효율성에 직접적 영향을 미침.
- Suggested resources: https://fastapi.tiangolo.com/tutorial/handling-errors/, https://docs.python.org/3/tutorial/errors.html
- 🟡 **데이터 프라이버시 및 보안**
- 유튜브 댓글, 자막 등 민감 데이터 수집 시 개인정보 보호, API 인증, 데이터 저장 보안 등 실무적 이슈가 충분히 다뤄지지 않음.
- Suggested resources: https://owasp.org/www-project-top-ten/, https://developers.google.com/youtube/v3/guides/auth/server-side-web-apps
- 🟡 **텍스트 마이닝 결과의 활용 및 후처리**
- AI 분석 및 인사이트 생성 이후, 결과를 어떻게 시각화하거나 추가적으로 활용할지에 대한 구체적 방법론이 부족함. 이는 데이터의 실질적 가치 창출에 중요함.
- Suggested resources: https://pandas.pydata.org/docs/, https://seaborn.pydata.org/
- 🔴 **Notion API의 한계 및 최적화 전략**
- 대량 데이터 입력, 속도 저하, API Rate Limit 등 Notion API 사용상의 한계와 이를 극복하기 위한 전략(큐잉, 비동기 처리 등)이 구체적으로 다뤄지지 않음.
- Suggested resources: https://developers.notion.com/reference/limits, https://github.com/jamalex/notion-py/issues
- 🟡 **유튜브 데이터의 추가적 활용(분석, 시각화 등)**
- 수집된 유튜브 데이터(댓글, 자막 등)를 텍스트 마이닝 외에 네트워크 분석, 시각화, 트렌드 분석 등으로 확장하는 방법이 미흡함.
- Suggested resources: https://networkx.org/, https://matplotlib.org/stable/gallery/index.html
### 💡 AI Insights
본 노트는 유튜브 데이터(댓글, 자막, 메타데이터)를 FastAPI 기반으로 수집하고, n8n 및 Notion/Obsidian과 연동하여 자동화된 데이터 파이프라인을 구축하는 실무적 워크플로우를 상세히 다룬다. 관련 노트들과 강하게 연결되어 있으며, 전체 데이터 자동화 체계 내에서 핵심적인 기술적 역할을 담당한다. 그러나 에러 처리, 보안, Notion API 한계, 데이터 후처리 및 확장적 활용 등 실전 운영 및 데이터 가치 극대화 측면에서 보완이 필요하다. 이를 통해 데이터 자동화 시스템의 신뢰성과 실효성을 한층 높일 수 있다.
## 🧠 Connected Insights
> 📅 Last analyzed: 2026. 4. 18. 오전 9:12:31
> 💰 Analysis cost: $0.0205
### 🔗 Related Notes
- 🔼 [[데이터 클래스/데이터 클래스 Chapter 10-1.md]]
- extends: Chapter 10-2는 Chapter 10-1의 내용을 구체적으로 확장하며, YouTube 데이터 수집 및 FastAPI 서버 구성 등 실무적 세부 절차를 상세히 다룸. 두 노트 모두 Notion, Obsidian, n8n, 자동화 등 동일한 워크플로우 내에서 연계됨.
- Confidence: █████ (90%)
- 🔗 [[데이터 클래스/데이터 클래스 Chapter 8.md]]
- related: Chapter 8은 뉴스 데이터, Chapter 10-2는 유튜브 데이터라는 차이가 있지만, n8n, 크롤링, Notion/Obsidian 연동 등 데이터 수집-분석-저장 자동화라는 동일한 개념적 프레임워크를 공유함.
- Confidence: ████░ (80%)
- 🔗 [[데이터 클래스/데이터 클래스 Chapter 6.md]]
- related: Chapter 6은 인스타그램 등 다양한 플랫폼 데이터의 크롤링 및 자동화 사례를 다루며, Chapter 10-2와 유사한 데이터 파이프라인 구조(수집-분석-저장)를 적용. 다만, 데이터 소스와 구체적 도구에 차이가 있음.
- Confidence: ████░ (70%)
- 🔗 [[데이터 클래스/데이터 클래스 Chapter 7.md]]
- related: Chapter 7은 앞선 크롤링 및 데이터 자동화 사례의 연장선에 있으며, Chapter 10-2와 마찬가지로 n8n, Notion, Obsidian 등 데이터 워크플로우 자동화에 초점을 맞춤.
- Confidence: ████░ (70%)
- 🔗 [[데이터 클래스/데이터 클래스 Chapter 9-2.md]]
- related: Chapter 9-2는 블로그 등 텍스트 데이터의 수집·분석·저장 자동화 과정을 다루며, Chapter 10-2와 유사한 데이터 흐름(수집-분석-저장) 및 자동화 도구(n8n, FastAPI 등)를 공유함.
- Confidence: ████░ (70%)
- 🔗 [[데이터 클래스/데이터 클래스 Chapter 9-3.md]]
- related: Chapter 9-3은 텍스트 데이터 자동화, Notion/Obsidian 연동 등 Chapter 10-2와 유사한 개념적·기술적 기반을 공유하며, 데이터 소스(블로그/유튜브)만 다름.
- Confidence: ████░ (80%)
### 📚 Knowledge Gaps
- 🔴 **에러 처리 및 예외 상황 자동화**
- 대량 크롤링, API 호출 등에서 발생 가능한 에러(예: IP 차단, 데이터 누락, 서버 다운 등)에 대한 자동화된 예외 처리 전략이 구체적으로 다루어지지 않음. 이는 데이터 파이프라인의 신뢰성 확보에 필수적임.
- Suggested resources: https://fastapi.tiangolo.com/tutorial/handling-errors/, https://docs.python.org/ko/3/tutorial/errors.html
- 🟡 **데이터 프라이버시 및 보안**
- 유튜브, Notion 등 외부 서비스와의 연동에서 개인정보 및 민감 데이터의 보호, API 키 관리, 인증 등 보안 이슈가 언급되나 구체적 가이드가 부족함. 실무 적용 시 법적·윤리적 리스크가 있음.
- Suggested resources: https://owasp.org/www-project-api-security/, https://developers.google.com/youtube/v3/guides/auth/server-side-web-apps
- 🟡 **텍스트 마이닝 결과의 활용 및 후처리**
- 수집·분석된 데이터(예: 유튜브 댓글, 자막 등)의 후처리, 시각화, 인사이트 도출, Notion/Obsidian 내 활용 방안이 체계적으로 정리되어 있지 않음. 데이터의 실질적 가치 창출에 중요함.
- Suggested resources: https://pandas.pydata.org/docs/, https://matplotlib.org/stable/gallery/index.html
- 🔴 **Notion API의 한계 및 최적화 전략**
- 대량 데이터 입력 시 Notion API의 속도, 블록 제한, 동기화 지연 등 한계와 이를 극복하기 위한 최적화 전략(예: 비동기 처리, 배치 입력 등)이 구체적으로 다뤄지지 않음.
- Suggested resources: https://developers.notion.com/docs/limits, https://github.com/jamalex/notion-py/issues/318
- 🟡 **유튜브 데이터의 추가적 활용(분석, 시각화 등)**
- 유튜브 댓글, 자막 등 수집된 데이터의 심층 분석(감성분석, 키워드 추출 등) 및 시각화, 리포트 자동화 등 실질적 활용 사례가 부족함.
- Suggested resources: https://github.com/philipperemy/youtube-comment-downloader, https://seaborn.pydata.org/
### 💡 AI Insights
‘데이터 클래스 Chapter 10-2’ 노트는 유튜브 데이터를 FastAPI 기반으로 크롤링·분석·저장하는 자동화 워크플로우의 실무적 구현에 초점을 맞추고 있습니다. 관련 노트들과 개념적·기술적 연관성이 매우 높으며, 전체 데이터 파이프라인(수집-분석-저장)의 구조와 자동화 도구 활용법이 체계적으로 연결되어 있습니다. 그러나 에러 처리, 보안, Notion API 한계, 데이터 후처리 및 실질적 활용 등 실무 적용에 필수적인 심화 주제에 대한 구체적 논의가 부족하여, 향후 이 부분을 보완하면 지식 체계의 완성도가 크게 향상될 것입니다.