...

๋๊ธฐ/๋น๋๊ธฐ & ๋ธ๋กํน/๋ ผ๋ธ๋กํน
ํ๋ก๊ทธ๋๋ฐ์์ ์น ์๋ฒ ํน์ ์ ์ถ๋ ฅ(I/O)์ ๋ค๋ฃจ๋ค ๋ณด๋ฉด ๋๊ธฐ/๋น๋๊ธฐ & ๋ธ๋กํน/๋ ผ๋ธ๋กํน ์ด๋ฌํ ์ฉ์ด๋ค์ ์ ํด๋ณธ ๊ฒฝํ์ด ํ๋ฒ ์ฏค์ ์์ ๊ฒ์ด๋ค. ๋๋ถ๋ถ ์ฌ๋๋ค์ ์ฉ์ด๋ค์ด ๋ํ๋ด๊ณ ์ ํ๋ ํ์์ ๋ํด์ ๋ฉํฐ ํ์คํน๊ณผ ๋ฐ์ ํ ๊ด๋ จ์ด ์๋ค๋ ๊ฒ์ ์๊ณ ์๋ค. ๊ทธ๋์ ๋ ๊ฐ๋ ์ ๋น์ทํ ๊ฒ์ผ๋ก ์คํดํ๋ ์ฌ๋๋ค์ด ๊ฝค ๋ง๋ค. ๐ตโ๐ซ
๋๊ธฐ/๋น๋๊ธฐ ์ ๋ธ๋กํน/๋ ผ๋ธ๋กํน ์ด ๋ ๊ฐ๋ ์ ํํ ํํ๋ ๋น์ทํด ๋ณด์ผ์ง๋ผ๋, ์๋ก ๋ค๋ฅธ ์ฐจ์์์ ์์ ์ ์ํ ๋ฐฉ์์ ์ค๋ช ํ๋ ๊ฐ๋ ์ด๋ค. ๋๊ธฐ/๋น๋๊ธฐ๋ ์์ฒญํ ์์ ์ ๋ํด ์๋ฃ ์ฌ๋ถ๋ฅผ ์ ๊ฒฝ ์จ์ ์์ ์ ์์ฐจ์ ์ผ๋ก ์ํํ ์ง ์๋์ง์ ๋ํ ๊ด์ ์ด๊ณ ,๋ธ๋กํน/๋ ผ๋ธ๋กํน์ ๋จ์ด ๊ทธ๋๋ก ํ์ฌ ์์ ์ด block(์ฐจ๋จ, ๋๊ธฐ) ๋๋๋ ์๋๋์ ๋ฐ๋ผ ๋ค๋ฅธ ์์ ์ ์ํํ ์ ์๋์ง์ ๋ํ ๊ด์ ์ด๋ค.

์ด์ฒ๋ผ ๋ ๊ฐ๋
์ ๋ํ ์๋ฏธ ์ฐจ์ด๋ ๋ช
ํํ์ง๋ง, ํ๋ก๊ทธ๋๋ฐ์์๋ ์ข
์ข
ํผ์ฉ๋์ด ์ฌ์ฉ๋๊ธฐ๋ ํ๋ค. ๋ํ์ ์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ์ setTimeout() ํจ์๋ฅผ ์ผ๋ฐ์ ์ผ๋ก ๋น๋๊ธฐ ํจ์๋ผ๊ณ ๋ง ๋ถ๋ฅด์ง๋ง ๋์์ ๋
ผ๋ธ๋กํน ํจ์์ด๊ธฐ๋ ํ๋ค. ์ฆ, ์ฐ๋ฆฌ๊ฐ ํธ์์ ๋ถ๋ฅด๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋น๋๊ธฐ ํจ์๋ ์ฌ์ค ๋น๋๊ธฐ + ๋
ผ๋ธ๋กํน ํจ์์ธ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์ด๋ค์ ์ ํํ๊ฒ ๊ตฌ๋ถํ๊ณ ์ดํดํ๋ ๊ฒ์ด ์ปดํจํฐ ์ํคํ
์ณ๋ฅผ ์ดํดํ๋๋ฐ ์์ด ์ค์ํ๋ค.
๋๊ธฐ(Synchronous) / ๋น๋๊ธฐ(Asynchronous)
๋๊ธฐ(ๅๆ)์ ๋น๋๊ธฐ(้ๅๆ)๋ฅผ ์์๋ณด๊ธฐ ์์, ์ด ๋ ๊ฐ๋ ์ ํ๊ธ์ด ์๋ ์๋จ์ด๋ก ํ์ต ํ๊ธธ ๊ฐ๋ ฅํ ๊ถ์ฅํ๋ ๋ฐ๋ค. ์๋ํ๋ฉด ํ๊ธ๋ก ์ง์ญํ์๋ฉด '๊ฐ์ ๊ธฐ๊ฐ' ๋๋ '๊ฐ์ ์ฃผ๊ธฐ'๋ผ๋ ๋ป์ ํ์๋ฅผ ์ฌ์ฉํ๋๋ฐ ์คํ๋ ค ์๋ฏธ๋ฅผ ์ดํดํ๋๋ฐ ์์ด ๋์ฑ ํผ๋๋ง ์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋์ ์๋จ์ด๋ฅผ ํ๋ณด์๋ฉด Synchronous์ Syn๋ ๊ทธ๋ฆฌ์ค์ด๋ก 'ํจ๊ป'์ด๋ ๋ป์ด๊ณ chrono๋ '์๊ฐ'์ด๋ผ๋ ๋ป์ด๋ค.
์ฆ, Synchronous๋ ์์ ์๊ฐ์ ํจ๊ป ๋ง์ถฐ์ ์คํํ๋ค ๋ผ๋ ๋ป์ผ๋ก ํด์๋๋ค. ์์ ์ ๋ง์ถฐ ์คํํ๋ค๋ ๋ง์ ์์ฒญํ ์์ ์ ๋ํด ์๋ฃ ์ฌ๋ถ๋ฅผ ๋ฐ์ ธ ์์ฐจ๋๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋งํ๋ค. Asynchronous๋ ์์ A๋ผ๋ ์ ๋์ฌ๊ฐ ๋ถ์ด ๋ถ์ ํ๋ ํํ์ด๋ค. ๊ทธ๋์ ๋๊ธฐ์ ๋ฐ๋๋ก ์์ฒญํ ์์ ์ ๋ํด ์๋ฃ ์ฌ๋ถ๋ฅผ ๋ฐ์ง์ง ์๊ธฐ ๋๋ฌธ์ ์์ ์ ๋ค์ ์์ ์ ๊ทธ๋๋ก ์ํํ๊ฒ ๋๋ค.

๋น๋๊ธฐ์ ์ฑ๋ฅ ์ด์
๋ณดํต ๋น๋๊ธฐ ํน์ง์ ์ด์ฉํ์ฌ ์ฑ๋ฅ๊ณผ ์ฐ๊ด์ง์ด ๋งํ๋ค. ์๋ํ๋ฉด ์์ฒญํ ์์ ์ ๋ํ์ฌ ์๋ฃ ์ฌ๋ถ๋ฅผ ์ ๊ฒฝ์ฐ์ง ์๊ณ ์์ ์ ๊ทธ๋ค์ ์์ ์ ์ํํ๋ค๋ ๊ฒ์, I/O ์์ ๊ณผ ๊ฐ์ ๋๋ฆฐ ์์ ์ด ๋ฐ์ํ ๋, ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค๋ฅธ ์์ ์ ์ฒ๋ฆฌํ๋ฉด์ ๋์์ ์ฒ๋ฆฌํ์ฌ ๋ฉํฐ ์์ ์ ์งํํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ ์ ๋ฐ์ ์ธ ์์คํ ์ฑ๋ฅ ํฅ์์ ๋์์ ์ค ์ ์๋ค.

์๋ฅผ ๋ค์ด, ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ๋ฅผ ์ํํ๋ ์์ ์ด ์๋ค๊ณ ๊ฐ์ ํด๋ณด์. ์ด ์์ ์ ๋ง์ผ ๋๊ธฐ์ ์ผ๋ก ์ํํ๋ฉด, ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์๋ต์ด ์ฌ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๋ค. ๊ทธ๋ฌ๋ฉด ์ด ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ์์ฒญ์ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ฏ๋ก, ๋๊ท๋ชจ ํธ๋ํฝ์ด ๋ฐ์ํ ๊ฒฝ์ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๋ค. ํ์ง๋ง ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ๋ฅผ ์ํํ๋ฉด, ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์๋ต์ด ์ฌ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋์์๋ ๋ค๋ฅธ ์์ฒญ์ '๋์์ ์ฒ๋ฆฌ'ํ ์ ์๊ฒ ๋๋ค. ์ด๋ ๊ฒ ๋น๋๊ธฐ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด, ๋๊ท๋ชจ ํธ๋ํฝ์์๋ ์์ ์ ์ผ๋ก ๋์ํ ์ ์๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์๋ค.
์ฌ๊ธฐ์ '๋์ ์ฒ๋ฆฌ' ๋ผ๋ ๊ฐ๋ ์ ๋ ๊ฐ ์ด์์ ์์ ์ด ๋์์ ์คํ๋๋ ๊ฒ์ ์๋ฏธ ํ๋ค. ์ด๋ ๋ฉํฐ ์ค๋ ๋๋ ๋ฉํฐ ํ๋ก์ธ์ฑ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋ ์ ์๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ ๊ฒฝ์ฐ ๋น๋๊ธฐ๋ก ์์ ์ ์์ฒญํ๋ฉด ๋ธ๋ผ์ฐ์ ์ ๋ด์ฅ๋ ๋ฉํฐ ์ค๋ ๋๋ก ์ด๋ฃจ์ด์ง Web API์ ์์ ์ด ์ธ๊ฐ๋์ด ๋ฉ์ธ Call Stack๊ณผ ์์ ์ด ๋์์ ์ฒ๋ฆฌ๋๊ฒ ๋๋ค. ์ฝ๊ฒ ๋น์ ํ์๋ฉด ์์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋์ ์ธ๊ฐํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค. ๋ํ์ ์ธ ๋น๋๊ธฐ ์์ ์ ์ข ๋ฅ๋ก๋ ์ ๋๋ฉ์ด์ ์คํ, ๋คํธ์ํฌ ํต์ , ๋ง์ฐ์ค ํค๋ณด๋ ์ ๋ ฅ, ํ์ด๋จธ ๋ฑ ๋ง๋ค. ๋ค๋ง ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ์คํ ์์ฒด๋ Web API๊ฐ ์๋ Call Stack์์ ์คํ๋๋ค.
๐ ์๋ฐ์คํฌ๋ฆฝํธ ์ด๋ฒคํธ ๋ฃจํ ๊ตฌ์กฐ & ๋์ ์๋ฆฌ
์๋ฐ์คํฌ๋ฆฝํธ ๋น๋๊ธฐ์ ์ด๋ฒคํธ ๋ฃจํ ๋ธ๋ผ์ฐ์ ์ ๋ฉํฐ ์ค๋ ๋๋ก ์์ ์ ๋์์ Javascript๋ ์ฑ๊ธ ์ค๋ ๋ ์ธ์ด๋ผ๊ณ ๋ค์ด๋ณธ ์ ์ด ์์ ๊ฒ์ด๋ค. '์ฑ๊ธ' ์ค๋ ๋๋ผ ํ ๋ฒ์ ํ๋์ ์์ ๋ง ์ํ์ด ๊ฐ๋ฅํ
inpa.tistory.com
๋๊ธฐ์ ๋น๋๊ธฐ๋ ์์ ์์ ์ฒ๋ฆฌ ์ฐจ์ด
์์์ ๋๊ธฐ์ ๋น๋๊ธฐ๋ฅผ ์์ฒญํ ์์ ์ ๋ํด ์๋ฃ ์ฌ๋ถ์ ๋ํ ์ฐจ์ด๋ผ๊ณ ๋งํ์๋ค. ์ด๋ฅผ ์ฝ๊ฒ ๋งํ์๋ฉด ์ฌ๋ฌ๊ฐ์ ์์ฒญ ์์ ์ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํ๋๋ ์๋๋์ ๋ฐ๋ฅธ ์ฐจ์ด๋ก ๋ณด๋ฉด ๋๋ค. ์์ฒญํ ์์ ์ ๋ํ ์๋ฃ ์๋ฆผ์ ๋ฐ๋์ ๋ฐ์์ผ ๋ค์ ์์ ์ ์ํํ๋ค๋ ๋ง์ ์์ ์ ์์๋๋ก ์ฒ๋ฆฌํ๋ค๋ ๋ง์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ๋๊ธฐ ์์ ์ ์์ฒญํ ์์ ์ ๋ํด ์์๊ฐ ์ง์ผ์ง๋ ๊ฒ์ ๋งํ๋ ๊ฒ์ด๊ณ , ๋น๋๊ธฐ ์์ ์ ์์๊ฐ ์ง์ผ์ง์ง ์์ ์ ์๋ค๋ ๊ฒ์ ๋งํ๋ค.
์๋ฅผ๋ค์ด A, B, C ๋ผ๋ 3 ๊ฐ์ ์์ (Task)์ด ์๋ค๊ณ ๊ฐ์ ํ์. ๋๊ธฐ ๋ฐฉ์์ผ๋ก ์คํํ๋ฉด A โ B โ C ์์๋๋ก ์คํ๋๊ฒ ๋๊ณ , ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ์คํํ๋ฉด A โ C โ B ๋๋ C โ A โ B ๋ฑ์ ๋ฌด์์์ ์์๋ก ์คํ๋๊ฒ ๋๋ ๊ฒ์ด๋ค.


์ ๋ฆฌํ์๋ฉด ์์ 3๊ฐ๋ฅผ ์์ฒญํ๋๋ฐ ์๋ต์์ ๊ทธ ์์๊ฐ ์ง์ผ์ง๋ค๋ฉด ๋๊ธฐ์ด๊ณ ์ด๋ค ๊ฒ ๋จผ์ ์ฌ์ง ๋ชจ๋ฅธ๋ค๋ฉด ๋น๋๊ธฐ๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
Blocking / Non-Blocking
๋ธ๋กํน๊ณผ ๋ ผ๋ธ๋กํน์ ๋จ์ด์์ ์ ์ ์๋ฏ์ด ๋ค๋ฅธ ์์ฒญ์ ์์ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ํ์ฌ ์์ ์ block(์ฐจ๋จ, ๋๊ธฐ) ํ๋ ์ํ๋์ ์ ๋ฌด๋ฅผ ๋ํ๋ด๋ ํ๋ก์ธ์ค์ ์คํ ๋ฐฉ์์ด๋ค.
๋๊ธฐ/๋น๋๊ธฐ๊ฐ ์ ์ฒด์ ์ธ ์์ ์ ๋ํ ์์ฐจ์ ์ธ ํ๋ฆ ์ ๋ฌด๋ผ๋ฉด, ๋ธ๋กํน/๋ ผ๋ธ๋กํน์ ์ ์ฒด์ ์ธ ์์ ์ ํ๋ฆ ์์ฒด๋ฅผ ๋ง๋ ์ ๋ง๋๋ก ๋ณผ ์ ์๋ ๊ฒ์ด๋ค. ์๋ฅผ ๋ค์ด, ํ์ผ์ ์ฝ๋ ์์ ์ด ์์ ๋, ๋ธ๋กํน ๋ฐฉ์์ผ๋ก ์ฝ์ผ๋ฉด ํ์ผ์ ๋ค ์ฝ์ ๋๊น์ง ๋๊ธฐํ๊ณ , ๋ ผ๋ธ๋กํน ๋ฐฉ์์ผ๋ก ์ฝ์ผ๋ฉด ํ์ผ์ ๋ค ์ฝ์ง ์์๋ ๋ค๋ฅธ ์์ ์ ํ ์ ์๋ค.

๋น๋๊ธฐ์ ๋ ผ๋ธ๋กํน ๊ฐ๋ ์ฐจ์ด
์๋ง ์๋ด๊ธฐ ๊ฐ๋ฐ์๋ค์ด ๊ฐ์ฅ ํผ๋ํ๋ ๋ถ๋ถ์ด ๋น๋๊ธฐ์ ๋
ผ๋ธ๋กํน์ ์ฐจ์ด ๋ถ๋ถ์ผ ๊ฒ์ด๋ค. ํฌ์คํ
์ด๋ฐ์์ ์๋ฐ์คํฌ๋ฆฝํธ์ setTimeout ํจ์๋ฅผ ๋น๋๊ธฐ ํจ์์ด๋ฉฐ ๋์์ ๋
ผ๋ธ๋กํน ํจ์์ด๋ผ๊ณ ํ๋ค. ์ด๋ ์ด๋ ํ ๊ด์ ์ผ๋ก setTimeout ์ ๋ฐ๋ผ๋ณด๋๋์ ๋ฐ๋ผ ๊ฐ๊ธฐ ๋ถ๋ฅด๋๊ฒ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ด๋ค. ์๋ฅผ๋ค์ด ์๋ ์ฝ๋๋ setTimeout ํจ์๋ฅผ ์ฌ์ฉํ์ฌ 1์ด ํ์ "Hello, world!"๋ฅผ ์ถ๋ ฅํ๋ ๋น๋๊ธฐ ๋
ผ๋ธ๋กํน ์ฝ๋์ ์์ ์ด๋ค. ์ฝ๋๋ฅผ ์คํํ๋ฉด, "์์"๊ณผ "๋"์ด ๋จผ์ ์ถ๋ ฅ๋๊ณ , 1์ด ํ์ "1์ด ํ์ ์คํ๋ฉ๋๋ค!"๊ฐ ์ถ๋ ฅ๋๊ฒ ๋๋ค.
console.log("์์");
setTimeout(() => {
console.log("1์ด ํ์ ์คํ๋ฉ๋๋ค!");
}, 1000);
console.log("๋");

์ฆ, ์ถ๋ ฅ ์์์ ์ ์๋ ์ฝ๋ ๋ผ์ธ ์์๊ฐ ๋ง์ง ์์ ๊ฒ์ด๋ค. ์ด๋ setTimeout ํจ์์ ๋ํด ํ์ด๋จธ ์์
์๋ฃ ์ฌ๋ถ๋ฅผ ์ ๊ฒฝ ์ฐ์ง ์๊ณ ๋ฐ๋ก ๊ทธ ๋ค์ ์ฝ์ ์์
์ ์ํํ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฆฌ๊ณ setTimeout ํจ์์ ํ์ด๋จธ ์์
์๋ฃ ์๋์ ์ฝ๋ฐฑ ํจ์๋ฅผ ํตํด ๊ฐ์ ๋ฐ์ ์ถ๋ ฅํ์๋ค. ๋ฐ๋ผ์ setTimeout ์ ๋น๋๊ธฐ(Asynchronouse)์ด๋ค.
๋ค๋ฅธ ์๊ฐ์ผ๋ก ๋ณด๋ฉด ๋ฉ์ธ ํจ์ ์์
์ ๋ํด์ setTimeout ํจ์๋ ์์ ์ ํ์ด๋จธ ์์
์ ์ํํ๊ธฐ ์ํด ๋ฉ์ธ ํจ์๋ฅผ ๋ธ๋ฝํ์ง ์๊ณ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ณ๋๋ก ์ฒ๋ฆฌ๋์๋ค. ๋ฉ์ธ ํจ์๋ฅผ ๋ธ๋ฝํ์ง ์์ผ๋ setTimeout ํจ์๋ฅผ ํธ์ถํ๊ณ ๋ฐ๋ก ๊ทธ ๋ค์ ์ฝ์ ํจ์๋ฅผ ํธ์ถํ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ setTimeout ์ ๋
ผ๋ธ๋กํน(Non-blocking)์ด๋ค.
๊ทธ๋ฐ๋ฐ ๊ฒฐ๊ตญ์ ๋น๋๊ธฐ๋ ๋ ผ๋ธ๋กํน์ด๋ ์ถ๊ตฌํ๋ ๊ฒฐ๊ณผ๋ก๋ง ๋ณด์๋ฉด ๋์์ ๋ค๋ฅธ ์์ ์ ์ํํ๋ค๋ ์ ์์ ๊ทธ๊ฒ ๊ทธ๊ฒ์ด๋ผ๊ณ ๋ณผ ์๋ ์๋ค. ์ด๋ ์์ ๊ณผ ๊ด๋ จ๋ ์ด๋ก ์ ์ธ ๊ฐ๋ ์ด๋ผ ์ค์ ์ฝ๋์์ ๊ฒฝ๊ณ๋ฅผ ๊ตฌ๋ถํ๊ธฐ๊ฐ ์ ๋งคํ๊ธฐ๋ ํ๋ค. ๊ทธ๋์ ํ๋ก๊ทธ๋๋ฐ์์ ์ด๋ฅผ ํผ์ฉํ์ฌ ์ฌ์ฉํ๋ ๊ฒ ๊ฐ๋ค. ๊ทธ๋ฌ๋ ์์ฐํ ๋ํ๋ด๋ ์๋ฏธ๋ ๋ค๋ฅด๋ค. ๐ต
์ฐ๋ฆฌ๊ฐ ๋๊ธฐ/๋น๋๊ธฐ, ๋ธ๋กํน/๋ ผ๋ธ๋กํน์ ํผ๋ํ๋ ์ด์ ๋, ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฒ์ ๋ฐฐ์ธ ๋ ํ๋ก๊ทธ๋๋ฐ ์์ ์ด๋ ๊ฐ์์์setTimeout๊ณผ ๊ฐ์ ํจ์๋ฅผ '๋น๋๊ธฐ ํจ์' ๋ผ๊ณ ์ง์นญํ๊ณ ์ธ์๋ฒ๋ ค์ ๊ทธ๋ ๋ค๊ณ ์๊ฐํ๋ค. ๊ทธ๋์ '๋น๋๊ธฐ' ๋ผ๊ณ ํ๋ฉด ์์ฐ์ค๋ฝ๊ฒ ๋ณ๋ ฌ ์คํ์ ๋ ์ฌ๋ผ ๋น๋๊ธฐ์ ๋ ผ๋ธ๋กํน์ ํผ๋ํ๋ ๊ฒ์ด๋ค.
๋น๋๊ธฐ๋ ์ถ๋ ฅ ์์์ ๊ด๋ จ๋ ๊ฐ๋ ์ด๊ณ ๋ ผ๋ธ๋กํน์ด ๋ณ๋ ฌ ์คํ๊ณผ ๊ด๋ จ๋ ๊ฐ๋ ์ด๋ค. ๋ฐ๋ผ์ ๊ธ์ด์ด๋ ๊ฐ์ธ์ ์ผ๋ก ์ด ๋ถ๋ถ์ ์๋ชป๋์๋ค๊ณ ๋นํํ๊ณ ์ถ๋ค. ์๋ฌด๋ฆฌ ์กฐ๊ธ ๋ํดํ ๊ฐ๋ ์ด๋ผ๋ ์ฒ์๋ถํฐ ๋น๋๊ธฐ + ๋ ผ๋ธ๋กํน ํจ์๋ผ๊ณ ๊ฐ๋ฅด์น๋๊ฒ์ด ์ถํ๋ฅผ ์ํด ๊ฐ๋ ์ ๋ค์ก๋๋ฐ ์ณ๋ค๊ณ ๋ณธ๋ค.
๋น๋๊ธฐ ๋ ผ๋ธ๋กํน๊ณผ ์ฝ๋ฐฑ ํจ์
์๋ฐ์คํฌ๋ฆฝํธ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์์ ๋น ์ง์ง ์๋ ๊ฐ๋ ์ด ๋ฐ๋ก ์ฝ๋ฐฑ(callback) ์ด๋ค. ๋น๋๊ธฐ ๋ ผ๋ธ๋กํน์ด๋ ๋ค๋ฅธ ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ณ๋ ฌ์ ์ผ๋ก ์คํ๋๋ ๋ฐฉ์์ ๋งํ๋๋ฐ, ์ด๋ ๋ค๋ฅธ ์์ ์ ์๋ฃ ์ฌ๋ถ๋ ๊ฒฐ๊ณผ์ ๋ํ ํ์ฒ๋ฆฌ๋ฅผ ์ํด ์ด์ฉ๋๋ ๋ฐฉ์์ด ์ฝ๋ฐฑ ํจ์์ด๋ค.
๊ทธ๋ผ ์ฝ๋ฐฑ ํจ์๋ ๋น๋๊ธฐ์ ๊ด๋ จ์ด ์๋ ๊ฒ์ผ๊น? ๋ ผ๋ธ๋กํน๊ณผ ๊ด๋ จ์ด ์๋ ๊ฒ์ผ๊น? ์ ๋ต์ ๋๋ค ๊ด๋ จ์ด ์๋ค. ์๋ฐํ ๋ฐ์ง์๋ฉด ์ฝ๋ฐฑ ํจ์๋ ๋น๋๊ธฐ ๋ ผ๋ธ๋กํน์ ๊ตฌํํ๋ ํ๋์ ๊ธฐ์ ์ด์ง ๊ฐ๋ ์ด ์๋๋ค. ์ฝ๋ฐฑ ์ง์ฅ(callback hell) ๋๋ฌธ์ ์ฝ๋ฐฑ ํจ์ ๋ฐฉ์์ผ๋ก ๋น๋๊ธฐ ๋ ผ๋ธ๋กํน์ ๊ตฌํํ๊ธฐ ์ซ๋ค๋ฉด Promise ๊ฐ์ฒด๋ฅผ ์ด์ฉํ์ฌ๋ ๋๊ณ ์์ ์ด๋ฒคํธ๋ก emit ํ์ฌ ์ฒ๋ฆฌํ์ฌ๋ ๋๋ค. ๋ฐฉ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง์ด๋ค. ํต์ฌ์ ๋น๋๊ธฐ ๋ ผ๋ธ๋กํน์ ๊ตฌํํ๋ ๊ธฐ์ ์ ์ฝ๋ฐฑ ์ธ์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋ค๋ ์ ์ด๊ณ ์ฝ๋ฐฑ์ ๊ทธ ์ค ํ๋์ผ ๋ฟ์ด๋ผ๋ ๊ฒ์ด์ง ๋๊ธฐ/๋น๋๊ธฐ & ๋ธ๋กํน/๋ ผ๋ธ๋กํน ๊ฐ๋ ๊ณผ ์ง์ ์ ์ธ ๊ด๋ จ์ ์๋ค.
/* ์ฝ๋ฐฑ ํจ์ ๋ฐฉ์์ผ๋ก ๊ตฌํํ ๋น๋๊ธฐ + ๋
ผ๋ธ๋กํน ์๋ฒ ์์ฒญ ์์
*/
$.ajax({
url: 'https://jsonplaceholder.typicode.com/todos/1',
type: 'GET',
dataType: 'json',
success: function(data) { // ์์ฒญ์ด ์ฑ๊ณตํ๋ฉด ํธ์ถ๋ ์ฝ๋ฐฑ ํจ์
console.log(data);
},
error: function(err) { // ์์ฒญ์ด ์คํจํ๋ฉด ํธ์ถ๋ ์ฝ๋ฐฑ ํจ์
throw err;
}
});
// ์์ฒญ์ ๋ณด๋ด๋ ๋์์ ๋ค๋ฅธ ์์
์ ์ํํ ์ ์์ต๋๋ค.
console.log('Hello');
/* ํ๋ก๋ฏธ์ค ๊ฐ์ฒด ๋ฐฉ์์ผ๋ก ๊ตฌํํ ๋น๋๊ธฐ + ๋
ผ๋ธ๋กํน ์๋ฒ ์์ฒญ ์์
*/
fetch('https://jsonplaceholder.typicode.com/todos/1')
.then((response) => {
return response.json();
})
.then((data) => {
console.log(data);
})
.catch((err) => {
throw err;
});
// ์์ฒญ์ ๋ณด๋ด๋ ๋์์ ๋ค๋ฅธ ์์
์ ์ํํ ์ ์์ต๋๋ค.
console.log('Hello');
/* ์ด๋ฒคํธ ๋ฐฉ์์ผ๋ก ๊ตฌํํ ๋น๋๊ธฐ + ๋
ผ๋ธ๋กํน ํ์ผ ๋ค์ด ์์
*/
const fileReader = new FileReader(); // FileReader ๊ฐ์ฒด๋ฅผ ์์ฑ
const input = document.querySelector('input');
const file = input.files[0]; // input ํ๊ทธ์์ ์ ํ๋ ํ์ผ์ ๊ฐ์ ธ์ต๋๋ค
fileReader.addEventListener('load', function() {
console.log(fileReader.result); // ํ์ผ์ด load๊ฐ ์๋ฃ๋๋ฉด ๋ด์ฉ์ ์ถ๋ ฅํฉ๋๋ค.
});
fileReader.addEventListener('error', function(err) {
throw err;
});
// ์์ฒญ์ ๋ณด๋ด๋ ๋์์ ๋ค๋ฅธ ์์
์ ์ํํ ์ ์์ต๋๋ค.
console.log('Hello');
๋๊ฐ ์ ์ด๊ถ์ ๊ฐ์ง๊ณ ์๋๋
๋ค๋ฅธ ์์ ์์ ๋๊ธฐ/๋น๋๊ธฐ์ ๋ธ๋กํน/๋ ผ๋ธ๋กํน์ ๋ณด๋ค ๋ช ํํ ๊ตฌ๋ถํ๊ธฐ ์ํด์ '์ ์ด๊ถ' ์ด๋ผ๋ ์ด๋ ค์ด ๋จ์ด๋ฅผ ์ด๋ค. ์ ์ด๊ถ์ ๊ฐ๋จํ ๋งํด์ ํจ์์ ์ฝ๋๋ ํ๋ก์ธ์ค์ ์คํ ํ๋ฆ์ ์ ์ดํ ์ ์๋ ๊ถ๋ฆฌ ๊ฐ์ ๊ฒ์ด๋ค. ์ด ๊ฐ๋ ์ ์ด์์ฒด์ (OS)์ ์ปค๋(kernel)์์ ๋ฐ์จ ๊ฐ๋ ์ผ๋ก I/O ๋์์์ ์ค๋ช ํ๋ ๋ถ๋ถ์ด๋ค. ์ฆ, Blocking๊ณผ Non-Blocking์ ํธ์ถ๋ ํจ์(callee)๊ฐ ํธ์ถํ ํจ์(caller)์๊ฒ ์ ์ด๊ถ์ ๋ฐ๋ก ์ฃผ๋๋ ์์ฃผ๋๋๋ก ๊ตฌ๋ถ๋๋ค. ์ ์ด๊ถ์ด ๋์ด๊ฐ๋ฒ๋ฆฌ๋ฉด ํด๋น ์ค๋ ๋๋ ๋ธ๋กํน๋๊ฒ ๋๋ค.
๋ค์์ A ํจ์์ B ํจ์ ์์ ์ ๋ํด A ํจ์๊ฐ B ํจ์๋ฅผ Blocking ๋ฐฉ์์ผ๋ก ํธ์ถํ ์ ์ ์ด๊ถ ์ํ๋ฅผ ๋ํ๋ธ ๊ทธ๋ฆผ์ด๋ค.

- A ํจ์๊ฐ B ํจ์๋ฅผ ํธ์ถํ๋ฉด B์๊ฒ ์ ์ด๊ถ์ด ๋์ด๊ฐ๋ค
- ์ ์ด๊ถ์ ๋๊ฒจ๋ฐ์ B๋ ํจ์๋ฅผ ์คํํ๋ค.
- ์ด๋ A๋ B์๊ฒ ์ ์ด๊ถ์ ๋๊ฒจ์ฃผ์๊ธฐ ๋๋ฌธ์ A ํจ์ ์คํ์ ์ ์ ๋ฉ์ถ๋ค. (Block)
- B ํจ์๊ฐ ์คํ์ด ๋๋๋ฉด ์์ ์ ํธ์ถํ A์๊ฒ ์ ์ด๊ถ์ ๋๋ ค์ค๋ค.
- ์ ์ด๊ถ์ ๋ค์ ๋ฐ์ A ํจ์๋ ๊ทธ๋ค์ ์์ ์ ์คํํ๋ค.
๋ค์์ A ํจ์์ B ํจ์ ์์ ์ ๋ํด A ํจ์๊ฐ B ํจ์๋ฅผ Non-Blocking ๋ฐฉ์์ผ๋ก ํธ์ถํ ์ ์ ์ด๊ถ ์ํ๋ฅผ ๋ํ๋ธ ๊ทธ๋ฆผ์ด๋ค.

- A ํจ์๊ฐ B ํจ์๋ฅผ ํธ์ถํ๋ค.
- ํธ์ถ๋ B ํจ์๋ ์คํ๋์ง๋ง, ์ ์ด๊ถ์ A ํจ์๊ฐ ๊ทธ๋๋ก ๊ฐ์ง๊ณ ์๋๋ค.
- A ํจ์๋ ๊ณ์ ์ ์ด๊ถ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ B ํจ์๋ฅผ ํธ์ถํ ์ดํ์๋ ์์ ์ ์ฝ๋๋ฅผ ๊ณ์ ์คํํ๋ค.
๋๊ธฐ/๋น๋๊ธฐ + ๋ธ๋กํน/๋ ผ๋ธ๋กํน ์กฐํฉ
์ง๊ธ๊น์ง ๋๊ธฐ/๋น๋๊ธฐ ์ ๋ธ๋กํน/๋ ผ๋ธ๋กํน ๊ฐ๊ฐ์ ์ฐจ์ด์ ์ ๋ํด ์์๋ณด์๋ค. ์ด์ฒ๋ผ ๋์ ์ ์ฌํ์ง๋ง ์์ฐํ ๋ค๋ฅธ ๊ฐ๋ ์ด๋ค. ๊ทธ๋์ ํ๋ก๊ทธ๋จ ์ํคํ ์ณ์์๋ ์ด ๋ ๊ฐ๋ ์ด ํจ๊ป ์กฐํฉ๋์ด ์ฌ์ฉ๋๋ค. ์๋ฅผ๋ค์ด ๋ค์ 4๊ฐ์ง๋ก ์กฐํฉ์ด ๊ฐ๋ฅํ๋ค.
- Sync Blocking (๋๊ธฐ + ๋ธ๋กํน)
- Async Blocking (๋น๋๊ธฐ + ๋ธ๋กํน)
- Sync Non-Blocking (๋๊ธฐ + ๋ ผ๋ธ๋กํน)
- Async Non-Blocking (๋น๋๊ธฐ + ๋ ผ๋ธ๋กํน)

์ด๋ฌํ ๋๊ธฐ/๋น๋๊ธฐ์ ๋ธ๋กํน/๋ ผ๋ธ๋กํน์ ์กฐํฉ์ ํ๋ก๊ทธ๋จ์ด ์๋ํ๋ ๋ฐฉ์์ ์ํฅ์ ๋ฏธ์น๋ ์ค์ํ ์์๋ค. ์ด๋ ํ ์์๋ฅผ ์กฐํฉํ์ฌ ์ฌ์ฉํ๋๋์ ๋ฐ๋ผ ํ๋ก๊ทธ๋จ์ ์ฑ๋ฅ๊ณผ ํจ์จ์ฑ์ ๋์ผ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ํ์ ์ธ ์๋ก Node.js ๋ฅผ ๋ค ์ ์๋ค. Node.js์์ ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ํ์ผ์ ์ฝ๊ฑฐ๋ ๋คํธ์ํฌ ์์ฒญ์ ๋ณด๋ผ ๋๋ ๋น๋๊ธฐ & ๋ ผ๋ธ๋กํน ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ์์ ์ด ์๋ฃ๋ ๋๊น์ง ๋ค๋ฅธ ์์ ์ ์ํํ ์ ์๋๋ก ํ๋ค. ๋ฐ๋ฉด์, Node.js์์ ์ฝ๋ ์คํ ์์ ์ ๋ฆ์ถฐ์ฃผ๊ฑฐ๋ ์์ฐจ์ ์ธ ์์กด์ฑ์ด ์๋ ์์ ์ ์ฒ๋ฆฌํ ๋๋ ๋๊ธฐ & ๋ธ๋กํน ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ์์ ์ ์์์ ํ์ด๋ฐ์ ์ ์ดํ ์ ์๋๋ก ํ๋ค.

์๋ง ์ฐ๋ฆฌ๋ ์ด๋ฏธ ๊ฐ๋ ์ด ์ ์ฉ๋ ํ๋ ์์ํฌ๋ฅผ ์ด์ฉํด ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํด ์์ด์ ์๋ฟ์ง ์์ ์ ์๋ค. ํ์ง๋ง ์ด๋ฌํ ์ด๋ก ์ ์ธ ๋ถ๋ถ์ ์ดํดํ๊ณ ์ ์ฉํ๋ค๋ฉด ์ง์ ์ค๊ณํ ๋ ๋์ฑ ํจ์จ์ ์ธ ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐ์ ๋์์ด ๋ ์ ์์ผ๋ฉฐ, ๊ฐ๋ ๋ค์ ๋ช ํํ ์๊ณ ์์ผ๋ฉด Node.js์ ๋์ ์๋ฆฌ์ ์ฅ์ ์ ๋ ์ ์ดํดํ๊ณ ํ์ฉํ ์ ์์ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ๋๊ธฐ/๋น๋๊ธฐ์ ๋ธ๋กํน/๋ ผ๋ธ๋กํน์ ๊ฐ๋ ์ ์ดํดํ๊ณ ์ ์ ํ ์กฐํฉ์ ์ ํํ๋ ๊ฒ์ด ์ค์ํ๋ค.
Sync Blocking ์กฐํฉ
Sync Blocking ์กฐํฉ์ ๋ค๋ฅธ ์์ ์ด ์งํ๋๋ ๋์ ์์ ์ ์์ ์ ์ฒ๋ฆฌํ์ง ์๊ณ (Blocking), ๋ค๋ฅธ ์์ ์ ์๋ฃ ์ฌ๋ถ๋ฅผ ๋ฐ๋ก ๋ฐ์ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ (Sync) ๋ฐฉ์์ด๋ค. ๋ค๋ฅธ ์์ ์ ๊ฒฐ๊ณผ๊ฐ ์์ ์ ์์ ์ ์ํฅ์ ์ฃผ๋ ๊ฒฝ์ฐ์ ํ์ฉํ ์ ์๋ค.

์ค์ํ ๋์ ์์
์ด๋ ๊ฐ๋ฐํ์์ ์ฌ์1, ์ฌ์2, ์ฌ์3 ์ ํ์ฅ์ด ์๋ค๊ณ ํ์. ๊ฐ๋ฐํ์ฅ์ ๊ฐ๋ฐํ ์์ ์ ํ๋ฆ์ ์กฐ์จํ๊ณ , ์ฌ์๋ค์๊ฒ ์ ๋ฌด๋ฅผ ์ง์ํ๋ค๊ณ ํ๋ค.
- ํ์ฅ : ์ฌ์1์จ ์ ๋ฌด A ์ข ํด์ฃผ์ธ์
- ์ฌ์1 : ๋ค ์๊ฒ ์ต๋๋ค. (A๋ฅผ ์ฒ๋ฆฌ์ค)
- ํ์ฅ : (์ฌ์1์ด A๋ฅผ ๋คํ ๋๊น์ง ์๋ฌด์ผ๋ ํ์ง ์๊ณ ๊ธฐ๋ค๋ฆฐ๋ค)
- ์ฌ์1 : ํ์ฅ๋ A ์ ๋ฌด ์๋ฃํ์ต๋๋ค.
- ํ์ฅ : ์๊ณ ํ์ด์. ์ฌ์2์จ ์ ๋ฌด B์ข ํด์ฃผ์ธ์.
- ์ฌ์2 : ๋ค ์๊ฒ ์ต๋๋ค. (B๋ฅผ ์ฒ๋ฆฌ์ค)
- ํ์ฅ : (์ฌ์2๊ฐ B๋ฅผ ๋คํ ๋๊น์ง ์๋ฌด์ผ๋ ํ์ง ์๊ณ ๊ธฐ๋ค๋ฆฐ๋ค)
- ์ฌ์2 : ํ์ฅ๋ B ์ ๋ฌด ์๋ฃํ์ต๋๋ค.
- ํ์ฅ : ์๊ณ ํ์ด์. ์ฌ์3์จ ์ ๋ฌด C์ข ํด์ฃผ์ธ์.
- ...์๋ต
์ฝ๋ ๋์ ์์
Sync Blocking ์ ๋ํ์ ์ธ ์๋ก ํ์ผ์ ์ฝ์ด ๋ด์ฉ์ ์ฒ๋ฆฌํ๋ ๋ก์ง์ ๋ค ์ ์๋ค. ํ์ผ์ ๋จผ์ ์ฝ์ด์ผ ๊ทธ๋ค์ ์์ ์ ์ฒ๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
const fs = require('fs'); // ํ์ผ ์์คํ
๋ชจ๋ ๋ถ๋ฌ์ค๊ธฐ
// ๋๊ธฐ์ ์ผ๋ก ํ์ผ ์ฝ๊ธฐ
const data1 = fs.readFileSync('file1.txt', 'utf8'); // file1์ sync์ผ๋ก read ํจ
console.log(data1); // ํ์ผ ๋ด์ฉ ์ถ๋ ฅํ๊ณ ์ ์ ํ ์ฒ๋ฆฌ๋ฅผ ์งํ
const data2 = fs.readFileSync('file2.txt', 'utf8');
console.log(data2);
const data3 = fs.readFileSync('file3.txt', 'utf8');
console.log(data3);
์ด๋ฌํ Sync Blocking ์ ์ฝ๋๊ฐ ์์ฐจ์ ์ผ๋ก ์คํ๋๋ ํน์ฑ์ ๊ฐ์ง๊ณ ์๋ค. ๊ทธ๋์ Sync Blocking ์กฐํฉ์ ์ผ๋ฐ์ ์ผ๋ก ์์
์ด ๊ฐ๋จํ๊ฑฐ๋ ์์
๋์ด ์ ์ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋๋ค. ์์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ฑฐ๋ ํ์ผ ํ๋๋ฅผ ์ฝ๊ณ ์ฐ๋ ๊ฒฝ์ฐ์๋ Sync Blocking ๋ฐฉ์์ด ๋ ๊ฐ๋จํ๊ณ ์ง๊ด์ ์ผ ์ ์๋ค. ํ์ง๋ง ์์
๋์ด ๋ง๊ฑฐ๋ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ์์
์ ์ฒ๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ Sync Blocking ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ๋
์ด ๋๋ค. ์๋ํ๋ฉด ์์
์ ์ฒ๋ฆฌํ๋ฉด ์์
์ด ๋๋ ๋๊น์ง ๋ค๋ฅธ ์์
์ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ฏ๋ก, ์ ์ฒด ์ฒ๋ฆฌ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๊ฒ ๋์ด ๋นํจ์จ์ ์ด๊ฒ ๋๊ฒ ๋๋ค. ๋ฐ๋ผ์ ์ด๋ฌํ ๊ฒฝ์ฐ์๋ ๋ฐ๋ก ๋ค์์ ๋ค๋ฃฐ Async Non-Blocking ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ์์
์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ข๋ค.
์ ์ฉ ํ๋ก๊ทธ๋จ ์์
๋ํ์ ์ผ๋ก C๋ JAVA์ ์ฝ๋ ์คํ ํ ์ปค๋งจ๋์์ ์ ๋ ฅ์ ๋ฐ๋ ๊ฒฝ์ฐ๊ฐ ์ด์ ํด๋น๋๋ค. ์ฌ์ฉ์๋ก๋ถํฐ ์ ๋ ฅ์ ๋ฐ์์ผ ๊ทธ ์ ๋ ฅ๊ฐ์ ๊ฐ์ง๊ณ ๋ด๋ถ ์ฒ๋ฆฌ๋ฅผ ํ์ฌ ๊ฒฐ๊ณผ๊ฐ์ ์ฝ์์ ์ถ๋ ฅํด์ฃผ๊ธฐ ๋๋ฌธ์ ์์ฐจ์ ์ธ ์์ ์ด ์๊ตฌ๋๋ค. ๋ด๋ถ์ ์ผ๋ก ๋ณธ๋ค๋ฉด ์คํ ์ฝ๋๊ฐ ์ฝ์์ฐฝ์ ๋์ฐ๊ณ Please enter your name ํ ์คํธ๋ฅผ ์น๊ณ ๋ ๋ค์ ์ฌ์ฉ์์ ๋ฆฌํด๊ฐ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ์ ์ด๊ถ์ ์์คํ ์์ ์ฌ์ฉ์๋ก ๋๊ฒจ ์ฌ์ฉ์๊ฐ ๊ฐ์ ์ ๋ ฅํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ด๋ค.

Async Non-Blocking ์กฐํฉ
Async Non Blocking ์กฐํฉ์ ๋ค๋ฅธ ์์ ์ด ์งํ๋๋ ๋์์๋ ์์ ์ ์์ ์ ์ฒ๋ฆฌํ๊ณ (Non Blocking), ๋ค๋ฅธ ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ก ์ฒ๋ฆฌํ์ง ์์ ์์ ์์๊ฐ ์ง์ผ์ง์ง ์๋ (Async) ๋ฐฉ์์ด๋ค. ๋ค๋ฅธ ์์ ์ ๊ฒฐ๊ณผ๊ฐ ์์ ์ ์์ ์ ์ํฅ์ ์ฃผ์ง ์์ ๊ฒฝ์ฐ์ ํ์ฉํ ์ ์๋ค.

์ค์ํ ๋์ ์์
- ํ์ฅ : ์ฌ์1์จ A์ ๋ฌด์ข ํด์ฃผ์ธ์. (๋์์ ์ง์)
- ํ์ฅ : ์ฌ์2์จ B์ ๋ฌด์ข ํด์ฃผ์ธ์. (๋์์ ์ง์)
- ํ์ฅ : ์ฌ์3์จ C์ ๋ฌด์ข ํด์ฃผ์ธ์. (๋์์ ์ง์)
- ํ์ฅ : ๋ค๋ฅธ์ผ์ ํด์ผ์ง ~
- ์ฌ์2 : ํ์ฅ์ธ B ๋ชจ๋ ์ฒ๋ฆฌํ์ต๋๋ค. (์ ๋ฌด๋์ ๋ฐ๋ผ ๊ฐ ์ฌ์๋ง๋ค ์๋ฃํ๋ ์๊ฐ์ด ์ ๊ฐ๊ธฐ ๋ค๋ฅผ ์ ์๋ค)
- ์ฌ์1 : ํ์ฅ์ธ A ๋ชจ๋ ์ฒ๋ฆฌํ์ต๋๋ค.
- ์ฌ์3 : ํ์ฅ์ธ C ๋ชจ๋ ์ฒ๋ฆฌํ์ต๋๋ค.
์ฝ๋ ๋์ ์์
์์์ ํ์ผ ์ฝ๊ธฐ ์ฝ๋๋ฅผ Sync Blocking ๋ฐฉ์์ผ๋ก ๊ตฌํํ์๋๋ฐ ์ด๋ฅผ ๊ทธ๋๋ก Async Non-Blocking ๋ฐฉ์์ผ๋ก๋ ์ฝ๋๋ฅผ ๊ตฌํํ ์ ์๋ค. Sync Blocking ๋ฐฉ์๊ณผ ๋๋๋ฌ์ง ์ฐจ์ด์ ์ ํธ์ถ ํจ์์ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฃ์๋ค๋ ์ ์ด๋ค. ์ด๋ฅผ ํตํด ๋น๋๊ธฐ ๋ ผ๋ธ๋กํน ๋ฐฉ์๋๋ก ์ฒ๋ฆฌ๋ ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ฒ๋ฆฌ ํ ์ ์๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋น๋๊ธฐ ์ด๊ธฐ ๋๋ฌธ์ ์์ ์ ์์๋ฅผ ๊ณ ๋ คํ์ง ์์ ๋๊ธฐ ๋ธ๋กํน๊ณผ๋ ๊ฑฐ๊พธ๋ก ๊ฐ์ฅ ๋จผ์ 'done' ์ด๋ผ๋ ์ฝ์ ๋ก๊ทธ๊ฐ ์ฐํ๊ฒ ๋๊ณ ๊ทธ ํ์ ํ์ผ ๋ด์ฉ์ด ์ถ๋ ฅ๋ ๊ฒ์ด๋ค.
// ๋น๋๊ธฐ์ ์ผ๋ก ํ์ผ ์ฝ๊ธฐ
const fs = require('fs'); // ํ์ผ ์์คํ
๋ชจ๋ ๋ถ๋ฌ์ค๊ธฐ
fs.readFile('file.txt', 'utf8', (err, data) => { // ํ์ผ ์ฝ๊ธฐ ์์ฒญ๊ณผ ์ฝ๋ฐฑ ํจ์ ์ ๋ฌ
if (err) throw err; // ์๋ฌ ์ฒ๋ฆฌ
console.log(data); // ํ์ผ ๋ด์ฉ ์ถ๋ ฅ
});
fs.readFile('file2.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
fs.readFile('file3.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
console.log('done'); // ์์
์๋ฃ ๋ฉ์์ง ์ถ๋ ฅ
fs.readFileSync์fs.readFileํจ์๋ ๋๋ค ๋๊ฐ์ด ํ์ผ์ ์ฝ๋ ํจ์์ด์ง๋ง ๋๊ธฐ๋ ๋น๋๊ธฐ๋์ ๋ฐ๋ผ ์ฐจ์ด๊ฐ ์๋ค.
์ฆ,fs.readFileSyncํจ์๋ ๋๊ธฐ์ ์ผ๋ก ํ์ผ์ ์ฝ๊ณfs.readFileํจ์๋ ๋น๋๊ธฐ์ ์ผ๋ก ํ์ผ์ ์ฝ๋๋ค.
์ด์ฒ๋ผ Async Non Blocking ์กฐํฉ์ ์์ ๋์ด ๋ง๊ฑฐ๋ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ์์ ์ ์ฒ๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ์ ์ ํฉํ๋ค. ์๋ฅผ ๋ค์ด, ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ฑฐ๋ ๋ง์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์๋น์ค์์๋ Async Non Blocking ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ํ ์์ ์ด ์ฒ๋ฆฌ๋๋ ๋์ ๋ค๋ฅธ ์์ ์ ์ฒ๋ฆฌํ ์ ์์ผ๋ฏ๋ก ์ ์ฒด ์ฒ๋ฆฌ ์๊ฐ์ ์ค์ผ ์ ์์ด ์ดํ๋ฆฌ์ผ์ด์ ์ฒ๋ฆฌ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์๊ฒ ๋๋ค.
ํ์ฉ ์์ ํ๋ก๊ทธ๋จ
๋น๋๊ธฐ ๋ ผ๋ธ๋กํน์ ํ์ฉํ๋ ํ๋ก๊ทธ๋จ์ ๋ง์ด ์๋ค. ๊ทธ์ค ์๋ฅผ ๋ค์๋ฉด, ์น ๋ธ๋ผ์ฐ์ ์ ํ์ผ ๋ค์ด๋ก๋๊ฐ ๋น๋๊ธฐ ๋ ผ๋ธ๋กํน์ ํ์ฉํ๋ ์์ ๋ผ๊ณ ํ ์ ์๋ค. ์น ๋ธ๋ผ์ฐ์ ๋ ์น ์ฌ์ดํธ์์ ํ์ผ์ ๋ค์ด๋ก๋ํ ๋, ํ์ผ์ ์ ์ก์ด ์๋ฃ๋ ๋๊น์ง ๋ค๋ฅธ ์์ ์ ํ์ง ์๊ณ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ด ์๋๋ผ, ๋ค๋ฅธ ํญ์ด๋ ์ฐฝ์ ์ด๊ฑฐ๋ ์น ์ํ์ ํ ์ ์๋ค. ์ด๋ ์น ๋ธ๋ผ์ฐ์ ๊ฐ ํ์ผ ๋ค์ด๋ก๋๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ , ์ฝ๋ฐฑ ํจ์๋ฅผ ํตํด ๋ค์ด๋ก๋๊ฐ ์๋ฃ๋๋ฉด ์๋ ค์ฃผ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.

Sync Non-Blocking ์กฐํฉ
Sync Non-Blocking ์กฐํฉ์ ๋ค๋ฅธ ์์ ์ด ์งํ๋๋ ๋์์๋ ์์ ์ ์์ ์ ์ฒ๋ฆฌํ๊ณ (Non Blocking), ๋ค๋ฅธ ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ก ์ฒ๋ฆฌํ์ฌ ์์ ์ ์์ฐจ๋๋ก ์ํ ํ๋ (Sync) ๋ฐฉ์์ด๋ค.

์ค์ํ ๋์ ์์
ํ์ฅ์ด ์ ๋ฌด A, B, C๋ฅผ ์ฌ์ 1, 2, 3 ์๊ฒ ์ํค๋ ค๊ณ ํ๋ค. ๊ทธ๋ฐ๋ฐ ์ ๋ฌด ํน์ฑ์ ์ ๋ฌด A๋ฅผ ์๋ฃํด์ผ ์ ๋ฌด B๋ฅผ ํ ์ ์๊ณ , ์ ๋ฌด B๋ฅผ ์๋ฃํด์ผ ์ ๋ฌด C๋ฅผ ํ ์ ์๋ค๊ณ ํ๋ค.
- ํ์ฅ : ์ฌ์1์จ ์ ๋ฌด A ์ข ํด์ฃผ์ธ์
- ์ฌ์1 : ๋ค ์๊ฒ ์ต๋๋ค. (A๋ฅผ ์ฒ๋ฆฌ์ค)
- ํ์ฅ : ๋ค์ ์ ๋ฌด B๋ฅผ ํ๋ ค๋ฉด A๊ฐ ์๋ฃ๋์ผ ํ๋๋ฐ.. ์ฌ์1์จ ๋คํ์ด์?
- ์ฌ์1 : ์์ง์ด์ A ์ฒ๋ฆฌ์ค์ ๋๋ค
- ํ์ฅ : ์ฌ์1์จ ๋คํ์ด์?
- ์ฌ์1 : ์์ง์ด์ A ์ฒ๋ฆฌ์ค์ ๋๋ค
- ์ฌ์1 : ํ์ฅ๋ A ๋ชจ๋ ์๋ฃํ์ต๋๋ค
- ํ์ฅ : ์๊ณ ํ์ด์. ์ฌ์2์จ ์ ๋ฌด B์ข ํด์ฃผ์ธ์.
- ์ฌ์2 : ๋ค ์๊ฒ ์ต๋๋ค. (B๋ฅผ ์ฒ๋ฆฌ์ค)
- ํ์ฅ : ๋ค์ ์ ๋ฌด C๋ฅผ ํ๋ ค๋ฉด B๊ฐ ์๋ฃ๋์ผ ํ๋๋ฐ.. ์ฌ์2์จ ๋คํ์ด์?
- ...์๋ต
์ฝ๋ ๋์ ์์
๋๊ธฐ + ๋ ผ๋ธ๋กํน ์ฝ๋๋ฅผ ํํํ๋๋ฐ ์ ํฉํ ๋์ค์ ์ธ ์ธ์ด๋ก ์๋ฐ(Java)๋ฅผ ๋ค ์์๋ค. ์ค๋ ๋(Thread) ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์์ฒญ ์์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋์ ๋๊ฒ ํ๊ณ ๋ฉ์ธ ๋ฉ์๋์์ while๋ฌธ์ ํตํด ์ค๋ ๋๊ฐ ๋ชจ๋ ์ฒ๋ฆฌ๋์๋์ง ๋์์์ด ํ์ธํ๊ณ , ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋๋ฉด ๋ค์ ๋ฉ์ธ ์์ ์ ์ํํ๋ค.
// Runnable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ํด๋์ค ์ ์
class MyTask implements Runnable {
@Override
public void run() {
// ๋น๋๊ธฐ๋ก ์คํํ ์์
System.out.println("Hello from a thread!");
}
}
public class Main {
public static void main(String[] args) {
// Thread ๊ฐ์ฒด ์์ฑ
Thread thread = new Thread(new MyTask());
// ์ค๋ ๋ ์คํ
thread.start();
// Non-Blocking์ด๋ฏ๋ก ๋ค๋ฅธ ์์
๊ณ์ ๊ฐ๋ฅ
System.out.println("Main thread is running...");
// Sync๋ฅผ ์ํด ์ค๋ ๋์ ์์
์๋ฃ ์ฌ๋ถ ํ์ธ
while (thread.isAlive()) {
System.out.println("Waiting for the thread to finish...");
}
System.out.println("Thread finished!");
System.out.println("Run the next tasks");
}
}

๋ถ๋ช ์ค๋ ๋๋ฅผ ์ด์ฉํ์ฌ ์์ ์ ๋ณ๋ ฌ์ ์ผ๋ก ์ฒ๋ฆฌํ๋๋ก ์ง์ํ์ง๋ง, ๋ฉ์ธ ์ฝ๋์ while๋ฌธ์ ์ํํจ์ผ๋ก์ ์์ฒญํ ์์ ์ ์๋ฃ ์ฌ๋ถ๋ฅผ ๊ณ์ ํ์ธํ๊ณ ๊ฒฐ๊ณผ์ ์ผ๋ก ๊ฒฐ๊ตญ ๋๊ธฐ์ ์ผ๋ก ์์ ์ ์์๋๋ก ์ํ๋จ์ ๋ณผ ์ ์๋ค.

์๋ฐ์คํฌ๋ฆฝํธ(Javascript) ๊ฒฝ์ฐ์๋ ๋๊ธฐ + ๋
ผ๋ธ๋กํน ์ฝ๋๋ฅผ ๊ตฌํํ๊ธฐ์๋ ์ง์ํ๋ ๋ฉ์๋์ ํ๊ณ๊ฐ ์์ด ์๋ฒฝํ ํํํ ์๋ ์๋ค. ๋ค๋ง ์ด์ ๋น์ทํ๊ฒ ํํํ ์ ์๋ ๊ธฐ๋ฒ์ด ์๋ ๋ฐ ๋ฐ๋ก async/await ํค์๋ ์ด๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก Promise.then ํธ๋ค๋ฌ ๋ฐฉ์์ ๋น๋๊ธฐ ๋
ผ๋ธ๋กํน ๋ฐฉ์์ด๋ผ ๋ณผ ์ ์๋ค. ์ด๋ ๋น๋๊ธฐ ์์
๋ค ๊ฐ์ ์์๊ฐ ์ค์ํ๋ค๋ฉด await ํค์๋๋ฅผ ํตํด ๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํด ์ค ์ ์๋ค.
์๋ฅผ ๋ค์ด Node.js์์ ์ฌ๋ฌ๊ฐ์ ํ์ผ์ ์ฝ์ด์ ๋ด์ฉ์ ๋น๊ตํ๋ ์์ ์ ํ๋ค๊ณ ๊ฐ์ ํด๋ณด์. ์ด๋ฅผ Sync Non-Blocking ๋ฐฉ์์ผ๋ก ์์ฑํ๋ค๋ฉด, ์ธ ํ์ผ์ ๋์์ ์ฝ๊ธฐ ์์ํ๊ณ (Non Blocking), ๋ ํ์ผ์ ์ฝ๊ธฐ๊ฐ ๋ชจ๋ ์๋ฃ๋๋ฉด ๋ด์ฉ์ ๋น๊ตํ๋ ํ์ฒ๋ฆฌ๋ฅผ ์งํํ๋ค (Sync).
const fs = require('fs');
const { promisify } = require('util'); // ์ ํธ๋ฆฌํฐ ๋ชจ๋ ๋ถ๋ฌ์ค๊ธฐ
const readFileAsync = promisify(fs.readFile); // fs.readFile ํจ์๋ฅผ Promise ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ํจ์๋ก ๋ณํ
async function readFiles() {
try {
// Promise.all() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ๊ฐ์ ๋น๋๊ธฐ ์์
์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํฉ๋๋ค. (๋น๋๊ธฐ ๋
ผ๋ธ๋กํน)
const [data1, data2, data3] = await Promise.all([
readFileAsync('file.txt', 'utf8'), // file.txt ํ์ผ์ ์ฝ์ต๋๋ค.
readFileAsync('file2.txt', 'utf8'), // file2.txt ํ์ผ์ ์ฝ์ต๋๋ค.
readFileAsync('file3.txt', 'utf8') // file3.txt ํ์ผ์ ์ฝ์ต๋๋ค.
]);
// ํ์ผ ์ฝ๊ธฐ๊ฐ ์๋ฃ๋๋ฉด data์ ํ์ผ ๋ด์ฉ์ด ๋ค์ด์ต๋๋ค.
console.log(data1); // file.txt ํ์ผ ๋ด์ฉ์ ์ถ๋ ฅํฉ๋๋ค.
console.log(data2); // file2.txt ํ์ผ ๋ด์ฉ์ ์ถ๋ ฅํฉ๋๋ค.
console.log(data3); // file3.txt ํ์ผ ๋ด์ฉ์ ์ถ๋ ฅํฉ๋๋ค.
// ํ์ผ ๋น๊ต ๋ก์ง ์คํ...
} catch (err) {
throw err;
}
}
readFiles(); // async ํจ์๋ฅผ ํธ์ถ
async/await์ ๋น๋๊ธฐ ๋ ผ๋ธ๋กํน ๋ฐฉ์์ ๋๊ธฐ ๋ ผ๋ธ๋กํน ๋ฐฉ์์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ ๊ธฐ๋ฒ์ด๋ผ๊ณ ํ ์ ์์ง๋ง, ๊ทธ๋ฌ๋ async/await์ ๋ด๋ถ์ ์ผ๋ก๋ ์ฌ์ ํ ๋น๋๊ธฐ ๋ ผ๋ธ๋กํน ๋ฐฉ์์ผ๋ก ๋์ํ๋ค๋ ์ ์ ์ ์ํ์. async ํจ์ ์์ฒด๊ฐ ๋ฉ์ธ ์ฝ ์คํ(call stack)์ด ๋ชจ๋ ์คํ๋์ด ๋น์์ ธ์ผ ์ํํ๊ธฐ ๋๋ฌธ์ ๋น๋๊ธฐ ๋ ผ๋ธ๋กํน์ด๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ฉ ์์ ํ๋ก๊ทธ๋จ
๋๊ธฐ ๋ ผ๋ธ๋กํน์ ํํ์ง ์๋ ์ผ์ด์ค์ด์ง๋ง ๊ทธ๋๋ ์ด๋ฅผ ํํํ ์ ์๋ ํ๋ก๊ทธ๋จ์ด ์๋ค. ๊ฒ์์์ ๋งต์ ์ด๋ํ ๋๋ฅผ ์๊ฐํด๋ณด์. ์ฐ์ ๋งต ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๋ค์ด๋ก๋ ํด์ผ ํ ๊ฒ์ด๋ค. ๊ทธ๋์ ํ๋ฉด์๋ ๋ก๋ฉ ์คํฌ๋ฆฐ์ด ๋ฌ๋ค. ์ด ๋ก๋ฉ ์คํฌ๋ฆฐ์ ๋ก๋ฉ๋ฐ๊ฐ ์ฑ์์ง๋ ํ๋ก๊ทธ๋จ์ด ์ํํ๊ณ ์๋ ๊ฒ์ด๋ค. ์ฆ, ์ ์ด๊ถ์ ์ฌ์ ํ ๋ํํ ์์ด ํ๋ฉด์ ๋ก๋์จ์ด ํ์๋๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋์์์ด ๋งต ๋ฐ์ดํฐ๊ฐ ์ด๋์ ๋ ๋ก๋๊ฐ ๋ฌ๋์ง ๋์์์ด ์กฐํํ๋ค. ์์ ์ ์์ ์ ๊ณ์ํ๊ณ ์์ง๋ง ๋ค๋ฅธ ์์ ๊ณผ์ ๋๊ธฐ๋ฅผ ์ํด ๊ณ์ํด์ ๋ค๋ฅธ ์์ ์ด ๋๋ฌ๋์ง ์กฐํํ๋ ๊ฒ์ด๋ค.

Sync Blocking vs Sync Non-Blocking
๊ทธ๋ฐ๋ฐ ๊ฐ๋งํ ๋ณด๋ฉด ๋ธ๋กํน์ด๋ ๋ ผ๋ธ๋กํน์ด๋ ๋ฉ์ธ ํจ์์์ ๊ฒฐ๊ตญ์ ์ฝ๋๋ฅผ ์์ฐจ์ ์ผ๋ก ์ํํ๊ธฐ ๋๋ฌธ์ ์ ์ฒด ์์ ์ ์ต์ข ๊ฑธ๋ฆฐ ์๊ฐ์ ๋์ด ์ฐจ์ด๊ฐ ์์ด ๋ณด์ธ๋ค. ๊ทธ๋ผ ๋ ๋ฐฉ์์ ๋๊ธด๊ฐ๊ธด์ธ ๊ฒ์ธ๊ฐ?
์ฑ๋ฅ ์ฐจ์ด๋ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก ๋๊ธฐ + ๋ ผ๋ธ๋กํน์ด ๋๊ธฐ + ๋ธ๋กํน๋ณด๋ค ํจ์จ์ ์ผ ์ ์๋ค. ์๋ํ๋ฉด ๋๊ธฐ + ๋ ผ๋ธ๋กํน์ ํธ์ถํ๋ ํจ์๊ฐ ์ ์ด๊ถ์ ๊ฐ์ง๊ณ ์์ด์ ๋ค๋ฅธ ์์ ์ ๋ณ๋ ฌ์ ์ผ๋ก ์ํํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ฉด์ ๋๊ธฐ + ๋ธ๋กํน์ ํธ์ถํ๋ ํจ์๊ฐ ์ ์ด๊ถ์ ์์ด์ ๋ค๋ฅธ ์์ ์ ์ํํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค
๊ฒ์ ๋ก๋ฉ ํ๋ฉด๊ณผ ๋๋ถ์ด ๋๊ธฐ + ๋ ผ๋ธ๋กํน์ ๋๋ค๋ฅธ ์์ ๋ก๋ ๋ธ๋ผ์ฐ์ ์์ ํ์ผ์ ๋ค์ด๋ก๋ํ๋ฉด ๋ํ๋๋ ๋ค์ด๋ก๋ ์งํ๋ฐ๋ฅผ ๋ค ์ ๊ฐ ์๋ค.

์น๋ธ๋ผ์ฐ์ ์์ ํ์ผ์ ๋ค์ด๋ก๋ ํ ๊ฒฝ์ฐ ์์ ์ ์น๋ธ๋ผ์ฐ์ ์ Web APIs ์ผ๋ก ์์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ๋๊ธฐ๊ณ '์ ์ด๊ถ'์ ๋ฐ๋ก ๋ฐํ๋ฐ์ ๋ค๋ฅธ ์์ ์ ์ํํ ์ ์๋ค. ์ด๊ฒ์ด Non Blocking ์ด๋ค.
๊ทธ๋ฐ๋ฐ ์น๋ธ๋ผ์ฐ์ ๋ ํ์ผ ๋ค์ด๋ก๋ ์์ ์ ์๋ฃ ์ฌ๋ถ์ ๊ด์ฌ์ด ์๋ค. ์ฆ, ๋ค์ด๋ก๋ ์์ ์ด ์ธ์ ๋๋๊ณ ์ผ๋ง๋ ์งํ๋์๋์ง ํ์ผ ๋ค์ด๋ก๋ ๋ก๋์จ์ ๋ธ๋ผ์ฐ์ ํ๋จ๋ฐ์ ํ์ํด์ค๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ผ์ด ๋ชจ๋ ๋ค์ด๋ก๋ ์๋ฃ๋๋ฉด ์ฌ์ฉ์๊ฐ ์ํ๋ ์ต์ข ์์ ์ธ ํ์ผ ๋ค์ด๋ก๋ ์์ ์ ์ํํ๊ฒ ๋๋ค. ์ด๊ฒ์ด Synchronous ์ด๋ค.
์ด๋ ์ฐ๋ฆฌ๋ ํ์ผ์ ๋ค์ด๋ก๋ ํ๋ฉด์ ์น์ํ์ ํ๊ฑฐ๋ ์ ํ๋ธ ์์ ์ ๋ค์ ์ ์๋ค. ์ ์ด๊ถ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฉํฐ ํ์คํน์ ํ๋๋ก ์ ์ ํ ์ฝ๋๋ฅผ ๊ตฌํํ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ๋๊ธฐ + ๋ ผ๋ธ๋กํน ๋ฐฉ์์ ์ผ๋ฐ์ ์ธ ๋๊ธฐ + ๋ธ๋กํน ๋ฐฉ์๋ณด๋ค ๊ตฌํ์ ๋ฐ๋ผ ๋ ํจ์จ์ ์ผ๋ก ์์ ์ ์ฒ๋ฆฌ ํ ์ ์๋ค๊ณ ๋ณผ ์ ์๋ค. (์๋ฐ์คํฌ๋ฆฝํธ์ async/await ์ผ๋ก ์์ํ๋ฉด ์คํ๋ ค ์ดํด๊ฐ ์๋ ์๊ฐ ์๋ค. ์๋ฐ์ ์ค๋ ๋ ๊ฐ์ฒด๋ก ์์ํ์)
Async Blocking ์กฐํฉ
Async Blocking ์กฐํฉ์ ๋ค๋ฅธ ์์ ์ด ์งํ๋๋ ๋์ ์์ ์ ์์ ์ ๋ฉ์ถ๊ณ ๊ธฐ๋ค๋ฆฌ๋ (Blocking), ๋ค๋ฅธ ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ก ์ฒ๋ฆฌํ์ง ์์ ์์๋๋ก ์์ ์ ์ํํ์ง ์๋ (Async) ๋ฐฉ์์ด๋ค. Async-blocking ์ ๊ฒฝ์ฐ๋ ์ค๋ฌด์์ ์ ๋ง์ฃผํ๊ธฐ ์ฝ์ง ์์ ๋ค๋ฃฐ์ผ์ด ๊ฑฐ์ ์๋ค. ๊ทธ๋์ ๊ทธ๋ฅ ๋์ด๊ฐ๋ ํฌ๊ฒ ๋ฌธ์ ๋ ์๋ค.

Async Blocking vs Sync Blocking
์ ์ฌ์ง๋ง ๋ณด๋๋ผ๋ ์์ Sync-blocking ์ํ ๊ทธ๋ฆผ๊ณผ ํฐ ์ฐจ์ด๊ฐ ์์ด ๋ณด์ธ๋ค. ์ค์ ๋ก ๋ ์๋ถ์ด ๋๋ ๊ทธ๋๋ก ๊ฐ๋ ์ ์ผ๋ก ์ฐจ์ด๊ฐ ์์ ๋ฟ์ด์ง ์ ๋ง๋ก ์ฑ๋ฅ์ ์ผ๋ก ์ฐจ์ด๊ฐ ์๋ค.
๋ณดํต Async-blocking์ ๊ฐ๋ฐ์๊ฐ ๋น๋๊ธฐ ๋ ผ๋ธ๋กํน์ผ๋ก ์ฒ๋ฆฌ ํ๋ ค๋ค๊ฐ ์ค์ํ๋ ๊ฒฝ์ฐ์ ๋ฐ์ํ๊ฑฐ๋, ์๊ธฐ๋ ๋ชจ๋ฅด๊ฒ ๋ธ๋กํน ์์ ์ ์คํํ๋ ์๋์น ์์ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋๋ค. ๊ทธ๋์ ์ด ๋ฐฉ์์ ์ํฐ ํจํด(anti-pattern)์ด๋ผ๊ณ ์น๋ถํ๊ธฐ๋ ํ๋ค.
ํ์ฉ ์์ ํ๋ก๊ทธ๋จ
๋ค๋ง Async Blocking ์ด ์ค์ ๋ก ์ ์ฉ๋ ์ค๋ฌด ์ฌ๋ก๊ฐ ์๊ธด ํ๋ค. Node.js + MySQL์ ์กฐํฉ์ด ๋ํ์ ์ธ๋ฐ, Node.js์์ ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ Async ์ด์ง๋ง, MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๊ธฐ ์ํ MySQL ๋๋ผ์ด๋ฒ๊ฐ ๋ธ๋กํน ๋ฐฉ์์ผ๋ก ์๋๋๊ธฐ ๋๋ฌธ์ด๋ค.

- JavaScript๋ ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก MySQL์ ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ธ๋ค. (Async)
- MySQL์ ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๋ฉด์ JavaScript์๊ฒ ์ ์ด๊ถ์ ๋๊ฒจ์ฃผ์ง ์๋๋ค. (Blocking)
- ๊ทธ๋ฌ๋ฉด JavaScript๋ ๋ค๋ฅธ ์์ ์ ๊ณ์ ์ํํ ์ ์์ง๋ง, MySQL์ ๊ฒฐ๊ณผ๊ฐ์ ํ์๋ก ํ๊ธฐ ๋๋ฌธ์ MySQL์ด ์ฟผ๋ฆฌ๋ฅผ ์๋ฃํ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ๋๋ค.
- ๊ฒฐ๊ตญ Sync Blocking๊ณผ ์์ ์ํ์ ์ฐจ์ด๊ฐ ์๊ฒ ๋๋ค.
์ด๋ ๊ฒ JavaScript์ MySQL์ ์กฐํฉ์ ๋น๋๊ธฐ์ ์ด๋ฉด์๋ ๋ธ๋กํน๋๋ Async Blocking ์กฐํฉ์ด๋ผ๊ณ ํ ์ ์๋ค. ์ด๋ฌํ ์ค๋ฌํ ์กฐํฉ์ ์คํ๋ ค ๊ฐ๋ฐ์์๊ฒ ํผ๋๋ง ์ผ์ผํค๊ธฐ ๋๋ฌธ์ ๊ทธ๋์ ์ค๋ฌด์์๋ Node.js ์๋ฒ ํ๋ก๊ทธ๋๋ฐํ ๋ ์์ async/await๋ก ๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํ๋ ํธ์ด๋ค.
const mysql = require('mysql');
// connectDB ํจ์๋ฅผ ์ ์
async function connectDB () {
// DB ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ๋ด์ ๊ฐ์ฒด ์์ฑ
let connectionInfo = {
host: 'localhost', // DB ํธ์คํธ ์ฃผ์
user: 'root', // DB ์ ์ ์ด๋ฆ
password: '1234', // DB ๋น๋ฐ๋ฒํธ
database: 'spyncdb' // DB ์ด๋ฆ
};
// connection ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๋ฐํ
let connection = mysql.createConnection(connectionInfo);
return connection;
}
// mysql ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
async function userHandler (username, displayName, profilePicture, email) {
// DB์ ์ฐ๊ฒฐ
connection = await connectDB()
// DB๋ฅผ ์ ํ
await connection.query ('USE spyncdb;');
// ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์
let result = await connection.query ('SELECT * FROM users WHERE username = ?', [username]);
}
// userHandler ํจ์๋ฅผ ํธ์ถํ๊ณ user_id ๊ฐ์ ์ป์ผ๋ ค๊ณ ํจ
let user_id = await userHandler (aUser.username, aUser.displayName, aUser.profilePicture, aUser.email); // userHandler ํจ์๊ฐ ๋น๋๊ธฐ ์์
์ ์๋ฃํ ๋๊น์ง ๊ธฐ๋ค๋ฆผ
console.log (user_id); // user_id ์ถ๋ ฅ
# ์ฐธ๊ณ ์๋ฃ
https://medium.com/from-the-scratch/wtf-is-synchronous-and-asynchronous-1a75afd039df
https://notes.arkalim.org/notes/programming/asynchronous%20programming/
https://www.youtube.com/watch?v=oEIoqGd-Sns
https://joooing.tistory.com/entry/%EB%8F%99%EA%B8%B0%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%B8%94%EB%A1%9C%ED%82%B9%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9
https://velog.io/@ellyheetov/Asynchoronous-VS-Synchoronous-1
https://velog.io/@nittre/%EB%B8%94%EB%A1%9C%ED%82%B9-Vs.-%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EB%8F%99%EA%B8%B0-Vs.-%EB%B9%84%EB%8F%99%EA%B8%B0
https://ttl-blog.tistory.com/782
์ด ๊ธ์ด ์ข์ผ์ จ๋ค๋ฉด ๊ตฌ๋ & ์ข์์
์ฌ๋ฌ๋ถ์ ๊ตฌ๋
๊ณผ ์ข์์๋
์ ์์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค.