{"id":379,"date":"2014-09-15T00:27:39","date_gmt":"2014-09-15T09:27:39","guid":{"rendered":"http:\/\/blog.box.kr\/?p=379"},"modified":"2014-09-15T00:27:39","modified_gmt":"2014-09-15T09:27:39","slug":"%ed%8e%8c%eb%b9%a0%eb%a5%b4%ea%b2%8c-%ed%9b%9d%ec%96%b4-%eb%b3%b4%eb%8a%94-node-js-6-mongodb-%ec%97%b0%eb%8f%99","status":"publish","type":"post","link":"https:\/\/blog.box.kr\/?p=379","title":{"rendered":"[\ud38c]\ube60\ub974\uac8c \ud6dd\uc5b4 \ubcf4\ub294 node.js"},"content":{"rendered":"<h2><a href=\"http:\/\/bcho.tistory.com\/889\">http:\/\/bcho.tistory.com\/889<\/a><\/h2>\n<h2><\/h2>\n<h2><a href=\"http:\/\/bcho.tistory.com\/889\">\ube60\ub974\uac8c \ud6dd\uc5b4 \ubcf4\ub294 node.js &#8211; #6 MongoDB \uc5f0\ub3d9 (mongo-native)<\/a><\/h2>\n<p><a href=\"http:\/\/bcho.tistory.com\/category\/%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C%20%EC%BB%B4%ED%93%A8%ED%8C%85%20%26%20NoSQL\/Vert.x%20%26%20Node.js\">\ud074\ub77c\uc6b0\ub4dc \ucef4\ud4e8\ud305 &amp; NoSQL\/Vert.x &amp; Node.js<\/a>\u00a0|\u00a02014\/04\/03 23:49\u00a0|\u00a0Posted by\u00a0\uc870\ub300\ud611<\/p>\n<p><strong>\ube60\ub974\uac8c \ud6dd\uc5b4\ubcf4\ub294\u00a0node.js<\/strong><\/p>\n<p><strong>#6- mongo-native \ubaa8\ub4c8\uc744 \uc774\uc6a9\ud55c MongoDB \uc5f0\ub3d9<\/strong><\/p>\n<p>\uc870\ub300\ud611\u00a0(http:\/\/bcho.tistory.com<\/p>\n<h1>Persistence\u00a0\uc5f0\ub3d9<\/h1>\n<p>node.js\ub294\u00a0DB\ub098\u00a0NoSQL\ub4f1\uc758 \uc5f0\ub3d9\uc744 \uc9c0\uc6d0\ud558\ub294\ub370,\u00a0\uc774 \uc5ed\uc2dc \ucca0\uc800\ud558\uac8c\u00a0non-blocking io\u00a0\ubc29\uc2dd\uc73c\ub85c \ub3d9\uc791\ud55c\ub2e4.\u00a0\uc989\u00a0db\u00a0\uc5f0\uacb0\u00a0socket\uc744 \uc5f4\uc5b4\uc11c\u00a0query\ub97c \ub358\uc838\ub193\uace0, query\u00a0\uacb0\uacfc\uac00 \uc624\uba74 \uc774\ubca4\ud2b8\ub97c \ubc1b\uc544\uc11c\u00a0callback\u00a0\ud568\uc218\ub85c \ucc98\ub9ac\ud558\ub294 \uc21c\uc11c\uc774\ub2e4.<\/p>\n<p>\uadf8\ub7ec\uba74 \uc5ec\uae30\uc11c\ub294 \uba87\uac00\uc9c0\u00a0persistence\u00a0\uc5f0\ub3d9 \ubc29\uc2dd\uc5d0 \ub300\ud574\uc11c \uc54c\uc544\ubcf4\ub3c4\ub85d \ud55c\ub2e4.<\/p>\n<h2>MongoDB<\/h2>\n<p>\uba3c\uc800\u00a0mongodb\ub294\u00a0nosql\u00a0\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc911\uc5d0 \uac00\uc7a5 \ub9ce\uc774 \uc0ac\uc6a9\ub418\ub294 \uc81c\ud488\uc911\uc758 \ud558\ub098\uc774\ub2e4. Json document\ub97c \uc800\uc7a5\ud558\ub294 \uc2a4\ud0c0\uc77c\uc758\u00a0document db\uc774\uba70, index\ub098\u00a0grouping\uacfc \uac19\uc740\u00a0RDBMS\uc640 \uc720\uc0ac\ud55c \uae30\ub2a5\uae4c\uc9c0 \uc9c0\uc6d0\ud558\uae30 \ub54c\ubb38\uc5d0 \uc0ac\uc6a9\uc774 \ub9e4\uc6b0 \uc27d\ub2e4.<\/p>\n<h3>\uc124\uce58\u00a0\ubc0f\u00a0\ud14c\uc2a4\ud2b8<\/h3>\n<p>Mongodb\ub294\u00a0mongodb.org\uc5d0\uc11c \ub2e4\uc6b4\ub85c\ub4dc \ubc1b\uc744 \uc218 \uc788\ub2e4. Mongodb\ub294 \ubb34\ub8cc\u00a0tutorial\uc774 \uc798\ub418\uc5b4 \uc788\ub294 \uac83\uc774 \ub9ce\uc740\ub370,\u00a0<a href=\"https:\/\/university.mongodb.com\/\">https:\/\/university.mongodb.com\/<\/a>\uc5d0 \uac00\uba74 \uc5b8\uc5b4\ubcc4\u00a0(node.js\uc6a9\ub3c4 \uc788\ub2e4)\u00a0\ud29c\ud1a0\ub9ac\uc5bc\uc774 \uc788\uc73c\ub2c8 \ucc38\uace0\ud558\uae30 \ubc14\ub780\ub2e4.<\/p>\n<p>\uc708\ub3c4\uc6b0\ub97c \uae30\uc900\uc73c\ub85c \ub2e4\uc6b4 \ubc1b\uc544\uc11c \uc555\ucd95\uc744 \ud47c\ud6c4, \u00a0db\u00a0\ub514\ub809\ud1a0\ub9ac\ub97c \ub9cc\ub4e4\uc5b4 \uc8fc\uc5b4\uc57c \ud558\ub294\ub370,\u00a0\ud544\uc694\ud55c \uacf3\uc5d0 \ub514\ub809\ud1a0\ub9ac\ub97c \ub9cc\ub4e0\ub2e4.\u00a0\uc5ec\uae30\uc11cC:devmongodb-win32-x86_64-2.4.3\u00a0data\u00a0\uc5d0 \ub9cc\ub4e4\uc5c8\ub2e4.<\/p>\n<p>C:devmongodb-win32-x86_64-2.4.3\u00a0\uc5d0\uc11c \ub2e4\uc74c\uacfc \uac19\uc740 \uba85\ub839\uc5b4\ub97c \uc774\uc6a9\ud558\uc5ec \uad6c\ub3d9\ud55c\ub2e4.<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"615\">.binmongod &#8211;dbpath C:devmongodb-win32-x86_64-2.4.3data<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\uc778\uc2a4\ud1a8\uc774 \ub05d\ub0ac\uc73c\uba74 \uac04\ub2e8\ud55c \ud14c\uc2a4\ud2b8\ub97c \ud574\ubcf4\uc790, .\/bin\/mongo.exe\ub97c \uc218\ud589\ud558\uba74\u00a0Java Script\u00a0\uae30\ubc18\uc758 \uc258\uc774 \uc218\ud589\ub41c\ub2e4.\u00a0\uc774\ud574\ub97c \ub3d5\uae30 \uc704\ud574\uc11c \ud558\ub098\uc758 \ud14c\uc774\ube14\uc5d0\u00a0Insert , select, delete, update\ub97c \uc218\ud589\ud558\ub294 \uba85\ub839\uc744\u00a0SQL\u00a0\ubb38\uc7a5\uacfc \ube44\uad50\ud574\uc11c \uc18c\uac1c\ud55c\ub2e4.<\/p>\n<p><strong>Insert<\/strong><\/p>\n<p>SQL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 : insert into users (&#8220;name&#8221;,&#8221;city&#8221;) values(&#8220;terry&#8221;,&#8221;seoul&#8221;)<\/p>\n<p>Mongo DB\u00a0\u00a0\u00a0\u00a0 : db.users.insert({_id:&#8221;terry&#8221;,city:&#8221;seoul&#8221;})<\/p>\n<p>&nbsp;<\/p>\n<p><strong>Select<\/strong><\/p>\n<p>SQL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0: select * from users where id=&#8221;terry&#8221;<\/p>\n<p>Mongo DB\u00a0\u00a0\u00a0\u00a0 : db.users.find({_id:&#8221;terry&#8221;})<\/p>\n<p>&nbsp;<\/p>\n<p><strong>Update<\/strong><\/p>\n<p>SQL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0: update users set city=&#8221;busan&#8221; where _id=&#8221;terry&#8221;<\/p>\n<p>Mongo DB\u00a0\u00a0\u00a0\u00a0 : db.users.update( {_id:&#8221;terry&#8221;}, {$set :{ city:&#8221;Busan&#8221; } } )<\/p>\n<p>&nbsp;<\/p>\n<p><strong>Delete<\/strong><\/p>\n<p>SQL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0: delete from users where _id=&#8221;terry&#8221;<\/p>\n<p>Mongo DB\u00a0\u00a0\u00a0\u00a0 : db.users.remove({_id:&#8221;terry&#8221;})<\/p>\n<p>&nbsp;<\/p>\n<p>\uac04\ub2e8\ud558\uac8c \ub098\ub9c8, mongodb query\uc5d0 \ub300\ud574\uc11c \uc124\uba85\ud558\uc600\ub2e4.<\/p>\n<p>\uac1c\ub150\uc801\uc744 \uc57d\uac04 \ub354 \uc124\uba85\ud558\uc790\uba74, db\ub294\u00a0RDBMS\uc5d0\u00a0db\uc640 \uac19\uc740 \uac1c\ub150\uc73c\ub85c \ubcf4\uba74 \ub418\uace0, collection\uc740\u00a0rdbms\uc758 \ud558\ub098\uc758 \ud14c\uc774\ube14\ub85c \ubcf4\uba74 \ub41c\ub2e4. collection\uc5d0 \ub4e4\uc5b4\uac00\ub294 \ub370\uc774\ud130 \ud544\ub4dc\uc911\uc5d0\uc11c\u00a0_id\ub294\u00a0predefined\ub41c \ud544\ub4dc\ub85c \ud574\ub2f9 \ub370\uc774\ud130\uc5d0 \ub300\ud55c\u00a0primary key\ub85c \uc0dd\uac01\ud558\uba74 \ub418\uace0,\u00a0\uc704\uc640 \uac19\uc774 \uc0ac\uc6a9\uc790\uac00 \uc9c1\uc811 \uac12\uc744 \ub123\uc5b4\uc11c \uc785\ub825\ud560 \uc218\ub3c4 \uc788\uace0 \ub610\ub294 \uac12\uc744 \ub123\uc9c0 \uc54a\uc73c\uba74\u00a0mongodb\uc5d0 \uc758\ud574\uc11c\u00a0unique\ud55c \uac12\uc73c\ub85c \uc790\ub3d9 \uc9c0\uc815\ub41c\ub2e4.<\/p>\n<p>\uc870\uae08 \ub354 \uc790\uc138\ud55c \ucffc\ub9ac\uc5d0 \ub300\ud55c \uc124\uba85\uc740\u00a0http:\/\/docs.mongodb.org\/manual\/crud\/\u00a0\ub97c \ucc38\uace0\ud558\uae30 \ubc14\ub780\ub2e4.<\/p>\n<p>GUI\u00a0\ud234\ub85c\ub294\u00a0robomongo\u00a0\ub77c\ub294 \ud234\uc774 \uc788\ub2e4.\u00a0<a href=\"http:\/\/robomongo.org\/\">http:\/\/robomongo.org\/<\/a><\/p>\n<h3>mongodb-native\u00a0\ubaa8\ub4c8\uc744\u00a0\uc774\uc6a9\ud558\uae30<\/h3>\n<p>node.js\uc5d0\uc11c\u00a0mongodb\ub97c \uc5f0\uacb0\ud558\ub294 \ubc29\ubc95\uc740 \uc5ec\ub7ec\uac00\uc9c0\uac00 \uc788\ub2e4.\u00a0\uba3c\uc800 \uac00\uc7a5 \ub110\ub9ac \uc0ac\uc6a9\ub418\ub294\u00a0mongo-native\u00a0\ubaa8\ub4c8\uc5d0 \ub300\ud574\uc11c \uc54c\uc544\ubcf4\uc790https:\/\/github.com\/mongodb\/node-mongodb-native<\/p>\n<p><strong>1) mongo native module\u00a0\uc124\uce58\ud558\uae30<\/strong><\/p>\n<p>mongo native module\uc740<\/p>\n<p>% npm install mongo\u00a0\ub85c \uc124\uce58\uac00 \uac00\ub2a5\ud558\uba70,\u00a0\uc124\uce58\uc911\uc5d0\u00a0native\u00a0\ubaa8\ub4c8\uc744 \ucef4\ud30c\uc77c \ud558\uae30 \ub54c\ubb38\uc5d0 \ubc18\ub4dc\uc2dc \ucef4\ud30c\uc77c\ub7ec\u00a0(Windows\uc758 \uacbd\uc6b0\u00a0Visual C++\ub4f1)\uc774 \uae54\ub824 \uc788\uc5b4\uc57c \ud55c\ub2e4.<\/p>\n<p><strong>2)\u00a0\uac04\ub2e8\ud55c \ucffc\ub9ac \uc218\ud589\ud558\uae30<\/strong><\/p>\n<p>\uc124\uce58\uac00 \ub05d\ub0ac\uc73c\uba74 \uac04\ub2e8\ud558\uac8c\u00a0select\ub97c \ud574\uc11c \ub0b4\uc6a9\uc744\u00a0json\uc73c\ub85c \ub9ac\ud134\ud558\ub294 \ucf54\ub4dc\ub97c \ub9cc\ub4e4\uc5b4\ubcf4\uc790. Select\ub97c \ud560\uac83\uc774\uae30 \ub54c\ubb38\uc5d0 \ubbf8\ub9ac\u00a0mongo\uc5d0 \uac12\uc744 \ub123\uc5b4\ubcf4\uc790<\/p>\n<p>% mongo.exe\u00a0\ub97c \uc2e4\ud589\ud55c \ud6c4\uc5d0 \ub2e4\uc74c \ucffc\ub9ac\ub97c \uc218\ud589\ud55c\ub2e4.<\/p>\n<p>db.users.insert({_id:&#8217;terry&#8217;,city:&#8217;seoul&#8217;});<\/p>\n<p>db.users.insert({_id:&#8217;cath&#8217;,city:&#8217;suwon&#8217;});<\/p>\n<p>&nbsp;<\/p>\n<p>\uc81c\ub300\ub85c \uc785\ub825\uc774 \ub418\uc5c8\ub294\uc9c0\u00a0select\ub97c \ud574\ubcf8\ub2e4.<\/p>\n<p>\uc544\ub798\ub294\u00a0mongodb\u00a0\ub3c4\uad6c\uc778\u00a0robomongo\ub97c \uc774\uc6a9\ud574\uc11c \ub370\uc774\ud130\uac00 \ub4e4\uc5b4\uac00 \uc788\ub294 \uac83\uc744 \ud655\uc778\ud55c \ud654\uba74\uc774\ub2e4.<\/p>\n<p>\uc790\uc544 \uadf8\ub7ec\uba74 \uc774\uc81c \ucf54\ub4dc\ub97c \uad6c\ud604\ud574\ubcf4\uc790<\/p>\n<p><strong>var<\/strong>\u00a0express = require(&#8216;express&#8217;);<\/p>\n<p><strong>var<\/strong>\u00a0routes = require(&#8216;.\/routes&#8217;);<\/p>\n<p><strong>var<\/strong>\u00a0http = require(&#8216;http&#8217;);<\/p>\n<p><strong>var<\/strong>\u00a0path = require(&#8216;path&#8217;);<\/p>\n<p><strong>var<\/strong>\u00a0app = express();<\/p>\n<p><strong>var<\/strong>\u00a0MongoClient = require(&#8216;mongodb&#8217;).MongoClient<\/p>\n<p><strong>var<\/strong>\u00a0Server = require(&#8216;mongodb&#8217;).Server;<\/p>\n<p>\uba3c\uc800 \uc704\uc640 \uac19\uc774\u00a0MongoClient\uc640\u00a0Server\u00a0\ud074\ub798\uc2a4\ub97c \uc0dd\uc131\ud55c\ub2e4<\/p>\n<p>\/\/ all environments<\/p>\n<p>app.set(&#8216;port&#8217;, process.env.PORT || 3000);<\/p>\n<p>app.set(&#8216;views&#8217;, path.join(__dirname,\u00a0&#8216;views&#8217;));<\/p>\n<p>app.set(&#8216;view engine&#8217;,\u00a0&#8216;ejs&#8217;);<\/p>\n<p>app.use(express.logger(&#8216;dev&#8217;));<\/p>\n<p>app.use(express.json());<\/p>\n<p>app.use(express.urlencoded());<\/p>\n<p>app.use(express.methodOverride());<\/p>\n<p>app.use(app.router);<\/p>\n<p>app.use(express.<strong>static<\/strong>(path.join(__dirname,\u00a0&#8216;public&#8217;)));<\/p>\n<p>&nbsp;<\/p>\n<p><strong>var<\/strong>\u00a0mongoclient =\u00a0<strong>new<\/strong>\u00a0MongoClient(<strong>new<\/strong>\u00a0Server(&#8216;localhost&#8217;,27017,{&#8216;native_parser&#8217;:<strong>true<\/strong>}));<\/p>\n<p><strong>var<\/strong>\u00a0db = mongoclient.db(&#8216;test&#8217;);<\/p>\n<p>\ub2e4\uc74c\uc73c\ub85c\u00a0mongoclient\ub97c \uc0dd\uc131\ud55c\ub2e4.\u00a0\uc77c\uc885\uc758\u00a0Connection\u00a0\uc124\uc815\uc774\ub77c\uace0 \ubcf4\uba74 \ub418\ub294\ub370,\u00a0\uc124\uc815\ub9cc \uc5ec\uae30\uc11c \ud558\ub294 \uac83\uc774\uc9c0 \uc2e4\uc81c \uc5f0\uacb0\uc740\u00a0open\uc744 \ud638\ucd9c\ud574\uc57c \ub41c\ub2e4.\ub2e4\uc74c\uc73c\ub85c\u00a0client\uc5f0\uacb0\uc744 \uc774\uc6a9\ud574\uc11c \uc0ac\uc6a9\ud560\u00a0db\ub97c \uc120\ud0dd\ud55c\ub2e4.\u00a0\uc5ec\uae30\uc11c\ub294\u00a0\u2018test\u2019 db\ub97c \uc0ac\uc6a9\ud558\uc600\ub2e4.<\/p>\n<p>&nbsp;<\/p>\n<p>app.get(&#8216;\/&#8217;,\u00a0<strong>function<\/strong>(req,res) {<\/p>\n<p>db.collection(&#8216;users&#8217;).findOne({},<strong>function<\/strong>(err,doc){<\/p>\n<p><strong>if<\/strong>(err)\u00a0<strong>throw<\/strong>\u00a0err;<\/p>\n<p>res.send(doc);<\/p>\n<p>});<\/p>\n<p>});<\/p>\n<p>Db\u00a0\uac1d\uccb4\ub97c \uc5bb\uc5c8\uc73c\uba74,\u00a0\ucffc\ub9ac\ub97c \uc218\ud589\ud560 \uc218 \uc788\ub294\ub370, collection(\u2018collection\uba85.\uc989 \ud14c\uc774\ube14\uba85\u2019)\uc73c\ub85c\u00a0collection\uc744 \uc120\ud0dd\ud55c\ud6c4, findOne()\uba54\uc11c\ub4dc\ub97c \uc774\uc6a9\ud558\uc5ec \ud558\ub098\uc758\u00a0row\ub9cc\u00a0select\ub97c \ud558\uc600\ub2e4.\u00a0\ube44\ub3d9\uae30 \ud638\ucd9c\uc774\uae30 \ub54c\ubb38\uc5d0\u00a0query\u00a0\uc218\ud589\uc774 \ub05d\ub098\uba74, function(err,doc) callback\u00a0\ud568\uc218\ub97c \ud638\ucd9c\ud558\ub294\ub370,\u00a0\uc704\uc5d0\uc11c\ub294 \uc5d0\ub7ec\uac00 \ub0ac\uc744\ub54c\ub294\u00a0err\ub97c\u00a0throw\ud558\uace0 \uc5d0\ub7ec\uac00 \uc5c6\uc744 \uacbd\uc6b0\uc5d0\ub294 \ub9ac\ud134\ubc1b\uc740\u00a0json document\ub97c\u00a0response\uc5d0\u00a0return\ud558\ub3c4\ub85d \ud558\uc600\ub2e4.\u00a0\uc5ec\uae30 \uae4c\uc9c0 \ub05d\ub0ac\uc73c\uba74,\u00a0\uc2e4\uc81cmongodb\ub97c \uc5f0\uacb0\ud574\ubcf4\uc790 \uc5f0\uacb0\uc740\u00a0mongoclient.open\uc744 \ud558\uba74 \ub418\ub294\ub370,\u00a0\uc5f0\uacb0\uc774 \uc644\ub8cc\ub418\uba74\u00a0open\uc548\uc5d0 \uc815\uc758\ub41c\u00a0callback method\ub97c \ud638\ucd9c\ud55c\ub2e4.<\/p>\n<p>\uc544\ub798\ucf54\ub4dc\ub97c \ubcf4\uba74 \uc774\u00a0callback\u00a0\uba54\uc11c\ub4dc \uc548\uc5d0\uc11c\u00a0httpServer\ub97c \ub744\uc6b4 \uac83\uc744 \ubcfc \uc218 \uc788\ub294\ub370, http server\uac00 \uae30\ub3d9\ub418\uc11c\u00a0mongodb\ub97c \uc0ac\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0mongoclient\ub97c \uba3c\uc800 \ub744\uc6b0\uae30 \uc704\ud574\uc11c\u00a0httpserver\ub97c\u00a0callback\uc548\uc5d0 \ub123\uc5c8\ub2e4.<\/p>\n<p>&nbsp;<\/p>\n<p>mongoclient.open(<strong>function<\/strong>(err, mongoclient) {<\/p>\n<p><strong>if<\/strong>(err)\u00a0<strong>throw<\/strong>\u00a0err;<\/p>\n<p>console.log(&#8216;mongo client connected&#8217;);<\/p>\n<p>http.createServer(app).listen(app.get(&#8216;port&#8217;),\u00a0<strong>function<\/strong>(){<\/p>\n<p>console.log(&#8216;Express server listening on port &#8216;\u00a0+ app.get(&#8216;port&#8217;));<\/p>\n<p>});<\/p>\n<p>&nbsp;<\/p>\n<p>});<\/p>\n<p>&nbsp;<\/p>\n<p>\ucf54\ub4dc \uad6c\ud604\uc774 \ub05d\ub0ac\uc73c\uba74 \uc2e4\ud589\ud574\ubcf4\uc790.\u00a0\ub2e4\uc74c\uacfc \uac19\uc774 \ub808\ucf54\ub4dc\uac00\u00a0JSON\uc73c\ub85c \ub9ac\ud134\ub428\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub2e4.<\/p>\n<p>\uc774 \ucf54\ub4dc\uc5d0\uc11c \ubcf4\uba74\u00a0mongoclient\ub97c \ud558\ub098\ub9cc \uc0dd\uc131\ud558\uc600\ub2e4.\u00a0\uadf8\ub807\ub2e4\uba74 \ub0b4\ubd80\uc801\uc73c\ub85c \ubb3c\ub9ac\uc801\uc778\u00a0connection\uc774 \ud558\ub098\ub9cc \uc0dd\uae38\uae4c? Mongoclient\ub294 \ub0b4\ubd80\uc801\uc73c\ub85cconnection pooling\uc744 \uc774\uc6a9\ud55c\ub2e4.\u00a0\uadf8\ub798\uc11c \ubcc4\ub3c4\uc758 \uc124\uc815\uc744 \ud574\uc8fc\uc9c0 \uc54a\uc544\ub3c4 \ub0b4\ubd80\uc801\uc73c\ub85c \uc5ec\ub7ec \uac1c\uc758\u00a0connection\uc744 \uc5ec\ub294\ub370, default\uac00\u00a05\uac1c\uc758\u00a0connection\uc744 \uc5f4\ub3c4\ub85d \ub418\uc5b4 \uc788\uace0, connection\uc758 \uc218\ub294\u00a0open\u00a0\uc635\uc158\uc5d0\uc11c \uc870\uc815\ud560 \uc218 \uc788\ub2e4.<\/p>\n<p><strong>var<\/strong>\u00a0mongoclient =\u00a0<strong>new<\/strong>\u00a0MongoClient(<strong>new<\/strong>\u00a0Server(&#8216;localhost&#8217;,27017,{&#8216;native_parser&#8217;:<strong>true<\/strong>,&#8217;poolSize&#8217;:8,&#8217;maxPoolSize&#8217;:10}));<\/p>\n<p>&nbsp;<\/p>\n<p>\uc704\uc758 \ucf54\ub4dc\ub294\u00a0max connection\uc744\u00a010\uac1c\ub85c \ud558\uace0,\u00a0\ucd08\uae30\uc5d0\u00a0poolSize\ub97c\u00a08\uac1c\ub85c \uc9c0\uc815\ud55c \uacbd\uc6b0\uc774\ub2e4.\u00a0\uc2e4\uc81c\ub85c \uae30\ub3d9\ud574\ubcf4\uba74\u00a08\uac1c\uc758\u00a0connection\uc774 \uc0dd\uc131\ub418\uc5c8\uc74c\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub2e4.<\/p>\n<p><strong>3) Insert, update and delete<\/strong><\/p>\n<p>Select\ub294 \ud574\ubd24\ub294\ub370,\u00a0\uadf8\ub7ec\uba74\u00a0insert,update,delete\ub294 \uc5b4\ub5bb\uac8c \ud560\uae4c? mongodb query\uc640 \ub9e4\uc6b0 \uc720\uc0ac\ud558\ub2e4.\uba3c\uc800\u00a0Insert\ub97c \ubcf4\uc790<\/p>\n<p>db.collection(&#8216;users&#8217;).insert({city:&#8217;suji&#8217;},<strong>function<\/strong>(err,doc){<\/p>\n<p>console.log(&#8216;inserted &#8216;+doc[0]._id+&#8217;:&#8217;+doc[0].city);<\/p>\n<p>});<\/p>\n<p>\uc704\uc640 \uac19\uc774\u00a0collection\uc744 \uc120\ud0dd\ud55c\ub2e4\uc74c\uc5d0, insert\uba54\uc11c\ub4dc\ub97c \uc774\uc6a9\ud574\uc11c\u00a0json document\ub97c \ub123\uc73c\uba74 \ub41c\ub2e4.\u00a0\uc704\uc5d0\uc11c\ub294\u00a0callback function\uc744 \uc9c0\uc815\ud55c \uc608\uc778\ub370, callback function\uc740 \uc0dd\ub7b5\ud560 \uc218 \ub3c4 \uc788\ub2e4.\u00a0\uc704\uc758 \ucf54\ub4dc\ub97c \uc798 \ubcf4\uba74 \uc55e\uc5d0 \uc608\uc81c\uc640\ub294 \ub2e4\ub978\uac8c\u00a0_id\uac12\uc744 \uc785\ub825\ud558\uc9c0 \uc54a\uc740 \uac83\uc744 \ubcfc \uc218 \uc788\ub2e4.\u00a0\uc774 \uacbd\uc6b0\u00a0_id\uac12\uc740 \uc790\ub3d9\uc73c\ub85c\u00a0mongodb\uac00 \uc0dd\uc131\ud558\uc5ec\u00a0unique\ud55c \uac12\uc744 \ub123\uac8c \ub41c\ub2e4.<\/p>\n<p>\uadf8\ub9ac\uace0\u00a0insert\ub41c \uac12\uc740\u00a0callback\uc758 \ub450\ubc88\uc9f8 \uc778\uc790\uc5d0\uc11c\u00a0array\u00a0\ud615\ud0dc\ub85c \ub118\uaca8 \ubc1b\uac8c \ub41c\ub2e4.<\/p>\n<p>\ub610\ub294<\/p>\n<p>db.collection(&#8216;users&#8217;).insert([{city:&#8217;suji&#8217;},{city:&#8217;busan&#8217;}],<strong>function<\/strong>(err,doc){<\/p>\n<p>&nbsp;<\/p>\n<p>\uc640 \uac19\uc740 \ubc30\uc5f4 \ud615\ud0dc\ub97c \uc0ac\uc6a9\ud558\uba74,\u00a0\ud558\ub098\uc758\u00a0insert\ubb38\uc7a5\uc73c\ub85c \uc5ec\ub7ec \uac1c\uc758\u00a0document\ub97c \ub3d9\uc2dc\uc5d0\u00a0insert\ud560 \uc218 \uc788\ub2e4.(\uc989\u00a0batch insert\uac00 \uac00\ub2a5\ud558\ub2e4)<\/p>\n<p>\uc0ad\uc81c\ub294\u00a0insert\uc640 \uc720\uc0ac\ud558\uac8c\u00a0remove\u00a0\uba54\uc11c\ub4dc\ub97c \uc774\uc6a9\ud558\uba74 \ub41c\ub2e4.<\/p>\n<p>db.collection(&#8216;users&#8217;).remove({city:&#8217;busan&#8217;},<strong>function<\/strong>(err,doc){});<\/p>\n<p>\uc704\uc758 \uc608\uc81c\ub294\u00a0city\u00a0\ud544\ub4dc\uac00\u00a0busan\uc778 \uac83\uc744 \uc0ad\uc81c\ud55c \uac83\uc778\ub370, _id\u00a0\ud544\ub4dc \uc774\uc678\uc5d0\ub294\u00a0index\ub85c \uc9c0\uc815\uc774 \ub418\uc5b4 \uc788\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0\u00a0index\ub97c \uc9c0\uc815\ud558\uc9c0 \uc54a\uc740 \ud544\ub4dc\ub85c \uc0ad\uc81c\ub4f1\uc744 \ud588\uc744 \uacbd\uc6b0\u00a0table full scan\uc774 \ubc1c\uc0dd\ud560 \uc218 \uc788\uc73c\ub2c8 \uc8fc\uc758\ud558\ub3c4\ub85d \ud574\uc57c \ud55c\ub2e4. (\ud55c\ub9c8\ub514\ub85c \ub290\ub824\uc9c4\ub2e4\ub294 \uc774\uc57c\uae30)<\/p>\n<p>\ub2e4\uc74c\uc73c\ub85c \uc218\uc815\uc740\u00a0collection.update\u00a0\uba54\uc11c\ub4dc\ub97c \uc774\uc6a9\ud558\uba74 \ub41c\ub2e4.<\/p>\n<p>db.collection(&#8216;users&#8217;).update({_id:&#8217;terry&#8217;},{$set:{&#8216;sex&#8217;:&#8217;male&#8217;}},<strong>function<\/strong>(err,doc){<\/p>\n<p><strong>throw<\/strong>\u00a0err;<\/p>\n<p>});<\/p>\n<p>_id\uac00\u00a0terry\uc778\u00a0document\uc5d0\u00a0\u2018sex\u2019\u00a0\ud544\ub4dc\ub97c\u00a0\u2018male\u2019\ub85c \ubcc0\uacbd\ud558\ub294 \ucffc\ub9ac\uc774\ub2e4.\u00a0\uc774\ubbf8\u00a0\u2018sex\u2019\ud544\ub4dc\uac00 \uc788\uc73c\uba74 \uadf8 \ub0b4\uc6a9\uc744\u00a0\u2018male\u2019\ub85c \ubc14\uafb8\uace0,\u00a0\uc5c6\uc73c\uba74 \uc0c8\ub86d\uac8c\u00a0\u2018sex\u2019\ud544\ub4dc\ub97c \ub9cc\ub4e0\ub2e4.\uc55e\uc5d0\u00a0$set\uc744 \uc92c\uae30 \ub54c\ubb38\uc5d0\u00a0\u2018sex\u2019\ud544\ub4dc\ub9cc \ub0b4\uc6a9\uc744 \ubc14\uafb8\ub294\ub370,<\/p>\n<p>db.collection(&#8216;users&#8217;).update({_id:&#8217;terry&#8217;},{&#8216;sex&#8217;:&#8217;male&#8217;},<strong>function<\/strong>(err,doc){<\/p>\n<p><strong>throw<\/strong>\u00a0err;<\/p>\n<p>});<\/p>\n<p>$set\uc744 \ube7c\ubc84\ub9ac\uac8c \ub418\uba74\u00a0_id=\u2019terry\u2019\uc778\u00a0document\uc758 \ub0b4\uc6a9\uc744\u00a0{\u2018sex\u2019:\u2019male\u2019}\ub85c \ubc14\uafd4 \ubc84\ub9b0\ub2e4. (\ud544\ub4dc\ub9cc \ucd94\uac00\ud558\ub294\uac8c \uc544\ub2c8\ub2e4.)<\/p>\n<p><strong>4) Search<\/strong><\/p>\n<p>\uc55e\uc5d0\uc11c\ub294\u00a0findOne\ub9cc \ud574\uc11c \ud558\ub098\uc758\u00a0record\ub9cc\u00a0query\u00a0\ud558\ub294 \uc608\uc81c \uc600\ub294\ub370,\u00a0\uc5ec\ub7ec \uac1c\uc758\u00a0record\ub97c \ubc1b\uace0 \uc2f6\uc73c\uba74\u00a0find\u00a0\uba54\uc11c\ub4dc\ub97c \uc0ac\uc6a9\ud574\uc11c \uac80\uc0c9 \uc870\uac74\uc744 \uc8fc\uace0.toArray\ub97c \ud638\ucd9c\ud558\uba74 \uc778\uc790\ub85c \ub118\uc5b4\uac00\ub294\u00a0callback\ud568\uc218\uc758\u00a0docs\u00a0\uc778\uc790\uc5d0 \ucffc\ub9ac \uacb0\uacfc\ub97c \ubc30\uc5f4\ub85c \ub9ac\ud134\ud574\uc900\ub2e4.<\/p>\n<p>db.collection(&#8216;users&#8217;).find({city:&#8217;suji&#8217;}).toArray(<strong>function<\/strong>(err,docs) {<\/p>\n<p><strong>if<\/strong>\u00a0(err)\u00a0<strong>throw<\/strong>\u00a0err;<\/p>\n<p>res.send(docs);<\/p>\n<p><strong>for<\/strong>\u00a0(i = 0; i &lt; docs.length; i++) {<\/p>\n<p>console.log(docs[i].city);<\/p>\n<p>}<\/p>\n<p>});<\/p>\n<p>\uc5ec\uae30\uc11c\ub294 \uc544\uc8fc \uae30\ubcf8\uc801\uc778\u00a0API\ub9cc\uc744 \ub2e4\ub918\uae30 \ub54c\ubb38\uc5d0 \uc790\uc138\ud55c\u00a0API\ub4e4\uc740\u00a0<a href=\"http:\/\/mongodb.github.io\/node-mongodb-native\/api-generated\">http:\/\/mongodb.github.io\/node-mongodb-native\/api-generated<\/a>\u00a0\ub97c \ucc38\uace0\ud558\uae30 \ubc14\ub780\ub2e4.<\/p>\n<p><strong>\ube60\ub974\uac8c \ud6dd\uc5b4\ubcf4\ub294\u00a0node.js<\/strong><\/p>\n<p><strong>#7- mongoose ODM\u00a0\uc744 \uc774\uc6a9\ud55c MongoDB \uc5f0\ub3d9<\/strong><\/p>\n<p>\uc870\ub300\ud611\u00a0(http:\/\/bcho.tistory.com)<\/p>\n<h2>Mongoose ODM\uc744 \uc774\uc6a9\ud55c\u00a0MongoDB\uc758 \uc5f0\ub3d9<\/h2>\n<p>Mongoose\ub294\u00a0MongoDB\u00a0\uae30\ubc18\uc758\u00a0nodejs\uc6a9\u00a0ODM (Object Data Mapping)\u00a0\ud504\ub808\uc784\uc6cd\uc774\ub2e4.\u00a0\uc55e\uc5d0\uc11c\u00a0mongo-native\uc5d0 \ub300\ud574\uc11c \uc54c\uc544\ubd24\ub294\ub370,\u00a0\uadf8\ub807\ub2e4\uba74mongoose\ub294 \ubb34\uc5c7\uc778\uac00?\u00a0\uc27d\uac8c \uc0dd\uac01\ud558\uba74\u00a0mongo-native\ub294\u00a0JDBC\u00a0\ub4dc\ub77c\uc774\ube0c\ub7ec\ub97c \uc774\uc6a9\ud55c \ub370\uc774\ud0c0 \ubca0\uc774\uc2a4 \ud504\ub85c\uadf8\ub798\ubc0d\uc774\uace0, mongoose\ub294 \uc790\ubc14\uc758JPA\/Hibernate\/MyBatis\uc640 \uac19\uc740\u00a0OR Mapper\uc640 \uac19\uc740 \uac1c\ub150\uc774\ub2e4.<\/p>\n<p>\uc989\u00a0mongodb\u00a0\ub0b4\uc758 \ub370\uc774\ud0c0\ub97c\u00a0node.js\ub0b4\uc758 \uac1d\uccb4\ub85c \uc815\uc758\ud574\uc900\ub2e4. ODM\u00a0\uac1c\ub150\uc744 \uc774\uc6a9\ud558\uc5ec, MVC\u00a0\uac1c\ub150\ub4e4\uc744 \uc870\uae08\ub354 \uc27d\uac8c \uad6c\ud604\ud560 \uc218 \uc788\ub3c4\ub85d \ub3c4\uc640 \uc8fc\uba70,\u00a0\ud2b9\ud788\u00a0javascript\uac00 \uac00\uc9c0\uace0 \uc788\ub294 \ud55c\uacc4\uc131\uc911\uc778 \ud558\ub098\uc778 \ubaa8\ud638\uc131\uc744 \ubcf4\uc644\ud574\uc900\ub2e4. mongodb\uc5d0\u00a0json\uc744 \uc800\uc7a5\ud560\ub54c, collection\uc5d0 \ub4e4\uc5b4\uac00\ub294 \ub370\uc774\ud0c0\uc758 \ud615\ud0dc(\uc2a4\ud0a4\ub9c8)\uac00 \uc5c6\uae30 \ub54c\ubb38\uc5d0 \uc790\uc720\ub3c4\uac00 \ub192\uae30\ub294 \ud558\uc9c0\ub9cc \ubc18\ub300\ub85c\u00a0RDBMS\uc5d0\uc11c \uc815\uc758\ub41c \uc2a4\ud0a4\ub9c8 \uac1c\ub150\uc774 \uc5c6\uc774 \ub54c\ubb38\uc5d0 \uc5b4\ub5a4 \uceec\ub7fc\uc774 \uc788\ub294\uc9c0 \ucf54\ub4dc\uc5d0\uc11c\ub85c\ub9cc\uc740 \ud30c\uc545\ud558\uae30\uac00 \uc5b4\ub824\uc6b8 \uc218 \uc788\ub2e4.\u00a0\uc774\ub7f0\uc810\uc744 \ubcf4\uc644\ud558\ub294 \uac1c\ub150\uc774\u00a0mongoose\uc758 \uc2a4\ud0a4\ub9c8\uc758 \uac1c\ub150\uc778\ub370,\u00a0\uc9c1\uc811 \ucf54\ub4dc\ub97c \uc0b4\ud3b4\ubcf4\uc790<\/p>\n<p>\ub2e4\uc74c \uc608\uc81c\ub294\u00a0HTML\uc5d0\uc11c \uc774\ub984\uacfc \uba54\ubaa8\ub97c \ubc1b\uc544\uc11c\u00a0DB\uc5d0 \uc800\uc7a5\ud558\uace0 \uc870\ud68c \ud558\ub294 \uc608\uc81c\uc774\ub2e4.<\/p>\n<p>&lt;!DOCTYPE\u00a0html&gt;<\/p>\n<p>&lt;html&gt;<\/p>\n<p>&lt;head&gt;<\/p>\n<p>&lt;title&gt;&lt;\/title&gt;<\/p>\n<p>&lt;\/head&gt;<\/p>\n<p>&lt;body&gt;<\/p>\n<p>&lt;form\u00a0name=<em>&#8220;memo&#8221;<\/em>\u00a0method=<em>&#8220;post&#8221;<\/em>\u00a0action=<em>&#8220;\/insert&#8221;<\/em>&gt;<\/p>\n<p>name\u00a0&lt;input\u00a0type=<em>&#8220;text&#8221;<\/em>\u00a0name=<em>&#8220;username&#8221;<\/em>\/&gt;<\/p>\n<p>&lt;br&gt;<\/p>\n<p>message\u00a0&lt;input\u00a0type=<em>&#8220;text&#8221;<\/em>\u00a0name=<em>&#8220;memo&#8221;<\/em>\/&gt;<\/p>\n<p>&lt;button\u00a0type=<em>&#8220;submit&#8221;<\/em>\u00a0&gt;Submit&lt;\/button&gt;<\/p>\n<p>&lt;\/form&gt;<\/p>\n<p>&lt;\/body&gt;<\/p>\n<p>&lt;\/html&gt;<\/p>\n<p>\uba3c\uc800 \uc2e4\ud589\uc5d0 \uc55e\uc11c\uc11c\u00a0npm install mongoose\ub97c \uc774\uc6a9\ud574\uc11c\u00a0mongoose\u00a0\ubaa8\ub4c8\uc744 \uc124\uce58\ud574\uc57c \ud55c\ub2e4.<\/p>\n<p>\ub2e4\uc74c\uc740\u00a0express\uc758\u00a0\/app.js\u00a0\ud30c\uc77c\uc774\ub2e4.<\/p>\n<p><strong>var<\/strong>\u00a0express = require(&#8216;express&#8217;);<\/p>\n<p><strong>var<\/strong>\u00a0routes = require(&#8216;.\/routes&#8217;);<\/p>\n<p><strong>var<\/strong>\u00a0user = require(&#8216;.\/routes\/user&#8217;);<\/p>\n<p><strong>var<\/strong>\u00a0http = require(&#8216;http&#8217;);<\/p>\n<p><strong>var<\/strong>\u00a0path = require(&#8216;path&#8217;);<\/p>\n<p>&nbsp;<\/p>\n<p>mongoose\ub97c \uc0ac\uc6a9\ud558\uae30 \uc704\ud574\uc11c \ud574\ub2f9 \ubaa8\ub4c8\uc744\u00a0import\ud55c\ub2e4.<\/p>\n<p><strong>var<\/strong>\u00a0mongoose = require(&#8216;mongoose&#8217;);<\/p>\n<p>&nbsp;<\/p>\n<p>\ub2e4\uc74c\uc73c\ub85c\u00a0Schema\ub97c \uc815\uc758\ud558\ub294\ub370,\u00a0\uc774 \uc2a4\ud0a4\ub9c8\ub294\u00a0username\uacfc\u00a0memo\ub77c\ub294 \ud544\ub4dc\ub97c \uac00\uc9c0\uace0 \uc788\uc73c\uba70 \uac01\uac01\uc758 \ud544\ub4dc\ub294\u00a0String\u00a0\ub370\uc774\ud0c0 \ud0c0\uc785\uc744 \uac16\ub294\ub2e4.<\/p>\n<p><strong>var<\/strong>\u00a0MemoSchema= mongoose.Schema({username:String,memo:String});<\/p>\n<p>\uc774 \uc2a4\ud0a4\ub9c8\ub97c \uc774\uc6a9\ud574\uc11c \uc544\ub798\uc640 \uac19\uc774 \ubaa8\ub378\uc744 \uc815\uc758\ud558\ub294\ub370,\u00a0\uccab\ubc88\uc9f8 \uc778\uc790\ub294 \uc774 \ubaa8\ub378\uc774\u00a0mongodb\uc5d0 \uc800\uc7a5\ub420\u00a0Collection\uc774\ub984(\ud14c\uc774\ube14\uba85)\uc774 \ub418\uace0,\u00a0\ub450\ubc88\uc9f8 \uc778\uc790\ub294 \uc774 \ubaa8\ub378\uc744 \uc815\uc758\ud558\ub294\ub370 \uc0ac\uc6a9\ud560 \uc2a4\ud0a4\ub9c8(\uc55e\uc5d0\uc11c \uc815\uc758\ud55c)\ub97c \uc9c0\uc815\ud55c\ub2e4.<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"615\"><strong>\ucc38\uace0<\/strong>&nbsp;<\/p>\n<p>mongoose\uc5d0\uc11c\ub294 \ub2e4\uc591\ud55c \ub370\uc774\ud0c0 \ud0c0\uc785\uc744 \uc774\uc6a9\ud558\uc5ec \uacc4\uce35\ud654\ub41c \uc2a4\ud0a4\ub9c8\ub97c \uc815\uc758\ud558\ub294 \uac8c \uac00\ub2a5\ud558\ub2e4.\u00a0\uc544\ub798\ub294<a href=\"http:\/\/mongoosejs.com\/docs\/schematypes.html\">http:\/\/mongoosejs.com\/docs\/schematypes.html<\/a>\u00a0\uc5d0 \uc815\uc758\ub41c \uc608\uc81c \uc2a4\ud0a4\ub9c8 \uc911\uc758 \ud558\ub098\uc774\ub2e4.<\/p>\n<p><strong>var<\/strong>\u00a0schema =\u00a0<strong>new<\/strong>\u00a0Schema({<\/p>\n<p>name:\u00a0\u00a0\u00a0 String,<\/p>\n<p>binary:\u00a0 Buffer,<\/p>\n<p>living:\u00a0 Boolean,<\/p>\n<p>updated: { type: Date,\u00a0<strong>default<\/strong>: Date.now }<\/p>\n<p>age:\u00a0\u00a0\u00a0\u00a0 { type: Number, min:\u00a018, max:\u00a065\u00a0}<\/p>\n<p>mixed:\u00a0\u00a0 Schema.Types.Mixed,<\/p>\n<p>_someId: Schema.Types.ObjectId,<\/p>\n<p>array:\u00a0\u00a0\u00a0\u00a0\u00a0 [],<\/p>\n<p>ofString:\u00a0\u00a0 [String],<\/p>\n<p>ofNumber:\u00a0\u00a0 [Number],<\/p>\n<p>ofDates:\u00a0\u00a0\u00a0 [Date],<\/p>\n<p>ofBuffer:\u00a0\u00a0 [Buffer],<\/p>\n<p>ofBoolean:\u00a0 [Boolean],<\/p>\n<p>ofMixed:\u00a0\u00a0\u00a0 [Schema.Types.Mixed],<\/p>\n<p>ofObjectId: [Schema.Types.ObjectId],<\/p>\n<p>nested: {<\/p>\n<p>stuff: { type: String, lowercase:\u00a0true, trim:\u00a0true\u00a0}<\/p>\n<p>}<\/p>\n<p>})<\/p>\n<p>&nbsp;<\/p><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p><strong>var<\/strong>\u00a0Memo = mongoose.model(&#8216;MemoModel&#8217;,MemoSchema);\u00a0\/\/ MemoModel :\u00a0mongodb\u00a0collection name<\/p>\n<p>\ub2e4\uc74c\uc73c\ub85c\u00a0express\ub97c \uc0ac\uc6a9\ud558\uae30 \uc704\ud55c \uae30\ubcf8 \uc124\uc815\uc744 \uc544\ub798\uc640 \uac19\uc774 \ud558\uace0<\/p>\n<p><strong>var<\/strong>\u00a0app = express();<\/p>\n<p>&nbsp;<\/p>\n<p>\/\/ all environments<\/p>\n<p>app.set(&#8216;port&#8217;, process.env.PORT || 3000);<\/p>\n<p>app.set(&#8216;views&#8217;, path.join(__dirname,\u00a0&#8216;views&#8217;));<\/p>\n<p>app.set(&#8216;view engine&#8217;,\u00a0&#8216;ejs&#8217;);<\/p>\n<p>app.use(express.logger(&#8216;dev&#8217;));<\/p>\n<p>app.use(express.json());<\/p>\n<p>app.use(express.urlencoded());<\/p>\n<p>app.use(express.methodOverride());<\/p>\n<p>app.use(app.router);<\/p>\n<p>app.use(express.<strong>static<\/strong>(path.join(__dirname,\u00a0&#8216;public&#8217;)));<\/p>\n<p>&nbsp;<\/p>\n<p>HTTP\/POST\ub85c \ub4e4\uc5b4\uc624\ub294 \uc694\uccad\uc744\u00a0mongodb\uc5d0 \uc800\uc7a5\ud558\ub294 \ub85c\uc9c1\uc744 \uad6c\ud604\ud55c\ub2e4.<\/p>\n<p>&nbsp;<\/p>\n<p>app.post(&#8216;\/insert&#8217;,\u00a0<strong>function<\/strong>(req,res,err){<\/p>\n<p><strong>var<\/strong>\u00a0memo =\u00a0<strong>new<\/strong>\u00a0Memo({username:req.body.username,memo:req.body.memo});<\/p>\n<p>memo.save(<strong>function<\/strong>(err,silence){<\/p>\n<p><strong>if<\/strong>(err){<\/p>\n<p>console.err(err);<\/p>\n<p><strong>throw<\/strong>\u00a0err;<\/p>\n<p>}<\/p>\n<p>res.send(&#8216;success&#8217;);<\/p>\n<p>});<\/p>\n<p>});<\/p>\n<p>Memo\u00a0\ubaa8\ub378 \ud074\ub798\uc2a4\ub97c \uc774\uc6a9\ud574\uc11c\u00a0memo\u00a0\uac1d\uccb4\ub97c \ub9cc\ub4dc\ub294\ub370, username\uc740 \uc55e\uc758\u00a0index.html\uc758 \ud3fc\uc5d0\uc11c \uc785\ub825\ubc1b\uc740\u00a0username\u00a0\uac12\uc744, memo\ub294\u00a0form\uc5d0\uc11c \uc785\ub825\ubc1b\uc740\u00a0memo\u00a0\uac12\uc73c\ub85c\u00a0memo\u00a0\uac1d\uccb4\ub97c \uc0dd\uc131\ud55c\ub2e4.<\/p>\n<p>\uc800\uc7a5\ud558\ub294 \ubc29\ubc95\uc740 \uac04\ub2e8\ud558\ub2e4. memo\uac1d\uccb4\uc758\u00a0save\ub77c\ub294 \uba54\uc11c\ub4dc\ub97c \ud638\ucd9c\ud558\uace0,\u00a0\ube44\ub3d9\uae30\u00a0IO\uc774\uae30 \ub54c\ubb38\uc5d0, callback\u00a0\ud568\uc218\ub97c \ubc14\uc778\ub529 \ud558\uc600\ub2e4. callback\ud568\uc218\uc5d0\uc11c\ub294 \ub370\uc774\ud0c0 \uc800\uc7a5 \ucc98\ub9ac\uac00 \ub05d\ub098\uba74, res.send\ub85c\u00a0success\u00a0\uba54\uc138\uc9c0\ub97c \ucd9c\ub825\ud55c\ub2e4.<\/p>\n<p>\ub2e4\uc74c\uc73c\ub85c\u00a0mongoose\ub97c\u00a0mongodb\uc5d0 \uc5f0\uacb0\ud558\uace0, http server\ub97c \uae30\ub3d9\uc2dc\ucf1c \ubcf4\uc790<\/p>\n<p>mongoose.connect(&#8216;mongodb:\/\/localhost\/terrydb&#8217;,<strong>function<\/strong>(err){<\/p>\n<p><strong>if<\/strong>(err){<\/p>\n<p>console.log(&#8216;mongoose connection error :&#8217;+err);<\/p>\n<p><strong>throw<\/strong>\u00a0err;<\/p>\n<p>}<\/p>\n<p>http.createServer(app).listen(app.get(&#8216;port&#8217;),\u00a0<strong>function<\/strong>(){<\/p>\n<p>console.log(&#8216;Express server listening on port &#8216;\u00a0+ app.get(&#8216;port&#8217;));<\/p>\n<p>});<\/p>\n<p>});<\/p>\n<p>mongoose.connect\ub97c \uc774\uc6a9\ud558\uc5ec\u00a0mongodb\uc5d0 \uc811\uc18d\ud55c\ub2e4.\u00a0\uc774\ub54c,\u00a0\uc811\uc18d\u00a0URL\uc744 \uc368\uc8fc\uba74 \ub41c\ub2e4.\u00a0\uc5ec\uae30\uc11c\ub294\u00a0localhost\uc5d0\u00a0terrydb\ub97c \uc0ac\uc6a9\ud558\ub3c4\ub85d \uc815\uc758\ud558\uc600\ub2e4.\uc5ec\uae30\uc11c \uc9c0\uc815\ud55c \uc635\uc158 \uc774\uc678\uc5d0\ub3c4,\u00a0\ud3ec\ud2b8\u00a0#\ub098, connection pool\u00a0\uc124\uc815\ub4f1 \ub2e4\uc591\ud55c \uc635\uc158\uc744 \uc801\uc6a9\ud560 \uc218 \uc788\ub2e4.\u00a0\uc790\uc138\ud55c \ub0b4\uc6a9\uc740\u00a0mongoose\u00a0\ubb38\uc11c<a href=\"http:\/\/mongoosejs.com\/docs\/connections.html\">http:\/\/mongoosejs.com\/docs\/connections.html<\/a>\u00a0\ub97c \ucc38\uace0\ud558\uae30 \ubc14\ub780\ub2e4.<\/p>\n<p>connect\u00a0\uba54\uc11c\ub4dc\ub294 \ub450\ubc88\uc9f8 \uc778\uc790\ub85c\u00a0callback\u00a0\ud568\uc218\ub97c \ubc1b\ub294\ub370,\u00a0\uc774 \uc608\uc81c\uc5d0\uc11c\ub294\u00a0callback\ud568\uc218\uc5d0\uc11c\u00a0http server\ub97c \uae30\ub3d9\ud558\uc600\ub2e4.\u00a0\uc774\ub294\u00a0mongodb\uac00 \uc5f0\uacb0\ub41c \ub2e4\uc74c\uc5d0 \uc11c\ube44\uc2a4\uac00 \uac00\ub2a5\ud558\uae30 \ub54c\ubb38\uc5d0, mongodb\u00a0\uc5f0\uacb0\ud6c4\uc5d0\u00a0request\ub97c \ubc1b\uae30 \uc704\ud574\uc11c\u00a0callback\uc5d0\uc11c\u00a0http server\ub97c \uae30\ub3d9\ud55c \uac83\uc774\ub2e4.<\/p>\n<p>\uadf8\ub7ec\uba74 \uc2e4\ud589\uc744 \ud558\uace0 \uacb0\uacfc\ub97c \ubcf4\uc790.\u00a0<a href=\"http:\/\/localhost:3000\/\">http:\/\/localhost:3000<\/a>\uc73c\ub85c \uc811\uc18d\ud558\uc5ec \uc704\uc5d0\uc11c \ub098\ud0c0\ub09c\u00a0index.html\u00a0\ud3fc\uc5d0 \ub370\uc774\ud0c0\ub97c \ub123\uace0, robomongo\ub97c \uc774\uc6a9\ud574\uc11c \uadf8 \uacb0\uacfc\ub97c \uc0b4\ud3b4\ubcf4\uba74 \uc544\ub798\uc640 \uac19\uc774 \uac12\uc774 \ub4e4\uc5b4\uac04 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub2e4.<\/p>\n<p>\uc790\uc544, mongoose\ub97c \uc774\uc6a9\ud574\uc11c \ub370\uc774\ud0c0\ub97c \uc800\uc7a5\ud558\uc600\ub2e4.\u00a0\uadf8\ub7ec\uba74 \ucd94\uac00\ub85c \ub370\uc774\ud0c0\ub97c \uc870\ud68c\ud558\ub294 \uae30\ub2a5\uc744 \uad6c\ud604\ud574 \ubcf4\uc790<\/p>\n<p>\ub2e4\uc74c\uc740\u00a0<a href=\"http:\/\/localhost:3000\/users\/%7busername%7d\">http:\/\/localhost:3000\/users\/{username}<\/a>\uc774 \ub4e4\uc5b4\uc624\uba74\u00a0{username}\uac12\uc758 \ub370\uc774\ud0c0\ub97c \uc870\ud68c\ud574\uc8fc\ub294 \ud568\uc218\uc774\ub2e4.<\/p>\n<p>app.get(&#8216;\/users\/:username&#8217;,\u00a0<strong>function<\/strong>(req,res,err){<\/p>\n<p><strong>var<\/strong>\u00a0memos\u00a0=\u00a0<strong>new<\/strong>\u00a0Memo();<\/p>\n<p>Memo.findOne({&#8216;username&#8217;:req.params.username},<strong>function<\/strong>(err,memo){<\/p>\n<p><strong>if<\/strong>(err){<\/p>\n<p>console.err(err);<\/p>\n<p><strong>throw<\/strong>\u00a0err;<\/p>\n<p>}<\/p>\n<p>console.log(memo);<\/p>\n<p>res.send(200,memo);<\/p>\n<p>});<\/p>\n<p>});<\/p>\n<p>app.get(&#8216;\/users\/:username&#8217;\u00a0\uc5d0\uc11c\u00a0:username\u00a0\uc744 \uc774\uc6a9\ud558\uc5ec\u00a0URL Parameter\ub85c\u00a0username\uc744 \ubc1b\uace0<\/p>\n<p>Memo\u00a0\ubaa8\ub378\uc758\u00a0findOne\uc774\ub77c\ub294 \uba54\uc11c\ub4dc\ub97c \uc774\uc6a9\ud574\uc11c \ub370\uc774\ud0c0\ub97c \uac00\uc838\uc654\ub2e4., findOne\uc740\u00a0query\u00a0\uc870\uac74\uc5d0 \ubd80\ud569\ud558\ub294 \ub370\uc774\ud0c0\uc911\uc5d0 \ud558\ub098\ub9cc \ub9ac\ud134\ud558\ub294 \ud568\uc218\uc774\ub2e4.\u00a0\uccab\ubc88\uc9f8 \uc778\uc790\uac00 \uac80\uc0c9 \uc870\uac74\uc778\ub370 \uc5ec\uae30\uc11c\ub294 \ub370\uc774\ud0c0\ubca0\uc774\uc2a4\uc5d0\uc11c \ud544\ub4dc\uac00\u00a0username\uc778 \ud544\ub4dc\uc758 \uac12\uc774 \uc55e\uc5d0\u00a0URL\uc5d0\uc11c \ubc1b\uc740\u00a0username\uacfc \uc77c\uce58\ud558\ub294 \ub808\ucf54\ub4dc\ub97c \ubc1b\ub3c4\ub85d \ud558\uc600\ub2e4.<\/p>\n<p>\ub450 \ubc88\uc9f8 \uc778\uc790\ub294 \ub370\uc774\ud0c0\uac00 \ub9ac\ud134\ub418\uc5c8\uc744\ub54c \uc218\ud589\ub418\ub294\u00a0callback\ud568\uc218 \uc778\ub370,\u00a0\uc774\u00a0callback\u00a0\ud568\uc218 \ub450\ubc88\uc9f8 \uc778\uc790\uc778\u00a0memo\uc5d0 \ub9ac\ud134\ub418\ub294 \ub370\uc774\ud0c0\uac00 \uc800\uc7a5\ub41c\ub2e4. memo\uac1d\uccb4\ub85c\ub294\u00a0JSON\u00a0\ub370\uc774\ud0c0\uac00 \ub9ac\ud134\ub418\uace0,\u00a0\uc774\u00a0JSON\uc744\u00a0res.send(200,memo);\u00a0\uc744 \uc774\uc6a9\ud558\uc5ec,\u00a0\ub9ac\ud134\ud558\uc600\ub2e4.\u00a0\uc774 \ucf54\ub4dc\ub97c \ucd94\uac00\ud55c \ud6c4\uc5d0,\u00a0\uc2e4\ud589\ud574\ubcf4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uacb0\uacfc\ub97c \uc5bb\uc744 \uc218 \uc788\ub2e4.<\/p>\n<p>\uc774\ubc88\uc5d0\ub294\u00a0memomodels\u00a0\uc804\uccb4 \ud14c\uc774\ube14\uc744 \ucffc\ub9ac \ud574\ubcf4\uc790\u00a0(select * from memomodels)<\/p>\n<p>app.get(&#8216;\/users&#8217;,\u00a0<strong>function<\/strong>(req,res,err){<\/p>\n<p><strong>var<\/strong>\u00a0memos\u00a0=\u00a0<strong>new<\/strong>\u00a0Memo();<\/p>\n<p>Memo.find().select(&#8216;username&#8217;).exec(<strong>function<\/strong>(err,memos){<\/p>\n<p><strong>if<\/strong>(err){<\/p>\n<p>console.err(err);<\/p>\n<p><strong>throw<\/strong>\u00a0err;<\/p>\n<p>}<\/p>\n<p>console.log(memos);<\/p>\n<p>res.send(memos);<\/p>\n<p>});<\/p>\n<p>});<\/p>\n<p>Memo.find()\ub97c \ud558\uba74\ub418\ub294\ub370,\u00a0\uc608\uc81c\uc5d0\uc11c\u00a0.select(\u2018username\u2019)\uc744 \ucd94\uac00\ud558\uc600\ub2e4.\u00a0\uc774 \uba54\uc11c\ub4dc\ub294\u00a0select username from memomodels\u00a0\ub77c\uace0 \uc0dd\uac01\ud558\uba74 \ub41c\ub2e4.\uc989 \ucffc\ub9ac\ud574\uc628 \uac12\uc911\uc5d0\uc11c \ud2b9\uc815 \ud544\ub4dc\uac12\ub9cc\uc744 \ub9ac\ud134\ud558\ub3c4\ub85d \ud558\ub294 \uac83\uc774\ub2e4.<\/p>\n<p>\uc774 \ud568\uc218\ub97c \ucd94\uac00\ud574\uc11c \uc2e4\ud589\ud574\ubcf4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uacb0\uacfc\ub97c \uc5bb\uc744 \uc218 \uc788\ub2e4.<\/p>\n<p>&nbsp;<\/p>\n<p>\uc544\ub798\ub294\u00a0<a href=\"http:\/\/mongoosejs.com\/docs\/queries.html\">http:\/\/mongoosejs.com\/docs\/queries.html<\/a>\u00a0\uc5d0\uc11c \ucc38\uace0\ud55c \uc0d8\ud50c\uc778\ub370, where\ubb38\uc744 \uc774\uc6a9\ud55c \uac80\uc0c9 \uc870\uac74 \uc9c0\uc815\uc5d0\uc11c \ubd80\ud130, select\ud574 \uc624\ub294 \uac1c\uc218, Sorting order\uc640,\u00a0\ud2b9\uc815 \ud544\ub4dc\ub9cc \uac00\uc9c0\uace0 \uc624\ub294 \ub4f1\uc758 \ub2e4\uc591\ud55c \ucffc\ub9ac \uc870\uac74\uc744 \uc9c0\uc815\ud55c \uc608\uc81c\uc774\ub2e4.<\/p>\n<p>Person<\/p>\n<p>.find({ occupation:\u00a0\/host\/\u00a0})<\/p>\n<p>.where(&#8216;name.last&#8217;).equals(&#8216;Ghost&#8217;)<\/p>\n<p>.where(&#8216;age&#8217;).gt(17).lt(66)<\/p>\n<p>.where(&#8216;likes&#8217;).<strong>in<\/strong>([&#8216;vaporizing&#8217;,\u00a0&#8216;talking&#8217;])<\/p>\n<p>.limit(10)<\/p>\n<p>.sort(&#8216;-occupation&#8217;)<\/p>\n<p>.select(&#8216;name occupation&#8217;)<\/p>\n<p>.exec(callback);<\/p>\n<p>&nbsp;<\/p>\n<p>\uc774\uc678\uc5d0\ub3c4 \ub2e4\uc591\ud55c \ucffc\ub9ac \uc870\uac74\uc744 \uc9c0\uc815\ud560 \uc218 \uc788\uc73c\ub2c8 \uc790\uc138\ud55c \ub0b4\uc6a9\uc740\u00a0<a href=\"http:\/\/mongoosejs.com\/docs\/queries.html\">http:\/\/mongoosejs.com\/docs\/queries.html<\/a>\u00a0\ub97c \ucc38\uace0\ud558\uae30 \ubc14\ub780\ub2e4.<\/p>\n<p>&nbsp;<\/p>\n<h3>\ub370\uc774\ud0c0\u00a0validation\u00a0\ud558\uae30<\/h3>\n<p>mongoose\uc758 \uc720\uc6a9\ud55c \uae30\ub2a5\uc911\uc758 \ub2e4\ub978 \ud558\ub098\uac00\u00a0Schema\uc5d0 \ub300\ud55c\u00a0validation\uc774\ub2e4. Schema\ub97c \uc815\uc758\ud560 \ub54c,\u00a0\ub370\uc774\ud0c0 \ud0c0\uc785\uc774\ub098 \uae30\ud0c0 \uaddc\uce59\uc744 \uc815\ud574\ub193\uace0,\u00a0\uc774 \uaddc\uce59\uc744 \ubc97\uc5b4\ub098\uba74 \uc5d0\ub7ec \ucc98\ub9ac\ub97c \ud574\uc8fc\uac8c \ud558\ub294 \uac83\uc778\ub370,\u00a0\uc6f9 \uac1c\ubc1c\ub4f1\uc5d0\uc11c\ub294 \uc6cc\ub099 \uc77c\ubc18\uc801\uc778 \ub0b4\uc6a9\uc774\ub2c8 \uad6c\uccb4\uc801\uc778 \uac1c\ub150 \uc124\uba85\uc740 \uc0dd\ub7b5\ud558\uaca0\ub2e4.<\/p>\n<p>Validator\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc740 \uc55e\uc5d0 \uad6c\ud604\ud55c \ucf54\ub4dc \ubd80\ubd84\uc5d0\uc11c\u00a0Schema\ub97c \uc815\uc758 \ud55c \ubd80\ubd84\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \ubcc0\uacbd \ud55c\ub2e4.<\/p>\n<p>\/\/ define\u00a0validator<\/p>\n<p><strong>function<\/strong>\u00a0NameAlphabeticValidator(val){<\/p>\n<p><strong>return<\/strong>\u00a0val.match(&#8220;^[a-zA-Z()]+$&#8221;);<\/p>\n<p>}<\/p>\n<p><strong>function<\/strong>\u00a0MemoLengthValidator(val){<\/p>\n<p><strong>if<\/strong>(val.length&gt;10)\u00a0<strong>return<\/strong>\u00a0<strong>null<\/strong>;<\/p>\n<p><strong>return<\/strong>\u00a0val;<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>\/\/ schema definition with validation<\/p>\n<p><strong>var<\/strong>\u00a0MemoSchema= mongoose.Schema({<\/p>\n<p>username:{type:String,validate:NameAlphabeticValidator}<\/p>\n<p>,memo:{type:String,validate:[<\/p>\n<p>{validator:MemoLengthValidator,msg:&#8217;memo length should be less than 10&#8242;},<\/p>\n<p>{validator:NameAlphabeticValidator,msg:&#8217;PATH `{PATH}` should be alphabet only. Current value is `{VALUE}` &#8216;}<\/p>\n<p>]}<\/p>\n<p>});<\/p>\n<p><strong>var<\/strong>\u00a0Memo = mongoose.model(&#8216;MemoModel&#8217;,MemoSchema);\u00a0\/\/ MemoModel :\u00a0mongodb\u00a0collection name<\/p>\n<p>&nbsp;<\/p>\n<p>\uba3c\uc800\u00a0validation rule\uc744 \uc815\uc758\ud574\uc57c \ud558\ub294\ub370, validation rule\uc744 \ud568\uc218\ub85c \uad6c\ud604\ud558\uba74 \ub41c\ub2e4.<\/p>\n<p>\uc774\ub97c\u00a0validator\ub77c\uace0 \ud558\ub294\ub370, NameAlphabeticValidator\ub294 \ub4e4\uc5b4\uc624\ub294 \uc778\uc790\uac00 \uc601\ubb38\uc77c \uacbd\uc6b0\uc5d0\ub9cc\u00a0PASS\ud558\uace0,\u00a0\uc22b\uc790\ub098 \ud2b9\uc218 \ubb38\uc790\uac00 \ub4e4\uc5b4\uc624\uba74 \uc624\ub958 \ucc98\ub9ac\ub97c \ud55c\ub2e4.\u00a0\ub2e4\uc74c\uc73c\ub85c \uc815\uc758\ud55c\u00a0MemoLengthValidator\uc758 \uacbd\uc6b0\uc5d0\ub294 \ubb38\uc790\uc5f4\uc758 \uae38\uc774\uac00\u00a010\uc790 \uc774\uc0c1\uc778 \uacbd\uc6b0\uc5d0 \uc5d0\ub7ec \ucc98\ub9ac\ub97c \ud55c\ub2e4.<\/p>\n<p>\uc774\ub807\uac8c \uc815\uc758\ud55c\u00a0validator\ub97c \uc2a4\ud0a4\ub9c8 \uc815\uc758\uc2dc \uac01 \ub370\uc774\ud0c0 \ud544\ub4dc\uc5d0 \uc9c0\uc815\ud558\uba74 \ub41c\ub2e4. username\uc5d0\ub294 \uc704\uc640 \uac19\uc774\u00a0validator\ub97c\u00a0NameAlphabeticValidator\ub97c \uc801\uc6a9\ud558\uc600\ub2e4.<\/p>\n<p>\ub2e4\uc74c\uc73c\ub85c\u00a0memo\uc5d0\ub294 \ub3d9\uc2dc\uc5d0\u00a0NameAlphabeticValidator\u00a0\uc640\u00a0MemoLengthValidator\u00a0\ub450 \uac1c\ub97c \ub3d9\uc2dc\uc5d0 \uc801\uc6a9\ud558\uc600\ub294\ub370,\u00a0\uc801\uc6a9\ud560\ub54c\u00a0msg\u00a0\uc778\uc790\ub85cvalidation\uc774 \uc2e4\ud328\ud588\uc744 \ub54c \ub9ac\ud134\ud574\uc8fc\ub294 \uba54\uc138\uc9c0\ub3c4 \ud568\uaed8 \uc9c0\uc815\ud558\uc600\ub2e4.<\/p>\n<p>\uc774 \uba54\uc138\uc9c0 \ubd80\ubd84\uc5d0\uc11c\u00a0NameAlphabeticValidator\u00a0\uc5d0\uc11c \ubc1c\uc0dd\ud558\ub294 \uc5d0\ub7ec \uba54\uc138\uc9c0\ub97c \uc8fc\uc758 \uae4a\uac8c \ubcf4\uba74\u00a0{PATH}\uc640\u00a0{VALUE}\u00a0\uac00 \uc0ac\uc6a9\ub41c \uac83\uc744 \ubcfc \uc218 \uc788\ub294\ub370, {PATH}\ub294 \uc774 \uc5d0\ub7ec\uac00 \ubc1c\uc0dd\ud558\ub294\u00a0JSON\u00a0\ud544\ub4dc\uba85\uc744 \uadf8\ub9ac\uace0\u00a0{VALUE}\ub294 \uc2e4\uc81c\ub85c \uc785\ub825\ub41c \uac12\uc744 \ucd9c\ub825\ud55c\ub2e4.\u00a0\ud14c\uc2a4\ud2b8\ub97c \ud574\ubcf4\uba74<\/p>\n<p>message\ubd80\ubd84\uc5d0 \ud2b9\uc218\ubb38\uc790\uc640 \uc22b\uc790\ub97c \ub123\uc5c8\ub2e4.\u00a0\uc2e4\ud589 \uacb0\uacfc\ub294 \uc544\ub798\uc640 \uac19\uc774 \uc5d0\ub7ec \uba54\uc138\uc9c0\ub4e4\uc774\u00a0console\ub85c \ucd9c\ub825\ub418\ub294\ub370,\u00a0\uc544\ub798\uc11c \ubcf4\ub294 \ubc14\uc640 \uac19\uc774\u00a0message\u00a0\ubd80\ubd84\uc5d0\u00a0{PATH}\uc640\u00a0{VALUE}\uac00 \uac01\uac01\u00a0memo\uc640\u00a0Memo-1\u00a0\uac12\uc73c\ub85c \ub300\uccb4 \ub41c\uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub2e4<\/p>\n<p>&nbsp;<\/p>\n<h3>mongoose\ub294 \uc5b4\ub514\uc5d0 \uc4f0\ub294\uac8c \uc88b\uc744\uae4c?<\/h3>\n<p>mongo native\uac00 \uc788\uace0, mongoose\uac00 \uc788\ub294\ub370,\u00a0\uadf8\ub7ec\uba74 \uac01\uac01\uc744 \uc5b4\ub514\uc5d0 \uc4f0\ub290\ub0d0?\u00a0\uc774 \uc9c8\ubb38\uc740\u00a0JDBC\uc640\u00a0JPA\ub97c \uc5b8\uc81c \uc4f0\ub290\ub0d0?\u00a0\uc640 \uac19\uc740 \uc9c8\ubb38\uacfc \uac19\uc9c0 \uc54a\uc744\uae4c \uc2f6\ub2e4.<\/p>\n<p>mongoose\ub97c\ub9cc\ub4e0 \ucee4\ubbf8\ud130\uc5d0 \ub530\ub974\uba74\u00a0mongodb-native\ubaa8\ub4c8\uc774\u00a0mongoose\ubcf4\ub2e4 \ube60\ub974\ub2e4\uace0 \ud55c\ub2e4.\u00a0\uc989 \uc870\uae08 \ub354 \uc720\uc5f0\ud55c\u00a0mongodb\uc5d0 \ub300\ud55c\u00a0access\uac00 \ud544\uc694\ud558\uace0 \ub192\uc740 \uc131\ub2a5\uc744 \uc694\uad6c\ud560 \uacbd\uc6b0\uc5d0\ub294\u00a0mongodb-native\ub97c \uc0ac\uc6a9\ud558\uace0,\u00a0\uc815\ud615\ud654 \ub418\uace0 \uc2a4\ud0a4\ub9c8 \uc815\uc758\ub97c \ud1b5\ud55c \uba85\uc2dc\uc131 \ud655\ubcf4\uac00 \ud544\uc694\ud558\uba70\u00a0validation\ub4f1\uc744 \ud6a8\uc728\uc801\uc73c\ub85c \ud558\uace0\uc790 \ud560\ub54c\u00a0mongoose\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4.\u00a0\uc2e4\uc81c \ud504\ub85c\uadf8\ub7a8\uc5d0\uc11c\ub294 \uc704\uc758 \uc6a9\ub3c4\uc5d0 \ub9de\uac8c \ub450 \ud504\ub808\uc784\uc6cd\uc744 \uc11e\uc5b4 \uc4f0\ub294 \uac83\uc774 \uc88b\ub2e4.<\/p>\n<p><strong>\ube60\ub974\uac8c \ud6dd\uc5b4\ubcf4\ub294\u00a0node.js<\/strong><\/p>\n<p><strong>#8 &#8211; MySQL \uc5f0\ub3d9<\/strong><\/p>\n<p>\uc870\ub300\ud611\u00a0(http:\/\/bcho.tistory.com)<\/p>\n<p>NoSQL\uc774 \uadfc\ub798\uc5d0 \uc720\ud589\uc774\uae30\ub294 \ud558\uc9c0\ub9cc,\u00a0\ub370\uc774\ud130\uac04\uc758 \uad00\uacc4\ub97c \ud45c\ud604\ud558\uace0,\u00a0\ud2b8\ub80c\uc81d\uc158\uc5d0 \uc77c\uad00\uc131\uc744 \ubcf4\uc7a5\ud558\ub294\u00a0RDBMS\ub294 \uc544\uc9c1\uae4c\uc9c0\ub294 \uc11c\ubc84\ucabd\uc5d0\uc11c\ub294 \ud544\uc218\uc801\uc774\ub2e4. node.js\ub294 \ub300\ud45c\uc801\uc778 \uc624\ud508\uc18c\uc2a4\u00a0RDBMS\uc778\u00a0MySQL\uc740 \uc9c0\uc6d0\ud55c\ub2e4.\u00a0\uba87\uac00\uc9c0\u00a0MySQL\uc5f0\ub3d9 \ubaa8\ub4c8\uc774 \uc788\uae30\ub294 \ud558\uc9c0\ub9cc,\u00a0\uc5ec\uae30\uc11c\ub294 \uac00\uc7a5 \ub9ce\uc774 \uc0ac\uc6a9\ub418\ub294\u00a0node-mysql\u00a0\ubaa8\ub4c8\uc5d0 \ub300\ud574\uc11c \uc18c\uac1c\ud558\uace0\uc790 \ud55c\ub2e4.<\/p>\n<p>node-mysql\uc740 \uc624\ud508\uc18c\uc2a4\ub85c\u00a0<a href=\"https:\/\/github.com\/felixge\/node-mysql\">https:\/\/github.com\/felixge\/node-mysql<\/a>\u00a0\uc5d0 \ucf54\ub4dc\uac00 \uacf5\uac1c\ub418\uc5b4 \uc788\ub2e4.<\/p>\n<p>mysql\u00a0\ubaa8\ub4c8\uc744 \uc0ac\uc6a9\ud558\ub824\uba74\u00a0npm install mysql\u00a0\uba85\ub839\uc744 \uc774\uc6a9\ud558\uc5ec, node-mysql\u00a0\ubaa8\ub4c8\uc744 \uc124\uce58\ud558\uc790.<\/p>\n<p>mysql\uc5d0 \ub300\ud55c \uc124\uce58\uc640 \uc0ac\uc6a9\ubc95\uc5d0 \ub300\ud574\uc11c\ub294 \uc6cc\ub099 \ubb38\uc11c\ub4e4\uc774 \ub9ce\uc73c\ub2c8 \uc0dd\ub7b5\ud558\uae30\ub85c \ud55c\ub2e4.<\/p>\n<h3>mysql\u00a0\uc5f0\uacb0<\/h3>\n<p>\uac04\ub2e8\ud55c \uc608\uc81c \uc791\uc131\uc744 \uc704\ud574\uc11c\u00a0express\ub85c \ud504\ub85c\uc81d\ud2b8\ub97c \uc0dd\uc131\ud55c\ud6c4\uc5d0,mysql\uc744 \uc5b4\ub5bb\uac8c \uc5f0\uacb0\ud558\ub294\uc9c0 \uc0b4\ud3b4\ubcf4\ub3c4\ub85d \ud558\uc790.<\/p>\n<p><strong>var<\/strong>\u00a0express = require(&#8216;express&#8217;);<\/p>\n<p><strong>var<\/strong>\u00a0routes = require(&#8216;.\/routes&#8217;);<\/p>\n<p><strong>var<\/strong>\u00a0user = require(&#8216;.\/routes\/user&#8217;);<\/p>\n<p><strong>var<\/strong>\u00a0http = require(&#8216;http&#8217;);<\/p>\n<p><strong>var<\/strong>\u00a0path = require(&#8216;path&#8217;);<\/p>\n<p>\uba3c\uc800\u00a0\uc544\ub798\uc640\u00a0\uac19\uc774\u00a0mysql\u00a0\ubaa8\ub4c8\uc744\u00a0\ub85c\ub529\ud55c\ub2e4.<\/p>\n<p><strong>var<\/strong>\u00a0mysql = require(&#8216;mysql&#8217;);<\/p>\n<p>\ub2e4\uc74c \ub85c\ub529\ub41c \ubaa8\ub4c8\ub85c\ubd80\ud130\u00a0Connection\u00a0\uac1d\uccb4\ub97c \uc0dd\uc131\ud55c\ub2e4.\u00a0\uc774 \ub54c \uc2e4\uc81c\uc801\uc778\u00a0Connection\u00a0\uc5f0\uacb0\uc740 \uc774\ub8e8\uc5b4\uc9c0\uc9c0 \uc54a\ub294\ub2e4.<\/p>\n<p><strong>var<\/strong>\u00a0connection = mysql.createConnection({<\/p>\n<p>host\u00a0\u00a0\u00a0 :&#8217;localhost&#8217;,<\/p>\n<p>port : 3306,<\/p>\n<p>user :\u00a0&#8216;terry&#8217;,<\/p>\n<p>password :\u00a0&#8216;asdf1234&#8242;,<\/p>\n<p>database:&#8217;terry&#8217;<\/p>\n<p>});<\/p>\n<p>\uc774\ub807\uac8c \uba85\uc2dc\uc801\uc73c\ub85c\u00a0connect\u00a0\uba54\uc11c\ub4dc\ub97c \uc774\uc6a9\ud574\uc11c\u00a0connection\uc744 \uc5f0\uacb0\ud558\uac70\ub098 \ub610\ub294 \uccab\ubc88\uc9f8\u00a0Query\uac00 \uc2e4\ud589\ub420 \ub54c,\u00a0\uc704\uc758\u00a0connection\u00a0\uac1d\uccb4\uc758 \uc815\ubcf4\ub97c \uc774\uc6a9\ud574\uc11c\u00a0connection\uc774 \uc0dd\uc131\ub41c\ub2e4.<\/p>\n<p>connection.connect(<strong>function<\/strong>(err) {<\/p>\n<p><strong>if<\/strong>\u00a0(err) {<\/p>\n<p>console.error(&#8216;mysql connection error&#8217;);<\/p>\n<p>console.error(err);<\/p>\n<p><strong>throw<\/strong>\u00a0err;<\/p>\n<p>}<\/p>\n<p>});<\/p>\n<p>&nbsp;<\/p>\n<p>\ub2e4\uc74c\uc73c\ub85c, express\ub97c\u00a0\uc704\ud55c\u00a0\ud658\uacbd\uc744\u00a0\ubcc0\uc218\ub4e4\uc744\u00a0\uc124\uc815\ud55c\ud6c4\u00a0\uc5d0<\/p>\n<p><strong>var<\/strong>\u00a0app = express();<\/p>\n<p>\/\/ all environments<\/p>\n<p>app.set(&#8216;port&#8217;, process.env.PORT || 3000);<\/p>\n<p>app.set(&#8216;views&#8217;, path.join(__dirname,\u00a0&#8216;views&#8217;));<\/p>\n<p>app.set(&#8216;view engine&#8217;,\u00a0&#8216;ejs&#8217;);<\/p>\n<p>app.use(express.favicon());<\/p>\n<p>app.use(express.logger(&#8216;dev&#8217;));<\/p>\n<p>app.use(express.json());<\/p>\n<p>app.use(express.urlencoded());<\/p>\n<p>app.use(express.methodOverride());<\/p>\n<p>app.use(express.cookieParser(&#8216;your secret here&#8217;));<\/p>\n<p>app.use(express.session());<\/p>\n<p>app.use(app.router);<\/p>\n<p>app.use(express.<strong>static<\/strong>(path.join(__dirname,\u00a0&#8216;public&#8217;)));<\/p>\n<p>&nbsp;<\/p>\n<h3>Query\u00a0\uc218\ud589<\/h3>\n<p>\uba3c\uc800\u00a0insert\u00a0\uae30\ub2a5\uc744 \uad6c\ud604\ud574\ubcf4\uc790.\u00a0\uba3c\uc800\u00a0mysql\uc5d0 \uc811\uc18d\ud558\uc5ec,\u00a0\ub2e4\uc74c\u00a0SQL\ubb38\uc744 \uc774\uc6a9\ud574\uc11c\u00a0userid,name,address\u00a0\uceec\ub7fc\uc744 \uac16\ub294 \ud14c\uc774\ube14\uc744 \uc0dd\uc131\ud558\uc790<\/p>\n<p><strong>CREATE<\/strong>\u00a0\u00a0<strong>TABLE<\/strong>\u00a0`terry`.`users` (<\/p>\n<p>`userid`\u00a0<strong>VARCHAR<\/strong>(45)\u00a0<strong>NOT<\/strong>\u00a0<strong>NULL<\/strong>\u00a0,<\/p>\n<p>`name`\u00a0<strong>VARCHAR<\/strong>(45)\u00a0<strong>NULL<\/strong>\u00a0,<\/p>\n<p>`address`\u00a0<strong>VARCHAR<\/strong>(45)\u00a0<strong>NULL<\/strong>\u00a0,<\/p>\n<p><strong>PRIMARY<\/strong>\u00a0<strong>KEY<\/strong>\u00a0(`userid`) );<\/p>\n<p>\uadf8\ub9ac\uace0\u00a0Table\uc5d0\u00a0insert\ud560 \uac12\uc744 \ubc1b\uc744\u00a0HTML\u00a0\ud30c\uc77c\uc744 \ub9cc\ub4e4\uc790<\/p>\n<p>\ub2e4\uc74c\uc740 \uc704\uc758 \ud654\uba74\uc744 \ud45c\ud604\ud558\ub294\u00a0index.html<\/p>\n<p>&lt;html&gt;<\/p>\n<p>&lt;head&gt;<\/p>\n<p>&lt;title&gt;&lt;\/title&gt;<\/p>\n<p>&lt;\/head&gt;<\/p>\n<p>&lt;body&gt;<\/p>\n<p>&lt;form\u00a0name=<em>&#8220;user&#8221;<\/em>\u00a0method=<em>&#8220;post&#8221;<\/em>\u00a0action=<em>&#8220;\/users&#8221;<\/em>&gt;<\/p>\n<p>&lt;b&gt;Add Users&lt;\/b&gt;&lt;p&gt;<\/p>\n<p>id\u00a0&lt;input\u00a0type=<em>&#8220;text&#8221;<\/em>\u00a0name=<em>&#8220;userid&#8221;<\/em>\/&gt;<\/p>\n<p>&lt;br&gt;<\/p>\n<p>name\u00a0&lt;input\u00a0type=<em>&#8220;text&#8221;<\/em>\u00a0name=<em>&#8220;name&#8221;<\/em>\/&gt;<\/p>\n<p>&lt;br&gt;<\/p>\n<p>address\u00a0&lt;input\u00a0type=<em>&#8220;text&#8221;<\/em>\u00a0name=<em>&#8220;address&#8221;<\/em>\/&gt;<\/p>\n<p>&lt;br&gt;<\/p>\n<p>&lt;button\u00a0type=<em>&#8220;submit&#8221;<\/em>\u00a0&gt;Submit&lt;\/button&gt;<\/p>\n<p>&lt;\/form&gt;<\/p>\n<p>&lt;\/body&gt;<\/p>\n<p>&lt;\/html&gt;<\/p>\n<p>HTTP\/POST\ub85c \uac12\uc744 \ubc1b\uc544\uc11c\u00a0index.html\uc5d0\uc11c \uc785\ub825\ub41c\u00a0form field\ub85c \uc785\ub825\ud558\ub294 \ucf54\ub4dc\ub97c \uad6c\ud604\ud558\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4.\u00a0\uac04\ub2e8\ud558\uac8c\u00a0connection.query\uc5d0\uc11c\u00a0sql\u00a0\ubb38\uc7a5\uc744 \uc218\ud589\ud558\uace0,\u00a0\uacb0\uacfc\ub97c\u00a0callback\uc73c\ub85c \ubc1b\uc73c\uba74 \ub41c\ub2e4.\u00a0\uc778\uc790\uac00 \uc788\uc744 \uacbd\uc6b0\uc5d0\ub294\u00a0{\ud0a4:\uac12} pair\ub85c \ub9cc\ub4e4\uc5b4\uc11c\u00a0query\uc758 \ub450\ubc88\uc9f8 \uc778\uc790\ub85c \ub118\uae30\uba74 \ub41c\ub2e4.\u00a0\uc544\ub798\ub294insert into users (userid,name,address) values(\ud3fc\uc5d0\uc11c \uc77d\uc5b4\uc628\u00a0userid,\ud3fc\uc5d0\uc11c \uc77d\uc5b4\uc628\u00a0name,\ud3fc\uc5d0\uc11c \uc77d\uc5b4\uc628\u00a0name)\uc73c\ub85c\u00a0SQL\uc744 \uc0dd\uc131\ud574\uc11c \uc2e4\ud589\ud574\uc8fc\ub294 \ubb38\uc7a5\uc774\ub2e4.\u00a0\ub2f9\uc5f0\ud788 \ube44\ub3d9\uae30 \ud638\ucd9c\uc774\uae30 \ub54c\ubb38\uc5d0, response\ub294\u00a0callback\u00a0\ud568\uc218\uc5d0\uc11c\u00a0res.send(200,xx)\uc73c\ub85c \ubcf4\ub0c8\ub2e4.<\/p>\n<p>\/\/ insert<\/p>\n<p>app.post(&#8216;\/users&#8217;,<strong>function<\/strong>(req,res){<\/p>\n<p><strong>var<\/strong>\u00a0user = {&#8216;userid&#8217;:req.body.userid,<\/p>\n<p>&#8216;name&#8217;:req.body.name,<\/p>\n<p>&#8216;address&#8217;:req.body.address};<\/p>\n<p><strong>var<\/strong>\u00a0query = connection.query(&#8216;insert into users set ?&#8217;,user,<strong>function<\/strong>(err,result){<\/p>\n<p><strong>if<\/strong>\u00a0(err) {<\/p>\n<p>console.error(err);<\/p>\n<p><strong>throw<\/strong>\u00a0err;<\/p>\n<p>}<\/p>\n<p>console.log(query);<\/p>\n<p>res.send(200,&#8217;success&#8217;);<\/p>\n<p>});<\/p>\n<p>});<\/p>\n<p>\ub2e4\uc74c\uc73c\ub85c\u00a0select\ub97c \uad6c\ud604\ud574\ubcf4\uba74 \uc544\ub798\uc640 \uac19\uc774 \uad6c\ud604\uc774 \ub41c\ub2e4.\u00a0\ub9ac\ud134\uac12\uc740\u00a0callback\uc758 \ub450\ubc88\uc9f8 \uc778\uc790\ub85c \uc804\ub2ec\ub418\ub294\ub370, res.json\uc744 \uc774\uc6a9\ud558\uba74 \uac04\ub2e8\ud558\uac8c\u00a0json\ud615\ud0dc\ub85c \ubcc0\ud658\ud558\uc5ec \ub9ac\ud134\ud560 \uc218 \uc788\ub2e4.<\/p>\n<p>\/\/select all<\/p>\n<p>app.get(&#8216;\/users&#8217;,\u00a0<strong>function<\/strong>(req,res){<\/p>\n<p><strong>var<\/strong>\u00a0query = connection.query(&#8216;select * from users&#8217;,<strong>function<\/strong>(err,rows){<\/p>\n<p>console.log(rows);<\/p>\n<p>res.json(rows);<\/p>\n<p>});<\/p>\n<p>console.log(query);<\/p>\n<p>});<\/p>\n<p>\uc704\uc5d0\uc11c \uad6c\ud604\ud55c\u00a0select\ub97c \uc2e4\ud589\ud574\ubcf4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uacb0\uacfc\ub97c \uc5bb\uc744 \uc218 \uc788\ub2e4.<\/p>\n<p>\ub9cc\uc57d\uc5d0\u00a0where\ubb38\uc744 \uc0ac\uc6a9\ud558\uace0\uc790 \ud55c\ub2e4\uba74string\uc744 \uadf8\ub0e5 \uc0dd\uc131\ud558\ub294 \uac83\ubcf4\ub2e4\u00a0mysql.escape\ub77c\ub294 \uba54\uc11c\ub4dc\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4. boolean\uc774\ub098\u00a0array\uc640 \uac19\uc740 \ub370\uc774\ud130\ud615\uc744\u00a0SQL\ubb38\uc7a5\uc73c\ub85c \uc801\uc808\ud558\uac8c \ubcc0\ud658\ud574\uc904\ubfd0\ub9cc \uc544\ub2c8\ub77c\u00a0mysql.escape\ub294\u00a0SQL injection attack\uc744 \ubc29\uc5b4\ud574\uc900\ub2e4.<\/p>\n<p><strong>var<\/strong>\u00a0query = connection.query(&#8216;select * from users where userid=&#8217;+mysql.escape(req.params.userid),<strong>function<\/strong>(err,rows){<\/p>\n<p>console.log(rows);<\/p>\n<p>\uc790\uc544 \uc774\uc81c\uae4c\uc9c0 \uac04\ub2e8\ud558\uac8c\u00a0node-mysql\u00a0\ubaa8\ub4c8\uc744 \uc774\uc6a9\ud574\uc11c \uae30\ubcf8\uc801\uc778\u00a0SQL\u00a0\ubb38\uc7a5\uc744 \uc218\ud589\ud558\ub294 \uac83\uc5d0 \ub300\ud574\uc11c \uc54c\uc544\ubcf4\uc558\ub2e4.<\/p>\n<p><strong>Transaction\u00a0\ucc98\ub9ac<\/strong><\/p>\n<p>node-mysql\u00a0\ubaa8\ub4c8\uc744 \ud2b8\ub80c\uc81d\uc158 \ucc98\ub9ac\ub3c4 \uc9c0\uc6d0\ud574\uc8fc\ub294\ub370,\u00a0\uc544\ub798 \uc608\uc81c\ub294\u00a0users\u00a0\ud14c\uc774\ube14\uacfc\u00a0log\u00a0\ud14c\uc774\ube14\uc5d0 \uac01\uac01\uc758 \ub370\uc774\ud130\ub97c \ud558\ub098\uc758 \ud2b8\ub80c\uc81d\uc158\uc73c\ub85c \ubb36\uc5b4\uc11c \uc218\ud589\ud574\uc8fc\ub294 \uc608\uc81c\uc774\ub2e4.<\/p>\n<p>\/\/ insert with transaction<\/p>\n<p>app.post(&#8216;\/userstx&#8217;,<strong>function<\/strong>(req,res){<\/p>\n<p><strong>var<\/strong>\u00a0user = {&#8216;userid&#8217;:req.body.userid,<\/p>\n<p>&#8216;name&#8217;:req.body.name,<\/p>\n<p>&#8216;address&#8217;:req.body.address};<\/p>\n<p>&nbsp;<\/p>\n<p>connection.beginTransaction(<strong>function<\/strong>(err) {<\/p>\n<p><strong>if<\/strong>\u00a0(err) {<\/p>\n<p><strong>throw<\/strong>\u00a0err;<\/p>\n<p>}<\/p>\n<p>connection.query(&#8216;insert into users set ?&#8217;, user,\u00a0<strong>function<\/strong>\u00a0(err, result) {<\/p>\n<p><strong>if<\/strong>\u00a0(err) {<\/p>\n<p>console.error(err);<\/p>\n<p>connection.rollback(<strong>function<\/strong>\u00a0() {<\/p>\n<p>console.error(&#8216;rollback error&#8217;);<\/p>\n<p><strong>throw<\/strong>\u00a0err;<\/p>\n<p>});<\/p>\n<p>}\/\/ if err<\/p>\n<p>console.log(&#8216;insert transaction log&#8217;);<\/p>\n<p><strong>var<\/strong>\u00a0log = {&#8216;userid&#8217;: req.body.userid};<\/p>\n<p>connection.query(&#8216;insert into log set ?&#8217;, log,\u00a0<strong>function<\/strong>\u00a0(err, result) {<\/p>\n<p><strong>if<\/strong>\u00a0(err) {<\/p>\n<p>console.error(err);<\/p>\n<p>connection.rollback(<strong>function<\/strong>\u00a0() {<\/p>\n<p>console.error(&#8216;rollback error&#8217;);<\/p>\n<p><strong>throw<\/strong>\u00a0err;<\/p>\n<p>});<\/p>\n<p>}\/\/ if err<\/p>\n<p>connection.commit(<strong>function<\/strong>\u00a0(err) {<\/p>\n<p><strong>if<\/strong>\u00a0(err) {<\/p>\n<p>console.error(err);<\/p>\n<p>connection.rollback(<strong>function<\/strong>\u00a0() {<\/p>\n<p>console.error(&#8216;rollback error&#8217;);<\/p>\n<p><strong>throw<\/strong>\u00a0err;<\/p>\n<p>});<\/p>\n<p>}\/\/ if err<\/p>\n<p>res.send(200,\u00a0&#8216;success&#8217;);<\/p>\n<p>&nbsp;<\/p>\n<p>});\/\/ commit<\/p>\n<p>});\/\/ insert into log<\/p>\n<p>});\/\/\u00a0inset\u00a0into users<\/p>\n<p>});\u00a0\/\/ begin\u00a0trnsaction<\/p>\n<p>});<\/p>\n<p>\uba3c\uc800\u00a0connection.begintransaction\uc744 \ud638\ucd9c\ud55c \ud6c4\uc5d0, transaction\uc774 \uc2dc\uc791\ub418\uba74 \ucffc\ub9ac\ub97c \uc218\ud589\ud558\uae30 \uc704\ud574\uc11c, begintrasaction\uc548\ucabd \ubd80\ubd84\uc5d0\uc11c\u00a0sql\u00a0\ubb38\uc7a5\uc744 \uc218\ud589\ud55c\ub2e4.<\/p>\n<p>insert into users SQL\ubb38\uc7a5\uc744 \uba3c\uc800 \uc218\ud589\ud55c\ud6c4<\/p>\n<p>\ub2e4\uc74c\u00a0insert into log SQL\u00a0\ubb38\uc7a5\uc744 \uc218\ud589\ud558\uae30 \uc704\ud574\uc11c\u00a0insert into users Query\uc758\u00a0call back\uc5d0\uc11c\u00a0insert into log SQL\u00a0\ubb38\uc7a5\uc744 \uc218\ud589\ud558\uc600\ub2e4.<\/p>\n<p>\uadf8 \ub2e4\uc74c\uc73c\ub85c\u00a0transaction commit\u00a0\ucc98\ub9ac\ub97c\u00a0insert into logs\u00a0\uc758\u00a0callback\ud568\uc218\uc5d0\uc11c\u00a0connection.commit\uc744 \uc774\uc6a9\ud574\uc11c \uc218\ud589\ud558\uc600\ub2e4.\u00a0\ucf54\ub4dc\ub97c \ubcf4\uba74 \uc54c\uaca0\uc9c0\ub9cc, transaction begin,insert\u00a0\ub450\uac1c, commit\uc744 \uc21c\ucc28 \uc218\ud589\ud558\uae30 \uc704\ud574\uc11c\u00a0callback\uc744 \uc911\ucca9 \uc0ac\uc6a9\ud558\uc600\ub2e4.\u00a0\ucf54\ub4dc\ub3c4 \ubcf5\uc7a1\ud558\uace0\u00a0{}\u00a0\ub3c4 \ub9ce\ub2e4.\u00a0\uc774\ub807\uac8c\u00a0node.js\uc758async callback\u00a0\uad6c\uc870\ub85c \uc778\ud558\uc5ec,\u00a0\ucf54\ub4dc\uc758 \ubcf5\uc7a1\ub3c4\uac00 \uc99d\uac00\ud558\ub294 \uac83\uc744 \ubcf4\ud1b5\u00a0callback hell(\uc9c0\uc625)\uc774\ub77c\uace0 \ud558\ub294\ub370,\u00a0\uc774\ub97c \ud574\uacb0\ud558\uae30 \uc704\ud55c \ubaa8\ub4c8\ub85c\u00a0Async\u00a0\uc640 \uac19\uc740 \ubaa8\ub4c8\ub4e4\uc774 \uc788\ub2e4.\u00a0\uc774\u00a0callback hell\uc5d0 \ub300\ud574\uc11c\ub294 \ucc28\ud6c4\uc5d0 \ubcc4\ub3c4\uc758 \uae00\ub85c \ub530\ub85c \uc18c\uac1c\ud558\ub3c4\ub85d \ud558\uaca0\ub2e4.<\/p>\n<p>Connetion Pooling<\/p>\n<p>node-mysql\ub3c4 \uae30\ubcf8\uc801\uc73c\ub85c\u00a0connection pooling\uc744 \uc81c\uacf5\ud55c\ub2e4. Connection pooling\uc744 \uc0ac\uc6a9\ud558\ub294 \ubc95\uc740 \ub9e4\uc6b0 \uc27d\ub2e4.\uc55e\uc758 \uc608\uc81c\uc758 \uacbd\uc6b0\uc5d0\ub294 \uc804\uccb4\uac00 \ud558\ub098\uc758\u00a0connection\ub9cc \uc0ac\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 \ub3d9\uc2dc\uc5d0 \ub9ce\uc740 \uc694\uccad\uc774 \ub4e4\uc5b4\uc62c \uacbd\uc6b0 \uc81c\ub300\ub85c \ucc98\ub9ac\uac00 \ub418\uc9c0 \uc54a\ub294\ub2e4.<\/p>\n<p>Connection\uc744 \ub9cc\ub4dc\ub294 \ubd80\ubd84\uc744 \uc0b4\ud3b4\ubcf4\uba74\u00a0DB Connection\uc744 \ub9cc\ub4dc\ub294 \ubc29\ubc95\uacfc \ud06c\uac8c \ub2e4\ub974\uc9c0 \uc54a\ub2e4.\uc5ec\uae30\uc5d0 \uba87\uac00\uc9c0 \uc778\uc790\ub97c \ucd94\uac00 \uc9c0\uc815\ud560 \uc218 \uc788\ub294\ub370, connectionLimit\uc740\u00a0pool\uc5d0 \ub2f4\uc744 \uc218 \uc788\ub294 \ucd5c\ub300\uc758\u00a0connection\u00a0\uc218\uc774\ub2e4.\u00a0\uc5ec\uae30\uc11c\ub294\u00a020\uac1c\ub85c \uc124\uc815\ud558\uc600\ub2e4. (\ub514\ud3f4\ud2b8\ub294\u00a010)<\/p>\n<p>\ub2e4\uc74c\uc73c\ub85c \uc0ac\uc6a9\ud55c \uc635\uc158\uc774waitForConnection\uc774\ub77c\ub294 \uc635\uc158\uc778\ub370, true\ub85c \ub418\uc5b4 \uc788\uc73c\uba74\u00a0Pool\ub0b4\uc5d0 \uac00\uc6a9\ud55c\u00a0Connection\uc774 \uc5c6\uc744 \uacbd\uc6b0\uc5d0\u00a0Connection\uc774 \ubc18\ub0a9\ub418\uae30\ub97c \uae30\ub2e4\ub9ac\uace0, false\ub85c \ub418\uc5b4 \uc788\uc73c\uba74, Connection\uc774 \uc5c6\uc744 \uacbd\uc6b0 \ubc14\ub85c \uc5d0\ub7ec\ub97c \ub9ac\ud134\ud55c\ub2e4.<\/p>\n<p><strong>var<\/strong>\u00a0pool = mysql.createPool({<\/p>\n<p>host\u00a0\u00a0\u00a0 :&#8217;localhost&#8217;,<\/p>\n<p>port : 3306,<\/p>\n<p>user :\u00a0&#8216;terry&#8217;,<\/p>\n<p>password :\u00a0&#8216;asdf1234&#8242;,<\/p>\n<p>database:&#8217;terry&#8217;,<\/p>\n<p>connectionLimit:20,<\/p>\n<p>waitForConnections:<strong>false<\/strong><\/p>\n<p>});<\/p>\n<p>&nbsp;<\/p>\n<p>\uc2e4\uc81c\ub85c \ud14c\uc2a4\ud2b8\ub97c \ud574\ubcf4\uba74 \uc7ac\ubbf8\uc788\ub294 \uc810\uc774, Pool\uc774 \uc0dd\uc131\ub418\ub3c4,\u00a0\uc2e4\uc81c\ub85c\u00a0connection\uc774 \ub9cc\ub4e4\uc5b4\uc9c0\uc9c0 \uc54a\ub294\ub2e4. Pool.getConnection\uc2dc\uc5d0,\u00a0\uc720\ud734\u00a0connection\uc774 \uc5c6\uc744 \uacbd\uc6b0\uc5d0\ub9cc\u00a0connectionLimit\u00a0\ubc94\uc704\uc548\uc5d0\uc11c\u00a0connection\uc744 \uc0dd\uc131\ud55c\ub2e4.<\/p>\n<p>\uc544\uc26c\uc6b4 \uc810\uc774 \uc790\ubc14 \uc5d4\ud130\ud504\ub77c\uc774\uc988\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294\u00a0Connection Pool\uc758 \uacbd\uc6b0\u00a0min\/max\u00a0\uac12\uc744 \uc815\ud574\uc11c \uc790\ub3d9\uc73c\ub85c\u00a0connection pool\uc758 \uc0ac\uc774\uc988\ub97c \uc870\uc815\ud55c\ub2e4\uac70\ub098,\u00a0\uac01\u00a0Connection\uc744\u00a0health\u00a0\uc0c1\ud0dc\ub97c \uc8fc\uae30\uc801\uc73c\ub85c \uac80\uc0ac\ud574\uc11c \ubb38\uc81c\uac00 \uc788\ub294 \uac83\uc740 \ub04a\ub294\ub2e4\uac70\ub098 \ub4f1\uc758 \uae30\ub2a5\uc774 \ub418\ub294\ub370,\u00a0\uac70\uc758 \uae30\ub2a5\uc774 \uc5c6\ub2e4. (\uc7a5\uc560 \ub300\uc751\uc774 \uc27d\uc9c0 \uc54a\uc744 \ub4ef)<\/p>\n<p>Pool\uc744 \uc0ac\uc6a9\ud574\uc11c\u00a0Query\ub97c \ud574\ubcf4\uc790.\u00a0\uc55e\uc5d0\uc11c \uad6c\ud604\ud55c\u00a0select * from users\ub97c\u00a0pool\ub85c \uad6c\ud604\ud574\uc8fc\uba74\u00a0query\u00a0\uc804\uc5d0\u00a0pool.getConnection\uc73c\ub85c \uc2f8\uc8fc\uace0, getConnection\uc758\u00a0callback\u00a0\ud568\uc218\uc548\uc5d0\uc11c \ub450 \ubc88\uc9f8 \uc778\uc790\ub85c \ub118\uc5b4\uc628\u00a0connection\u00a0\uac1d\uccb4\ub97c \uc774\uc6a9\ud574\uc11c \ucffc\ub9ac\ub97c \uc218\ud589\ud558\uba74 \ub41c\ub2e4.<\/p>\n<p>\/\/select all<\/p>\n<p>app.get(&#8216;\/users&#8217;,\u00a0<strong>function<\/strong>(req,res){<\/p>\n<p>pool.getConnection(<strong>function<\/strong>(err,connection){<\/p>\n<p><strong>var<\/strong>\u00a0query = connection.query(&#8216;select * from users&#8217;,\u00a0<strong>function<\/strong>\u00a0(err, rows) {<\/p>\n<p><strong>if<\/strong>(err){<\/p>\n<p>connection.release();<\/p>\n<p><strong>throw<\/strong>\u00a0err;<\/p>\n<p>}<\/p>\n<p>console.log(rows);<\/p>\n<p>res.json(rows);<\/p>\n<p>connection.release();<\/p>\n<p>});<\/p>\n<p>console.log(query);<\/p>\n<p>});<\/p>\n<p>});<\/p>\n<p>\uc5ec\uae30\uc11c \uc8fc\uc758\ud560\uc810\uc740\u00a0connection\uc744 \uc0ac\uc6a9\ud55c \ud6c4\uc5d0,\u00a0\ubc18\ub4dc\uc2dc\u00a0connection.release\u00a0\ub97c \uc774\uc6a9\ud574\uc11c\u00a0pool\uc5d0\u00a0connection\uc744 \ubc18\ub0a9\ud574\uc57c \ud55c\ub2e4.\ud2b9\ud788 \uc5d0\ub7ec\uac00 \ub0ac\uc744\ub54c\ub3c4\u00a0connection\uc744 \ubc18\ub0a9\ud574\uc57c \ud558\ub294 \uac83\uc744 \uc78a\uc9c0 \ub9d0\uc544\uc57c \ud55c\ub2e4.\uc774\ub807\uac8c\u00a0connection\uc744 \ubc18\ub0a9\ud558\uc9c0 \uc54a\uc544\uc11c \uc720\ud734\u00a0conneciton\uc774\u00a0pool\uc5d0 \ub0a8\uc544\uc788\uc9c0 \uc54a\ub294 \ud604\uc0c1\uc744connection leak\uc774\ub77c\uace0 \ud558\ub294\ub370, connection pool\uc744 \uc0ac\uc6a9\ud560 \ub54c \uc0c1\ub2f9\ud788 \uc790\uc8fc \ubc1c\uc0dd\ud558\ub294 \uc7a5\uc560\uc774\uae30 \ub54c\ubb38\uc5d0 \ubc18\ub4dc\uc2dc \uaf3c\uaf3c\ud558\uac8c \ucc98\ub9ac\ud558\uae30 \ubc14\ub780\ub2e4. (\ub098\uc911\uc5d0leak\uc774 \ubc1c\uc0dd\ud558\uba74 \ucc3e\uae30\ub3c4 \uc5b4\ub835\ub2e4.)<\/p>\n<p>PoolCluster<\/p>\n<p>\ub2e8\uc77c\u00a0DB\ub97c \uc5f0\uacb0\ud558\ub294\u00a0Connection Pool\uc774\uc678\uc5d0\ub3c4 \uc5ec\ub7ec \uac1c\uc758 \ub370\uc774\ud130 \ubca0\uc774\uc2a4\ub97c \uc5f0\uacb0\ud558\ub294\u00a0Conneciton Pool\uc758 \uac1c\ub150\uc778\u00a0poolCluster\ub97c \uc81c\uacf5\ud55c\ub2e4.\u00a0\uc774poolCluster\ub294 \ub3d9\uc2dc\uc5d0 \uc5ec\ub7ec \uac1c\uc758\u00a0ConnectionPool\uc744 \ud3ec\ud568\ud558\ub294 \uc77c\uc885\uc758 \uc9d1\ud569\uc774\ub2e4.\u00a0\uc5ec\ub7ec \uac1c\uc758\u00a0mysql node\ub97c \ubb36\uc5b4\uc11c \ud074\ub7ec\uc2a4\ud130 \uad6c\uc131\uc744 \ud560 \uc218 \uc788\ub294 \ud658\uacbd\uc774 \uc5c6\uc5b4\uc11c,\u00a0<a href=\"https:\/\/github.com\/felixge\/node-mysql\">https:\/\/github.com\/felixge\/node-mysql<\/a>\u00a0\uc5d0 \ub098\uc640\uc788\ub294 \uc608\uc81c\ub97c \uc778\uc6a9\ud558\uc600\ub2e4.<\/p>\n<p>\/\/ create<\/p>\n<p><strong>var<\/strong>\u00a0poolCluster = mysql.createPoolCluster();<\/p>\n<p>&nbsp;<\/p>\n<p>poolCluster.add(config);\u00a0\/\/ anonymous group<\/p>\n<p>poolCluster.add(&#8216;MASTER&#8217;, masterConfig);<\/p>\n<p>poolCluster.add(&#8216;SLAVE1&#8217;, slave1Config);<\/p>\n<p>poolCluster.add(&#8216;SLAVE2&#8217;, slave2Config);<\/p>\n<p>&nbsp;<\/p>\n<p>\/\/ Target Group : ALL(anonymous, MASTER, SLAVE1-2), Selector : round-robin(default)<\/p>\n<p>poolCluster.getConnection(<strong>function<\/strong>\u00a0(err, connection) {});<\/p>\n<p>&nbsp;<\/p>\n<p>\/\/ Target Group : MASTER, Selector : round-robin<\/p>\n<p>poolCluster.getConnection(&#8216;MASTER&#8217;,\u00a0<strong>function<\/strong>\u00a0(err, connection) {});<\/p>\n<p>&nbsp;<\/p>\n<p>\/\/ Target Group : SLAVE1-2, Selector : order<\/p>\n<p>\/\/ If can&#8217;t connect to SLAVE1, return SLAVE2. (remove SLAVE1 in the cluster)<\/p>\n<p>poolCluster.on(&#8216;remove&#8217;,\u00a0<strong>function<\/strong>\u00a0(nodeId) {<\/p>\n<p>console.log(&#8216;REMOVED NODE : &#8216;\u00a0+ nodeId);\u00a0\/\/ nodeId = SLAVE1<\/p>\n<p>});<\/p>\n<p>&nbsp;<\/p>\n<p>poolCluster.getConnection(&#8216;SLAVE*&#8217;,\u00a0&#8216;ORDER&#8217;,\u00a0<strong>function<\/strong>\u00a0(err, connection) {});<\/p>\n<p>&nbsp;<\/p>\n<p>\/\/ of namespace : of(pattern, selector)<\/p>\n<p>poolCluster.of(&#8216;*&#8217;).getConnection(<strong>function<\/strong>\u00a0(err, connection) {});<\/p>\n<p>&nbsp;<\/p>\n<p><strong>var<\/strong>\u00a0pool = poolCluster.of(&#8216;SLAVE*&#8217;,\u00a0&#8216;RANDOM&#8217;);<\/p>\n<p>pool.getConnection(<strong>function<\/strong>\u00a0(err, connection) {});<\/p>\n<p>pool.getConnection(<strong>function<\/strong>\u00a0(err, connection) {});<\/p>\n<p>&nbsp;<\/p>\n<p>\/\/ destroy<\/p>\n<p>poolCluster.end();<\/p>\n<p>\uc774 \ucf54\ub4dc\ub294\u00a0\u201cmaster- 2\uac1c\uc758\u00a0slave\u00a0\ubcf5\uc81c \uad6c\uc870\u201d\ub85c \ub418\uc5b4 \uc788\ub294\u00a0mysql\u00a0\uc5d0 \uac01\u00a0DB\uc5d0\u00a03\uac1c\uc758\u00a0connection pool\uc744 \uc5f0\uacb0\ud558\uc5ec\u00a0pool cluster\ub85c \ubb36\uc740 \uc608\uc81c\uc774\ub2e4. poolCluster\uc5d0\uc11c\u00a0connection\u00a0\uc744 \uac00\uc9c0\uace0 \uc624\ub294 \uac83\uc740\u00a0poolCluster.getConnection(\u201c\ud480\uc774\ub984\u201d)\u00a0\uc744 \uc0ac\uc6a9\ud558\uba74 \ub418\ub294\ub370,\u00a0\uc704\uc758\u00a0SLAVE*\uc640 \uac19\uc774\u00a0\u2018*\u2019\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.\u00a0\u00a0\uc774 \uacbd\uc6b0\uc5d0\ub294 \uc5b4\ub5a4 \uc815\ucc45\uc73c\ub85c\u00a0Pool\uc744 \uac00\uc9c0\uace0 \uc62c\uc9c0\ub97c \uc815\ud574\uc57c \ud558\ub294\ub370, 3\u00a0\uac00\uc9c0 \uc815\ucc45\uc744 \uc9c0\uc6d0\ud55c\ub2e4.<\/p>\n<p>\u009f\u00a0\u00a0\u00a0RR : Connection\uc744 \ud574\ub2f9 \uc774\ub984\uc758 \ud480\ub4e4\uc5d0\uc11c \ubc88\uac08\uc544 \uac00\uba74\uc11c \ud55c\ubc88\uc529 \ub9ac\ud134\ud55c\ub2e4.<\/p>\n<p>\u009f\u00a0\u00a0\u00a0ORDER : Connection\uc744 \ubb34\uc870\uac74 \uccab\ubc88\uc9f8 \ud480\uc5d0\uc11c\ubd80\ud130 \ub9ac\ud134\ud558\ub294\ub370,\u00a0\uc7a5\uc560\uac00 \ub0ac\uc744 \uacbd\uc6b0\uc5d0\ub9cc \ub2e4\uc74c \ud480\uc758\u00a0Connection\uc744 \uc21c\ucc28\uc801\uc73c\ub85c \ub9ac\ud134\ud55c\ub2e4. \u00a0\uc774 \uacbd\uc6b0\uc5d0\ub294\u00a0HA\u00a0\uad6c\uc131\ub4f1\uc5d0 \uc720\ub9ac\ud558\uac8c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n<p>\u009f\u00a0\u00a0\u00a0RANDOM :\u00a0\uc21c\uc11c \uc5c6\uc774 \ubb34\uc791\uc704\ub85c \uc544\ubb34 \ud480\uc5d0\uc11c\ub098\u00a0connection\uc744 \ub9ac\ud134\ud55c\ub2e4.<\/p>\n<p>\uc774 \uc678\uc5d0\ub3c4 \uc0b4\ud3b4\ubcf4\uba74, Store Procedure\u00a0\uc218\ud589\uc774\ub098, Streaming, Pipe\uc640 \uac19\uc740 \uae30\ub2a5\ub4e4\ub3c4 \uc81c\uacf5\ud55c\ub2e4.\u00a0\uadf8\ub7ec\ub098 \uc544\uc9c1\uae4c\uc9c0 \uc5d4\ud130\ud504\ub77c\uc774\uc988 \uc790\ubc14\uc5d0 \ube44\ud574\uc11c\ub294 \ubd84\uc0b0 \ud2b8\ub80c\uc81d\uc158 \uad00\ub9ac \ub2a5\ub825\uc774\ub098 \ubc30\uce58 \ucc98\ub9ac\ub4f1\uc740 \ubd80\uc871\ud55c \uac83\uc774 \uc0ac\uc2e4\uc774\uace0,\u00a0\uc624\ud508\ub418\uc5b4 \uc788\ub294 \ubaa8\ub4c8\ub3c4 \uc544\uc9c1 \uc131\uc219\ub3c4\uac00 \uae30\uc874\uc758\u00a0JDBC\/MySQL\u00a0\ubaa8\ub4c8\uc5d0 \ube44\ud574\uc11c \ub192\uc9c0 \uc54a\ub2e4.\u00a0\uc608\ub97c \ub4e4\uc5b4\uc11c, connection\uc774 \ub04a\uc5b4\uc9c0\uc9c0 \uc54a\uac8c \uc8fc\uae30\uc801\uc73c\ub85c\u00a0Keep alive query\ub97c \ubcf4\ub0b4\ub294 \uae30\ub2a5\ub4f1.\u00a0\uc77c\ubc18\uc801\uc778\u00a0B2C\u00a0\uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c\ub294 \ucda9\ubd84\ud788 \uc0ac\uc6a9\uac00\ub2a5 \ud558\uc9c0\ub9cc,\u00a0\uace0\uac00\uc6a9\uc744 \uc694\uad6c\ud558\uac70\ub098 \ub370\uc774\ud0c0 \ubd84\uc2e4\uc774\ub098 \uc740\ud589\uacfc \uac19\uc740 \ub192\uc740 \uc218\uc900\uc758 \ud2b8\ub80c\uc81d\uc158 \ubcf4\uc7a5\uc774 \ud544\uc694\ud55c \uacf3\uc5d0\ub294 \uc801\uc808\ud558\uc9c0 \uc54a\ub2e4. (\ubb3c\ub860 \uadf8\ub7f0\uacf3\uc5d0\ub294mysql\uc744 \uc0ac\uc6a9\ud558\uc9c0\ub3c4 \uc54a\uaca0\uc9c0\ub9cc)<\/p>\n<p>&nbsp;<\/p>\n<p>\uc6f9\uc758\u00a0\ubc1c\uc804\uacfc\u00a0\ud568\uaed8,\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\uc758\u00a0\uc694\uccad\uc5d0\u00a0\ub300\ud574\uc11c\u00a0\uc751\ub2f5\ub9cc\uc744\u00a0\ud558\ub294\u00a0\ub2e8\ubc29\ud5a5\uc131\uc774\u00a0\uc544\ub2cc\u00a0\uc591\ubc29\ud5a5\uc131\uc758\u00a0\uc6f9\u00a0\uc0ac\uc774\ud2b8\uac00\u00a0\uc720\ud589\ud558\uac8c\u00a0\ub418\uc5c8\ub294\ub370, Socket.IO\ub294\u00a0\uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8\u00a0\ubaa8\ub4c8\ub85c,\u00a0\uc591\ubc29\ud5a5\u00a0\ud1b5\uc2e0\uc774\u00a0\uac00\ub2a5\ud55c\u00a0\uc6f9\uc0ac\uc774\ud2b8\ub97c\u00a0\uad6c\ucd95\ud558\uae30\u00a0\uc704\ud574\uc11c\u00a0HTTP\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\ub85c\u00a0\ud478\uc26c\u00a0\uba54\uc2dc\uc9c0\ub97c\u00a0\ubcf4\ub0b4\uc904\uc218\u00a0\uc788\ub294\u00a0\ubaa8\ub4c8\uc774\ub2e4.\u00a0\ub113\uc740\u00a0\ube0c\ub77c\uc6b0\uc838\u00a0\uc9c0\uc6d0\uc131\uacfc\u00a0\uc0ac\uc6a9\uc758\u00a0\ud3b8\uc758\uc131\u00a0\ub54c\ubb38\uc5d0\u00a0\ub110\ub9ac\u00a0\uc0ac\uc6a9\ub418\uace0\u00a0\uc788\uace0, node.js\uac00\u00a0\uc778\uae30\u00a0\uc788\uc5b4\u00a0\uc9c0\ub294\u00a0\uc774\uc720\u00a0\uc911\uc758\u00a0\ud558\ub098\ub294socket.io\u00a0\ub54c\ubb38\uc774\u00a0\uc544\ub2d0\uae4c\u00a0\ud55c\ub2e4.<\/p>\n<h2>\ubc30\uacbd<\/h2>\n<p>Socket.io\ub97c \uc124\uba85\ud558\uae30 \uc804\uc5d0,\u00a0\uc6f9\uc5d0\uc11c\uc758 \ud478\uc26c \uac1c\ub150\uc5d0 \ub300\ud574\uc11c \uc774\ud574\ud560 \ud544\uc694\uac00 \uc788\ub2e4.\u00a0\uc6f9\uc740 \uae30\ubc18\uc801\uc73c\ub85c \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uc11c \uc11c\ubc84\ub85c \uac00\ub294 \ub2e8\ubc29\ud5a5\uc131\uc774\uc9c0\ub9cc,\u00a0\ucc44\ud305\uacfc \uac19\uc740 \uc2e4\uc2dc\uac04 \uc591\ubc29\ud5a5 \uc560\ud50c\ub9ac\ucf00\uc774\ub098 \ucabd\uc9c0\uc640 \uac19\uc774 \uc11c\ubc84\uc5d0\uc11c \ud074\ub77c\uc774\uc5b8\ud2b8\ub85c \uc54c\ub9bc\uc744 \ubcf4\ub0b4\uc918\uc57c \ud558\ub294 \uc694\uad6c \uc0ac\ud56d\uc774 \uc0dd\uacbc\ub2e4.\u00a0\uadf8\ub798\uc11c \uc5ec\ub7ec\uac00\uc9c0 \uae30\ubc95\uc774 \uc0dd\uaca8\ub0ac\ub294\ub370,\u00a0\uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \uae30\ubc18\uc758\u00a0AJAX\uac00 \uc720\ud589\ud558\uba74\uc11c \uba87\uac00\uc9c0 \uae30\ubc95\uc774 \uc0dd\uaca8\ub0ac\ub294\ub370,\u00a0\uadf8 \ub0b4\uc6a9\uc744 \uc0b4\ud3b4\ubcf4\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<p>\uc6f9 \ud478\uc26c \ubc29\uc2dd \ube44\uad50\u00a0: Polling vs Long Polling vs Streaming<\/p>\n<p>\ucd9c\ucc98\u00a0:\u00a0<a href=\"https:\/\/blogs.oracle.com\/theaquarium\/entry\/slideshow_example_using_comet_dojo\">https:\/\/blogs.oracle.com\/theaquarium\/entry\/slideshow_example_using_comet_dojo<\/a><\/p>\n<p><strong>Polling<\/strong><\/p>\n<p>\uac00\uc7a5 \uae30\ubcf8\uc801\uc778 \uae30\ubc95\uc73c\ub85c,\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc11c\ubc84\uc5d0 \uc8fc\uae30\uc801\uc73c\ub85c \ud3f4\ub9c1(request\ub97c \ubcf4\ub0b4\ub294 \uae30\ubc95)\uc774\ub2e4.\u00a0\uc8fc\uae30\uc801\uc73c\ub85c \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc790\uae30\uac00 \ucc98\ub9ac\ud574\uc57c\ud560 \uc774\ubca4\ud2b8\uac00 \uc788\ub294\uc9c0 \uc5c6\ub294\uc9c0\ub97c \uccb4\ud06c\ud558\ub294 \uac83\uc774\ub2e4.<\/p>\n<p>\uc11c\ubc84\uac00 \ud3f4\ub9c1 \uc694\uccad\uc774 \ub4e4\uc5b4\uc62c\ub54c \ub9c8\ub2e4 \uc774\ub97c \ucc98\ub9ac\ud574\uc57c \ud558\uace0,\u00a0\ub2e4\uc74c \ud3f4\ub9c1\uc774 \uc774\ub8e8\uc5b4\uc9c0\uae30 \uc804\uae4c\uc9c0\ub294 \uc5b4\ub5a4 \uc774\ubca4\ud2b8\uac00 \uc624\ub294\uc9c0\ub97c \ubaa8\ub974\uae30 \ub54c\ubb38\uc5d0,\uacb0\uc815\uc801\uc73c\ub85c \uc2e4\uc2dc\uac04\uc131\uc774 \ubcf4\uc7a5\uc774\uc548\ub41c\ub2e4.<\/p>\n<p>\uc608\ub97c \ub4e4\uc5b4 \ud3f4\ub9c1 \uc8fc\uae30\uac00\u00a010\ubd84\uc774\ub77c\uace0 \ud560\ub54c \ud3f4\ub9c1 \uc774\ud6c4\uc5d0 \ubc14\ub85c \uc774\ubca4\ud2b8\uac00 \ub4e4\uc5b4\uc654\uc744\ub54c,\u00a0\ub2e4\uc74c \ud3f4\ub9c1\uc8fc\uae30\u00a0(10\ubd84)\uc744 \uae30\ub2e4\ub824\uc57c \ub41c\ub2e4.\u00a0\uadf8\ub9ac\uace0 \ud3f4\ub9c1 \uc8fc\uae30\uac00 \uc9e7\uc744 \uc218 \ub85d \uc11c\ubc84\uac00 \ubc1b\ub294 \ubd80\ud558\uac00 \ud06c\ub2e4,\u00a0\uc608\ub97c \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc791\uc5c5\ud560 \ub0b4\uc6a9\uc774 \uc788\ub294\uc9c0 \ud655\uc778\ud558\ub824\uba74, DB\ub4dc\uc5d0 \uc791\uc5c5 \ub0b4\uc6a9\uc744 \uc800\uc7a5\ud574\ub193\uace0,\u00a0\ud3f4\ub9c1 \ub54c\ub9c8\ub2e4 \uccb4\ud06c\ud574\uc57c \ud558\ub294\ub370,\u00a0\uc774\ub54c \ub9e4\ubc88\u00a0DB\u00a0\ucffc\ub9ac\ub97c \ud574\uc57c \ud55c\ub2e4\uba74,\u00a0\ud3f4\ub9c1 \ub54c\ub9c8\ub2e4 \uc11c\ubc84\uac00\u00a0DB\ub97c \ucffc\ub9ac\ud574\uc57c\ud558\uae30 \ub54c\ubb38\uc5d0,\u00a0\ubc1b\uc544\uc57c \ud558\ub294 \ud2b8\ub80c\uc81d\uc158\uc774 \ub9e4\uc6b0 \ub9ce\uace0 \uc11c\ubc84\uc758 \ubd80\ub2f4\uc774 \uae30\ud558 \uae09\uc218\uc801\uc73c\ub85c \ub298\uc5b4\ub09c\ub2e4.\u00a0\ub530\ub77c\uc11c,\u00a0\uc9e7\uc740 \ud3f4\ub9c1 \uc8fc\uae30\ub294 \uc11c\ubc84\uc5d0 \ub9ce\uc740 \ubd80\ud558\ub97c \uc8fc\uae30 \ub54c\ubb38\uc5d0,\u00a0\uc801\uc808\ud558\uc9c0 \uc54a\uc73c\uba70 \ud074\ub77c\uc774\uc5b8\ud2b8\ub85c \ubcf4\ub0b4\ub294 \ud478\uc26c \uba54\uc2dc\uc9c0\uc758 \uc2e4\uc2dc\uac04\uc131\uc774 \ud544\uc694\ud558\uc9c0 \uc54a\uc740 \uacbd\uc6b0\uc5d0 \uc801\uc808\ud558\uba70,\u00a0\uc11c\ubc84\uc758 \ubd80\ud558\uac00 \uc0c1\ub300\uc801\uc73c\ub85c \uc801\uace0(\ud3f4\ub9c1 \uc8fc\uae30\uac00 \uae38 \uacbd\uc6b0)\u00a0\uae30\uc874\uc758 \uc6f9\ubc31\uc5d4\ub4dc \uc778\ud504\ub77c\u00a0(Tomcat\uacfc \uac19\uc740 \ubbf8\ub4e4\uc6e8\uc5b4)\ub97c \uadf8\ub300\ub85c \ud65c\uc6a9\ud560 \uc218 \uc788\ub294 \uc7a5\uc810\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4.<\/p>\n<p><strong>Long Polling<\/strong><\/p>\n<p>Long Polling\uc740\u00a0Polling\uacfc \ube44\uc2b7\ud558\ub098 \uc989\uc2dc\uc131\uc744 \uac16\ub294\ub2e4.\u00a0\ubc29\uc2dd\uc740 \ud074\ub77c\uc774\uc5b8\ud2b8\uac00\u00a0HTTP request\ub97c \ubcf4\ub0b4\uace0,\u00a0\ubc14\ub85c\u00a0request\ub97c \ub2eb\ub294 \uac83\uc774 \uc544\ub2c8\ub77c,\u00a0\uc77c\uc815 \uc2dc\uac04 \ub3d9\uc548(\uc624\ub7ab\ub3d9\uc548)\u00a0\uc5f4\uc5b4 \ub193\uace0 \uc788\ub2e4\uac00 \uc11c\ubc84\uc5d0\uc11c \ud074\ub77c\uc774\uc5b8\ud2b8\ub85c \ubcf4\ub0b4\ub294 \uba54\uc2dc\uc9c0\uac00 \uc788\uc73c\uba74 \uba54\uc2dc\uc9c0\ub97c\u00a0HTTP response\ub85c \uc2e4\uc5b4 \ubcf4\ub0b4\uace0,\u00a0\ud574\ub2f9\u00a0Connection\uc744 \ub04a\ub294\ub2e4.\u00a0\ub9cc\uc57d\uc5d0 \uc77c\uc815 \uc2dc\uac04\ub3d9\uc548 \ubcf4\ub0bc \uba54\uc2dc\uc9c0\uac00 \uc5c6\uc73c\uba74\u00a0HTTP\u00a0\uc5f0\uacb0\uc744 \ub04a\ub294\ub2e4.<\/p>\n<p>\uc751\ub2f5 \uba54\uc2dc\uc9c0\ub97c \ubc1b\uac74 \uc548\ubc1b\uac74,\u00a0\ub04a\uc5b4\uc9c4 \uc5f0\uacb0\uc740 \ub2e4\uc2dc \uc5f0\uacb0\ud55c\ub2e4.\u00a0\uae30\ubcf8\uc801\uc73c\ub85c \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc5f0\uacb0\uc744 \ud574\uc11c \uc751\ub2f5\uc744 \uc694\uccad\ud558\ub294\u00a0Polling\u00a0\ud615\ud0dc\uc774\uace0,\u00a0\uc751\ub2f5\uc774 \uc624\ub294\uc9c0 \uae30\ub2e4\ub9ac\ub294 \uae30\uac04\uc774 \uae38\uae30 \ub54c\ubb38\uc5d0 \uc774\ub97c\u00a0Long Polling\u00a0\uc774\ub77c\uace0 \ud55c\ub2e4.<\/p>\n<p>Long Polling\uc758 \uacbd\uc6b0 \uc11c\ubc84\uc5d0 \ud074\ub77c\uc774\uc5b8\ud2b8\ub4e4\uc774 \uac70\uc758 \ud56d\uc0c1 \uc5f0\uacb0\ub418\uc5b4 \uc788\ub294 \ud615\ud0dc\uc774\uae30 \ub54c\ubb38\uc5d0,\u00a0\ub3d9\uc2dc\u00a0\u00a0\uc11c\ubc84\uc758 \ub3d9\uc2dc\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc788\ub294 \uc11c\ubc84\uac00 \uc9c0\uc6d0\ud560 \uc218 \uc788\ub294 \ub3d9\uc2dc \uc5f0\uacb0(Connection)\uc218\uc5d0 \ub530\ub77c \uacb0\uc815\ub41c\ub2e4.<\/p>\n<p>\uc608\ub97c \ub4e4\uc5b4\u00a0Tomcat\uacfc \uac19\uc740\u00a0WAS\uc758 \uacbd\uc6b0\uc5d0\ub294\u00a0HTTP\u00a0\uc5f0\uacb0\uc774 \uc5f4\ub824 \uc788\ub294 \uacbd\uc6b0\uc5d0\ub294\u00a01\uac1c\uc758\u00a0Thread\uac00 \uadf8 \uc694\uccad\uc744 \ucc98\ub9ac\ud558\uae30 \uc704\ud574\uc11c \uc0ac\uc6a9\ub418\uae30 \ub54c\ubb38\uc5d0, Tomcat\uc758\u00a0Thread\uac00\u00a0100\uac1c\uc778 \uacbd\uc6b0, 1 Tomcat\ub2f9 \ucc98\ub9ac\ud560 \uc218 \uc788\ub294\u00a0Long Polling\u00a0\uac00\ub2a5\ud55c \ud074\ub77c\uc774\uc5b8\ud2b8 \uc218\ub294\u00a0100\uac1c\ub85c \ud55c\uc815\uc774 \ub41c\ub2e4. (\uae30\uc874\uc758\u00a0HTTP\u00a0\uc694\uccad\uc744 \ucc98\ub9ac\ud558\ub294 \uc778\ud504\ub77c\ub85c \ud578\ub4e4\ub9c1\ud558\uae30 \uc5b4\ub835\ub2e4.)<\/p>\n<p>\uc11c\ubc84\ub85c\ubd80\ud130 \ud478\uc26c \uba54\uc2dc\uc9c0\ub97c \ubc1b\uc73c\uba74 \uc7ac \uc5f0\uacb0\uc744 \ud574\uc57c \ud558\uae30 \ub54c\ubb38\uc5d0,\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\ub85c \ud478\uc26c\ud558\ub294 \ub0b4\uc6a9\uc774 \uc801\uc744 \uacbd\uc6b0\uc5d0 \uc720\ub9ac\ud558\uba70 \uc2e4\uc2dc\uac04 \ucc44\ud305\uacfc \uac19\uc774 \ud478\uc26c\ud574\uc57c \ud558\ub294 \uba54\uc2dc\uc9c0\uac00 \ub9ce\uc740 \uacbd\uc6b0\uc5d0\ub294 \uc801\uc808\ud558\uc9c0 \uc54a\ub2e4. (\ucc44\ud305 \uba54\uc2dc\uc9c0\uac00 \ud558\ub098 \uc654\ub2e4\uac14\ub2e4 \ud560 \ub54c \ub9c8\ub2e4 \uc7ac \uc5f0\uacb0\uc744 \ud574\uc57c \ud55c\ub2e4.)<\/p>\n<p><strong>Streaming<\/strong><\/p>\n<p>\ub9c8\uc9c0\ub9c9\uc73c\ub85c\u00a0Streaming\u00a0\uae30\ubc95\uc778\ub370,\u00a0\uc774 \uae30\ubc95\uc740 \uc77c\ubc18\uc801\uc778\u00a0TCP Connection\u00a0\ucc98\ub7fc,\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc11c\ubc84\ub85c \uc5f0\uacb0\uc744 \ub9fa\uc740 \ud6c4\uc5d0,\u00a0\uadf8 \uc5f0\uacb0\uc744 \ud1b5\ud574\uc11c \uc11c\ubc84\uac00 \uc774\ubca4\ud2b8\ub97c \ubcf4\ub0b4\ub294 \ubc29\uc2dd\uc774\ub2e4. Long Polling\uc774 \uc774\ubca4\ud2b8\ub97c \ubc1b\uc744 \ub54c\ub9c8\ub2e4 \uc5f0\uacb0\uc744 \ub04a\uace0 \uc7ac \uc5f0\uacb0\uc744 \ud55c\uac00\uba74, Streaming\u00a0\ubc29\uc2dd\uc740 \ud55c\ubc88 \uc5f0\uacb0\ub418\uba74 \uacc4\uc18d\ud574\uc11c \uadf8 \uc5f0\uacb0\uc744 \ud1b5\ud574\uc11c \uc774\ubca4\ud2b8 \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub294 \ubc29\uc2dd\uc73c\ub85c \uc7ac\uc5f0\uacb0\uc5d0 \ub300\ud55c \ubd80\ud558\uac00 \uc5c6\ub2e4.<\/p>\n<p><strong>WebSocket<\/strong><\/p>\n<p>\uc774\ub7ec\ud55c \ud478\uc26c \ub85c\uc9c1\uc744\u00a0AJAX\u00a0\uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8\ub85c \uad6c\ud604\ud558\ub2e4\uac00 \uad6c\ud604 \ubc29\uc2dd\uc774 \ube0c\ub77c\uc6b0\uc838\ub4e4 \ub9c8\ub2e4 \uac01\uae30 \uc0c1\uc774\ud558\uae30 \ub54c\ubb38\uc5d0 \ub098\uc628 \ud45c\uc900\uc774\u00a0WebSocket\uc774\ub77c\ub294 \ud45c\uc900\uc774\ub2e4. http:\/\/\u00a0\ub300\uc2e0\u00a0ws:\/\/\u00a0\ub85c \uc2dc\uc791\ud558\uba70\u00a0Streaming\uacfc \uc720\uc0ac\ud55c \ubc29\uc2dd\uc73c\ub85c \ud478\uc26c\ub97c \uc9c0\uc6d0\ud55c\ub2e4.<\/p>\n<p>\uadf8\ub7ec\ub098 \ubb38\uc81c\ub294 \uc774\u00a0WebSocket\u00a0\uae30\uc220\uc774 \uadfc\ub798\uc5d0 \ub098\uc654\uae30 \ub54c\ubb38\uc5d0,\u00a0\uc608\uc804 \ube0c\ub77c\uc6b0\uc838\ub294 \uc9c0\uc6d0\ud558\uc9c0 \uc54a\ub294\ub2e4\ub294 \uac83\uc774\ub2e4.<\/p>\n<p>&lt;\uadf8\ub9bc:\u00a0\uc6f9\uc18c\ucf13 \uc9c0\uc6d0 \ube0c\ub77c\uc6b0\uc838 \ud604\ud669&gt;<\/p>\n<p>\ucd9c\ucc98\u00a0:\u00a0<a href=\"http:\/\/caniuse.com\/\">http:\/\/caniuse.com<\/a><\/p>\n<h2>Socket.IO<\/h2>\n<p>Socket.IO\ub294\u00a0\uc6f9\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\ub85c\uc758\u00a0\ud478\uc26c\ub97c\u00a0\uc9c0\uc6d0\ud558\ub294\u00a0\ubaa8\ub4c8\uc778\ub370,\u00a0\uc774\u00a0WebSocket\uc758\u00a0\ud55c\uacc4\ub97c\u00a0\ub6f0\uc5b4\u00a0\ub118\uc5b4\uc8fc\ub294\u00a0\ubaa8\ub4c8\uc774\ub2e4.\u00a0\uac1c\ubc1c\uc790\ub294\u00a0Socket.IO\ub85c\u00a0\uac1c\ubc1c\uc744\u00a0\ud558\uace0\ud074\ub77c\uc774\uc5b8\ud2b8\ub85c\u00a0\ud478\uc26c\u00a0\uba54\uc2dc\uc9c0\ub97c\u00a0\ubcf4\ub0b4\uae30\ub9cc\u00a0\ud558\uba74, WebSocket\uc744\u00a0\uc9c0\uc6d0\ud558\uc9c0\u00a0\uc54a\ub294\u00a0\ube0c\ub77c\uc6b0\uc838\uc758\u00a0\uacbd\uc6b0,\u00a0\ube0c\ub77c\uc6b0\uc838\u00a0\ubaa8\ub378\uacfc\u00a0\ubc84\uc804\uc5d0\u00a0\ub530\ub77c\uc11c\u00a0AJAX Long Polling, MultiPart Streaming, Iframe\uc744\u00a0\uc774\uc6a9\ud55c\u00a0\ud478\uc26c, JSONP Polling, Flash Socket\u00a0\ub4f1\u00a0\ub2e4\uc591\ud55c\u00a0\ubc29\ubc95\uc73c\ub85c\u00a0\ub0b4\ubd80\uc801\uc73c\ub85c\u00a0\ud478\uc26c\u00a0\uba54\uc2dc\uc9c0\ub97c\u00a0\ubcf4\ub0b4\uc900\ub2e4.<\/p>\n<p>\uc989\u00a0WebSocket\uc744\u00a0\uc9c0\uc6d0\ud558\uc9c0\u00a0\uc54a\ub294\u00a0\uc5b4\ub290\u00a0\ube0c\ub77c\uc6b0\uc838\ub77c\ub3c4\u00a0\ud478\uc26c\u00a0\uba54\uc2dc\uc9c0\ub97c\u00a0\uc77c\uad00\ub41c\u00a0\ubaa8\ub4c8\ub85c\u00a0\ubcf4\ub0bc\u00a0\uc218\u00a0\uc788\ub2e4.<\/p>\n<p>\uac04\ub2e8\ud55c\u00a0\uc608\uc81c\ub97c\u00a0\uc0b4\ud3b4\ubcf4\uc790<\/p>\n<h3>\uac04\ub2e8\ud55c\u00a0\ucc44\ud305\u00a0\ud504\ub85c\uadf8\ub7a8<\/h3>\n<p>\uac04\ub2e8\ud55c\u00a0\ucc44\ud305\u00a0\ud504\ub85c\uadf8\ub7a8\uc744\u00a0\ud558\ub098\u00a0\uc0b4\ud3b4\ubcf4\uc790.\u00a0\uc544\ub798\u00a0\ud504\ub85c\uadf8\ub7a8\uc740\u00a0\ube0c\ub77c\uc6b0\uc838\uc5d0\u00a0\uc811\uc18d\ud558\uba74\u00a0\uba54\uc2dc\uc9c0\ub97c\u00a0\uc785\ub825\u00a0\ubc1b\uc744\u00a0\uc218\u00a0\uc788\ub294\u00a0Input Box\ub97c\u00a0\ub744\uc6cc\uc8fc\uace0,\u00a0\uc5ec\uae30\uc5d0\u00a0\uba54\uc2dc\uc9c0\ub97c\u00a0\uc785\ub825\ud558\uba74\u00a0\ud604\uc7ac\u00a0\uc5f0\uacb0\ub418\uc5b4\u00a0\uc788\ub294\u00a0\ubaa8\ub4e0\u00a0\uc6f9\ube0c\ub77c\uc6b0\uc838\uc5d0\u00a0\uba54\uc2dc\uc9c0\ub97c\u00a0\ubcf4\ub0b4\uc8fc\ub294\u00a0\ud504\ub85c\uadf8\ub7a8\uc774\ub2e4.<\/p>\n<p>\uba3c\uc800\u00a0\uc11c\ubc84\ucabd\u00a0\ucf54\ub4dc\ub97c\u00a0\ubcf4\uc790<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"615\">\/**\n<p>*\u00a0Module\u00a0dependencies.<\/p>\n<p>*\/<\/p>\n<p>&nbsp;<\/p>\n<p><strong>var<\/strong>\u00a0express = require(&#8216;express&#8217;);<\/p>\n<p><strong>var<\/strong>\u00a0routes = require(&#8216;.\/routes&#8217;);<\/p>\n<p><strong>var<\/strong>\u00a0http = require(&#8216;http&#8217;);<\/p>\n<p><strong>var<\/strong>\u00a0path = require(&#8216;path&#8217;);<\/p>\n<p>&nbsp;<\/p>\n<p><strong>var<\/strong>\u00a0app = express();<\/p>\n<p>app.use(express.<strong>static<\/strong>(path.join(__dirname,\u00a0&#8216;public&#8217;)));<\/p>\n<p>&nbsp;<\/p>\n<p><strong>var<\/strong>\u00a0httpServer =http.createServer(app).listen(8080,\u00a0<strong>function<\/strong>(req,res){<\/p>\n<p>console.log(&#8216;Socket IO server has been started&#8217;);<\/p>\n<p>});<\/p>\n<p>\/\/ upgrade\u00a0http\u00a0server to socket.io server<\/p>\n<p><strong>var<\/strong>\u00a0io = require(&#8216;socket.io&#8217;).listen(httpServer);<\/p>\n<p>&nbsp;<\/p>\n<p>io.sockets.on(&#8216;connection&#8217;,<strong>function<\/strong>(socket){<\/p>\n<p>socket.emit(&#8216;toclient&#8217;,{msg:&#8217;Welcome !&#8217;});<\/p>\n<p>socket.on(&#8216;fromclient&#8217;,<strong>function<\/strong>(data){<\/p>\n<p>socket.broadcast.emit(&#8216;toclient&#8217;,data);\u00a0\/\/\u00a0\uc790\uc2e0\uc744\u00a0\uc81c\uc678\ud558\uace0\u00a0\ub2e4\ub978\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uac8c\u00a0\ubcf4\ub0c4<\/p>\n<p>socket.emit(&#8216;toclient&#8217;,data);\u00a0\/\/\u00a0\ud574\ub2f9\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uac8c\ub9cc\u00a0\ubcf4\ub0c4.\u00a0\ub2e4\ub978\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\u00a0\ubcf4\ub0bc\ub824\uba74?<\/p>\n<p>console.log(&#8216;Message from client :&#8217;+data.msg);<\/p>\n<p>})<\/p>\n<p>});<\/p>\n<p>&nbsp;<\/p><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&lt;\ucf54\ub4dc. App.js&gt;<\/p>\n<p>Express\uc5d0\uc11c\u00a0Socket IO\ub97c\u00a0\uc0ac\uc6a9\ud55c\u00a0\uc608\uc81c\uc778\ub370,\u00a0\uae30\uc874\uc5d0\u00a0Express\uc5d0\uc11c\u00a0\uc0ac\uc6a9\ud55c\uac83\uacfc\u00a0\uac19\uc740\u00a0\ubc29\uc2dd\uc73c\ub85c\u00a0httpServer\ub97c\u00a0\uc0dd\uc131\ud55c\ub2e4.\u00a0\ub2e4\uc74c\uc5d0,\u00a0\uc774httpServer\ub97c\u00a0socketIO\ub97c\u00a0\uc9c0\uc6d0\ud558\ub294\u00a0\uc11c\ubc84\ub85c\u00a0\ub2e4\uc74c\uacfc\u00a0\uac19\uc774\u00a0\uc5c5\uadf8\ub808\uc774\ub4dc\ub97c\u00a0\ud55c\ub2e4.<\/p>\n<p><strong>var<\/strong>\u00a0io = require(&#8216;socket.io&#8217;).listen(httpServer);<\/p>\n<p>\ub2e4\uc74c\uc73c\ub85c,\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\uac00\u00a0socket.io\u00a0\ucc44\ub110\ub85c\u00a0\uc811\uc18d\uc774\u00a0\ub418\uc5c8\uc744\ub54c\uc5d0\u00a0\ub300\ud55c\u00a0\uc774\ubca4\ud2b8\ub97c\u00a0\uc815\uc758\ud55c\ub2e4.<\/p>\n<p>io.sockets.on(&#8216;connection&#8217;,<strong>function<\/strong>(socket){<\/p>\n<p>\uc640\u00a0\uac19\uc774\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\uac00\u00a0\uc811\uc18d\uc774\u00a0\ub418\uba74, callback\uc744\u00a0\uc218\ud589\ud558\ub294\ub370,\u00a0\uc774\ub54c,\u00a0\uc5f0\uacb0\ub41c\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\uc758\u00a0socket\u00a0\uac1d\uccb4\ub97c\u00a0\uac19\uc774\u00a0\ub118\uae34\ub2e4.\u00a0\uc774\u00a0socket\u00a0\uac1d\uccb4\ub97c\u00a0\ubc1b\uc544\uc11c,\u00a0\uc774\u00a0\ucf54\ub4dc\uc5d0\uc11c\ub294\u00a0\uc5f0\uacb0\ub41c\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uac8c\u00a0\u201cWelcome !\u201d\uc774\ub77c\ub294\u00a0\uba54\uc2dc\uc9c0\ub97c\u00a0\ubcf4\ub0c8\ub2e4.<\/p>\n<p>socket.emit(&#8216;toclient&#8217;,{msg:&#8217;Welcome !&#8217;});<\/p>\n<p>\uc77c\ubc18\uc801\uc778\u00a0\uc774\ubca4\ud2b8\u00a0\ucc98\ub9ac\u00a0\ubc29\uc2dd\uacfc\u00a0\uac19\uac8c,\u00a0\ud574\ub2f9\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\u00a0\uc18c\ucf13\uc5d0\u00a0emit\u00a0\uba54\uc11c\ub4dc\ub97c\u00a0\uc774\uc6a9\ud558\uc5ec,\u00a0\uc774\ubca4\ud2b8\ub97c\u00a0\uc804\uc1a1\ud558\uba74\u00a0\ub41c\ub2e4.\u00a0\uc5ec\uae30\uc11c\ub294\u201ctoclient\u201d\ub77c\ub294\u00a0\uc774\ubca4\ud2b8\u00a0\uba85\uc73c\ub85c\u00a0msg\ub77c\ub294\u00a0\ud0a4\ub97c\u00a0\uac16\uace0, value\ub294\u00a0\u2018Welcome !\u2019\u00a0\uc774\ub77c\ub294\u00a0\uac12\uc744\u00a0\uac00\uc9c0\ub294\u00a0\uba54\uc2dc\uc9c0\ub97c\u00a0\uc804\uc1a1\ud558\uc600\ub2e4.<\/p>\n<p>\ub2e4\uc74c\uc73c\ub85c,\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\ub85c\ubd80\ud130\u00a0\uc624\ub294\u00a0\uba54\uc2dc\uc9c0\ub97c\u00a0\ucc98\ub9ac\ud558\ub294\u00a0\ub8e8\ud2f4\uc778\ub370,\u00a0\ucc44\ud305\ucc3d\uc5d0\uc11c\u00a0\uae00\uc744\u00a0\uc4f0\uace0\u00a0\uc5d4\ud130\ub97c\u00a0\ub204\ub974\uba74\u00a0\uc11c\ubc84\ub85c\u00a0\u201cfromclient\u201d\u00a0\ub77c\ub294\u00a0\uc774\ubca4\ud2b8\ub97c\u00a0\ubcf4\ub0b4\ub3c4\ub85d\u00a0\uc791\uc131\ud574\ub193\uc558\ub2e4.\u00a0\uadf8\ub7ec\uba74\u00a0\uc11c\ubc84\ucabd\uc5d0\uc11c\ub294\u00a0\ub2e4\uc74c\uacfc\u00a0\uac19\uc774\u00a0socket.on(\u2018fromclient\u2019\u00a0\ub77c\ub294\u00a0\uba54\uc11c\ub4dc\ub97c\u00a0\uc774\uc6a9\ud558\uc5ec\u00a0\ud574\ub2f9\u00a0\uc774\ubca4\ud2b8\uc5d0\ub530\ub978\u00a0\ucc98\ub9ac\ub97c\u00a0\ud55c\ub2e4.\u00a0\uc774\ub54c\u00a0\ub4e4\uc5b4\uc624\ub294\u00a0\ub370\uc774\ud130\ub294\u00a0\ucc44\ud305\u00a0\ubb38\uc790\uc5f4\uc774\u00a0{msg:\u201d\ubb38\uc790\uc5f4\u201d}\u00a0\ud615\uc2dd\uc73c\ub85c\u00a0data\ub77c\ub294\u00a0\ubcc0\uc218\ub97c\u00a0\ud1b5\ud574\uc11c\u00a0\uc544\ub798\uc640\u00a0\uac19\uc774\u00a0\ub4e4\uc5b4\uc624\ub294\ub370,<\/p>\n<p>socket.on(&#8216;fromclient&#8217;,<strong>function<\/strong>(data){<\/p>\n<p>\ucc44\ud305\uc5d0\uc11c\u00a0\uc774\uba54\uc138\uc9c0\ub97c\u00a0\ub2e4\ub978\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\ub4e4\uacfc\u00a0\uc790\uc2e0\uc5d0\uac8c\u00a0\ub2e4\uc2dc\u00a0\ubcf4\ub0b8\ub2e4.<\/p>\n<p>socket.broadcast.emit(&#8216;toclient&#8217;,data);<\/p>\n<p>socket.emit(&#8216;toclient&#8217;,data);<\/p>\n<p>socket.broadcast.emit\uc740\u00a0\uc790\uc2e0\uc744\u00a0\uc81c\uc678\ud55c\u00a0\ub2e4\ub978\u00a0\ubaa8\ub4e0\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uac8c\u00a0\uc774\ubca4\ud2b8\ub97c\u00a0\ubcf4\ub0b4\ub294\u00a0\uba54\uc11c\ub4dc\uc774\uace0, socket.emit\uc740\u00a0\uc790\uc2e0\uc758\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8(\uc6f9)\uc5d0\uac8c\u00a0\uc774\ubca4\ud2b8\ub97c\u00a0\ubcf4\ub0b4\ub294\u00a0\uba54\uc11c\ub4dc\uc774\ub2e4.<\/p>\n<p>\uadf8\ub7ec\uba74\u00a0\uc774\uc81c\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8(\uc6f9)\ucabd\uc758\u00a0\ucf54\ub4dc\ub97c\u00a0\ubcf4\uc790<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"615\">&lt;html&gt;\n<p>&lt;head&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;title&gt;&lt;\/title&gt;<\/p>\n<p>&lt;script\u00a0src=<em>&#8220;\/socket.io\/socket.io.js&#8221;<\/em>&gt;&lt;\/script&gt;<\/p>\n<p>&lt;script\u00a0src=<em>&#8220;\/\/code.jquery.com\/jquery-1.11.0.min.js&#8221;<\/em>&gt;&lt;\/script&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;\/head&gt;<\/p>\n<p>&lt;body&gt;<\/p>\n<p>&lt;b&gt;Send message&lt;\/b&gt;&lt;p&gt;<\/p>\n<p>Message\u00a0\u00a0&lt;input\u00a0type=<em>&#8220;text&#8221;<\/em>\u00a0id=<em>&#8220;msgbox&#8221;<\/em>\/&gt;<\/p>\n<p>&lt;br&gt;<\/p>\n<p>&lt;span\u00a0id=<em>&#8220;msgs&#8221;<\/em>&gt;&lt;\/span&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;script\u00a0type=<em>&#8220;text\/javascript&#8221;<\/em>&gt;<\/p>\n<p><strong>var<\/strong>\u00a0socket = io.connect(&#8216;http:\/\/localhost&#8217;);<\/p>\n<p>$(&#8220;#msgbox&#8221;).keyup(<strong>function<\/strong>(event) {<\/p>\n<p><strong>if<\/strong>\u00a0(event.which == 13) {<\/p>\n<p>socket.emit(&#8216;fromclient&#8217;,{msg:$(&#8216;#msgbox&#8217;).val()});<\/p>\n<p>$(&#8216;#msgbox&#8217;).val(&#8221;);<\/p>\n<p>}<\/p>\n<p>});<\/p>\n<p>socket.on(&#8216;toclient&#8217;,<strong>function<\/strong>(data){<\/p>\n<p>console.log(data.msg);<\/p>\n<p>$(&#8216;#msgs&#8217;).append(data.msg+'&lt;BR&gt;&#8217;);<\/p>\n<p>});<\/p>\n<p>&lt;\/script&gt;<\/p>\n<p>&lt;\/body&gt;<\/p>\n<p>&lt;\/html&gt;<\/p><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&lt;\ucf54\ub4dc. index.html&gt;<\/p>\n<p>\uba3c\uc800\u00a0socket.io\ub97c\u00a0\uc0ac\uc6a9\ud558\uae30\u00a0\uc704\ud574\uc11c\u00a0script src\ub97c\u00a0\uc544\ub798\uc640\u00a0\uac19\uc774\u00a0\uc815\uc758\ud558\uace0<\/p>\n<p>&lt;script\u00a0src=<em>&#8220;\/socket.io\/socket.io.js&#8221;<\/em>&gt;&lt;\/script&gt;<\/p>\n<p>\ub2e4\uc74c\uc73c\ub85c,\u00a0\uc790\ubc14\u00a0\uc2a4\ud06c\ub9bd\ud2b8\uac00\u00a0\uc2e4\ud589\ub418\uba74, socket.io\u00a0\uc11c\ubc84\ub85c\u00a0\uc5f0\uacb0\uc744\u00a0\ud55c\ub2e4.<\/p>\n<p><strong>var<\/strong>\u00a0socket = io.connect(&#8216;http:\/\/localhost&#8217;);<\/p>\n<p>\uadf8\ub9ac\uace0, input box\uc5d0\uc11c\u00a0\uc5d4\ud130\ub97c\u00a0\ub204\ub974\uba74, input box\uc758\u00a0\uba54\uc2dc\uc9c0\ub97c\u00a0\uc77d\uc5b4\uc11c, \u2018fromclient\u2019\ub77c\ub294\u00a0\uc774\ubca4\ud2b8\ub97c\u00a0\uc11c\ubc84\uc5d0\u00a0\uc804\uc1a1\ud55c\ub2e4.<\/p>\n<p>socket.emit(&#8216;fromclient&#8217;,{msg:$(&#8216;#msgbox&#8217;).val()});<\/p>\n<p>\uadf8\ub9ac\uace0\u00a0\ubc18\ub300\ub85c,\u00a0\uc11c\ubc84\ub85c\ubd80\ud130, \u2018toclient\u2019\ub77c\ub294\u00a0\uc774\ubca4\ud2b8\uac00\u00a0\ub4e4\uc5b4\uc624\uba74,\u00a0\ub4e4\uc5b4\uc628\u00a0\ubb38\uc790\uc5f4\uc744\u00a0msgs\ub77c\ub294\u00a0id\ub97c\u00a0\uac16\ub294\u00a0&lt;span&gt;\u00a0\uc601\uc5ed\uc5d0\u00a0append\u00a0\ud55c\ub2e4.<\/p>\n<p>socket.on(&#8216;toclient&#8217;,<strong>function<\/strong>(data){<\/p>\n<p>console.log(data.msg);<\/p>\n<p>$(&#8216;#msgs&#8217;).append(data.msg+'&lt;BR&gt;&#8217;);<\/p>\n<p>\ud074\ub77c\uc774\uc5b8\ud2b8\uc640\u00a0\uc11c\ubc84\ucabd\u00a0\ucf54\ub4dc\uac00\u00a0\ub2e4\u00a0\uc644\uc131\ub418\uc5c8\uc73c\uba74,\u00a0\uc774\ub97c\u00a0\ubc30\ud3ec\ud558\uace0\u00a0node.js\ub97c\u00a0\uc2e4\ud589\ud574\uc11c\u00a0\ud14c\uc2a4\ud2b8\ub97c\u00a0\ud574\ubcf4\uc790.<\/p>\n<p>&lt;\uadf8\ub9bc. socket.io\ub97c\u00a0\uc774\uc6a9\ud55c\u00a0\ucc44\ud305\u00a0\ud504\ub85c\uadf8\ub7a8\u00a0\ud654\uba74&gt;<\/p>\n<p>\ub2e4\uc74c\uc5d0\ub294 Socket.IO API\ub4e4\uc5d0 \ub300\ud55c \uc18c\uac1c\uc640 1:1 \uadd3\uc18d\ub9d0, \uadf8\ub9ac\uace0 \uadf8\ub8f9\uc758 \uac1c\ub150\uc744 \uac00\uc9c0\ub294 \ucc44\ud305\ubc29 \uc608\uc81c\uc5d0 \ub300\ud574\uc11c \uc124\uba85\ud558\ub3c4\ub85d \ud55c\ub2e4.<\/p>\n<h3>Socket.IO APIs<\/h3>\n<p>Socket.IO\ub294\u00a0\uc774\ubc16\uc5d0\ub3c4\u00a0\ub2e4\uc591\ud55c\u00a0\uc774\ubca4\ud2b8\ub97c\u00a0\uc804\ub2ec\ud560\u00a0\uc218\u00a0\uc788\ub294\u00a0API\ub97c\u00a0\uc81c\uacf5\ud558\ub294\ub370,\u00a0\uc774\uc5d0\u00a0\ub300\ud574\uc11c\u00a0\uc0b4\ud3b4\ubcf4\uc790.<\/p>\n<p>\uc5ec\uae30\uc11c\u00a0\uc0ac\uc6a9\ud558\ub294\u00a0socket\uc774\ub77c\ub294\u00a0\uac1d\uccb4\ub294<\/p>\n<p>io.sockets.on(&#8216;connection&#8217;,<strong>function<\/strong>(<em>socket<\/em>){<\/p>\n<p>\uc5d0\u00a0\uc758\ud574\uc11c\u00a0callback function\uc5d0\u00a0\uc758\ud574\uc11c\u00a0\uc804\ub2ec\ub41c\u00a0\uc778\uc790\uc784\uc744\u00a0\ubbf8\ub9ac\u00a0\uba85\uc2dc\ud574\ub454\ub2e4.<\/p>\n<ol>\n<li><strong>\uc774\ubca4\ud2b8\ubcf4\ub0b4\uae30\u00a0\ubc1b\uae30<\/strong><\/li>\n<\/ol>\n<p>\uba3c\uc800\u00a0\uc18c\ucf13\uc73c\ub85c\u00a0\ub610\ub294\ubd80\ud130\u00a0\uc774\ubca4\ud2b8\ub97c\u00a0\ubcf4\ub0b4\uace0\u00a0\ubc1b\ub294\u00a0\ubc29\ubc95\ubd80\ud130\u00a0\uc54c\uc544\ubcf4\uc790.\uc55e\uc5d0\u00a0\uc608\uc81c\uc5d0\uc11c\ub3c4\u00a0\ubd24\uc9c0\ub9cc\u00a0\uac00\uc7a5\u00a0\uac04\ub2e8\ud55c\u00a0\ubc29\ubc95\uc740<\/p>\n<p><strong>\u009f\u00a0 *\u00a0\uc774\ubca4\ud2b8 \ubcf4\ub0b4\uae30\u00a0socket.emit(&#8216;\uc774\ubca4\ud2b8\uba85&#8217;,{\uba54\uc138\uc9c0<\/strong><strong>});<\/strong><\/p>\n<p>\ud604\uc7ac \uc5f0\uacb0\ub418\uc5b4 \uc788\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8 \uc18c\ucf13\uc5d0 \u201c\uc774\ubca4\ud2b8\uba85\u201d\uc73c\ub85c \u201c{\uba54\uc2dc\uc9c0}\u201d \ub370\uc774\ud130\ub85c \uc774\ubca4\ud2b8\ub97c \ubcf4\ub0b8\ub2e4.<\/p>\n<p>\u009f\u00a0<strong>\u00a0* \u00a0<\/strong><strong>\uc774\ubca4\ud2b8\u00a0\ubc1b\uae30\u00a0socket.on(&#8216;\uc774\ubca4\ud2b8\uba85&#8217;,function(data){ });<\/strong><\/p>\n<p>\ud604\uc7ac\u00a0\uc5f0\uacb0\ub418\uc5b4\u00a0\uc788\ub294\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\u00a0\uc18c\ucf13\uc73c\ub85c\ubd80\ud130\u00a0\ub4e4\uc5b4\uc624\ub294\u00a0\u201c\uc774\ubca4\ud2b8\uba85\u201d\uc774\ubca4\ud2b8\uc5d0\u00a0\ub300\ud574\uc11c\u00a0\ub450\ubc88\uc9f8\u00a0\uc778\uc790\ub85c\u00a0\uc815\uc758\ub41c\u00a0callback function\uc5d0\u00a0\uc758\ud574\uc11c\u00a0\uc774\ubca4\ud2b8\uc5d0\u00a0\ub300\ud55c\u00a0\ucc98\ub9ac\ub97c\u00a0\ud55c\ub2e4.\u00a0\uc774\ub54c\u00a0\uc774\ubca4\ud2b8\u00a0\uba54\uc2dc\uc9c0\ub294\u00a0callback function\uc758\uc778\uc790\uc778\u00a0\u201cdata\u201d\ub97c\u00a0\ud1b5\ud574\uc11c\u00a0\uc804\ub2ec\ub41c\ub2e4.<\/p>\n<p>\ud558\ub098\uc758\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\uac00\u00a0\uc544\ub2c8\ub77c\u00a0\ub2e4\uc218\uc758\u00a0\ub2e4\ub978\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\ub098\u00a0\ub610\ub294\u00a0\ub2e4\ub978\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\u00a0\uc774\ubca4\ud2b8\ub97c\u00a0\uc5b4\ub5bb\uac8c\u00a0\ubcf4\ub0b4\ub294\uc9c0\u00a0\uc54c\uc544\ubcf4\uc790<\/p>\n<p><strong>\u009f\u00a0 *\u00a0\ub098\ub97c \uc81c\uc678\ud55c \ub2e4\ub978 \ud074\ub77c\uc774\uc5b8\ud2b8\ub4e4\uc5d0\uac8c \uc774\ubca4\ud2b8 \ubcf4\ub0b4\uae30\u00a0socket.broadcast.emit(&#8216;\uc774\ubca4\ud2b8\uba85&#8217;,{\uba54\uc138\uc9c0});<\/strong><\/p>\n<p>socket\uc5d0\u00a0\ub300\ud574\uc11c\u00a0broadcast\ub97c\u00a0\ud558\uba74,\u00a0\ub098\ub97c\u00a0\uc81c\uc678\ud55c\u00a0\ub2e4\ub978\u00a0\uc18c\ucf13\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\ub4e4\uc5d0\uac8c\u00a0\uc774\ubca4\ud2b8\ub97c\u00a0\ubcf4\ub0bc\u00a0\uc218\u00a0\uc788\ub2e4.<\/p>\n<p>\u009f\u00a0<strong>\u00a0*\u00a0<\/strong><strong>\ub098\ub97c\u00a0\ud3ec\ud568\ud55c\u00a0\ubaa8\ub4e0\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\ub4e4\uc5d0\uac8c\u00a0\uc774\ubca4\ud2b8\u00a0\ubcf4\ub0b4\uae30io.sockets.emit(&#8216;\uc774\ubca4\ud2b8\uba85&#8217;,function(data){ });<\/strong><\/p>\n<p>\uac1c\ubcc4\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\u00a0\uc18c\ucf13\uc744\u00a0\ub300\ud45c\ud558\ub294\u00a0\uac1d\uccb4\uac00\u00a0socket\uc774\ub77c\uba74,\u00a0\uc804\uccb4\u00a0\uc5f0\uacb0\ub41c\u00a0socket\ub4e4\uc744\u00a0\ub300\ud45c\ud558\ub294\u00a0\uac1d\uccb4\ub294io.sockets\uc774\ub2e4.\u00a0\uc5ec\uae30\uc11c\ub294\u00a0io.sockets.emit\ub97c\u00a0\uc0ac\uc6a9\ud588\ub294\ub370,\u00a0\uc774\ub294\u00a0\uc804\uccb4\u00a0\uc5f0\uacb0\ub41c\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\u00a0\uc18c\ucf13\uc5d0\u00a0\ub300\ud574\uc11c\uc774\ubca4\ud2b8\ub97c\u00a0\ubcf4\ub0b4\ub3c4\ub85d\u00a0\ud55c\u00a0\uac83\uc774\ub2e4.<\/p>\n<p>\ub0b4\u00a0\uc18c\ucf13\uc774\u00a0\uc544\ub2cc\u00a0\ub2e4\ub978\u00a0\ud2b9\uc815\u00a0\uc18c\ucf13\uc5d0\uac8c\u00a0\uc774\ubca4\ud2b8\ub97c\u00a0\ubcf4\ub0b4\ub294\u00a0\ubc29\ubc95\uc774\u00a0\uc788\ub294\ub370,<\/p>\n<p>\u009f\u00a0 *<strong>\u00a0<\/strong><strong>io.sockets(socket_id).emit(&#8216;\uc774\ubca4\ud2b8\uba85&#8217;,function(data){ });<\/strong><\/p>\n<p>\ub97c\u00a0\uc0ac\uc6a9\ud558\uba74\u00a0\ub41c\ub2e4.\u00a0\uc774\ub54c\u00a0socket_id\ub294\u00a0socket.id\u00a0\uac12\uc73c\ub85c\u00a0\uac01\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\u00a0\uc18c\ucf13\uc740\u00a0id\ub77c\ub294\u00a0property\ub97c\u00a0\uac00\uc9c0\uace0\uc788\uace0,\u00a0\uc774\ub294\u00a0\uac01\u00a0\uc18c\ucf13\uc744\u00a0\uad6c\ubcc4\ud574\uc8fc\ub294\u00a0\uc2dd\ubcc4\uc790\uac00\u00a0\ub41c\ub2e4.\u00a0\uadf8\ub098\uc911\uc5d0\u00a0\uc608\uc81c\uc5d0\uc11c\u00a0\uc124\uba85\ud558\uaca0\uc9c0\ub9cc,\u00a0\ucc44\ud305\u00a0\uadd3\uc18d\ub9d0\uacfc\u00a0\uac19\uc774\ud2b9\uc815\u00a0\uc18c\ucf13\uc73c\ub85c\u00a0\uba54\uc2dc\uc9c0\ub97c\u00a0\ubcf4\ub0b4\ub824\uba74,\u00a0\uba54\uc2dc\uc9c0\ub97c\u00a0\uc804\ub2ec\ud558\ub294\u00a0\ub300\uc0c1\uc774\u00a0\ub418\ub294\u00a0\uc18c\ucf13\uc758\u00a0id\uac12\uc744\u00a0\uc54c\uc544\uc11c\u00a0\uc704\uc758io.socket(socket_id)\ub85c\u00a0\uc774\ubca4\ud2b8\ub97c\u00a0\uc804\ub2ec\ud574\uc57c\u00a0\ud55c\ub2e4.<\/p>\n<ol start=\"2\">\n<li><strong>\uc18c\ucf13\uc5d0\u00a0\ub370\uc774\ud130\u00a0\ubc14\uc778\ub529<\/strong><\/li>\n<\/ol>\n<p>\uac01\u00a0\uc18c\ucf13\uc5d0\ub294\u00a0\uc18c\ucf13\uc5d0\u00a0\uc5f0\uad00\ub41c\u00a0\ub370\uc774\ud130\ub97c\u00a0set\u00a0\uba54\uc11c\ub4dc\ub97c\u00a0\uc774\uc6a9\ud574\uc11c\u00a0binding\ud558\uace0, get\uc744\u00a0\uc774\uc6a9\ud574\uc11c\u00a0binding\u00a0\ub41c\u00a0\ub370\uc774\ud130\ub97c\uaebc\ub0bc\u00a0\uc218\u00a0\uc788\ub2e4.<\/p>\n<p>\u009f\u00a0 \u00a0*\u00a0<strong>socket.set(\u2018key\u2019, \u2018value\u2019,function() {});<\/strong><\/p>\n<p><strong>\u009f\u00a0 \u00a0<\/strong>*\u00a0<strong>socket.get(\u2018key\u2019,\u00a0function(err,value) {});<\/strong><\/p>\n<p><strong>\u009f\u00a0 \u00a0<\/strong>*\u00a0<strong>socket.del(\u2018key\u2019,\u00a0function(err,value) {});<\/strong><\/p>\n<p>\uac12\uc73c \uc800\uc7a5\ud560\ub54c\ub294\u00a0set\uc744 \uc774\uc6a9\ud558\uc5ec\u00a0socket\uc5d0\u00a0key\uac12\uc744 \ud0a4\ub85c \uc0ac\uc6a9\ud558\uc5ec\u00a0value\ub77c\ub294 \ub370\uc774\ud130\ub97c \uc800\uc7a5\ud55c\ub2e4.\u00a0\uac12\uc744 \uc77d\uc5b4\uc62c \ub54c\ub294\u00a0get\uc744 \uc774\uc6a9\ud558\uc5ec\u00a0socket\uc5d0 \uc800\uc7a5\ub41c\u00a0key\uc774\ub984\uc73c\ub85c \uc800\uc7a5\ub41c \uac12\uc744\u00a0value\ub97c \ud1b5\ud574\uc11c \ub9ac\ud134\ud55c\ub2e4.\uadf8\ub9ac\uace0 \ud574\ub2f9\uac12\uc744 \uc0ad\uc81c\ud558\uace0\uc790 \ud560\ub54c\ub294\u00a0del\uc744 \uc774\uc6a9\ud558\uc5ec\u00a0socket\uc5d0\u00a0key\uc774\ub984\uc73c\ub85c \uc800\uc7a5\ub41c \uac12\uc744 \uc0ad\uc81c\ud55c\ub2e4.<\/p>\n<p>socket\ub3c4 \uac1d\uccb4\uc774\uae30 \ub54c\ubb38\uc5d0\u00a0Object\uc758\u00a0property\ub97c \uc0ac\uc6a9\ud574\ub3c4 \ub418\ub294\ub370,\u00a0\uc608\ub97c \ub4e4\uc5b4\u00a0socket.key = value\u00a0\uc65c \uad73\uc774set\/get\uc744 \uc0ac\uc6a9\ud560\uae4c? socket.io\uc758\u00a0set\/get\u00a0\ub0b4\ubd80 \uad6c\ud604\uc744 \ub72f\uc5b4\ubcf4\uba74 \uc2e4\uc81c\ub85c\ub294\u00a0Object\uc758\u00a0property\ub97c \uc0ac\uc6a9\ud55c\ub2e4.\u00a0\ub2e8socket.io\uc758\u00a0store\ub97c\u00a0Redis\ub85c \uc9c0\uc815\ud558\uac8c \ub418\uba74,\u00a0\uc774\u00a0set\/get\uc740 \uac12\uc744 \ub0b4\ubd80\u00a0Object property\uc5d0 \uc800\uc7a5\ud558\uc9c0 \uc54a\uace0, Redis\uc5d0 \uc800\uc7a5\ud558\uac8c \ub418\uc11c,\u00a0\uc774 \uac12\ub4e4\uc740 \ud074\ub7ec\uc2a4\ud130 \ub178\ub4dc\u00a0(\ub2e4\ub978 \ub178\ub4dc\uac04)\uc5d0\uc11c\ub3c4 \uc811\uadfc\uc774 \uac00\ub2a5\ud574\uc9c4\ub2e4.<\/p>\n<ol start=\"3\">\n<li><strong>Room\u00a0\ucc98\ub9ac\u00a0(\uadf8\ub8f9<\/strong><strong>)<\/strong><\/li>\n<\/ol>\n<p>socket.io\ub294\u00a0\uc18c\ucf13\ub4e4\uc744\u00a0\uadf8\ub8f9\ud551\ud558\ub294\u00a0\ucc44\ub110\uacfc\u00a0\uac19\uc740\u00a0\uac1c\ub150\uc778\u00a0\u2018room\u2019\uc774\ub77c\ub294\u00a0\uac1c\ub150\uc744\u00a0\uc9c0\uc6d0\ud55c\ub2e4.\u00a0\ucc44\ud305\u00a0\ud504\ub85c\uadf8\ub7a8\uc758\u00a0\ub300\ud654\ubc29\uacfc\u00a0\uac19\uc740\u00a0\uac1c\ub150\uc774\ub2e4. Room\uc744\u00a0\uc0ac\uc6a9\ud558\uac8c\u00a0\ub418\uba74\u00a0broadcast\ub97c\u00a0\ud558\ub354\ub77c\ub3c4\u00a0\uac19\uc740\u00a0room\uc548\uc5d0\u00a0\uc788\ub294\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uac8c\ub9cc\u00a0\uc774\ubca4\ud2b8\uac00\u00a0\uc804\uc1a1\ub41c\ub2e4.<\/p>\n<p>\u009f\u00a0\u00a0<strong>\u00a0<\/strong><strong>*\u00a0socket.join(\u2018roon name\u2019)<\/strong><\/p>\n<p><strong>\u009f\u00a0 \u00a0*\u00a0socket.leave(\u2018roon name\u2019)<\/strong><\/p>\n<p>\uc18c\ucf13\uc744\u00a0\ud2b9\uc815\u00a0room\uc5d0\u00a0binding\ud558\ub294\u00a0\ubc29\ubc95\uc740\u00a0join\uc744\u00a0\uc774\uc6a9\ud558\uba74\u00a0\ud574\ub2f9\u00a0\uc18c\ucf13\uc740\u00a0\uadf8\u00a0room\uc5d0\u00a0binding\uc774\u00a0\ub418\uace0, leave\ub97c\u00a0\ud558\uba74\u00a0\uadf8\u00a0room\uc5d0\uc11c\ubd80\ud130\u00a0\ub098\uc624\uac8c\u00a0\ub41c\ub2e4.<\/p>\n<p>\ud2b9\uc815\u00a0room\uc5d0\u00a0\uc788\ub294\u00a0socket\uc5d0\uac8c\u00a0\uc774\ubca4\ud2b8\ub97c\u00a0\ubcf4\ub0b4\ub294\u00a0\uac83\uc740\u00a0\uc55e\uc5d0\u00a0\uc124\uba85\ud55c\u00a0\ub611\uac19\uc774\u00a0socket.emit\uc744\u00a0\uc0ac\uc6a9\ud558\uba74\u00a0\ub418\ub294\ub370, broadcast\ub97c\u00a0\ud558\uac70\ub098\u00a0room\uc548\uc5d0\u00a0\uc788\ub294\u00a0\uc804\uccb4\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\u00a0\uc18c\ucf13\uc5d0\uac8c\u00a0\uc774\ubca4\ud2b8\ub97c\u00a0\ubcf4\ub0bc\ub54c\ub294\u00a0\uc544\ub798\uc640\u00a0\uac19\uc774\u00a0room\uc744\u00a0\uba85\uc2dc\ud574\uc8fc\uba74\u00a0\ub41c\ub2e4<\/p>\n<p><strong>\u009f\u00a0 \u00a0*\u00a0io.sockets.in(\u2018roon name\u2019).emit(\u2018event\u2019,message)<\/strong><\/p>\n<p>\u2018room name\u2019 room\uc548\uc5d0\u00a0\uc788\ub294\u00a0\ubaa8\ub4e0\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\ub4e4\uc5d0\uac8c\u00a0\uc774\ubca4\ud2b8\u00a0\ubcf4\ub0b4\uae30<\/p>\n<p><strong>\u009f\u00a0 \u00a0*\u00a0socket.broadcast.to(\u2018roon name\u2019).emit(\u2018event\u2019,message)<\/strong><\/p>\n<p>\u2018room name\u2019\uc758\u00a0room\u00a0\uc548\uc5d0\u00a0\uc788\ub294\u00a0\ub098\ub97c\u00a0\uc81c\uc678\ud55c\u00a0\ub2e4\ub978\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\ub4e4\uc5d0\uac8c\u00a0\uc774\ubca4\ud2b8\u00a0\ubcf4\ub0b4\uae30<\/p>\n<p>\ub610\ud55c\u00a0\ud604\uc7ac\u00a0\uc0dd\uc131\ub418\uc5b4\u00a0\uc788\ub294\u00a0room\uc5d0\u00a0\ub300\ud55c\u00a0\uc815\ubcf4\ub97c\u00a0\uc77d\uc5b4\uc624\ub294\u00a0\ubc29\ubc95\uc774\u00a0\uba87\uac00\uc9c0\uac00\u00a0\uc788\ub294\ub370,<\/p>\n<p><strong>\u009f\u00a0\u00a0*\u00a0io.sockets.manager.rooms<\/strong><\/p>\n<p>\ud604\uc7ac\u00a0\uc0dd\uc131\ub418\uc5b4\u00a0\uc788\ub294\u00a0\ubaa8\ub4e0\u00a0room\uc758\u00a0\ubaa9\ub85d\uc744\u00a0\ub9ac\ud134\ud55c\ub2e4.<\/p>\n<p><strong>\u009f\u00a0\u00a0*\u00a0io.sockets.clients(\u2018roon name\u2019)<\/strong><\/p>\n<p>\u2018room name\u2019\uc758\u00a0room\u00a0\uc548\uc5d0\u00a0\uc788\ub294\u00a0\ubaa8\ub4e0\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\u00a0\uc18c\ucf13\u00a0\ubaa9\ub85d\uc744\u00a0\ub9ac\ud134\ud55c\ub2e4.<\/p>\n<p>\uba87\uac00\uc9c0\u00a0\uc8fc\uc694\u00a0\uba54\uc11c\ub4dc\ub4e4\uc744\u00a0\uc131\uba85\ud558\uc600\uc9c0\ub9cc,\u00a0\uc5ec\uae30\uc11c\u00a0\uc124\uba85\ud55c\u00a0\uac83\uc740\u00a0\uc77c\ubd80\uc5d0\u00a0\ubd88\uacfc\ud558\ub2e4.\u00a0\uc0c1\uc138\ud55c\u00a0\ub0b4\uc6a9\ub4e4\uc740\u00a0\uc544\ub798\u00a0\ub0b4\uc6a9\uc744\u00a0\ucc38\uace0\ud558\uae30\u00a0\ubc14\ub780\ub2e4.<\/p>\n<p>\uc0c1\uc138\ud55c\u00a0Configuration\u00a0\ucc98\ub9ac\u00a0<a href=\"https:\/\/github.com\/LearnBoost\/Socket.IO\/wiki\/Configuring-Socket.IO\">https:\/\/github.com\/LearnBoost\/Socket.IO\/wiki\/Configuring-Socket.IO<\/a><\/p>\n<p>\uc774\ubca4\ud2b8\u00a0\uc885\ub958(disconnect\u00a0\ub4f1)\u00a0<a href=\"https:\/\/github.com\/LearnBoost\/socket.io\/wiki\/Exposed-events\">https:\/\/github.com\/LearnBoost\/socket.io\/wiki\/Exposed-events<\/a><\/p>\n<p>\uc790\uc544\u00a0\uadf8\ub7ec\uba74\u00a0\uc18c\uac1c\ub41c\u00a0\uba54\uc11c\ub4dc\ub4e4\uc744\u00a0\uac00\uc9c0\uace0,\u00a0\uc55e\uc5d0\uc11c\u00a0\ub9cc\ub4e0\u00a0\ucc44\ud305\u00a0\ud504\ub85c\uadf8\ub7a8\uc758\u00a0\uae30\ub2a5\uc744\u00a0\ub354\ud574\ubcf4\ub3c4\ub85d\u00a0\ud558\uc790.<\/p>\n<p>&nbsp;<\/p>\n<h3>\uc791\uc131\ud55c \ub300\ud654\ubc29\u00a0http:\/\/bcho.tistory.com\/896\u00a0\uc5d0 \uc774\uc5b4\uc11c \uc774\ubc88\uc5d0\ub294 1:1 \uadd3\uc18d\ub9d0 \ub300\ud654\uac00 \uac00\ub2a5\ud55c \uae30\ub2a5\uc744 \ucd94\uac00\ud574\ubcf4\uc790<\/h3>\n<h3>\uadd3\uc18d\ub9d0\uc774 \uac00\ub2a5\ud55c \ub300\ud654\ubc29<\/h3>\n<p>\uc774\ubc88\uc5d0\ub294 \ud2b9\uc815 \uc0ac\uc6a9\uc790\uac00 \ub2e4\ub978 \uc0ac\uc6a9\uc790\uc5d0\uac8c \uadd3\uc18d\ub9d0\uc744 \ubcf4\ub0b4\ub294 \uae30\ub2a5\uc744 \uac00\uc9c0\ub294 \ub300\ud654\ubc29\uc744 \ub9cc\ub4e4\uc5b4\ubcf4\uc790.\u00a0\uc774\ub97c \ud1b5\ud574\uc11c \ud2b9\uc815 \ud074\ub77c\uc774\uc5b8\ud2b8 \uc18c\ucf13\uc5d0 \uba54\uc138\uc9c0\ub97c \uc5b4\ub5bb\uac8c \ubcf4\ub0b4\ub294\uc9c0\ub97c \ubc30\uc6b8 \uc218 \uc788\ub2e4.<\/p>\n<p>\uc774 \ub300\ud654\ubc29\uc758 \uae30\ub2a5\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<ul>\n<li>\u009f\u00a0\u00a0\u00a0\ub300\ud654\ubc29\uc5d0 \uc785\uc7a5\ud558\ub294 \uc190\ub2d8\ub4e4\uc740 \uc790\ub3d9\uc73c\ub85c \ub300\ud654\uba85\uc744 \ubd80\uc5ec \ubc1b\ub294\ub2e4.<\/li>\n<li>\u009f\u00a0\u00a0\u00a0\uc0ac\uc6a9\uc790\ub294 \ub300\ud654\uba85\uc744 \ubc14\uafc0 \uc218 \uc788\ub2e4.<\/li>\n<li>\u009f\u00a0\u00a0\u00a0\uc0ac\uc6a9\uc790\ub294 \ub300\ud654 \uc218\uc2e0\uc790\uc758 \ub300\ud654\uba85\uc744 \uc120\ud0dd\ud558\uc5ec \ud2b9\uc815 \uc0ac\uc6a9\uc790\uc5d0\uac8c \uadd3\uc18d\ub9d0\uc744 \ubcf4\ub0bc \uc218 \uc788\ub2e4.<\/li>\n<\/ul>\n<p>\ucf54\ub4dc\ub97c \ubcf4\uba74\uc11c \uc124\uba85\ud558\ub3c4\ub85d \ud558\uc790.<\/p>\n<p>app.js<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"615\"><strong>var<\/strong>\u00a0express = require(&#8216;express&#8217;);<\/p>\n<p><strong>var<\/strong>\u00a0routes = require(&#8216;.\/routes&#8217;);<\/p>\n<p><strong>var<\/strong>\u00a0http = require(&#8216;http&#8217;);<\/p>\n<p><strong>var<\/strong>\u00a0path = require(&#8216;path&#8217;);<\/p>\n<p>&nbsp;<\/p>\n<p><strong>var<\/strong>\u00a0app = express();<\/p>\n<p>app.use(express.<strong>static<\/strong>(path.join(__dirname,\u00a0&#8216;public&#8217;)));<\/p>\n<p>&nbsp;<\/p>\n<p><strong>var<\/strong>\u00a0httpServer =http.createServer(app).listen(3000,\u00a0<strong>function<\/strong>(req,res){<\/p>\n<p>console.log(&#8216;Socket IO server has been started&#8217;);<\/p>\n<p>});<\/p>\n<p>\/\/ upgrade http server to socket.io server<\/p>\n<p><strong>var<\/strong>\u00a0io = require(&#8216;socket.io&#8217;).listen(httpServer);<\/p>\n<p>&nbsp;<\/p>\n<p><strong>var<\/strong>\u00a0socket_ids = [];<\/p>\n<p><strong>var<\/strong>\u00a0count = 0;<\/p>\n<p>&nbsp;<\/p>\n<p><strong>function<\/strong>\u00a0registerUser(socket,nickname){<\/p>\n<p>\/\/ socket_id\uc640\u00a0nickname\u00a0\ud14c\uc774\ube14\uc744\u00a0\uc14b\uc5c5<\/p>\n<p>socket.get(&#8216;nickname&#8217;,<strong>function<\/strong>(err,pre_nick){<\/p>\n<p><strong>if<\/strong>(pre_nick !=\u00a0<strong>undefined<\/strong>\u00a0)\u00a0<strong>delete<\/strong>\u00a0socket_ids[pre_nick];<\/p>\n<p>socket_ids[nickname] = socket.id<\/p>\n<p>socket.set(&#8216;nickname&#8217;,nickname,<strong>function<\/strong>(){<\/p>\n<p>io.sockets.emit(&#8216;userlist&#8217;,{users:Object.keys(socket_ids)});<\/p>\n<p>});<\/p>\n<p>&nbsp;<\/p>\n<p>});<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>io.sockets.on(&#8216;connection&#8217;,<strong>function<\/strong>(socket){<\/p>\n<p>socket.emit(&#8216;new&#8217;,{nickname:&#8217;GUEST-&#8216;+count});<\/p>\n<p>registerUser(socket,&#8217;GUEST-&#8216;+count);<\/p>\n<p>count++;<\/p>\n<p>&nbsp;<\/p>\n<p>socket.on(&#8216;changename&#8217;,<strong>function<\/strong>(data){<\/p>\n<p>registerUser(socket,data.nickname);<\/p>\n<p>});<\/p>\n<p>socket.on(&#8216;disconnect&#8217;,<strong>function<\/strong>(data){<\/p>\n<p>socket.get(&#8216;nickname&#8217;,<strong>function<\/strong>(err,nickname){<\/p>\n<p><strong>if<\/strong>(nickname !=\u00a0<strong>undefined<\/strong>){<\/p>\n<p><strong>delete<\/strong>\u00a0socket_ids[nickname];<\/p>\n<p>io.sockets.emit(&#8216;userlist&#8217;,{users:Object.keys(socket_ids)});<\/p>\n<p>&nbsp;<\/p>\n<p>}\/\/ if<\/p>\n<p>});<\/p>\n<p>});<\/p>\n<p>socket.on(&#8216;send_msg&#8217;,<strong>function<\/strong>(data){<\/p>\n<p>socket.get(&#8216;nickname&#8217;,<strong>function<\/strong>(err,nickname){<\/p>\n<p>&nbsp;<\/p>\n<p>data.msg = nickname +\u00a0&#8216; : &#8216;+data.msg;<\/p>\n<p><strong>if<\/strong>(data.to ==&#8217;ALL&#8217;) socket.broadcast.emit(&#8216;broadcast_msg&#8217;,data);\u00a0\/\/\u00a0\uc790\uc2e0\uc744\u00a0\uc81c\uc678\ud558\uace0\u00a0\ub2e4\ub978\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uac8c\u00a0\ubcf4\ub0c4<\/p>\n<p><strong>else<\/strong>{<\/p>\n<p>socket_id = socket_ids[data.to];<\/p>\n<p><strong>if<\/strong>(socket_id !=\u00a0<strong>undefined<\/strong>){<\/p>\n<p>io.sockets.socket(socket_id).emit(&#8216;broadcast_msg&#8217;,data);<\/p>\n<p>}\/\/ if<\/p>\n<p>}<\/p>\n<p>socket.emit(&#8216;broadcast_msg&#8217;,data);<\/p>\n<p>});<\/p>\n<p>});<\/p>\n<p>});<\/p><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>\uba3c\uc800\u00a0Express\uc5d0\uc11c\u00a0socket.io\ub97c \uc0ac\uc6a9\ud560 \uc900\ube44\ub97c \ud558\uace0<\/p>\n<p>\ud2b9\uc815 \uc0ac\uc6a9\uc790 \uc989 \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uac8c\ub9cc \uba54\uc138\uc9c0\ub97c \ubcf4\ub0b4\ub824\uba74<\/p>\n<p>io.sockets.socket(socket_id).emit<\/p>\n<p>\uba54\uc138\ub4dc\ub97c \uc0ac\uc6a9\ud574\uc57c \ud55c\ub2e4.\u00a0\ud574\ub2f9 \ud074\ub77c\uc774\uc5b8\ud2b8\uc758\u00a0socket_id\ub97c \uc54c\uc544\uc57c \ud558\uba70,\u00a0\uc6b0\ub9ac\ub294 \ub300\ud654\uba85(\uc774\ud558\u00a0nickname)\uc744 \ud1b5\ud574\uc11c \ud2b9\uc815 \uc0ac\uc6a9\uc790\uc5d0\uac8c \uba54\uc138\uc9c0\ub97c \ubcf4\ub0bc \uac83\uc774\uae30 \ub54c\ubb38\uc5d0\u00a0nickname\u00a0\uc5d0\uc11c\u00a0socket_id\ub85c\uc758 \ub9f5\ud551 \ud14c\uc774\ube14\uc774 \ud544\uc694\ud558\ub2e4.<\/p>\n<p><strong>var<\/strong>\u00a0socket_ids =\u00a0<strong>[]<\/strong><\/p>\n<p>\uc5d0\uc11c\u00a0socket_ids\ub294\u00a0nickname to socket.id\uc5d0 \ub300\ud55c \ub9f5\ud551 \uc815\ubcf4\ub97c \uc800\uc7a5\ud55c\ub2e4.<\/p>\n<p>io.sockets.on(&#8216;connection&#8217;,<strong>function<\/strong>(socket){<\/p>\n<p>socket.emit(&#8216;new&#8217;,{nickname:&#8217;GUEST-&#8216;+count});<\/p>\n<p>registerUser(socket,&#8217;GUEST-&#8216;+count);<\/p>\n<p>count++;<\/p>\n<p>\ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc811\uc18d\ub418\uba74\u00a0new\u00a0\ub77c\ub294 \uc774\ubca4\ud2b8\ub97c \ud1b5\ud574\uc11c\u00a0nickname\uc744 \uc0dd\uc131\ud574\uc11c \ubcf4\ub0b8\ub2e4. nickname\uc740 \uc0ac\uc6a9\uc790\uac00 \uc811\uc18d\ud55c \uc21c\uc11c\ub300\ub85c\u00a0GUEST-0,GUEST-1,\u2026\u00a0\uc2dd\uc73c\ub85c \uc21c\ucc28\uc801\uc73c\ub85c \uc774\ub984\uc744 \ubc30\uc815\ud55c\ub2e4.<\/p>\n<p>\ub2e4\uc74c\uc73c\ub85c,\u00a0\uc0c8\ub85c\uc6b4 \uc0ac\uc6a9\uc790\uac00 \ucd94\uac00\ub418\uc5c8\uc74c\uc744 \uc54c\ub9ac\uace0,\u00a0\ud604\uc7ac \uc0ac\uc6a9\uc790 \ub9ac\uc2a4\ud2b8\ub4e4\uc744 \ubcf4\ub0b4\uc57c \ud558\ub294\ub370,\u00a0\uc774\ub97c\u00a0registerUser\u00a0\uba54\uc11c\ub4dc\uc5d0\uc11c \uc218\ud589\ud55c\ub2e4.<\/p>\n<p><strong>function<\/strong>\u00a0registerUser(socket,nickname){<\/p>\n<p>\/\/ socket_id\uc640\u00a0nickname\u00a0\ud14c\uc774\ube14\uc744\u00a0\uc14b\uc5c5<\/p>\n<p>socket.get(&#8216;nickname&#8217;,<strong>function<\/strong>(err,pre_nick){<\/p>\n<p><strong>if<\/strong>(pre_nick !=\u00a0<strong>undefined<\/strong>\u00a0)\u00a0<strong>delete<\/strong>\u00a0socket_ids[pre_nick];<\/p>\n<p>socket_ids[nickname] = socket.id<\/p>\n<p>socket.set(&#8216;nickname&#8217;,nickname,<strong>function<\/strong>(){<\/p>\n<p>io.sockets.emit(&#8216;userlist&#8217;,{users:Object.keys(socket_ids)});<\/p>\n<p>});<\/p>\n<p>&nbsp;<\/p>\n<p>});<\/p>\n<p>}<\/p>\n<p>\uba3c\uc800\u00a0register user\uc5d0\uc11c\ub294\u00a0socket.get\uc744 \uc774\uc6a9\ud558\uc5ec \ud604\uc7ac\uc758 \ud074\ub77c\uc774\uc5b8\ud2b8 \uc18c\ucf13\uc758\u00a0nickname\uc744\u00a0pre_nick\uc774\ub77c\ub294 \ubcc0\uc218\ub85c \uc77d\uc5b4\uc628\ub2e4.\u00a0\ub300\ud654\uba85\uc774 \ubc14\ub014 \uacbd\uc6b0 \uae30\uc874\uc5d0\u00a0socket_ids\uc5d0 \uae30\uc874\uc758 \ub300\ud654\uba85\uc73c\ub85c \uc800\uc7a5\ub418\uc5b4 \uc788\ub294\u00a0socket.id\ub97c \uc0ad\uc81c\ud558\uae30 \uc704\ud568\uc774\ub2e4.\u00a0\uae30\uc874\uc758 \ub370\uc774\ud0c0\ub97c \uc0ad\uc81c \ud558\uc600\uc73c\uba74, socket_ids\uc5d0\u00a0nickname\uc744\u00a0Key\u00a0\uac12\uc73c\ub85c \ud558\uc5ec, socket.id\ub97c \uc800\uc7a5\ud55c\ub2e4.\u00a0\ub2e4\uc74c. nickname\uc744 \ud574\ub2f9\u00a0socket\uc5d0\u00a0set\uba85\ub839\uc744 \uc774\uc6a9\ud574\uc11c \uc800\uc7a5\ud55c\ud6c4\uc5d0, userlist\ub77c\ub294 \uc774\ubca4\ud2b8\ub97c \ud1b5\ud574\uc11c,\u00a0\ud604\uc7ac \uc811\uc18d\ub41c \uc0ac\uc6a9\uc790\uc758\u00a0nickname\ub4e4\uc744 \ubcf4\ub0b8\ub2e4.\u00a0\uc774\u00a0nickname\ub4e4\uc740\u00a0socket_ids\uc758\u00a0property\uc758 \ud0a4\ub4e4\ub85c \uc800\uc7a5\uc774 \ub418\uc5c8\uae30 \ub54c\ubb38\uc5d0, Object.keys(socket_ids)\ub97c \uc774\uc6a9\ud558\uc5ec\u00a0nickname\u00a0\ub9ac\uc2a4\ud2b8\ub97c \ucd94\ucd9c\ud560 \uc218 \uc788\ub2e4.<\/p>\n<p>\ub9c8\ucc2c\uac00\uc9c0\ub85c,\u00a0\ub300\ud654\uba85\uc774 \ubcc0\uacbd\ub418\uc5c8\uc744 \ub54c\uc5d0\ub3c4\u00a0registerUser\u00a0\ud568\uc218\ub97c \uc774\uc6a9\ud558\uc5ec \uc804\uccb4 \uc0ac\uc6a9\uc790\uc758 \ub9ac\uc2a4\ud2b8\ub97c \uc5c5\ub370\uc774\ud2b8 \ud558\uc5ec \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uac8c \ubcf4\ub0b4\uc900\ub2e4.<\/p>\n<p>socket.on(&#8216;changename&#8217;,<strong>function<\/strong>(data){<\/p>\n<p>registerUser(socket,data.nickname);<\/p>\n<p>});<\/p>\n<p>\ub9cc\uc57d\uc5d0 \ud574\ub2f9 \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \ube0c\ub77c\uc6b0\uc838\ub97c \ub2eb\uc558\uc744 \uacbd\uc6b0\uc5d0\ub294 \ub300\ud654\ubc29\uc744 \ub5a0\ub09c \uac83\uc73c\ub85c \uac04\uc8fc\ud558\uc5ec,\u00a0\u2018disconnect\u2019\uc774\ubca4\ud2b8\uc5d0 \ub300\ud574\uc11c,<\/p>\n<p>socket.on(&#8216;disconnect&#8217;,<strong>function<\/strong>(data){<\/p>\n<p>socket.get(&#8216;nickname&#8217;,<strong>function<\/strong>(err,nickname){<\/p>\n<p><strong>if<\/strong>(nickname !=\u00a0<strong>undefined<\/strong>){<\/p>\n<p><strong>delete<\/strong>\u00a0socket_ids[nickname];<\/p>\n<p>&nbsp;<\/p>\n<p>\ud604\uc7ac\u00a0socket\uc758\u00a0nickname\uc744 \uc77d\uc5b4\uc11c\u00a0socket_ids\uc5d0\uc11c \ud574\ub2f9\u00a0nickname\uc5d0 \ud574\ub2f9 \ud558\ub294 \ub370\uc774\ud0c0\ub97c \uc0ad\uc81c\ud55c \ud6c4\uc5d0,<\/p>\n<p>io.sockets.emit(&#8216;userlist&#8217;,{users:Object.keys(socket_ids)});<\/p>\n<p>\ub97c \uc774\uc6a9\ud558\uc5ec,\u00a0\uc5c5\ub370\uc774\ud2b8\ub41c \uc0ac\uc6a9\uc790 \ubaa9\ub85d\uc744 \ub2e4\uc2dc \ud074\ub77c\uc774\uc5b8\ud2b8\ub4e4\uc774 \uc5c5\ub370\uc774\ud2b8 \ud558\ub3c4\ub85d \uc774\ubca4\ud2b8\ub97c \ubcf4\ub0b8\ub2e4.<\/p>\n<p>\ub9c8\uc9c0\ub9c9\uc73c\ub85c \ud074\ub77c\uc774\uc5b8\ud2b8\ub85c \ubd80\ud130 \ub300\ud654\uba54\uc138\uc9c0\ub97c \ub2e4\ub978 \uc0ac\uc6a9\uc790\uc5d0\uac8c \ub300\ud654 \uba54\uc138\uc9c0\ub97c \ubcf4\ub0b4\ub294\u00a0\u201csend_msg\u201d\u00a0\uc774\ubca4\ud2b8\uac00 \ub4e4\uc5b4\uc654\uc744\ub54c<\/p>\n<p>socket.on(&#8216;send_msg&#8217;,<strong>function<\/strong>(data){<\/p>\n<p>socket.get(&#8216;nickname&#8217;,<strong>function<\/strong>(err,nickname){<\/p>\n<p>&nbsp;<\/p>\n<p>data.msg = nickname +\u00a0&#8216; : &#8216;+data.msg;<\/p>\n<p>\uc5d0\uc11c \ucc98\ub9ac\ud558\ub294\ub370,\u00a0\ud604\uc7ac \ud074\ub77c\uc774\uc5b8\ud2b8\uc758\u00a0nickname\uc744\u00a0socket.get\uc744 \uc774\uc6a9\ud574\uc11c \uc77d\uc5b4\uc640\uc11c \ubcf4\ub0bc \uba54\uc138\uc9c0\ubb38\uc790\uc5f4\uc744\u00a0\u201c\ub300\ud654\uba85\u201d+\u201d\ub300\ud654\ub0b4\uc6a9\u201d\uc73c\ub85c \ub9cc\ub4e4\uc5b4\uc11c \uc800\uc7a5\ud55c\ub2e4.<\/p>\n<p>\ub9cc\uc57d\uc5d0 \uc804\uccb4 \uba54\uc138\uc9c0\uc778 \uacbd\uc6b0\u00a0data.to\u00a0\uac00\u00a0\u2018ALL\u2019\ub85c \ub4e4\uc5b4\uc624\ub294\ub370,\u00a0\uc774\uacbd\uc6b0\u00a0broadcast\ub97c \ud558\uace0<\/p>\n<p><strong>if<\/strong>(data.to ==&#8217;ALL&#8217;) socket.broadcast.emit(&#8216;broadcast_msg&#8217;,data);<\/p>\n<p>\ud2b9\uc815\u00a0nickname\uc774\u00a0data.to\uc5d0 \ub4e4\uc5b4\uc624\ub294 \uacbd\uc6b0 \uadd3\uc18d\ub9d0\ub85c \uac04\uc8fc\ud558\uc5ec, nickname\uc744 \uc774\uc6a9\ud574\uc11c\u00a0socket_ids\ub85c \ubd80\ud130 \ud574\ub2f9\u00a0nickname\uc744 \uc0ac\uc6a9\ud558\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8\uc758\u00a0socket.id\ub97c \uac00\uc838\uc628\ud6c4<\/p>\n<p>socket_id = socket_ids[data.to];<\/p>\n<p><strong>if<\/strong>(socket_id !=\u00a0<strong>undefined<\/strong>){<\/p>\n<p>\ub2e4\uc74c\uc73c\ub85c,\u00a0\ud574\ub2f9\u00a0socket_id\ub85c \uba54\uc138\uc9c0\ub97c \ubcf4\ub0b8\ub2e4.<\/p>\n<p>io.sockets.socket(socket_id).emit(&#8216;broadcast_msg&#8217;,data);<\/p>\n<p>\ub2e4\uc74c\uc740 \uc704\uc758 \uc11c\ubc84\ub97c \uc0ac\uc6a9\ud558\uae30 \uc704\ud55c\u00a0HTML\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8 \ud3fc\uc774\ub2e4.<\/p>\n<p>index.html<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"615\">&lt;html&gt;\n<p>&lt;head&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;title&gt;&lt;\/title&gt;<\/p>\n<p>&lt;script\u00a0src=<em>&#8220;\/socket.io\/socket.io.js&#8221;<\/em>&gt;&lt;\/script&gt;<\/p>\n<p>&lt;script\u00a0src=<em>&#8220;\/\/code.jquery.com\/jquery-1.11.0.min.js&#8221;<\/em>&gt;&lt;\/script&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;\/head&gt;<\/p>\n<p>&lt;body&gt;<\/p>\n<p>&lt;b&gt;Send message&lt;\/b&gt;&lt;p&gt;<\/p>\n<p>Name\u00a0&lt;input\u00a0type=<em>&#8220;text&#8221;<\/em>\u00a0id=<em>&#8220;nickname&#8221;<\/em>\u00a0\/&gt;\u00a0&lt;input\u00a0type=<em>&#8220;button&#8221;<\/em>\u00a0id=<em>&#8220;changename&#8221;<\/em>value=<em>&#8220;Change name&#8221;<\/em>\/&gt;&lt;br&gt;<\/p>\n<p>To<\/p>\n<p>&lt;select\u00a0id=<em>&#8220;to&#8221;<\/em>&gt;<\/p>\n<p>&lt;option\u00a0value=<em>&#8220;ALL&#8221;<\/em>&gt;ALL&lt;\/option&gt;<\/p>\n<p>&lt;\/select&gt;<\/p>\n<p>Message\u00a0\u00a0&lt;input\u00a0type=<em>&#8220;text&#8221;<\/em>\u00a0id=<em>&#8220;msgbox&#8221;<\/em>\/&gt;<\/p>\n<p>&lt;br&gt;<\/p>\n<p>&lt;span\u00a0id=<em>&#8220;msgs&#8221;<\/em>&gt;&lt;\/span&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;script\u00a0type=<em>&#8220;text\/javascript&#8221;<\/em>&gt;<\/p>\n<p><strong>var<\/strong>\u00a0socket = io.connect(&#8216;http:\/\/localhost&#8217;);<\/p>\n<p>$(&#8216;#changename&#8217;).click(<strong>function<\/strong>(){<\/p>\n<p>socket.emit(&#8216;changename&#8217;,{nickname:$(&#8216;#nickname&#8217;).val()});<\/p>\n<p>});<\/p>\n<p>$(&#8220;#msgbox&#8221;).keyup(<strong>function<\/strong>(event) {<\/p>\n<p><strong>if<\/strong>\u00a0(event.which == 13) {<\/p>\n<p>socket.emit(&#8216;send_msg&#8217;,{to:$(&#8216;#to&#8217;).val(),msg:$(&#8216;#msgbox&#8217;).val()});<\/p>\n<p>$(&#8216;#msgbox&#8217;).val(&#8221;);<\/p>\n<p>}<\/p>\n<p>});<\/p>\n<p>socket.on(&#8216;new&#8217;,<strong>function<\/strong>(data){<\/p>\n<p>console.log(data.nickname);<\/p>\n<p>$(&#8216;#nickname&#8217;).val(data.nickname);<\/p>\n<p>});<\/p>\n<p>&nbsp;<\/p>\n<p>\/\/\u00a0\uc0c8\ub85c\uc6b4\u00a0\uc0ac\uc6a9\uc790\uac00\u00a0\ub4e4\uc5b4\uc624\uac70\ub098,\u00a0\uc0ac\uc6a9\uc790\uac00\u00a0\uc774\ub984\uc744\u00a0\ubc14\uafe8\uc744\ub54c\u00a0&#8220;To&#8221;\u00a0\ub9ac\uc2a4\ud2b8\ub97c\u00a0\ubcc0\uacbd\ud568<\/p>\n<p>socket.on(&#8216;userlist&#8217;,<strong>function<\/strong>(data){<\/p>\n<p><strong>var<\/strong>\u00a0users = data.users;<\/p>\n<p>console.log(users);<\/p>\n<p>console.log(data.users.length);<\/p>\n<p>$(&#8216;#to&#8217;).empty().append(&#8216;&lt;option value=&#8221;ALL&#8221;&gt;ALL&lt;\/option&gt;&#8217;);<\/p>\n<p><strong>for<\/strong>(<strong>var<\/strong>\u00a0i=0;i&lt;data.users.length;i++){<\/p>\n<p>$(&#8216;#to&#8217;).append(&#8216;&lt;option value=&#8221;&#8216;+users[i]+'&#8221;&gt;&#8217;+users[i]+&#8221;&lt;\/option&gt;&#8221;);<\/p>\n<p>}<\/p>\n<p>});<\/p>\n<p>&nbsp;<\/p>\n<p>socket.on(&#8216;broadcast_msg&#8217;,<strong>function<\/strong>(data){<\/p>\n<p>console.log(data.msg);<\/p>\n<p>$(&#8216;#msgs&#8217;).append(data.msg+'&lt;BR&gt;&#8217;);<\/p>\n<p>});<\/p>\n<p>&lt;\/script&gt;<\/p>\n<p>&lt;\/body&gt;<\/p>\n<p>&lt;\/html&gt;<\/p><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\uc55e\uc5d0\uc11c \uc791\uc131\ud55c \ucc44\ud305 \ud504\ub85c\uadf8\ub7a8\uacfc \ud06c\uac8c \ub2e4\ub97c\ubc14\ub294 \uc5c6\uc73c\ub098, new\u00a0\uc774\ubca4\ud2b8\uc640\u00a0userlist\u00a0\uc774\ubca4\ud2b8 \ud578\ub4e4\ub7ec\uac00 \ucd94\uac00\ub418\uc5c8\ub2e4.<\/p>\n<p>\u2018new\u2019\u00a0\uc774\ubca4\ud2b8\ub294 \ucc44\ud305\ubc29\uc5d0 \ub4e4\uc5b4\uc654\uc744\ub54c,\u00a0\uc11c\ubc84\ub85c \ubd80\ud130 \ub300\ud654\uba85\uacfc \ud568\uaed8 \ubcf4\ub0b4\uc9c0\uba70,\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uc11c\ub294 \uc774 \ub300\ud654\uba85\uc744 \ubc1b\uc544\uc11c, \u201c\ub300\ud654\uba85 \ucc3d\u201d\ubd80\ubd84\uc5d0 \uc138\ud305 \ud55c\ub2e4.<\/p>\n<p>socket.on(&#8216;new&#8217;,<strong>function<\/strong>(data){<\/p>\n<p>console.log(data.nickname);<\/p>\n<p>$(&#8216;#nickname&#8217;).val(data.nickname);<\/p>\n<p>});<\/p>\n<p>\u2018userlist\u2019\u00a0\uc774\ubca4\ud2b8\ub294 \ud604\uc7ac \ub300\ud654\ubc29\uc5d0 \uc788\ub294 \uc0ac\uc6a9\uc790\ub4e4\uc758\u00a0nickname\uc744 \ubaa8\ub450 \ubc1b\uc740 \ud6c4\uc5d0,\u00a0\ub300\ud654 \uc0c1\ub300\ub97c \uc9c0\uc815\ud558\ub294\u00a0HTML &lt;select&gt; box\u00a0\ubd80\ubd84\uc5d0 \ub300\ud654\uba85\ub4e4\uc744 \ub123\uc5b4\uc900\ub2e4.<\/p>\n<p>socket.on(&#8216;userlist&#8217;,<strong>function<\/strong>(data){<\/p>\n<p><strong>var<\/strong>\u00a0users = data.users;<\/p>\n<p>console.log(users);<\/p>\n<p>console.log(data.users.length);<\/p>\n<p>$(&#8216;#to&#8217;).empty().append(&#8216;&lt;option value=&#8221;ALL&#8221;&gt;ALL&lt;\/option&gt;&#8217;);<\/p>\n<p><strong>for<\/strong>(<strong>var<\/strong>\u00a0i=0;i&lt;data.users.length;i++){<\/p>\n<p>$(&#8216;#to&#8217;).append(&#8216;&lt;option value=&#8221;&#8216;+users[i]+'&#8221;&gt;&#8217;+users[i]+&#8221;&lt;\/option&gt;&#8221;);<\/p>\n<p>}<\/p>\n<p>});<\/p>\n<p>\ub2e4\uc74c\uc740 \uc704\uc758 \uc608\uc81c\ub97c \uc2e4\ud589\ud55c \ud654\uba74\uc774\ub2e4.\u00a0\uc544\ub798\uc640 \uac19\uc774\u00a0TO\u00a0\ubd80\ubd84\uc5d0\uc11c \uc0ac\uc6a9\uc790\ub97c \uc9c0\uc815\ud558\uace0 \uba54\uc138\uc9c0\ub97c \ubcf4\ub0b4\uba74 \ud2b9\uc815 \uc0ac\uc6a9\uc790\uc5d0\uac8c\ub9cc \uba54\uc138\uc9c0\uac00 \uc804\ub2ec\ub428\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub2e4.<\/p>\n<p>\ub2e4\uc74c\uc5d0\ub294 \ub300\ud654\ubc29\uc758 \uae30\ub2a5\uc744 \ucd94\uac00\ud558\uc5ec, socket.io\uc758 room \uac1c\ub150\uc5d0 \ub300\ud574\uc11c \uc54c\uc544\ubcf4\ub3c4\ub85d \ud55c\ub2e4.<\/p>\n<p>&nbsp;<\/p>\n<h3>\ucc44\ud305\u00a0\ud504\ub85c\uadf8\ub7a8\uc5d0\u00a0\ubc29(room\/\uadf8\ub8f9)\uc758\u00a0\uae30\ub2a5\uc744\u00a0\ucd94\uac00\ud558\uae30<\/h3>\n<p>\ub2e4\uc74c\uc740\u00a0\uc55e\uc5d0\uc11c\u00a0\ub9cc\ub4e0\u00a01:1\u00a0\uadd3\uc18d\ub9d0\uc774\u00a0\uac00\ub2a5\ud55c\u00a0\ucc44\ud305\uc5d0\u00a0\u201c\ucc44\ud305\ubc29\u201d\u00a0\uae30\ub2a5\uc744\u00a0\ucd94\uac00\ud55c\u00a0\ubc84\uc804\uc774\ub2e4.<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"615\"><strong>var<\/strong>\u00a0express = require(&#8216;express&#8217;);<\/p>\n<p><strong>var<\/strong>\u00a0routes = require(&#8216;.\/routes&#8217;);<\/p>\n<p><strong>var<\/strong>\u00a0http = require(&#8216;http&#8217;);<\/p>\n<p><strong>var<\/strong>\u00a0path = require(&#8216;path&#8217;);<\/p>\n<p>&nbsp;<\/p>\n<p><strong>var<\/strong>\u00a0app = express();<\/p>\n<p>app.use(express.bodyParser());<\/p>\n<p>app.use(express.cookieParser(&#8216;your secret here&#8217;));<\/p>\n<p>app.use(express.session());<\/p>\n<p>app.use(express.<strong>static<\/strong>(path.join(__dirname,\u00a0&#8216;public&#8217;)));<\/p>\n<p>app.set(&#8216;views&#8217;, path.join(__dirname,\u00a0&#8216;views&#8217;));<\/p>\n<p>app.set(&#8216;view engine&#8217;,\u00a0&#8216;ejs&#8217;);<\/p>\n<p>app.use(express.favicon());<\/p>\n<p>app.use(express.logger(&#8216;dev&#8217;));<\/p>\n<p>app.use(express.json());<\/p>\n<p>app.use(express.urlencoded());<\/p>\n<p>app.use(express.methodOverride());<\/p>\n<p>app.use(app.router);<\/p>\n<p>&nbsp;<\/p>\n<p><strong>var<\/strong>\u00a0httpServer =http.createServer(app).listen(3000,\u00a0<strong>function<\/strong>(req,res){<\/p>\n<p>console.log(&#8216;Socket IO server has been started&#8217;);<\/p>\n<p>});<\/p>\n<p>\/\/ upgrade\u00a0http\u00a0server to socket.io server<\/p>\n<p><strong>var<\/strong>\u00a0io = require(&#8216;socket.io&#8217;).listen(httpServer);<\/p>\n<p>&nbsp;<\/p>\n<p><strong>var<\/strong>\u00a0count = 0;<\/p>\n<p><strong>var<\/strong>\u00a0rooms = [];<\/p>\n<p>&nbsp;<\/p>\n<p>app.get(&#8216;\/:room&#8217;,<strong>function<\/strong>(req,res){<\/p>\n<p>console.log(&#8216;room name is :&#8217;+req.params.room);<\/p>\n<p>res.render(&#8216;index&#8217;,{room:req.params.room});<\/p>\n<p>});<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>io.sockets.on(&#8216;connection&#8217;,<strong>function<\/strong>(socket){<\/p>\n<p>&nbsp;<\/p>\n<p>socket.on(&#8216;joinroom&#8217;,<strong>function<\/strong>(data){<\/p>\n<p>socket.join(data.room);<\/p>\n<p>&nbsp;<\/p>\n<p>socket.set(&#8216;room&#8217;, data.room,<strong>function<\/strong>() {<\/p>\n<p><strong>var<\/strong>\u00a0room = data.room;<\/p>\n<p><strong>var<\/strong>\u00a0nickname =\u00a0&#8216;\uc190\ub2d8-&#8216;+count;<\/p>\n<p>socket.set(&#8216;nickname&#8217;,nickname,<strong>function<\/strong>(){<\/p>\n<p>socket.emit(&#8216;changename&#8217;, {nickname: nickname});<\/p>\n<p>&nbsp;<\/p>\n<p>\/\/ Create Room<\/p>\n<p><strong>if<\/strong>\u00a0(rooms[room] ==\u00a0<strong>undefined<\/strong>) {<\/p>\n<p>console.log(&#8216;room create :&#8217;\u00a0+ room);<\/p>\n<p>rooms[room] =\u00a0<strong>new<\/strong>\u00a0Object();<\/p>\n<p>rooms[room].socket_ids =\u00a0<strong>new<\/strong>\u00a0Object();<\/p>\n<p>}<\/p>\n<p>\/\/ Store current user&#8217;s nickname and socket.id to MAP<\/p>\n<p>rooms[room].socket_ids[nickname] = socket.id<\/p>\n<p>&nbsp;<\/p>\n<p>\/\/ broad cast join message<\/p>\n<p>data = {msg: nickname +\u00a0&#8216;\u00a0\ub2d8\uc774\u00a0\uc785\uc7a5\ud558\uc168\uc2b5\ub2c8\ub2e4.&#8217;};<\/p>\n<p>io.sockets.<strong>in<\/strong>(room).emit(&#8216;broadcast_msg&#8217;, data);<\/p>\n<p>&nbsp;<\/p>\n<p>\/\/ broadcast changed user list in the room<\/p>\n<p>io.sockets.<strong>in<\/strong>(room).emit(&#8216;userlist&#8217;, {users: Object.keys(rooms[room].socket_ids)});<\/p>\n<p>count++;<\/p>\n<p>});<\/p>\n<p>});<\/p>\n<p>&nbsp;<\/p>\n<p>});<\/p>\n<p>&nbsp;<\/p>\n<p>socket.on(&#8216;changename&#8217;,<strong>function<\/strong>(data){<\/p>\n<p>socket.get(&#8216;room&#8217;,<strong>function<\/strong>(err,room){<\/p>\n<p>socket.get(&#8216;nickname&#8217;,<strong>function<\/strong>(err,pre_nick) {<\/p>\n<p><strong>var<\/strong>\u00a0nickname = data.nickname;<\/p>\n<p>\/\/ if user changes name get previous nickname from nicknames MAP<\/p>\n<p><strong>if<\/strong>\u00a0(pre_nick !=\u00a0<strong>undefined<\/strong>) {<\/p>\n<p><strong>delete<\/strong>\u00a0rooms[room].socket_ids[pre_nick];<\/p>\n<p>}<\/p>\n<p>rooms[room].socket_ids[nickname] = socket.id<\/p>\n<p>socket.set(&#8216;nickname&#8217;,nickname,<strong>function<\/strong>() {<\/p>\n<p>data = {msg: pre_nick +\u00a0&#8216;\u00a0\ub2d8\uc774\u00a0&#8216;\u00a0+ nickname +\u00a0&#8216;\uc73c\ub85c\u00a0\ub300\ud654\uba85\uc744\u00a0\ubcc0\uacbd\ud558\uc168\uc2b5\ub2c8\ub2e4.&#8217;};<\/p>\n<p>io.sockets.<strong>in<\/strong>(room).emit(&#8216;broadcast_msg&#8217;, data);<\/p>\n<p>&nbsp;<\/p>\n<p>\/\/ send changed user nickname lists to clients<\/p>\n<p>io.sockets.<strong>in<\/strong>(room).emit(&#8216;userlist&#8217;, {users: Object.keys(rooms[room].socket_ids)});<\/p>\n<p>});<\/p>\n<p>});<\/p>\n<p>&nbsp;<\/p>\n<p>});<\/p>\n<p>});<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>socket.on(&#8216;disconnect&#8217;,<strong>function<\/strong>(data){<\/p>\n<p>socket.get(&#8216;room&#8217;,<strong>function<\/strong>(err,room) {<\/p>\n<p><strong>if<\/strong>(err)\u00a0<strong>throw<\/strong>\u00a0err;<\/p>\n<p><strong>if<\/strong>(room !=\u00a0<strong>undefined<\/strong><\/p>\n<p>&amp;&amp; rooms[room] !=\u00a0<strong>undefined<\/strong>){<\/p>\n<p>&nbsp;<\/p>\n<p>socket.get(&#8216;nickname&#8217;,<strong>function<\/strong>(err,nickname) {<\/p>\n<p>console.log(&#8216;nickname &#8216;\u00a0+ nickname +\u00a0&#8216; has been disconnected&#8217;);<\/p>\n<p>\/\/\u00a0\uc5ec\uae30\uc5d0\u00a0\ubc29\uc744\u00a0\ub098\uac14\ub2e4\ub294\u00a0\uba54\uc138\uc9c0\ub97c\u00a0broad cast\u00a0\ud558\uae30<\/p>\n<p><strong>if<\/strong>\u00a0(nickname !=\u00a0<strong>undefined<\/strong>) {<\/p>\n<p><strong>if<\/strong>\u00a0(rooms[room].socket_ids !=\u00a0<strong>undefined<\/strong><\/p>\n<p>&amp;&amp; rooms[room].socket_ids[nickname] !=\u00a0<strong>undefined<\/strong>)<\/p>\n<p><strong>delete<\/strong>\u00a0rooms[room].socket_ids[nickname];<\/p>\n<p>}\/\/ if<\/p>\n<p>data = {msg: nickname +\u00a0&#8216;\u00a0\ub2d8\uc774\u00a0\ub098\uac00\uc168\uc2b5\ub2c8\ub2e4.&#8217;};<\/p>\n<p>&nbsp;<\/p>\n<p>io.sockets.<strong>in<\/strong>(room).emit(&#8216;broadcast_msg&#8217;, data);<\/p>\n<p>io.sockets.<strong>in<\/strong>(room).emit(&#8216;userlist&#8217;, {users: Object.keys(rooms[room].socket_ids)});<\/p>\n<p>});<\/p>\n<p>}<\/p>\n<p>});\u00a0\/\/get<\/p>\n<p>});<\/p>\n<p>&nbsp;<\/p>\n<p>socket.on(&#8216;send_msg&#8217;,<strong>function<\/strong>(data){<\/p>\n<p>socket.get(&#8216;room&#8217;,<strong>function<\/strong>(err,room) {<\/p>\n<p>socket.get(&#8216;nickname&#8217;,<strong>function<\/strong>(err,nickname) {<\/p>\n<p>console.log(&#8216;in send msg room is &#8216;\u00a0+ room);<\/p>\n<p>data.msg = nickname +\u00a0&#8216; : &#8216;\u00a0+ data.msg;<\/p>\n<p><strong>if<\/strong>\u00a0(data.to ==\u00a0&#8216;ALL&#8217;) socket.broadcast.to(room).emit(&#8216;broadcast_msg&#8217;, data);\u00a0\/\/\u00a0\uc790\uc2e0\uc744\u00a0\uc81c\uc678\ud558\uace0\u00a0\ub2e4\ub978\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uac8c\u00a0\ubcf4\ub0c4<\/p>\n<p><strong>else<\/strong>\u00a0{<\/p>\n<p>\/\/\u00a0\uadd3\uc18d\ub9d0<\/p>\n<p>socket_id = rooms[room].socket_ids[data.to];<\/p>\n<p><strong>if<\/strong>\u00a0(socket_id !=\u00a0<strong>undefined<\/strong>) {<\/p>\n<p>&nbsp;<\/p>\n<p>data.msg =\u00a0&#8216;\uadd3\uc18d\ub9d0\u00a0:&#8217;\u00a0+ data.msg;<\/p>\n<p>io.sockets.socket(socket_id).emit(&#8216;broadcast_msg&#8217;, data);<\/p>\n<p>}\/\/ if<\/p>\n<p>}<\/p>\n<p>socket.emit(&#8216;broadcast_msg&#8217;, data);<\/p>\n<p>});<\/p>\n<p>});<\/p>\n<p>})<\/p>\n<p>});<\/p><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\ucf54\ub4dc\ub97c\u00a0\uc0b4\ud3b4\ubcf4\uc790<\/p>\n<p>\ucc98\uc74c\uc5d0 \uc785\uc7a5\uc740\u00a0<a href=\"http:\/\/localhos:3000\/\">http:\/\/localhos:3000\/<\/a>{\ubc29\uc774\ub984}\u00a0\uc73c\ub85c \ud558\uac8c \ub41c\ub2e4.<\/p>\n<p>app.get(&#8216;\/:room&#8217;,<strong>function<\/strong>(req,res){<\/p>\n<p>console.log(&#8216;room name is :&#8217;+req.params.room);<\/p>\n<p>res.render(&#8216;index&#8217;,{room:req.params.room});<\/p>\n<p>});<\/p>\n<p>\uadf8\ub7ec\uba74\u00a0URL\uc5d0 \uc788\ub294 \ubc29\uc774\ub984\uc744 \ubc1b\uc544\uc11c, index.ejs\uc5d0 \uc788\ub294\u00a0UI\ub85c \ucc44\ud305\ucc3d\uc744 \ub744\uc6cc\uc8fc\uace0 \ubc29\uc774\ub984\uc744\u00a0parameter\ub85c\u00a0index.ejs\uc5d0 \ub118\uaca8\uc900\ub2e4.<\/p>\n<p>&nbsp;<\/p>\n<p>socket.on(&#8216;joinroom&#8217;,<strong>function<\/strong>(data){<\/p>\n<p>socket.join(data.room);<\/p>\n<p>\ud074\ub77c\uc774\uc5b8\ud2b8\uac00\u00a0\uc11c\ubc84\uc5d0\u00a0\uc811\uc18d\ub418\uba74\u00a0\ub9e8\u00a0\uba3c\uc800\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\uac00\u00a0join\u00a0\uc774\ubca4\ud2b8\ub97c\u00a0\ubcf4\ub0b4\ub294\ub370,\u00a0\uc774\u00a0join\u00a0\uc774\ubca4\ud2b8\ub97c\u00a0\ubc1b\uc73c\uba74,\u00a0\uc774\ub54c\u00a0\uac19\uc774\u00a0\uc628\u00a0room\u00a0\uc774\ub984\uc73c\ub85c\u00a0\ud604\uc7ac\u00a0\uc18c\ucf13\uc744room\u00a0\uc774\ub984\uc758\u00a0room\uc5d0\u00a0join\ud55c\ub2e4.<\/p>\n<p>socket.set(&#8216;room&#8217;, data.room,<strong>function<\/strong>() {<\/p>\n<p>\ub2e4\uc74c\uc73c\ub85c,\u00a0\ud574\ub2f9\u00a0\uc18c\ucf13\uc774\u00a0\uc5b4\ub290\u00a0\ub8f8\uc5d0\u00a0\uc788\ub294\uc9c0\u00a0\ub97c\u00a0set\u00a0\uba85\ub839\uc744\u00a0\uc774\uc6a9\ud558\uc5ec\u00a0socket\uc5d0\u00a0\uc800\uc7a5\ud574\ub193\ub294\ub2e4.<\/p>\n<p><strong>var<\/strong>\u00a0room = data.room;<\/p>\n<p><strong>var<\/strong>\u00a0nickname =\u00a0&#8216;\uc190\ub2d8-&#8216;+count;<\/p>\n<p>socket.set(&#8216;nickname&#8217;,nickname,<strong>function<\/strong>(){<\/p>\n<p>socket.emit(&#8216;changename&#8217;, {nickname: nickname});<\/p>\n<p>&nbsp;<\/p>\n<p>\/\/ Create Room<\/p>\n<p><strong>if<\/strong>\u00a0(rooms[room] ==\u00a0<strong>undefined<\/strong>) {<\/p>\n<p>console.log(&#8216;room create :&#8217;\u00a0+ room);<\/p>\n<p>rooms[room] =\u00a0<strong>new<\/strong>\u00a0Object();<\/p>\n<p>rooms[room].socket_ids =\u00a0<strong>new<\/strong>\u00a0Object();<\/p>\n<p>}<\/p>\n<p>\uc717\ubd80\ubd84\uc774\u00a0room\u00a0\ub370\uc774\ud130\u00a0\uac1d\uccb4\ub97c\u00a0\uc0dd\uc131\ud558\ub294\u00a0\uac83\uc778\ub370,\u00a0\uc55e\uc758\u00a0\uc608\uc81c\uc640\ub294\u00a0\ub2ec\ub9ac,\u00a0\ud604\uc7ac\u00a0\uc5f0\uacb0\ub41c\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\uc758\u00a0socket.id\ub97c\u00a0\uc774\uc81c\ub294\u00a0room\u00a0\ub2e8\uc704\ub85c\u00a0\uad00\ub9ac\ub97c\u00a0\ud574\uc57c\u00a0\ud55c\ub2e4.\u00a0\uadf8\ub798\uc11c\u00a0rooms\ub77c\ub294\u00a0\uac1d\uccb4\ub97c\u00a0\uc774\uc6a9\ud558\uc5ec,\u00a0\ud574\ub2f9\u00a0room\uc5d0\u00a0\ub300\ud574\uc11c\u00a0rooms.room\uc774\ub77c\ub294\u00a0\uac1d\uccb4\ub85c\u00a0\ub9cc\ub4e4\uace0,\u00a0\uadf8\ub9ac\uace0,\u00a0\uc774\u00a0room\uc5d0\u00a0\ud604\uc7ac\u00a0\uc5f0\uacb0\ub41c\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\u00a0\uc758socket.id\ub97c\u00a0\uc800\uc7a5\ud558\ub294\u00a0socket_ids\u00a0\uac1d\uccb4\ub97c\u00a0\uc0dd\uc131\ud55c\ub2e4.<\/p>\n<p>\/\/ Store current user&#8217;s nickname and socket.id to MAP<\/p>\n<p>rooms[room].socket_ids[nickname] = socket.id<\/p>\n<p>&nbsp;<\/p>\n<p>\uadf8\ub9ac\uace0\u00a0\ub098\uc11c, socket_ids\uc5d0\u00a0\uadd3\uc18d\ub9d0\u00a0\ucc44\ud305\ubc29\u00a0\uc608\uc81c\uc640\u00a0\uac19\uc774\u00a0nickname to socket.id\u00a0\uc5d0\u00a0\ub300\ud55c\u00a0\ub9f5\ud551\u00a0\uc815\ubcf4\ub97c\u00a0\uc800\uc7a5\ud55c\ub2e4.<\/p>\n<p>\/\/ broad cast join message<\/p>\n<p>data = {msg: nickname +\u00a0&#8216;\u00a0\ub2d8\uc774\u00a0\uc785\uc7a5\ud558\uc168\uc2b5\ub2c8\ub2e4.&#8217;};<\/p>\n<p>io.sockets.<strong>in<\/strong>(room).emit(&#8216;broadcast_msg&#8217;, data);<\/p>\n<p>\/\/ broadcast changed user list in the room<\/p>\n<p>io.sockets.<strong>in<\/strong>(room).emit(&#8216;userlist&#8217;, {users:<\/p>\n<p>Object.keys(rooms[room].socket_ids)});<\/p>\n<p>count++;<\/p>\n<p>});<\/p>\n<p>\uadf8\ub9ac\uace0\u00a0\uc704\uc640\u00a0\uac19\uc774\u00a0\ud604\uc7ac\u00a0room\uc5d0\u00a0\ub4e4\uc5b4\u00a0\uc788\ub294\u00a0\ud074\ub77c\uc774\uc5b8\ud2b8\ub4e4\uc5d0\uac8c\ub9cc\u00a0,\u00a0\uc0c8\ub85c\uc6b4\u00a0\uc0ac\uc6a9\uc790\uac00\u00a0\uc785\uc7a5\ud588\uc74c\uc744\u00a0\uc54c\ub9ac\uace0,\u00a0\uc0ac\uc6a9\uc790\u00a0\ub9ac\uc2a4\ud2b8\ub97c\u00a0\uc5c5\ub370\uc774\ud2b8\ud558\ub294\u00a0\uc774\ubca4\ud2b8\ub97c\u00a0\ubcf4\ub0b8\ub2e4.<\/p>\n<p>disconnect\uc5d0\u00a0\ub300\ud55c\u00a0\ubd80\ubd84\ub3c4\u00a0\ud06c\uac8c\u00a0\ub2ec\ub77c\uc9c4\u00a0\uac83\uc774\u00a0\uc5c6\ub2e4. Socket_ids\u00a0\uac1d\uccb4\uac00\u00a0rooms\u00a0\uc544\ub798\ub85c\u00a0\ub4e4\uc5b4\uac14\uace0,\u00a0\uba54\uc2dc\uc9c0\ub97c\u00a0\ubcf4\ub0bc\ub54c,\u00a0\uadd3\uc18d\ub9d0\u00a0\ucc44\ud305\ubc29\u00a0\uc608\uc81c\uac00io.sockets.emit\u00a0\ub300\uc2e0\uc5d0, room\uc758\u00a0\ubc94\uc704\ub97c\u00a0\uc9c0\uc815\ud558\ub294\u00a0in()\u00a0\uba54\uc11c\ub4dc\ub97c\u00a0\uc368\uc11c\u00a0io.sockets.<strong>in<\/strong>(room).emit\uc640\u00a0\uac19\uc774\u00a0\ubcf4\ub0b4\uac8c\u00a0\ub41c\ub2e4.<\/p>\n<p>Sendmsg\u00a0\uc774\ubca4\ud2b8 \ubd80\ubd84\ub3c4, broadcast\ud558\ub294 \ubd80\ubd84\uc5d0\uc11c\u00a0to\ub97c \uc774\uc6a9\ud558\uc5ec \ub2e4\uc74c\uacfc \uac19\uc774socket.broadcast.to(room).emit\u00a0\ud2b9\uc815\u00a0room\uc5d0 \uc788\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uac8c\ub9cc \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\ub294 \uac83\uc73c\ub85c\ub9cc \ubcc0\uacbd\ub418\uc5c8\ub2e4<\/p>\n<p>\uc544\ub798\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8\ucabd\uc758 \ucf54\ub4dc\uc774\ub2e4.\u00a0\uc55e\uc758 \uc608\uc81c\uc5d0\uc11c \ub098\uc628 \uadd3\uc18d\ub9d0\uc774 \uac00\ub2a5\ud55c \ub300\ud654\ubc29\uacfc \ucf54\ub4dc\uac00 \uac70\uc758 \ub3d9\uc77c\ud558\ub2e4.\u00a0\ub2e8<\/p>\n<p>&lt;script\u00a0type=<em>&#8220;text\/javascript&#8221;<\/em>&gt;<\/p>\n<p><strong>var<\/strong>\u00a0socket = io.connect(&#8216;http:\/\/localhost&#8217;);<\/p>\n<p>socket.emit(&#8216;joinroom&#8217;,{room:'&lt;%=room%&gt;&#8217;});<\/p>\n<p>\ucc98\uc74c\uc5d0 \uc811\uc18d\ud558\uc600\uc744 \ub54c,\u00a0\uc11c\ubc84 \ucf54\ub4dc\uc5d0\uc11c \ubc29\uc774\ub984\uc744\u00a0URL\ub85c\ubd80\ud130 \uc77d\uc5b4\uc11c,\u00a0\uadf8 \ubc29\uc774\ub984\uc73c\ub85c\u00a0join\u00a0\ud558\ub294 \uc774\ubca4\ud2b8\ub97c \ubcf4\ub0b8\ub2e4.<\/p>\n<p>\/vies\/index.ejs<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"615\">&lt;html&gt;\n<p>&lt;head&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;title&gt;&lt;\/title&gt;<\/p>\n<p>&lt;script\u00a0src=<em>&#8220;\/socket.io\/socket.io.js&#8221;<\/em>&gt;&lt;\/script&gt;<\/p>\n<p>&lt;script\u00a0src=<em>&#8220;\/\/code.jquery.com\/jquery-1.11.0.min.js&#8221;<\/em>&gt;&lt;\/script&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;\/head&gt;<\/p>\n<p>&lt;body&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;b&gt;Welcome ROOM :\u00a0&lt;%= room%&gt;&lt;\/b&gt;&lt;p&gt;<\/p>\n<p>Name\u00a0&lt;input\u00a0type=<em>&#8220;text&#8221;<\/em>\u00a0id=<em>&#8220;nickname&#8221;<\/em>\u00a0\/&gt;\u00a0&lt;input\u00a0type=<em>&#8220;button&#8221;<\/em>\u00a0id=<em>&#8220;changename&#8221;<\/em>value=<em>&#8220;Change name&#8221;<\/em>\/&gt;&lt;br&gt;<\/p>\n<p>To<\/p>\n<p>&lt;select\u00a0id=<em>&#8220;to&#8221;<\/em>&gt;<\/p>\n<p>&lt;option\u00a0value=<em>&#8220;ALL&#8221;<\/em>&gt;ALL&lt;\/option&gt;<\/p>\n<p>&lt;\/select&gt;<\/p>\n<p>Message\u00a0\u00a0&lt;input\u00a0type=<em>&#8220;text&#8221;<\/em>\u00a0id=<em>&#8220;msgbox&#8221;<\/em>\/&gt;<\/p>\n<p>&lt;br&gt;<\/p>\n<p>&lt;span\u00a0id=<em>&#8220;msgs&#8221;<\/em>&gt;&lt;\/span&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;script\u00a0type=<em>&#8220;text\/javascript&#8221;<\/em>&gt;<\/p>\n<p><strong>var<\/strong>\u00a0socket = io.connect(&#8216;http:\/\/localhost&#8217;);<\/p>\n<p>socket.emit(&#8216;joinroom&#8217;,{room:'&lt;%=room%&gt;&#8217;});<\/p>\n<p>&nbsp;<\/p>\n<p>$(&#8216;#changename&#8217;).click(<strong>function<\/strong>(){<\/p>\n<p>socket.emit(&#8216;changename&#8217;,{nickname:$(&#8216;#nickname&#8217;).val()});<\/p>\n<p>});<\/p>\n<p>$(&#8220;#msgbox&#8221;).keyup(<strong>function<\/strong>(event) {<\/p>\n<p><strong>if<\/strong>\u00a0(event.which == 13) {<\/p>\n<p>socket.emit(&#8216;send_msg&#8217;,{to:$(&#8216;#to&#8217;).val(),msg:$(&#8216;#msgbox&#8217;).val()});<\/p>\n<p>$(&#8216;#msgbox&#8217;).val(&#8221;);<\/p>\n<p>}<\/p>\n<p>});<\/p>\n<p>socket.on(&#8216;new&#8217;,<strong>function<\/strong>(data){<\/p>\n<p>console.log(data.nickname);<\/p>\n<p>$(&#8216;#nickname&#8217;).val(data.nickname);<\/p>\n<p>});<\/p>\n<p>&nbsp;<\/p>\n<p>\/\/\u00a0\uc0c8\ub85c\uc6b4\u00a0\uc0ac\uc6a9\uc790\uac00\u00a0\ub4e4\uc5b4\uc624\uac70\ub098,\u00a0\uc0ac\uc6a9\uc790\uac00\u00a0\uc774\ub984\uc744\u00a0\ubc14\uafe8\uc744\ub54c\u00a0&#8220;To&#8221;\u00a0\ub9ac\uc2a4\ud2b8\ub97c\u00a0\ubcc0\uacbd\ud568<\/p>\n<p>socket.on(&#8216;userlist&#8217;,<strong>function<\/strong>(data){<\/p>\n<p><strong>var<\/strong>\u00a0users = data.users;<\/p>\n<p>console.log(users);<\/p>\n<p>console.log(data.users.length);<\/p>\n<p>$(&#8216;#to&#8217;).empty().append(&#8216;&lt;option value=&#8221;ALL&#8221;&gt;ALL&lt;\/option&gt;&#8217;);<\/p>\n<p><strong>for<\/strong>(<strong>var<\/strong>\u00a0i=0;i&lt;data.users.length;i++){<\/p>\n<p>$(&#8216;#to&#8217;).append(&#8216;&lt;option value=&#8221;&#8216;+users[i]+'&#8221;&gt;&#8217;+users[i]+&#8221;&lt;\/option&gt;&#8221;);<\/p>\n<p>}<\/p>\n<p>});<\/p>\n<p>&nbsp;<\/p>\n<p>socket.on(&#8216;broadcast_msg&#8217;,<strong>function<\/strong>(data){<\/p>\n<p>console.log(data.msg);<\/p>\n<p>$(&#8216;#msgs&#8217;).append(data.msg+'&lt;BR&gt;&#8217;);<\/p>\n<p>});<\/p>\n<p>&lt;\/script&gt;<\/p>\n<p>&lt;\/body&gt;<\/p>\n<p>&lt;\/html&gt;<\/p><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>\ub2e4\uc74c\uc740\u00a0\uc2e4\uc81c\u00a0\uc2e4\ud589\u00a0\ud654\uba74\uc774\ub2e4.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>node.js\u00a0\ub178\ub4dc\uac00 \ud558\ub098\uac00 \uc544\ub2c8\ub77c \uc5ec\ub7ec\uac1c\uc758 \ud504\ub85c\uc138\uc2a4\ub97c \uc774\uc6a9\ud574\uc11c \uc6b4\uc601\ud560 \ub54c,socket.io\ub97c \uc5b4\ub5bb\uac8c \uc0ac\uc6a9\ud574\uc57c \ud560\uae4c?\u00a0\uc774\ub7f0 \uba40\ud2f0 \ud504\ub85c\uc138\uc2a4\ub97c \uc9c0\uc6d0\ud558\uae30 \uc704\ud574\uc11c, node.js\ub294 \ub0b4\ubd80\uc801\uc73c\ub85c\u00a0redis store\ub97c \uc9c0\uc6d0\ud55c\ub2e4. redis\uc5d0\ub294\u00a0publish\/subscribe\ub77c\ub294 \uae30\ub2a5\uc774 \uc788\ub294\ub370,\u00a0\ub9c8\uce58 \uba54\uc138\uc9c0 \ud050\ucc98\ub7fc \uba54\uc138\uc9c0\ub97c\u00a0subscriber\ub85c \ubcf4\ub0bc \uc218 \uc788\ub294 \uae30\ub2a5\uc774\ub2e4.<\/p>\n<p>\uc544\ub798 \uadf8\ub9bc\uc744 \ubcf4\uc790,\ud558\ub098\uc758\u00a0node\ud504\ub85c\uc138\uc2a4\uc5d0\uc11c \uba54\uc138\uc9c0\ub97c \ubcf4\ub0b4\uba74,\u00a0\ub2e4\ub978 \ud504\ub85c\uc138\uc2a4\ub85c\u00a0redis\ub97c \ud1b5\ud574\uc11c \uba54\uc138\uc9c0\ub97c \uc804\ub2ec\ud55c\ub2e4.\u00a0\uc774\ub54c \uba54\uc138\uc9c0\ub97c \ubcf4\ub0b4\ub294 \ud504\ub85c\uc138\uc2a4\ub294\u00a0redis\uc5d0 \uba54\uc138\uc9c0\ub97c\u00a0\u201cpublish\u201d\ud558\uace0 \ub098\uba38\uc9c0 \ud504\ub85c\uc138\uc2a4\ub4e4\uc740 \u00a0\u201csubscribe\u201d\ub97c \uc774\uc6a9\ud558\uc5ec \uba54\uc138\uc9c0\ub97c \uc77d\uc5b4\ub4dc\ub9b0\ub2e4.\u00a0\uc774\ub54c,\u00a0\uba54\uc138\uc9c0\ub97c \uc804\ub2ec\ud558\ub294 \ucc44\ub110\uc740\u201cdispatch\u201d\ub77c\ub294 \uc774\ub984\uc758 \ucc44\ub110\uc744 \uc774\uc6a9\ud55c\ub2e4.<\/p>\n<p>&nbsp;<\/p>\n<p>\uadf8\ub7ec\uba74 \uc2e4\uc81c\ub85c, socket.io\uc5d0\uc11c\u00a0redis store\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uae4c?\u00a0\uac04\ub2e8\ud55c \uc124\uc815\ub9cc\uc73c\ub85c \uac00\ub2a5\ud558\ub2e4.\u00a0\uc544\ub798\uc640 \uac19\uc774\u00a0redis client\ub97c \uc0dd\uc131\ud55c \ud6c4\uc5d0, socket.io\uc5d0\u00a0set\u00a0\uba85\ub839\uc744 \uc774\uc6a9\ud558\uc5ec\u00a0store\ub97c\u00a0redis client\ub85c\ub9cc \uc9c0\uc815\ud574\uc8fc\uba74 \ub41c\ub2e4.<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"615\"><strong>var<\/strong>\u00a0httpServer =http.createServer(app).listen(process.argv[2],\u00a0<strong>function<\/strong>(req,res){<\/p>\n<p>console.log(&#8216;Socket IO server has been started listen:&#8217;+process.argv[2]);<\/p>\n<p>});<\/p>\n<p>\/\/ upgrade\u00a0http\u00a0server to socket.io server<\/p>\n<p><strong>var<\/strong>\u00a0io = socketio.listen(httpServer);<\/p>\n<p><strong>var<\/strong>\u00a0pub = redis.createClient(6379,&#8217;127.0.0.1&#8242;);<\/p>\n<p><strong>var<\/strong>\u00a0sub = redis.createClient(6379,&#8217;127.0.0.1&#8242;);<\/p>\n<p><strong>var<\/strong>\u00a0store = redis.createClient(6379,&#8217;127.0.0.1&#8242;);<\/p>\n<p>&nbsp;<\/p>\n<p>io.set(&#8216;store&#8217;,<strong>new<\/strong>\u00a0socketio.RedisStore({<\/p>\n<p>redis: redis<\/p>\n<p>,redisPub : pub<\/p>\n<p>,redisSub : sub<\/p>\n<p>,redisClient : store<\/p>\n<p>}));<\/p>\n<p>&nbsp;<\/p><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>\uadf8\ub9ac\uace0, cluster\u00a0\ubaa8\ub4c8\uc744 \uc774\uc6a9\ud558\uac70\ub098,\u00a0\uc55e\ub2e8\uc5d0\u00a0nginx(http:\/\/\u00a0<a href=\"http:\/\/nginx.org\/\">http:\/\/nginx.org\/<\/a>\u00a0) haproxy (<a href=\"http:\/\/haproxy.1wt.eu\/\">http:\/\/haproxy.1wt.eu\/<\/a>) \u00a0\ub85c\ub4dc\ubc38\ub7f0\uc11c\ub97c \uc774\uc6a9\ud558\uc5ec \uc5ec\ub7ec\uac1c\uc758\u00a0node.js\u00a0\ud504\ub85c\uc138\uc2a4\uc5d0 \ub300\ud55c\u00a0end point\ub97c \ud558\ub098\ub85c \ubb36\uc73c\uba74,\u00a0\ub300\uaddc\ubaa8 \ubd84\uc0b0 \uc11c\ube44\uc2a4\ub97c \ud560 \uc218 \uc788\ub294\u00a0socket.io\u00a0\ud074\ub7ec\uc2a4\ud130\ub97c \uad6c\uc131\ud560 \uc218 \uc788\ub2e4.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>http:\/\/bcho.tistory.com\/889 \ube60\ub974\uac8c \ud6dd\uc5b4 \ubcf4\ub294 node.js &#8211; #6 MongoDB \uc5f0\ub3d9 (mongo-native) \ud074\ub77c\uc6b0\ub4dc \ucef4\ud4e8\ud305 &amp; NoSQL\/Vert.x &amp; Node.js\u00a0|\u00a02014\/04\/03 23:49\u00a0|\u00a0Posted by\u00a0\uc870\ub300\ud611 \ube60\ub974\uac8c \ud6dd\uc5b4\ubcf4\ub294\u00a0node.js #6- mongo-native \ubaa8\ub4c8\uc744 \uc774\uc6a9\ud55c MongoDB \uc5f0\ub3d9 \uc870\ub300\ud611\u00a0(http:\/\/bcho.tistory.com Persistence\u00a0\uc5f0\ub3d9 node.js\ub294\u00a0DB\ub098\u00a0NoSQL\ub4f1\uc758 \uc5f0\ub3d9\uc744 \uc9c0\uc6d0\ud558\ub294\ub370,\u00a0\uc774 \uc5ed\uc2dc \ucca0\uc800\ud558\uac8c\u00a0non-blocking io\u00a0\ubc29\uc2dd\uc73c\ub85c \ub3d9\uc791\ud55c\ub2e4.\u00a0\uc989\u00a0db\u00a0\uc5f0\uacb0\u00a0socket\uc744 \uc5f4\uc5b4\uc11c\u00a0query\ub97c \ub358\uc838\ub193\uace0, query\u00a0\uacb0\uacfc\uac00 \uc624\uba74 \uc774\ubca4\ud2b8\ub97c \ubc1b\uc544\uc11c\u00a0callback\u00a0\ud568\uc218\ub85c \ucc98\ub9ac\ud558\ub294 \uc21c\uc11c\uc774\ub2e4. \uadf8\ub7ec\uba74 \uc5ec\uae30\uc11c\ub294 \uba87\uac00\uc9c0\u00a0persistence\u00a0\uc5f0\ub3d9 \ubc29\uc2dd\uc5d0 \ub300\ud574\uc11c \uc54c\uc544\ubcf4\ub3c4\ub85d \ud55c\ub2e4. MongoDB \uba3c\uc800\u00a0mongodb\ub294\u00a0nosql\u00a0\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc911\uc5d0 \uac00\uc7a5 \ub9ce\uc774 \uc0ac\uc6a9\ub418\ub294 \uc81c\ud488\uc911\uc758 \ud558\ub098\uc774\ub2e4. Json document\ub97c \uc800\uc7a5\ud558\ub294 \uc2a4\ud0c0\uc77c\uc758\u00a0document db\uc774\uba70, index\ub098\u00a0grouping\uacfc \uac19\uc740\u00a0RDBMS\uc640 \uc720\uc0ac\ud55c \uae30\ub2a5\uae4c\uc9c0 \uc9c0\uc6d0\ud558\uae30 \ub54c\ubb38\uc5d0 \uc0ac\uc6a9\uc774 \ub9e4\uc6b0 \uc27d\ub2e4. \uc124\uce58\u00a0\ubc0f\u00a0\ud14c\uc2a4\ud2b8 Mongodb\ub294\u00a0mongodb.org\uc5d0\uc11c \ub2e4\uc6b4\ub85c\ub4dc \ubc1b\uc744 \uc218 \uc788\ub2e4. Mongodb\ub294 \ubb34\ub8cc\u00a0tutorial\uc774 \uc798\ub418\uc5b4 \uc788\ub294 \uac83\uc774 \ub9ce\uc740\ub370,\u00a0https:\/\/university.mongodb.com\/\uc5d0 \uac00\uba74 \uc5b8\uc5b4\ubcc4\u00a0(node.js\uc6a9\ub3c4 \uc788\ub2e4)\u00a0\ud29c\ud1a0\ub9ac\uc5bc\uc774 \uc788\uc73c\ub2c8 \ucc38\uace0\ud558\uae30 \ubc14\ub780\ub2e4. \uc708\ub3c4\uc6b0\ub97c \uae30\uc900\uc73c\ub85c \ub2e4\uc6b4 \ubc1b\uc544\uc11c \uc555\ucd95\uc744 \ud47c\ud6c4, \u00a0db\u00a0\ub514\ub809\ud1a0\ub9ac\ub97c \ub9cc\ub4e4\uc5b4 \uc8fc\uc5b4\uc57c \ud558\ub294\ub370,\u00a0\ud544\uc694\ud55c \uacf3\uc5d0 \ub514\ub809\ud1a0\ub9ac\ub97c \ub9cc\ub4e0\ub2e4.\u00a0\uc5ec\uae30\uc11cC:devmongodb-win32-x86_64-2.4.3\u00a0data\u00a0\uc5d0 \ub9cc\ub4e4\uc5c8\ub2e4. C:devmongodb-win32-x86_64-2.4.3\u00a0\uc5d0\uc11c \ub2e4\uc74c\uacfc \uac19\uc740 \uba85\ub839\uc5b4\ub97c \uc774\uc6a9\ud558\uc5ec \uad6c\ub3d9\ud55c\ub2e4. .binmongod &#8211;dbpath C:devmongodb-win32-x86_64-2.4.3data \uc778\uc2a4\ud1a8\uc774 \ub05d\ub0ac\uc73c\uba74 \uac04\ub2e8\ud55c \ud14c\uc2a4\ud2b8\ub97c \ud574\ubcf4\uc790, .\/bin\/mongo.exe\ub97c \uc218\ud589\ud558\uba74\u00a0Java Script\u00a0\uae30\ubc18\uc758 \uc258\uc774 \uc218\ud589\ub41c\ub2e4.\u00a0\uc774\ud574\ub97c \ub3d5\uae30 \uc704\ud574\uc11c \ud558\ub098\uc758 \ud14c\uc774\ube14\uc5d0\u00a0Insert , select, delete, update\ub97c \uc218\ud589\ud558\ub294 \uba85\ub839\uc744\u00a0SQL\u00a0\ubb38\uc7a5\uacfc \ube44\uad50\ud574\uc11c \uc18c\uac1c\ud55c\ub2e4. Insert SQL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 : insert into users (&#8220;name&#8221;,&#8221;city&#8221;) values(&#8220;terry&#8221;,&#8221;seoul&#8221;) Mongo DB\u00a0\u00a0\u00a0\u00a0 : db.users.insert({_id:&#8221;terry&#8221;,city:&#8221;seoul&#8221;}) &nbsp; Select SQL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0: select * from users where id=&#8221;terry&#8221; Mongo DB\u00a0\u00a0\u00a0\u00a0 : db.users.find({_id:&#8221;terry&#8221;}) &nbsp; Update SQL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0: update users set city=&#8221;busan&#8221; where _id=&#8221;terry&#8221; Mongo DB\u00a0\u00a0\u00a0\u00a0 : db.users.update( {_id:&#8221;terry&#8221;}, {$set :{ city:&#8221;Busan&#8221; } } ) &nbsp; Delete SQL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0: delete from users where _id=&#8221;terry&#8221; Mongo DB\u00a0\u00a0\u00a0\u00a0 : db.users.remove({_id:&#8221;terry&#8221;}) &nbsp; \uac04\ub2e8\ud558\uac8c \ub098\ub9c8, mongodb query\uc5d0 \ub300\ud574\uc11c [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false,"ngg_post_thumbnail":0,"spay_email":"","jetpack_publicize_message":"","jetpack_is_tweetstorm":false,"jetpack_publicize_feature_enabled":true},"categories":[7],"tags":[],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p5q9Zn-67","jetpack-related-posts":[{"id":362,"url":"https:\/\/blog.box.kr\/?p=362","url_meta":{"origin":379,"position":0},"title":"[\ud38c]Trello \uc544\ud0a4\ud14d\ucc98","date":"2014-09-15","format":false,"excerpt":"Trello \uc544\ud0a4\ud14d\ucc98 CoffeeScript Trello\uc758 \ud074\ub77c\uc774\uc5b8\ud2b8\uc640 \uc11c\ubc84 \ubaa8\ub450 \uc21c\uc218 \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \ud504\ub85c\uc81d\ud2b8\ub85c \uc2dc\uc791\ub418\uc5c8\uace0, 2011\ub144 5\uc6d4\uae4c\uc9c0\ub294 \uc801\uc5b4\ub3c4 \uadf8\ub807\uac8c \uc720\uc9c0\ub418\uc5c8\ub294\ub370 \uadf8 \uc774\ud6c4\ubd80\ud130 CoffeeScript\ub97c \uc5bc\ub9c8\ub098 \uc88b\uc544\ud558\ub294\uc9c0 \ubcf4\uae30 \uc704\ud574\uc11c CoffeeScript\ub85c \uc774\uc911\uc73c\ub85c \uac1c\ubc1c\ud574 \ud3ec\ud305\ud558\uae30 \uc2dc\uc791\ud588\ub2e4. \uadf8 \ud6c4 \uc6b0\ub9ac\ub294 CoffeeScript\ub97c \uc0ac\ub791\ud568\uc744 \ud655\uc778\ud588\uace0 \uace7, \ub098\uba38\uc9c0 \ubaa8\ub450\uc758 \ucf54\ub4dc\ub3c4 CoffeeScript\ub85c \uc804\ud658\uc744 \uc644\ub8cc\ud588\ub2e4.\u00a0 CoffeeScript\ub294 JavaScript\ub97c \uc77d\uc744 \uc218 \uc788\ub294 \ucef4\ud30c\uc77c \uc5b8\uc5b4\uc774\ub2e4. \uc6b0\ub9ac\uac00 \uc2dc\uc791\ud588\uc744\u2026","rel":"","context":"In &quot;\ucc38\uace0\ub97c \uc704\ud55c \uc800\uc7a5\ubb3c&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":597,"url":"https:\/\/blog.box.kr\/?p=597","url_meta":{"origin":379,"position":1},"title":"[\ud38c][AngularJS] \ubc30\uc6b0\ub294 \ubc29\ubc95 &amp; \uae30\ubcf8 \uac1c\ub150 \uc7a1\uae30","date":"2015-02-02","format":false,"excerpt":"http:\/\/mobicon.tistory.com\/281 AngularJS\/Concept AngularJS\ub97c \ubc30\uc6b0\uae30 \uc704\ud574\u00a0\uc88c\ucda9\uc6b0\ub3cc \ud558\uba70 \uc77d\uace0, \ubcf4\uace0,\u00a0\ub4e3\uace0, \ucf54\ub529\ud574\ubcf8 \ucf54\uc2a4\ub97c \ub098\ub984 \uc815\ub9ac\ud574 \ubcf4\uc558\ub2e4. 1.\u00a0\uac1c\ub150\uc7a1\uae30 -\u00a0Angular's father\uc778\u00a0\ubbf8\uc2a4\ucf54\ub2d8\uc758\u00a0AngularJS \uc18c\uac1c \ub3d9\uc601\uc0c1\uc744 \ubcf8\ub2e4 : \ub2e8\uacc4\ubcc4\ub85c jQuery\uc640 \uc798 \ube44\uad50\ud558\uace0 \uc788\ub2e4 \u00a0 - Art of AngularJS\ub97c \ubcf4\uace0\uc11c \uc774\uc81c \ubc30\uc6cc\uc57c\ud560 \ud544\uc694\uc131\uc744 \ub290\uaef4\ubcf4\uc138\uc694. \uc774\uc81c \uc2dc\uc791\ud558\uc138\uc694. \u00a0 \u00a0\u00a0The Art of AngularJS from Matt Raible - AngularJS\uc758 \uc911\uc694 \uc694\uc18c\uc640 \uae30\ubcf8\uae30\ub97c\u2026","rel":"","context":"In &quot;JAVA&quot;","img":{"alt_text":"","src":"http:\/\/cfile29.uf.tistory.com\/image\/2161163B517694CB2CA7B5","width":350,"height":200},"classes":[]},{"id":246,"url":"https:\/\/blog.box.kr\/?p=246","url_meta":{"origin":379,"position":2},"title":"\ud14c\uc2a4\ud2b8 \uc790\ub3d9\ud654 \ub3c4\uad6c GUITAR","date":"2014-07-23","format":false,"excerpt":"http:\/\/dev.naver.com\/projects\/guitar \ud14c\uc2a4\ud2b8 \uc790\ub3d9\ud654 \ub3c4\uad6c GUITAR\u00a0The Platform 2011 2011.12.23\u00a013:41 \u00a0 NHN \uac80\uc0c9QA\ud300 \uc190\ubbfc\ud601 \ub04a\uc784\uc5c6\uc774 \ud14c\uc2a4\ud2b8 \uc790\ub3d9\ud654 \ub3c4\uad6c\uac00 \ub098\uc624\ub294 \uc774\uc720\ub294, \uadf8 \ud544\uc694\uc131\uc740 \uc808\ub300\uc801\uc774\uc9c0\ub9cc \uadf8 \uc5b4\ub290 \uac83\ub3c4 \uc694\uad6c\ub97c \ucda9\ubd84\ud788 \ub9cc\uc871\uc2dc\ud0a4\uc9c0 \ubabb\ud558\uace0 \uc788\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4. QA \ubd80\uc11c\uc5d0 \uc788\uc73c\uba74\uc11c \uc8fc\ubcc0\uc758 \ud14c\uc2a4\ud2b8 \uc790\ub3d9\ud654 \uc0ac\ub840\ub97c \uc0b4\ud3b4\ubcf4\uba74, \uc790\ub3d9\ud654 \uc791\uc5c5\uc744 \uc9c4\ud589\ud558\ub2e4\uac00 \uc5b4\ub290\uc0c8 \uc870\uc6a9\ud788 \uc911\ub2e8\ud558\uae30\ub3c4 \ud558\uace0, \ub05d\uae4c\uc9c0 \uc644\ub8cc\ud574\ub3c4 \uc624\ub7ab\ub3d9\uc548 \uc720\uc9c0\ubcf4\uc218\ud558\uc9c0 \ubabb\ud558\ub294\u2026","rel":"","context":"In &quot;\ucc38\uace0\ub97c \uc704\ud55c \uc800\uc7a5\ubb3c&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":367,"url":"https:\/\/blog.box.kr\/?p=367","url_meta":{"origin":379,"position":3},"title":"[\ud38c]Scala \uc2dc\uc791\ud558\uae30","date":"2014-09-15","format":false,"excerpt":"\u00a0 http:\/\/ppassa.wordpress.com\/2012\/02\/19\/getting_started_scala\/ Scala \uc2dc\uc791\ud558\uae30 \uc694\uc998 \ub4e4\uc5b4\uc11c\u00a0Scala\ub97c \uacf5\ubd80\ud558\uace0 \uc788\ub2e4. \uc544\uc9c1 \ub9ce\uc774 \ubd80\uc871\ud558\uc9c0\ub9cc, \uc9c0\uae08\uae4c\uc9c0 \ubc30\uc6b4 \uac83\ub4e4 \uae30\ub85d\ud574\ub450\uace0, \ub610 \ud639\uc2dc \uc870\uae08\uc774\ub77c\ub3c4 \ub3c4\uc6c0\uc774 \ub418\ub294 \ubd84\ub4e4\uc774 \uc788\uc744 \uc9c0 \ubab0\ub77c \uacf5\uc720\ud574\ubcf4\uace0\uc790 \ud55c\ub2e4. 1. \ub4e4\uc5b4\uac00\uba70 \ubb58 \ub610 \ubc30\uc6cc\uc57c \ud55c\ub2e8 \ub9d0\uc778\uac00? \uc774\ubbf8 C++, Java, Python, Ruby, JavaScript \ub4f1 \ub9ce\uc740 \ud504\ub85c\uadf8\ub798\ubc0d \uc5b8\uc5b4\ub4e4\uc774 \uc788\ub294\ub370, \uc65c \uc790\uafb8 \uc0c8\ub85c\uc6b4 \uc5b8\uc5b4\uac00 \ub098\uc624\uace0 \uc788\ub0d0?\u2026","rel":"","context":"In &quot;\ucc38\uace0\ub97c \uc704\ud55c \uc800\uc7a5\ubb3c&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":590,"url":"https:\/\/blog.box.kr\/?p=590","url_meta":{"origin":379,"position":4},"title":"[\ud38c]Java \uc5d0\uc11c DataBase Replication Master\/Slave (write\/read) \ubd84\uae30 \ucc98\ub9ac\ud558\uae30 \ud504\ub85c\uadf8\ub798\ubc0d","date":"2015-01-30","format":false,"excerpt":"Cloud\ud658\uacbd\uc5d0\uc11c DB\ub97c \uc0ac\uc6a9\ud558\ub2e4\ubcf4\ub2c8 Disk I\/O\ub098 \ub108\ubb34 \ub290\ub824\uc11c \ub9ce\uc740 \uace0\ubbfc\uc744 \ud558\uac8c \ub410\ub2e4. \uc77c\ub2e8 \uc0dd\uac01\ub098\ub294\uac83\uc774 \ub9ce\uc774 \ub4e4 \ud558\ub294 Replication\uc744 \uc774\uc6a9\ud55c \ubd80\ud558\ubd84\uc0b0 ( Master\ub294 Insert\/Update\ub9cc, Slave\ub294 SELECT\ub9cc ) \uadf8\ub7f0\ub370 \ub9c9\uc0c1 \ud560\ub824\uba74 \uc774\uac83 \uc800\uac83 \uc190\uc774 \ub9ce\uc774 \uac04\ub2e4.. \uadf8\ub798\uc11c.. \uc0dd\uac01\ub9cc \ud558\uace0 \uc801\uc6a9\uc744 \uc548\ud588\uc5c8\ub294\ub370.. \u00a0 \uc6f9\uc11c\ud551\uc744 \ud558\ub2e4\uac00 \uc774\ub7f0 \uae00\uc744 \ubc1c\uacac.. \uc544!! \uc774\ub807\uac8c \uc88b\uc744 \uc218\uac00.. \u00a0 \uc5ed\uc2dc\u2026","rel":"","context":"In &quot;JAVA&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":720,"url":"https:\/\/blog.box.kr\/?p=720","url_meta":{"origin":379,"position":5},"title":"[\ud38c]Java \uc5d0\uc11c DataBase Replication Master\/Slave (write\/read) \ubd84\uae30 \ucc98\ub9ac\ud558\uae30","date":"2015-04-15","format":false,"excerpt":"http:\/\/kwon37xi.egloos.com\/ \ub300\uaddc\ubaa8 \uc11c\ube44\uc2a4 \uac1c\ubc1c\uc2dc\uc5d0 \uac00\uc7a5 \uae30\ubcf8\uc801\uc73c\ub85c \ud558\ub294 \ud29c\ub2dd\uc740 \ubc14\ub85c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c Write\uc640 Read DB\ub97c Replication(\ub9ac\ud50c\ub9ac\ucf00\uc774\uc158)\ud558\uace0 \uc4f0\uae30 \uc791\uc5c5\uc740 Master(Write)\ub85c \ubcf4\ub0b4\uace0 \uc77d\uae30 \uc791\uc5c5\uc740 Slave(Read)\ub85c \ubcf4\ub0b4\uc5b4 \ubd80\ud558\ub97c \ubd84\uc0b0 \uc2dc\ud0a4\ub294 \uac83\uc774\ub2e4. \ud2b9\ud788 \ub300\ubd80\ubd84\uc758 \uc11c\ube44\uc2a4\ub294 \uc77d\uae30\uac00 \uc555\ub3c4\uc801\uc73c\ub85c \ub9ce\uae30 \ub54c\ubb38\uc5d0\u00a0 Slave\ub294 \uc5ec\ub7ec \ub300\ub97c \ub450\uc5b4 \uc77d\uae30 \ubd80\ud558\ub97c \ubd84\uc0b0 \uc2dc\ud0a8\ub2e4. \uadf8\ub7f0\ub370 \ub610 \ud558\ub098 \uae30\uc5b5\ud574\uc57c \ud560 \uac83\uc774 Replication\uc740 \ube44\ub85d \uc9e7\ub354\ub77c\ub3c4\u2026","rel":"","context":"In &quot;JAVA&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/blog.box.kr\/index.php?rest_route=\/wp\/v2\/posts\/379"}],"collection":[{"href":"https:\/\/blog.box.kr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.box.kr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.box.kr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.box.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=379"}],"version-history":[{"count":0,"href":"https:\/\/blog.box.kr\/index.php?rest_route=\/wp\/v2\/posts\/379\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.box.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=379"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.box.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=379"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.box.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=379"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}