Search

XMLHttpRequest

XMLHttpRequest

XMLHttpRequestλŠ” λΈŒλΌμš°μ €μ—μ„œ μ œκ³΅ν•˜λŠ” 객체둜, λΉ„λ™κΈ°μ μœΌλ‘œ μ„œλ²„μ™€ 톡신할 수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€. μ΄ˆκΈ°μ— 주둜 μ‚¬μš©λ˜μ—ˆμœΌλ‚˜, 콜백 지ν–₯적이고 λ³΅μž‘ν•œ API ꡬ쑰둜 인해 가독성이 λ–¨μ–΄μ§€λŠ” 단점이 μžˆμŠ΅λ‹ˆλ‹€.
λΈŒλΌμš°μ €
node
μ‹€ν–‰ μ—¬λΆ€
λΈŒλΌμš°μ €μ˜ 객체이기 λ•Œλ¬Έμ—, node λŸ°νƒ€μž„ ν™˜κ²½μ—μ„œλŠ” μ‹€ν–‰ λΆˆκ°€

μ£Όμš” 속성 및 λ©”μ†Œλ“œ

속성 λ˜λŠ” λ©”μ†Œλ“œ
μ„€λͺ…
onreadystatechange
응닡 μƒνƒœκ°€ 변경될 λ•Œ ν˜ΈμΆœλ˜λŠ” 이벀트 ν•Έλ“€λŸ¬.
readyState
ν˜„μž¬ μš”μ²­ μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄λŠ” 속성 (0~4κΉŒμ§€μ˜ κ°’). - UNSENT (0) : open() 호좜 μ „ - OPENED (1) : open() 호좜된 μƒνƒœ - HEADERS_RECEIVED (2) : 응닡 헀더λ₯Ό μˆ˜μ‹  - LOADING (3) : 응닡 데이터λ₯Ό κ°€μ Έμ˜€κ³  μžˆλŠ” μƒνƒœ - DONE (4) : μš”μ²­ μ™„λ£Œ
status
μ‘λ‹΅μ˜ HTTP μƒνƒœ μ½”λ“œλ₯Ό λ‚˜νƒ€λ‚΄λŠ” 속성.
statusText
HTTP μƒνƒœ μ½”λ“œμ— λŒ€μ‘ν•˜λŠ” ν…μŠ€νŠΈλ₯Ό λ‚˜νƒ€λ‚΄λŠ” 속성.
response
μ„œλ²„ 응닡 데이터λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 속성.
responseText
μ„œλ²„ 응닡 데이터λ₯Ό λ¬Έμžμ—΄λ‘œ λ‚˜νƒ€λ‚΄λŠ” 속성.
responseType
μ„œλ²„ 응닡 λ°μ΄ν„°μ˜ ν˜•μ‹μ„ λ‚˜νƒ€λ‚΄λŠ” 속성.
open(method, url, async, user, password)
μš”μ²­μ„ μ΄ˆκΈ°ν™”ν•˜κ³  μ„œλ²„μ— 보낼 μ€€λΉ„λ₯Ό ν•©λ‹ˆλ‹€.
setRequestHeader(header, value)
HTTP 헀더λ₯Ό μ„€μ •ν•˜λŠ” λ©”μ†Œλ“œ.
send(data)
μ„œλ²„μ— μš”μ²­μ„ λ³΄λƒ…λ‹ˆλ‹€.
abort()
ν˜„μž¬μ˜ 비동기 μš”μ²­μ„ μ·¨μ†Œν•©λ‹ˆλ‹€.

XMLHttpRequest GET μš”μ²­

// XMLHttpRequest 객체 생성 var xhr = new XMLHttpRequest(); // 이벀트 ν•Έλ“€λŸ¬ 등둝 xhr.onreadystatechange = function() { // xhr.readyState : ν΄λΌμ΄μ–ΈνŠΈμ˜ μ€€λΉ„ μƒνƒœ λ³€μˆ˜ // - UNSENT : open() 호좜 μ „ // - OPENED : open() 호좜된 μƒνƒœ // - HEADERS_RECEIVED : 응닡 헀더λ₯Ό μˆ˜μ‹  // - LOADING : 응닡 데이터λ₯Ό κ°€μ Έμ˜€κ³  μžˆλŠ” μƒνƒœ // - DONE : μš”μ²­ μ™„λ£Œ if (xhr.readyState === XMLHttpRequest.DONE) { // xhr.status : 응닡 μƒνƒœ μ½”λ“œ // ex) 200, 404, 500 // μš”μ²­μ΄ μ™„λ£Œλ˜λ©΄ μ‹€ν–‰λ˜λŠ” μ½”λ“œ if (xhr.status === 200) { // μ„±κ³΅μ μœΌλ‘œ 응닡 λ°›μ•˜μ„ λ•Œμ˜ μ½”λ“œ console.log(xhr.responseText); } else { // 였λ₯˜ 처리 μ½”λ“œ console.error('Request failed with status:', xhr.status); } } }; var url = 'https://httpbin.org/get' // μš”μ²­ μ—΄κΈ°(μ„€μ •) // xhr.open("μš”μ²­λ©”μ†Œλ“œ", url, 비동기여뢀) xhr.open('GET', url, true); // μš”μ²­ 전솑 xhr.send();
JavaScript
볡사

μ‹€ν–‰κ²°κ³Ό

{ "args": {}, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate, br", "Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7", "Host": "httpbin.org", "Origin": "http://127.0.0.1:5500", "Referer": "http://127.0.0.1:5500/", "Sec-Ch-Ua": "\"Google Chrome\";v=\"119\", \"Chromium\";v=\"119\", \"Not?A_Brand\";v=\"24\"", "Sec-Ch-Ua-Mobile": "?0", "Sec-Ch-Ua-Platform": "\"Windows\"", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "cross-site", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36", "X-Amzn-Trace-Id": "Root=1-655b60e2-57ef9dad6ab79a802f252116" }, "origin": "xxx.xxx.xxx.xxx", "url": "https://httpbin.org/get" }
JavaScript
볡사

XMLHttpRequest POST μš”μ²­

// XMLHttpRequest 객체 생성 var xhr = new XMLHttpRequest(); // 이벀트 ν•Έλ“€λŸ¬ 등둝 xhr.onreadystatechange = function() { // xhr.readyState : ν΄λΌμ΄μ–ΈνŠΈμ˜ μ€€λΉ„ μƒνƒœ λ³€μˆ˜ // - UNSENT : open() 호좜 μ „ // - OPENED : open() 호좜된 μƒνƒœ // - HEADERS_RECEIVED : 응닡 헀더λ₯Ό μˆ˜μ‹  // - LOADING : 응닡 데이터λ₯Ό κ°€μ Έμ˜€κ³  μžˆλŠ” μƒνƒœ // - DONE : μš”μ²­ μ™„λ£Œ if (xhr.readyState === XMLHttpRequest.DONE) { // xhr.status : 응닡 μƒνƒœ μ½”λ“œ // ex) 200, 404, 500 // μš”μ²­μ΄ μ™„λ£Œλ˜λ©΄ μ‹€ν–‰λ˜λŠ” μ½”λ“œ if (xhr.status === 200) { // μ„±κ³΅μ μœΌλ‘œ 응닡 λ°›μ•˜μ„ λ•Œμ˜ μ½”λ“œ console.log(xhr.responseText); } else { // 였λ₯˜ 처리 μ½”λ“œ console.error('Request failed with status:', xhr.status); } } }; var url = 'https://httpbin.org/post' var data = { name : 'aloha', age : 20 } // μš”μ²­ μ—΄κΈ°(μ„€μ •) // xhr.open("μš”μ²­λ©”μ†Œλ“œ", url, 비동기여뢀) xhr.open('POST', url, true); // 헀더 μ„€μ • xhr.setRequestHeader('Content-Type', 'application/json') // μš”μ²­ 전솑 xhr.send(JSON.stringify(data));
JavaScript
볡사

μ‹€ν–‰ κ²°κ³Ό

{ "args": {}, "data": "{\"name\":\"aloha\",\"age\":20}", "files": {}, "form": {}, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate, br", "Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7", "Content-Length": "25", "Content-Type": "application/json", "Host": "httpbin.org", "Origin": "http://127.0.0.1:5500", "Referer": "http://127.0.0.1:5500/", "Sec-Ch-Ua": "\"Google Chrome\";v=\"119\", \"Chromium\";v=\"119\", \"Not?A_Brand\";v=\"24\"", "Sec-Ch-Ua-Mobile": "?0", "Sec-Ch-Ua-Platform": "\"Windows\"", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "cross-site", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36", "X-Amzn-Trace-Id": "Root=1-655b612b-0a60ebfc7d3c9d996882398d" }, "json": { "age": 20, "name": "aloha" }, "origin": "xxx.xxx.xxx.xxx", "url": "https://httpbin.org/post" }
JavaScript
볡사

μ‚¬μš© λͺ©μ 

β€’
λΉ„λ™κΈ°μ μœΌλ‘œ μ„œλ²„μ™€ ν†΅μ‹ ν•˜μ—¬ 데이터λ₯Ό μš”μ²­ν•˜κ³  응닡을 μ²˜λ¦¬ν•©λ‹ˆλ‹€.
β€’
λ™μ μœΌλ‘œ νŽ˜μ΄μ§€μ˜ 일뢀λ₯Ό μ—…λ°μ΄νŠΈν•˜κ±°λ‚˜ 데이터λ₯Ό λ‘œλ“œν•˜μ—¬ νŽ˜μ΄μ§€λ₯Ό μƒˆλ‘œ κ³ μΉ˜μ§€ μ•Šκ³  λ³€κ²½ν•©λ‹ˆλ‹€.
β€’
μ„œλ²„λ‘œλΆ€ν„° 데이터λ₯Ό λ°›μ•„μ™€μ„œ λ™μ μœΌλ‘œ μ›Ή νŽ˜μ΄μ§€μ˜ λ‚΄μš©μ„ κ°±μ‹ ν•©λ‹ˆλ‹€.
β€’
μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ‚¬μš©μžμ™€ μƒν˜Έ μž‘μš©ν•˜λ©΄μ„œ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μ„œλ²„μ™€ 데이터λ₯Ό κ΅ν™˜ν•©λ‹ˆλ‹€.
μ΄λŸ¬ν•œ νŠΉμ§•μœΌλ‘œ XMLHttpRequestλŠ” ν΄λΌμ΄μ–ΈνŠΈ μΈ‘μ—μ„œ μ„œλ²„μ™€μ˜ 톡신을 효과적으둜 μˆ˜ν–‰ν•˜λŠ”λ° μ‚¬μš©λ©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ ν˜„λŒ€μ˜ μ›Ή κ°œλ°œμ—μ„œλŠ” Fetch API와 같은 μƒˆλ‘œμš΄ 기술이 λ‚˜μ˜€λ©΄μ„œ λ”μš± κ°•λ ₯ν•˜κ³  μ‚¬μš©ν•˜κΈ° μ‰¬μš΄ λŒ€μ•ˆμ΄ 되고 μžˆμŠ΅λ‹ˆλ‹€.