Programming/Node.js

Node.js ์ดํ•ดํ•˜๊ธฐ - ๋น„๋™๊ธฐ ๋…ผ ๋ธ”๋กœํ‚น I/O ๋ชจ๋ธ์— ๋Œ€ํ•ด

osean 2020. 9. 26. 01:23

0. Node.js ๋กœ๊ณ 

๋“ค์–ด๊ฐ€๊ธฐ์— ์•ž์„œ

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 ์ฐธ๊ณ 

 

IO๋ชจ๋ธ (๋™๊ธฐvs๋น„๋™๊ธฐvs๋ธ”๋กœํ‚นvs๋…ผ๋ธ”๋กœํ‚น)

์ฐธ์กฐ๋ฌธ์„œ https://www.slideshare.net/unitimes/sync-asyncblockingnonblockingio http://djkeh.github.io/articles/Boost-application-performance-using-asynchronous-IO-kor/ ์ฐธ ๋งŽ์ด ๋ณด๊ณ , ์จ๋จน๋Š” ์šฉ์–ด๋‹ค. ํ™•..

sjh836.tistory.com

๊ทธ๋ ‡๋‹ค๋ฉด 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/ ์ฐธ๊ณ 

 

Asynchronous IO ๊ฐœ๋… ์ •๋ฆฌ

Boost application performance using asynchronous IO

djkeh.github.io


์ฒ˜์Œ ์‹œ์ž‘์„ ์ด ์ •๋„๋กœ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

์ด๋ ‡๊ฒŒ Node.js ๊ต๊ณผ์„œ์˜ ์™„์ „ ์•ž๋ถ€๋ถ„, ๊ฐœ๋…์„ ํ†บ์•„๋ณด๋ฉฐ ๊ฐ€์žฅ ์ดํ•ด๊ฐ€ ์•ˆ ๋˜์—ˆ๋˜ ๋…ผ ๋ธ”๋กœํ‚น I/O ๋ชจ๋ธ์— ๋Œ€ํ•ด ์–•๊ฒŒ ํ›‘์–ด๋ณด์•˜๋‹ค.

์ด ๋ถ€๋ถ„์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๋ ค๋ฉด ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฌด์—‡์ธ์ง€, Node.js ๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ œ์–ดํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ๋” ๊ณต๋ถ€ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ์ฑ…์„ ์ฝ๊ณ , ๊ฐœ๋…๋“ค์„ ์ •๋ฆฌํ•˜๋ฉด์„œ ๋Š๋‚€ ๊ฒƒ์€ ํ•˜๋‚˜๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด ๊ทธ๋ฅผ ๋” ๊นŠ์ด ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ํ•˜๋‚˜๋ฅผ ์ƒˆ๋กญ๊ฒŒ ๋ฐฐ์›Œ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฐ ์ ๋“ค์ด ๋„ˆ๋ฌด ์žฌ๋ฐŒ๋‹ค.

์†Œ์„ค์ฑ…์„ ์ฝ๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ์ฑ•ํ„ฐ 1์—์„œ๋Š” ์ฃผ์ธ๊ณต์˜ ์ด์•ผ๊ธฐ๊ฐ€ ์ฑ•ํ„ฐ 2์—์„œ๋Š” ์ฃผ์ธ๊ณต์„ ํ‚ค์›Œ์ค€ ์‚ฌ๋žŒ์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด๋‹ค.

๋งˆ์น˜.. ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐ™๋‹ค๊ณ  ํ•ด์•ผ ํ• ๊นŒ? (๋งž๋Š” ๋น„์œ ์ธ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ๋‹ค.. ์•„๋‹ˆ๋ผ๋ฉด ์ €์—๊ฒŒ ๋Œ์„ ๋˜์ ธ์ฃผ์‹œ๊ณ  ํ”ผ๋“œ๋ฐฑ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค..!)

 

์–ด์จŒ๋“ , ์ฒซ ๊ณต๋ถ€๋Š” ์ƒˆ๋ฒฝ์— ์‹œ์ž‘ํ•ด์„œ ์˜ค๋ž˜ ํ•˜์ง€ ๋ชปํ–ˆ์ง€๋งŒ ๋‚ด์ผ๋„ ์ฆ๊ฒ๊ฒŒ ๊ณต๋ถ€ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋‹ค์งํ•˜๋ฉฐ ์•„๋””์˜ค์Šค!