๐ฆ HTML5์ ๋ค๋ฅธ ์์ ์ ์์ ์ ์ถ
I couldnโt be more wrong.
ํ์ง๋ง JavaScript ๋ฐ AJAX/Fetch๋ฅผ ์ฌ์ฉํ์ฌ ๊ณผ๊ฑฐ์ ๋ฐฉ์์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋ฌธ์
์ฌ์ฉ์ ํ๋กํ์ ์ฃผ์๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ๋ฐ์ดํธํ๋ ค๋ HTML ์์์ ๋ฐ๋ฅด๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
<form id='addressForm'>
...
<!-- Form Fields -->
...
<button id='addAddress' class="btn btn-primary">Add Address</button>
<button id='updateAddress' class="btn btn-success">Update Address</button>
</form>
์์ ์์์๋
Add Address
๋๋ Update Address
์ ๋ํ ์ ์ถ ๋ฒํผ์ด ์์ง๋ง POST
์์ฒญ์ /addAddress
์๋ง ๋ณด๋
๋๋ค.์ฆ, ์ ๋ฐ์ดํธ ์ฃผ์๋ ํ์ฌ ์ฃผ์๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋์ ์ ์ฃผ์๋ฅผ ์ถ๊ฐํ๊ฒ ๋ฉ๋๋ค.
์ด ์์ ์ ์ํํ๋ ค๋ฉด JavaScript๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ด์ JavaScript์๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ํ ๊ฐ์ง ๊ฐ๋จํ ๋ฐฉ๋ฒ์ AJAX ์์ฒญ์ ํตํด ์์์ ์ ์ถํ๋ ๊ฒ์ ๋๋ค.
AJAX๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์์์ ๋ค๋ฅธ ์์ ๋์ ์ ์ ์ถํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
document.addEventListener('DOMContentLoaded', () => {
const form = document.querySelector('#addressForm')
const addButton = document.querySelector('#addAddress')
const updateButton = document.querySelector('#updateAddress')
addButton && addButton.addEventListener('click', (e) => {
e.preventDefault()
if (!form.checkValidity()) {
return
}
fetch('/addAddress', { method: 'POST', body: new FormData(form) })
.then((r => r.json()))
.then(console.log)
})
updateButton && updateButton.addEventListener('click', (e) => {
e.preventDefault()
if (!form.checkValidity()) {
return
}
fetch('/updateAddress', { method: 'POST', body: new FormData(form) })
.then((r => r.json()))
.then(console.log)
})
})
์ด์ JavaScript๋ฅผ ์ฌ์ฉํ๋ฉด HTML๊ณผ ๋ณํ ์ ์ถ์ด ๋งค์ฐ ๋ฐ์ ํ๊ฒ ๊ฒฐํฉ๋์ด ์์์ ์ ์ ์์ต๋๋ค.
์์์ ์ฌ๋ฌ ๋์ ์ผ๋ก ์ ์กํ๋ ์ด ์ด์ ๋ฐฉ์์ ํ์ธํ ์ ์์ต๋๋คhttps://multi-action-forms.netlify.app/with-ajax.html.
Now what is the solution?
ํด๊ฒฐ์ฑ
์ ์ถ ๋ฒํผ์ ๋ํ ์ด๋ฌํ ์์ฑ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ์ฌ๊ธฐ์์ ๋ค๋ฅธ HTTP ๋ฉ์๋ ๋ฐ ์ธ์ฝ๋ฉ ์ ํ์ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ URL์ ์ ์ถํ ์์์ ๊ตฌ์ฒด์ ์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค.
์ด๋ฌํ ์์ฑ์ fromaction, formmethod ๋ฐ formenctype์ ๋๋ค.
์ด๋ฌํ ์์ฑ์ ์ฌ์ฉํ์ฌ ์ผ๋ฐ ์ ์ถ ๋ฒํผ๊ณผ ๊ธฐ๋ณธ ์์ฑ์ ์์์ ์ถ๊ฐํ๋ ์์ ์ผ๋ก ๋์๊ฐ ์ ์์ต๋๋ค.
์ด์ ํจ๊ป ์ด์ ์ค์์ ์ธ๊ธํ ์์ฑ์ ๊ฐ์ง ๋ค๋ฅธ ์ ์ถ ๋ฒํผ์ ์ถ๊ฐํ ๊ฒ์ ๋๋ค.
์ HTML ์์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
<form action="/addAddress" method="POST">
...
<!-- Form Fields -->
...
<button type="submit" class="btn btn-primary">Add</button>
<button type="submit" class="btn btn-success" formaction="/updateAddress" formmethod="POST">Update</button>
</form>
๋ฒํผ๋ฟ๋ง ์๋๋ผ ๋ฒํผ ์ ํ์ ์ ๋ ฅ์์๋ ์ด๋ฌํ ์์ฑ์ ํ์ฉํ์ฌ ์์ ์ ์ถ์ ๋ค๋ฅธ ๋์ ์ผ๋ก ๋ณด๋ผ ์ ์์ต๋๋ค.
์ด์ต
์ฐ๋ ค ์ฌํญ
time2hack / ๋ฉํฐ ์ก์ ์์ ์์
Demo
๊ฒฐ๋ก
์ ์ ์ฝ๋๋ก ๋ ๋ง์ ์์ ์ ์ํํ๊ธฐ ์ํด ๋ธ๋ผ์ฐ์ ์ ๋ด์ฅ API๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด์์ต๋๋ค.
Would you use in you application? Why or Why not?
๋๊ธ ๐ฌ ๋๋ Twitter at ๋ฐ/๋๋์ ํตํด ์๋ ค์ฃผ์ธ์.
์ด ๊ธ์ด ๋์์ด ๋์ จ๋ค๋ฉด ๋ค๋ฅธ ์ฌ๋๋ค๊ณผ ๊ณต์ ํด์ฃผ์ธ์ ๐ฃ
๋ฐ์ ํธ์งํจ์ผ๋ก ๋ฐ๋ก ์ ๊ฒ์๋ฌผ์ ๋ฐ์ผ๋ ค๋ฉด ๋ธ๋ก๊ทธ๋ฅผ ๊ตฌ๋ ํ์ญ์์ค.
ํ์
2021๋ 1์ 13์ผ https://time2hack.com์์ ์๋ ๊ฒ์๋์์ต๋๋ค.
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ฆ HTML5์ ๋ค๋ฅธ ์์ ์ ์์ ์ ์ถ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/time2hack/submitting-a-form-to-different-actions-in-html5-40ppํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค