← 노드 한 장 전체#43 · Compression

Compression

CSV 세 개, ZIP 하나로 묶고 다시 풀기

이 글은 이런 분께여러 파일을 ZIP 하나로 묶거나 받은 ZIP을 자동으로 풀고 싶은 분
Compression 영상 표지

1분 영상은 @workflow.hanjang 에 순서대로 공개돼요

JSON 받기

CSV 세 개를 ZIP 하나로 묶고, 다시 풀어서 내용까지 확인했어요.

직접 작성한 교육용 가상 집계입니다. 실제 회사 수치가 아니고 외부 계정이나 전송도 사용하지 않았어요.

먼저 결과부터

직접 작성한 가상 집계 CSV 3개(sales 67B·support 50B·ops 45B)를 Compression의 Compress → Zip으로 묶었습니다. 실제 ZIP은 449B, 생성 노드 5ms였어요. Decompress는 4ms였고 복원한 3개 파일 전체 내용을 Code로 대조해 모두 일치했습니다. 원본 합계 162B보다 ZIP이 큰 것은 작은 파일에 ZIP 부가 정보가 더해졌기 때문입니다. 압축하면 무조건 작아진다는 뜻은 아니에요. 실제 회사 수치가 아닌 샘플이며 암호화·전송 실습은 아닙니다. (실제 실행 #74823)
우리가 실제로 돌린 기록 · 실행 #74823 · 2026-10-30
Compression 실제 n8n 화면 1
우리가 실제로 돌린 n8n 화면 (실행 #74823, 2026-10-30)
Compression 실제 n8n 화면 2
우리가 실제로 돌린 n8n 화면 (실행 #74823, 2026-10-30)

따라 하기

실제로 실행한 워크플로우를 바탕으로 정리했어요. 계정·식별자는 공개용 값으로 치환했고, 그 밖의 차이는 아래 주의사항에 표시했어요. n8n 캔버스에서 +를 눌러 노드를 순서대로 추가하고 같은 값을 넣으면 돼요. 빨간 제목이 이번 편의 주인공 노드예요. 표 왼쪽은 n8n 편집기에 보이는 칸 이름, 오른쪽은 다운로드 JSON의 설정값이에요. 직접 입력하기 번거로우면 JSON을 받아 ⋯ → Import from File로 가져오세요.

Step 1. Manual Trigger 노드 추가이름: Run manually

설정 없이 그대로 추가해요.

Step 2. Code 노드 추가이름: Sample CSV files

JavaScript
// 直接 authored educational samples, not real company data
const files={"sales.csv":"sample,team,week,count\ntrue,alpha,2026-W44,12\ntrue,beta,2026-W44,9\n","support.csv":"sample,category,tickets\ntrue,howto,7\ntrue,error,3\n","ops.csv":"sample,task,count\ntrue,check,5\ntrue,backup,2\n"};const binary={};let i=0;for(const[name,text]of Object.entries(files)){binary[['sales','support','ops'][i++]]=await this.helpers.prepareBinaryData(Buffer.from(text,'utf8'),name,'text/csv');}return [{json:{sample:true,description:'교육용 가상 집계 CSV. 실제 회사 수치 아님',originalFiles:3,originalBytes:Object.values(files).reduce((s,t)=>s+Buffer.byteLength(t,'utf8'),0)},binary}];

Step 3. Compression 노드 추가이름: Create ZIP

OperationCompress
Input Binary Field(s)sales,support,ops
Output FormatZip
File Namesample-team-reports.zip
Put Output File in Fieldarchive

Step 4. Code 노드 추가이름: Measure ZIP

JavaScript
const item=$input.first();const buf=await this.helpers.getBinaryDataBuffer(0,'archive');return [{json:{...$('Sample CSV files').first().json,zipBytes:buf.length,zipBase64:buf.toString('base64')},binary:item.binary}];

Step 5. Compression 노드 추가이름: Extract ZIP

OperationDecompress
Input Binary Field(s)archive
Output Prefixfile_

Step 6. Code 노드 추가이름: Verify restored files

JavaScript
const expected={"sales.csv":"sample,team,week,count\ntrue,alpha,2026-W44,12\ntrue,beta,2026-W44,9\n","support.csv":"sample,category,tickets\ntrue,howto,7\ntrue,error,3\n","ops.csv":"sample,task,count\ntrue,check,5\ntrue,backup,2\n"};const input=$input.all();const checks=[];for(let i=0;i<input.length;i++){for(const[key,b]of Object.entries(input[i].binary||{})){const buf=await this.helpers.getBinaryDataBuffer(i,key);checks.push({fileName:b.fileName,bytes:buf.length,contentMatch:expected[b.fileName]===buf.toString('utf8')});}}const z=$('Measure ZIP').first().json;return [{json:{sample:true,originalFiles:3,extractedFiles:checks.length,allContentsMatch:checks.length===3&&checks.every(c=>c.contentMatch),originalBytes:z.originalBytes,zipBytes:z.zipBytes,checks}}];

가져와서 쓸 때 확인할 것

노드의 모든 옵션은 n8n 공식 문서에서 볼 수 있어요.