텍스트나 JSON과 달리 이미지, 영상 같은 미디어 파일(multipart/form-data)은 크기가 커서 잘게 쪼개져서 전송됩니다. 일반적인 express.json()으로는 이를 파싱할 수 없으며, Multer라는 전용 미들웨어가 조각난 파일을 하나로 합쳐 하드디스크나 클라우드에 안전하게 저장해 줍니다.
💡 핵심 비유: 택배 분류 센터 (Multer)
클라이언트가 10GB짜리 영상을 한 번에 던지면 서버 메모리가 터집니다. 그래서 수천 개의 작은 조각(퍼즐)으로 쪼개서 보냅니다. Multer는 이 퍼즐 조각들이 도착하는 족족 조립하여 하드디스크에 "완성된 파일"로 저장해주는 컨베이어 벨트 역할을 합니다.
📦 Multipart/form-data 데이터 구조
💾 Multer 스토리지 옵션
옵션
특징
사용처
DiskStorage
서버의 하드디스크(예: uploads/)에 물리적인 파일로 즉시 저장함
일반적인 로컬 서버 개발, 소규모 프로젝트
MemoryStorage
파일을 디스크에 쓰지 않고 RAM(메모리)에 Buffer 객체로 들고 있음
곧바로 AWS S3 등 클라우드로 토스해야 할 때
Multer 파일 업로드 시뮬레이션
클라이언트가 폼 데이터로 전송한 큰 파일을 서버의 Multer 미들웨어가 어떻게 받아 디스크에 저장하는지 확인해 보세요.
server.js (Multer 적용)
const express = require('express');
const multer = require('multer');
const app = express();
// 1. 하드디스크(Disk) 저장소 엔진 설정
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, 'uploads/'); // 저장될 폴더 경로
},
filename: function (req, file, cb) {
// 파일명이 겹치지 않도록 현재 시간 추가
const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
cb(null, file.fieldname + '-' + uniqueSuffix + '-' + file.originalname);
}
});
// 미들웨어 생성
const upload = multer({ storage: storage });
// 2. 단일 파일 업로드 라우터 ('avatar'라는 이름의 폼 필드 대기)
app.post('/profile', upload.single('avatar'), (req, res) => {
// 💥 Multer가 파일 수신을 완료하면 req.file 객체를 만들어 줍니다!
if (!req.file) return res.status(400).send('업로드 실패');
res.json({
message: '업로드 성공!',
fileInfo: {
original: req.file.originalname,
savedPath: req.file.path,
size: req.file.size
}
});
});