2021-04-02(Fri)

ํ•ญ๋ชฉ

๋‚ด์šฉ

ํ•™์Šต ๋‚ ์งœ

2021-04-02(๊ธˆ)

ํ•™์Šต ์‹œ๊ฐ„

11:00~23:00

ํ•™์Šต ๋ฒ”์œ„ ๋ฐ ์ฃผ์ œ

node.js, express.js

ํ•™์Šต ๋ชฉํ‘œ

qr-checkin ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•™์Šตํ•œ๋‹ค.

๋™๋ฃŒ ํ•™์Šต ๋ฐฉ๋ฒ•

-

์ƒ์„ธ ํ•™์Šต ๋‚ด์šฉ

์˜ค๋Š˜๋ถ€ํ„ฐ ๋ฉ”ํƒ€-์Šคํ„ฐ๋”” ์ž๋ฃŒ๋„ ๋‚จ๊ฒจ๋ณด๊ฒ ๋‹ค.

ํด๋กœ์ € ์ž๋ฃŒ ์ค‘ ๋ํŒ์™•

https://poiemaweb.com/js-closure

C๋กœ ์น˜๋ฉด ์ผ์ข…์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฆญ์— ํ•ด๋‹นํ•˜๋Š” ํ˜„์ƒ์ด var ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด์„œ๋Š” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ผ์–ด๋‚œ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ์— ๋‚จ์•„์žˆ๋‹ค๋‹ˆ. ๊ฑฑ์ •๋งˆ๋ผ ์“ฐ๊ณ ๋‚˜์„œ null ์ฒ˜๋ฆฌํ•ด์ฃผ๋ฉด GC๊ฐ€ ์ฒ˜๋ฆฌํ•ด์ฃผ๋‹ˆ๊นŒ!

Node.js ํ•™์Šต ๋ฉ”๋ชจ

์“ฐ๋ ˆ๋“œ ๊ธฐ๋ฐ˜ vs ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜

๋Œ€๋ถ€๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ Blocking I/O๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ๋ฐ–์— ์—†์—ˆ๋‹ค.

  • Blocking I/O๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์–ด๋–ค ์ž์›์„ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•  ๋•Œ ๊ทธ ์ž์›์„ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ ์œ ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ๊ทธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ทธ ์ž์›์˜ ์‚ฌ์šฉ์„ ๋๋งˆ์น  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

  • ๋ฌธ์ œ๋Š” Blocking I/O ์ž์ฒด๊ฐ€ ์“ฐ๋ ˆ๋“œ ์ง€์—ฐ์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. I/O ์š”์ฒญ์„ ํ•˜๊ณ  ์‘๋‹ต์ด ์˜ฌ ๋•Œ๊นŒ์ง€ ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๊ณ  ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•˜๊ฒŒ ๋œ๋‹ค!

  • ๋˜ํ•œ ์Šค์ผ€์ฅด๋ง ์ž์ฒด์— ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„๊ณผ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋งŽ์•„์งˆ ์ˆ˜๋ก ๋Š˜์–ด๋‚˜๋Š” Context switch ๋น„์šฉ๋„ ๋ฌด์‹œํ•  ์ˆ˜ ์—†๋‹ค.

  • ๋Œ€์•ˆ์œผ๋กœ๋Š” ์“ฐ๋ ˆ๋“œ๋“ค์„ ๋ณ„๋„๋กœ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜, ๋” ์ž‘์€ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ์–ด VM ๋“ฑ์œผ๋กœ ์‹ค์ œ ์“ฐ๋ ˆ๋“œ๋กœ ๋ถ„๋ฐฐํ•˜๋Š” ๋ฐฉ์‹ ๊ฐ™์€ ๋Œ€์•ˆ์ด ๋“ฑ์žฅํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋…ธ๋“œ์˜ ๋ฐฉ์‹๋„ ๋Œ€์•ˆ์ด๋‹ค. ์–ด๋–ค ์‹์ด๋ƒ๋ฉด..

์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ์™€ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜์˜ ๋น„๋™๊ธฐ I/O ์ฒ˜๋ฆฌ

๋…ธ๋“œ๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋“ค์„ ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ์™€ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜์˜ ๋น„๋™๊ธฐ I/O ์ฒ˜๋ฆฌ๋กœ ํ•ด๊ฒฐํ•˜๊ณ  ์žˆ๋‹ค. ๋…ธ๋“œ๋Š” I/O ์ž‘์—…์ด ์‹œ์ž‘๋˜๋ฉด I/O ์ž‘์—… ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ , ๋ฐ”๋กœ ๋‹ค์Œ ์ž‘์—…์„ ์‹คํ–‰ํ•ด๋ฒ„๋ฆฐ๋‹ค. ๋Œ€์‹  I/O ์ž‘์—…์ด ์ข…๋ฃŒ๋˜๋ฉด ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ , ์ด ์ด๋ฒคํŠธ๋Š” ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค์˜ ์ด๋ฒคํŠธ ํ์— ๋“ฑ๋ก๋˜๊ฒŒ ๋œ๋‹ค. ๋…ธ๋“œ๋กœ ๊ฐœ๋ฐœ๋œ ํ”„๋กœ์„ธ์Šค๋Š” ์ด ์ด๋ฒคํŠธ ํ์— ๋“ฑ๋ก๋œ ์ƒˆ๋กœ์šด ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ, ํ•ด๋‹น ์ด๋ฒคํŠธ ์‹œ ์ˆ˜ํ–‰ํ•˜์—ฌ์•ผ ํ•  ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

์ด๋ฒคํŠธ ๋ฃจํ”„

์ด๋ฒคํŠธ ๋ฃจํ”„(Event Loop)๋ผ๋Š” ๊ฒƒ์€ ์ž‘์—…์„ ์š”์ฒญํ•˜๋ฉด์„œ ๊ทธ ์ž‘์—…์ด ์™„๋ฃŒ๋˜์—ˆ์„ ๋•Œ ์–ด๋–ค ์ž‘์—…์„ ์ง„ํ–‰ํ• ์ง€์— ๋Œ€ํ•œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ•˜์—ฌ ๋™์ž‘์ด ์™„๋ฃŒ๋˜์—ˆ์„ ๋•Œ ํ•ด๋‹น ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰๋˜๋Š” ๋ฐฉ์‹์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ๋งํ•œ๋‹ค.

์ด๋Ÿฐ ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ์–ด๋–ค ์š”์ฒญ์ด ๋ฐœ์ƒํ•˜๋ฉด ๊ทธ ์ž‘์—…์— ๋Œ€ํ•ด ์“ฐ๋ ˆ๋“œ ์‹คํ–‰๋งŒ์„ ์ผ์œผํ‚ฌ ๋ฟ์ด๋‹ค.

image

jekim๋‹˜๊ณผ ๊ด€๋ จํ•ด์„œ ํ† ๋ก ํ•˜๋‹ค๊ฐ€ ์ด ๋งํฌ๋ฅผ ๊ณต์œ  ๋ฐ›์•˜๋‹ค.

Node.js์˜ ์•„ํ‚คํ…์ณ

image

์ดˆ์ฐฝ๊ธฐ์˜ Node.js ์•„ํ‚คํ…์ณ.

์ง€๊ธˆ์€ ๊ธฐ์ˆ ์ด ๋ฐœ์ „ํ•˜์—ฌ ์œ„์ฒ˜๋Ÿผ libev์˜ ์ข…์†์„ฑ์„ ์ œ๊ฑฐํ•˜๊ณ  libeio์™€ libev๋ฅผ ์“ฐ๋Š” ๋ฒ„์ „์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค.

๊ฐ ๋ชจ๋“ˆ๋ณ„ ์—ญํ• ์€ ์ด ๋งํฌ๋ฅผ ์ฐธ๊ณ .

npx

๋ผ์ด๋ธŒ ์ฝ”๋”ฉ์„ ๋ณด์•„ํ•˜๋‹ˆ, ๋ชจ๋“ˆ์„ ๋ฐ›์„ ๋•Œ npm, npx, yarn ๋“ฑ์„ ํ˜ผ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง„๋‹ค. ํŠนํžˆ Sequelize๋ฅผ ๋‹ค๋ฃฐ ๋•Œ npx ๋ฅผ ๋งŽ์ด ์“ฐ๊ธฐ์— ์ด ๋…€์„์ด ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ด์ ธ ๋ฒ„๋ ธ๋‹ค.

๊ทธ๋ž˜์„œ npx๋Š” ๋ญ˜๊นŒ?

npx๋Š” ์ƒˆ๋กœ์šด ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ๋ชจ๋“ˆ์ด ์•„๋‹ˆ๋ผ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ๋ชจ๋“ˆ์ธ npm(Node Package Module)์˜ 5.2.0 ๋ฒ„์ „๋ถ€ํ„ฐ ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ๋„๊ตฌ์ด๋‹ค!

npx ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, npm ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์˜ฌ๋ผ๊ฐ€์žˆ๋Š” ํŒจํ‚ค์ง€๋ฅผ ์‰ฝ๊ฒŒ ์„ค์น˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” CLI ๋„๊ตฌ์ด๋‹ค.

  • npm: Package Manager(๊ด€๋ฆฌ)

  • npx: Package Runner(์‹คํ–‰)

์™œ npx๊ฐ€ ๋„์ž…๋  ํ•„์š”๊ฐ€ ์žˆ์—ˆ์„๊นŒ?

๊ณผ๊ฑฐ npm์œผ๋กœ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ๋•Œ ๋‘ ๊ฐ€์ง€ ์ผ€์ด์Šค๊ฐ€ ์žˆ์—ˆ๋‹ค.

  1. ์ „์—ญ์œผ๋กœ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜์—ฌ ์˜์กด์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ์ „์ฒด์ ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•

  2. ํŠน์ • ํ”„๋กœ์ ํŠธ์—๋งŒ ์˜์กด์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•

์ด๋Ÿฌํ•œ ์˜์กด์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ์ „์—ญ์ด๋‚˜ ๋กœ์ปฌ์— ์„ค์น˜๋œ ์ฑ„ ๊ด€๋ฆฌ๊ฐ€ ๋˜๋ฉด ์„ค์น˜๋œ ์œ„์น˜์— ๋”ฐ๋ผ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•ด์ค˜์•ผํ•œ๋‹ค๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ๋ฐœ์ƒํ•œ๋‹ค.

npx๋Š” ๊ธฐ์กด npm ์„ค์น˜ ๋ฐฉ๋ฒ•๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ์ผ์ผ์ด ์„ค์น˜, ์ œ๊ฑฐ๋ฅผ ํ•  ํ•„์š” ์—†์ด ์ผํšŒ์„ฑ์œผ๋กœ ์›ํ•˜๋Š” ํŒจํ‚ค์ง€๋ฅผ npm ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์ ‘๊ทผํ•ด์„œ ์‹คํ–‰์‹œํ‚ค๊ณ  ์„ค์น˜ํ•˜๋Š” ์‹คํ–‰๋„๊ตฌ์ด๋‹ค. ๋”ฐ๋กœ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š๋”๋ผ๋„ npm ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์˜ฌ๋ผ๊ฐ€ ์žˆ๋Š” ์ตœ์‹  ๋ฒ„์ „์„ ์‹คํ–‰์‹œํ‚ค๊ณ  ์„ค์น˜๋งŒ ์‹œํ‚ค๋ฉด ๋์ธ ์…ˆ์ด๋‹ค.

์ฐธ๊ณ 

ํ•™์Šต ๋‚ด์šฉ์— ๋Œ€ํ•œ ๊ฐœ์ธ์ ์ธ ์ดํ‰

์Œฉ๋šฑ๋งž๊ฒŒ node & express ํ•™์Šต์„ ์‹œ์ž‘ํ–ˆ๋‹ค. spring๋„ ๋„˜ ์žฌ๋ฐŒ๊ฒŒ ํ•˜๊ณ  ์žˆ์—ˆ๊ธดํ•œ๋ฐ, QRcheckin์— ์ด๋ฒคํŠธ ํ…Œ์ด๋ธ”์„ ๋ถ™์—ฌ๋ณด๊ณ  ์‹ถ์–ด์ ธ์„œ..ใ…Žใ…Ž;

๋‹ค๋ฅธ ๊ฒƒ๋ณด๋‹ค ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋Š” ๊ฐˆ์ฆ์ด ๋„ˆ๋ฌด ์ปค์ง„ ์ƒํƒœ์ด๋‹ค. ๋ฌด์—‡๋ณด๋‹ค ์‚ฌ๋žŒ๋“ค์ด ๋งŽ์ด ์“ฐ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ๋‹ค. cub3d tester๋„ ์‚ฌ๋žŒ๋“ค์ด ๋งŽ์ด ์จ์ฃผ๋‹ˆ๊นŒ ์ฆ๊ฒ๋”๋ผ. ๋งˆ์นจ ๊ด€์‹ฌ์žˆ์—ˆ๋˜ ๊ฒƒ๋“ค์ด ๋ชจ์—ฌ์žˆ๋‹ค.

  • node

  • QR์ฝ”๋“œ

  • ์ƒ์šฉ ์„œ๋น„์Šค์— ํ…Œ์ด๋ธ” ๋ถ™์ด๊ธฐ

์‚ฌ์‹ค ๋‚˜๋ฅผ ์ œํ•œํ•˜๋Š”๊ฑด ๋‚˜ ๋ฐ–์— ์—†๋‹ค. ๋†€ ์‹œ๊ฐ„์— node & express ๊ณต๋ถ€ํ•ด๋ณด์ž, ๊ทธ๋ƒฅ ์ž ์„ ๋œ ์ž๋ฉด ๋˜์ง€ ๋ญใ…Žใ…Ž :)

flow๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํ•  ๊ฒƒ์ด๋‹ค.

  1. node ๊ธฐ์ดˆ ํ•™์Šต (์™„๋ฃŒ)

  2. QR ์ฝ”๋“œ ๋ฆฌ๋”๊ธฐ ๋œฏ์–ด๋ณด๊ธฐ (์ง„ํ–‰ ์ค‘)

  3. ํ…Œ์ด๋ธ” ๋ถ™์ด๊ธฐ

  4. ๋ถ™์ธ ํ…Œ์ด๋ธ”์— ์ด๋ฒคํŠธ ์ž…๋ ฅํ•˜๋Š” ์–ด๋“œ๋ฏผ ํŽ˜์ด์ง€ ๊ฐœ๋ฐœ

๋‹ค์Œ ํ•™์Šต ๊ณ„ํš

  • QR ์ฝ”๋“œ ๋ฆฌ๋”๊ธฐ์— ํ…Œ์ด๋ธ” ๋ถ™์ด๊ธฐ

Last updated