D+64
- ๋น๋๊ธฐํธ์ถ๋ก ์์ ์ ์ดํ๊ธฐ -
(๋น๋๊ธฐ vs ๋๊ธฐ ๊ทธ๋ฆฌ๊ณ ๋ ผ๋ธ๋กํน vs ๋ธ๋กํน,๋น๋๊ธฐ ์์์ ์ด)
๋น๋๊ธฐ vs ๋๊ธฐ ๊ทธ๋ฆฌ๊ณ ๋ ผ๋ธ๋กํน vs ๋ธ๋กํน
๋น๋๊ธฐ์ ๊ดํด ์์๋ณด๊ธฐ์ ์ ์ฐ๋ฆฌ๋ ๋๊ธฐ๋ฟ๋ง ์๋๋ผ ๋ธ๋กํน์ ๊ดํด์๋ ์์์ผํ ํ์๊ฐ ์๋ค.
์๋ก ๋น์ทํ์ง๋ง ๋ค๋ฅธ ํน์ง์ด ์์ผ๋ ์ ๊ธฐ์ตํด ๋์ด์ผ ํ๋ค.
• ๋๊ธฐ vs ๋น๋๊ธฐ : ์ฒ๋ฆฌํด์ผํ ์์ ๋ค์ ์ด๋ ํ ํ๋ฆ์ผ๋ก ์ฒ๋ฆฌํ ๊ฒ์ธ๊ฐ
• ๋ธ๋กํน vs ๋ ผ๋ธ๋กํน : ์ฒ๋ฆฌ๋์ด์ผํ๋ ์์ ์ด ์ ์ฒด์ ์ธ ์์ ์ ํ๋ฆ์ ๋ง๋๋ ์๋ง๋๋
์ด ๋๊ฐ์ง์ ๋ํด ๊ธฐ์ตํ ๋ 'ํ๋ฆ'์ ๋ํด์ ์ดํดํ๋ค๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
๋๊ธฐ (Synchronous)
๋๊ธฐ๋ฐฉ์์ ์์ฒญ์ด ๋ค์ด์์๋ ๋ค์ด์จ ์์๋๋ก ์ผ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก,
์์ ์ฌ์ง์ ์๋ก ๋ค์ด๋ณธ๋ค๋ฉด ๋ง์ฝ ๋๊ธฐ ๋ฐฉ์์ผ๋ก ์ปคํผ๋ฅผ ์ฃผ๋ฌธ๋ฐ๋๋ค๋ฉด
ํ์ฌ๋์ด ์ปคํผ๋ฅผ ์ฃผ๋ฌธํ๋ฉด ์ฃผ๋ฌธ๋ฐ์ ์ฌ๋์ด ์ปคํผ๋ฅผ ๋ฐ๋ก ๋ง๋ค๊ณ ๋ ํ์์ผ ๋ค์ ์ฃผ๋ฌธ์ ๋ฐ์ ๊ฒ์ด๋ค.
์ฆ, ํ ์๋์ด ์๋ฃ๋ฅผ ์ฃผ๋ฌธํ๋ฉด ๋ค๋ฅธ ์ฃผ๋ฌธ์ ํ๊บผ๋ฒ์ ๋ฐ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์
์์ฐจ์ ์ผ ์๋ ์์ผ๋ ์ผ์ ์ฒ๋ฆฌํ๋๋ฐ ๊ฝค๋ ๊ธด ์๊ฐ์ด ๊ฑธ๋ฆด๊ฒ์ด๋ค.
๋น๋๊ธฐ (Asynchronous)
๋น๋๊ธฐ ๋ฐฉ์์ ์์ฒญ์ ๋ฐ๋ฅธ ์๋ต์ ์ฆ์ ์ฒ๋ฆฌํ์ง ์์๋, ๋์๊ธฐ๊ฐ ๋์ ๋๋ค๋ฅธ ์์ฒญ์ ๋ํ ์๋ต์ ์ฒ๋ฆฌํ ์ ์๋ ๋ฐฉ์์ด๋ค.
๋ง์ฝ ๋น๋๊ธฐ๋ฐฉ์์ผ๋ก ์๋์ด ์ปคํผ๋ฅผ ์ฃผ๋ฌธํ๋ฉด ์ปคํผ๋ฅผ ์ฃผ๋ฌธ๋ฐ๋ ์ฌ๋์ด ์ปคํผ๋ฅผ ๋ง๋๋ ์ฌ๋์๊ฒ ์ผ์ฒ๋ฆฌ๋ฅผ ๋งก๊ธฐ๊ณ ,
๋ค์ ์๋์ ์ฃผ๋ฌธ์ ๋ฐ์ ์ ์์ผ๋ฉฐ ์ฃผ๋ฌธํ ์๋์ ์ปคํผ๋ฅผ ๋ง๋๋ ์ ์์๊ฒ ์๋ฃ๋ฅผ ๋ฐ๋ ํ์์ด๋ผ๊ณ ํ ์ ์๋ค.
์ด์ฉ๋ฉด ์ฃผ๋ฌธ์ ๋ฐ๊ณ ๋ฐ๋ก์ฒ๋ฆฌํ๋ ๋๊ธฐ๋ฐฉ์๋ณด๋ค ์๋๊ฐ ๋๋ฆด ์๋ ์๊ฒ ์ง๋ง
์ฌ๋ฌ๊ฐ์ ์์ฒญ์ ๋์์ ์ฒ๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด ์ํฉ์์๋ ๋น๋๊ธฐ ๋ฐฉ์์ด ํจ์จ์ ์ผ ์ ์๋ค.
๋ธ๋กํน(Blocking)
๋ธ๋กํน์ ํธ์ถ๋ ํจ์๊ฐ ์์ ์ ์์ ์ ๋ชจ๋ ๋๋ผ ๋ ๊น์ง ์ ์ด๊ถ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์
ํด๋น ์ ๋ฌด๊ฐ ์ฒ๋ฆฌ๋ ๋์ ํจ์๊ฐ ๋๊ธฐํ๋๋ก ๋ง๋๋ ๊ฒ์ด๋ค.
๋ ผ๋ธ๋กํน(Non-Blocking)
๋ ผ๋ธ๋กํน์ ํธ์ถ๋ ํจ์๊ฐ ๋ฐ๋ก ๋ฆฌํด์ ํด์ ํธ์ถํ ํจ์์๊ฒ ์ ์ด๊ถ์ ์ฃผ์ด
๋ค๋ฅธ ์ ๋ฌด๋ฅผ ํ ์ ์๊ฒ ํ๋ ๊ฒ์ด๋ค.
๋น๋๊ธฐ ์์ ์ ์ด
์์ ์ค๋ช ํ๋ฏ์ด ๋น๋๊ธฐ๋ ์ฌ๋ฌ๊ฐ์ ์์ฒญ์ ๋์์ ์ฒ๋ฆฌํ ์ ์๋ ๋ฅ๋ ฅ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์
์คํ์๊ฐ์ด ๊ฐ๊ธฐ๋ค๋ฅธ ์ ๋ฌด๋ฅผ ์์ฒญํ์๋ ์์๋๋ก ์ผ์ ์ ์ดํ๋ ๊ฒ์ด ์๋๋ผ ๋์์ ์ผ์ ์ฒ๋ฆฌํด
์ ๋ ฅํ ์์๋๋ก ๊ฒฐ๊ณผ๊ฐ์ด ๋์ค๋ ๋๊ธฐ์ ์ธ ๊ฐ๊ณผ๋ ๋ฌ๋ฆฌ ๊ฐ์ฅ ๋นจ๋ฆฌ ์ํํ ๊ฐ๋ถํฐ ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ๋์ค๊ฒ ๋๋ค.
์๋์ ์ด๋ฏธ์ง์ฒ๋ผ ๋๊ธฐ๋ '1-2-3-4'์์ผ๋ก ๊ฐ์ ๋ฆฌํดํ๋ค๋ฉด,
๋น๋๊ธฐ๋ '2-4-3-1'์์ผ๋ก ๊ฐ์ ๋ด๋ณด๋ผ ๊ฒ์ด๋ค.
๋ง์ฝ์ ์ฐ๋ฆฌ๊ฐ ๋น๋๊ธฐ๋ฅผ ๋๊ธฐ์ฒ๋ผ ์ ๋ ฅํ ์์๋๋ก ๊ฐ์ ๋ด๋ณด๋ผ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?
๋ฐ๋ก ์ฐ๋ฆฌ๊ฐ ์ด๋ฒ์ ๋ฐฐ์๋๊ฐ์ผํ ๊ฐ๋ ๋ค์ด๋ค.
1 > Callback
const printString = (string, callback) => {
setTimeout(
() => {
console.log(string)
callback()
},
Math.floor(Math.random() * 100) + 1
)
}
const printAll = () => {
printString('A', () => {
printString('B', () => {
printString('C', () => {})
})
})
}
printAll()
๋ง์ฝ์ ์ฐ๋ฆฌ๊ฐ ์ ๋ ฅํ ๊ฐ๋ค์ด ์์ฐจ์ ์ผ๋ก ์ค๊ธฐ๋ฅผ ๋ฐ๋๋ค๋ฉด ์ฐ์ Callback์ ์ฌ์ฉํด์ ๊ณ์ ํจ์๋ค์ด ์์ผ๋ก ๋ค์ด๊ฐ ์ ์๊ฒ ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๊ทธ๋ฐ๋ฐ ์ด๋ฐ์์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๊ฒ ๋๋ฉด ์ฝ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
์ผ๋จ ์ ์ ์์ ๋ฐ์ดํฐ๋ ๊ด์ฐฎ์ง๋ง ๋ง์ฝ ๋ค๋์ ์ ๋ณด๊ฐ ๋ค์ด์ค๊ฒ ๋๋ค๋ฉด ์ฝ๋ฐฑํจ์๋ฅผ ์ฐ์์ ์ผ๋ก ์ฌ์ฉํ๊ฒ ๋๊ธฐ ๋๋ฌธ์
์ฝ๋ฐฑํฌ์ด ๋ฐ์ํ๊ฒ ๋๋๋ฐ,
์ฝ๋ฐฑํฌ๋ก ์ธํด ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง ๋ฟ๋ง์๋๋ผ ์ถํ์ ์ฝ๋์ ๋ณต์ก์ฑ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์ธ ์ ์๋ค.
์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ์๊ธด ๋ฐฉ๋ฒ์ด ์๋๋ฐ ๋ฐ๋ก Promise์ด๋ค.
2-1 > Promise
ํ๋ก๋ฏธ์ค๋ ์ฝ๋ฐฑํฌ์ ๋ฒ์ด๋๊ธฐ ์ํ ๊ธฐ์ , ์ผ์ข ์ ์ฝ์์ด๋ค.
const printString = (string) => {
return new Promise((resolve, reject) => {
setTimeout(
() => {
console.log(string)
resolve()
},
Math.floor(Math.random() * 100) + 1
)
})
}
const printAll = () => {
printString('A')
.then(() => {
return printString('B')
})
.then(() => {
return printString('C')
})
}
printAll()
ํ๋ก๋ฏธ์ค๋ ์ฝ๋ฐฑ์ ์ธ์๋ก ๋ฐ๋ ๊ฒ์ด ์๋๋ผ ์๋ก์ด ํ๋ก๋ฏธ์ค (new Promise)๋ฅผ ๋ฆฌํดํ๊ฒ ๋๋๋ฐ
์ด๋์ ํ๋ก๋ฏธ์ค๋ ํด๋น ํจ์๋ฅผ ์ฝ๋ฐฑ์ผ๋ก ๋ฐ๋๋ฐ resolve, reject๋ฅผ ์ธ์๋ก ๋ฐ๋ ์ฝ๋ฐฑ์ ๋ฃ์ด ์คํ์ ํ๋ค.
์ด๋์ resolve๋ ์ฑ๊ณตํ ๋น๋๊ธฐ ์์ฒญ์ ๋ฐ์์ ๋ฐํํ๊ฒ ๋๋ ๊ฒ์ด๊ณ ,
reject๋ ์คํจํ ๋น๋๊ธฐ ์๋ฌ๋ฅผ ๋ฐ์์ ๋ฐํํ๊ฒ ๋๋ค.
A๋ฅผ ์คํํ๋ฉด ์ฝ๋ฐฑํจ์๋ก ์ด์ด๋๊ฐ์ง ์๊ณ .then()์ ์ฌ์ฉํด ์ด์ด๋๊ฐ๊ฒ ๋๋ค.
์ด๋์ then์ resolve๊ฐ์ ๋ฐ์ ์คํํ๊ฒ ๋๊ณ
์ฌ๊ธฐ์ ๋์ค์ง ์์์ง๋ง catch๋ผ๋ ๊ฒ๋ ์๋๋ฐ ์ด๋ reject๊ฐ์ ์๋ฌ๋ฅผ ๋ฐ๊ฒ๋๋ค.
2-2 > Promise์ ์ธ๊ฐ์ง ์ํ
• Pendgin(๋๊ธฐ) : ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ก์ง์ด ์์ง ์๋ฃ๊ฐ ๋์ง ์์ ์ํ
• Fulfilled(์ดํ) : ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋์ด ํ๋ก๋ฏธ์ค๊ฐ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐํํด์ค ์ํ
• Rejected(์คํจ) : ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์คํจํ๊ฑฐ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ํ
3 > Aysnc await
function gotoHome() {
return new Promise((resolve, reject) => {
setTimeout(() => {resolve('1. go to my home')}, 100)
})
}
function sitAndCode() {
return new Promise((resolve, reject) => {
setTimeout(() => {resolve('2. sit and code')}, 100)
})
}
function eatLunch() {
return new Promise((resolve, reject) => {
setTimeout(() => {resolve('3. eat lunch')}, 100)
})
}
function goToBed() {
return new Promise((resolve, reject) => {
setTimeout(() => {resolve('4. go to bed')}, 100)
})
}
const result = async () => { // async๋ผ๊ณ ๊ผญ ํ๊ธฐํ๊ธฐ
const one = await gotoHome();
console.log(one)
const two = await sitAndCode();
console.log(two)
const three = await eatLunch();
console.log(three)
const four = await goToBed();
console.log(four)
}
result();
๋น๋๊ธฐ๋ฅผ ๋๊ธฐ์ ์ธ ๊ฒ์ฒ๋ผ ํํํ ์ ์๋ ๊ฒ์ผ๋ก
await๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ๊ผญ Async ํจ์๋ผ๋ ๊ฒ์ ์๋ ค์ค์ผํ๋ค.
'์๋ > Code-States' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[D+65] ์น ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ fetch (0) | 2020.12.23 |
---|---|
[D+65] ๋น๋๊ธฐ ํธ์ถ์ ๋ํ ๋์ ์๊ฐ (0) | 2020.12.22 |
[D+63] Immersive 3์ฃผ์ฐจ (0) | 2020.11.08 |
[D+62] ๊ฐ์ธ ๊ณต๋ถ (0) | 2020.11.07 |
[D+61] ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ 5๋ฒ (0) | 2020.11.06 |
๋๊ธ