← 노드 한 장 전체#60 · Default Data Loader
Default Data Loader
CSV 한 파일에서 본문과 출처까지 Document로 읽기
이 글은 이런 분께파일 하나가 어떻게 본문과 출처 정보를 가진 문서 객체로 읽히는지 알고 싶은 분

1분 영상은 @workflow.hanjang 에 순서대로 공개돼요
Document 객체는 본문(pageContent)과 출처 등의 정보(metadata)를 함께 담습니다. 파일 자체와는 다른 개념이에요.
직접 쓴 교육용 CSV 파일 하나를 Default Data Loader로 읽어 봤어요. 실제 회사 자료나 고객 정보가 아닙니다. 헤더 1행과 서로 다른 데이터 3행으로 구성했습니다.
먼저 결과부터
Document는 본문(pageContent)과 출처 등의 정보(metadata)를 함께 가진 객체입니다. 직접 쓴 CSV 1파일(헤더 1행·데이터 3행)을 Binary/CSV, CSV Column=text로 읽었고 실제 로더 문서 3개·저장 청크 3개가 나왔습니다. 세 pageContent 전체가 원본 행과 일치하고 서로 달라 첫 문서 복제가 아님을 확인했어요. sampleFile 메타데이터는 직접 추가한 표시이며 metadata.line을 CSV 물리 행 번호로 단정하면 안 됩니다. Loader는 문서를 읽고 Embeddings는 숫자 표현을 만들며 부모 저장소가 저장을 연결합니다. 임베딩 노드 1회·채팅 모델 0회, 로더 7ms였습니다. 실제 회사 자료가 아닌 샘플이고, 다른 형식·분할 설정에서도 같은 개수가 나온다는 보장은 아닙니다. (실제 실행 #74878)
우리가 실제로 돌린 기록 · 실행 #74878 · 2026-10-30
우리가 실제로 돌린 기록 · 실행 #74878 · 2026-10-30


따라 하기
실제로 실행한 워크플로우를 바탕으로 정리했어요. 계정·식별자는 공개용 값으로 치환했고, 그 밖의 차이는 아래 주의사항에 표시했어요. n8n 캔버스에서 +를 눌러 노드를 순서대로 추가하고 같은 값을 넣으면 돼요. 빨간 제목이 이번 편의 주인공 노드예요. 표 왼쪽은 n8n 편집기에 보이는 칸 이름, 오른쪽은 다운로드 JSON의 설정값이에요. 직접 입력하기 번거로우면 JSON을 받아 ⋯ → Import from File로 가져오세요.
Step 1. Manual Trigger 노드 추가이름: Run manually
설정 없이 그대로 추가해요.
Step 2. Code 노드 추가이름: Prepare one sample CSV
| JavaScript | // Directly authored educational samples; no actual company/customer data
const csv="sample_id,text\nR1,교육용 샘플입니다. 회의실은 사용 뒤 조명을 끕니다.\nR2,교육용 샘플입니다. 공용 태블릿은 반납 전 화면을 닦습니다.\nR3,교육용 샘플입니다. 인쇄물은 분리수거함에 넣습니다.\n";const data=await this.helpers.prepareBinaryData(Buffer.from(csv,"utf8"),"sample-loader.csv","text/csv");return [{json:{sample:true,fileCount:1,dataRows:3,headerRows:1},binary:{data}}]; |
Step 3. Simple Vector Store 노드 추가이름: Insert only loader test documents
| Operation Mode | Insert Documents |
| Memory Key | TEST_LOADER_STORE |
| Clear Store | 꺼짐 |
Step 4. Default Data Loader 노드 추가이름: Default Data Loader
| Type of Data | Binary |
| Mode | Load Specific Data |
| Input Data Field Name | data |
| Data Format | CSV |
| Text Splitting | Simple |
| Options › CSV Separator | , |
| Options › CSV Column | text |
| Fields to Set 1 › Name | sampleFile |
| Fields to Set 1 › Value | sample-loader.csv |
| Fields to Set 2 › Name | sample |
| Fields to Set 2 › Value | true |
Step 5. Embeddings OpenAI 노드 추가이름: Embeddings OpenAI
| Model | text-embedding-3-small |
Step 6. Code 노드 추가이름: Verify documents against CSV rows
| JavaScript | const expected=["교육용 샘플입니다. 회의실은 사용 뒤 조명을 끕니다.","교육용 샘플입니다. 공용 태블릿은 반납 전 화면을 닦습니다.","교육용 샘플입니다. 인쇄물은 분리수거함에 넣습니다."];const docs=$input.all().map(i=>i.json);return [{json:{sample:true,sourceFiles:1,headerRows:1,sourceDataRows:3,registeredDocuments:docs.length,uniquePageContents:new Set(docs.map(d=>d.pageContent)).size,allRowsPresent:expected.every(t=>docs.some(d=>d.pageContent===t)),allContentMatches:docs.every(d=>expected.includes(d.pageContent)),allHaveMetadata:docs.every(d=>d.metadata&&Object.keys(d.metadata).length>0),documents:docs}}]; |
가져와서 쓸 때 확인할 것
- 파일 수·Document 수·청크 수를 같은 것으로 세지 마세요. 이번 CSV는 실제 1파일·로더 문서3·저장 청크3으로 측정했습니다.
- CSV Column=text를 선택해 그 열만 본문으로 읽었습니다. 다른 형식은 실행하지 않았으므로 같은 결과를 보장하지 않습니다.
- 본문 전체와 metadata.line을 원본 데이터 행에 대조해 서로 다른3개임을 검증했습니다. metadata.line을 헤더 포함 실제 파일 행 번호로 단정하지 마세요.
- sampleFile은 Metadata 옵션에 직접 넣은 표시이며 자동 감지된 실제 경로가 아닙니다.
- Loader가 임베딩을 만드는 것은 아닙니다. 별도 Embeddings 노드를 사용했고 채팅 모델은 호출하지 않았습니다.
- 공개 TEST_LOADER_STORE는 본인 새 고유 키로 바꾸고 본인 credential을 연결하세요. 메모리 저장소는 영구적이지 않고 다른 인스턴스 사용자가 접근할 수 있습니다.
- YOUR_… 표시를 내 값으로 바꾸고, 계정이 필요한 서비스 노드만 자격 증명을 연결하세요. 그런 칸이나 노드가 없는 예제는 추가 계정 없이 실행할 수 있어요.
노드의 모든 옵션은 n8n 공식 문서에서 볼 수 있어요.