๐Ÿ“ฆ `Blob` vs ๐Ÿงพ `FormData` ์ฐจ์ด์  ์ •๋ฆฌ

YEONGHUN KOยท2025๋…„ 5์›” 28์ผ
0

JAVASCRIPT - BASICS

๋ชฉ๋ก ๋ณด๊ธฐ
29/29
post-thumbnail

blob vs file vs arraybuffer ์ด ๊ธ€์— ์ด์–ด ๊ถ๊ธˆ์ฆ์ด ์ƒ๊ฒจ์„œ ์ ์–ด๋ณด์•˜๋‹ค.

โœ… ๊ฐœ์š”

Blob๊ณผ FormData๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํŒŒ์ผ ๋ฐ ๋ฐ์ดํ„ฐ ์ „์†ก ์‹œ ์ž์ฃผ ์‚ฌ์šฉ๋˜์ง€๋งŒ, ๋ชฉ์ ๊ณผ ์—ญํ• ์ด ๋‹ค๋ฅด๋‹ค.


๐Ÿ” ์ฃผ์š” ์ฐจ์ด์ 

ํ•ญ๋ชฉBlobFormData
๐Ÿ“Œ ์ •์ฒด๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ์˜ ๋ฉ์–ด๋ฆฌHTML form์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ํ‚ค-๊ฐ’ ์Œ์˜ ์ปฌ๋ ‰์…˜
๐Ÿ“‚ ํƒ€์ž…ํŒŒ์ผ, ์ด๋ฏธ์ง€, ํ…์ŠคํŠธ ๋“ฑ ์ด์ง„ ๋ฐ์ดํ„ฐํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ, ํŒŒ์ผ ๋“ฑ ํผ ์ž…๋ ฅ๊ฐ’
๐Ÿ“ค ์šฉ๋„ํŒŒ์ผ, ์ด๋ฏธ์ง€ ๋“ฑ ์ „์†ก ๋˜๋Š” ๋กœ์ปฌ ์ €์žฅ์„œ๋ฒ„์— ํผ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ
๐Ÿ“ฆ ๋‚ด๋ถ€ ๊ตฌ์กฐํ•˜๋‚˜์˜ ๋ฉ์–ด๋ฆฌ (stream ๊ฐ€๋Šฅํ•œ ์ด์ง„ ๋ฐ์ดํ„ฐ)์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•„๋“œ (multipart/form-data๋กœ ์ „์†ก)
๐Ÿ”„ ๊ด€๊ณ„Blob ๊ฐ์ฒด๋ฅผ FormData์— ์ฒจ๋ถ€ํ•  ์ˆ˜ ์žˆ์ŒFormData๋Š” Blob์„ ํ•˜๋‚˜์˜ ํ•„๋“œ๋กœ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿ”น Blob ์˜ˆ์‹œ

const blob = new Blob(["Hello World"], { type: "text/plain" });
// blob ์ž์ฒด๋Š” ์•„๋ฌด key๋ฅผ ๊ฐ€์ง€์ง€ ์•Š์•„, ๊ทธ๋ƒฅ ๋ฐ์ดํ„ฐ ๋ฉ์–ด๋ฆฌ์•ผ

๐Ÿ”น FormData ์˜ˆ์‹œ + Blob ์ถ”๊ฐ€

const blob = new Blob(["Hello World"], { type: "text/plain" });

const formData = new FormData();
formData.append("myTextFile", blob, "hello.txt");

// ์„œ๋ฒ„๋กœ ์ „์†ก
fetch("/upload", {
  method: "POST",
  body: formData, // Content-Type: multipart/form-data
});

๐Ÿ“ ํ•ต์‹ฌ ์š”์•ฝ

  • Blob์€ ๋ฐ์ดํ„ฐ ๊ทธ ์ž์ฒด
  • FormData๋Š” ์„œ๋ฒ„ ์ „์†ก์„ ์œ„ํ•œ ์ปจํ…Œ์ด๋„ˆ
  • FormData๋Š” Blob ๋˜๋Š” File์„ ํ•„๋“œ๋กœ ํฌํ•จ ๊ฐ€๋Šฅ

๐Ÿง  ๋น„์œ ๋กœ ์ดํ•ดํ•˜๊ธฐ

Blob์€ ๊ทธ๋ƒฅ ํŒŒ์ผ ํ•˜๋‚˜์ด๊ณ ,
FormData๋Š” ํƒ๋ฐฐ ์ƒ์ž์ด๋‹ค.
์ƒ์ž ์•ˆ์— Blob์ด๋‚˜ File, ํ…์ŠคํŠธ ๊ฐ™์€ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฅผ ํฌ์žฅํ•ด์„œ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๋Š” ์šฉ๋„์ด๋‹ค. ๐Ÿ“ฆ๐Ÿ“ค


profile
'๊ณผ์—ฐ ์ด๊ฒŒ ์ตœ์„ ์ผ๊นŒ?' ๋Š์ž„์—†์ด ์ƒ๊ฐํ•˜๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€