파일 업로드를 구현 중 다양한 multipart/form-data 형태를 처리하는 다양한 노드 패키지가 있음을 알게 되었고
각각의 구현된 목적과 특징을 알아보기 위해 이런 저런 서칭을 해보았다.
그러다가 한 글을 발견하여 내용을 정리해보았다.
https://bytearcher.com/articles/formidable-vs-busboy-vs-multer-vs-multiparty/
나같은 경우는 노드를 이용하여 해당 기능을 개발하고 있고 (Express)
대표적으로 Formidable, Busboy, Multer, Multiparty 가 있는 듯 하여 이들을 비교하게 되었다.
개인적으로는 Multer밖에 몰랐는데 이번에 여러가지를 접하게 되었음...
일단 시작하기 전에 결정해야 할 점들이 있다
1. Express가 필요한지
2. 중간 파일을 저장해도 되는지, 아니면 Stream(하나의 청크 단위로 쪼개서 처리)에 담아서 처리할 것인지
3. 중간 파일을 저장할 것이라면 인메모리방식을 선택할 것인지, 하드디스크에 저장할 것인지.
Formidable
가장 긴 기간동안 사용된 패키지. 1.0 버전은 2011년에 나왔다. 그리고 가장 많은 위클리 다운로드 수를 기록하고 있다.
Express에서만 사용되는 것이 아니고 일시적인 하드디스크의 공간에 파일을 저장한다.
Busboy
이벤트 기반/ 스트림 파서
Express에만 국한되어 사용되고 있지 않고, 중간 파일을 저장하는 것 대신에 입력되는 파일을 스트림으로 제공한다.
Multer
2015년에 나온 Express 미들웨어, 중간 파일을 인 메모리 방식이나 하드디스크에 저장한다.
req.files에 들어오는 객체를 사용한다.
세밀하게 컨트롤 할 수 있고 업로드 되는 파일의 수를 제한할 수도 있다.
내부적으로 버스보이를 사용하고 있다.
Multiparty
formidable을 쉽게 사용할 수 있게 감싼 것이다.
파일을 스트림 단위로 읽을 수 있는 기능도 제공한다.
문서에 의하면 버스보이를 더 나은 대안책으로 추천하고 있음.
작은 용량을 원한다면 Formidable or Multer
중간 파일을 저장해도 될 때가 있다.
프로토타입을 작성하거나, 적은 어드민 유저가 사용한다거나.
이런 상황에선 서버가 잠제적으로 메모리 누수나 하드디스크가 꽉 차서 서버가 잠재적으로 중간되는 것을 신경쓰지 않아도 된다고 한다.
Express가 필요한지, 파일이 메모리를 이용해도 된다면 이 두 대안책을 사용할 수 있다.
Express가 없이는 Formidable
Express외부에서 파일 업로드 처리시에는 Formaidable or Multiparty를 사용할 수 있다.
하지만 Multiparty는 Busboy의 사용을 권장하고 있는 아이러니..
어쩄든 Formidable이 커뮤니티도 7배나 커서 도움 받기도 좋다고 한다.
하지만 이 경우 파일을 메모리에 저장하는 옵션이 없고 디스크의 임시파일에만 저장하는 옵션이 있다.
Express + In memory 로는 Multer
해당 조건을 원한다면 여러 대안책이 많지만 Multer가 제일 좋은 대안책인 듯하다
Express + 하드디스크에 임시 저장을 원한다면 Multer or Formidable
디스크의 임시 디렉토리에 파일을 저장하려면 Multer와 Formidable 두 개 다 사용이 가능하다.
좀 더 세밀한 제어를 원한다면 Multer가 좋다.
production level의 대용량을 컨트롤 해야 한다면 Busboy
대용량을 처리해야 한다면 Node.js의 서버에 중간 파일을 저장하지 않는 것이 가장 좋고
받자마자 분리하여 파일을 서버로 저장하는 것이 좋다.
(파일 서버는 AWS S3, 혹은 BLOB 저장을 지원하는 클라우드 스토리지 서비스 같은 것들)
버스보이나 멀파티 다 괜찮지만 Multiparty가 버스보이를 추천하니 버스보이를 이용하자.
일단 멀티파티를 이용하고 있었는데 특정 메모리에 저장이 되는 듯 했다. 이것도 사용법을 다시 정리해봐야겠다.
상황을 보고 버스보이로 전략을 바꿔봐야겠다
'Back-end > Node.js' 카테고리의 다른 글
Mocha 테스트 후, 테스팅 터미널 종료하기+ Mocha default timeout 시간 재설정 (0) | 2022.03.27 |
---|---|
Sequelize 사용하기 (0) | 2021.10.18 |
Node에서의 Module (0) | 2021.08.09 |
PM2로 무중단 배포하기 (2) | 2021.07.17 |
Node란? 이벤트 루프, 논블로킹 (0) | 2021.06.04 |