현대 웹 애플리케이션에서 파일 업로드는 매우 일반적인 기능입니다. 사용자는 종종 문서, 이미지, 비디오와 같은 파일을 서버에 업로드해야 합니다. Express.js는 Node.js 기반의 웹 애플리케이션 프레임워크로, 이러한 작업을 구현하는 데 적합한 도구입니다. 이번 강좌에서는 Express.js를 통해 업로드한 파일의 메타데이터를 처리하는 방법을 심도 있게 설명하겠습니다.
1. Express.js 소개
Express.js는 간결하고 유연한 Node.js 웹 애플리케이션 프레임워크로, 서버 사이드 애플리케이션 구축을 위해 필요한 기본 기능을 제공합니다. RESTful API를 쉽게 구현할 수 있는 기능과 미들웨어 기반의 아키텍처로 인해 많은 개발자들이 애용하고 있습니다.
2. 필요한 패키지 설치하기
파일 업로드 기능을 구현하기 위해 필요한 패키지를 설치하겠습니다. 가장 인기 있는 파일 업로드 Middleware인 multer
를 사용하겠습니다. multer는 multipart/form-data를 처리하여, 파일을 쉽게 업로드할 수 있도록 도와줍니다.
npm install express multer
3. 기본적인 Express 서버 설정
기본적인 Express 서버를 설정하겠습니다. 다음 코드를 사용하여 app.js
라는 파일을 생성하고, Express 서버를 설정합니다.
const express = require('express');
const multer = require('multer');
const app = express();
const port = 3000;
// multer 설정
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, 'uploads/');
},
filename: function (req, file, cb) {
cb(null, Date.now() + '-' + file.originalname);
}
});
const upload = multer({ storage: storage });
// 기본 라우트
app.get('/', (req, res) => {
res.send('Hello, Express!');
});
// 파일 업로드 라우트
app.post('/upload', upload.single('file'), (req, res) => {
if (!req.file) {
return res.status(400).send('파일이 업로드되지 않았습니다.');
}
res.send({
message: '파일이 성공적으로 업로드되었습니다.',
file: req.file,
});
});
// 서버 시작
app.listen(port, () => {
console.log(`서버가 http://localhost:${port}에서 실행 중입니다.`);
});
4. 파일 업로드 라우트 설명
위의 코드는 파일 업로드를 위한 라우트를 설정합니다. upload.single('file')
은 클라이언트로부터 file
이라는 이름의 파일을 업로드 받을 것을 기대하며, 업로드된 파일의 정보를 req.file
에서 사용할 수 있습니다.업로드된 파일의 메타데이터는 req.file
객체에 포함됩니다. 이 객체에는 파일의 이름, 경로, 크기와 같은 정보가 포함되어 있습니다.
4.1. 메타데이터 처리
업로드한 파일에 대한 메타데이터를 처리하는 방법에 대해 더 깊이 살펴보겠습니다. 다음 코드를 통해 파일의 메타데이터를 JSON 형식으로 반환하도록 수정할 수 있습니다.
app.post('/upload', upload.single('file'), (req, res) => {
if (!req.file) {
return res.status(400).send('파일이 업로드되지 않았습니다.');
}
const metadata = {
originalName: req.file.originalname,
mimeType: req.file.mimetype,
size: req.file.size,
uploadDate: new Date(req.file.uploadDate || Date.now()),
path: req.file.path,
};
res.send({
message: '파일이 성공적으로 업로드되었습니다.',
metadata: metadata,
});
});
5. 클라이언트 측 파일 업로드 구현
이제 클라이언트 측에서 파일을 업로드하는 HTML 양식을 구현하겠습니다. 다음 코드를 사용하여 index.html
파일을 생성합니다.
파일 업로드
파일 업로드
6. 업로드한 파일의 메타데이터 구조
위 코드에서 업로드된 파일의 메타데이터는 다음과 같은 구조를 가집니다:
{
message: "파일이 성공적으로 업로드되었습니다.",
metadata: {
originalName: "example.png",
mimeType: "image/png",
size: 102456,
uploadDate: "2023-01-01T00:00:00.000Z",
path: "uploads/1234567890-example.png"
}
}
7. 에러 핸들링
파일 업로드 시 다양한 에러 상황이 발생할 수 있습니다. 예를 들어 파일 크기가 너무 크거나 허용되지 않는 파일 형식이 업로드되는 경우입니다. 이를 처리하기 위해 multer의 설정에서 제한 조건을 추가할 수 있습니다.
// 파일 크기 제한 (5MB 이하)
const upload = multer({
storage: storage,
limits: { fileSize: 5 * 1024 * 1024 },
fileFilter: (req, file, cb) => {
const fileTypes = /jpeg|jpg|png|gif/;
const extname = fileTypes.test(file.mimetype);
const mimetype = fileTypes.test(file.originalname.split('.').pop().toLowerCase());
if (extname && mimetype) {
return cb(null, true);
}
cb(new Error('허용되지 않는 파일 형식입니다.'));
}
});
8. 실전 배포 및 최적화
이제 파일 업로드 기능이 완성되었습니다. 마지막 단계로는 이 기능을 실제 프로덕션 환경에 배포하고 최적화하는 것입니다. 이 과정에서는 다음과 같은 사항을 고려해야 합니다:
- 파일 저장소: 클라우드 저장소 (예: AWS S3)를 사용할지, 로컬 파일 시스템에 저장할지를 결정합니다.
- 보안: 업로드되는 파일의 유효성을 검사하여 악성 코드가 포함되지 않도록 합니다.
- 성능: 여러 사용자가 동시에 업로드할 수 있도록 성능을 최적화합니다.
9. 결론
이번 강좌에서는 Express.js를 사용하여 파일 업로드 기능을 구현하고 업로드된 파일의 메타데이터를 처리하는 방법에 대해 설명했습니다. Express.js와 multer를 활용하면 간단하면서도 강력한 파일 업로드 기능을 구현할 수 있습니다. 완성된 애플리케이션을 바탕으로 추가적인 기능들을 고려하여 확장해보세요.