*๏ธโฃAJAX
- Asynchronous JavaScript And XML (๋น๋๊ธฐ์ JavaScript์ XML)
- ์๋ฒ์ ํต์ ํ๊ธฐ ์ํด XMLHttpRequest ๊ฐ์ฒด๋ฅผ ํ์ฉ
- JSON, XML, HTML ๊ทธ๋ฆฌ๊ณ ์ผ๋ฐ ํ
์คํธ ํ์ ๋ฑ์ ํฌํจํ ๋ค์ํ ํฌ๋งท์ ์ฃผ๊ณ ๋ฐ์ ์ ์์
- [์ฐธ๊ณ ] AJAX์ X๊ฐ XML์ ์๋ฏธํ๊ธด ํ์ง๋ง, ์์ฆ์ ๋ ๊ฐ๋ฒผ์ด ์ฉ๋๊ณผ JavaScript์ ์ผ๋ถ๋ผ ๋ ์ฅ์ ๋๋ฌธ์ JSON์ ๋ ๋ง์ด ์ฌ์ฉํจ
|ํน์ง
- ํ์ด์ง ์ ์ฒด๋ฅผ reload(์๋ก ๊ณ ์นจ)๋ฅผ ํ์ง ์๊ณ ์๋ ์ํ๋๋ โ๋น๋๊ธฐ์ฑโ
- ์๋ฒ์ ์๋ต์ ๋ฐ๋ผ ์ ์ฒด ํ์ด์ง๊ฐ ์๋ ์ผ๋ถ๋ถ๋ง์ ์ ๋ฐ์ดํธ ํ ์ ์์
- AJAX์ ์ฃผ์ ๋๊ฐ์ง ํน์ง์ ์๋์ ์์ ์ ํ ์ ์๊ฒ ํด์ค
- ํ์ด์ง ์๋ก ๊ณ ์นจ ์์ด ์๋ฒ์ ์์ฒญ
- ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ณ ์์ ์ ์ํ
|XMLHttpRequest ๊ฐ์ฒด
- ์๋ฒ์ ์ํธ ์์ฉํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ฉฐ ์ ์ฒด ํ์ด์ง์ ์๋ก ๊ณ ์นจ ์์ด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ฌ ์ ์์
- ์ฌ์ฉ์์ ์์ ์ ๋ฐฉํดํ์ง ์์ผ๋ฉด์ ํ์ด์ง ์ผ๋ถ๋ฅผ ์ ๋ฐ์ดํธ ํ ์ ์์
- ์ฃผ๋ก AJAX ํ๋ก๊ทธ๋๋ฐ์ ์ฌ์ฉ
- ์ด๋ฆ๊ณผ ๋ฌ๋ฆฌ XML๋ฟ๋ง ์๋๋ผ ๋ชจ๋ ์ข ๋ฅ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ฌ ์ ์์
- ์์ฑ์
- XMLHttpRequest()
|XMLHttpRequest ์์
- console์ todo ๋ฐ์ดํฐ๊ฐ ์ถ๋ ฅ๋์ง ์์
- ๋ฐ์ดํฐ ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ console.log() ๋ฅผ ๋จผ์ ์คํํ๊ธฐ ๋๋ฌธ
//์๋ ์ ์ฐ๋ ๋ฐฉ์์..
const request = new XMLHttpRequest()
const URL = '<https://jsonplaceholder.typicode.com/todos/1/>'
request.open('GET',URL)
request.send()
const todo = request.response
console.log(`data: ${todo}`)
*๏ธโฃAsynchronous JavaScript
|๋๊ธฐ์
- ์์ฐจ์ , ์ง๋ ฌ์ Task ์ํ
- ์์ฒญ์ ๋ณด๋ธ ํ ์๋ต์ ๋ฐ์์ผ๋ง ๋ค์ ๋์์ด ์ด๋ฃจ์ด์ง (blocking)

<button>๋ฒํผ<button>
<script>
const btn = document.querySelector('button')
btn.addEventListener('click', function() {
alert('you click me!')
const pElem = document.createElement('p')
pElem.innerText = 'sample text'
document.body.appendChild(pElem)
})
</script>
๋ฒํผ ํด๋ฆญ ํ alert ๋ฉ์ธ์ง์ ํ์ธ ๋ฒํผ ๋๋ฅผ ๋ ๊น์ง ๋ฌธ์ฅ์ด ๋ง๋ค์ด ์ง์ง ์์!
|๋น๋๊ธฐ์(Asynchronous)
- ๋ณ๋ ฌ์ Task ์ํ
- ์์ฒญ์ ๋ณด๋ธ ํ ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค์ ๋์์ด ์ด๋ฃจ์ด์ง (non-blocking)

const request = new XMLHttpRequest()
const URL = '<https://jsonplaceholder.typicode.com/todos/1/>'
request.open('GET',URL)
request.send()
const todo = request.response
console.log(`data: ${todo}`)
- ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค์ ์ฝ๋ ์คํ.
- ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ณ์ todo์ ์๋ต ๋ฐ์ดํฐ ํ ๋น๋์ง ์๊ณ ๋น ๋ฌธ์์ด ์ถ๋ ฅ
- JavaScript๋ single threaded๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ค๋ฆฌ์ง ์๋ ๋ฐฉ์์ผ๋ก ๋์
|์ ๋น๋๊ธฐ์์ ์ฌ์ฉํ๋๊ฐ? === โ์ฌ์ฉ์ ๊ฒฝํโ
โข ๋งค์ฐ ํฐ ๋ฐ์ดํฐ๋ฅผ ๋๋ฐํ๋ ์ฑ์ด ์๋ค๊ณ ๊ฐ์
โข ๋๊ธฐ์ ์ฝ๋๋ผ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๋ถ๋ฌ์จ ๋ค ์ฑ์ด ์คํ๋จ
โข ์ฆ, ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๋ถ๋ฌ์ฌ ๋ ๊น์ง๋ ์ฑ์ด ๋ชจ๋ ๋ฉ์ถ ๊ฒ์ฒ๋ผ ๋ณด์
โข ์ฝ๋ ์คํ์ ์ฐจ๋จํ์ฌ ํ๋ฉด์ด ๋ฉ์ถ๊ณ ์๋ตํ์ง ์๋ ๊ฒ ๊ฐ์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณต
โข ๋น๋๊ธฐ์ ์ฝ๋๋ผ๋ฉด ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๊ณ ์๋ต ๋ฐ๋ ๋์, ์ฑ ์คํ์ ํจ๊ป ์งํํจ
โข ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ๋์ ์ง์์ ์ผ๋ก ์๋ตํ๋ ํ๋ฉด์ ๋ณด์ฌ์ค์ผ๋ก์จ ๋์ฑ ์พ์ ํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณต
โข ๋๋ฌธ์ ๋ง์ ์น API ๊ธฐ๋ฅ์ ํ์ฌ ๋น๋๊ธฐ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ์คํ๋จ
|Threads๋?
- ํ๋ก๊ทธ๋จ์ด ์์ ์ ์๋ฃํ๊ธฐ ์ํด ์ฌ์ฉํ ์ ์๋ ๋จ์ผ ํ๋ก์ธ์ค
- ๊ฐ thread(์ค๋ ๋)๋ ํ ๋ฒ์ ํ๋์ ์์ ๋ง ์ํํ ์ ์์
- ์์) Task A โ Task B โ Task C
- ๋ค์ ์์ ์ ์์ํ๋ ค๋ฉด ๋ฐ๋์ ์์ ์์ ์ด ์๋ฃ๋์ด์ผ ํจ
- ์ปดํจํฐ CPU๋ ์ฌ๋ฌ ์ฝ์ด๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ํ ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง ์ผ์์ฒ๋ฆฌํ ์ ์์
|โJavaScript๋ single threaded ์ด๋ค.โ
- ์ปดํจํฐ๊ฐ ์ฌ๋ฌ ๊ฐ์ CPU๋ฅผ ๊ฐ์ง๊ณ ์์ด๋ main thread๋ผ ๋ถ๋ฆฌ๋ ๋จ์ผ ์ค๋ ๋์์๋ง ์์ ์ํ
- ์ฆ, ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ Call Stack์ด ํ๋์ธ ์ธ์ด๋ผ๋ ์๋ฏธ
- ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด JavaScript๋
- ์ฆ์ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ ์ด๋ฒคํธ๋ค์ **๋ค๋ฅธ ๊ณณ(Web API)**์ผ๋ก ๋ณด๋ด์ ์ฒ๋ฆฌํ๋๋ก ํ๊ณ ,
- ์ฒ๋ฆฌ๋ ์ด๋ฒคํธ๋ค์ ์ฒ๋ฆฌ๋ ์์๋๋ก **๋๊ธฐ์ค(Task queue)**์ ์ค์ ์ธ์ ๋๊ณ
- Call Stack์ด ๋น๋ฉด **๋ด๋น์(Event Loop)**๊ฐ ๋๊ธฐ ์ค์์ ๊ฐ์ฅ ์ค๋๋(์ ์ผ ์์) ์ด๋ฒคํธ๋ฅผ Call Stack์ผ๋ก ๋ณด๋
|Concurrency model
- Event loop๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๋์์ฑ ๋ชจ๋ธ(Concurrency model)
- Call Stack
- ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ํด๋น ์์ฒญ์ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ Stack(LIFO) ํํ์ ์๋ฃ ๊ตฌ์กฐ
- Web API (Browser API)
- JavaScript ์์ง์ด ์๋ ๋ธ๋ผ์ฐ์ ์์ญ์์ ์ ๊ณตํ๋ API
- setTimeout(), DOM events ๊ทธ๋ฆฌ๊ณ AJAX๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์๊ฐ์ด ์์๋๋ ์ผ๋ค์ ์ฒ๋ฆฌ
- Task Queue (Event Queue, Message Queue)
- ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ callback ํจ์๊ฐ ๋๊ธฐํ๋ Queue(FIFO) ํํ์ ์๋ฃ
- main thread๊ฐ ๋๋ ํ ์คํ๋์ด ํ์ JavaScript ์ฝ๋๊ฐ ์ฐจ๋จ๋๋ ๊ฒ์ ๋ฐฉ์ง
- Event Loop
- Call Stack์ด ๋น์ด ์๋์ง ํ์ธ
- ๋น์ด ์๋ ๊ฒฝ์ฐ Task Queue์์ ์คํ ๋๊ธฐ ์ค์ธ callback ํจ์๊ฐ ์๋์ง ํ์ธ
- Task Queue์ ๋๊ธฐ ์ค์ธ callback ํจ์๊ฐ ์๋ค๋ฉด ๊ฐ์ฅ ์์ ์๋ callback ํจ์๋ฅผ Call Stack์ผ๋ก push
console.log('Hello SSAFY!')
setTimeout(function(){
console.log('I am from setTimeout')
}, 10000)
console.log('Bye SSAFY!')
Call Stack์ ๋จผ์ console.log('Hello SSAFY!') ๊ฐ ๋ค์ด๊ฐ ์คํ๋ ํ ๋น์์ง๋ค.
๊ทธ ํ setTimeout()์ด ๋ค์ด๊ฐ์ง๋ง, setTimeout()์ ๊ฒฝ์ฐ
AJAX๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์๊ฐ์ด ์์๋๋ ์ผ๋ค์ Web API๋ก ๋ณด๋ธ๋ค.
๊ทธ๋ฆฌ๊ณ Call Stack์ console.log('Bye SSAFY!')์ด ์คํ๋ ํ ๋น์์ง๋ค.
Web API๋ก ๋ณด๋ด์ง setTimeout()์ Task Queue๋ก ๋ณด๋ด์ง๋๋ฐ,
Event Loop๊ฐ Call Stack์ console.log('Bye SSAFFY!')๊ฐ ์คํํ ๋น์์ง๋ ๊ฑธ ํ์ธ ํ
Call Stack์ setTimeout()์ pushํด์ค๋ค.
//์คํ๊ฒฐ๊ณผ
Hello SSAFY!
Bye SSAFY!
I am from setTimeout
|Zero delays
- ์ค์ ๋ก 0ms ํ์ callback ํจ์๊ฐ ์์๋๋ค๋ ์๋ฏธ๊ฐ ์๋
- ์คํ์ Task Queue์ ๋๊ธฐ ์ค์ธ ์์ ์์ ๋ฐ๋ผ ๋ค๋ฅด๋ฉฐ ํด๋น ์์์์๋callback ํจ์์ ๋ฉ์์ง๊ฐ ์ฒ๋ฆฌ๋๊ธฐ ์ ์ โHiโ์ โByeโ๊ฐ ๋จผ์ ์ถ๋ ฅ๋จ
- ์๋ํ๋ฉด delay(์ง์ฐ)๋ JavaScript๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐ ํ์ํ ์ต์ ์๊ฐ์ด๊ธฐ ๋๋ฌธ(๋ณด์ฅ๋ ์๊ฐ์ด ์๋)
- ๊ธฐ๋ณธ์ ์ผ๋ก setTimeout ํจ์์ ํน์ ์๊ฐ ์ ํ์ ์ค์ ํ๋๋ผ๋ ๋๊ธฐ ์ค์ธ ๋ฉ์์ง์ ๋ชจ๋ ์ฝ๋๊ฐ ์๋ฃ๋ ๋๊น์ง ๋๊ธฐํด์ผ ํจ
|์์ฐจ์ ์ธ ๋น๋๊ธฐ ์ฒ๋ฆฌํ๊ธฐ
- Web API๋ก ๋ค์ด์ค๋ ์์๋ ์ค์ํ์ง ์๊ณ , ์ด๋ค ์ด๋ฒคํธ๊ฐ ๋จผ์ ์ฒ๋ฆฌ๋๋๋๊ฐ ์ค์ (์ฆ, ์คํ ์์ ๋ถ๋ช ํ)
- ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์์ฐจ์ ์ธ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํ 2๊ฐ์ง ์์ฑ ๋ฐฉ์
- Async callbacks โข ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ์ ์์ํ ํจ์๋ฅผ ํธ์ถํ ๋ ์ธ์๋ก ์ง์ ๋ ํจ์ โข ์์) addEventListener() ์ ๋ ๋ฒ์งธ ์ธ์
- promise-style โข Modern Web APIs์์์ ์๋ก์ด ์ฝ๋ ์คํ์ผ โข XMLHttpRequest ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ตฌ์กฐ๋ณด๋ค ์กฐ๊ธ ๋ ํ๋์ ์ธ ๋ฒ์
'Language > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JavaScript - DOM(Document Object Model) (0) | 2022.05.03 |
---|---|
JavaScript - Asynchronous JavaScript(์ฝ๋ฐฑํจ์, Async callbacks,Promise), Axios (0) | 2022.05.03 |
JavaScript - ํ๋กํ ํ์ (prototype), ํด๋์ค(class) (0) | 2022.05.03 |
JavaScript - this (0) | 2022.05.02 |
JavaScript - ๊ฐ์ฒด(Objects) (0) | 2022.04.27 |
๋๊ธ