Upgrade to PRO for Only $50/Yearโ€”Limited-Time Offer! ๐Ÿ”ฅ

Node.js 101 for Student

Avatar for Jimmy Moon Jimmy Moon
September 20, 2016
110

Node.js 101 forย Student

Node

Avatar for Jimmy Moon

Jimmy Moon

September 20, 2016
Tweet

Transcript

  1. Jimmy Moon ( ๋ฌธํ˜„๊ฒฝ, @ragingwnd) KOSSLAB 2๊ธฐ Google Developer Expert

    Yeoman ๋“ฑ node/webapp ์˜คํ”ˆ์†Œ์Šค ์ฝ”์–ด ๋ฉค๋ฒ„ 2
  2. Understanding Node(.js) ๊ณต์‹์ ์œผ๋กœ๋Š” Node(node), ๋‹จ์–ด ํ˜ผ๋™์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด Node.js V8

    ์—”์ง„( ๋‹น๋ถ„๊ฐ„) ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ทธ๋ž˜์„œ Javascript ์„ ์ฃผ์–ธ์–ด๋กœ ์‚ฌ์šฉ ( ๋น„๊ต์ ) ๊ฐ€๋ณ๊ณ , ๋น ๋ฅด๋ฉฐ, ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์—์„œ ๋™์ž‘ํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ ๋น„๋™๊ธฐ(Asynchronous) I/O via libuv ์ด๋ฒคํŠธ- ๋“œ๋ฆฌ๋ธ(Event-driven) ๊ทธ๋ฆฌ๊ณ  ๋„Œ๋ธ”๋Ÿญํ‚น(Non-Blocking) I/O ์—„์ฒญ๋‚˜๊ฒŒ ํ™œ๋ฐœํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ์€ํ˜œ. Node ํŒŒ์šด๋ฐ์ด์…˜๊ณผ NPM Packages 3
  3. V8 Javascript Engine ๊ธฐ์กด ๋Œ€๋น„ ์›”๋“ฑํ•œ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ฃผ๋Š” Javascript ์—”์ง„(

    ์ธํ„ฐํ”„๋ฆฐํ„ฐ) ๋…๋ฆฝ์ ์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์™€ ๊ฒฐํ•ฉ ๊ฐ€๋Šฅ. Node.js, MongoDB, Electron ๋“ฑ V8 ์—”์ง„ ์—…๋ฐ์ดํŠธ์™€ ํ•จ๊ป˜ Javascript ์˜ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ธฐ๋Šฅ ์ถ”๊ฐ€. ES2015 ์ถ”๊ฐ€ ์ŠคํŽ™ (ECMAScript 2015 stage-x) 2017 ๋…„ ์—ฌ๋Ÿฌ ์—”์ง„ ์‚ฌ์šฉ๊ฐ€๋Šฅ ์˜ˆ์ƒ. ( ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ Edge ๋ธŒ๋ผ์šฐ์ €์˜ ChakraCore) 4
  4. High-performance for Low Resource Consumer ( ์†Œ์‹œ์ ์—) ๋น„๊ต์  ๋น ๋ฅธ ์„ฑ๋Šฅ

    ๋ณด์—ฌ์คŒ ์ ์€ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ์—์„œ ์ดˆ๋‹น ์ˆ˜๋งŒ๊ฑด์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋งŒ๋ช… ์ด์ƒ์˜ ๋™์‹œ์ ‘์†์ž ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ ( ๋ผ์ดํŠธํŒจํ‚ท) ๋‹ค์–‘ํ•œ ( ๋น„๊ต์  ์ €์‚ฌํ–ฅ) IoT ๋ชจ๋“ˆ์— ์ž„๋ฒ ๋””๋“œ V8 ์™€ node ๋ฅผ ์œ„ํ•œ ๋‚ด์žฅ / ์™ธ์žฅ ํ”„๋กœํŒŒ์ผ๋Ÿฌ ์ œ๊ณต 5
  5. Asynchronous I/O via libuv ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ์—์„œ ๊ณ ์„ฑ๋Šฅ I/O ๋ณด์žฅ ๋ฉ€ํ‹ฐ

    ํ”Œ๋žซํผ์—์„œ ์•ˆ์ •์ ์ธ ๋น„๋™๊ธฐ I/O ์ง€์› node ์ด๋ฒคํŠธ ๋ฃจํ”„์˜ ์œ ๋‹ˆ์ฝ˜ 6
  6. Event Loop for Event-driven APIs and Non-blocking I/O Morning Keynote

    - Everything You Need to Know About Node.js Event Loop - Bert Belder 7
  7. 8

  8. 9

  9. 10

  10. 11

  11. 12

  12. 13

  13. 14

  14. 15

  15. Event Loop s e t I m m e d

    i a t e ( ( ) = > c o n s o l e . l o g ( " 1 " ) ) ; s e t T i m e o u t ( ( ) = > c o n s o l e . l o g ( " 2 " ) , 0 ) ; P r o m i s e . r e s o l v e ( ) . t h e n ( ( ) = > c o n s o l e . l o g ( ' 3 ' ) ) ; s e t T i m e o u t ( ( ) = > c o n s o l e . l o g ( " 4 " ) , 0 ) ; ( ( ) = > c o n s o l e . l o g ( ' 5 ' ) ) ( ) ; P r o m i s e . r e s o l v e ( ) . t h e n ( ( ) = > c o n s o l e . l o g ( ' 6 ' ) ) ; p r o c e s s . o n ( ' b e f o r e E x i t ' , ( ) = > { c o n s o l e . l o g ( ' 7 ' ) ; } ) ; Question?: ์ด๋ฒคํŠธ ์ผ์–ด๋‚˜๋Š” ์ˆœ์„œ๋ฅผ ์ถ”์ธกํ•ด๋ณด์„ธ์š” 1: 3 5 6 1 2 4 7 2: 5 3 6 1 2 4 7 3: 3 5 6 2 4 1 7 4: 5 3 6 2 4 1 7 16
  16. 18

  17. Getting Started Node Node 6.9.x LTS ๋ฒ„์ „ ๊ธฐ์ค€ https://github.com/nodejs/LTS#lts_schedule NVM

    ์„ ์‚ฌ์šฉํ•œ Node ์„ค์น˜ Node ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ๊ณผ NPM ์‚ฌ์šฉ ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ• ๋ชจ๋“ˆ (module) ๋กœ๋”ฉ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ: ์ฝœ๋ฐฑ(Callback), ํ”„๋ผ๋ฏธ์Šค(Promise) ํ•ธ๋“ค๋ง ์—๋Ÿฌ, ์˜ˆ์™ธ(Exception) ์ฒ˜๋ฆฌ ๊ธฐ๋ณธ API ์‚ฌ์šฉ๋ฒ•: Net / HTTP / File System / Stream 20
  18. Installing Node with NVM # g e t v e

    r s i o n s c a n b e i n s t a l l a b l e n v m l s - r e m o t e # i n s t a l l n o d e n v m i n s t a l l v 6 . 9 . 1 n v m i n s t a l l - - l t s # g e t v e r s i o n s i n s t a l l e d n v m l s # u s e a v e r s i o n n v m u s e v 6 . 9 . 1 21
  19. Setting up Projects by NPM / yarn ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ์ ํŠธ๋Š” ์—ฌ๋Ÿฌ

    ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ด์„œ ์‚ฌ์šฉ. ๊ทธ ์ •๋ณด๋“ค์„ package.json ์— ์ €์žฅ # i n i t p r o j e c t y a r n i n i t o r n p m i n i t # i n s t a l l p a c k a g e s o f t h e p r o j e c t y a r n i n s t a l l o r n p m i n s t a l l # i n s t a l l n e w p a c k a g e t o d e p e d e n c i e s y a r n a d d P A C K A G E _ N A M E o r n p m i n s t a l l โ€” s a v e P A C K A G E _ N A M E # i n s t a l l n e w p a c k a g e t o d e v d e p e d e n c i e s y a r n a d d - - d e v P A C K A G E _ N A M E o r n p m i n s t a l l โ€” s a v e - d e v P A C K A G E _ N A M E # r u n s c r i p t s y a r n s t a r t o r n p m s t a r t y a r n t e s t o r n p m t e s t y a r n r u n m y - c o m m a n d o r n p m r u n m y - c o m m a n d 22
  20. Module Importing(loading) / / i n t e r n

    a l m o d u l e c o n s t f s = r e q u i r e ( ' f s ' ) ; / / i n s t a l l e d m o d u l e a t n o d e _ m o d u l e s c o n s t l i b = r e q u i r e ( ' l i b ' ) ; / / u s e r m o d u l e c o n s t f o o = r e q u i r e ( ' . / f o o ' ) ; / / d e s t r u c t u r i n g i n E S 2 0 1 5 c o n s t { a p p } = r e q u i r e ( ' e l e c t r o n ' ) ; / / i n a w a y o f E S 2 0 1 5 , n o t y e t l a n d i n g , u s i n g t r a n s f i l e r l i k e b a b e l . j s c o n s t e l e c t r o n , { a p p } i m p o r t ' e l e c t r o n ' ; 23
  21. Module Exporting / / l e g a c y

    , u s i n g n o d e ' s m o d u l e s s y s t e m m o d u l e . e x p o r t s = f u n c t i o n l i b ( ) { r e t u r n ' e x p o r t e d ' ; } / / E S 2 0 1 5 , n o t y e t l a n d i n g , u s i n g t r a n s f i l e r l i k e b a b e l . j s e x p o r t d e f a u l t f u n c t i o n l i b ( ) { r e t u r n ' e x p o r t e d i n a n e w w a y ' ; } 24
  22. Event / Error Handling with Callback Callback ์€ node ์˜

    low-level APIs ์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ๋ฒ• Error First Callback c o n s t f s = r e q u i r e ( ' f s ' ) ; f s . s t a t ( ' . ' , ( e r r , s t a t s ) = > { i f ( e r r ) { c o n s o l e . l o g ( e r r ) ; r e t u r n ; } c o n s o l e . l o g ( s t a t s ) ; } ) ; 25
  23. Event / Error Handling with Promise c o n s

    t f s = r e q u i r e ( ' f s ' ) ; f u n c t i o n f s S t a t P r o m i s e ( p a t h ) { r e t u r n n e w P r o m i s e ( ( r e s o l v e , r e j e c t ) = > { f s . s t a t ( p a t h , ( e r r , s t a t s ) = > { i f ( e r r ) { r e s j e c t ( e r r ) ; } r e s o l v e ( s t a t s ) ; } ) ; } ) ; } f s S t a t P r o m i s e ( ' . ' ) . t h e n ( s t a t s = > { c o n s o l e . l o g ( s t a t s ) ; } ) . c a t c h ( e r r = > { c o n s o l e . l o g ( e r r ) ; } ) ; 26
  24. Custom Event Class with EventEmitter c o n s t

    E v e n t E m i t t e r = r e q u i r e ( ' e v e n t s ' ) ; c l a s s H T T P 3 e x t e n d s E v e n t E m i t t e r { r e q u e s t ( m s g ) { i f ( ! m s g ) { t h i s . e m i t ( ' r e q u e s t ' , n e w E r r o r ( ' n o m e s s a g e ' ) ) ; r e t u r n ; } t h i s . e m i t ( ' r e q u e s t ' , n u l l , m s g ) ; } } c o n s t h t t p 3 = n e w H T T P 3 ( ) ; h t t p 3 . o n ( ' r e q u e s t ' , ( e r r , m s g ) = > { i f ( e r r ) { t h r o w e r r ; } c o n s o l e . l o g ( ' d o n e w i t h ' , m s g ) ; } ) ; h t t p 3 . r e q u e s t ( ' m s g ' ) ; h t t p 3 . r e q u e s t ( ) ; / / w i l l c a u s e e r r o r 27
  25. Protips: Promisify a callback-style function Install y a r n

    a d d - - d e v p i f y How to use c o n s t f s = r e q u i r e ( ' f s ' ) ; c o n s t p i f y = r e q u i r e ( ' p i f y ' ) ; c o n s t f s p = p i f y ( f s ) ; f s p . s t a t ( ' . ' ) . t h e n ( s t a t s = > { c o n s o l e . l o g ( s t a t s ) ; } ) . c a t c h ( e r r = > { c o n s o l e . e r r o r ( e r r ) ; } ) ; 28
  26. Node APIs Using Exmples Net: Echo Server using TCP and

    telnet HTTP: Very simple http server. Say Hello! Stream: Using stream in practice 29
  27. Net: Echo Server using TCP and telnet c o n

    s t n e t = r e q u i r e ( ' n e t ' ) ; c o n s t s e r v e r = n e t . c r e a t e S e r v e r ( s = > { c o n s o l e . l o g ( ' c l i e n t c o n n e c t e d ' ) ; / / h a n d l e c l o s i n g c o n n e c t i o n s . o n ( ' e n d ' , ( ) = > { c o n s o l e . l o g ( ' c l i e n t d i s c o n n e c t e d ' ) ; } ) ; / / w r i t e w e l c o m e m e s s a g e s . w r i t e ( ' h e l l o \ n \ n ' ) ; / / e c h o m e s s a g e c o m e f r o m c l i e n t s . p i p e ( s ) ; } ) . o n ( ' e r r o r ' , e r r = > { t h r o w e r r ; } ) ; / / t o c o n n e c t , t e l n e t 0 . 0 . 0 . 0 8 0 8 0 s e r v e r . l i s t e n ( { p o r t : 8 0 8 0 } , ( ) = > { c o n s o l e . l o g ( ' S e r v e r h a s b e e n s t a r t e d ' , s e r v e r . a d d r e s s ( ) ) ; } ) ; 30
  28. HTTP: Very simple http server. Say Hello! c o n

    s t h t t p = r e q u i r e ( ' h t t p ' ) ; c o n s t i n d e x H T M L = ` < h t m l > < h e a d > < / h e a d > < b o d y > < d i v > H e l l o < / d i v > < / b o d y > < / h t m l > ` ; c o n s t s e r v e r = h t t p . c r e a t e S e r v e r ( ( r e q , r e s ) = > { r e s . w r i t e H e a d ( 2 0 0 , { ' C o n t e n t - T y p e ' : ' t e x t / h t m l ' } ) ; r e s . e n d ( i n d e x H T M L ) ; } ) ; s e r v e r . o n ( ' c l i e n t E r r o r ' , ( e r r , s ) = > { s o c k e t . e n d ( ' H T T P / 1 . 1 4 0 0 B a d R e q u e s t \ r \ n \ r \ n ' ) ; } ) ; / / t o v i e w , t y p e l o c a l h o s t : 8 0 8 0 o n w e b b r o w s e r o r c u r l 0 . 0 . 0 . 0 : 8 0 8 0 s e r v e r . l i s t e n ( 8 0 8 0 , ( ) = > { c o n s o l e . l o g ( ' S e r v e r h a s b e e n s t a r t e d ' , s e r v e r . a d d r e s s ( ) ) ; } ) ; 31
  29. Stream node ์—์„œ ๊ธฐ๋ณธ์ ( ๋น„๋™๊ธฐ์ ) ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ๋ฐฉ๋ฒ•

    ๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ์ด๋‚˜ ๋„คํŠธ์›์—์„œ ๋“ค์–ด์˜ค๋Š” ๋ฐ์ดํ„ฐ(Stream) ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์šฉ์ด TCP, HTTP requests / responses fs write, zlib, crypto, streams process.stdout, process.stderr, child process stdin Readable, Writable, Duplex/Transform (both readable and writable) 32
  30. Stream: Transform ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” Stream, Duples (Readable / Writable) pipe()

    ๋ฅผ ํ•œ ์—ฐ๊ฒฐ์ฒ˜๋ฆฌ(pipelining) ํ•˜์ง€๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ ๊ตฌํ˜„ํ•˜๊ธฐ ๋‹ค์†Œ ๊ท€์ฐฎ์Œ v a r s t r e a m = r e q u i r e ( ' s t r e a m ' ) ; v a r l i n e r = n e w s t r e a m . T r a n s f o r m ( { o b j e c t M o d e : t r u e } ) ; l i n e r . _ t r a n s f o r m = f u n c t i o n ( c h u n k , e n c o d i n g , d o n e ) { / / a f t e r p r o c e s s i n g d o n e ( ) } ; 33
  31. Protips: through2 ์‹ค์ œ ๋งŽ์€ node ๋ชจ๋“ˆ์—์„œ ์‚ฌ์šฉ ์ฝ๊ธฐ - ํฌ์ŠคํŠธ

    ํ”„๋กœ์„ธ์‹ฑ1 - ํฌ์ŠคํŠธ ํ”„๋กœ์„ธ์‹ฑ2 - ์“ฐ๊ธฐ ํ˜•ํƒœ์˜ ์—ฐ๊ฒฐ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ f s . c r e a t e R e a d S t r e a m ( ' b i g f i l e . t x t ' ) / / p i p e t o p o s t p r o c e s s 1 . p i p e ( t h r o u g h 2 ( f u n c t i o n ( c h u n k , e n c , d o n e ) { c h u n k = p r o c e s s ( c h u n k ) ; t h i s . p u s h ( c h u n k ) ; / / p i p e t o n e x t s t r e a m d o n e ( ) ; } ) ) / / p i p e t o w r i t e s t r e a m . p i p e ( f s . c r e a t e W r i t e S t r e a m ( ' o u t . t x t ' ) ) . o n ( ' f i n i s h ' , f u n c t i o n ( ) { d o S o m e t h i n g S p e c i a l ( ) ; } ) ; 34
  32. 35% Node Packages node ์˜ ์‹œ์ž‘๊ณผ ๋์€ npm (with cli)

    ์ˆ˜์‹ญ๊ฐ€์ง€์˜ ๋„๊ตฌ๋“ค์ด npm ์œผ๋กœ ์ œ๊ณต ์‹ ๋ง์žˆ๊ณ  ์œ ์ง€๋ณด์ˆ˜(contribution)๊ฐ€ ์ž˜ ๋˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ์€(like) ๋ชจ๋“ˆ์„ ์‚ฌ์šฉ Javascript ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ๋„๊ตฌ(shell script) ๋„ Javascript ๋กœ ๊ฐœ๋ฐœ 35
  33. 35% Shell Script with Node # ! / u s

    r / b i n / e n v n o d e / / p a r s e a r g u m e n t a n d o p t i o n s c o n s t a r g v = p r o c e s s . a r g v . s l i c e ( 2 ) ; d o _ w o r k ( a r g v ) ; / / o p t i o n a l , i f n o j o b i n t a s k / / p r e v e n t t o p r o c e s s e x i t i m m e d i a t e l y p r o c e s s . s t d i n . r e s u m e ( ) ; 36
  34. 35% Publishing Your Node Package for All ๋ˆ„๊ตฌ๋“ ์ง€, ์–ด๋–ค node

    package ๋“  publish ๊ฐ€๋Šฅ. ๋Œ€๋ฐ•๋‚˜๊ฑฐ๋‚˜ ๊พธ์ค€ํ•˜๋‹ค๋ฉด ๋žญํ‚น๋„ ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’๊ฑฐ๋‚˜ ์œ ์šฉํ•œ ๋ชจ๋“ˆ, ๋„๊ตฌ๋“ค์„ ์ œ์ž‘ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋žซํผ ์••๋„์  ์ˆซ์ž์˜ ํŒจํ‚ค์ง€, ์ž์œ ์Šค๋Ÿฌ์šด ๋ฆฌ์ธ๋ฒคํŠธ- ํœ (YAFS) ๋ฌธํ™” 37
  35. 35% Making your ๏ฌrst npm package ์ค€๋น„๋ฌผ: github ๊ณ„์ •๊ณผ ๋ฆฌํผ์ง€ํ† ๋ฆฌ,

    npm ๊ฐœ๋ฐœ์ž ๋“ฑ๋ก # m a k i n g d i r e c t o r y m k d i r [ Y O U R I D ] & & c d [ Y O U R I D ] # c r e a t a n d c o d e u p a t i n d e x . j s t o u c h i n d e x . j s & & t o u c h t e s t . j s # i n i t p r o j e c t a n d i n p u t ` p a c k a g e n a m e ` , ` m a i n ` , g i t a d d r e s s , a n d m o r e n p m i n i t # g i t i n i t , c o m m i t a n d p u s h g i t i n i t & & g i t r e m o t e a d d o r i g i n [ Y O U R - R E P O ] g i t a d d - A & & g i t c o m m i t - a - m ' i n i t ' & & g i t p u s h o r i g i n m a s t e r # p u b l i s h ( o r v e r s i o n u p ) n p m p u b l i s h 38
  36. 35% Protips: Yeoman generator-nm # I n s t a

    l l w i t h y e o m a n n p m i n s t a l l - - g y o g e n e r a t o r - n m # S c a f f o l d i n g n o d e m o d u l e w i t h c l i o p t i o n y o n m - - c l i 39
  37. Node for Web Applications express.js: HTTP server for serving static

    ๏ฌle serving and response socket.io: Connection-oriented chat service on browser via WebSocket Tooling for web application client 40
  38. Fast, unopinionated, minimalist web framework for node. ์‚ฌ์‹ค์ƒ ํ‘œ์ค€(defacto) ์›น์„œ๋ฒ„

    Node.js Foundation ํ”„๋กœ์ ํŠธ๋กœ ํŽธ์ž… ๊ธฐ๋ณธ์ ์ธ ์›น์„œ๋ฒ„ ๊ธฐ๋Šฅ์— ์ถฉ์‹ค ๋ผ์šฐํŒ…(routing), HTTP ํ—ฌํผ APIs, Static ๏ฌle ์„œ๋น™ ์—๋Ÿฌ์ฒ˜๋ฆฌ, DB ์ฒ˜๋ฆฌ๋“ฑ ๋ฏธ๋“ค์›จ์–ด(Middleware) ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋Šฅํ™•์žฅ์— ์šฉ์ด ๊ทธ ์™ธ๋กœ, Koa, Next.js, Loopback 41
  39. Install as a package y a r n a d

    d - - d e v e x p r e s s 42
  40. Basic routing a p p . M E T H

    O D S [ g e t | p o s t | p u t | d e l e t e ] ( ' / ' , ( r e q , r e s ) = > { r e s . s e n d ( ' r o u t i n g / ' ) ; } ) ; Static ๏ฌle a p p . u s e ( ' / s t a t i c ' , e x p r e s s . s t a t i c ( p a t h . j o i n ( _ _ d i r n a m e , ' p u b l i c ' ) ) ) ; 43
  41. Route paths / / ? , + , * ,

    a n d ( ) a r e s u b s e t s o f t h e i r r e g u l a r e x p r e s s i o n c o u n t e r p a r t s a p p . g e t ( / @ . * / , ( r e q , r e s ) = > { r e s . s e n d ( r e q . o r i g i n a l U r l . r e p l a c e ( / ^ \ / @ / , ' ' ) ) ; } ) ; / / r o u t e w i t h p a r a m s t o g e t u s e r i n f o a p p . g e t ( ' / u s e r s / : u s e r I d ' , ( r e q , r e s ) = > { r e s . s e n d ( r e q . p a r a m s ) ; } ) ; 44
  42. Route module, ๋ณ„๋„์˜ ๋ฏธ๋“ค์›จ์–ด์™€ ๋ชจ๋“ˆ ๋‹จ์œ„๋กœ ๋ผ์šฐํŠธ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ c

    o n s t r o u t e r = e x p r e s s . R o u t e r ( ) ; / / m i d d l e w a r e t h a t i s s p e c i f i c t o t h i s r o u t e r r o u t e r . u s e ( ( r e q , r e s , n e x t ) = > { c o n s o l e . l o g ( ` [ L O G : $ { D a t e . n o w ( ) } ] : $ { r e q . o r i g i n a l U r l } ` ) ; n e x t ( ) ; } ) ; r o u t e r . g e t ( ' / u s e r s / : u s e r I d ' , ( r e q , r e s ) = > { r e s . s e n d ( r e q . p a r a m s ) ; } ) ; m o d u l e . e x p o r t s = r o u t e r ; 45
  43. Express application generator Install to global n p m i

    n s t a l l - g e x p r e s s - g e n e r a t o r Create a project e x p r e s s - - v i e w = j a d e m y a p p 46
  44. WebSocket ํ”„๋กœํ† ์ฝœ์˜ node ๊ตฌํ˜„์ฒด, node ํ™œ์„ฑํ™”์— ํฐ ๊ธฐ์—ฌ WebSocket? HTTP

    ๋ฅผ ์ด์šฉํ•˜๋Š” (handsaking) ์—ฐ๊ฒฐ์ง€ํ–ฅ์ ์ธ(TCP) ์ด๋ฉฐ ์–‘๋ฐฉํ–ฅ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜(Full-duplex) ์ด ๊ฐ€๋Šฅํ•œ ํ”„๋กœํ† ์ฝœ ์›น์„œ๋ฒ„, ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ด์šฉ๊ฐ€๋Šฅ ์‹ค์‹œ๊ฐ„ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์— ์‚ฌ์šฉ. ์ฑ„ํŒ…, ์•Œ๋ฆผ๋“ฑ Install: y a r n a d d - - d e v s o c k e t . i o 47
  45. Tooling for Web Application Client ์›น์•ฑ ํด๋ผ์ด์–ธํŠธ์˜ ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์šฐ(Work๏ฌ‚ow) ๋ฅผ

    ๊ด€๋ฆฌ Sca๏ฌ€olding: Boilerplate code, ๏ฌles for projects Building: Compile, transform, transpiler, bundling, packaging Deploying: Automatic deployment Testing: Lint, TDD, End to End ๊ฐœ๋ฐœ ๊ณผ์ •์˜ ๋ฐ˜๋ณต๊ณผ ์ง€๋ฃจํ•จ์„ ์ œ๊ฑฐํ•ด์„œ ๊ฐœ๋ฐœ ํผํฌ๋จผ์Šค ํ–ฅ์ƒ ( ๋ณ„๋งŒํผ) ๋งŽ์€ ๋„๊ตฌ๋“ค์ด ๊ฐœ๋ฐœ๋˜๊ณ  ์‚ฌ์šฉ๋˜๊ณ  ๋‹ค์‹œ ๋Œ€์ฒด๋˜์–ด์ง ํŠธ๋ Œ๋“œ๋Š” ๊ณ„์† ๋ณ€ํ™”์ค‘ 48
  46. 49

  47. 50

  48. Stop Opening the Hood ๊ฐ๊ฐ์˜ ๋„๊ตฌ ์‚ฌ์šฉ๋ฒ•๊ณผ ๊ฐ์ข… ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ์˜์กด์„ฑ

    ํŒจํ‚ค์ง€์˜ ๋ฒ„์ „ ์ถฉ๋Œ๋กœ ํŒŒํŽธํ™”๊ฐ€ ์‹ฌํ•ด์ง ์˜ค๋ฒ„- ํˆด๋ง์ด ๋‰ด๋น„๋“ค์˜ ๋Ÿฌ๋‹์ปค๋ธŒ๋ฅผ ๊ธ‰์ƒ์Šน ์‹œํ‚ด. 2016 ๋…„์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฐฐ์šฐ๋Š” ๊ธฐ๋ถ„ ์ ์ฐจ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ž์ฒด์ ์œผ๋กœ ๊ฐœ๋ฐœ, ๊ตฌ์„ฑํ•œ ๋„๊ตฌ ์ œ๊ณต React: create-react-app AngularJS 2: Angular CLI Polymer: Polymer CLI Vue.js: Vue CLI ์‚ฌ์šฉ๋˜๋Š” ํˆด๋“ค์˜ ์ข…๋ฅ˜, ๋ฒ„์ „ ๊ทธ๋ฆฌ๊ณ  ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ง์ ‘๊ด€๋ฆฌ -> ํ”„๋ ˆ์ž„์›Œํฌ ๋ ˆ๋ฒจ์—์„œ ์ฃผ๋„๊ถŒ์„ ๊ฐ€์ง€๊ณ  ๊ด€ ๋ฆฌ๊ฐ€๋Šฅ ์ƒ์„ฑ๋œ ํ”„๋กœ์ ํŠธ์—์„  npm scripts ๋กœ ์‚ฌ์šฉ -> node ํ™˜๊ฒฝ์—์„œ ์ผ๊ด€๋˜๊ณ  ์‰ฌ์šด ์‚ฌ์šฉ๋ฒ• ํ•˜์ง€๋งŒ ๋šœ๊ป‘์„ ์—ด๋ฉด? 51
  49. 52

  50. n p m i n s t a l l

    - g p o l y m e r - c l i m k d i r m y - a p p & & c d m y - a p p p o l y m e r i n i t p o l y m e r s e r v e - - o p e n 53
  51. n p m i n s t a l l

    - g v u e - c l i # i n i t w i t h w e b p a c k t e m p l a t e v u e i n i t w e b p a c k m y - a p p c d m y - a p p y a r n i n s t a l l y a r n r u n d e v 54
  52. n p m i n s t a l l

    - g c r e a t e - r e a c t - a p p c r e a t e - r e a c t - a p p m y - a p p c d m y - a p p / n p m s t a r t 55
  53. Fetching Open API with React.js / / s r c

    / A p p . j s i m p o r t R e a c t , { C o m p o n e n t } f r o m ' r e a c t ' ; c l a s s A p p e x t e n d s C o m p o n e n t { c o n s t r u c t o r ( ) { s u p e r ( . . . a r g u m e n t s ) ; t h i s . s t a t e = { u s e r I d : t h i s . p r o p s . u s e r I d | | ' L o a d i n g . . . ' } ; } c o m p o n e n t D i d M o u n t ( ) { f e t c h ( ' h t t p : / / l o c a l h o s t : 8 0 8 0 / u s e r s / r a g i n g w i n d ' ) . t h e n ( r e s = > r e s . j s o n ( ) ) . t h e n ( u s e r I d = > t h i s . s e t S t a t e ( u s e r I d ) ) . c a t c h ( e r r = > c o n s o l e . l o g ( e r r ) ) ; } r e n d e r ( ) { r e t u r n ( < h 2 > U s e r I D : { t h i s . s t a t e . u s e r I d } < / h 2 > ) } } e x p o r t d e f a u l t A p p ; 56
  54. Node for Desktop Applications UI ๋ฅผ ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋Ÿฌ์— ์˜์กดํ•˜๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ

    node ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์Šคํ…œ ์ฝœ์€ node ์—์„œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์›น์•ฑ์œผ๋กœ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์ง€์› ๋งŽ์€ ์‹œ๋„๋“ค, ๋‚จ์€ ๊ฑด nw.js ์™€ Electron 57
  55. 50% ๊นƒํ—ˆ๋ธŒ์—์„œ ๋งŒ๋“  ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๋ฐ์Šคํฌํƒ‘ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›

    node, ์›น ๊ด€๋ จ ๊ธฐ์ˆ ์„ ๋ชจ๋‘ ์‚ฌ์šฉ๊ฐ€๋Šฅ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์ง€์›, Auto update, App store, ARM device ์™€ ํ”Œ๋žซํผ ๊ธฐ๋Šฅ๋“ค ์ถ”๊ฐ€ ์ค‘ ์˜คํ”ˆ์†Œ์Šค, ํ›Œ๋ฅญํ•œ ์—์ฝ” ์‹œ์Šคํ…œ[1], [2]๊ณผ ํ™œ๋ฐœํ•œ ๊ฐœ๋ฐœ Latest Chromium and Node npm ํŒจํ‚ค์ง€ (๊ฑฐ์˜ ๋Œ€๋ถ€๋ถ„) ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ๊ฐ€๋Šฅ ๊ฐœ๋ฐœ๋˜๋Š” ๋งŽ์€ ์‚ฌ์šฉ/ ์˜คํ”ˆ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๋“ค, Atom, Slack, VSCode, Wordpress ๋“ฑ ๊ฐœ๋ฐœ๋„๊ตฌ ์ง€์›์ด ํ›Œ๋ฅญ Devtron(Debug), Spectron(Test) 58
  56. Hello! Electron 1. Setup the project # s e t

    u p p r o j e c t a n d i n s t a l l p r e b u i l t e l e c t r o n . y a r n i n i t & & y a r n a d d - - d e v e l e c t r o n 2. Con๏ฌgure package.json { . . . " m a i n " : " m a i n . j s " " s c r i p t s " : { " s t a r t " : " e l e c t r o n . " } } 66
  57. 3. main.js, for main process c o n s t

    { a p p , B r o w s e r W i n d o w } = r e q u i r e ( ' e l e c t r o n ' ) ; l e t m a i n W i n d o w ; a p p . o n ( ' r e a d y ' , ( ) = > { m a i n W i n d o w = n e w B r o w s e r W i n d o w ( { w i d t h : 8 0 0 , h e i g h t : 6 0 0 } ) ; m a i n W i n d o w . l o a d U R L ( ` f i l e : / / $ { _ _ d i r n a m e } / i n d e x . h t m l ` ) ; m a i n W i n d o w . o n ( ' c l o s e d ' , ( ) = > { m a i n W i n d o w = n u l l } ) ; } ) ; a p p . o n ( ' w i n d o w - a l l - c l o s e d ' , ( ) = > { i f ( p r o c e s s . p l a t f o r m ! = = ' d a r w i n ' ) { a p p . q u i t ( ) } } ) ; 4. index.html, for main view in renderer. and say Hello < h 1 > H e l l o ! < h 1 > < u l i d = " f i l e s " > < / u l > < s c r i p t t y p e = " t e x t / j a v a s c r i p t " s r c = " r e n d e r e . j s " > < / s c r i p t > 67
  58. 5. renderer.js, for browser process c o n s t

    f s = r e q u i r e ( ' f s ' ) ; f s . r e a d d i r ( ' . ' , ( e r r , f i l e s ) = > { c o n s t u l = d o c u m e n t . q u e r y S e l e c t o r ( ' # f i l e s ' ) ; u l . i n n e r H T M L = f i l e s . m a p ( f = > { r e t u r n ` < l i > $ { f } < / l i > ` ; } ) . j o i n ( ' \ n ' ) ; } ) ; 6. run electron y a r n s t a r t 68
  59. 50% Setup the project # s e t u p

    p r o j e c t a n d i n s t a l l p r e b u i l t e l e c t r o n . y a r n i n i t & & y a r n a d d - - d e v e l e c t r o n Con๏ฌgure package.json { . . . " m a i n " : " m a i n . j s " " s c r i p t s " : { " s t a r t " : " e l e c t r o n . " } } 69
  60. 35% Protips: Yeoman generator-electron # I n s t a

    l l w i t h y e o m a n n p m i n s t a l l - - g l o b a l y o g e n e r a t o r - e l e c t r o n # S c a f f o l d i n g e l e c t r o n a p p y o e l e c t r o n 70
  61. IoT Device Platforms for Node Programmed by Node/JS Johnny-Five, for

    Arduino and rwaldron/particle-io Cylon.js Particle Node/JS runtime on board (H/W) Intelยฎ Edison alooh.io with Demo Ru๏ฌ€ IoT.js - Samsung powered by JerryScript 72
  62. BLE (Bluetooth 4.x, Bluetooth Low Energy) ์ €์ „๋ ฅ ๋ฌด์„  ํ†ต์‹ , Bluetooth

    Smart Ready, Smart, Classic ๋กœ ๊ตฌ๋ถ„ ์ตœ๊ทผ ์ŠคํŽ™์€ 4.2, Low-power IP(IPv6/LoWPAN) / Gateway for HTTP Proxy for RESTful Advertise: ํŠน์ • ๋””๋ฐ”์ด์Šค๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  ์ ์€ ๋ฐ”์ดํŠธ(31 byte) ๋ฅผ ์ผ์ • ์ธํ„ฐ๋ฒŒ ๋™์•ˆ ์ฃผ๋ณ€ ๋””๋ฐ”์ด์Šค ์—๊ฒŒ ์‹œ๊ทธ๋„ ๋ฐฉ์†ก(Broadcast), Advertiser ์™€ Observer ๋กœ ๊ตฌ๋ถ„ Connection: Central ๊ณผ Peripheral ์‚ฌ์ด์— 1:1 ์—ฐ๊ฒฐ์„ ๋งบ์–ด ๋ฐ์ดํ„ฐ๋ฅผ ํƒ€์ด๋ฐ์— ๋งž๊ฒŒ ์ „์†ก GATT (Generic Attribute Pro๏ฌle): BLE ๋ฐ์ดํ„ฐ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์„ ๋‹ด๋‹น, Read, Write ๋ฅผ ์ง€์› RSSI (Received Signal Strength Indication): ์ˆ˜์‹  ์‹ ํ˜ธ์˜ ( ์ด) ์„ธ๊ธฐ (dBm) 74
  63. Beacon ๋ณ„๋„์˜ Advertising ๋ฐ์ดํ„ฐ ํƒ€์ž…( ํ”„๋กœํ† ์ฝœ), UUID ์™€ ๊ทธ์™ธ ์ปค์Šคํ…€

    ํ—ค๋” paring / bonding ์„ ์ƒ๋žตํ•˜๊ณ  Advertising pacaket ์œผ๋กœ ํŠน์ • ๋ฐ์ดํ„ฐ(url ๋“ฑ) ์ „์†ก iBeacon(Apple), Eddystone(Google), Facebook Beacon( ๋„ ์žˆ์—ˆ์Œ), SKP Syrup ( ๋„ ๋ฟŒ๋ ธ์Œ) 75
  64. 76

  65. 77

  66. 30% Node for Beacon sandeepmistry/bleno: A Node.js module for BLE

    peripherals sandeepmistry/node-bleacon: A Node.js library for iBeacons sandeepmistry/node-eddystone-beacon-scanner: Scanning Eddystone beacons using Node.js don/node-eddystone-beacon: Create an Eddystone Beacon using Node.js 78
  67. Eddystone Advertising with eddystone-beacon-emulator # i n s t a

    l l n p m i n s t a l l - g e d d y s t o n e - b e a c o n - e m u l a t o r # a d v e r t i s i n g e d d y s t o n e - b e a c o n - e m u l a t o r - - u r i = h t t p : / / g o o . g l / e d d y s t o n e 79
  68. Eddystone Scanning with eddystone-beacon-scanner c o n s t E

    d d y s t o n e B e a c o n S c a n n e r = r e q u i r e ( ' e d d y s t o n e - b e a c o n - s c a n n e r ' ) ; E d d y s t o n e B e a c o n S c a n n e r . o n ( ' f o u n d ' , f u n c t i o n ( b e a c o n ) { c o n s o l e . l o g ( ' f o u n d E d d y s t o n e B e a c o n : \ n ' , J S O N . s t r i n g i f y ( b e a c o n , n u l l , 2 ) ) ; } ) ; E d d y s t o n e B e a c o n S c a n n e r . o n ( ' u p d a t e d ' , f u n c t i o n ( b e a c o n ) { c o n s o l e . l o g ( ' u p d a t e d E d d y s t o n e B e a c o n : \ n ' , J S O N . s t r i n g i f y ( b e a c o n , n u l l , 2 ) ) ; } ) ; E d d y s t o n e B e a c o n S c a n n e r . o n ( ' l o s t ' , f u n c t i o n ( b e a c o n ) { c o n s o l e . l o g ( ' l o s t E d d y s t o n e b e a c o n : \ n ' , J S O N . s t r i n g i f y ( b e a c o n , n u l l , 2 ) ) ; } ) ; E d d y s t o n e B e a c o n S c a n n e r . s t a r t S c a n n i n g ( t r u e ) ; 80