|
 |
|
¡ã ÃÖ¿ë¼ö ÆÀÀå Àνº¿þÀÌºê ¿¬±¸°³¹ßº»ºÎ |
[ÄÄÇ»ÅÍ¿ùµå] À¥ ¾ÖÇø®ÄÉÀ̼ÇÀ» ±¸ÃàÇϱâ À§Çؼ µ¥ÀÌÅÍ ÀúÀå¼Ò·Î RDBMS(Oracle, DB2, Sybase, MySQL µî)À» ÀÌ¿ëÇϰí WAS(WebLogic, WebSphere, JEUS, JBossµî) À§¿¡ J2EE ÇÁ·¹ÀÓ¿öÅ©(Spring µî)¸¦ »ç¿ëÇÏ¿© Java·Î ¼¹ö ÇÁ·Î±×·¥À» ±¸ÇöÇÏ´Â °ÍÀÌ ¿ì¸®¿¡°Ô Ä£¼÷ÇÑ, Áö±Ý²¯ ÇØ ¿À´ø ¹æ½ÄÀ̶ó°í ÇÒ ¼ö ÀÖ´Ù.
À¥ ¾ÖÇø®ÄÉÀ̼ÇÀÇ Å¬¶óÀÌ¾ðÆ®´Â ºê¶ó¿ìÀú À§¿¡ HTML, JavaScript, CSS µîÀ» ÀÌ¿ëÇÏ¿© ±¸ÇöÇÏ´Â °ÍÀÌ ÀϹÝÀûÀÌ´Ù. ActiveX³ª Ç÷¯±×ÀÎ µîÀ¸·Î ±¸¼ºµÈ UIÅø µéµµ ÀÖÁö¸¸, ÃÖ±Ù¿¡´Â »ç¿ëÀÚ Á¢±Ù¼º ¹× Æí¸®¼ºÀ» À§ÇØ Å¬¶óÀÌ¾ðÆ®¿¡ º°µµÀÇ ÇÁ·Î±×·¥ ¶Ç´Â ¸ðµâ ¼³Ä¡´Â ¹èÁ¦µÇ´Â Ãß¼¼À̹ǷΠÀÌ¿¡ ´ëÇØ¼´Â ÀÌ ±Û¿¡¼ Á¦¿ÜÇÑ´Ù. ¹°·Ð JSP³ª PHP¸¦ ÀÌ¿ëÇÑ È¯°æµµ ¸¹ÀÌ ÀÖÁö¸¸ Layer °£, Layer ³»ºÎ¿¡¼µµ MV* ÆÐÅÏÀ» Àû¿ëÇÏ·Á´Â Å« È帧¿¡ ºñÃß¾î ÀÌ ºÎºÐµµ ÀÌ ±Û¿¡¼ Á¦¿ÜÇϱâ·Î ÇϰڴÙ.
À§¿Í °°Àº ¾ÆÅ°ÅØÃ³ ¹× ±¸Á¶, ¼Ö·ç¼ÇµéÀÌ °·ÂÇÑ °ÍÀº »ç½ÇÀÌÁö¸¸ ´Ü¼øÇÑ À¥ ¾ÖÇø®ÄÉÀ̼ÇÀ» ÀÛ¼ºÇÏ·Á°í ÇØµµ °³¹ßÀÚ°¡ µ¥ÀÌÅÍ Á¶ÀÛÀ» À§Çؼ´Â °¢ Tier¿¡ ¸ÂÃç SQL°ú Java, JavaScript¸¦ ÀÍÈ÷°í »ç¿ëÇÒ ÁÙ ¾Ë¾Æ¾ß ÇÑ´Ù.
µ¿ÀÏÇÑ µ¥ÀÌÅͰ¡ °¢ Tier¿¡ ¸ÂÃç °¢±â ´Ù¸¥ À¯ÇüÀÇ Object¿¡ ´ã°Ü ÀÖ¾î Object °£ º¯È¯ ÀÛ¾÷ÀÌ ÇÊ¿äÇϰųª, serialization°ú deserializationÀ» ¼öÇàÇϰųª, ÇÑ ÂÊ Object¿¡¼ ´Ù¸¥ Object·Î get/setÀ» Çϱ⵵ ÇÑ´Ù. ÀÌ´Â °á°úÀûÀ¸·Î overhead¸¦ ¹ß»ý½Ãų ¼ö¹Û¿¡ ¾ø´Ù.
¿¹¸¦ µé¸é Query¸¦ ¼öÇàÇØ¼ ¾òÀº ResultSetÀ» ¼øÈ¯ÇÏ¸é¼ Java °´Ã¼¿¡ °ªÀ» ´ãÀ» ¼ö ÀÖ´Ù. °øÅë ·ÎÁ÷À¸·Î »óȸ¦ Çϰųª iBatis °°Àº ¼Ö·ç¼ÇÀ» ÀÌ¿ëÇÏ¿© ÀÚµ¿ ¸ÅÇÎ µîÀ» ÇÒ ¼ö ÀÖÁö¸¸ º»ÁúÀûÀÎ ÀÛ¾÷À» »ý·«ÇÒ ¼ö´Â ¾ø´Ù. ¾÷¹« ·ÎÁ÷¿¡¼ Java·Î Á¶ÀÛÇÑ JSONÀ» DB¿¡ StringÀ¸·Î serialize¸¦ ÇÏ¿© ÀúÀåÇÏ°í ¹Ý´ë·Î deserializeÇÏ¿© ´Ù½Ã JSON °´Ã¼·Î ¾ò¾î ¿À±âµµ ÇÑ´Ù. ¾÷¹« ·ÎÁ÷¿¡¼ List³ª Map¿¡ ´ã°Ü ÀÖ´Â µ¥ÀÌÅ͸¦ Ŭ¶óÀÌ¾ðÆ®·Î ¹ÝȯÇÒ ¶§ JSONÀ¸·Î º¯È¯Çϱ⵵ ÇÑ´Ù.
À̸¦ ÇØ°áÇÒ ¹æ¹ýÀº ¾øÀ»±î? ¾Æ·¡ ¼Ò°³ÇÏ´Â ¼Ö·ç¼ÇµéÀ» ÀÌ¿ëÇØ¼ µ¿ÀÏÇÑ °³¹ß ¾ð¾î¿Í µ¥ÀÌÅÍ ¿ÀºêÁ§Æ® À¯ÇüÀ¸·Î Server-Side ¹× Front-End[°¢ÁÖ1]¸¦ ¸ðµÎ ±¸ÇöÇÒ ¼ö ÀÖ´Ù. ¿©±â¼ ¸»ÇÏ´Â ÇϳªÀÇ °³¹ß ¾ð¾î´Â JavaScriptÀÌ°í µ¥ÀÌÅÍ ¿ÀºêÁ§Æ®ÀÇ À¯ÇüÀº JSONÀÌ´Ù.
Front-End¿¡¼´Â ÀÌ¹Ì JavaScript¿Í JSON ÀÌ ³Î¸® »ç¿ëµÇ°í ÀÖ°í ÇÑ ¹øÂëÀº »ç¿ëÇØ º¸¾ÒÀ» °ÍÀÌ´Ù. Server-Side¿¡¼ À̸¦ °¡´ÉÄÉ ÇÏ´Â °ÍÀº MongoDB¿Í Node.jsÀÌ´Ù. Server-Side¿¡¼´Â Node.js Web Application FrameworkÀÎ Express¸¦, Front-End¿¡¼´Â Backbone.js¸¦ ÀÌ¿ëÇÏ¿© RESTful JSON Service¸¦ ±¸ÃàÇÏ´Â ¿¹Á¦¸¦ ¿¬ÀçÇϵµ·Ï ÇϰڴÙ.
1) °¢ ¼Ö·ç¼ÇµéÀÇ Æ¯Â¡
¾Æ·¡ ¼Ö·ç¼ÇµéÀ» ÀÌ¿ëÇÏ¿© ÀÌ¹Ì ÇÁ·ÎÁ§Æ®¸¦ ¼öÇàÇϰųª »ç¿ëÇØ º» À̵鵵 ÀÖ°ÚÁö¸¸ ½ÇÁ¦ ±¸Çö¿¡ ¾Õ¼ »ý¼ÒÇÑ À̵éÀ» À§ÇØ °¢ ¼Ö·ç¼Çµé¿¡ ´ëÇØ °£·«È÷ ¼Ò°³Çϵµ·Ï ÇϰڴÙ.
1. Node.js
Node.js¸¦ °ÅÄ¥°Ô ÇÑ ¸¶µð·Î Ç¥ÇöÇÏÀÚ¸é ’Server-Side JavaScript’ÀÌ´Ù. Å©·ÒÀÇ V8 ÀÚ¹Ù½ºÅ©¸³Æ® ¿£ÁøÀ» ±â¹ÝÀ¸·Î ±¸¼ºµÇ¾î ÀÖ°í ºê¶ó¿ìÀú¿¡¼ JavaScript¸¦ »ç¿ëÇϵí JavaScript¸¦ ÀÌ¿ëÇØ¼ ¼¹ö ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù.
°¡. Ư¡
event-driven concurrency
asynchronous non-blocking model
ÀÌ ¼Ö·ç¼ÇÀÇ Æ¯Â¡À» ¼³¸íÇϱâ À§ÇØ Java¿Í ºñ±³¸¦ ÇØº¸¸é, JavaÀÇ °æ¿ì request Çϳª ´ç ÇϳªÀÇ thread°¡ ÇÒ´çµÇ°í(multi threading), °¢ request´Â µ¿±â ¹æ½ÄÀ¸·Î µ¿ÀÛÇϱ⠶§¹®¿¡ ÇÁ·Î¼¼½º°¡ ¿Ï·áµÉ ¶§±îÁö °¢°¢ÀÇ thread´Â ¹¿© ÀÖ´Ù. ¹Ý¸é Node.js´Â ÇϳªÀÇ thread°¡ ¸ðµç request¸¦ ¹Þ¾Æ ó¸®Çϰí IO ÀÛ¾÷À» ºñµ¿±â ¹æ½ÄÀ¸·Î È£ÃâÇÏ¿© ÇØ´ç ÀÛ¾÷ÀÌ ¿Ï·áµÇ¸é event callbackÀÌ È£ÃâµÇ´Â ÇüÅ·ΠÁøÇàµÈ´Ù.
multi threadingÀº ¼¹ö ¼º´É¿¡ µû¶ó Â÷À̰¡ ÀÖ°ÚÁö¸¸ ±âº»ÀûÀ¸·Î concurrency¿¡ Á¦¾àÀ» ¹ÞÀ» ¼ö¹Û¿¡ ¾ø´Ù. Thread PoolÀ» ÀÌ¿ëÇØ¼ È¿À²À» ¿Ã¸± ¼ö´Â ÀÖÁö¸¸ °¢ thread°¡ synchronous(blocking) model·Î µ¿ÀÛÇϱ⠶§¹®¿¡ µ¿½Ã¿¡ ó¸®ÇÒ ¼ö ÀÖ´Â request´Â ÇѰ谡 ÀÖ´Ù. ¶ÇÇÑ thread°¡ ¸¹¾Æ Áú¼ö·Ï context switch°¡ ÀÚÁÖ ¹ß»ýÇϰí ÀÌ´Â °íºñ¿ëÀÇ °á°ú¸¦ ÃÊ·¡ÇÑ´Ù.
Node.js °¡ 'IO ÀÛ¾÷'À» ºñµ¿±â ¹æ½ÄÀ¸·Î ó¸®ÇÑ´Ù´Â °Í¿¡ ÁÖ¸ñÇÒ Çʿ䰡 Àִµ¥ ¿©±â¼ IO ÀÛ¾÷À̶õ ´ëÇ¥ÀûÀ¸·Î DB Äõ¸®, Network, File Çڵ鸵 µîÀÌ´Ù. ÀÌ´Â À¥ ¾ÖÇø®ÄÉÀ̼ÇÀÌ ¼öÇàÇÏ´Â ÁÖ¿ä ÀÛ¾÷µéÀ̸ç À̸¦ ºñµ¿±â ¹æ½ÄÀ¸·Î ó¸®Çϱ⠶§¹®¿¡ ³ôÀº concurrency¿Í ¼º´ÉÀ» º¸Àå¹ÞÀ» ¼ö ÀÖ´Ù.
±×·¸´Ù°í ÀåÁ¡¸¸ ÀÖ´Â °ÍÀº ¾Æ´Ï´Ù. ´ÜÀÏ thread·Î µ¿ÀÛÇϱ⠶§¹®¿¡ CPU¸¦ ¸¹ÀÌ »ç¿ëÇÏ´Â ÀÛ¾÷ÀÌ ÀÖ´Ù¸é ´Ù¸¥ ¿äûÀÌ Áö¿¬µÇ¾î ÀüüÀûÀÎ ¼º´É ÀúÇϸ¦ °¡Á®¿Â´Ù. µû¶ó¼ ÆÄÀÏÀ» Àаųª µ¥ÀÌÅͺ£À̽º¿¡ Äõ¸®¸¦ ÇÏ´Â µîÀÇ I/O ÀÛ¾÷ÀÌ ¸¹ÀÌ ¹ß»ýÇÏ´Â À¥ ¾ÖÇø®ÄÉÀ̼ǿ¡ ÀûÇÕÇÏ´Ù.
¶ÇÇÑ CallbackÀÌ ºñµ¿±â·Î È£ÃâµÇ±â ¶§¹®¿¡ ½ÇÇà ¼ø¼ µîÀ» º¸ÀåÇϱâ À§ÇØ ÁßøµÈ ±¸Á¶, Áï ÈçÈ÷ ¾ê±âÇÏ´Â 'callback hell' ¶Ç´Â 'callback pyramid'·Î ±¸ÇöµÇ±â ½Ê»óÀÌ´Ù. ÇÏÁö¸¸ JavaScript¿¡¼ Á¦°øÇÏ´Â Promises³ª Generators[°¢ÁÖ2]¸¦ ÀÌ¿ëÇÏ¸é °¡µ¶¼º ³ô°í flow¸¦ ½±°Ô Á¦¾îÇÒ ¼ö ÀÖ´Â °ß°íÇÑ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. ÀÌ ¹Û¿¡µµ ¸¹Àº ´ÜÁ¡µéÀÌ Àִµ¥ À¥¿¡ ÀÚ¼¼È÷ Á¤¸®µÈ ±ÛµéÀ» ÂüÁ¶Çϱ⠹ٶõ´Ù.
³ª. ¼º´É
±×·¸´Ù¸é Á¤¸» Node.js°¡ ¼º´É»ó À¯¸®ÇѰ¡? ƯÁ¤ ÄÉÀ̽ºÀ̱â´Â ÇÏÁö¸¸ ÂüÁ¶ÇÒ ¸¸ÇÑ ÀÚ·á´Â ´ÙÀ½°ú °°´Ù. ¸ÕÀú ±âÁ¸ Java¿¡¼ Node.js·Î ¾ÖÇø®ÄÉÀÌ¼Ç Ç÷§ÆûÀ» ÀüȯÇÏ¿© ÈÁ¦°¡ µÈ ÆäÀÌÆÈ »ç·ÊÀÌ´Ù.
À̵鿡 ÀÇÇÏ¸é ±âÁ¸ ¾ÖÇø®ÄÉÀ̼ǿ¡ ºñÇØ ÃÊ´ç µÎ ¹èÀÇ ¿äûÀ» ó¸®ÇÏ°í Æò±Õ ÀÀ´ä ½Ã°£ÀÌ 35% ÁÙ¾ú´Ù°í ÇÑ´Ù. °³¹ß Ãø¸é¿¡¼µµ ±âÁ¸º¸´Ù ´õ ÀûÀº ÀοøÀ¸·Î 2¹è ºü¸£°Ô ±¸ÃàÇÏ°í ´õ ÀûÀº loc¿Í ÆÄÀϸ¸À¸·Î ÃæºÐÇß´Ù°í º¸°íÇϰí ÀÖ´Ù.
´ÙÀ½Àº IBM »ç·ÊÀÌ´Ù. IBM Passes¶ó´Â ±âÁ¸ ¼Ö·ç¼ÇÀ» Node.js¿Í MongoDB·Î ±¸¼ºÇÑ ÀÏÁ¾ÀÇ ÆÄÀÏ·µ »ç·ÊÀÌ´Ù.
concurrency°¡ 50 ¹Ì¸¸ÀÏ ¶§´Â Java°¡ ´õ ºü¸£°í concurrency°¡ ³ôÀº °æ¿ì Node.js°¡ ¿ì¼öÇÑ °ÍÀ¸·Î ³ªÅ¸³µ´Ù.
Node.js°¡ CPU³ª ¸Þ¸ð¸® »ç¿ë·®¿¡¼µµ ¿ùµîÇÑ ÀÌÁ¡À» º¸À̰í ÀÖ´Ù.
2. NPM(Node Package Manager)[°¢ÁÖ3]
NPMÀ» °£´ÜÈ÷ ¼³¸íÇÏ¸é ³ëµå·Î ÀÛ¼ºµÈ ¸ðµâ(¶óÀ̺귯¸®) °ü¸®ÀÚ¶ó ÇÒ ¼ö ÀÖ´Ù. NPMÀ» ÀÌ¿ëÇØ¼ NPM registry¿¡ µî·ÏµÈ ¸ðµâµéÀ» ¼Õ½±°Ô ¼³Ä¡ÇÏ¿© ÀÌ¿ëÇÏ°í ¾÷µ¥ÀÌÆ®ÇÏ°í °ü¸®ÇÒ ¼ö ÀÖ´Ù. NPMÀÚü´Â ³ëµå ¼³Ä¡ ½Ã °°ÀÌ ¼³Ä¡µÈ´Ù.
Àü¹ÝÀûÀÎ °æÇâÀ» º¸±â À§ÇØ ¸ðµâ ¼ýÀÚ¸¦ ºñ±³ÇÏ¸é ´ÙÀ½°ú °°´Ù.
Node.js°¡ °¡ÆÄ¸¥ »ó½Â¼¼·Î Áõ°¡Çϰí À̹ۿ¡ Java¿Í ruby°¡ »óÀ§±Ç¿¡ À§Ä¡Çϰí ÀÖ´Ù. ¼öÁý ¹æ½ÄÀ̳ª ´ë»ó¿¡ µû¶ó ´Ù¸¥ °á°ú°¡ ³ª¿Ã ¼ö ÀÖ°ÚÁö¸¸ Node.js°¡ À¯ÇàÀÇ ÇѺ¹ÆÇ¿¡ ÀÖ´Ù´Â °Í¸¸Àº È®½ÇÇÑ °Í °°´Ù.
3. Express
Node.js´Â ³»Àå HTTP ¼¹ö ¶óÀ̺귯¸®¸¦ Æ÷ÇÔÇϰí ÀÖ¾î À¥ ¼¹ö·Îµµ »ç¿ë °¡´ÉÇÏÁö¸¸ ´ÙÀ̳»¹ÍÇÑ À¥ ¼ºñ½º¸¦ ±¸ÃàÇϱâ À§Çؼ´Â º°µµÀÇ ÆÐŰÁö¸¦ ÀÌ¿ëÇÑ´Ù. ÃÖ±Ù ´õ À¯ÇàÇÏ´Â ¸ðµâµéÀÌ ÀÖÁö¸¸ ÀÌ ±Û¿¡¼´Â ±× Áß °¡Àå ¸¹ÀÌ ¾Ë·ÁÁø Express¸¦ ÀÌ¿ëÇÏ¿© À¥ ¾ÖÇø®ÄÉÀ̼ÇÀ» ¸¸µé¾î º¸µµ·Ï ÇϰڴÙ. Express´Â web application frameworkÀÌ¸ç ´Ü¼øÈ÷ ±âÁ¸ WASÀÇ ¿ªÇÒÀ» ÇÏ´Â °Í Á¤µµ·Î ÀÌÇØÇØµµ ÁÁÀ» °Í °°´Ù. Express ¶ÇÇÑ Node.js·Î ÀÛ¼ºµÈ ¸ðµâÀ̹ǷΠNPM¸¦ ÀÌ¿ëÇØ¼ ¼³Ä¡ÇÏ°í °ü¸®ÇÑ´Ù.
4. MongoDB
MongoDB´Â Document databaseÀÌÀÚ NoSQL databaseÀÌ´Ù. document´Â ¸ðµç µ¥ÀÌÅͰ¡ JSON ÇüÅ·ΠÀúÀåµÇ°í ÇÁ·Î¼¼½Ì µÈ´Ù´Â ÀǹÌÀÌ´Ù. Á¤È®ÇϰԴ BSON[°¢ÁÖ4]À» »ç¿ëÇÑ´Ù. BSONÀº Binary JSONÀÇ ¾àÀÚ·Î, JSON °´Ã¼¸¦ ¹ÙÀ̳ʸ®·Î ÀÎÄÚµùÇÑ Æ÷¸ËÀÌ´Ù. MongoDB°¡ °í¼º´É°ú ±âÁ¸ RDBMÀÇ ¿ë·® ÇѰ踦 ±Øº¹Çϱâ À§ÇØ ÃâÇöÇ߱⠶§¹®¿¡ ¼³°è¿Í ±¸¼º¿¡ µû¶ó Â÷À̰¡ ÀÖÀ» ¼ö ÀÖÁö¸¸ µ¥ÀÌÅ͵éÀÌ ³×Æ®¿öÅ© »ó¿¡ ºÐ»êµÇ¾î ÀÖÀ» °¡´É¼ºÀÌ Å©´Ù. ³×Æ®¿öÅ©¿¡¼ ºó¹øÇÏ°Ô µ¥ÀÌÅ͸¦ ÁÖ°í ¹Þ¾Æ¾ß Çϱ⠶§¹®¿¡ BSONÀ» °í¾ÈÇÑ °ÍÀÌ ¾Æ´ÑÁö°¡ ÇÊÀÚÀÇ ÃßÃøÀÌ´Ù. ÇÏÁö¸¸ »ç¿ëÀÚ´Â ±×³É ÀÚ¹Ù½ºÅ©¸³Æ®¿¡¼ JSON ´Ù·çµí »ç¿ëÇÏ¸é µÈ´Ù.
NoSQL[°¢ÁÖ5] ÀÇ Æ¯Â¡À¸·Î ¿©·¯ °¡Áö°¡ ÀÖ°ÚÁö¸¸ ±âÁ¸ RDBMS¿Í °¡Àå Â÷º°µÇ´Â Á¡Àº Schema Á¦¾àÀÌ ¾ø´Ù´Â °ÍÀÌ´Ù. º¹Àâµµ¸¦ ÁÙÀÌ´Â ÀåÁ¡À» °¡Á®´Ù ÁÖÁö¸¸ ÀÌ´Â ±âÁ¸ °üÁ¡¿¡¼ ´ÜÁ¡À¸·Îµµ ÀÛ¿ëÇÑ´Ù. (¾Æ·¡ ´ÜÁ¡À» Á¤¸®ÇÒ ¶§ °°ÀÌ »ìÆì º¸±â·Î ÇϰڴÙ) Schema Á¦¾àÀÌ ¾ø´Ù´Â Àǹ̴ µ¿ÀÏÇÑ Å×À̺í(MongoDB¿¡¼´Â CollectionÀ̶ó ºÎ¸¥´Ù)¿¡ Ä÷³ID ³ª TypeÀÌ ´Ù¸¥ µ¥ÀÌÅ͸¦ ÀúÀåÇÒ ¼ö ÀÖ°í ½ÉÁö¾î Ä÷³ °³¼ö°¡ ´Ù¸¥ Row¸¦ ÀúÀåÇÒ ¼öµµ ÀÖ´Ù. ÀÌ·± Ư¡ ¶§¹®¿¡ ±âÁ¸ ¹æ½ÄÀ¸·Î Ä÷³ Ãß°¡³ª µ¥ÀÌÅÍ Å¸ÀÔ º¯°æÀº ºñ¿ëÀÌ ¸¹ÀÌ µå´Â ÀÛ¾÷À̾úÁö¸¸ ¼Õ½±°Ô ó¸®ÇÒ ¼ö ÀÖ´Ù. ShardingÀ̶ó´Â Scale-Out ±¸Á¶¸¦ äÅÃÇÏ¿© ±âÁ¸ µ¥ÀÌÅÍ ¿ë·®ÀÇ ÇѰ踦 ±Øº¹ÇÑ´Ù.
¿ÃÇØ IT¾÷°èÀÇ °¡Àå Å« ȵδ IoT(»ç¹°ÀÎÅͳÝ)¿´´Ù. IoT ¼¼»ó¿¡¼´Â “»ç¶÷ÀÌ ¿øÇÏ´Â °ÍÀ» Á÷Á¢ Á¦¾îÇÏÁö ¾Ê¾Æµµ »ç¹°ÀÌ ½º½º·Î ÁÖº¯ ȯ°æÀ» ºÐ¼®ÇÏ°í ¼ºñ½º¸¦ Á¦°øÇØ ÁØ´Ù”°í ÇÑ´Ù. ½±°Ô ¸»Çؼ ¾È°æ, ½Ã°è °°Àº '¿þ¾î·¯ºí'ÇÑ Á¦Ç°Àº ¹°·Ð °¡ÀüÁ¦Ç°, ÀÚµ¿Â÷ µîÀÌ º°µµÀÇ ÀÔ·ÂÀåÄ¡°¡ ¾øÀÌ ¼¾¼¸¦ ÀÌ¿ëÇÏ¿© »ç¶÷°ú »óÈ£ ÀÛ¿ëÇϰí, ÀÌ´Â °á±¹ ±âÁ¸ µ¥ÀÌÅÍ ·®°ú ºñ±³ÇÒ ¼ö ¾øÀ» Á¤µµ·Î ¾öû³ µ¥ÀÌÅ͸¦ ¹ß»ý½ÃŲ´Ù´Â °ÍÀÌ´Ù.
±âÁ¸¿¡´Â µ¥ÀÌÅÍ ¿ë·®ÀÇ ÇѰ迡 ´ÞÇßÀ» °æ¿ì, »ç¿ëÇÏ´ø ÀåºñÀÇ ¾÷±×·¹À̵带 ÅëÇØ °í»ç¾çÀ¸·Î ÀüȯÇÔÀ¸·Î½á ó¸® ¿ë·®À» Áõ´ë½ÃŰ´Â Scale-UP ¹æ½ÄÀÌ ¼±È£µÇ¾ú´Ù. ÀϹÝÀûÀ¸·Î ½Ã½ºÅÛ ±¸Ãà ½Ã ¾ÈÁ¤¼ºÀ» À§ÇØ °í»ç¾çÀÇ Àåºñ¸¦ »ç¿ëÇϱ⠶§¹®¿¡ ÀÌ À§¿¡ ´Ù½Ã ¾÷±×·¹À̵带 ÇÏ´Â °ÍÀº ¹°¸®ÀûÀ¸·Î³ª ºñ¿ëÀûÀ¸·Î Å« ¾î·Á¿ò¿¡ Á÷¸éÇÏ°Ô µÈ´Ù. ÀÌ¿¡ ¹ÝÇØ Scale-OutÀº Àåºñ¸¦ Ãß°¡ÇÏ¿© µ¥ÀÌÅ͸¦ ³ª´²¼ ó¸®Çϵµ·Ï ÇÏ´Â °ÍÀÌ´Ù. ÀÚ¼¼ÇÑ Sharding°ú ¿©±â¼ ¾ð±ÞÇÏÁö ¾ÊÀº Replica Set ³»¿ëÀº ÀÌ ±ÛÀÇ ¹üÀ§¸¦ ¹þ¾î³ª±â ¶§¹®¿¡ »ý·«Çϵµ·Ï ÇϰڴÙ.
À妽º´Â ¸Þ¸ð¸®¿¡ ÀúÀåµÇ±â ¶§¹®¿¡ ¼º´ÉÀÌ ºü¸¥ ¹Ý¸é ¸¹Àº À妽º¸¦ »ç¿ëÇϱâ À§Çؼ´Â ÃæºÐÇÑ ¸Þ¸ð¸®¸¦ È®º¸ÇØ¾ß ÇÑ´Ù. 2.4 ¹öÀüºÎÅÍ´Â Node.js ó·³ V8 JavaScript EngineÀ» äÅÃÇß°í ECMAscript 5ÀÇ ±â´ÉµéÀÌ µµÀԵǾú´Ù.
´ÜÁ¡
Global Lock
2.2 ¹öÀüºÎÅÍ Global LockÀÌ Á¦°ÅµÇ¾ú´Ù°í´Â ÇÏÁö¸¸, write ¸í·ÉÀÌ ¼öÇàµÇ´Â µ¿¾È lock µÇ´Â ¹üÀ§°¡ ³Ð¾î¼ µ¿½Ã¼º Çâ»óÀÌ ´õ ÇÊ¿äÇÏ´Ù. ¸ÕÀú ¸Þ¸ð¸®¿¡ write¸¦ ÇÏ°í ³ªÁß¿¡ disk¿¡ ¿Å±â´Â ±¸Á¶¿Í Page Faults ½Ã, Áï Disk¿¡ Á÷Á¢ write¸¦ ÇØ¾ß ÇÏ´Â »óȲ¿¡¼´Â lockÀ» ¾çº¸ÇÏ´Â °³¼± µîÀÌ ÀÖ¾ú´Ù.
Transaction
transactions Áö¿øÀÌ RDBMS¿¡ ºñÇØ ¹Ì¾àÇÏ´Ù.
join
RDBMSó·³ Foreign key µîÀ» ÀÌ¿ëÇØ¼ µ¥ÀÌÅÍ °£ÀÇ °ü°è¸¦ Á¤ÀÇÇÏÁö ¾Ê±â ¶§¹®¿¡ joinÀÌ ÀϹÝÀûÀÌÁö ¾Ê´Ù. join¿¡ ´ëÇÑ ¿©·¯ °¡Áö ¹æ¹ýµéÀÌ Á¸ÀçÇÏÁö¸¸ joinÀ» ȸÇÇÇÏ´Â ±¸Á¶·Î ¼³°èÇÏ´Â °ÍÀ» ±ÇÀåÇÏ´Â ÀǰßÀÌ ¸¹´Ù.[°¢ÁÖ6]
µ¥ÀÌÅÍ °ø°£
JSONÀ» ±â¹ÝÀ¸·Î Çϱ⠶§¹®¿¡ key-value Çü½ÄÀÇ µ¥ÀÌÅÍ Æ÷¸ËÀ» »ç¿ëÇÑ´Ù. ÀÌ´Â µ¥ÀÌÅ͸¦ ÀúÀåÇÒ ¶§ Çʵå³×ÀÓ(key)µµ °°ÀÌ ÀúÀåµÇ¹Ç·Î, µ¥ÀÌÅÍ °ø°£À» RDBMS¿¡ ºñÇØ ´õ ¸¹ÀÌ ¼Ò¸ðÇÒ ¼ö ÀÖ´Ù.
À̹ۿ¡ SQLÀ» ´ëüÇÒ ¼ö ¾ø´Â ¸¹Àº ¿µ¿ªÀÌ Á¸ÀçÇÑ´Ù. Node.js ó·³ ÀÌ¿¡ ´ëÇØ Àß Á¤¸®µÈ ±ÛµéÀÌ À¥¿¡ ¸¹ÀÌ Á¸ÀçÇϹǷÎ, Âü°íÇϱ⠹ٶõ´Ù.
5. Mongo
MongoDB¿¡ queryÇϱâ À§ÇÑ Shell ŸÀÔÀÇ ÅøÀÌ´Ù. V8 ¿£ÁøÀ» ±â¹ÝÀ¸·Î Çϰí ÀÖ¾î Javascript ¹®¹ýÀ¸·Î ¸í·ÉÀ» ½ÇÇàÇÑ´Ù. Mongoose °°Àº object modeling toolµéµµ Á¸ÀçÇÏÁö¸¸ ÀÌ ±Û¿¡¼´Â »ý·«ÇÑ´Ù.
2) ¼³Ä¡
¼³Ä¡ ȯ°æÀº Mac OS X 10.8.2 ÀÌ´Ù.
1. MongoDB
MongoDB ¹öÀüÀº v2.4.9 ÀÌ´Ù.
°¡. ´Ù¿î·Îµå
MongoDB °ø½Ä »çÀÌÆ®(http://www.mongodb.org/downloads)¿¡¼ ´Ù¿î·Îµå ¹Þ¾Æ¼ ¾ÐÃàÀ» Ǭ´Ù. ¾ÐÃà ÇØÁ¦ ÈÄ È¨µð·ºÅ丮³ª /usr/local·Î À̵¿½ÃŲ´Ù.
$ cd ~/Download
$ tar xzf mongodb-osx-x86_64-2.4.9.tgz
$ mv mongodb-osx-x86_64-2.2.9 ~/mongodb
or
$ sudo mv mongodb-osx-x86_64-2.2.9 /usr/local/mongodb
³ª. µ¥ÀÌÅÍ µð·ºÅ丮
MongoDB ´Â ±âº»ÀûÀ¸·Î '/data/db' µð·ºÅ丮¿¡ µ¥ÀÌÅ͸¦ °ü¸®ÇÑ´Ù. µð·ºÅ丮¸¦ »ý¼ºÇϰí ÀûÀýÇÑ ±ÇÇÑÀ» ºÎ¿©ÇÑ´Ù.
$ sudo mkdir -p /data/db
$ whoami
maninzoo
$ sudo chown maninzoo /data/db
[Note]
±ÇÇÑÀÌ ¾ø´Â °æ¿ì ¾Æ·¡¿Í °°Àº locking error°¡ ¹ß»ýÇÑ´Ù.
Unable to create/open lock file: /data/db/mongod.lock
´Ù. $PATH ¼³Á¤
MongoDB ¸í·ÉÀ» ½±°Ô Çϱâ À§ÇØ mongodb/bin À» $PATH ȯ°æº¯¼ö¿¡ Ãß°¡ÇÑ´Ù. `.bash_profile` ÀÌ Á¸ÀçÇÏÁö ¾Ê´Â °æ¿ì Ãß°¡ÇÑ´Ù.
$ cd ~
$ pwd
/Users/maninzoo
$ vi .bash_profile
export MONGO_PATH=/Users/maninzoo/mongodb
export PATH=$PATH:$MONGO_PATH/bin
## restart terminal
$ mongo -version
MongoDB shell version: 2.4.9
¶ó. MongoDB ½ÇÇà
`mongod` ·Î MongoDB ¸¦ ½ÇÇàÇϰí `mongo` ·Î ¿¬°áÇÑ´Ù. ¾Æ·¡¿¡¼ º¸´Â °Íó·³ ±âº»ÀûÀ¸·Î 27017 port¸¦ ÀÌ¿ëÇÑ´Ù.
Terminal 1
$ mongod
MongoDB starting : pid=3417 port=27017 dbpath=/data/db/ 64-bit host=Macintosh.local
waiting for connections on port 27017
Terminal 2
$ mongo
MongoDB shell version: 2.4.9
connecting to: test
> show dbs
local (empty)
[Note]
±âº» µ¥ÀÌÅÍ µð·ºÅ丮°¡ ¾Æ´Ñ ´Ù¸¥ Æú´õ¸¦ ÀÌ¿ëÇϱâ À§Çؼ´Â `--dbpath`¿¡ ¿øÇÏ´Â path¸¦ ÁöÁ¤ÇÏ¸é µÈ´Ù.
$ mongod --dbpath /any-directory
¸¶. MongoDB Á¾·á
´Ü¼øÈ÷ Ctrl+C ¸¦ ÀÔ·ÂÇÏ¸é µÈ´Ù.
[Note]
¿ì¾ÆÇÏ°Ô Á¾·áÇÏ·Á¸é mongo ÄÜ¼Ö Ã¢¿¡¼ admin DB ·Î À̵¿ ÈÄ db.shutdownServer() ¸¦ ½ÇÇàÇÑ´Ù.
> use admin
switched to db admin
> db.shutdownServer()
server should be down...
2. Node
°¡. ´Ù¿î·Îµå
Node.js °ø½Ä »çÀÌÆ®¿¡¼ ¼³Ä¡ ÇÁ·Î±×·¥À» ´Ù¿î·Îµå ¹Þ´Â´Ù.
³ª. ¼³Ä¡
Installer (.pkg)¸¦ ½ÇÇàÇÏ¿© ¼³Ä¡¸¦ ÇÑ´Ù.
´Ù. NPM ½ÇÇà
¿¹Àü¿¡´Â º°µµ·Î NPMÀ» ¼³Ä¡ÇØ ÁÖ¾î¾ß ÇßÁö¸¸ Node.js ¼³Ä¡ ½Ã NPMµµ °°ÀÌ ¼³Ä¡µÈ´Ù.
[/Users/maninzoo]npm
Usage: npm <command>
npm@1.4.9 /usr/local/lib/node_modules/npm
3. NPM
°¡. ¸ðµâ ¼³Ä¡
command line(Å͹̳ÎÀ̳ª ¸í·É â)¿¡ install ¸í·ÉÀ» ÀÌ¿ëÇÏ¿© »ç¿ëÇϰíÀÚ ÇÏ´Â ¸ðµâÀ» ¼³Ä¡ÇÑ´Ù. working directory(ÀϹÝÀûÀ¸·Î ÇÁ·ÎÁ§Æ® root) ÇÏÀ§ÀÇ `node_modules` ¶ó´Â Æú´õ(¾øÀ¸¸é »ý¼º)¿¡ ¸ðµâ°ú ÇØ´ç ¸ðµâÀÌ Á¾¼Ó¼ºÀ» °®´Â ¸ðµâµéÀÌ ÀüºÎ ¼³Ä¡µÈ´Ù.
$ npm install [module name]
³ª. ¸ðµâ ¼³Á¤
¸ðµâÀ» ÀÌ¿ëÇÒ ÇÁ·ÎÁ§Æ® Á¤ÀÇ ¹× ¼³Á¤Àº ÇÁ·ÎÁ§Æ® ·çÆ® µð·ºÅ丮ÀÇ `package.json` ÆÄÀÏÀ» ÀÌ¿ëÇÑ´Ù. ÆÄÀÏÀº ÇϳªÀÇ JSON °´Ã¼·Î ÀÌ·ç¾îÁ³À¸¸ç ÇÁ·ÎÁ§Æ® ÀÚü Á¤ÀÇ¿Í ÇÁ·ÎÁ§Æ®ÀÇ Á¾¼Ó¼º µîÀ» ¼³Á¤ÇÑ´Ù. ÀÌ·¸°Ô ±¸¼ºµÈ ÇÁ·ÎÁ§Æ®´Â º°µµÀÇ ¸ðµâ·Î ¹èÆ÷µÉ ¼ö ÀÖ´Ù.[°¢ÁÖ 7] ¾Æ·¡´Â Backbone.jsÀÇ package.json ÆÄÀÏ ¿¹ÀÌ´Ù.
{
"name" : "backbone",
"description" : "Give your JS App some Backbone with Models, Views, Collections, and Events.",
"url" : "http://backbonejs.org",
"keywords" : ["model", "view", "controller", "router", "server", "client", "browser"],
"author" : "Jeremy Ashkenas <jeremy@documentcloud.org>",
"dependencies" : {
"underscore" : ">=1.5.0"
},
"devDependencies": {
"phantomjs": "1.9.0-1",
"docco": "0.6.1",
"coffee-script": "1.6.1"
},
"scripts": {
"test": "phantomjs test/vendor/runner.js test/index.html?noglobals=true && coffee test/model.coffee",
"build": "uglifyjs backbone.js --mangle --source-map backbone-min.map -o backbone-min.js",
"doc": "docco backbone.js && docco examples/todos/todos.js examples/backbone.localstorage.js",
"lint": "jsl -nofilelisting -nologo -conf docs/jsl.conf -process backbone.js"
},
"main" : "backbone.js",
"version" : "1.1.0",
"license" : "MIT",
"repository": {
"type": "git",
"url": "https://github.com/jashkenas/backbone.git"
}
}
init ¸í·ÉÀ» ÅëÇØ package.jsonÀ» interactiveÇÏ°Ô »ý¼ºÇÒ ¼ö ÀÖ´Ù.
$npm init
install ½ÃÁ¡¿¡ --save ÆÄ¶ó¹ÌÅ͸¦ ÁÖ¾î ¸ðµâÀÇ ¼³Ä¡¿Í µ¿½Ã¿¡ Á¾¼Ó¼º¿¡ ´ëÇÑ ¼³Á¤À» ÇÁ·ÎÁ§Æ®ÀÇ package.json ¿¡ Ãß°¡ÇÒ ¼ö ÀÖ´Ù. ÇØ´ç ¼³Á¤Àº package.json ÆÄÀÏÀÇ `dependencies` name(key)ÀÇ value·Î Ãß°¡µÈ´Ù.
$ npm install [module name] --save
--save °¡ product ±âÁØÀÇ Á¾¼Ó¼ºÀ̶ó¸é --save-dev ÆÄ¶ó¹ÌÅÍ·Î °³¹ß ±âÁØÀÇ Á¾¼Ó¼ºÀ» Ãß°¡ÇÒ ¼ö ÀÖ´Ù. package.json ÆÄÀÏÀÇ `devDependencies` nameÀÇ value°¡ ¾÷µ¥ÀÌÆ® µÈ´Ù.
´Ù. Global (-g) ¿É¼Ç
ÀϹÝÀûÀ¸·Î ÇÁ·ÎÁ§Æ® root¿¡¼ ÆÄ¶ó¹ÌÅÍ ¾øÀÌ `npm install` À» ½ÇÇàÇÏ¿© package.json¿¡ Á¤ÀÇµÈ Á¾¼Ó¼ºÀ» ¸ðµÎ ¼³Ä¡ÇÑ´Ù. ÀÌ·± °æ¿ì ÇØ´ç ÇÁ·ÎÁ§Æ®¸¸À» À§ÇØ ¸ðµâµéÀÌ ¼³Ä¡µÇ°í ÇÁ·ÎÁ§Æ® º°·Î Á¾¼ÓÀûÀÎ ¸ðµâµéÀ» °ü¸®ÇÑ´Ù. ÇÁ·ÎÁ§Æ® root¸¦ ±âÁØÀ¸·Î ¼³Ä¡µÈ ¸ðµâµéÀ» »ó´ë °æ·Î·Î ÂüÁ¶ÇÏ´Â °ÍÀÌ ºÒÆíÇϱ⠶§¹®¿¡ `-g` ±Û·Î¹ú ¿É¼ÇÀ» ÁÖ¾î ¼³Ä¡¸¦ ÇÏ¸é »ç¿ëÀÚ `PATH`¿¡ Ãß°¡µÇ°í ´Ü¼øÈ÷ ¸ðµâÀÇ scripts name¸¸À¸·Î ½ÇÇàÇÒ ¼ö ÀÖ´Ù.
npm install -g grunt
ÇÏÁö¸¸ ±Û·Î¹ú ¿É¼ÇÀ» ³²¿ëÇÒ °æ¿ì, ÇØ´ç ÇÁ·ÎÁ§Æ®¸¦ ´Ù¸¥ »ç¿ëÀÚ°¡ »ç¿ëÇϰųª ´Ù¸¥ Àåºñ·Î ¿Å°åÀ» ¶§ ¿¹»ó°ú´Â ´Ù¸¥ °á°ú¸¦ ³ºÀ» ¼ö ÀÖ¾î À̽ļº Á¦¾àÀ» °¡Á®¿Â´Ù. ÀÌ´Â º¸Åë `node_modules`¸¦ Á¦¿ÜÇÑ ÇÁ·ÎÁ§Æ®¸¸ÀÇ ÆÄÀϵé·Î ¹èÆ÷, ÀÌ½ÄµÈ ÈÄ `install` ¸í·ÉÀ» ÅëÇØ Á¾¼ÓÀûÀÎ ¸ðµâÀ» ¼³Ä¡Çϱ⠶§¹®ÀÌ´Ù.
¶ó. ¸ðµâ ¾÷µ¥ÀÌÆ®
¼³Ä¡µÈ ¸ðµâÀÇ ¾÷µ¥ÀÌÆ®´Â ´ÙÀ½°ú °°´Ù.
npm update [module name]
3) ±ÛÀ» ¸ÎÀ¸¸ç
Java¿Í RDBMS°¡ ¿ì¸®¿¡°Ô ¿©ÀüÈ÷ Ç¥ÁØ(De facto)ÀÌÀÚ Ä£¼÷ÇÑ »óȲ¿¡¼, ¿£ÅÍÇÁ¶óÀÌÁî À¥ ¾ÖÇø®ÄÉÀ̼ÇÀ» ±¸ÃàÇϴµ¥ ¸¹Àº ´ÜÁ¡À» ¾È°í ÀÖ´Â Node.js³ª MongoDB°¡ ÁÖ¸ñ ¹ÞÀ» ¼ö ÀÖÀ»±î?
´ÜÁ¡¿¡µµ ºÒ±¸ÇÏ°í µ¿ÀÏÇÑ °³¹ßȯ°æ¿¡ µû¸¥ »ý»ê¼º Çâ»ó°ú À¯Áöº¸¼öÀÇ Æí¸®ÇÔ, ¼º´É, ½¬¿î ºôµå¿Í ¹èÆ÷ ¶§¹®ÀÎÁö ÃÖ±Ù Walmart, General Motors, LinkedIn µîÀÌ ¾ÆÅ°ÅØÃ³ º¯°æÀ» ÁøÇàÇϰí ÀÖ´Ù.
AWS[°¢ÁÖ 8] µîÀÇ ±âÁ¸ Ŭ¶ó¿ìµå ¼ºñ½º ¾÷ü»Ó¸¸ ¾Æ´Ï¶ó 2014³â 8¿ù ±¸±Ûµµ ±×µéÀÇ Å¬¶ó¿ìµå ¼ºñ½º¿¡ MongoDB, Node.js, Express¿Í Angular.js·Î ±¸¼ºµÈ °³¹ß Ç÷§Æû(PaaS[°¢ÁÖ 9])ÀÎ mean.io¸¦ Æ÷ÇÔ½ÃÄ×´Ù.
Java Áø¿µ¿¡¼µµ JDK 6ºÎÅÍ Rhino ¿£ÁøÀ» ¹øµé·Î Æ÷ÇÔ½ÃÄÑ JavaScript¸¦ Áö¿øÇÏ´ø °ÍÀ» JDK 8ºÎÅÍ Nashorn ¿£ÁøÀ» ÀÓº£µå½ÃÄÑ °È½ÃÄ×´Ù.
ºÐ¾ß¿¡ »ó°ü¾øÀÌ ¸ðµÎ JavaScript¸¦ ²ø¾î¾ÈÀ¸·Á´Â ¿òÁ÷ÀÓÀÌ È°¹ßÇÑ °ÍÀº È®½ÇÇÏ´Ù. ÀÌ·¸°Ô ÁÖ¸ñ ¹Þ°í ÀÖ´Â ¼Ö·ç¼ÇµéÀ» ÀÌ¿ëÇØ¼ À¥ ¾ÖÇø®ÄÉÀ̼ÇÀ» ¸¸µé¾î º¸ÀÚ.
< °¢ÁÖ >
[1] Ãֱ٠Ŭ¶óÀÌ¾ðÆ®¶ó´Â ¿ë¾îº¸´Ù ´õ ÀϹÝÀûÀ¸·Î »ç¿ëµÇ±â ¶§¹®¿¡ ÀÌ ±Û¿¡¼´Â È¥¿ëÇØ¼ »ç¿ëÇÒ ¿¹Á¤ÀÌ´Ù.
[2] v0.11.2 ¹öÀü ÀÌ»ó Áö¿ø. ±Û ÀÛ¼º ½ÃÁ¡ÀÇ ¹öÀüÀº v0.10.31 À̹ǷΠ°³¹ß ¹öÀü¿¡¼ È®ÀÎÇÒ ¼ö ÀÖ´Ù. ¶ÇÇÑ Generators ´Â ES6(Harmony ÇÁ·ÎÁ§Æ®)ºÎÅÍ Áö¿øµÇ¹Ç·Î ½ÇÇà ½Ã ´ÙÀ½°ú °°ÀÌ ÇØ¾ß ÇÑ´Ù : node --harmony ***.js
[3] 'Node Packaged Modules'ÀÇ ¾àÀڷεµ »ç¿ëµÈ´Ù.
[4] http://bsonspec.org/#/specification
[5] NoSQL À̶ó´Â ¿ë¾î°¡ ±âÁ¸ SQLÀÇ ¾ð¾î¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â Ãø¸é¿¡¼ 'Not only SQL'À¸·Îµµ ºÒ¸°´Ù.
[6] RDBMS¿¡¼´Â Á¤±Ôȸ¦ ÅëÇØ Áߺ¹µÇ´Â ºÎºÐÀ» Á¦°ÅÇÑ´Ù¸é MongDB¿¡¼´Â ±×·± ºÎºÐÀ» Çã¿ëÇÏ°í ¼º´ÉÀ» ÃëÇÏ´Â °ÍÀ¸·Î º¸ÀδÙ. ±âÁ¸ °³³ä°ú ¹èÄ¡µÇ´Â ÀÌ·± ºÎºÐÀÌ È¥¶õ½º·´°Ô ÇÏ´Â ¿ä¼ÒÀÌ´Ù.
[7] Node.js ¸ðµâÀ» npm ÀúÀå¼Ò¿¡ ¹èÆ÷Çϱâ(http://blog.outsider.ne.kr/829) ÂüÁ¶
[8] Amazon Web Services
[9] Platform-as-a-Service
|