Language/JavaScript (WEB)

๐ŸŒ FormData ์‚ฌ์šฉ๋ฒ• & ์‘์šฉ ์ด์ •๋ฆฌ (+ fetch ์ „์†ก)

์ธํŒŒ_ 2022. 8. 17. 21:48

javascript-FormData

FormData API

๋ณดํ†ต ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” HTML5 ์˜ ํผ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฉ”๋‰ด๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ์ œ์ถœ ํ•ด๋ณธ ๊ธฐ์–ต๋“ค์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค.

<form action="./login" method="post">
    <strong>์•„์ด๋””</strong>
    <input type="text" name="name" value="์•„์ด๋”” ์ž…๋ ฅ">
    
    <strong>๋น„๋ฐ€๋ฒˆํ˜ธ</strong>
    <input type="password" name="password" value="๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ">
    
    <strong>์„ฑ๋ณ„</strong>
    <input type="radio" name="gender" value="M">๋‚จ์ž
    <input type="radio" name="gender" value="F">์—ฌ์ž
    
    <strong>์‘์‹œ๋ถ„์•ผ</strong>
    <input type="checkbox" name="part" value="eng">์˜์–ด
    <input type="checkbox" name="part" value="math">์ˆ˜ํ•™

    <input type="submit" value="์ œ์ถœ">
</form>

javascript-FormData

์ด ์ฒ˜๋Ÿผ ๋ณดํ†ต์€ HTML5์˜ <form> ํƒœ๊ทธ์ด์šฉํ•ด input ๊ฐ’์„ ์„œ๋ฒ„์— ์ „์†กํ•˜์ง€๋งŒ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ FormData() ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด ๋˜‘๊ฐ™์ด ์Šคํฌ๋ฆฝํŠธ๋กœ๋„ ์ „์†ก์„ ํ• ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰, FormData๋ž€ HTML ๋‹จ์ด ์•„๋‹Œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‹จ์—์„œ ํผ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฐ์ฒด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  HTML์—์„œ์˜ Submit ์ œ์ถœ ๋™์ž‘์€ Ajax๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์— ์ œ์ถœํ•œ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

let formData = new FormData(); // new FromData()๋กœ ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ƒ์„ฑ
formData.append('item','hi'); // <input name="item" value="hi"> ์™€ ๊ฐ™๋‹ค.
formData.append('item','hello'); // <input name="item" value="hello">

FormData๋Š” ์–ธ์ œ ํ™œ์šฉ๋˜๋Š”๊ฐ€

๋Œ€๋ถ€๋ถ„์˜ ๋…์ž๋ถ„๋“ค์€ HTML์—์„œ๋„ ์ถฉ๋ถ„ํžˆ ํผ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ์ˆ˜ ์žˆ๋Š”๋ฐ ์™œ ๊ตณ์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํผ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š”์ง€ ์™€ ๋‹ฟ์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. ์‚ฌ์‹ค์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ Ajax๋กœ ํผ(form ํƒœ๊ทธ) ์ „์†ก์„ ํ•  ์ผ์ด ๊ฑฐ์˜ ์—†๋‹ค๊ณ  ๋ณด๋ฉด๋œ๋‹ค.

ํ•˜์ง€๋งŒ HTML์ด ์•„๋‹Œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‹จ ์—์„œ form ์ „์†ก ๋™์ž‘์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋ฏธ์ง€ ๊ฐ™์€ ๋ฉ€ํ‹ฐ๋ฏธ๋””์–ด ํŒŒ์ผ์„ ํŽ˜์ด์ง€ ์ „ํ™˜ ์—†์ด ํผ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๋™๊ธฐ๋กœ ์ œ์ถœ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋‚˜, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ข€๋” ํƒ€์ดํŠธํ•˜๊ฒŒ ํผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ์„๋•Œ formData ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•œ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

// ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ง์ ‘ form ํƒœ๊ทธ๋ฅผ ์ƒ์„ฑ
let formData = new FormData(); // ์ƒˆ๋กœ์šด ํผ ๊ฐ์ฒด ์ƒ์„ฑ
formData.append('name','hyemin'); // ํผ ๋ฐ์ดํ„ฐ๋ฅผ ์Šคํฌ๋ฆฝํŠธ๋กœ ์ถ”๊ฐ€
formData.append('item','hi'); // <input name="item" value="hi"> ์™€ ๊ฐ™๋‹ค.
formData.append('item','hello'); // <input name="item" value="hello">
// ๋งŒ์ผ HTML์— ๋ฏธ๋ฆฌ form ํƒœ๊ทธ๊ฐ€ ์žˆ์œผ๋ฉด ์ œ์ด์ฟผ๋ฆฌ๋‚˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜๋„ ์žˆ๋‹ค.

// ์ œ์ด์ฟผ๋ฆฌ์ธ ๊ฒฝ์šฐ
let formData1 = new FormData($("#formId")); 

// ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๊ฐ€์ ธ ์˜ฌ ๊ฒฝ์šฐ
let formData2 = new FormData(document.getElementById("formId"));

์œ„์ฒ˜๋Ÿผ ํผ ๊ฐ์ฒด์— append() ๋ฉ”์†Œ๋“œ๋กœ key์™€ value ๊ฐ’์„ ์ฐจ๋ก€๋กœ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด, ๊ณง input ํƒœ๊ทธ์— ๊ฐ’์„ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ๊ฐ€์ง„๋‹ค. ์ฐธ๊ณ ๋กœ ๊ฐ’์€ ๋ฌด์กฐ๊ฑด "๋ฌธ์ž์—ด"๋กœ ์ž๋™ ๋ณ€ํ™˜ ๋œ๋‹ค. ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด ๊ฐ™์€ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ๋Š” ๋„ฃ์„ ์ˆ˜ ์—†๋‹ค.

๐Ÿ”ฅ formData ์ฃผ์˜์‚ฌํ•ญ
formData.append(name, value) ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์„์‹œ์— value๋Š” ๋ฌธ์ž์—ด๋กœ๋งŒ ์ž…๋ ฅ ๋œ๋‹ค.
๋งŒ์ผ ๋ฌธ์ž์—ด ์ด์™ธ์˜ ๋ฐ์ดํ„ฐ ํƒ€์ด์„ ๋„ฃ์œผ๋ฉด ๋ฌด์‹œ๋˜๊ณ  ๋ฌธ์ž์—ด๋กœ ์ž๋™ ๋ณ€ํ™˜ ๋œ๋‹ค.

FormData ์‚ฌ์šฉ๋ฒ•

formData.append(name, value)
// - form์˜ name ๊ณผ value ๋ฅผ ํ•„๋“œ์˜ ์ถ”๊ฐ€
// - input์˜ name ์†์„ฑ๊ณผ value ์ž…๋ ฅ๊ฐ’ ์—ญํ• ์„ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐ ํ•˜๋ฉด ๋œ๋‹ค.

formData.append(name, blob, fileName)
// - input ์˜ type ์ด 'file' ์ธ ๊ฒฝ์šฐ์— ์‚ฌ์šฉ
// - fileName์€ file์˜ ์ด๋ฆ„์˜ ํ•ด๋‹น

formData.delete(name)
// - ์ฃผ์–ด์ง„ name ์œผ๋กœ ํ•„๋“œ๋ฅผ ์ œ๊ฑฐ

formData.get(name)
// - ์ฃผ์–ด์ง„ name ์˜ ํ•ด๋‹น ํ•˜๋Š” ํ•„๋“œ value๋ฅผ ๋ฐ˜ํ™˜

formData.getAll(name)
// - append ํ•จ์ˆ˜๋กœ ์ถ”๊ฐ€์‹œ name์ด ์ค‘๋ณต ๊ฐ€๋Šฅ
// - ๋”ฐ๋ผ์„œ ์ฃผ์–ด์ง„ name ์˜ ํ•ด๋‹น ํ•˜๋Š” ํ•„๋“œ์˜ ๋ชจ๋“  value๋ฅผ ๋ฐ˜ํ™˜

formData.has(name)
// - ์ฃผ์–ด์ง„ name ์˜ ํ•ด๋‹นํ•˜๋Š” ํ•„๋“œ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ true, ์—†์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜

formData.set(name, value)
formData.set(name, blob, fileName)
// - set ํ•จ์ˆ˜๋Š” append ํ•จ์ˆ˜ ์ฒ˜๋Ÿผ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€
// - append์™€ ๋น„์Šทํ•œ set ๋ฉ”์†Œ๋“œ๋Š” set๋„ ์ถ”๊ฐ€๋ฅผ ํ•ด์ฃผ๊ธฐ๋Š” ํ•˜์ง€๋งŒ, ๊ธฐ์กด key๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ key๊ฐ’์„ ๋ชจ๋‘ ๋ฎ์–ด์”Œ์›Œ๋ฒ„๋ฆฐ๋‹ค

 

์œ„์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ™œ์šฉํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

let formData = new FormData(); // ์ƒˆ๋กœ์šด ํผ ๊ฐ์ฒด ์ƒ์„ฑ
formData.append('item', 'hi');

// key๊ฐ€ ์กด์žฌํ•˜๋Š” ์ง€ ํ™•์ธ. ๊ฐ’์ด boolean type์œผ๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
formData.has('item'); // true.
formData.has('money'); // false

// ๊ฐ’์˜ ์ฒซ ๋ฒˆ์งธ ๊ฐ’์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
formData.get('item'); // hi. 

// ์ค‘๋ณต๋œ key๊ฐ’์„ ๋ชจ๋‘ ๊ฐ€์ ธ์˜ฌ ๋•Œ ๋ฐฐ์—ด ํ˜•์‹์œผ๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
formData.append('item', 'hello'); // ๋˜‘๊ฐ™์€ item ํ‚ค์— ๊ฐ’์„ ๋˜ ์ถ”๊ฐ€
formData.getAll('item'); // ['hi','hello']
// ์ค‘๋ณต ๋œ ๊ฐ’์„ ๋„ฃ์„๋•Œ๋Š” ๋ฐฐ์—ด๋กœ ํ•œ๊บผ๋ฒˆ์— appendํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
formData.append( 'test', ['hi','hyemin'] );
formData.get('test'); // hi,hyemin

// ์‚ญ์ œ
formData.delete('test');
formData.get('test'); // null๊ฐ’์ด ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.

// item๊ฐ’์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.
formData.set('item','test2');
formData.getAll('item); // ['test2']

 

formData ๊ฐ’ ์ฝ˜์†” ์ถœ๋ ฅ

formData ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  append ๋ฅผ ํ†ตํ•ด key์™€ value ๊ฐ’๋“ค์„ ์•„์ฃผ ๋งŽ์ด ๋„ฃ์—ˆ๋‹ค๊ณ  ํ•˜์ž. ๊ทธ๋Ÿฌ๋ฉด ๋‚ด๊ฐ€ ์–ด๋– ํ•œ ํผ ๋ฐ์ดํ„ฐ๋“ค์„ ๋„ฃ์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์„๋•Œ, formData ๊ฐ์ฒด๋ฅผ console.log๋กœ ์ถœ๋ ฅํ•ด ๋ณผ ๊ฒƒ์ด๋‹ค.

ํ•˜์ง€๋งŒ ๋‹ค์Œ ์ด๋ฏธ์ง€์™€ ๊ฐ™์ด ํผ ๋ฐ์ดํ„ฐ์˜ keys์™€ values ๊ฐ’๋“ค์„ ์–ด๋””์—๋„ ํ™•์ธํ•  ์ˆ˜ ์—†๋‹ค.

formData-console-log

์™œ๋ƒํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ FormData ๊ฐ์ฒด๋ž€ ๋‹จ์ˆœํ•œ ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ฉฐ XMLHttpRequest ์ „์†ก์„ ์œ„ํ•˜์—ฌ ์„ค๊ณ„๋œ ํŠน์ˆ˜ํ•œ ๊ฐ์ฒด ํ˜•ํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฌธ์ž์—ด ํ™”ํ•  ์ˆ˜ ์—†์–ด, console.log๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™•์ธ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡์ง€๋งŒ ์ „ํ˜€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

 

formData ๊ฐ’ ์ˆœํšŒํ•˜๊ธฐ

์—ฌ๋Ÿฌ๊ฐœ์˜ ํผ ๋ฐ์ดํ„ฐ๋“ค์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ดํ„ฐ๋Ÿฌ๋ธ” ํ•˜๊ธฐ ๋•Œ๋ฌธ์— for๋ฌธ ์œผ๋กœ ์ˆœํšŒ ํ• ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ํ†ตํ•ด ํผ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด์— ์–ด๋– ํ•œ ๊ฐ’๋“ค์ด ๋“ค์–ด์žˆ๋Š”์ง€ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

let formData = new FormData();
formData.append('key1', 'value1');
formData.append('key2', 'value2');

// ํผ ๊ฐ์ฒด key ๊ฐ’์„ ์ˆœํšŒ.
let keys = formData.keys();
for (const pair of keys) {
    console.log(pair); 
}

// ํผ ๊ฐ์ฒด values ๊ฐ’์„ ์ˆœํšŒ.
let values = formData.values();
for (const pair of values) {
    console.log(pair); 
}

// ํผ ๊ฐ์ฒด key ์™€ value ๊ฐ’์„ ์ˆœํšŒ.
let entries = formData.entries();
for (const pair of entries) {
    console.log(pair[0]+ ', ' + pair[1]); 
}

 

formData์— ์ด๋ฏธ์ง€ ๋‹ด๊ธฐ

์ด๋ฏธ์ง€์™€ ๊ฐ™์€ ๋ฉ€ํ‹ฐ๋ฏธ๋””์–ด ํŒŒ์ผ์„ ํผ ๋ฐ์ดํ„ฐ์— ๋‹ด๊ณ  ์‹ถ๋‹ค๋ฉด, ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด formData ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ด๋ฏธ์ง€ ํŒŒ์ผ์ด ๋‹ด๊ธด input ํƒœ๊ทธ๋ฅผ querySelector ๋กœ ๋ฐ›์•„์™€์„œ files[0] ๋ฅผ  append๋กœ ๋”ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์ด๋ฏธ์ง€๋Š” base64, buffer, 2์ง„ data ํ˜•์‹์œผ๋กœ ์„œ๋ฒ„๋กœ ์ „์†กํ•ด๋„ ๋œ๋‹ค. (์ฐธ๊ณ  ๊ธ€)
<body>
    <input type="file" id="fileInput">
    <button type="submit" id="sendButton">์ „์†ก</button>
 
    <script>
        const fileInput = document.querySelector("#fileInput");
        const sendButton = document.querySelector("#sendButton");
 
        sendButton.addEventListener("click",function(){
 
            var formData = new FormData();
            // form Data ๊ฐ์ฒด ์ƒ์„ฑ
            formData.append("attachedImage", fileInput.files[0]);
            // ํŒŒ์ผ ์ธํ’‹์— ๋“ค์–ด๊ฐ„ ํŒŒ์ผ๋“ค์€ files ๋ผ๋Š” ๋ฆฌ์ŠคํŠธ๋กœ ์ €์žฅ๋œ๋‹ค.
            // input์— multiple์„ ์„ ์–ธํ•ด ์—ฌ๋Ÿฌ๊ฐœ์˜ ํŒŒ์ผ์„ ์„ ํƒํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด files[0] ์œผ๋กœ input์— ์ถ”๊ฐ€ํ•œ ํŒŒ์ผ ๊ฐ์ฒด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.
            
        });
 
    </script>
</body>

 

formData ๊ฐ’์„ ๊ฐ์ฒด๋กœ ๋ฐ›๊ธฐ

์ด๋ฒˆ์—๋Š” ์ข€๋” ์‹ฌํ™”๋œ ์‘์šฉ ์˜ˆ์ œ์ด๋‹ค. ๋งŒ์ผ ํผ ๋ฐ์ดํ„ฐ์— ๋„ฃ์„ key-value ๊ฐ’๋“ค์„ ๊ฐ์ฒด๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฆฌํŒฉํ† ๋ง ํ•  ์ˆ˜ ์žˆ๋‹ค.

// ํผ๋ฐ์ดํ„ฐ์— ๋„ฃ์„ key-value ๊ฐ’๋“ค์„ ๊ฐ์ฒด๋กœ ๊ด€๋ฆฌ
const obj = {
    first: 'Akash',
    middle: 'Rishi',
    last: 'Mittal',
}
    
const formData = new FormData();

Object.entries(obj).forEach(item => formData.append(item[0], item[1]));
// ์„ฑ๋Šฅ์„ ๋”ฐ์ง„๋‹ค๋ฉด, ๊ณ ์ฐจ ํ•จ์ˆ˜ ๋Œ€์‹  for๋ฌธ์„ ์ด์šฉํ•ด๋„ ๋œ๋‹ค.
// for(let key in obj) {
//   formData.append(key, obj[key])
// }

// ํผ๋ฐ์ดํ„ฐ ๊ฐ’ ์ถœ๋ ฅ
let entries = formData.entries();
for (const pair of entries) {
    console.log(pair[0]+ ', ' + pair[1]); 
}

formdata-object

๋ฐ˜๋Œ€๋กœ formData ๊ฐ์ฒด์˜ ํผ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋กœ ํ™˜์›๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

const obj2 = {};
formData.forEach((value, key) => obj2[key] = value);

console.log(obj2); // {first: 'Akash', middle: 'Rishi', last: 'Mittal'}

FormData ์„œ๋ฒ„ ์ „์†กํ•˜๊ธฐ

๋ณธ๋ž˜ HTML์—์„œ ํผ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ ๋ณด๋‚ผ๋•Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด action ๊ณผ method ์†์„ฑ ๋ถ€๋ถ„์„ ์ •์˜ ํ•ด์„œ input submit์œผ๋กœ ๋ณด๋ƒˆ์—ˆ๋‹ค.

<form action="/action_page.php" method="get">
  <input type="text" id="fname" name="fname"><br><br>
  <input type="text" id="lname" name="lname"><br><br>
  <input type="submit" value="Submit">
</form>

ํ•˜์ง€๋งŒ formData()๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค์ด๊ธฐ์—, ์„œ๋ฒ„์— ์ „์†กํ•˜๋ ค๋ฉด fetch api๋ฅผ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค.

 

fetch๋กœ ํผ๋ฐ์ดํ„ฐ ์ „์†กํ•˜๊ธฐ

์—ฌ๊ธฐ์„œ ์œ ์˜ํ•ด์•ผ ํ•  ์ ์€, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์„œ๋ฒ„๋กœ form data๋ฅผ ๋ณด๋‚ด๋ ค๋ฉด body ์†์„ฑ ๋ถ€๋ถ„์„ ์ผ๋ฐ˜์ ์ธ json์ด๋‚˜ ๊ฐ์ฒด ํƒ€์ž… ํ˜•ํƒœ๊ฐ€ ์•„๋‹Œ form data ํƒ€์ž… ํ˜•์‹์— ๋งž์ถฐ์„œ ๋ณด๋‚ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.

var formData = new FormData();
formData.append('key1', 'value1');
formData.append('key2', 'value2');

fetch('https://httpbin.org/post', {
    method: 'POST',
    cache: 'no-cache',
    body: formData // body ๋ถ€๋ถ„์— ํผ๋ฐ์ดํ„ฐ ๋ณ€์ˆ˜๋ฅผ ํ• ๋‹น
})
.then((response) => response.json())
.then((data) => {
    console.log(data);
});
formData๋ฅผ ๋ณด๋‚ผ๋•Œ, header ๋ถ€๋ถ„์€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž๋™์œผ๋กœ ์„ค์ •ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— Content-Type์„ application/x-www-form-urlencoded ..๋“ฑ ๋”ฐ๋กœ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

 

URLSearchParams

๋งŒ์ผ ์œ„์ฒ˜๋Ÿผ formData ๊ฐ์ฒด์— ์ผ์ผํžˆ append ํ•˜์—ฌ ํผ ๋ฐ์ดํ„ฐ ๊ฐ’์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋ฒˆ๊ฑฐ๋กญ๋‹ค๋ฉด, URLSearchParams() ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ผ๋ฐ˜ ๊ฐ์ฒดํ˜•ํƒœ๋ฅผ formdataํ˜•์‹์œผ๋กœ ์ž๋™ ๋ณ€ํ™˜ ํ•ด์ฃผ์–ด ๋ณด๋‹ค ๊ฐ€๋…์„ฑ ์ข‹๊ฒŒ ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค.

fetch('https://httpbin.org/post', {
    method: 'POST',
    cache: 'no-cache',
    body: new URLSearchParams({ // ์ผ๋ฐ˜ ๊ฐ์ฒด๋ฅผ fordataํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ํด๋ž˜์Šค
        aaa: 'a1',
        bbb: 'b1'
    })
})
.then((response) => response.json())
.then((data) => {
    console.log(data);
});

# ์ฐธ๊ณ ์ž๋ฃŒ

https://ko.javascript.info/formdata

https://developer.mozilla.org/en-US/docs/Web/API/FormData

https://2ham-s.tistory.com/307