๋ค์ด๊ฐ๊ธฐ์ ์์
RESTful API? ๋น๋๊ธฐ?
์๋ค๋ค์ด ๋๋์ฒด ๋ญ์ง ?
์ผ๋ง ์ ๊ตญ๋น ์ง์ ํ์์ ์๋ฃํ๋ค. ์ฐ๋ฆฌ ์กฐ๋ LMS์ ๊ธฐ๋ฐ์ผ๋ก ํ ํด์ฆ ํ๋ซํผ์ ๊ฐ๋ฐํ๋๋ฐ, ์ ํ ๋ณ ํด์ฆ์ ๋ํ CRUD๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผํ ๊น ๊ณ ๋ฏผ์ ๋ง์ด ํ๋ค. ๊ทธ๋ฌ๋ฉด์ ์์์ , ํ์์ ์ผ๋ก Ajax ๋ฅผ ์ด์ฉํด์ ๋น๋๊ธฐ๋ก ํด์ฆ CRUD ๋ฅผ ๊ตฌํํ ์๋ฐ์ ์์๋๋ฐ JSON์ด๋ RestController์์ JSON ๊ฐ์ฒด๋ฅผ RequestBody๋ก ๋ฐ์์ผ ํ๋ ์ด์ ์ ๋ํ ์ดํด๊ฐ ๋ถ์กฑํ ์ํ๋ก ์ต์ง๋ก ๊ตฌํํ๋ค.
๊ทธ๋ฌํ ์ด์ ๋ก ์ด๋ฒ ํ์์์์ ๋ง์ง๋ง ํ๋ก์ ํธ ๋๋ฌธ์ ์์ํ Node.js ๊ณต๋ถํ๋ ค๊ณ ํ๋ค.
Node.js ๋ ๋ฌด์์ธ๊ฐ?
Node.js ๋ ํด๋น ๋ฌธ์์์
Chrome V8 Javascript ์์ง์ผ๋ก ๋น๋๋ Javascript ๋ฐํ์
์ด๋ผ๊ณ ํ๋ค. ์ฌ๊ธฐ์ ๋ฐํ์์ด๋ผ๋ ๊ฒ์ ๋ญ๊น?
Runtime ์ด๋?
ํน์ ์ธ์ด๋ก ๋ง๋ ํ๋ก๊ทธ๋จ๋ค์ ์คํํ ์ ์๋ ํ๊ฒฝ์ ๋ปํ๋ค. ์ฆ, Node.js ๋ Javascript ํ๋ก๊ทธ๋จ์ ์ปดํจํฐ์์ ์คํํ ์ ์๋ค. Javascript ๋ ๊ธฐ์กด์ ์น ๋ธ๋ผ์ฐ์ ์ ์ข ์๋์ด ์คํ๋์๊ณ , ์ด๋ฅผ ๋ธ๋ผ์ฐ์ ๋ฐ์ผ๋ก ๊บผ๋ด๋ ค๋ ๋ ธ๋ ฅ์ ๋ง์์ผ๋ ์ ์ด๋ค์ง์ง ์์๋ค.
ํ์ง๋ง Google์์ V8 ์์ง์ ๊ฐ๋ฐํ๊ณ , ์ด๋ฅผ ์ด์ฉํ์ฌ Chrome ๋ธ๋ผ์ฐ์ ๋ฅผ ์ถ์ํ๋ฉด์ Javascript ๋ฅผ ๋ธ๋ผ์ฐ์ ๋ฐ์์๋ ์ฌ์ฉํ ์ ์๊ฒ ๋์๋ค.
Node.js ๋ V8 ์์ง๊ณผ ๋๋ถ์ด libuv๋ผ๋ ๋น๋๊ธฐ I/O ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋๋ฐ, V8 ์์ง๊ณผ libuv ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ C์ C++๋ก ๊ตฌํ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ด๊ฐ ์ฝ๋ฉํ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ ์์์ V8 ํน์ libuv์ ์ฐ๊ฒฐํ์ฌ ๋ณํํด์ค๋ค. ์ฌ๊ธฐ์ libuv ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด๋ฒคํธ ๊ธฐ๋ฐ, ๋ ผ ๋ธ๋กํน I/O ๋ชจ๋ธ์ ๊ตฌํํ๊ณ ์๋ค.
๊ทธ๋ฐ๋ฐ,
๋น๋๊ธฐ ๋ ผ ๋ธ๋กํน I/O ๋ชจ๋ธ์ด ๋ญ๊น?
์ฌ๊ธฐ์ I/O ๋ Input / Output์ด๋ผ๋ ๊ฒ์ ์๊ฒ ๋๋ฐ, ๋ ผ ๋ธ๋กํน? ์์ ์๊ฐ์ ๋ช ๋ฒ ๋ค์๋ ๊ธฐ์ต์ ์์ง๋ง ์ ํํ ์ด๋ค ๊ฒ์ ์๋ฏธํ๋์ง ๋ ์ค๋ฅด์ง ์๋๋ค. ๊ทธ๋์ ๊ฒ์์ ํด๋ณด๊ธฐ๋ก ํ๋ค.
๊ฒ์์ ํด๋ณด๋ ๊ฐ์ฌ๋๊ป์ ์ค๋ช ํด์ฃผ์ จ๋ ๋น์ ๋ค์ด ์ด๋ ดํ ๊ธฐ์ต๋๊ธฐ ์์ํ๋ค.
์ง์์ผ์ ํ๋๋ฐ ๋นจ๋ 1์๊ฐ, ์ค๊ฑฐ์ง 20๋ถ, ๋ฐ๋ฅ ์ฒญ์ 10๋ถ์ด ๊ฑธ๋ฆฐ๋ค๊ณ ํ๋ฉด ๋ธ๋กํน์ ์์ ์ ์์๋๋ก ํ๋ ๋๋๋ฉด ๋ค์ ์ผ์ ์์ํ๋ ๋ฐฉ์์ผ๋ก ์ง์์ผ์ ๋ค ๋๋ด๋๋ฐ ์ด 1์๊ฐ 30๋ถ์ด ๊ฑธ๋ฆฐ๋ค. ๋ฐ๋ฉด ๋ ผ ๋ธ๋กํน์ ๋นจ๋์ ๊ฒฝ์ฐ ๋ด๊ฐ ์ธํ๊ธฐ์ ๋นจ๋ซ๊ฐ๋ง ๋ฃ์ด ๋๊ณ ์ธํ์ ๋๋ฆฌ๋ฉด ์ธํ๊ธฐ๊ฐ ๋์๊ฐ๋ ์ฌ์ด์ ๋๋จธ์ง ์ค๊ฑฐ์ง์ ๋ฐ๋ฅ ์ฒญ์๋ฅผ ๋ง๋ฌด๋ฆฌํ ์ ์๋ค. ์ฆ, ํ ๋ฒ์ ๋ ๊ฐ์ง ์ผ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ ์ ํจ์จ์ด ์ฌ๋ผ๊ฐ๋ค.
์ด๋ ๋ธ๋ก๊ฑฐ ๋ถ์ ์ ๋ฌธ์ ์ธ ๋ง์์ ๊ฐ์ง๊ณ ์ค์๋ฉด,
- ๋ธ๋กํน : ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์ ์ด์์ฒด์ ๋๊ธฐ ํ์ ๋ค์ด๊ฐ๋ฉด์ ์์ฒญ์ ๋ํ System Call ์ด ์๋ฃ๋ ํ์ ์๋ต์ ๋ณด๋ธ๋ค.
- ๋ ผ ๋ธ๋กํน : ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์ ์ด์์ฒด์ ๋๊ธฐ ํ์ ๋ค์ด๊ฐ์ง ์๊ณ , ์คํ ์ฌ๋ถ์ ๊ด๊ณ์์ด ๋ฐ๋ก ์๋ต์ ๋ณด๋ธ๋ค. ๋ฐ๋ก ์๋ตํ๊ธฐ ํ๋ ๊ฒฝ์ฐ, ์๋ฌ๋ฅผ ๋ฐํํ๋๋ฐ ์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ๋๊น์ง ๊ณ์ํด์ ์์ฒญ์ ๋ค์ ๋ณด๋ธ๋ค.
https://sjh836.tistory.com/109 ์ฐธ๊ณ
๊ทธ๋ ๋ค๋ฉด libuv๋ ๋น๋๊ธฐ ๋ ผ ๋ธ๋กํน I/O ๋ชจ๋ธ์ ๊ตฌํํ๋ค๊ณ ํ๋๋ฐ, ์์ ์ค๋ช ์ด ๋๊ธฐ I/O ๋ชจ๋ธ์ ๋ํ ์ค๋ช ์ด๋, ๋น๋๊ธฐ I/O ๋ชจ๋ธ์ ๋ํด์๋ ์์๋ด์ผ ํ ๊ฒ ๊ฐ๋ค.
์ด์ฌํ ๊ฒ์ํด๋ณธ ๊ฒฐ๊ณผ ๋น๋๊ธฐ๋ผ๋ ๊ฒ์ ๋ ผ ๋ธ๋กํน์์ ์ ๊ธฐ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด I/O ํต์ง ๋ชจ๋ธ์ด ๊ณ ์๋์๊ณ , ์ด ๋ชจ๋ธ์ ๋๊ธฐํ ํต์ง ๋ชจ๋ธ / ๋น๋๊ธฐํ ํต์ง ๋ชจ๋ธ๋ก ๋๋์๋๋ฐ,
์ ๋ธ๋ก๊ฑฐ ๋ถ์ ๋ง์์ ๊ฐ์ง๊ณ ์ค๋ฉด,
- ๋๊ธฐ : System Call์ ๊ธฐ๋ค๋ฆฌ์ง๋ง, ์์คํ ์ ๋ฐํ์ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋๊ธฐ ํ์ ๋จธ๋ฌด๋ ๊ฒ์ด ํ์๋ ์๋๋ค. (๋ธ๋กํน์ ๊ฒฝ์ฐ ํ์๋ก ๋จธ๋ฌผ๋ฌ์ผ ํ๋ค.)
- ๋น๋๊ธฐ : System Call ์ ๊ธฐ๋ค๋ฆฌ์ง ์๋๋ค. ์์ฒญ์ ๋ํด ์ฒ๋ฆฌ ์๋ฃ ์ฌ๋ถ์ ๊ด๊ณ์์ด ์๋ตํ๊ณ , ๋ค์ ์ฝ๋๋ฅผ ์คํํ๋ค. ์ดํ์ ์ด์์ฒด์ ์์ ์ฒ๋ฆฌ ์๋ฃ ์ฌ๋ถ๋ฅผ ์๋ ค์ฃผ๊ณ ์๋ตํ๋ค.
์ ๋ธ๋ก๊ฑฐ ๋ถ์ ๊ฒ์๊ธ์ ๊ผผ๊ผผํ ์ฝ์ด๋ดค์ง๋ง ์ ํํ ์ดํด๊ฐ ๋์ง ์๋๋ฐ, ๋๋ฆ๋๋ก ์ ๋ฆฌ๋ฅผ ํด๋ณด์๋ฉด
๋๊ธฐ ๋ชจ๋ธ๊ณผ ๋น๋๊ธฐ ๋ชจ๋ธ์์๋ ๋ธ๋กํน / ๋ ผ๋ธ๋กํน์ผ๋ก ๋๋๋๋ฐ,
- ๋๊ธฐ ๋ธ๋กํน
- ์์ ์ ์ผ์ด ์ ๋ถ ์ํ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค. ์์ ์ผ์ด ์ํ ์๋ฃ๋์ด์ผ์ง ๊ทธ๋ค์์ ์ผ์ด ์ํ๋๋ค.
- ํ ์์ ๋น ํ ๋ฒ์ ์ฌ์ฉ์ - ์ปค๋ ์ฌ์ด์ ๋ฌธ๋งฅ ๊ตํ์ด ๋ฐ์ํ๋ค. (์ ํํ ์ดํดํ์ง ๋ชปํ๋ค.)
- ๋๋น ๋
ผ ๋ธ๋กํน
- ๋๊ธฐ ๋ธ๋กํน์ ๊ฐ์ ํ ๋ฐฉ๋ฒ์ด์ง๋ง ๋ ผ ๋ธ๋กํน์ ๊ฒฝ์ฐ ์ ์ ๋ฐ์ดํฐ๊ฐ ์ฌ ๋๊น์ง ์ง์์ ์ผ๋ก System Call์ ์์ฒญํ๋ค.
- ์ด๋ฌํ ๋ฌธ์ ๋ก ์ธํด I/O ์ง์ฐ์ ๋ฐ์์ํจ๋ค. (๋ ์ดํด์, Latency)
- ๋น๋๊ธฐ ๋ธ๋กํน
- I/O ๋ ๋ ผ ๋ธ๋กํน, ์๋ฆผ์ ๋ธ๋กํน์ผ๋ก ํ๋ ๋ฐฉ์์ผ๋ก select()๋ผ๋ ์์คํ ํจ์ ํธ์ถ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ Block(์ ์ง) ์ํจ๋ค.
- select() ํจ์๋ I/O ์ค๋ช ์์์ ๋ฐ์์ด ์๋ ํ์ธํ๊ณ , ํ ๊ฐ๊ฐ ์๋ ์ฌ๋ฌ ๊ฐ์ I/O ์ค๋ช ์์ ๋ํ ์๋ฆผ ๊ธฐ๋ฅ์ ์ํํ ์ ์๋ ๊ฒ์ด ํน์ง์ด์ง๋ง ์ฌ์ ํ ๋นํจ์จ์ ์ด๋ค.
- ๋น๋๊ธฐ ๋
ผ ๋ธ๋กํน
- System Call ์ด ์ฆ์ I/O ๊ฐ์ ์ฌ๋ถ๋ฅผ ๋ฐํํ๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ ๋ชฉ์ ์ ์ผ์ ์ํํ๊ณ , I/O ๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํํ๋ค.
- I/O ์๋ต(Response)์ด ๋์ฐฉํ๋ฉด ์ ํธ(Signal)๋ ์ค๋ ๋ ๊ธฐ๋ฐ ์ฝ๋ฐฑ(callback)์ผ๋ก I/O ์ ๋ฌ(Transaction)์ ์๋ฃํ๋ค.
- ๋จ์ผ ํ๋ก์ธ์ค๊ฐ ์ฌ๋ฌ ๊ฐ์ I/O ์์ฒญ์ด ์์๋๋ ํ๊ฒฝ ์์์ ์ปดํจํฐ ์ฐ์ฐ์ด๋ I/O ์์ ์ ๋ณ๋ ฌ ์ํํ๋ ๊ธฐ๋ฅ์ ์ฒ๋ฆฌ ์๋์ I/O ์๋ ์ฌ์ด์ ํ์ ์ ๋ฐํ๋ค.
https://djkeh.github.io/articles/Boost-application-performance-using-asynchronous-IO-kor/ ์ฐธ๊ณ
์ฒ์ ์์์ ์ด ์ ๋๋ก ๋ง๋ฌด๋ฆฌํ๋ฉฐ
์ด๋ ๊ฒ Node.js ๊ต๊ณผ์์ ์์ ์๋ถ๋ถ, ๊ฐ๋ ์ ํบ์๋ณด๋ฉฐ ๊ฐ์ฅ ์ดํด๊ฐ ์ ๋์๋ ๋ ผ ๋ธ๋กํน I/O ๋ชจ๋ธ์ ๋ํด ์๊ฒ ํ์ด๋ณด์๋ค.
์ด ๋ถ๋ถ์ ์ ๋๋ก ์ดํดํ๋ ค๋ฉด ์ค๋ ๋๊ฐ ๋ฌด์์ธ์ง, Node.js ๋ ์ค๋ ๋๋ฅผ ์ด๋ป๊ฒ ์ ์ดํ๋์ง์ ๋ํด ๋ ๊ณต๋ถํด์ผ ํ ๊ฒ ๊ฐ๋ค.
๊ทธ๋ฆฌ๊ณ ์ฑ ์ ์ฝ๊ณ , ๊ฐ๋ ๋ค์ ์ ๋ฆฌํ๋ฉด์ ๋๋ ๊ฒ์ ํ๋๋ฅผ ๊ณต๋ถํ๋ฉด ๊ทธ๋ฅผ ๋ ๊น์ด ์ดํดํ๊ธฐ ์ํด ๋ค๋ฅธ ํ๋๋ฅผ ์๋กญ๊ฒ ๋ฐฐ์์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
์ด๋ฐ ์ ๋ค์ด ๋๋ฌด ์ฌ๋ฐ๋ค.
์์ค์ฑ ์ ์ฝ๋ ๊ฒ ๊ฐ๋ค. ์ฑํฐ 1์์๋ ์ฃผ์ธ๊ณต์ ์ด์ผ๊ธฐ๊ฐ ์ฑํฐ 2์์๋ ์ฃผ์ธ๊ณต์ ํค์์ค ์ฌ๋์ ๋ํ ์ด์ผ๊ธฐ๊ฐ ๋์ค๋ ๊ฒ์ฒ๋ผ ๋ง์ด๋ค.
๋ง์น.. ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ค๊ณ ํด์ผ ํ ๊น? (๋ง๋ ๋น์ ์ธ์ง๋ ๋ชจ๋ฅด๊ฒ ๋ค.. ์๋๋ผ๋ฉด ์ ์๊ฒ ๋์ ๋์ ธ์ฃผ์๊ณ ํผ๋๋ฐฑ ๋ถํ๋๋ฆฝ๋๋ค..!)
์ด์จ๋ , ์ฒซ ๊ณต๋ถ๋ ์๋ฒฝ์ ์์ํด์ ์ค๋ ํ์ง ๋ชปํ์ง๋ง ๋ด์ผ๋ ์ฆ๊ฒ๊ฒ ๊ณต๋ถํ ์ ์๊ธฐ๋ฅผ ๋ค์งํ๋ฉฐ ์๋์ค์ค!
'Programming > Node.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Javascript ์ดํดํ๊ธฐ - Prototype / Class (0) | 2020.10.05 |
---|---|
Node.js ์ดํดํ๊ธฐ - ์ฑ๊ธ ์ค๋ ๋ (0) | 2020.09.27 |
Node.js ์ดํดํ๊ธฐ - ์ด๋ฒคํธ ๊ธฐ๋ฐ ์์คํ (0) | 2020.09.26 |