๋๊ธ ์ ์ก ๋ฒํผ์ด ๋ฉ์ถ ๋: fetch ์ค๋ฅ ์ฒ๋ฆฌ์ ์ค๋ณต ์ ์ถ ๋ฐฉ์งํ๊ธฐ
1. ์์ฒญ์ด ๋๋ฌ๋ค๊ณ ์์ ์ด ์ฑ๊ณตํ ๊ฒ์ ์๋๋๋ค
๋๊ธ ์ ์ก ๋ฒํผ์ ๋๋ ๋๋ฐ ์๋ฌด ๋ฐ์์ด ์๊ฑฐ๋ ๋ฒํผ์ด ๊ณ์ ๋นํ์ฑํ๋ ์ ์์ต๋๋ค. ์๋ฒ๊ฐ ์ค๋ฅ๋ฅผ ๋ณด๋๋๋ฐ ์ฝ๋๊ฐ ์ฑ๊ณต ์๋ต์ฒ๋ผ ์ฒ๋ฆฌํ์ ์๋ ์๊ณ JSON์ด ์๋ HTML์ ํ์ฑํ๋ ค๋ค ์คํจํ์ ์๋ ์์ต๋๋ค. ์์ฒญ ๋์ค ์ฐ๊ฒฐ์ด ๋๊ธด ์ํฉ๋ ๋ฐ๋ก ํ์ธํด์ผ ํฉ๋๋ค.
์ด ๊ธ์ ์ค์ ๋๊ธ ์๋ฒ๋ฅผ ํธ์ถํ์ง ์๋ ์ฌํ ์์ ๋ฅผ ์ค์ฌ์ผ๋ก ์ค๋ฅ ์ฒ๋ฆฌ์ ๊ตฌ์กฐ๋ฅผ ์ค๋ช ํฉ๋๋ค. ์์์ ์๋ต ๊ฐ์ฒด๋ก ์ ์ JSON, HTTP ์ค๋ฅ, ์๋ชป๋ ๋ณธ๋ฌธ, ์ฐ๊ฒฐ ์คํจ๋ฅผ ๋น๊ตํฉ๋๋ค. ์์ ๋ฅผ ์ฌ์ดํธ์ ๋ถ์ด๊ธฐ ์ ์ ๊ธฐ์กด API์ ์๋ต ํ์๊ณผ ์ธ์ฆ ๋ฐฉ์์ ํ์ธํด์ผ ํฉ๋๋ค.
2. fetch๋ HTTP ์ค๋ฅ๋ฅผ ๋ณ๋๋ก ํ์ธํด์ผ ํฉ๋๋ค
fetch๋ก ์๋ต์ ๋ฐ์๋ค๊ณ 200๋ฒ๋๋ผ๋ ๋ป์ ์๋๋๋ค. 404๋ 500 ์๋ต๋ HTTP ์๋ต ๊ฐ์ฒด๋ก ๋ฐ์ ์ ์์ผ๋ฏ๋ก response.ok ๋๋ status๋ฅผ ํ์ธํฉ๋๋ค. ๋คํธ์ํฌ ๋ฌธ์ ๋ก ์๋ต ์์ฒด๋ฅผ ๋ฐ์ง ๋ชปํ ์ํฉ๊ณผ ๊ตฌ๋ถํด์ผ ์ฌ์ฉ์์๊ฒ ๋ค์ ํ๋์ ์๋ดํ ์ ์์ต๋๋ค.
๊ทธ๋ค์ ๋ณธ๋ฌธ ํ์์ ํ์ธํฉ๋๋ค. API๊ฐ JSON์ ๊ธฐ๋ํ์ง๋ง ํ๋ก์ ์ค๋ฅ ํ์ด์ง๊ฐ HTML๋ก ์ค๋ฉด response.json์์ ์์ธ๊ฐ ์๊ธธ ์ ์์ต๋๋ค. ์๋ฒ ์๋ฌ ์๋ฌธ์ด๋ ์ ์ฒด HTML์ ์ฌ์ฉ์์๊ฒ ๊ทธ๋๋ก ๋ ธ์ถํ์ง ๋ง๊ณ , ํ๋ฉด์๋ ํ์ํ ์๋ด๋ฅผ ์ ๊ณตํ๊ณ ์ง๋จ ๊ธฐ๋ก์๋ ์ํ์ ์์ฒญ ์๋ณ์๋ฅผ ๋จ๊น๋๋ค.
3. ์ผ๊ด๋ ์๋ฒ ์๋ต ๊ณ์ฝ์ด ๋จผ์ ์ ๋๋ค
์ ์ ์๋ต์๋ success ๊ฐ์ ํ์ ๊ฐ์ ๋ช ์ํ๊ณ ์ค๋ฅ ์๋ต์ ์ ์ ํ ์ํ ์ฝ๋์ ์์ธก ๊ฐ๋ฅํ ํ์์ ์ฌ์ฉํ๋๋ก ์ค๊ณํฉ๋๋ค. ์ด๋ฏธ ์ฌ์ฉ ์ค์ธ API๋ผ๋ฉด ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ค ํํ๋ฅผ ๊ธฐ๋ํ๋์ง ํ์ธํ์ธ์. ์๋ฒ์ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ค๋ฅธ ์์ ์ ๋ฐฐํฌํ๋ฉด ๊ณผ๋๊ธฐ์ ์ธ ํ์ ์ฐจ์ด๋ ๋ฐ์ํ ์ ์์ต๋๋ค.
์๋ ์์ ๋ JSON Content-Type๊ณผ success๊ฐ true์ธ ๊ฒฝ์ฐ๋ฅผ ์ฑ๊ณต์ผ๋ก ๋ด ๋๋ค. ์ด ๊ท์น์ ์ด ๊ธ์ ํ์ต์ฉ ๊ณ์ฝ์ ๋๋ค. ๋ชจ๋ API์ ์ ์ฉ๋๋ ํ์ค ์๋ต ๊ตฌ์กฐ๋ ์๋๋๋ค. ๋ณธ์ธ์ ์๋ฒ๊ฐ ๋ค๋ฅธ ์ด๋ฆ๊ณผ ์๋ฃํ์ ์ฌ์ฉํ๋ค๋ฉด ๊ทธ ๊ณ์ฝ์ ๋ง์ถฐ ๊ฒ์ฌ๋ฅผ ์กฐ์ ํด์ผ ํฉ๋๋ค.
4. ๋ฒํผ ๋นํ์ฑํ๋ finally์์ ๋ณต๊ตฌํฉ๋๋ค
์ ์ก ์ค ๋ฒํผ์ ๋นํ์ฑํํ๊ณ ์ฒ๋ฆฌ๊ฐ ๋๋๋ฉด finally์์ ๋ณต๊ตฌํ๋ ํจํด์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ค๋ฅ๊ฐ ๋๋ ์ด ๊ฒฝ๋ก๊ฐ ์คํ๋๋ฏ๋ก ๋ฒํผ์ด ์๊ตฌ์ ์ผ๋ก ๋ฉ์ถ๋ ์ํฉ์ ์ค์ ๋๋ค. ๋์์ ์งํ ์ค์ธ ์์ฒญ์ ํ์ํ๋ ํ๋๊ทธ๋ฅผ ๋๋ฉด ์ฐ์ ํด๋ฆญ์ผ๋ก ๊ฐ์ ์์ ์ด ๋ ๋ฒ ์์๋๋ ๊ฒ์ ์ค์ผ ์ ์์ต๋๋ค.
๋ธ๋ผ์ฐ์ ๋ฒํผ ์ ์ด๋ง์ผ๋ก ์๋ฒ์ ์ค๋ณต ์ ์ฅ์ ์์ ํ ๋ง๋ ๊ฒ์ ์๋๋๋ค. ํญ ๋ ๊ฐ, ์ฌ์ ์ก, ๋คํธ์ํฌ ์ค๊ฐ ์คํจ ๊ฐ์ ์ํฉ์ ์๋ฒ์์๋ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ๋๊ธยท๊ฒฐ์ ยทํฌ์ธํธ์ฒ๋ผ ์ํ๊ฐ ๋ฐ๋๋ ์์ ์์๋ ์๋ณ ํค๋ ์ค๋ณต ๊ฒ์ฌ ๋ฑ ์๋ฒ ์ ์ฑ ์ ๋ณ๋๋ก ์ค๊ณํฉ๋๋ค. ์๋ ์์ ๋ ์๋ฒ ๋ฉฑ๋ฑ์ฑ์ ๊ตฌํํ์ง ์์ต๋๋ค.
5. ์์ ์์ ๋ก ์คํจ ์ ํ์ ๋ถ๋ฆฌํฉ๋๋ค
readApiResult ํจ์๋ ์๋ต์ ๊ฒํ ํ๋ ์์ํ ๋ถ๋ถ์ ๋๋ค. ์ด ๋ถ๋ถ์ ๋จผ์ ๊ฒ์ฌํ๋ฉด ํ๋ฉด ์ด๋ฒคํธ์ ์๋ฒ ์ํ๊ฐ ์์ด์ง ์์ต๋๋ค. ์ด์ด์ ๋ฒํผ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ํจ์์์ ๊ธฐ์กด ํผ ์ ์ก์ ์ฐ๊ฒฐํฉ๋๋ค. ์์ฒญ ์ฃผ์์ ์ ๋ ฅ ๊ฐ์ ํ๋ก๊ทธ๋จ ๋ฐ์์ ๋ช ์์ ์ผ๋ก ์ ๋ฌํ๊ฒ ํ๋ฉด ์๋ชป๋ ๊ธฐ๋ณธ ์ฃผ์๋ก ์ ์กํ๋ ์ค์๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
๋ก๊ทธ์ธ ์ฟ ํค์ CSRF ํ ํฐ์ ์ฐ๋ ์๋น์ค์์๋ ํด๋น ๊ณ์ฝ๋ ์ ์งํด์ผ ํฉ๋๋ค. ์์ ์ ์ธ์ฆ ๊ฐ์ ์ง์ ์ ์ง ๋ง์ธ์. cross-origin ์์ฒญ์ ์ฐ๋ ์๋น์ค๋ผ๋ฉด ์ฟ ํค, CORS, origin ๊ด๊ณ๋ฅผ ๋ณ๋๋ก ์ ๊ฒํฉ๋๋ค. ์ค๋ฅ๋ฅผ ์์ ๊ธฐ ์ํด no-cors๋ฅผ ๋ถ์ด๋ ๋ฐฉ๋ฒ์ ์๋ต์ ์ฝ์ ์ ์๊ฒ ๋ง๋ค์ด ์ง๋จ ๋ชฉ์ ๊ณผ ๋ง์ง ์์ ์ ์์ต๋๋ค.
6. ์คํจ ํ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ ์ค ๋ด์ฉ
์ ์ก ์คํจ๋ฅผ ์กฐ์ฉํ ์ผํค๋ฉด ์ฌ์ฉ์๋ ์ฌ๋ฌ ๋ฒ ๋๋ฅผ ์ ์์ต๋๋ค. ์ ๋ ฅ ๋ด์ฉ์ ๋ณด์กดํ๊ณ ์ฑ๊ณต์ด ํ์ธ๋์ ๋๋ง ์ด๊ธฐํํ๋ ํธ์ด ์ข์ต๋๋ค. ์คํจ ์๋ด์๋ ์ฌ์๋ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ์ ๊ณ , ์์ฒญ ์ ํ์ธ ๊ฒฝ์ฐ ์๋น์ค์ ๋๊ธฐ ์ ์ฑ ์ ๋ฐ์ํฉ๋๋ค. ๋ชจ๋ ์คํจ์์ ์ฆ์ ์๋ ์ฌ์๋ํ๋ ์ค๊ณ๋ ํผํ์ธ์.
์๋ต์ ๋ฐ์ง ๋ชปํ๋๋ผ๋ ์๋ฒ์๋ ์ ์ฅ๋์ ์ ์์ต๋๋ค. ์ฑ๊ณตยท์คํจ๋ฅผ ๋ชจ๋ฅด๋ ์ํ๋ฅผ ๋จ์ ์คํจ์ ๊ตฌ๋ถํ ํ์๊ฐ ์์ต๋๋ค. ์ค์ํ ์์ ์์๋ ์กฐํ๋ก ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๊ฑฐ๋ ์๋ฒ ์๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๊ฒํ ํฉ๋๋ค. ๊ฐ๋ฐ์ ๋๊ตฌ์ ์์ฒญ๊ณผ ์๋ฒ ๊ธฐ๋ก์ ๋์กฐํ๊ณ UI๋ง ์ ์์ผ๋ก ๋ณด์ด๋์ง ํ์ธํ์ง ๋ง์ธ์.
7. ์์ํ์ง ๋ชปํ ์๋ต์ ์ํ ํ ์คํธ ๋ชฉ๋ก
์ ์ ์๋ต ํ๋๋ง ํ์ธํ์ง ๋ง๊ณ ์คํจ ์ ํ์ ๋๋์ด ์ํํฉ๋๋ค. HTTP ์ค๋ฅ, ์ ์ ์ฝ๋์ง๋ง ์๋ชป๋ ๋ณธ๋ฌธ, success๊ฐ false์ธ ๋ฐ์ดํฐ์ ์ฐ๊ฒฐ ๊ฑฐ์ ์ ๋ฐ๋ก ์ค๋นํ์ธ์. ๊ฐ ๊ฒฝ์ฐ์ ๋ฒํผ์ด ๋ณต๊ตฌ๋๋์ง, ์์ฑ ๋ด์ฉ์ด ์ ์ง๋๋์ง, ์ฌ์ฉ์ ์๋ด๊ฐ ํ ๋ฒ๋ง ํ์๋๋์ง ํ์ธํฉ๋๋ค. ํ๋ฉด ์ด๋ฒคํธ ์์ฒด๋ ์ค์ ๋ธ๋ผ์ฐ์ ์์๋ ๋ณ๋๋ก ๊ฒ์ฌํด์ผ ํฉ๋๋ค.
์ ์ก ์ค ๋ ๋ฒ ํด๋ฆญํ๋ ๊ฒฝ์ฐ์ ๋ค๋ฅธ ๋ฒํผ์ ๋๋ฅด๋ ๊ฒฝ์ฐ๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์์ ์ sending ํ๋๊ทธ๋ ํด๋น ๊ธฐ๋ฅ์ ์์ฒญ์ ํ๋๋ก ์ ํํ๋ ๊ตฌ์กฐ์ ๋๋ค. ์ฌ๋ฌ ๋ ๋ฆฝ ํผ์ ๋์์ ์ฌ์ฉํ ํ๋ฉด์ด๋ผ๋ฉด ํ๋์ ์ ์ญ ํ๋๊ทธ๊ฐ ๋ค๋ฅธ ๊ธฐ๋ฅ๊น์ง ๋ง์ ์ ์์ผ๋ฏ๋ก ํผ ๋จ์ ์ํ๋ฅผ ์ค๊ณํ์ธ์. ์์ ์ ๋ฒ์๋ฅผ ์ดํดํ ๋ค ํ์ฅํ๋ ํธ์ด ์ข์ต๋๋ค.
์๋ฒ๊ฐ ์ค๋ ์๋ตํ์ง ์๋ ์ํฉ์๋ ๊ธฐ๋ค๋ฆฌ๋ ์๋ด์ ์ทจ์ ์ ์ฑ ์ด ํ์ํ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ํ๋ฉด์ ๋ ๋ ๋ ์์ฒญ์ ์ทจ์ํ ์ง, ๊ฒฐ๊ณผ ํ์ธ์ ์ด์ด๊ฐ์ง ๊ฒฐ์ ํ์ธ์. ์์ฒญ์ ์ทจ์ํ๋ค๊ณ ์๋ฒ ์์ ๊น์ง ์ทจ์๋๋ค๊ณ ๋จ์ ํ ์๋ ์์ต๋๋ค. ํนํ ์ํ๋ฅผ ๋ฐ๊พธ๋ ์์ ์์๋ ํ์ ์กฐํ์ ์์ ์๋ณ์ ์ค๊ณ๋ฅผ ํจ๊ป ๊ฒํ ํฉ๋๋ค.
์๋ฌ ๊ธฐ๋ก์ ์ฌ์ฉ์ ํ๋ฉด๊ณผ ๊ฐ๋ฐ์ ๋ก๊ทธ๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ํ๋ฉด์๋ ์๊ธฐ ์ฌ์ด ์๋ด๋ฅผ ์ ๊ณตํ๊ณ ๋ก๊ทธ์๋ ์ํ ์ฝ๋์ ์คํจ ๋จ๊ณ ๋ฑ ์ฌํ์ ํ์ํ ์ ๋ณด๋ฅผ ๋จ๊น๋๋ค. ์๋ฒ๊ฐ ๋ณด๋ธ ์คํ ์ถ์ ์ด๋ ์ธ์ฆ ๊ฐ์ ๊ทธ๋๋ก ํ์ํ์ง ๋ง์ธ์. ๊ณตํต ์ค๋ฅ ํ์์ ์ฌ์ฉํ๋ API๋ผ๋ฉด ํด๋ผ์ด์ธํธ๋ ๊ทธ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฅด๋๋ก ๋ง์ถฅ๋๋ค.
๋ฐฐํฌ ํ์๋ ์ JavaScript๊ฐ ์ค์ ๋ก๋๋๋์ง๋ ํ์ธํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์บ์์ ์ด์ ํ์ผ์ด ๋จ์ผ๋ฉด ์ฝ๋๋ฅผ ๊ณ ์ณค๋๋ฐ ๊ฐ์ ์ฆ์์ด ๋ณด์ผ ์ ์์ต๋๋ค. ํ์ผ ๋ฒ์ ๊ณผ ์์ฒญ ๊ฒฝ๋ก๋ฅผ ๋์กฐํ๊ณ ์ ์ยท์คํจ ํ ์คํธ๋ฅผ ํ ๋ฒ์ฉ ๋ฐ๋ณตํ์ธ์. ํ ์คํธ๊ฐ ํต๊ณผํ ๋ฒ์๋ง ๊ธฐ๋กํ๋ฉด HTML ํ๋ฉด, ๋คํธ์ํฌ ์ ์ฑ ๊ณผ ์๋ฒ ์ ์ฅ ๋์์ ๋ฏธํ์ธ ์์ญ์ ๋ถ๋ช ํ ์ ์ ์์ต๋๋ค.
8. ๋ฐ๋ผ ํ๋ ์์
๋ช ๋ น๊ณผ ์ฝ๋๋ ํ์ต์ฉ์ ๋๋ค. ์ค๋ช ์ ํ์๋ ์คํ ํ๊ฒฝ์ ๊ตฌ๋ถํ๊ณ ์ ์ํ ํด๋ ๋๋ ๋ชจ์ ์ ๋ ฅ์ผ๋ก ์์ํ์ธ์.
์์ ์ฝ๋
async function readApiResult(response) {
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const type = response.headers.get('content-type') || '';
if (!type.toLowerCase().includes('application/json')) {
throw new Error('JSON ์๋ต์ด ์๋๋๋ค');
}
const data = await response.json();
if (!data || data.success !== true) {
throw new Error('์์
์ฑ๊ณต์ ํ์ธํ์ง ๋ชปํ์ต๋๋ค');
}
return data;
}
let sending = false;
async function submitWithState(button, requestFactory) {
if (sending) return;
sending = true;
button.disabled = true;
try {
return await readApiResult(await requestFactory());
} finally {
sending = false;
button.disabled = false;
}
}
// ํธ์ถ ์: ๊ธฐ์กด submit ์ฒ๋ฆฌ ์์์ catch๋ก ์ฌ์ฉ์ ์๋ด๋ฅผ ํ์ํ์ธ์.
// await submitWithState(button, () => fetch(url, existingRequestOptions));9. ๊ฒ์ฆ ๊ฒฐ๊ณผ์ ํด์
| ํ์ธ ํญ๋ชฉ | ๊ฒฐ๊ณผ ๋๋ ๊ฒ์ฆ ๋ฒ์ |
|---|---|
| 200 + ์ฌ๋ฐ๋ฅธ JSON | ์ฑ๊ณต ๋ฐ์ดํฐ ๋ฐํ |
| 500 ์๋ต | HTTP ์ค๋ฅ๋ก ๊ตฌ๋ถ |
| 200 + HTML | JSON ํ์ ์ค๋ฅ๋ก ๊ตฌ๋ถ |
| 200 + ์๋ชป๋ JSON | ํ์ฑ ์คํจ |
| ์ฐ๊ฒฐ ์คํจ | ์์ธ ์ ๋ฌ ยท ๋ฒํผ ๋ณต๊ตฌ |
| ๋์ ๋ ํธ์ถ | ์ ์ก ํจ์ ํ ๋ฒ ํธ์ถ |
Node.js์ Response ๊ฐ์ฒด์ ๋ชจ์ ์์ฒญ์ผ๋ก ๋ถ๊ธฐยท๋ฒํผ ๋ณต๊ตฌยท์ค๋ณต ํธ์ถ์ ๊ฒ์ฆํ์ต๋๋ค. ์ค์ ๋ธ๋ผ์ฐ์ DOM, CORS์ ์ด์ ๋๊ธ API๋ ๊ฒ์ฆํ์ง ์์์ต๋๋ค.
10. ์์ฃผ ๋ฌป๋ ์ง๋ฌธ
catch๋ง ์์ผ๋ฉด 500์ ์ก๋์?
fetch ์์ฒด์ ๊ฑฐ์ ๊ณผ HTTP ์ค๋ฅ๋ ๋ค๋ฆ ๋๋ค. ์๋ต ์ํ๋ฅผ ํ์ธํ๊ณ ํ์ํ๋ฉด ์ง์ ์ค๋ฅ๋ฅผ ๋ฐ์์์ผ์ผ ํฉ๋๋ค.
๋ฒํผ์ ๋ง์ผ๋ฉด ์ค๋ณต ๋๊ธ์ด ์์ ํ ์ฌ๋ผ์ง๋์?
์๋๋๋ค. ๋ค๋ฅธ ํญ๊ณผ ์ฌ์๋๋ ์๋ฒ์์๋ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. ๋ฒํผ์ UI ์์ค์ ์ ์ด์ ๋๋ค.
์ฑ๊ณต ์ ์ ์ ๋ ฅ์ ๋น์๋ ๋๋์?
์คํจ ์ ์์ฑ ๋ด์ฉ์ ์์ ์ ์์ต๋๋ค. ์ฑ๊ณต ํ์ธ ์ดํ ์ด๊ธฐํํ๊ณ ์ค๋ฅ๊ฐ ๋๋ฉด ์ ๋ ฅ์ ์ ์งํ๋ ๋ฐฉํฅ์ ๊ฒํ ํ์ธ์.
11. ๊ณต์ ์ฐธ๊ณ ์๋ฃ
๋์ ์ ์์ ์ต์ ์ ์๋ ์ ์์ ๋ฌธ์์์ ํ์ธํ ์ ์์ต๋๋ค. ๋ณธ๋ฌธ์ ์ฌ๋ก์ ์์ ๋ ํ์ต์ ์ํด ๋ ๋ฆฝ์ ์ผ๋ก ๊ตฌ์ฑํ์ต๋๋ค.
์์ ์ ๋ ฅ์ ํ์ต์ฉ ๋ชจ์ ์๋ฃ์ ๋๋ค. ์ค์ ํ๊ฒฝ์ ์ ์ฉํ ๋๋ ๋ณธ๋ฌธ์ ์๋ดํ ๊ฒ์ฆ ๋ฒ์์ ์กฐ๊ฑด์ ํ์ธํ์ธ์.
๐ฌ ๋๊ธ 0๊ฐ