inspeep

๋Œ“๊ธ€ ์ „์†ก ๋ฒ„ํŠผ์ด ๋ฉˆ์ถœ ๋•Œ: fetch ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์™€ ์ค‘๋ณต ์ œ์ถœ ๋ฐฉ์ง€ํ•˜๊ธฐ

์กฐํšŒ ์ˆ˜ 8
์ถ”์ฒœ ์ˆ˜ 0
๋Œ“๊ธ€ 0

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 + HTMLJSON ํ˜•์‹ ์˜ค๋ฅ˜๋กœ ๊ตฌ๋ถ„
200 + ์ž˜๋ชป๋œ JSONํŒŒ์‹ฑ ์‹คํŒจ
์—ฐ๊ฒฐ ์‹คํŒจ์˜ˆ์™ธ ์ „๋‹ฌ ยท ๋ฒ„ํŠผ ๋ณต๊ตฌ
๋™์‹œ ๋‘ ํ˜ธ์ถœ์ „์†ก ํ•จ์ˆ˜ ํ•œ ๋ฒˆ ํ˜ธ์ถœ

Node.js์˜ Response ๊ฐ์ฒด์™€ ๋ชจ์˜ ์š”์ฒญ์œผ๋กœ ๋ถ„๊ธฐยท๋ฒ„ํŠผ ๋ณต๊ตฌยท์ค‘๋ณต ํ˜ธ์ถœ์„ ๊ฒ€์ฆํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ € DOM, CORS์™€ ์šด์˜ ๋Œ“๊ธ€ API๋Š” ๊ฒ€์ฆํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

10. ์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ

catch๋งŒ ์žˆ์œผ๋ฉด 500์„ ์žก๋‚˜์š”?

fetch ์ž์ฒด์˜ ๊ฑฐ์ ˆ๊ณผ HTTP ์˜ค๋ฅ˜๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์‘๋‹ต ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ณ  ํ•„์š”ํ•˜๋ฉด ์ง์ ‘ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฒ„ํŠผ์„ ๋ง‰์œผ๋ฉด ์ค‘๋ณต ๋Œ“๊ธ€์ด ์™„์ „ํžˆ ์‚ฌ๋ผ์ง€๋‚˜์š”?

์•„๋‹™๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํƒญ๊ณผ ์žฌ์‹œ๋„๋Š” ์„œ๋ฒ„์—์„œ๋„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„ํŠผ์€ UI ์ˆ˜์ค€์˜ ์ œ์–ด์ž…๋‹ˆ๋‹ค.

์„ฑ๊ณต ์ „์— ์ž…๋ ฅ์„ ๋น„์›Œ๋„ ๋˜๋‚˜์š”?

์‹คํŒจ ์‹œ ์ž‘์„ฑ ๋‚ด์šฉ์„ ์žƒ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ฑ๊ณต ํ™•์ธ ์ดํ›„ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋ฉด ์ž…๋ ฅ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐฉํ–ฅ์„ ๊ฒ€ํ† ํ•˜์„ธ์š”.

11. ๊ณต์‹ ์ฐธ๊ณ  ์ž๋ฃŒ

๋™์ž‘ ์ •์˜์™€ ์˜ต์…˜์€ ์•„๋ž˜ ์ œ์ž‘์ž ๋ฌธ์„œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณธ๋ฌธ์˜ ์‚ฌ๋ก€์™€ ์˜ˆ์ œ๋Š” ํ•™์Šต์„ ์œ„ํ•ด ๋…๋ฆฝ์ ์œผ๋กœ ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ ์ž…๋ ฅ์€ ํ•™์Šต์šฉ ๋ชจ์˜ ์ž๋ฃŒ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ํ™˜๊ฒฝ์— ์ ์šฉํ•  ๋•Œ๋Š” ๋ณธ๋ฌธ์— ์•ˆ๋‚ดํ•œ ๊ฒ€์ฆ ๋ฒ”์œ„์™€ ์กฐ๊ฑด์„ ํ™•์ธํ•˜์„ธ์š”.

๐Ÿ’ฌ ๋Œ“๊ธ€ 0๊ฐœ

IT ๊ฒŒ์‹œํŒ

๊ณต์ง€
Notice
๊ณต์ง€ inspeep ์ปค๋ฎค๋‹ˆํ‹ฐ ์ด์šฉ ๋ฐ ๊ฒŒ์‹œ๋ฌผ ๊ด€๋ฆฌ ๊ทœ์ • ์•ˆ๋‚ด
๐Ÿ‘ค ๊ด€๋ฆฌ์ž ๐Ÿ“… 2026.04.15 ๐Ÿ‘€ ์กฐํšŒ 57 ๐Ÿ‘ ์ถ”์ฒœ 0
BEST
์ธ๋„ค์ผ
BEST 2. ์ฝ”๋”ฉ ๋ฌธ์™ธํ•œ์˜ ์›Œ๋“œํ”„๋ ˆ์Šค ์ •๋ณต๊ธฐ: VS Code์™€ FTP์˜ ์Šต๊ฒฉ
๐Ÿ‘ค ๊ด€๋ฆฌ์ž ๐Ÿ“… 2026.03.05 ๐Ÿ‘€ ์กฐํšŒ 135 ๐Ÿ‘ ์ถ”์ฒœ 0
Random Pick
์ธ๋„ค์ผ
Random Pick ์˜คํ”ˆ์†Œ์Šค ๋ฐ”์ด๋ธŒ์ฝ”๋”ฉํ•˜๋‹ค๊ฐ€ ๊ณ ์†Œ๋‹นํ•œ ๊ฐœ๋ฐœ์ž ์‚ฌ๊ฑด
๐Ÿ‘ค ์ฅฌ๋ฉ”์กฐ๊ทœ ๐Ÿ“… 2026.08.03 ๐Ÿ‘€ ์กฐํšŒ 23 ๐Ÿ‘ ์ถ”์ฒœ 0
Random Pick
์ธ๋„ค์ผ
Random Pick GSM์•„๋ ˆ๋‚˜์˜ ๊ฐค๋Ÿญ์‹œ Z ํด๋“œ8 ๋ฆฌ๋ทฐ ์š”์•ฝ
๐Ÿ‘ค Cyan ๐Ÿ“… 2026.07.31 ๐Ÿ‘€ ์กฐํšŒ 15 ๐Ÿ‘ ์ถ”์ฒœ 0
๊ฐœ๋ฐœ
์ธ๋„ค์ผ
๋ฏธ์Šคํ„ฐ๋ฆฌํ•œ (์›€์งค ๋‹ค์ˆ˜) 1๋‹ฌ๊ฐ„์˜ ๊ฐœ๋ฐœ ์ผ์ง€
๐Ÿ‘ค Cyan ๐Ÿ“… 2026.06.27 ๐Ÿ‘€ ์กฐํšŒ 17 ๐Ÿ‘ ์ถ”์ฒœ 0
๊ฐœ๋ฐœ
์ธ๋„ค์ผ
์‚ฌ์ด๋‹ค ๊ฐ™์€ ๋ž˜ํ† ํ”ผ์•„ ๊ฐœ๋ฐœ์ผ์ง€ #38 - ๊ด€๊ด‘ ์‹œ์Šคํ…œ
๐Ÿ‘ค ๋””๋ก ๐Ÿ“… 2026.06.27 ๐Ÿ‘€ ์กฐํšŒ 20 ๐Ÿ‘ ์ถ”์ฒœ 0
๊ฐœ๋ฐœ
์ธ๋„ค์ผ
์ž์œ 
No Image
FastAPI์™€ Redis๋ฅผ ํ™œ์šฉํ•œ 1์ธ ๊ฐœ๋ฐœ์ž์˜ ๋ฐฑ์—”๋“œ ์ตœ์ ํ™” ์—ฌ์ •
๐Ÿ‘ค ์ธ์Šคํ”ผ ๐Ÿ“… 2026.06.17 ๐Ÿ‘€ ์กฐํšŒ 12 ๐Ÿ‘ ์ถ”์ฒœ 0
๊ฐœ๋ฐœ
์ธ๋„ค์ผ
๊ทน๊ฐ•์˜ ์‹ฑ๊ธ€๋ฒ™๊ธ€ ๊ตญ๋‚ด ๊ฒŒ์ž„๊ฐœ๋ฐœ์ž์˜ ๋ฏธ๋ž˜ ์˜ˆ์–ธ๊ธ€
๐Ÿ‘ค ์•ผ๋ฆฌํƒ€ ๐Ÿ“… 2026.06.15 ๐Ÿ‘€ ์กฐํšŒ 10 ๐Ÿ‘ ์ถ”์ฒœ 0
๋‰ด์Šค
์ธ๋„ค์ผ
์œ ๋ถ€๋‚จ ์ปดํ“จํ„ฐ ๋งŒ๋“ค๊ธฐ (์Šค์••)
๐Ÿ‘ค ๋ฆฌํ† ํƒ€ ๐Ÿ“… 2026.06.13 ๐Ÿ‘€ ์กฐํšŒ 13 ๐Ÿ‘ ์ถ”์ฒœ 0
๋‰ด์Šค
์ธ๋„ค์ผ
ํŒ์ฝ˜๊ฐ ์ปดํ“จํ„ฐ ์ผ€์ด์Šค ๋ชจ๋”ฉ ๋Œ€ํšŒ ์ถœํ’ˆ์ž‘
๐Ÿ‘ค Cyan ๐Ÿ“… 2026.06.10 ๐Ÿ‘€ ์กฐํšŒ 11 ๐Ÿ‘ ์ถ”์ฒœ 0
์ผ๋ฐ˜
์ธ๋„ค์ผ
์šด ์ข‹๊ฒŒ๋„ ์ƒ์ƒ์ดˆ์›” ์• ํ”Œ WWDC26 ์š”์•ฝ (1)~(4) - Platform Improvments
๐Ÿ‘ค Cyan ๐Ÿ“… 2026.06.09 ๐Ÿ‘€ ์กฐํšŒ 20 ๐Ÿ‘ ์ถ”์ฒœ 0
๊ฐœ๋ฐœ
์ธ๋„ค์ผ
๊ฐœ๋ฐœ
์ธ๋„ค์ผ
๋ˆˆ๋ถ€์‹  ๋ž˜ํ† ์นผ๋ฆฝ์Šค ๊ฐœ๋ฐœ์ผ์ง€ #9 - PlayX4 ์ „์‹œํ›„๊ธฐ
๐Ÿ‘ค ์•ผ๋ฆฌํƒ€ ๐Ÿ“… 2026.06.05 ๐Ÿ‘€ ์กฐํšŒ 11 ๐Ÿ‘ ์ถ”์ฒœ 0
๊ฐœ๋ฐœ
์ธ๋„ค์ผ
๊ณ ๊ตฌ๋งˆ ๋จน์€ ๋””์ง€ํƒญ ์–ธ์˜คํ”„ ๊ทธ ๊ฐœ๋ฐœ ๋น„ํ™” *์Šค์••์ฃผ์˜
๐Ÿ‘ค ๋ฆฌํ† ํƒ€ ๐Ÿ“… 2026.05.31 ๐Ÿ‘€ ์กฐํšŒ 8 ๐Ÿ‘ ์ถ”์ฒœ 0
๊ฐœ๋ฐœ
์ธ๋„ค์ผ
๋‡Œ๋นผ๊ณ  ์—ญ๋Œ€๊ธ‰ 5์›” ๊ฐœ๋ฐœ ์ผ์ง€ ๋ฐ ํ–ฅํ›„ ์ฝ˜ํ…์ธ  ์†Œ๊ฐœ
๐Ÿ‘ค ํ“จ๋ฉ”์ด์ฃ ์ด ๐Ÿ“… 2026.05.30 ๐Ÿ‘€ ์กฐํšŒ 13 ๐Ÿ‘ ์ถ”์ฒœ 0
« ์ฒ˜์Œ ‹ ์ด์ „ 1 2 3 4 5 6 7 ๋‹ค์Œ › ๋ »
โœ๏ธ ๊ธ€์“ฐ๊ธฐ