<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>머드초보의 블로그</title>
    <link>https://mudchobo.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 25 Jun 2026 18:43:44 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>머드초보</managingEditor>
    <image>
      <title>머드초보의 블로그</title>
      <url>https://t1.daumcdn.net/cfile/tistory/241FB74954B504660F</url>
      <link>https://mudchobo.tistory.com</link>
    </image>
    <item>
      <title>[Node.js] cheerio - jquery 기반의 웹스크래핑할 수 있는 html parser</title>
      <link>https://mudchobo.tistory.com/563</link>
      <description>&lt;p&gt;API는 제공하지 않는 웹사이트에서&amp;nbsp;데이터를 쓰고 싶을 때에는 &lt;b&gt;웹스크래핑 방식&lt;/b&gt;으로 데이터를 많이 들 가져오는데요. nodejs용으로 엄청 편한 라이브러리가 있어서 소개합니다. 예전에 이거 할 때 잘 모르던 꼬꼬마 시절에 html을 불러와서 indexOf같은 걸로 찾아서 substring해서 했던 것 같은데...찾아보니 훨씬 편한 라이브러리들이 많이 있네요.&lt;/p&gt;&lt;p&gt;제가 롯데마트를 주로 애용하는데요. 롯데마트에서 데이터를 다 긁어와서 어제보다 떨어진 상품 목록을 가져오는 기능과 상품가격이 떨어지면 유저에게 푸쉬를 보내는 앱을 만드려고 했는데, 어떤 분이 더 완벽하게 만드셔서...다른 아이템을&amp;nbsp;제작하기로...-_-&lt;/p&gt;&lt;p&gt;마트 자주 가시는 분들 &lt;b&gt;마트모어&lt;/b&gt; 앱 쓰세요!&amp;nbsp;디게 좋네요!&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.mart.trace&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;b&gt;https://play.google.com/store/apps/details?id=com.mart.trace&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그래도 삽질한 것은 정리!!&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;cheerio 사이트&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://cheeriojs.github.io/cheerio/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;b&gt;http://cheeriojs.github.io/cheerio/&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;cheerio github&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/cheeriojs/cheerio&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;b&gt;https://github.com/cheeriojs/cheerio&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;예제 코드&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;코드를 잘 보면 &lt;b&gt;jquery selector&lt;/b&gt;를 그대로 쓰는 것을 알 수 있습니다. request 라이브러를 통해서 웹사이트 html을 가져온 다음 cheerio를 이용해 파싱 후 jquery selector를 이용해 그대로 원하는 데이터를 가져오면 됩니다.&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;&lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;var&lt;/span&gt; request &lt;span style=&quot;color: #333333&quot;&gt;=&lt;/span&gt; require(&lt;span style=&quot;background-color: #fff0f0&quot;&gt;'request'&lt;/span&gt;);
&lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;var&lt;/span&gt; cheerio &lt;span style=&quot;color: #333333&quot;&gt;=&lt;/span&gt; require(&lt;span style=&quot;background-color: #fff0f0&quot;&gt;'cheerio'&lt;/span&gt;);

request({
    url&lt;span style=&quot;color: #333333&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;background-color: #fff0f0&quot;&gt;'http://www.lottemart.com/category/categoryList.do?CategoryID=C001001100010001'&lt;/span&gt;,
    headers&lt;span style=&quot;color: #333333&quot;&gt;:&lt;/span&gt; {
        &lt;span style=&quot;background-color: #fff0f0&quot;&gt;'User-Agent'&lt;/span&gt;&lt;span style=&quot;color: #333333&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;background-color: #fff0f0&quot;&gt;'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.99 Safari/537.36'&lt;/span&gt;
    }
}, &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;function&lt;/span&gt;(err, res, html) {
    &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;if&lt;/span&gt; (err) {
        console.log(err);
        &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;return&lt;/span&gt;;
    }
    &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;var&lt;/span&gt; $ &lt;span style=&quot;color: #333333&quot;&gt;=&lt;/span&gt; cheerio.load(html);
    &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;var&lt;/span&gt; liList &lt;span style=&quot;color: #333333&quot;&gt;=&lt;/span&gt; $(&lt;span style=&quot;background-color: #fff0f0&quot;&gt;'#list_prod_1'&lt;/span&gt;).children(&lt;span style=&quot;background-color: #fff0f0&quot;&gt;'ul'&lt;/span&gt;).children(&lt;span style=&quot;background-color: #fff0f0&quot;&gt;'li'&lt;/span&gt;);
    &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;var&lt;/span&gt; i &lt;span style=&quot;color: #333333&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #0000DD; font-weight: bold&quot;&gt;0&lt;/span&gt;; i &lt;span style=&quot;color: #333333&quot;&gt;&amp;lt;&lt;/span&gt; liList.length; i&lt;span style=&quot;color: #333333&quot;&gt;++&lt;/span&gt;) {
        &lt;span style=&quot;color: #888888&quot;&gt;// productId를 가져오기 위함.&lt;/span&gt;
        &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;var&lt;/span&gt; split &lt;span style=&quot;color: #333333&quot;&gt;=&lt;/span&gt; $(liList[i]).find(&lt;span style=&quot;background-color: #fff0f0&quot;&gt;'.pr_price .t_roman &amp;gt; span'&lt;/span&gt;).attr(&lt;span style=&quot;background-color: #fff0f0&quot;&gt;'id'&lt;/span&gt;).split(&lt;span style=&quot;background-color: #fff0f0&quot;&gt;'_'&lt;/span&gt;);
        &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;if&lt;/span&gt; (split.length &lt;span style=&quot;color: #333333&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #0000DD; font-weight: bold&quot;&gt;2&lt;/span&gt;) {
            &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;continue&lt;/span&gt;;
        }
        &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;var&lt;/span&gt; productId &lt;span style=&quot;color: #333333&quot;&gt;=&lt;/span&gt; split[&lt;span style=&quot;color: #0000DD; font-weight: bold&quot;&gt;1&lt;/span&gt;];
        &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;var&lt;/span&gt; price &lt;span style=&quot;color: #333333&quot;&gt;=&lt;/span&gt; $(liList[i]).find(&lt;span style=&quot;background-color: #fff0f0&quot;&gt;'#ItemCurrSalePrc_'&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;+&lt;/span&gt; productId).text();
        price &lt;span style=&quot;color: #333333&quot;&gt;=&lt;/span&gt; price.replace(&lt;span style=&quot;color: #000000; background-color: #fff0ff&quot;&gt;/,/gi&lt;/span&gt;, &lt;span style=&quot;background-color: #fff0f0&quot;&gt;&quot;&quot;&lt;/span&gt;);
        &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;var&lt;/span&gt; title &lt;span style=&quot;color: #333333&quot;&gt;=&lt;/span&gt; $(liList[i]).find(&lt;span style=&quot;background-color: #fff0f0&quot;&gt;'#prodNm_'&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;+&lt;/span&gt; productId).val();
        console.log(productId &lt;span style=&quot;color: #333333&quot;&gt;+&lt;/span&gt; &lt;span style=&quot;background-color: #fff0f0&quot;&gt;':'&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;+&lt;/span&gt; title &lt;span style=&quot;color: #333333&quot;&gt;+&lt;/span&gt; &lt;span style=&quot;background-color: #fff0f0&quot;&gt;'('&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;+&lt;/span&gt; price &lt;span style=&quot;color: #333333&quot;&gt;+&lt;/span&gt; &lt;span style=&quot;background-color: #fff0f0&quot;&gt;')'&lt;/span&gt;);
    }
});
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;결과&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;node test.js 
8808836972445:고향의 향기미&lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;20kg/국내산&lt;span style=&quot;color: #333333&quot;&gt;)(&lt;/span&gt;35900&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;
8804595000023:임금님표 이천쌀&lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;10KG&lt;span style=&quot;color: #333333&quot;&gt;)(&lt;/span&gt;35800&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;
8809001961639:고시히카리&lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;10Kg&lt;span style=&quot;color: #333333&quot;&gt;)(&lt;/span&gt;36500&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;
8808509000420:대왕님표 여주쌀&lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;10kg&lt;span style=&quot;color: #333333&quot;&gt;)(&lt;/span&gt;35500&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;
8808433100029:GAP 철원오대미&lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;10KG&lt;span style=&quot;color: #333333&quot;&gt;)(&lt;/span&gt;35000&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;
8808836972438:고향의 향기미&lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;10Kg&lt;span style=&quot;color: #333333&quot;&gt;)(&lt;/span&gt;25000&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;
8809001740135:황토배기신동진쌀&lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;10Kg&lt;span style=&quot;color: #333333&quot;&gt;)(&lt;/span&gt;28000&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;
8809013191468:금싸라기&lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;10Kg&lt;span style=&quot;color: #333333&quot;&gt;)(&lt;/span&gt;28500&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;
8808433200026:철원평야쌀&lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;10Kg&lt;span style=&quot;color: #333333&quot;&gt;)(&lt;/span&gt;30000&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;
8809001564052:서천농협 순미&lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;20Kg&lt;span style=&quot;color: #333333&quot;&gt;)(&lt;/span&gt;58000&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;
8809088510638:즉석오대미&lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;10KG&lt;span style=&quot;color: #333333&quot;&gt;)(&lt;/span&gt;39800&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;
L000000120009:경기도 김포금쌀 20kg &lt;span style=&quot;color: #333333&quot;&gt;[&lt;/span&gt;1,000포한정&lt;span style=&quot;color: #333333&quot;&gt;](&lt;/span&gt;49900&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Node.js</category>
      <category>nodejs cheerio javascript</category>
      <author>머드초보</author>
      <guid isPermaLink="true">https://mudchobo.tistory.com/563</guid>
      <comments>https://mudchobo.tistory.com/563#entry563comment</comments>
      <pubDate>Sun, 5 Apr 2015 10:08:13 +0900</pubDate>
    </item>
    <item>
      <title>[RubyOnRails] DB Replication Gem - Octopus 셋팅 정리</title>
      <link>https://mudchobo.tistory.com/562</link>
      <description>&lt;p&gt;&lt;b&gt;DBCharmer&lt;/b&gt;를 사용하고 있었는데, 더 이상 업데이트를 안한다고 해서 다른 걸 찾다보니 이거 밖에 없네요&amp;nbsp;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;레일즈4에서 사용해야 하는데, DBCharmer는 3.X버전밖에 지원하지 않아요. 그래서 옮길 겸 정리!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;물론 &lt;b&gt;Replication&lt;/b&gt;(Master/Slave) 외에 &lt;b&gt;Shard&lt;/b&gt;도 지원하는데, 그냥 여러 개의 Database를 정의하고 그 중 원하는 걸로 쓰게 하는 형식으로 되어있어요. 즉 키별로 샤드를 나누려면 직접 구현해야할 것 같아요. 그냥 Database를 선택해서 쓸 수 있다 정도로만 되어 있는 것 같네요.&amp;nbsp;샤드는 잘 안해봐서 잘 모르겠지만 대충 그런 느낌이네요.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;일단 나의 정리의 목적은 &lt;b&gt;Replication&lt;/b&gt;이니까 이것만-_-&lt;/p&gt;&lt;p&gt;젬 깃허브입니다.&lt;br /&gt;&lt;a href=&quot;https://github.com/tchandy/octopus&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://github.com/tchandy/octopus&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;1. Master/Slave DB준비&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;보통은 시스템팀이 있는 회사라면 다 알아서 해주지만 한 번 해보는 것도 나쁘진 않아요. 이거 보고 따라하세요. 두 번 따라하세요-_-&lt;br /&gt;&lt;a href=&quot;http://oqlid.blogspot.kr/2013/05/mariadb-masterslave-replication-tutorial.html&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://oqlid.blogspot.kr/2013/05/mariadb-masterslave-replication-tutorial.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;2. Rails4 프로젝트 생성.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;루비와 레일즈는 셋팅이 되어있다는 가정하에...&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;rails new ReplicationTest
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;3. Gemfile에 Octopus 및 필요한 것 추가.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Gemfile&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;gem &lt;span style=&quot;background-color: #fff0f0&quot;&gt;'ar-octopus'&lt;/span&gt;
gem &lt;span style=&quot;background-color: #fff0f0&quot;&gt;'mysql2'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;옥토퍼스랑 mysql만 있으면 돼요.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;4. database&amp;nbsp;설정&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;DBCharmer에서는 database.yml에 master slave를 한단계 더 만들어서 설정해서 한 파일에 다 넣었는데요. 얘는 database.yml에는 마스터디비정보만 넣고, shards.yml파일을 새로 만들어서 slave디비정보를 넣어줍니다.&lt;/p&gt;&lt;p&gt;master는 그대로 database.yml에 설정합니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;database.yml&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;&lt;p&gt;default: &lt;span style=&quot;color: #997700; font-weight: bold&quot;&gt;&amp;amp;default&lt;/span&gt;
  adapter: mysql
  encoding: utf8
  database: mudchobo
  username: root
  password: 1234
  host: 마스터주소
  port: 3306
  pool: 5
  timeout: 5000

development:
  &amp;lt;&amp;lt;: &lt;span style=&quot;color: #996633&quot;&gt;*default&lt;/span&gt;

test:
  &amp;lt;&amp;lt;: &lt;span style=&quot;color: #996633&quot;&gt;*default&lt;/span&gt;
  database: mudchobo_test

production:
  &amp;lt;&amp;lt;: &lt;span style=&quot;color: #996633&quot;&gt;*default&lt;/span&gt;
  database: mudchobo_production
&lt;/p&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;slave들은 따로 파일을 만들어서 관리합니다.&lt;/p&gt;&lt;p&gt;&lt;b&gt;config/shards.xml&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;&lt;p&gt;default: &lt;span style=&quot;color: #997700; font-weight: bold&quot;&gt;&amp;amp;default&lt;/span&gt;
  adapter: mysql2
  encoding: utf8
  username: root
  password: 1234
  host: 슬레이브주소
  port: 3306
  pool: 5
  timeout: 5000
  
octopus:
  replicated: true
  environments:
    - development
    - production

  development:
    slave1:
      &amp;lt;&amp;lt;: &lt;span style=&quot;color: #996633&quot;&gt;*default&lt;/span&gt;
      database: mudchobo

  production:
    slave1:
      &amp;lt;&amp;lt;: &lt;span style=&quot;color: #996633&quot;&gt;*default&lt;/span&gt;
      database: mudchobo_production
&lt;/p&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;설정은 비슷한데, &lt;b&gt;멀티 slave&lt;/b&gt;를 둘 수 있어서 환경 아래 &lt;b&gt;slave1&lt;/b&gt;, &lt;b&gt;slave2&lt;/b&gt; 등 여러 개를 두개 되면 select하는 것들에 대해서 알아서 선택해서 접속해서 데이터를 가져옵니다.&lt;/p&gt;&lt;p&gt;replicated: true로 사용해야 가능하고,&amp;nbsp;혹시 특정 모델에만 리플리케이션을 하고 싶으면&amp;nbsp;fully_replicated: false를 추가하고, 리플리케이션 허용 하는 것에 대해서는 모델에서 아래와 같이 넣어주면 됩니다.&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;&lt;span style=&quot;color: #888888&quot;&gt;#This class is replicated, writes to master and reads to slave.&lt;/span&gt;
&lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #BB0066; font-weight: bold&quot;&gt;Cat&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #AA6600&quot;&gt;ActiveRecord&lt;/span&gt;:&lt;span style=&quot;color: #AA6600&quot;&gt;:Base&lt;/span&gt;
  replicated_model()
&lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;5. db migration 생성 및 INSERT SELECT 테스트.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;테이블 생성해서 테스트 해봅시다. 모델은 간단히 그냥 dummy라는 테이블을 만들고, name칼럼을 하나 넣어봅시다.&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;&lt;span style=&quot;color: #996633&quot;&gt;$ &lt;/span&gt;&lt;b&gt;rails g model dummy name:string&lt;/b&gt;
      invoke  active_record
      create    db/migrate/20150403162358_create_dummies.rb
      create    app/models/dummy.rb
      invoke    test_unit
      create      &lt;span style=&quot;color: #007020&quot;&gt;test&lt;/span&gt;/models/dummy_test.rb
      create      &lt;span style=&quot;color: #007020&quot;&gt;test&lt;/span&gt;/fixtures/dummies.yml
&lt;span style=&quot;color: #996633&quot;&gt;$ &lt;/span&gt;&lt;b&gt;rake db:migrate&lt;/b&gt;
&lt;span style=&quot;color: #333333&quot;&gt;==&lt;/span&gt; 20150403162358 CreateDummies: migrating - Shard: &lt;span style=&quot;color: #996633&quot;&gt;master&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;====================&lt;/span&gt;
-- create_table&lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;:dummies&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;
   -&amp;gt; 0.0061s
&lt;span style=&quot;color: #333333&quot;&gt;==&lt;/span&gt; 20150403162358 CreateDummies: migrated &lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;0.0062s&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt; - Shard: &lt;span style=&quot;color: #996633&quot;&gt;master&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;===========&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;그러면 마스터에 테이블이 하나 생성이 되는데요. 물론 리플이 되어있으면 슬레이브에도 있겠죠. 데이터를 넣어보고 가져와봅시다.&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;&lt;span style=&quot;color: #996633&quot;&gt;$ &lt;/span&gt;&lt;b&gt;rails c&lt;/b&gt;
Loading development environment &lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;Rails 4.1.7&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;
irb&lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;main&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;:001:0&amp;gt; &lt;b&gt;Dummy.create&lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;name: &lt;span style=&quot;background-color: #fff0f0&quot;&gt;'fucking'&lt;/span&gt;&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;&lt;/b&gt;
   &lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;0.3ms&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;  BEGIN
  SQL &lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;1.2ms&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;  INSERT INTO &lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;dummies&lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;created_at&lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;, &lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;name&lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;, &lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;updated_at&lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt; VALUES &lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #fff0f0&quot;&gt;'2015-04-03 16:29:27'&lt;/span&gt;, &lt;span style=&quot;background-color: #fff0f0&quot;&gt;'fucking'&lt;/span&gt;, &lt;span style=&quot;background-color: #fff0f0&quot;&gt;'2015-04-03 16:29:27'&lt;/span&gt;&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;
   &lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;0.6ms&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;  &lt;span style=&quot;color: #996633&quot;&gt;COMMIT&lt;/span&gt;
&lt;span style=&quot;color: #333333&quot;&gt;=&lt;/span&gt;&amp;gt; &lt;span style=&quot;color: #888888&quot;&gt;#&amp;lt;Dummy id: 2, name: &quot;fucking&quot;, created_at: &quot;2015-04-03 16:29:27&quot;, updated_at: &quot;2015-04-03 16:29:27&quot;&amp;gt;&lt;/span&gt;
irb&lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;main&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;:002:0&amp;gt; &lt;b&gt;Dummy.find&lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;2&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;&lt;/b&gt;
&lt;span style=&quot;color: #333333&quot;&gt;[&lt;/span&gt;Shard: slave1&lt;span style=&quot;color: #333333&quot;&gt;]&lt;/span&gt;  Dummy Load &lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;0.6ms&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;  SELECT  &lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;dummies&lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;.* FROM &lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;dummies&lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;  WHERE &lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;dummies&lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;.&lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;id&lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;=&lt;/span&gt; 2 LIMIT &lt;span style=&quot;color: #996633&quot;&gt;1&lt;/span&gt;
&lt;span style=&quot;color: #333333&quot;&gt;=&lt;/span&gt;&amp;gt; &lt;span style=&quot;color: #888888&quot;&gt;#&amp;lt;Dummy id: 2, name: &quot;fucking&quot;, created_at: &quot;2015-04-03 16:29:27&quot;, updated_at: &quot;2015-04-03 16:29:27&quot;&amp;gt;&lt;/span&gt;
irb&lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;main&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;:003:0&amp;gt; 
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;잘 되는데....슬레이브에서 가져오는지 잘 모르겠네요... 슬레이브 서버를 죽여버릴까......-_-&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;irb&lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;main&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;:008:0* &lt;b&gt;Dummy.create&lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;name: &lt;span style=&quot;background-color: #fff0f0&quot;&gt;'yes!'&lt;/span&gt;&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;&lt;/b&gt;
   &lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;1.0ms&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;  BEGIN
  SQL &lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;0.9ms&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;  INSERT INTO &lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;dummies&lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;created_at&lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;, &lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;name&lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;, &lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;updated_at&lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt; VALUES &lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #fff0f0&quot;&gt;'2015-04-03 16:31:55'&lt;/span&gt;, &lt;span style=&quot;background-color: #fff0f0&quot;&gt;'yes!'&lt;/span&gt;, &lt;span style=&quot;background-color: #fff0f0&quot;&gt;'2015-04-03 16:31:55'&lt;/span&gt;&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;
   &lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;1.2ms&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;  &lt;span style=&quot;color: #996633&quot;&gt;COMMIT&lt;/span&gt;
&lt;span style=&quot;color: #333333&quot;&gt;=&lt;/span&gt;&amp;gt; &lt;span style=&quot;color: #888888&quot;&gt;#&amp;lt;Dummy id: 3, name: &quot;yes!&quot;, created_at: &quot;2015-04-03 16:31:55&quot;, updated_at: &quot;2015-04-03 16:31:55&quot;&amp;gt;&lt;/span&gt;
irb&lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;main&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;:009:0&amp;gt; &lt;b&gt;Dummy.find&lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;3&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;&lt;/b&gt;
&lt;span style=&quot;color: #333333&quot;&gt;[&lt;/span&gt;Shard: slave1&lt;span style=&quot;color: #333333&quot;&gt;]&lt;/span&gt;  Dummy Load &lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;0.2ms&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;  SELECT  &lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;dummies&lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;.* FROM &lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;dummies&lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;  WHERE &lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;dummies&lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;.&lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;id&lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;=&lt;/span&gt; 3 LIMIT 1
Mysql2::Error: closed MySQL connection: SELECT  &lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;dummies&lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;.* FROM &lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;dummies&lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;  WHERE &lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;dummies&lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;.&lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt;id&lt;span style=&quot;background-color: #fff0f0&quot;&gt;`&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;=&lt;/span&gt; 3 LIMIT 1
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;아 잘되네요.&lt;/p&gt;&lt;p&gt;그 외에도 slave서버를 선택해서 사용할 수 있는 using메소드도 있어요.&amp;nbsp;&lt;/p&gt;&lt;p&gt;뭔가 별거 아니지만 장황하게 썼다-_-&lt;/p&gt;&lt;p&gt;PS. 한 프로젝트에서 멀티 디비를 사용하는 프로젝트에서도 유용하게 사용할 수 있어요. 그 Octopus_establish가 있는데, 그걸 통해서 해당 모델에서는 그것에 대한 슬레이브만 접근할 수 있는 설정도 할 수 있어요! 유용하게 쓰세요!&lt;/p&gt;</description>
      <category>루비(Ruby)</category>
      <category>ruby on rails db replication mariadb mysql</category>
      <author>머드초보</author>
      <guid isPermaLink="true">https://mudchobo.tistory.com/562</guid>
      <comments>https://mudchobo.tistory.com/562#entry562comment</comments>
      <pubDate>Sat, 4 Apr 2015 01:40:32 +0900</pubDate>
    </item>
    <item>
      <title>[게임] 스트레스 풀며 즐길 수 있는 EA의 UFC 모바일 게임!</title>
      <link>https://mudchobo.tistory.com/561</link>
      <description>&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 400px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/260BE83D551D4AE51C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F260BE83D551D4AE51C&quot; width=&quot;400&quot; height=&quot;225&quot; filename=&quot;IMG_0264.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;스마트폰이 나오고 게임은 모바일 게임만 하고 있는데요. 재미있는 게임들이 많이 나오고 있어서 참 좋은데, 고퀄리티 게임이 아직은 많이 부족하죠. 그나마 인피니트 블레이드가 고퀄리티 그래픽의 게임이였던 것 같네요.&lt;/p&gt;&lt;p&gt;&amp;nbsp;최근에 EA에서 UFC(?)의 인기에 힘입어 &lt;b&gt;UFC 모바일&lt;/b&gt;을 냈습니다.&amp;nbsp;기존에 콘솔버전도 있었는데 모바일로 나온 것 같습니다. 모바일로 나오면서 모바일에 최적화된 컨트롤를 제공합니다.&lt;/p&gt;&lt;p&gt;아...아직 &lt;b&gt;아이폰&lt;/b&gt; 밖에 없어보입니다. 안드로이드도 있는데, 실제 한국에서는 다운 못받게 되어 있네요.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;1. 격투 화면&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;그래픽은 매우 좋습니다!&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 400px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/233FB149551D572A13&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F233FB149551D572A13&quot; width=&quot;400&quot; height=&quot;225&quot; filename=&quot;IMG_0271.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;그냥 상단 터치는 약펀치, 하단 터치는 하단 약펀치 입니다. 그리고 오른쪽으로 드래그를 하면 앞으로 나가면서 펀치! 대각선으로 올리면 어퍼컷, 뒤로 드래그를 하면 회피, 두손가락 터치홀딩은 막기입니다. 어려워보이지만, 하다보면 매우 쉽고 직관적이게 잘 되어 있습니다.&lt;/p&gt;&lt;p&gt;사실 격투할 때에는 제가 해보니까 헤비급은 대충 회피하다가 슬로우로 회피되면 그때 펀치를 때리면 4번 평타를 때릴 수 있습니다. 평타를 계속 때리면 좌측하단에 스킬 케이지가 차는데요. 하나씩 찰 때마다 랜덤으로 스킬을 사용할 수 있게 되며, 총 3개까지 킵해둘 수 있습니다.&lt;/p&gt;&lt;p&gt;그리고 가끔 테이크다운 시키는 기술이 튀어 나오는데, 이걸 시전하다가 걸리면 아래 게이지가 나오는데, 거기에 파란색 영역으로 바가 갈 때 터치를 해주면 걸리게 됩니다. 이게 걸리면 누워서 팰 수 있는데, 누워서 패는 스킬도 따로 있어서 게이지가 찰 때마다 스킬이 차는 것은 같습니다.&lt;/p&gt;&lt;p&gt;가끔 스킬 높은 놈들이랑 싸우면 내가 눕혔어도 이 놈이 헤딩을 하거나 주먹을 잡고 때리면 더 손해보는 경우도 있으니 주의를...-_-&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 400px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/234CC03C551D588419&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F234CC03C551D588419&quot; width=&quot;400&quot; height=&quot;225&quot; filename=&quot;IMG_0272.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;span class=&quot;cap1&quot; style=&quot;display: block; max-width:100%; &quot;&gt;위에 캡쳐한 놈 겨우 잡음 ㄷㄷ&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;2. 커리어&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;게임을 시작하면 커리어모드가 뜹니다. 스테이지 형식으로 되어있는데요. 하나하나 격파해나가는 것입니다. 얼추 세어보니 총 200스테이지까지 있군요.&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 400px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/23705441551D4BA632&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F23705441551D4BA632&quot; width=&quot;400&quot; height=&quot;225&quot; filename=&quot;IMG_0266.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;span class=&quot;cap1&quot; style=&quot;display: block; max-width:100%; &quot;&gt;휴...아직 절반도 못왔네요...&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;일단 선수를 기본적으로 한 명을 주는데요. &quot;&lt;b&gt;알렉산더 구스타프손&lt;/b&gt;&quot;&amp;nbsp;입니다. 사실 UFC를 안봐서 잘 모르겠습니다. 선수의 등급은 선수의 숫자 옆에 있는 색상으로 구분하는데요. 선수컬렉션에서 제일 비싼 놈이 보라색인 걸로 봐서 &lt;b&gt;보라색 &amp;gt; 파란색 &amp;gt; 흰색&lt;/b&gt; 같아 보입니다. 사실 처음에 케릭터 등급이 있는 줄 몰랐....&lt;/p&gt;&lt;p&gt;암튼, 이 선수별로 커리어 스테이지가 &lt;b&gt;200판&lt;/b&gt;씩 있는데요. 선수별로 다 깨려면 체급별 선수가 약 20명정도 있으니, 20(선수)x4(체급)x200(스테이지) = 16000스테이지를 깨면 되는 듯... 물론 현질해서 선수를 다 산다는 가정하에...&lt;/p&gt;&lt;p&gt;커리어를 10판정도 깰 때마다 &lt;b&gt;UFC상자&lt;/b&gt;를 열&amp;nbsp;수 있는데, 여기에는 &lt;b&gt;훈련팩&lt;/b&gt; 또는 가끔 &lt;b&gt;선수&lt;/b&gt;가&amp;nbsp;나옵니다. 이 훈련팩은 어디에 쓰이냐! 선수를 훈련하는데에 쓰입니다. 선수가 게임을 한다고 해서 레벨업이 되고 그러지 않아요. 훈련팩으로 훈련을 시켜야 선수가 성장합니다.&lt;/p&gt;&lt;p&gt;일단 스테이지 한 판!&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;tt-youtube-plugin&quot; style=&quot;text-align: center&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/p6Tv43d7KIA?rel=0&quot; width=&quot;560&quot; height=&quot;420&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;아오.. KO시켰어야 했는데...위와 같은 스테이지를 계속 하게 됩니다. 그리고 계속 클리어 해야하죠. 어느 정도 하다보면 상대방 패턴을 파악하게 됩니다. 사실 그냥 회피하고 펀치하고 기가 차서 스킬 생기면 스킬 쓰면 됩니다. 대부분 이런 패턴으로 이길 수 있어요. 지금도 상대방이 체력이 저보다 두 배가 많지만 상대방의 강타격만 조심하면 충분히 이길 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;이기고 나면 &lt;b&gt;소정의 은화&lt;/b&gt;를 받습니다. 져도 타격 몇 번 카운터 몇 번 들어갔느냐에 따라서 은화를 받긴 받지만 더 적게 받죠. 이 은화로 할 수 있는 것은 훈련팩과 부스트를 살 수 있는데요. 부스트는 시간이 지나면 모이니 훈련팩을 사는 것을 추천합니다. 훈련에서 가끔 선수도 나오니까 2000은화 모이면 바로바로 뽑으세요.&amp;nbsp;&lt;/p&gt;&lt;p&gt;그리고 &lt;b&gt;체력 80%이상&lt;/b&gt; 남기고 클리어 시 &lt;b&gt;별3개&lt;/b&gt;로 은화보너스를 더욱 많이 줍니다. &lt;b&gt;체력40%이상&lt;/b&gt; 남기고 클리어 시에도 &lt;b&gt;별2개&lt;/b&gt;로 은화보너스를 줍니다. 그냥 클리어 시에는 별1개만 받게 되는데, 이 때 지난 스테이지를 다시 할 수 있는데, 다시 체력80%이상으로 클리어 하면 골드보너스를 주니, 훈련으로 레벨을 올려서 지난 스테이지를 클리어해서 은화를 버세요!&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;3. 선수&amp;nbsp;시스템&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;체급이 &lt;b&gt;헤비급&lt;/b&gt;, &lt;b&gt;미들급&lt;/b&gt;, &lt;b&gt;라이트급&lt;/b&gt;, &lt;b&gt;플라이급&lt;/b&gt; 총 4개급이 있습니다. 처음에 알렉산더밖에 없어서 하나 빼고 다 잠겨 있는데, 훈련팩 계속 까다 보면 선수가 나옵니다. 그 선수들로 미들급, 라이트급, 플라이급을 열 수 있어요. 물론 돈이 많다면 그냥 구매하셔도 됩니다-_- 이걸 여는 게 중요한 게, 체급별로 급여를 받을 수 있는데, 이 급여는 12시간마다 풀이 찹니다. 풀찰 때 체급별 1000은화정도 받을 수 있어요. 그러니 다 열면 &lt;b&gt;12시간&lt;/b&gt;마다 &lt;b&gt;4000은화&lt;/b&gt;를 벌 수 있어 &lt;b&gt;12시간&lt;/b&gt;마다 &lt;b&gt;훈련팩 2개&lt;/b&gt;를 공짜로 깔 수 있어요!&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;뭐 선수를 사는 것은 말리지 않겠습니다만, 굳이 사지 않아도 레어(파란색)정도 선수는 자주 나오는 것 같아요. 선수 가격 개념이 없어서 선수 구매는 비추 ㄷㄷ&amp;nbsp;헤비급만 다 더해봤는데, 40825골드가 드네요. 40825골드는 약 40만원이면 구매할 수 있네요. EA의 개념없는 BM정책은 UFC에서도 계속 됩니다...&lt;/span&gt;&lt;/p&gt;&lt;p&gt;선수는 훈련 시킬 수 있는데요. 선수마다 스킬이 조금씩 다릅니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 400px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/24206F39551D52F90D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F24206F39551D52F90D&quot; width=&quot;400&quot; height=&quot;225&quot; filename=&quot;IMG_0268.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span style=&quot;text-align: left; font-size: 9pt; line-height: 1.5;&quot;&gt;스킬들이 보입니다. 특정 레벨이 되면 스킬들이 열립니다. 30레벨일 때 열리는 것이 마지막인듯염. 확실히 높은 레벨일 때 열리는 스킬들이 타격할 때 쎕니다. 20쯤에서 배운 엘보우 어택은 매우 강력하더군요.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;그리고 위에 이미지에서 &lt;b&gt;빛이 나는 스킬&lt;/b&gt;이 있는데, 이건 훈련스킬 중에 선수가 가진 스킬과 &lt;b&gt;일치&lt;/b&gt;하는 스킬이 있다는 겁니다. 이 일치하는 스킬로 훈련을 하면 경험치가 6배가 됩니다!&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 400px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/236A284B551D537D1F&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F236A284B551D537D1F&quot; width=&quot;400&quot; height=&quot;225&quot; filename=&quot;IMG_0269.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;span class=&quot;cap1&quot; style=&quot;display: block; max-width:100%; &quot;&gt;우오오! 한 번에 레벨이 2개나 올랐네요!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;이걸 잘 활용해야 선수를 금방 키울 수 있어요. 이렇게 훈련을 하면 레벨 경험치도 상승하고 선수의 능력치인 체력/스탠딩/그라운드 능력도 같이 올라갑니다.&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;4. 부스트 시스템&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;부스트가 &lt;b&gt;1칸&lt;/b&gt;차는데 거의 &lt;b&gt;2시간&lt;/b&gt;쯤 걸리는 것 같은데, 어느 정도 걸리는지 잘 모르겠네요. 겁나 안차는데, 이게 &lt;b&gt;한 경기&lt;/b&gt;에 한해서 해당 선수의 &lt;b&gt;스탠딩/그라운드&lt;/b&gt; 능력을 상승 시켜 줍니다. 정말 안깨지는 스테이지가 있다면 부스트 모아뒀다가 올인해서 클리어 하면 됩니다. 부스트 10개 썼는데 지면 접고 싶을 듯-_-&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 400px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2671FD50551D55C310&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2671FD50551D55C310&quot; width=&quot;400&quot; height=&quot;225&quot; filename=&quot;IMG_0270.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;b&gt;부스트&lt;/b&gt;는 &lt;b&gt;은화 2000개&lt;/b&gt;로도 살 수 있습니다. 하지만, 은화로 그냥 훈련팩을 사는 게 나아요. 한 스테이지를 깼다해도 분명 다음 스테이지를 못 깰 테니깐요.&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;5. &amp;nbsp;기타 등등&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;b&gt;(1)라이브이벤트&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;아직도 뭐하는 것인지 모르겠습니다. 맨날 들어가면 선택한 라이브 이벤트가 없대요-_-&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 400px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/25024A34551D59161E&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F25024A34551D59161E&quot; width=&quot;400&quot; height=&quot;225&quot; filename=&quot;IMG_0273.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;b&gt;(2) 친구들&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;페이스북을 연동하기 때문에 페이스북 친구들이랑 뭔가 할 수 있는 기능이 있습니다. 그냥 친구랑 붙는 건데, 물론 실시간은 아닙니다. 친구스탯으로 그냥 싸우고 이기면 은화를 주는 형식입니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 400px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2668BC3B551D599421&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2668BC3B551D599421&quot; width=&quot;400&quot; height=&quot;225&quot; filename=&quot;IMG_0274.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;span class=&quot;cap1&quot; style=&quot;display: block; max-width:100%; &quot;&gt;성호형님 파워넘버가 너무 약하네...&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;b&gt;(3) 빠른 경기&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;유저 아무나 랜덤으로 붙는 것 같습니다. 뭐 대충 비슷한 실력의 유저들과 매칭 시켜 줍니다. 이기면 마찬가지로 은화를 줍니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 400px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2167A734551D5A0B33&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2167A734551D5A0B33&quot; width=&quot;400&quot; height=&quot;225&quot; filename=&quot;IMG_0275.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;6. 총평&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;일단 실시간 대전이 되지 않아서 매우 아쉽네요. 그것만 있었으면 좀 더 괜찮았을 것 같은데, 너무 NPC의 패턴이 비슷합니다. 그래서 능력 대비 약 1.5~2배 정도 되는 애들도 쉽게 잡을 수 있어요. 물론 아직 헤비급만 주로 하고 있고, 다른 체급은 패턴이 좀 다르긴 하더라구요. 그래서 스테이지 클리어 시 약간 지겨울 수 있어요.&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;그리고 친구랑 뭔가 하는 것이 너무 없네요. 소셜 기능을 너무 안넣었어요. 친구를 도와준다던지 그런 기능이 있었으면 좋았을 뻔 했네요.&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;하지만, 그래픽만은 정말 최강인 게임이네요. 언젠가 피씨 모바일 구분 없는 게임이 곧 나올 것 같네요.&lt;/p&gt;</description>
      <category>나의 삶/리뷰</category>
      <category>ufc ea 아이폰 iphone 게임</category>
      <author>머드초보</author>
      <guid isPermaLink="true">https://mudchobo.tistory.com/561</guid>
      <comments>https://mudchobo.tistory.com/561#entry561comment</comments>
      <pubDate>Fri, 3 Apr 2015 00:14:56 +0900</pubDate>
    </item>
    <item>
      <title>[Android] 안드로이드 에뮬레이터 Andy가 맥(OSX)용으로 나왔네요</title>
      <link>https://mudchobo.tistory.com/560</link>
      <description>&lt;p&gt;Genymotion 같은 건데, 한 때 Genymotion을 막은 게임들을 우회하기 위해 많이 사용했던 에뮬레이터죠. 근데 최근에는 이 에뮬레이터도 많이 막힌 것 같아요-_-&lt;/p&gt;&lt;p&gt;일단 저는 윈도우가 없어서 Andy 에뮬레이터를 사용해보지 못했어요. 그래서 한 번 설치를 해서 해봤습니다.&lt;/p&gt;&lt;p&gt;&lt;b&gt;다운로드 사이트&lt;br /&gt;&lt;a href=&quot;http://www.andyroid.net/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot; style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;http://www.andyroid.net/&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Genymotion과 다른 점은 여러 개를 추가로 사용할 수 없다는 점이에요. 그냥 설치파일(dmg)파일을 설치하면 Andy실행파일 하나 생기는데, 이걸 그대로 실행하면 바로 에뮬레이터가 떠요.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 580px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/27436D4D5511489612&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F27436D4D5511489612&quot; width=&quot;580&quot; height=&quot;407&quot; filename=&quot;스크린샷 2015-03-24 오후 8.19.25.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;우오오 별도의 셋팅이 필요없이 바로 뜨네요.&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;장점&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;b&gt;1. 셋팅이 필요 없다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;b&gt;2. 플레이스토어 등의 Google Apps를 따로&amp;nbsp;설치하지 않아도 된다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 580px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2459AF4C5511494B2D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2459AF4C5511494B2D&quot; width=&quot;580&quot; height=&quot;407&quot; filename=&quot;스크린샷 2015-03-24 오후 8.23.30.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;b&gt;3. 일부 게임은 특별히 패치하지 않아도 실행이 잘 된다.&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;세븐나이츠와 라인레인저스는 잘 되네요.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 580px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2348084F55114A3A2F&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2348084F55114A3A2F&quot; width=&quot;580&quot; height=&quot;390&quot; filename=&quot;스크린샷 2015-03-24 오후 8.27.32.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;b&gt;4. 안드로이드 개발할 때 폰이 없어도 된다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;물론 안드로이드폰 얼마하지도 않아서 그냥 사면 되긴하는데, 그래도 부드럽게 잘 돌아가는 에뮬레이터 하나 있으면 편합니다.&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;단점&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;b&gt;1. 터치패드 쓰는데, 3개버튼 눌러서 드래그할 때 Andy는 다운됨.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;b&gt;2. 해상도 조절을 할 수 없음... 기능을 못찾는건지...무조건 태블릿해상도 형태로 밖에 못 쓰네요.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;b&gt;3. 중간중간 알 수 없는 렉이 있음-_-&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;결론&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 18.6666660308838px; line-height: 28px;&quot;&gt;&lt;b&gt;개발 용도로 쓰려면 Genymotion쓰세요....Genymotion짱...&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>나의 삶/리뷰</category>
      <author>머드초보</author>
      <guid isPermaLink="true">https://mudchobo.tistory.com/560</guid>
      <comments>https://mudchobo.tistory.com/560#entry560comment</comments>
      <pubDate>Tue, 24 Mar 2015 20:57:22 +0900</pubDate>
    </item>
    <item>
      <title>[PHP] 손쉽게 Laravel 개발 환경을 셋팅할 수 있는 Laravel HomeStead</title>
      <link>https://mudchobo.tistory.com/559</link>
      <description>&lt;p&gt;NodeJS로 개발하려다가 여러가지 애로사항이 꽃피어서 다시 Laravel로 돌아왔습니다... 역시 서버는 순차프로그래밍이지!-_-&lt;/p&gt;&lt;p&gt;암튼, Laravel사이트에 갔더니 5.0이 나왔더군요. 그래서 또 자세히 보니, &lt;b&gt;HomeStead&lt;/b&gt;라는 게 생겼는데(원래 있었는지는 잘 모르겠...), 이것은 손쉽게 개발환경이 셋팅된 가상 서버를 만들어주는 것입니다.&lt;/p&gt;&lt;p&gt;어떤 구조냐면요. &lt;b&gt;Vagrant&lt;/b&gt;라는 것이 있는데요. 이것은 이미 만들어진 개발환경을 손쉽게 자신의 PC에 명령어 몇 줄로 올리는 것입니다. 이 개발환경을 Laravel 환경에 맞게 구성한 것이 Laravel&amp;nbsp;HomeStead입니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;사실 PHP를 셋팅하려면 apache or nginx 설치하고, php도 설치하고, 서로 환경설정해서 연동도 하고, MySQL도 설치하고, 필요하면 캐시 서버인 Memcached or Redis도 설치하고, 여간 쉬운 일이 아니죠. 그리고,&amp;nbsp;보통 Windows 또는 OSX에서 작업을 많이 하기 때문에 실제 리얼서버는 대부분 리눅스계열이라 환경이 틀려서 제대로 동작하지 않을 수도 있지요.&lt;/p&gt;&lt;p&gt;Vagrant 사이트입니다. 여기서 그냥 Getting Started만 따라해도 몇 분만에 우분투 서버를 띄울 수 있어요.&lt;br /&gt;&lt;b&gt;&lt;a href=&quot;https://www.vagrantup.com/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://www.vagrantup.com/&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;Laravel homeStead는?&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Ubuntu 14.04&lt;br /&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;PHP 5.6&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;HHVM&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;Nginx&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;MySQL&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;Postgres&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;Node (With Bower, Grunt, and Gulp)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;Redis&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;Memcached&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;Beanstalkd&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;Laravel Envoy&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;Fabric + HipChat Extension&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;Blackfire Profiler&lt;/span&gt;&lt;/p&gt;&lt;p&gt;를 포함하고 있대요. 그래서 설치만 하면 우분투 환경에 nginx위에 돌아가는 Laravel이 이미 셋팅이 되어 있는 것이죠.&lt;br /&gt;아래 사이트에서 설치 및 셋팅이 잘 나와있어요.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://laravel.com/docs/5.0/homestead&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;b&gt;http://laravel.com/docs/5.0/homestead&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;간단하게 정리를 하면 아래와 같습니다(일단 맥용 기준인데 윈도우즈용도 매우 흡사할 것이에요).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;1. VirtualBox &amp;amp;&amp;nbsp;Vagrant 설치&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.virtualbox.org/wiki/Downloads&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://www.virtualbox.org/wiki/Downloads&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.vagrantup.com/downloads.html&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot; style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;http://www.vagrantup.com/downloads.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;2. Vagrant에 Laravel/HomeStead 추가.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;이 작업은 vagrant에 가상머신 다운로드해서 추가해놓는 작업 같습니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;vagrant box add laravel/homestead
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;3. homestead 설치&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;두 가지 방식이 있는데, 하나는 git을 이용한 방식이고, 하나는 composer를 이용한 방식입니다. 사실 composer로 설치하는 homestead가 뭐 별거 없는 게 vagrant를 래핑한 것입니다. 그래서 git으로 Vagrant파일 받고, vagrant로 써도 무관합니다.&lt;/p&gt;&lt;p&gt;&lt;b&gt;수동으로 git 설치 방법&lt;/b&gt;&lt;/p&gt;&lt;p&gt;git clone으로 원하는 위치에 받은 뒤, init스크립트를 호출해주면 설치와 셋팅이 완료됩니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;git clone https://github.com/laravel/homestead.git Homestead
&lt;span style=&quot;color: #007020&quot;&gt;cd &lt;/span&gt;Homestead
bash init
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;그러면 ~/.homestead/Homestead.yaml 파일이 생기는데, 이 파일의 설정으로 자신의 PC와 가상머신과 연결할 경로를 지정하거나 SSH키 위치 셋팅 등을 할 수 있어요.&lt;/p&gt;&lt;p&gt;&lt;b&gt;composer 이용방법&lt;/b&gt;&lt;/p&gt;&lt;p&gt;아래 명령어로 설치를 하면 homestead command를 사용할 수 있는데, 이것을 이용하면 쉽게 초기화하고 쉽게 edit를 띄울 수 있고, 쉽게 Vagrant를 up할 수 있습니다.&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;composer global require &lt;span style=&quot;background-color: #fff0f0&quot;&gt;&quot;laravel/homestead=~2.0&quot;&lt;/span&gt;
homestead init
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;이것도 init을 하면 위와 같은 경로에 설정파일이 생겨요.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;4. Laravel 경로 지정&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Homestead.yaml의 기본 경로는 ~/Code 입니다. 자신의 Laravel위치로 바꿔주면 됩니다. 그러면 로컬에서 수정하고 확인은 Homestead로 하면 됩니다. laravel은 설치했다는 과정하에....&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;mkdir ~/Code
&lt;span style=&quot;color: #007020&quot;&gt;cd &lt;/span&gt;Code
laravel new Laravel
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;그러면 설정에 기본셋팅에 맞는 위치에 Laravel이 생깁니다. 바로 서버를 띄워서 확인할 수 있어요. 물론 원하는 위치로 셋팅을 바꿀 수도 있어요.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;5. ssh 설정&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;이건 아마 기본적으로 ~/.ssh에 rsa를 만들었다면 따로 안해줘도 될겁니다. 다른 키를 쓰고 싶다면&amp;nbsp;Homestead.yaml에 다르게 설정해야 합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;6. 호스트 잡기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;/etc/hosts파일에 아까 Homestead.yaml에 정의된 sites주소로 잡는 겁니다. 그 주소로 들어오면 Laravel을 열도록 nginx가 설정되어 있습니다.&lt;/p&gt;&lt;p&gt;&lt;b&gt;/etc/hosts&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;&lt;span style=&quot;color: #888888&quot;&gt;# homestead&lt;/span&gt;
192.168.10.10  homestead.app
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;7. 실행하기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;git으로 설치했다면 Homestead 폴더로 가서 Vagrant up하면 됩니다.&lt;br /&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;composer로 설치했다면 그냥 아무 위치에서 homestead up하면 됩니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;8. 확인하기&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://homestead.app/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;b&gt;http://homestead.app/&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;Laravel5가 보이면 성공...&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/242DD34A54FB88E61E&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F242DD34A54FB88E61E&quot; width=&quot;600&quot; height=&quot;480&quot; filename=&quot;스크린샷 2015-03-08 오전 8.24.57.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;근데, 쓰고 나니까 뭔가 셋팅하는 게 복잡해 보이는데 그렇게 복잡하진 않아요. 실제 일일이 로컬에 개발환경 셋팅하는 것보단 이 방식이 더 나아보입니다. PC를 깨끗하게 쓰고 싶은 사람들은 로컬에 뭔가 따로 설치하지 않아도 되니까 좋기도 하구요.&lt;/p&gt;</description>
      <category>피에이치피(PHP)</category>
      <author>머드초보</author>
      <guid isPermaLink="true">https://mudchobo.tistory.com/559</guid>
      <comments>https://mudchobo.tistory.com/559#entry559comment</comments>
      <pubDate>Sun, 8 Mar 2015 08:35:34 +0900</pubDate>
    </item>
    <item>
      <title>[여행] 제주도 갔다가 넥슨컴퓨터 박물관에 다녀왔습니다.</title>
      <link>https://mudchobo.tistory.com/558</link>
      <description>&lt;p&gt;저번 주에 가족끼리 제주도에 놀러갔습니다. 그리고, 판교에서 돌아당기는 버스에 항상 붙여진 넥슨컴퓨터박물관이 신경 쓰였는데, 제주도 놀러가는 김에 갔다왔네요.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2708454F54F70A021C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2708454F54F70A021C&quot; width=&quot;600&quot; height=&quot;600&quot; filename=&quot;IMG_0075.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;span class=&quot;cap1&quot; style=&quot;display: block; max-width:100%; &quot;&gt;이게 박물관인 줄 알았는데, 이건 네오플 건물이더라구요.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;바로 앞에 네오플이 있습니다. 제주도로 이사갔다는 얘기는 들었는데, 바로 옆에 넥슨 컴퓨터박물관이 있었네요.&amp;nbsp;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2342C25054F70A5926&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2342C25054F70A5926&quot; width=&quot;600&quot; height=&quot;600&quot; filename=&quot;IMG_0078.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;span class=&quot;cap1&quot; style=&quot;display: block; max-width:100%; &quot;&gt;로고와 필체가 넥슨스럽게 생겼네요.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;입장료가 8처넌입니다. 젠장! 소셜커머스에서 좀 싸게 사니 잘 알아보고 가세요. 어른2+어린이2명 이렇게 패키지로 2만얼마에도 팔고 있습니다. 표를 사면 아저씨가 친절하게 팔목에 직접 입장팔찌를 채워줍니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;입장권 파는 곳 바로 앞에는 사물함이 있는데, 쿼티키보드 모양의 사물함입니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2122F24754F70AE91A&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2122F24754F70AE91A&quot; width=&quot;600&quot; height=&quot;600&quot; filename=&quot;IMG_0080.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;span class=&quot;cap1&quot; style=&quot;display: block; max-width:100%; &quot;&gt;어떤 어린이의 뒤통수가 나왔네요.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1층은 stage1인데, 들어가자마자 무슨 회로 관련된 것이 나오는데, 하드웨어에 약해쏘 잘 모르겠네요.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2646EC4C54F70B4313&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2646EC4C54F70B4313&quot; width=&quot;600&quot; height=&quot;600&quot; filename=&quot;IMG_0082.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;각종 고대 컴퓨터들이 나오는데, 애플에서 나온 옛날 컴퓨터도 전시가 되어 있어요.&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2116C14F54F70B8515&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2116C14F54F70B8515&quot; width=&quot;600&quot; height=&quot;600&quot; filename=&quot;IMG_0084.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;span class=&quot;cap1&quot; style=&quot;display: block; max-width:100%; &quot;&gt;애플컴퓨터! 모조품인가 가져온건가모르겠네!
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이건 매킨토시 초기버전인가 그럴꺼에요. 나 애플빠 아닌데, 왜 점점 애플빠가 되는 느낌이지...&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2142C25054F70BD52D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2142C25054F70BD52D&quot; width=&quot;600&quot; height=&quot;600&quot; filename=&quot;IMG_0085.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;span class=&quot;cap1&quot; style=&quot;display: block; max-width:100%; &quot;&gt;맥킨토시!
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이 컴퓨터는 뭔지 잘 모르겠는데, 예전 친척동생네에 있어서 이걸로 게임했던 기억이 납니다. 매우 반가웠네요. 저걸로 맨날 남극탐험했던 것 같은데...&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/213C4C4C54F70C101F&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F213C4C4C54F70C101F&quot; width=&quot;600&quot; height=&quot;600&quot; filename=&quot;IMG_0086.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;중간에 방명록이 있는데, 아래 키보드가 있는데, 키보드가 레이저키보드라 맨 바닥인데 글씨가 써져요. 레이저로 쏘는 빛에 맞게 쓰면 써져요. 근데 뭐 타격감(?)도 별로고, 잘 안써짐 별로임. 이거 보니까 인터넷에서 팔고 있음 ㅇㅇ 사지마삼 ㅇㅇ 아직은 때가 아님.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/250EAC3C54F70C6220&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F250EAC3C54F70C6220&quot; width=&quot;600&quot; height=&quot;600&quot; filename=&quot;IMG_0088.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이거 디슷켓인데, 겁나 큼. 5.25일 때밖에 안써서 잘 모르겠....&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2644473354F70CCE29&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2644473354F70CCE29&quot; width=&quot;600&quot; height=&quot;600&quot; filename=&quot;IMG_0089.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;저장장치의 변천사! 디스켓부터 시작해서 씨디, 디비디에 하드디스크까지!&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2169EB3A54F70CF037&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2169EB3A54F70CF037&quot; width=&quot;600&quot; height=&quot;600&quot; filename=&quot;IMG_0090.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;추억의 옛날 게임기들이 전시되어 있네요.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/255F6E3354F70D571F&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F255F6E3354F70D571F&quot; width=&quot;600&quot; height=&quot;600&quot; filename=&quot;IMG_0091.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;CPU칩에 대해서 전시해놓은 것인데, 신기한 것이 칩을 모니터 위에 올려놓으면 정보를 모니터가 알려줘요. 나 펜티엄 때 컴터 처음썼는데, 펜티업 칩도 있던데!&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/221DD83554F70D772C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F221DD83554F70D772C&quot; width=&quot;600&quot; height=&quot;600&quot; filename=&quot;IMG_0093.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;사운드 카드도 전시가 되어있네요. 애드립과 사운드블라스터는 간만에 들어보네요.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2150F63454F70DE333&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2150F63454F70DE333&quot; width=&quot;600&quot; height=&quot;600&quot; filename=&quot;IMG_0095.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;소리줄인데, 소리에 게임명이 써있는데, 게임 사운드가 통줄을 통해 나옵니다. 남극탐험 등 고전 게임 사운드가 전시되어 있네요.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/250AC73354F70E390C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F250AC73354F70E390C&quot; width=&quot;600&quot; height=&quot;600&quot; filename=&quot;IMG_0098.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;엄마한테 피씨통신하다가 뒤지게 맞앗던 기억이 있었는데...전화요금 많이 나온다고... 머드게임을 많이 했는데(그래서 머드초보-_-), 전화요금 겁나 나옴... 암튼 피씨통신 체험장도 있네요.&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/23401E3654F70E781D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F23401E3654F70E781D&quot; width=&quot;600&quot; height=&quot;600&quot; filename=&quot;IMG_0099.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;각종 게임기도 전시가 되어있어요. 애들이 게임 삼매경에 빠졌네요. 나도 하고 싶은데, 애들이 다 장악을 해서 못했네요. 게임기는 옛날 슈퍼패미콤, 패미콤 등 시중에 나온 게임기가 다 전시되어 있어요.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/253DAB3C54F70EE707&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F253DAB3C54F70EE707&quot; width=&quot;600&quot; height=&quot;600&quot; filename=&quot;IMG_0111.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;span class=&quot;cap1&quot; style=&quot;display: block; max-width:100%; &quot;&gt;비켜!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;넥슨이 여기에 있게한 바람의 나라에 대해서도 자세히 써놨네요.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2752E33654F70F5D11&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2752E33654F70F5D11&quot; width=&quot;600&quot; height=&quot;600&quot; filename=&quot;IMG_0120.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;span class=&quot;cap1&quot; style=&quot;display: block; max-width:100%; &quot;&gt;돈슨의 바람의 나라!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;키보드도 있고...&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px; text-align: center; font-size: 9pt; line-height: 1.5;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/251BD33954F70FA530&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F251BD33954F70FA530&quot; width=&quot;600&quot; height=&quot;600&quot; filename=&quot;IMG_0123.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;text-align: center; font-size: 9pt; line-height: 1.5;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;어렸을 때 다들 한 번씩 다녔다던 GW-BASIC도 있고...와 저거 보니까 갑자기 생각났는데, 초등학교 3학년인가 4학년 때 컴퓨터학원 다녔는데, 그때 그냥 책주고 이거 그대로 치라고 하고 다 치면 집에 왔던 기억이 나네요. 생각해보니 날로먹었네 컴터학원.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2162C13554F70FCD0E&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2162C13554F70FCD0E&quot; width=&quot;600&quot; height=&quot;600&quot; filename=&quot;IMG_0124.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;MS-DOS도 전시되어 있습니다. 체험할 수 있어요. 하드드라이브는 없던데...&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2235E53B54F7103927&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2235E53B54F7103927&quot; width=&quot;600&quot; height=&quot;600&quot; filename=&quot;IMG_0125.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;한메타자교사! 저 교사에게 많이 배웠는데!&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/264B7D3654F710681E&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F264B7D3654F710681E&quot; width=&quot;600&quot; height=&quot;600&quot; filename=&quot;IMG_0126.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그리고 지하에 펌프한 대! 무제한 플레이 가능! 간만에 했는데! 뭔가 창피해서 못하겠다... 옛날에 대회나가서 상도탔는데...동네대회였지만...&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2543EE3554F7109D25&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2543EE3554F7109D25&quot; width=&quot;600&quot; height=&quot;600&quot; filename=&quot;IMG_0131.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;마지막에 꼭 사먹어야하는 키보드 와플...와플 따위가.....만이처넌입니다...그래도 마우스와 함께 귀여븜!&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2371CE4554F710D20C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2371CE4554F710D20C&quot; width=&quot;600&quot; height=&quot;600&quot; filename=&quot;IMG_0133.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;생각보다 잘 꾸며놔서 놀랬습니다. 재미있었습니다. 애들 데리고 오면 좋아하겠네요. 하지만, 전 부모님을 데리고 갔죠. 제가 애인 마냥 놀았.....&lt;/p&gt;</description>
      <category>나의 삶/생활속에 나</category>
      <author>머드초보</author>
      <guid isPermaLink="true">https://mudchobo.tistory.com/558</guid>
      <comments>https://mudchobo.tistory.com/558#entry558comment</comments>
      <pubDate>Wed, 4 Mar 2015 23:07:13 +0900</pubDate>
    </item>
    <item>
      <title>[호스팅] Node.js, PHP 및 다양한 언어지원하는 호스팅서비스 OpenShift Online</title>
      <link>https://mudchobo.tistory.com/557</link>
      <description>&lt;p&gt;OpenShift Online이라는 서비스입니다. 레드햇 리눅스로 유명한 레드햇이 만든 서비스입니다. 레드햇 하니까 믿음이 가네요.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2314584A54DA95BF1B&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2314584A54DA95BF1B&quot; width=&quot;600&quot; height=&quot;92&quot; filename=&quot;af0e0fb6ed7997b619e1b68f8b1e9357.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://www.openshift.com/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;https://www.openshift.com/&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- OpenShift란?&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;오픈쉬프트는 PaaS입니다. 뭐 IaaS, PaaS, SaaS 이런거 겁나 많이 나오는 단어이긴 한데, 쉽게 말하면 전부 클라우드 서비스 같은거라고 보면 돼요.&amp;nbsp;&lt;/p&gt;&lt;p&gt;IaaS는 인프라를 서비스처럼 쓰는거라 클라우드서버 임대를 말하구요(최근 디지털 오션이나 아마존 EC2&amp;nbsp;같은 서비스죠),&amp;nbsp;&lt;/p&gt;&lt;p&gt;PaaS는 Heroku나 Google AppEngine같은 서비스를 말해요. 서버 셋팅이나 하드웨어 없이 플랫폼만 제공받는 것이지요. php, ruby, nodejs로&amp;nbsp;개발한 것, 설치형 블로그 워드프레스 같은 것도&amp;nbsp;그대로 올려서 서비스 할 수 있습니다.&lt;/p&gt;&lt;p&gt;SaaS는 서비스를 임대해서 쓰는 것이죠. 구글 앱스같은 것을 얘기하죠. 기업들이 이메일이나 오피스 같은 것을 직접 구축하고 구매하려면 돈이 많이 드는데, 구글앱스를 이용하면 일정 금액을 지불하고 사용할 수 있는 것이지요.&lt;/p&gt;&lt;p&gt;뭐 위에서 얘기하는 것은 그냥 개념적인 얘기긴 하죠. 그래서 사실 몰라도 됨-_- &lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;암튼 서론이 너무 길었는데, OpenShift는 원하는 언어로 개발한 애플리케이션 서버를&amp;nbsp;그대로 올려서(일단 개발한 것만 올리긴 할겁니다만, 워드프레스 같은 서비스도 올릴 수 있어요), 웹서비스를 할 수 있는 호스팅 서비스입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- OpenShift 종류&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;아 종류가 있는데, 사실 오픈쉬프트는 오픈 소스이기 때문에 서버 장비가 있다면 설치해서 사용할 수 있습니다. 그래서 회사에서 사용할 Enterprise버전과 Origin버전이 있는데 차이는 잘 모르겠...&lt;/p&gt;&lt;p&gt;그리고 이제 제가 리뷰해볼 Online버전이 있는데, 이건 설치를 해서 쓰는 게 아니라 말그대로 Online입니다. 레드햇에서 제공하는 서비스입니다. 일단 무료로 3개 애플리케이션을 만들 수 있으며, 장비 용량이나 사용량에 따라 과금을 부과하는 등 유료화 모델을 사용하고 있습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- OpenShift 간단하게 맛보기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;1. OpenShift Online 회원가입&lt;/b&gt;&lt;/p&gt;&lt;p&gt;가입은 사이트 상단에 SIGN UP으로 하면 됩니다. 이메일 입력하고, 비밀번호 입력하고, 스팸봇방지 문자입력하면 가입 끗. 후에 이메일로 인증메일이 오는데, 클릭해서 인증완료 하면 완전 끗.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2618953954DA980E2C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2618953954DA980E2C&quot; width=&quot;600&quot; height=&quot;405&quot; filename=&quot;스크린샷 2015-02-11 오전 8.44.58.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;2. 애플리케이션 생성&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;로그인 하고 들어가면 뭐 하나 만들라고 나옵니다.&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2147094A54DAAEA932&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2147094A54DAAEA932&quot; width=&quot;600&quot; height=&quot;527&quot; filename=&quot;스크린샷 2015-02-11 오전 10.21.21.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&quot;지금 너의 첫번째 애플리케이션을 생성하라&quot;를 선택하면요. 정말 다양한 애플리케이션을 생성할 수 있습니다. Node.js, Ruby, PHP, Java 등을 지원하고, 워드프레스 같은 블로그툴도 CI툴인 젠킨스도&amp;nbsp;서버 설치 없이 바로 생성이 가능하게 해줍니다.&amp;nbsp;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;일단 가장 쉬운 Node.js로 선택해서 해볼게요. 최초에 sshkey를 등록하지 않았다면&amp;nbsp;Yes, help me get started를 선택하면 sshkey 등록을 도와줍니다. 근데, 사실 rhc라는 gem을 설치하면 더 쉽게 sshkey를 등록할 수 있습니다. 이건 나중에...&lt;/p&gt;&lt;p&gt;sshkey는 ~/.ssh/id_rsa.pub파일의 내용을 그대로 붙이면 끗!&lt;/p&gt;&lt;p&gt;&lt;b&gt;3. 소스 클론 받기&lt;/b&gt;&lt;/p&gt;&lt;p&gt;전부 ssh기반으로 하기 때문에, 소스도 git기반으로 ssh를 통해서 풀&amp;nbsp;받고 푸쉬하고 있습니다. 아래처럼 소스를 클론받고 수정하고 푸쉬하면 자동으로 웹서버에 배포 및 재시작을 해줍니다. 참 편하죠!&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2330A03C54DAB57B35&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2330A03C54DAB57B35&quot; width=&quot;600&quot; height=&quot;562&quot; filename=&quot;스크린샷 2015-02-11 오전 10.49.10.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;4. 소스 수정해서 올려보기&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;기본적으로 코드가 조금 있는데, 그냥 html파일만 수정해서 올려봅시다. 타이틀만 바꿔볼까요!&lt;/p&gt;&lt;p&gt;index.html&lt;br /&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&amp;lt;title&amp;gt;헬로우 월드&amp;lt;/title&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;로 수정하고 커밋하고 푸쉬를 하면...!&lt;/p&gt;&lt;p&gt;&lt;b&gt;5. 사이트 확인하기&lt;/b&gt;&lt;/p&gt;&lt;p&gt;잘 변경이 되었네요.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2225494854DABFF836&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2225494854DABFF836&quot; width=&quot;600&quot; height=&quot;385&quot; filename=&quot;스크린샷 2015-02-11 오전 11.35.05.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 그 외에 기능&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;1. rhc라는 command line tool을 제공.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;osx유저라면 ruby가 기본적으로 설치가 되어있는데, 아래 gem을 설치하면 그냥 사용할 수 있습니다. 윈도우는 모름-_-&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;gem install rhc
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;이 툴을 통해서 자동으로 로컬에 있는 ssh-key를 업로드해줍니다. 최초 setup만 해주면 됩니다.&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;rhc setup&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;b&gt;2. 제한적인 ssh 기능&lt;/b&gt;&lt;/p&gt;&lt;p&gt;ssh를 제공하긴 합니다. 근데 들어가서 뭐 할 수 있는 건 프로세스 킬하거나 mysql 콘솔을 접속할 수 있게 하거나, 로그를 볼 수 있는 간단한 툴을 제공합니다.&lt;/p&gt;&lt;p&gt;&lt;b&gt;3. cron제공&lt;/b&gt;&lt;/p&gt;&lt;p&gt;오! 이거 하나만으로 heroku보다 훨씬 좋네요(사실 heroku도 크론이 있는데 플러그인 방식이라...). 이건 소스에 포함시켜서 사용할 수 있습니다.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://developers.openshift.com/en/managing-background-jobs.html&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://developers.openshift.com/en/managing-background-jobs.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;크론은 UI에서 추가하는 방법이 없는 듯. 콘솔에서 해야합니다.&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;rhc cartridge add cron -a nodejs
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;그러면 추가가 됩니다.&lt;/p&gt;&lt;p&gt;보면 소스에 추가하면 됩니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;.openshift/cron/(minutely|hourly|daily|monthly)/awesome_job 요렇게 실행할 스크립트파일(.bash분법인듯요)을 넣으면 minutely면 매분 실행하는거고, hourly면 매시간 실행하는거고 그런식으로 되어있어요.&lt;/p&gt;&lt;p&gt;그래서 특정 시간에만 실행하길 원하면 bash에서 짜야한다고 문서에 나와있네요. 불편하지만, 제공하는 게 어디인지!&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 끗으로!&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;확실히 앱엔진이나 Heroku보다 더 많은 기능을 제공해서 편하긴 합니다만, 역시나 더욱 커스터마이징해야하는 애플리케이션이라면 이걸 쓰면 안되겠죠. 그냥 서버구축해서 하는 게 속이 더 편할 듯요.&lt;/p&gt;&lt;p&gt;하지만, 간단한 서비스를 하려고 하면 꽤나 좋은 서비스일 듯합니다. 제가 만드려는 서비스에는 오픈쉬프트만 써도 적당할 것 같아요. 이제 언넝 모바일앱을 만들러....&lt;/p&gt;</description>
      <category>나의 삶/리뷰</category>
      <category>openshift hosting 호스팅 nodejs php</category>
      <author>머드초보</author>
      <guid isPermaLink="true">https://mudchobo.tistory.com/557</guid>
      <comments>https://mudchobo.tistory.com/557#entry557comment</comments>
      <pubDate>Wed, 11 Feb 2015 14:27:23 +0900</pubDate>
    </item>
    <item>
      <title>[리뷰] 요즘 티비에서 복잡한 결제를 쉽게 해준다고 광고하는 카카오페이</title>
      <link>https://mudchobo.tistory.com/556</link>
      <description>&lt;p&gt;저는 Mac OSX유저입니다. 그래서 결제를 하려고 하면 맥에서 지원되지 않은 사이트들이 너무 많아서 맥에 따로 설치해놓은 Windows를 구동시킵니다. Windows는 VMWARE로 설치했는데, 무언가 결제할 때 밖에 안썼던 것 같습니다.&lt;/p&gt;&lt;p&gt;그런데 최근에는 스마트폰이 발전하면서 대부분 쇼핑몰이 모바일웹, 모바일앱에서 결제를 쉽게 지원하고 있습니다. 그래서 최근에는 Windows를 구동할 일이 별로 없었죠. 연말정산 때문에 켠 것 빼고는 없었네요...망할 연말정산....ㅠㅠ&lt;/p&gt;&lt;p&gt;그리고 저는 주로 사용하는 카드가 롯데카드와 신한카드인데요. 롯데카드와 신한카드는 앱카드라는 것이 있어서 스마트폰에 앱카드 앱을 설치한 뒤 카드등록을 하고 결제 비밀번호를 지정하면&amp;nbsp;이를 지원하는 쇼핑몰에서 결제를 클릭하면 앱카드를 실행하여 결제 비밀번호만 입력하면 결제가 되는 것입니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;이런 앱카드도 편하다고 생각했는데, 카드를 여러 개 쓰게 되면 앱을 여러 개 설치해야 합니다. 그리고 카드 관리가 분산되는 단점이 있으며 앱카드 별로 비밀번호를 따로 가져가야하는 점도 있습니다.&lt;/p&gt;&lt;p&gt;이런 단점을 해결한 것이 카카오페이입니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 550px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2210A85054D8C76E0F&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2210A85054D8C76E0F&quot; width=&quot;550&quot; height=&quot;189&quot; filename=&quot;20140905174317910.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;내가 써보니 이거슨 완전 장점 리스트!&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;1. 별도의 앱을 설치하지 않아도 된다!&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;사실 앱을 하나 설치해야 하긴 해야합니다. 그거슨 바로 카카오톡!-_- 국민앱이기 때문에! 모든 스마트폰에 설치가 되어있기 때문에! 그냥 별도 앱을 설치하지 않아도 얘기합니다. 보시다시피 더보기에 카카오페이가 대놓고 나와있습니다.&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 320px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2255ED4D54D8C8D41E&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2255ED4D54D8C8D41E&quot; width=&quot;320&quot; height=&quot;569&quot; filename=&quot;IMG_0055.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;span class=&quot;cap1&quot; style=&quot;display: block; max-width:100%; &quot;&gt;아이콘 겁나 잘만든 것 같음 ㅇㅇ&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;2. 가입이 간편하다!&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;카카오페이 눌러서 가입하기 누르면 신상정보입력하고 휴대폰번호 인증만 하면 가입 끗! 그리고 자신의 이름으로 된 카드만 등록이 가능하기 때문에 본인인증은 필수로 하는 것 같아요. 하긴 안하면 엄청 위험한 앱이겠죠...-_-&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;3. 각각 다른 회사 카드를 한 곳에 등록하여 사용할 수 있다!&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;롯데카드 한도를 다 채우면 신한카드 한도를 채우고 있습니다. 그래야 롯데카드에서 주유할인, 교통할인, 마트할인 받고, 신한카드에서 통신사할인을 받을 수 있어서요. 그러다보니 카드 번갈아가면서 쓰는데 이건 카드를 한 곳에 등록해놓고 결제할 때 카드를 지정해서 결제를 할 수 있어요.&lt;/p&gt;&lt;p&gt;아래와 같이 3개의 카드를 등록해놓고 쓰고 있어요.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 320px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2101D93554D8CA6F28&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2101D93554D8CA6F28&quot; width=&quot;320&quot; height=&quot;569&quot; filename=&quot;IMG_0058.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;카드등록은 카드정보를 전부 입력하는 방식이에요.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 320px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/214F7A3A54D8CB423A&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F214F7A3A54D8CB423A&quot; width=&quot;320&quot; height=&quot;569&quot; filename=&quot;IMG_0057.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;span class=&quot;cap1&quot; style=&quot;display: block; max-width:100%; &quot;&gt;뒤에 뭐시기3자리는 입력안해도 되니 카드 안뒤집어도 됨 ㅇㅇ&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;4. 결제할 때 비밀번호만 입력하면 된다!&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;쇼핑몰에서 결제하기 누르고, 카카오페이 선택하면 카드선택화면이 뜨는데, 카드선택하고 비밀번호 누르면 그냥 끗! 광고처럼 잘 됩니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 320px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/256E2E3654D8CC221E&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F256E2E3654D8CC221E&quot; width=&quot;320&quot; height=&quot;569&quot; filename=&quot;IMG_0059.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;그 외에 장점 리스트!&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;1. 액티브액스 없이 맥에서도 결제할 수 있음!&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;피씨에서도 결제를 지원합니다. 다만, 가맹점이...찾은 걸로는...알라딘서점 밖에 못봤...아래와 같이 전화번호와 생년월일을 입력받습니다. 그대로 요청하면 카톡으로 결제하기 메시지가 하나 오는데, 그걸 누르면 카카오페이를 실행해서 결제하는 구조입니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/211AED3B54D8CDE00E&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F211AED3B54D8CDE00E&quot; width=&quot;600&quot; height=&quot;375&quot; filename=&quot;스크린샷 2015-02-10 오전 12.07.51.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;span class=&quot;cap1&quot; style=&quot;display: block; max-width:100%; &quot;&gt;음...신한앱카드처럼 QR코드 찍는 게 나을 것 같기도...&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 321px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/220C643954D8CE9A06&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F220C643954D8CE9A06&quot; width=&quot;321&quot; height=&quot;252&quot; filename=&quot;IMG_0061.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;2. 공인인증서 없이도 큰 금액 결제가능!&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;원래 30만원 이상인 결제에는 공인인증서가 필요했는데, 카카오페이는 그게 필요 없습니다. 좀 더 어려운(?) 비밀번호를 설정만 하면 큰 금액도 결제가능합니다.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;3. 졸 귀여운 이모티콘 줌(~2/22까지인 듯!)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;아 졸 귀여움-_-&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 320px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2261544254D8CF8430&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2261544254D8CF8430&quot; width=&quot;320&quot; height=&quot;569&quot; filename=&quot;IMG_0062.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;span class=&quot;cap1&quot; style=&quot;display: block; max-width:100%; &quot;&gt;카카오프렌즈 그린 사람 상줘야함. 겁나 잘그림 ㅇㅇ&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;카카오페이의 단점&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;1. *****가맹점이!!!!!!!!! 별로!!!!!!!!!!! 없어!!!!!!!!!!!*********&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;가장 큰 단점입니다. 이거하나로 그냥 모든 장점을 무마시키는...&lt;/p&gt;&lt;p&gt;저는 네이버에서 검색 후 가장 싼 것으로 찾아보고&amp;nbsp;사는데, 대부분 쇼핑몰이 11번가, 지마켓, 네이버체크아웃이였습니다. 그리고 소셜커머스도 매우 좋아해서 쿠팡, 티몬 등(위메프도 최근에 잘 썼는데, 해고사태를 보고 잘 안씀!)을 많이 사용하는데, 이 중 단 한 곳도 카카오페이를 지원하지 않습니다ㅠㅠ&lt;/p&gt;&lt;p&gt;결제를 붙이는 것이 그리 어려울 것 같지 않은데... 아무튼 언넝 저 대표적인 쇼핑몰을 지원했으면 좋겠네요. 저기 나열한 곳만 지원해도 아마 사람들이 엄청 쓸 듯.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;2. 카드관리 닉네임 불변경&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;이건 뭐 사소한 단점인데...보안 때문에 일부러 이렇게 했을 수도 있을 것 같다는 생각도 드네요. 최초 카드등록 시 지정한 닉네임은 변경하지 못하더라구요. 변경하려면 삭제 후 다시 등록해야....사소하다.........&lt;/p&gt;&lt;p&gt;아.....단점이 별로 없는 것 같지만, 저기 가맹점이 없는 것만으로도 엄청난 단점이네요.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;아직은...&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;확실히 편한 결제서비스이긴 합니다. 언넝 대형 쇼핑몰들부터 지원했으면 좋겠네요. 일단 맥에서 결제가 되는 방식이라 좋네요(뭐 최근에는 모바일에서 전부 결제하면 다 되지만요^^). 많이 퍼졌으면 좋겠습니다. 오프라인 서비스도 준비중인 것 같던데, 아마 NFC겠죠?&lt;/p&gt;</description>
      <category>나의 삶/리뷰</category>
      <author>머드초보</author>
      <guid isPermaLink="true">https://mudchobo.tistory.com/556</guid>
      <comments>https://mudchobo.tistory.com/556#entry556comment</comments>
      <pubDate>Tue, 10 Feb 2015 00:38:09 +0900</pubDate>
    </item>
    <item>
      <title>[Sails] Rails를 꼭 닮은 Node.js WebFramework - Sails 예제</title>
      <link>https://mudchobo.tistory.com/555</link>
      <description>&lt;p&gt;최근 개인적으로 API서버를 만들 일이 있어서 뭘로 해볼까 하다가 이 놈으로 정했는데요. 일단 가볍게 써 본 결과로는 만족합니다. 기존 NodeJS에서 인기 있었던 WebFramework인&amp;nbsp;Express보다 더 맘에 드네요.&amp;nbsp;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;사실 요즘 MVC Framework는 다 잘 되어 있어서 어떤 걸 써도 다 만족하겠지만요.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Nodejs를 좋아하는 게 일단 웹개발을 많이 해봐서 Javascript가 좀 익숙하기도 하고,&amp;nbsp;npm이라는 것이 있어서 손쉽게 설치할 수 있는 게 좋더라구요. 하지만, 콜백 지옥에 빠지면 답이 없긴함 ㄷㄷ 아직 언어를 익숙하게 잘 짜지 못하는 것이기도 하지만요ㅠ&lt;/p&gt;&lt;p&gt;그렇게 NodeJS용 Framework를 찾다보니 Sails라는 것을 찾게 되었네요.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 300px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/223F304354D0E1E519&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F223F304354D0E1E519&quot; width=&quot;300&quot; height=&quot;113&quot; filename=&quot;sailsjs.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://sailsjs.org/#/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://sailsjs.org/#/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;1. Sails 특징&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;모델과 컨트롤러 파일만 만들어도 자동으로 RestAPI를 만들어줍니다. BluePrint라는 것이 그렇게 하는 것 같은데, 처음엔 우와!!! 하는데, 사실 그대로 쓰이는 API는 거의 없죠. 나중에 분명 수정해야할 겁니다-_- 기본적인 CRUD를 코드 한 줄 없이 가능하게 해요.&lt;/p&gt;&lt;p&gt;ORM같은 것을 지원합니다(Waterline이라는 것!). 모델파일만 잘 작성하면 테이블도 직접 만들어줍니다. 모델 관계도 잘 지정하면 테이블끼리 외래키로 잘 연결해줍니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;다양한 DB를 제공하네요.&amp;nbsp;MySQL, MongoDB, PostgreSQL, Redis,&amp;nbsp;local disk 등을 제공하는데, 모델은 똑같이 사용이 가능한 것 같아요. 일단 저는 MySQL로 밖에 하지 않아서...&lt;/p&gt;&lt;p&gt;WebSocket을 쉽게 쓸 수 있어요. 그냥 프레임워크에 포함이 되어 있어요.&lt;/p&gt;&lt;p&gt;보안적인 면을 신경을 많이 썼더라구요. 웹은 개발하면서도 보안에 취약해지기에 마련인데, 최대한 놓치지 않으려고 많은 장치를 해놨어요.&amp;nbsp;Cross-Origin Resource Sharing (CORS),&amp;nbsp;Cross-site request forgery (CSRF) 등등 옵션들을 제공하고 있어요.&amp;nbsp;&lt;/p&gt;&lt;p&gt;커맨드라인 제너레이터도 제공을 해요. 간단히 테스트해볼 것은 console로 가능하고, 모델, 컨트롤러, API 생성기를 제공해요.&lt;/p&gt;&lt;p&gt;그 외에 레일즈처럼 asset compile도 하고, test도 쉽게 할 수 있으며, 웹프레임워크의 기본적인 것들인 국제화 처리, 라우터, 업로드, 뷰레이아웃 기능들을 제공하고 있습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;2. 또 다시 나온 소녀시대 스케줄 예제&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;설명하는 것보다 그냥 예제로... 간단하게 MySQL이랑 연동해서 DB데이터를 연결해서 뿌려주는 예제를 만들겠습니다. 모델도 소녀시대와 스케줄은 1:N으로 테이블 설계를 하겠습니다.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;2-1. Sails설치&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;당근 Node.js와 npm이 설치가 되어 있다는 가정하에....(아래 링크에 참조를...)&lt;br /&gt;&lt;a href=&quot;http://sailsjs.org/#/getStarted&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://sailsjs.org/#/getStarted&lt;/a&gt;&lt;/p&gt;&lt;p&gt;sails는 글로벌 옵션을 줘서 실행해서 언제 어디서든 프로젝트를 만들 수 있게 합니다.&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;npm install -g sails
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;b&gt;2-2. Sails 프로젝트 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;sails new 프로젝트명 쓰면 레일즈처럼 필요한 파일들을 미리 만들어줍니다.&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;sails new sosi-schedule-sails
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;2-3. 데이터 베이스 설정&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;npm으로 sails-mysql을 설치해야 합니다. package.json파일에 추가하는 게 차후에 배포할 때 좋습니다.&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;&lt;span style=&quot;color: #BA2121&quot;&gt;&quot;dependencies&quot;&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;:&lt;/span&gt; {
    .
    .
    &lt;span style=&quot;color: #BA2121&quot;&gt;&quot;sails-mysql&quot;&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #BA2121&quot;&gt;&quot;latest&quot;&lt;/span&gt;
  }
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;그리고&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;npm install
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;그러면 설치가 됩니다.&lt;/p&gt;&lt;p&gt;설정을 해야 하는데, config/connection.js파일을 보면 DB정보를 입력할 수 있습니다.&amp;nbsp;someMysqlServer라고 되어 있는 부분이 있는데, 이걸 myMysqlServer로 바꾸죠. 내꺼니깐염. 그리고 디비정보를 입력하면 됩니다(아 내껀 MariaDB인데도 잘 되네요...).&lt;/p&gt;&lt;p&gt;&lt;b&gt;config/connections.js&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;myMysqlServer&lt;span style=&quot;color: #666666&quot;&gt;:&lt;/span&gt; {
    adapter&lt;span style=&quot;color: #666666&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #BA2121&quot;&gt;'sails-mysql'&lt;/span&gt;,
    host&lt;span style=&quot;color: #666666&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #BA2121&quot;&gt;'localhost'&lt;/span&gt;,
    user&lt;span style=&quot;color: #666666&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #BA2121&quot;&gt;'root'&lt;/span&gt;,
    password&lt;span style=&quot;color: #666666&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #BA2121&quot;&gt;''&lt;/span&gt;,
    database&lt;span style=&quot;color: #666666&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #BA2121&quot;&gt;'sosi'&lt;/span&gt;
  },
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;그러면 기본 커넥션을 바꿔줘야하는데요. config/model.js를 열면, 기본적으로 커넥션을 어떤 것을 맺을 지 지정할 수 있습니다. 물론 모델별로 다른 커넥션을 맺을 수 있습니다. 모델별로 커넥션을 다르게 지정하면 됩니다. 일단 나는 디비가 하나니깐염.&lt;/p&gt;&lt;p&gt;&lt;b&gt;config/models.js&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;module.exports.models &lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt; {
  connection&lt;span style=&quot;color: #666666&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #BA2121&quot;&gt;'myMysqlServer'&lt;/span&gt;,
  migrate&lt;span style=&quot;color: #666666&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #BA2121&quot;&gt;'drop'&lt;/span&gt;
};
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;여기서 connection 이름은 우리가 지정한 내마이에스큐엘서버를 그대로 써주면 됩니다. 밑에 &lt;b&gt;migrate&lt;/b&gt;는 뭐냐! 3가지 종류가 있는데염.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;drop&lt;/b&gt;: 서버를 죽였다가 다시 띄울 때마다 테이블을 다시 날려버리는 옵션입니다. 개발할 때 좋겠죠?&lt;br /&gt;&lt;b&gt;alter&lt;/b&gt;: 서버를 죽였다가 다시 띄울 때 모델에 칼럼의 변경사항을 체크해서 업데이트 해주는 옵션이고, 데이터를 살아있습니다. 이 옵션은 아직 실험적(experimental)인데요. 제가 데이터를 좀 많이 넣고 서버를 띄워보니 띄울 때마다 뭔가 알터를 하는지 서버 뜨는데 오래걸리는 현상이 발생합니다. 아직 문제가 많은 듯합니다.&lt;br /&gt;&lt;b&gt;safe&lt;/b&gt;: 서버를 죽였다가 다시 띄워도 아무것도 하지 않습니다.&lt;/p&gt;&lt;p&gt;적절히 골라쓰세요~&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;2-3. API 생성&lt;/b&gt;&lt;/p&gt;&lt;p&gt;sails는 자동으로 API를 생성해줍니다. API생성은 Model+Controller입니다. 물론 따로 생성할 수도 있습니다. API가 소녀시대 정보를 내려주는 SosiAPI와 스케줄 정보를 내려주는 ScheduleAPI를 생성합니다. 제너레이터를 이용하면 쉽게 생성할 수 있습니다. 근데 보면 사실 그냥 파일만 만들어주는거임-_-&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;&lt;b&gt;sails generate api sosi&lt;/b&gt;
info: Created a new api!
&lt;b&gt;sails generate api schedule&lt;/b&gt;
info: Created a new api! 
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;그러면 controllers/SosiController.js, models/Sosi.js, controllers/ScheduleController.js, models/Schedule.js가 생성이 되었습니다.&lt;/p&gt;&lt;p&gt;&lt;b&gt;2-4. 모델 설정&lt;/b&gt;&lt;/p&gt;&lt;p&gt;모델에 attributes를 지정합니다. 여기서 One-to-Many방식으로 설정할 수 있습니다.&lt;/p&gt;&lt;p&gt;&lt;b&gt;models/Sosi.js&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;module.exports &lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt; {

  attributes&lt;span style=&quot;color: #666666&quot;&gt;:&lt;/span&gt; {
    name&lt;span style=&quot;color: #666666&quot;&gt;:&lt;/span&gt; {
      type&lt;span style=&quot;color: #666666&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #BA2121&quot;&gt;'string'&lt;/span&gt;
    },
    schedules&lt;span style=&quot;color: #666666&quot;&gt;:&lt;/span&gt; {
      collection&lt;span style=&quot;color: #666666&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #BA2121&quot;&gt;'schedule'&lt;/span&gt;,
      via&lt;span style=&quot;color: #666666&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #BA2121&quot;&gt;'sosiId'&lt;/span&gt;
    }
  }
};
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;attributes는 말그대로 속성값(디비에서 칼럼값이지요). name이라는 속성이고 타입은 스트링임. 그리고 소녀시대는 스케줄이라는 배열을 가지게 되니 schedules로 지정하고, collection값은 스케줄, via는 sosiId(schedule의 속성값입니다)로 지정합니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;models/Schedule.js&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;module.exports &lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt; {

  attributes&lt;span style=&quot;color: #666666&quot;&gt;:&lt;/span&gt; {
    program&lt;span style=&quot;color: #666666&quot;&gt;:&lt;/span&gt; {
      type&lt;span style=&quot;color: #666666&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #BA2121&quot;&gt;'string'&lt;/span&gt;
    },
    sosiId&lt;span style=&quot;color: #666666&quot;&gt;:&lt;/span&gt; {
      model&lt;span style=&quot;color: #666666&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #BA2121&quot;&gt;'sosi'&lt;/span&gt;
    }
  }
};
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;2-5. 기본값 넣기&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;drop방식이니까 기본적으로 서버 뜰 때 값을 넣고 시작할 수 있어요. bootstrap.js부분에 넣으면 서버가 시작할 때 실행이 되어요. 소녀시대 멤버들을 넣어볼게요.&lt;/p&gt;&lt;p&gt;&lt;b&gt;config/bootstrap.js&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;Sosi.create({name&lt;span style=&quot;color: #666666&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #BA2121&quot;&gt;'태연'&lt;/span&gt;}).exec(console.log);
Sosi.create({name&lt;span style=&quot;color: #666666&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #BA2121&quot;&gt;'윤아'&lt;/span&gt;}).exec(console.log);
Sosi.create({name&lt;span style=&quot;color: #666666&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #BA2121&quot;&gt;'수영'&lt;/span&gt;}).exec(console.log);
Sosi.create({name&lt;span style=&quot;color: #666666&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #BA2121&quot;&gt;'효연'&lt;/span&gt;}).exec(console.log);
Sosi.create({name&lt;span style=&quot;color: #666666&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #BA2121&quot;&gt;'유리'&lt;/span&gt;}).exec(console.log);
Sosi.create({name&lt;span style=&quot;color: #666666&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #BA2121&quot;&gt;'티파니'&lt;/span&gt;}).exec(console.log);
Sosi.create({name&lt;span style=&quot;color: #666666&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #BA2121&quot;&gt;'써니'&lt;/span&gt;}).exec(console.log);
Sosi.create({name&lt;span style=&quot;color: #666666&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #BA2121&quot;&gt;'서현'&lt;/span&gt;}).exec(console.log);
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;2-6. 서버 실행&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;sails lift
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;2-7. API 잘 동작하는지 확인&lt;/b&gt;&lt;/p&gt;&lt;p&gt;기본적으로 BlueprintAPI를 제공하기 때문에 디비를 그대로 읽고 쓸 수 있는 url이 존재합니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;소녀시대 정보를 가져오려면&amp;nbsp;&lt;br /&gt;http://localhost:1337/sosi/1&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/230D184A54D0DEE226&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F230D184A54D0DEE226&quot; width=&quot;600&quot; height=&quot;363&quot; filename=&quot;스크린샷 2015-02-03 오후 11.44.28.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;스케줄 정보를 넣으려면 뭐 post도 되는데, get으로도 됩니다.&lt;br /&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;http://localhost:1337/schedule/create?program=무한도전&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&amp;amp;sosiId=1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/23495B5054D0DF4939&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F23495B5054D0DF4939&quot; width=&quot;600&quot; height=&quot;289&quot; filename=&quot;스크린샷 2015-02-03 오후 11.45.57.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;다시 소녀시대 정보를 불러오면....&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2575C84F54D0DF7D29&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2575C84F54D0DF7D29&quot; width=&quot;600&quot; height=&quot;431&quot; filename=&quot;스크린샷 2015-02-03 오후 11.47.10.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;우오오 잘된다!&lt;br /&gt;&lt;/p&gt;&lt;p&gt;ps. 모바일앱 하나 만드려고 하는데....취약한 앱개발 공부는 안하고.....암튼, 뭐 맘에드는 프레임워크인데, 더 써봐야 알겠네요.&lt;/p&gt;</description>
      <category>자바스크립트(Javascript)</category>
      <author>머드초보</author>
      <guid isPermaLink="true">https://mudchobo.tistory.com/555</guid>
      <comments>https://mudchobo.tistory.com/555#entry555comment</comments>
      <pubDate>Tue, 3 Feb 2015 23:56:26 +0900</pubDate>
    </item>
    <item>
      <title>[게임] 영웅 for Kakao - 자동사냥류 RPG게임 리뷰</title>
      <link>https://mudchobo.tistory.com/554</link>
      <description>&lt;p&gt;&lt;b&gt;2013년쯤 몬스터 길들이기&lt;/b&gt;가 출시되고 나서 엄청난 인기를 끌었고, 현재까지도 엄청난 인기를 끌고 있습니다. 그 후에 몬스터 길들이기와 같은 류의 게임이 어마어마하게 쏟아졌죠. 현재까지도 그런 비슷한 류의 게임이 출시되고 있는데, 그 중에 제가 최근에 열심히 하고 있는 &lt;b&gt;영웅 for Kakao&lt;/b&gt;를 소개하려고 합니다.&lt;/p&gt;&lt;p&gt;출시시점부터 시작해서 아직까지 하고 있는데요. 뭐 아직까지는 안질리고 열심히 잘 하고 있네요. 제가 몬스터 길들이기는 1년정도 했었는데, 이건 언제까지 할지 모르겠네요ㅠ&lt;/p&gt;&lt;p&gt;뭐 암튼, 영웅도 &lt;b&gt;모바일에 최적화&lt;/b&gt;되어 있습니다. PC MMORPG처럼 뭐 필드로 걸어나가서 무한 마우스클릭으로 잡는 게 아니라, 지역과 스테이지를 선택해서 모험던전에 들어가면&amp;nbsp;자기가 알아서 열심히 싸워주는 전투형식입니다. 그리고, 다양한 컨텐츠 중 하나인 결투장, 왕좌의탑, 시련의 탑, 시쿤동산 등이 있는데, 아직 레이드시스템이 개장하지 않았는데, 언넝 개장했으면 좋겠네요.&lt;/p&gt;&lt;p&gt;아래는 제 덱입니다. 휴... 정말 열심히 했네요ㅠ 아직 태생5성이 없다는 게 아쉽네요ㅠ&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2104DE3C54C7A76B24&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2104DE3C54C7A76B24&quot; width=&quot;600&quot; height=&quot;338&quot; filename=&quot;IMG_0049.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;0. 기본 자산&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;스테미나: 모험할 때 필요한 스테미나입니다. 시간이 지나면 차기도 하고, 친구한테 선물을 받을 수 있습니다. &lt;br /&gt;골드: 케릭터 합성, 룬변환, 아이템 구입 등 다양한 곳에 쓰이는 돈입니다.&lt;br /&gt;명예포인트: 결투장, 왕좌의 탑, 시련의 탑에서 얻을 수 있으며, 이걸로 룬을 살 수 있습니다.&lt;br /&gt;우정포인트: 친구한테 스태미나를 보내면 10씩 주고, 자고 있는 사이에 친구가 내 케릭터를 불러 모험에 들어가도 자동으로 획득합니다. 이걸로 스테미나를 살 수 있고, 케릭터를 뽑을 수 있습니다.&lt;/p&gt;&lt;p&gt;보통 &lt;b&gt;우정포인트&lt;/b&gt;는 스테미나 구입하는 게 개이득입니다. 우정포인트 열심히 모아서 케릭터뽑으면 200씩 드는데, 1성아님 2성입니다-_- 스테미나 사서(50듬!) 모험돌리면 4번돌릴 수 있는데, 4번 중 두 번은 2성케릭터 나올 듯-_- 암튼 알아서 판단을!&lt;/p&gt;&lt;p&gt;명예포인트도 열심히 모아두세요. 룬구매할 때 겁나 필요합니다. 룬합성할 때에도 필요하고요. 명예포인트가 룬작할 때 꼭 필요하니 왕탑, 결장, 시탑 빠짐없이 하세요ㅠ&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;1. &lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;케릭터 강화/진화 시스템&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;- 강화&lt;/b&gt;&lt;/p&gt;&lt;p&gt;강화는 강화하려는 대상 케릭터에 재료 케릭터를 넣어서 강화합니다. 확률로 하는 것이 아니라 일정 케릭터를 처 박아 넣으면 강화퍼센트가 쌓이면서 100%가 되면 1강씩 됩니다. 강화는 &lt;b&gt;최대 5강&lt;/b&gt;까지 됩니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;- 진화&lt;/b&gt;&lt;/p&gt;&lt;p&gt;이 강화한 케릭터를 가지고 진화를 할 수 있습니다. &lt;b&gt;케릭터 최대레벨에 5강 + 아무레벨에 재료 5강&lt;/b&gt;으로 진화할 수 있습니다. 진화의 최대치는 아래 사진처럼, 별이 표시해줍니다. 빈칸이 있어야 진화가 가능한 케릭터 입니다. 최대는 &lt;b&gt;6성&lt;/b&gt;까지이며 언젠가 노가다를 하게 되면 뭐든 6성을 만들 수 있습니다. 시간이 약이라지만, 그래도 잘 알아보고 좋은 케릭터를 선별해서 키워야겠죠?&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2679D33854C7A74231&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2679D33854C7A74231&quot; width=&quot;600&quot; height=&quot;338&quot; filename=&quot;IMG_0050.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;2. 룬 시스템&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;이 게임이 아이템 그리기 귀찮았는지, &lt;b&gt;아이템을 룬으로 다 처리&lt;/b&gt;해버렸습니다. 결국 장비 시스템은 없고, 룬 시스템이 존재합니다. 룬은 골드룬, 블루룬, 레드룬, 그린룬이 있으며(RGB네요...), 이 룬들은 1~5성까지 존재합니다.&lt;/p&gt;&lt;p&gt;케릭터 당 룬 종류별로 3개씩 장착할 수 있습니다.&lt;b&gt; 케릭터당 총 12개의 룬&lt;/b&gt;이 필요하네요...&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/210E933C54C7AA6426&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F210E933C54C7AA6426&quot; width=&quot;600&quot; height=&quot;338&quot; filename=&quot;IMG_0051.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;- 룬합성&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;같은 등급 룬5개가 모이면 다음 등급의 룬 1개로 합성&lt;/b&gt;을 할 수 있습니다. 합성할 때 명예점수가 듭니다. 결국 노가다를 열심히 하면 5성룬 셋으로 맞출 수 있다는 기대감이 있습니다....그게 언제일까......&lt;/p&gt;&lt;p&gt;&lt;b&gt;- 룬진화&lt;/b&gt;&lt;/p&gt;&lt;p&gt;룬합성을 하게 되면 랜덤으로 다음 것이 나오기 때문에 원하는 룬이 나오지 않을 확률이 높습니다. 그래서 룬 진화 시스템이 있습니다. 이것은 &lt;b&gt;2성 공격력룬을 원한다면 1성 공격력 룬으로 진화&lt;/b&gt;를 하는 것입니다! 다만 &lt;b&gt;재료 룬으로 2성잡룬 4개&lt;/b&gt;가 필요한....-_- 이거 초반에는 그냥 하지말고, 나중에 5성까지 진화했는데 그지같은 룬이 나오면 그때 5성으로 갈 때 진화하는 게 나을겁니다. 어차피 룬이 겁나 많기 때문에 계속 합성하면 원하는것은 3~4성까지는 나옵니다-_- 5성 때 하는걸로....&lt;/p&gt;&lt;p&gt;&lt;b&gt;- 룬변환&lt;/b&gt;&lt;/p&gt;&lt;p&gt;해당 등급의 룬을 변환할 수 있습니다! 하지만 &lt;b&gt;돈&lt;/b&gt;이 듭니다! 그리고 랜덤입니다! 돈도 20만~30만골드입니다! 변환했는데 그지같은거 나오면 아마 폰 던질 듯...&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;3. 모험&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;모험은 난이도가 수련, 실전, 고행, 설원, 4가지 난이도로 나눠져 있습니다. 최초 오픈했을 때에는 3가지(수련, 실전, 고행) 밖에 없었는데, 얼마전에 설원이 오픈되었습니다.&lt;/p&gt;&lt;p&gt;&lt;b&gt;- 수련 실전 고행&lt;/b&gt;&lt;/p&gt;&lt;p&gt;수련, 실전, 고행은 한세트로 총 &lt;b&gt;60스테이지&lt;/b&gt;가 있습니다. &lt;b&gt;6성5강라일라&lt;/b&gt; 정도만 있으면 다 클리어할 수 있는 정도입니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;그리고 대부분 컨트롤 하기 귀찮아서 자동사냥 하는 곳을 많이 찾는데, 이순신정도 있으면 혼자서 돌 수 있는 최대 스테이지는 고행&amp;nbsp;51정도입니다. 대부분이 경험치를 키우거나 자사(자동사냥) 노가다하는 곳이 여기일 것입니다. &amp;nbsp;저는 51스테이지에서 이순신+키울애들2명 데리고 51에서 노가다를 주로 합니다(현재는 설원 자사하지만...). 여기에서는 아주 가~~~~~~~~~~끔 라일라나 제갈량 등 특수한 4성케릭이 떨어지기도 합니다. 저도 라일라1번 획득, 제갈량 한 번 구경정도한 것 같네요ㅠ 그리고 아주 빠른 속도로 클리어할 수 있기때문에 스테미나 녹이기에 좋기도 합니다. 아래 동영상 보시죠!&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;tt-youtube-plugin&quot; style=&quot;text-align: center&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/Y_tfFHLdD9k?rel=0&quot; width=&quot;560&quot; height=&quot;420&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;- 설원&lt;/b&gt;&lt;/p&gt;&lt;p&gt;설원은 최근에 업데이트 되었는데, 난이도가 극악이네요. 여기에 맞춰서 룬시스템도&lt;b&gt; 최대 4성-&amp;gt;5성룬&lt;/b&gt;으로 늘어났죠. 5성룬 맞춰서 돌려라 라는 의도였던 것 같습니다. 그래서 어중간한 3~4성룬으로는 6성5강 케릭 3개여도 자동사냥 돌리기가 힘들죠. 그래도 열심히 손컨하면 다 클리어할 수 있습니다.&lt;/p&gt;&lt;p&gt;설원은 보스&amp;nbsp;스테이지를 제외한 스테이지는&amp;nbsp;라일라만 있으면 전부 다 클리어는 할 수 있습니다만(라일라 만능설...), 보스스테이지는 조금 어려운 편입니다. 보통 보스랑 싸울 때에는 &lt;b&gt;3힐러&lt;/b&gt;로 많이 씁니다. 3힐러가 편한 이유는 잘 안죽어요-_- 게다가 맞으면 기력이 차기 때문에 셋이서 그냥 번갈아가면서 바꾸면 힐링도 되고 그래서 보스 잡을 때 시간이 오래 걸려도 쉽게 클리어할 수 있습니다. 저는 라일라, 링, 헬레나로 했습니다.&lt;/p&gt;&lt;p&gt;설원1보스는 메리다인데, 처음에 할 때 마법 쏘면 피가 미친듯이 달아서 그냥 멘붕이 왔는데, 몇 번 부활하니까 클리어가 되었네요. 설원2지역 보스는 이상한 하얀곰탱이인데, 기절 때문에 짱났던 것 같은데, 사실 여기 기절은 여기에 맛배기에 불과-_-&amp;nbsp;얘도 뭐 몇 번 부활하면 깸-_- 설원3도 누타우였나...이속감 계속 거는데, 헬레나가 알아서 잘 풀어줌. 얘도 몇 번 부활해서 깼...&lt;/p&gt;&lt;p&gt;마지막 설원4지역 보스는 정말 잼을 겁나 썼는데도 답이 없었습니다. 얘가 4연속 돌진을 하면 피할 수도 없고, 한 번 맞자마자 기절이 됩니다. 그래서 한 번 맞으면 죽습니다...뭐 이런 스테이지가 다 있어 하면서 돌진 안맞으려고 피하면서 생쑈를 했는데, 안되길래 공략을 보니까... 이 녀석 잘 몰면 왼쪽 상단으로 잘 몰면 튀어나온 부분이 있는데 거기에 끼워버리면 거기 끼인 곳에서만 계속 돌진합니다. 그때 졸라 패면 됩니다-_-&lt;/p&gt;&lt;p&gt;설원에서 자동사냥이 &lt;b&gt;가장 쉬운 스테이지가 확인해보니 1-3&lt;/b&gt;인 것 같습니다. &lt;b&gt;이순신-라일라-쫄 팟으로 서포터즈는 알리, 제갈량, 헬레나, 링, 메리다로 쓰니 열에 아홉은 성공&lt;/b&gt;하는 것 같습니다. 가끔 미친 몹들이 크리터지고, 방어감소, 공속감소 막 걸리면 교체 잘못되어서 죽기도 합니다만 대부분 성공합니다. 룬만 좀 더 갖추면 100%성공할 듯.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;tt-youtube-plugin&quot; style=&quot;text-align: center&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/gtDJHyNRl-I?rel=0&quot; width=&quot;560&quot; height=&quot;420&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;4. 결투장&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;상대방 유저랑 3:3으로&amp;nbsp;PvP&lt;/b&gt;를 하는 것인데, 실시간은 아닙니다. 이런 류 게임에서 꼭 있는 &lt;b&gt;팀대전&lt;/b&gt;입니다. 근데, 영웅에서는 좀 특이한 시스템이 있는 게 보통 팀대전을 하게 되면 컨트롤을 할 수 없는데, 얘는 결장에서 &lt;b&gt;컨트롤&lt;/b&gt;을 할 수 있습니다. 근데 귀찮아서 컨트롤 안합니다-_-&amp;nbsp;&lt;/p&gt;&lt;p&gt;그리고, 결투 시작을 선택하면 상대방이 어떤 덱인지 나오는데, 여기서 골드1000만 들이면 다른 유저를 찾을 수 있습니다. 그래서 가끔 쫄들 키우려는 덱이 걸리는데, 그럴 때 때려잡으면 상위랭킹에 들 수 있습니다.&lt;/p&gt;&lt;p&gt;승리메시지를 설정할 수 있는데, 제가 만약 지면 상대방이 설정한 승리메시지를 볼 수 있습니다. 이게 은근히 기분나쁜게...대부분 좋지 않은 멘트들이...뭐 좁빱, 현질 더하고 와라, ㅋㅋㅋ 등이 많아요. 이런 기능을 왜 넣은건지 모르겠...&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;tt-youtube-plugin&quot; style=&quot;text-align: center&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/2V-NbXEWCFw?rel=0&quot; width=&quot;560&quot; height=&quot;420&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p&gt;열심히 결장을 하게 되면 일요일 밤12시까지 랭킹을 매겨서 수늬권이면 루비를 보상으로 주니 매주 꼭 해주는 것이 좋습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;5. 왕좌의 탑&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;몬스터 길들이기에서 무한대전 같은 것입니다. 근데, &lt;b&gt;총 50스테이지&lt;/b&gt;까지 정해져있으며, 이걸 얼마나 빨리 클리어하냐가 랭킹에 영향을 미칩니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;그리고 클리어 때마다 룬을 주는데, 이 룬은 왕좌의룬으로 케릭터 당 1개밖에 장착할 수 없습니다. 룬이 능력이가 두개가 섞여서 있습니다. 공격력, 마방 이렇게 둘 다 있어서 꽤 좋은 룬을 많이 줍니다만, 1개밖에 장착할 수 없어요. 이것도 2개 장착할 수 있는 BM요소가 나올 것 같지만 모르겠네요-_-&lt;/p&gt;&lt;p&gt;카페에서 왕좌의 탑 동영상을 보면서 열심히 연습해봤는데, 그래도 전 8분대밖에 안나오네요ㅠ 빠른 사람들은 대부분 6분대더군요. 제가 한 것 보세요. 겁나 삽질하면서 하지만... 그래도 이게 1퍼대정도 입니다ㅠ 이것도 마찬가지로 일요일 밤12시까지 열심히 하면 랭커들에게 순위별로 젬을 줘요.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;tt-youtube-plugin&quot; style=&quot;text-align: center&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/fdMKXu0TOuk?rel=0&quot; width=&quot;560&quot; height=&quot;420&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;6. 시련의 탑&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;시련의 탑은 총 70층까지 있으며 &lt;b&gt;한층한층 클리어 시 마다 보상&lt;/b&gt;을 줍니다. 그래서 클리어할 수 있는 만큼 계속 클리어 해야 합니다. 게다가 한 번 클리어한 층은 반복적으로 다시 클리어할 수 있는데, 다시 클리어할 때에는 명예점수와 골드를 줍니다. 그래서 이것도 꾸준히 해주는 것이 좋습니다. 보통 &lt;b&gt;자동사냥이 되는 쉬운 구역은 50층정도&lt;/b&gt;인 것 같습니다. 상위층이랑 보상이 별로 차이가 안나서 50층만 돌려도 될듯염.&lt;/p&gt;&lt;p&gt;시련의 탑도 마찬가지로 만능 케릭터 라일라만 있으면 대부분 클리어가 가능합니다만, 헬레나도 같이 있어야 하는 스테이지도 있습니다. 한 50~60층 사이에서 JD가 나오는데, 이놈이 이동속도 감소를 자꾸 겁니다. 그러면 느리게 걷다가 JD한테 쳐 맞고&amp;nbsp;데집니다. 그렇기 때문에 라일라로 단검던지다가 이동속도감소&amp;nbsp;걸리면 헬레나로 바꾼 뒤(헬레나는 태그 시 상태이상 회복함) 회복하고 다시 라일라도 단검 던지면 60층까지 충분히 클리어 가능합니다. &lt;b&gt;60층 보상은 무려 6성케릭터 랜덤 증정!&lt;/b&gt; 꼭 클리어 하세요!(물론 저는 마르쿠스가 나왔습니다......후......)&lt;/p&gt;&lt;p&gt;최근 70층까지 업데이트가 되었는데요. 보상들이 &lt;b&gt;4성룬선택권과 4성영웅선택권&lt;/b&gt;을 줍니다. 물론 70층을 클리어해야 4성 케릭터 선택권을 줍니다.&amp;nbsp;&lt;br /&gt;61~70층 애들은 힐링 위주에 애들이 나옵니다. 그래서 라일라 얍쌉이가 안통합니다. 라일라는 시간만 있으면 클리어 했었는데, 힐러들 때문에 시간이 지나면 피가 다시 차서 깰려면 극딜러로 조낸 때려야 합니다.&lt;/p&gt;&lt;p&gt;아마 고비는 65층의 실버랑 70층 황충 라그나일듯요. 저도 아직 70층은 못깼는데, 65층 실버는 그냥 서포터즈 극딜러 모아놓고, 친구 서포터즈 모아놓고, 한 번에 서포터즈 다 같이 꺼내서 조지면 돼요. 만약 죽으면 그냥 부활하세요. 그러면 서포터즈 리젠되거든요. 그때 다시 한 번에 같이 모아서 때리면 죽을겁니다.&lt;/p&gt;&lt;p&gt;70층 깨려고 하는데, 4성선택권이라 나중 업데이트 추이를 보고 깰 생각이에요ㅠ&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;5. 피쿤동산&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;몬길에 강화란이 있다면 영웅에는 &lt;b&gt;피쿤(돼지)&lt;/b&gt;이 있습니다. &lt;b&gt;케릭터 강화할 때 더욱 많은 포인트를 추가&lt;/b&gt;할 수 있게 해줍니다. 피쿤동산은 난이도 3가지가 있는데, 6성 두개쯤 있으면 상급해도 됩니다. 쉽습니다. 하루에 1번밖에 클리어할 수 없다는 게 아쉽네요.&lt;/p&gt;&lt;p&gt;클리어를 하면 보상으로 돼지 3~6성을 주는데, 매일매일 3성만 줍니다. 4성 확율을 좀 증가해줬으면...-_-&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;ETC. 앞으로 업데이트&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;앞으로 &lt;b&gt;초월&lt;/b&gt; 시스템이 업데이트 예정이라네요. 초월은 같은 케릭터를 합성해서 &lt;b&gt;최대레벨을 증가&lt;/b&gt;하는 시스템인데요. 이게 나오면 앞으로 설원 자사 되는 지역이 더욱 늘어날 것 같아요.&lt;/p&gt;&lt;p&gt;&lt;b&gt;랜덤진화시스템&lt;/b&gt;도 업데이트 예정인데, 몬스터길들이기는 진화 시스템이 없고, 합성이 있는데, 합성은 같은 등급케릭터5강 2개로 합치면 다음 등급 랜덤 케릭터가 나오는 시스템이에요. 그런데 영웅은 무조건 그 케릭터로만 진화를 해서 새로운 케릭터는 영웅뽑기나 모험에서 얻을 수 밖에 없죠.&lt;br /&gt;그래서 랜덤진화 시스템은 진화할 때 다음등급을 랜덤으로 나오게 하는 것이라고 하네요. 근데 이것이...무려 한 번 하는데 250젬!-_- 가격은 좀 조정했으면 좋겠네요. 태생5성을 뽑을 좋은 기회의 업데이트라고 보네요.&amp;nbsp;&lt;/p&gt;&lt;p&gt;영웅도 뭐 몬스터 길들이기류와 다르진 않은데요. 케릭터 수집, 결투장랭킹 경쟁, 왕좌의탑 랭킹 경쟁, 각종 모험 클리어 등의 재미요소는 매우 비슷합니다. 앞으로 이런 류의 게임이 얼마나 갈지 모르겠지만, 확실히 아직까진 혼자하는&amp;nbsp;게임의 느낌이 강합니다. 물론 혼자서 케릭터가 강해지는 것을 지켜보는 것도 꽤나 재미는 있지만요!&lt;/p&gt;&lt;p&gt;지금도 컨텐츠가 꽤나 많다고 생각합니다만, 레이드 시스템도 언넝 업데이트 되었으면 좋겠네요. 길드전도 넣어서 길드원들과 무엇을 할 수 있는 시스템도 언넝 업데이트 되었으면 좋겠네요!&lt;/p&gt;</description>
      <category>나의 삶/리뷰</category>
      <author>머드초보</author>
      <guid isPermaLink="true">https://mudchobo.tistory.com/554</guid>
      <comments>https://mudchobo.tistory.com/554#entry554comment</comments>
      <pubDate>Wed, 28 Jan 2015 00:30:37 +0900</pubDate>
    </item>
    <item>
      <title>[DB] Mroonga - MariaDB 10.0.15에 포함된 InnoDB+Fulltext 검색엔진</title>
      <link>https://mudchobo.tistory.com/553</link>
      <description>&lt;p&gt;회사에서 처음 알게된 Mroonga인데요. 원래 InnoDB를 쓰면 Fulltext 검색을 사용할 수 없어요. MyISAM에서 밖에 안되죠. Mroonga는 InnoDB의 특징인 트랜잭션, 외래키락 등을 지원하고 Fulltext 검색까지 원하는 엔진이에요.&amp;nbsp;&lt;/p&gt;&lt;p&gt;마리아디비가 10.0.15로 업데이트되면서 Mroonga가 기본적으로 포함이 되어 있어요.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;1. 마리아디비 최신버전 설치&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://downloads.mariadb.org/mariadb/repositories/#mirror=kaist&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://downloads.mariadb.org/mariadb/repositories/#mirror=kaist&lt;/a&gt;&lt;/p&gt;&lt;p&gt;리눅스계열은 소스를 받아서 컴파일하는 것보다 위처럼 레포지토리를 추가해서 하라는대로 해서 설치하는 게 빠릅니다. 위처럼 설치하면 잘 설치가 될꺼에요. 저는 우분투라 아래와 같이 설치했습니다.&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;sudo apt-get install software-properties-common
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db
sudo add-apt-repository &lt;span style=&quot;color: #BA2121&quot;&gt;'deb http://ftp.kaist.ac.kr/mariadb/repo/10.0/ubuntu trusty main'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;키를 추가하고 레포지토리를 추가하면 최신버전의 mariadb를 설치할 수 있습니다.&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;sudo apt-get update
sudo apt-get install mariadb-server
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;2. Mroonga 플러그인 설치하기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;원래 Mroonga도 소스받아서 컴파일하고 설치해야하는데, 최신버전인 10.0.15가 설치가 되어있다면 그냥 바로 아래 명령어로 플러그인이 설치가 됩니다.&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;deploy@jared-dev:/usr/bin&lt;span style=&quot;color: #19177C&quot;&gt;$ &lt;/span&gt;&lt;b&gt;mysql -uroot -p&lt;/b&gt;
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or &lt;span style=&quot;color: #BB6622; font-weight: bold&quot;&gt;\g&lt;/span&gt;.
Your MariaDB connection id is 38
Server version: 10.0.15-MariaDB-1~trusty mariadb.org binary distribution

Copyright &lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;c&lt;span style=&quot;color: #666666&quot;&gt;)&lt;/span&gt; 2000, 2014, Oracle, SkySQL Ab and others.

Type &lt;span style=&quot;color: #BA2121&quot;&gt;'help;'&lt;/span&gt; or &lt;span style=&quot;color: #BA2121&quot;&gt;'\h'&lt;/span&gt; &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;for &lt;/span&gt;help. Type &lt;span style=&quot;color: #BA2121&quot;&gt;'\c'&lt;/span&gt; to clear the current input statement.

MariaDB &lt;span style=&quot;color: #666666&quot;&gt;[(&lt;/span&gt;none&lt;span style=&quot;color: #666666&quot;&gt;)]&lt;/span&gt;&amp;gt; &lt;b&gt;INSTALL SONAME &lt;span style=&quot;color: #BA2121&quot;&gt;'ha_mroonga'&lt;/span&gt;;&lt;/b&gt;
Query OK, 0 rows affected &lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;0.04 sec&lt;span style=&quot;color: #666666&quot;&gt;)&lt;/span&gt;

MariaDB &lt;span style=&quot;color: #666666&quot;&gt;[(&lt;/span&gt;none&lt;span style=&quot;color: #666666&quot;&gt;)]&lt;/span&gt;&amp;gt; show engines;
+--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                                    | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
| MEMORY             | YES     | Hash based, stored in memory, useful &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;for &lt;/span&gt;temporary tables                  | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                                         | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                                         | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine &lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;anything you write to it disappears&lt;span style=&quot;color: #666666&quot;&gt;)&lt;/span&gt;             | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                                      | NO           | NO   | NO         |
| MRG_MyISAM         | YES     | Collection of identical MyISAM tables                                      | NO           | NO   | NO         |
| Mroonga            | YES     | CJK-ready fulltext search, column store                                    | NO           | NO   | NO         |
| FEDERATED          | YES     | FederatedX pluggable storage engine                                        | YES          | NO   | YES        |
| InnoDB             | DEFAULT | Percona-XtraDB, Supports transactions, row-level locking, and foreign keys | YES          | YES  | YES        |
| Aria               | YES     | Crash-safe tables with MyISAM heritage                                     | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                                     | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
11 rows in &lt;span style=&quot;color: #008000&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;0.01 sec&lt;span style=&quot;color: #666666&quot;&gt;)&lt;/span&gt;

MariaDB &lt;span style=&quot;color: #666666&quot;&gt;[(&lt;/span&gt;none&lt;span style=&quot;color: #666666&quot;&gt;)]&lt;/span&gt;&amp;gt; 
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;3. Mroonga로 테이블 생성, InnoDB로 테이블 생성 후 비교.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Mroonga로 만드려면 아래와 같이 Engine은 Mroonga로 쓰고, fulltext key를 추가하고, fulltext key에 코멘트로 검색 옵션을 지정하면 돼요. 그리고 Engine에 코멘트를 달 수가 있는데, 이것은 InnoDB에 Wrapper Mode로 사용하겠다는 것이에요. 기본적으로 Mroonga를 생성하면 Storage Mode가 되는데, 이걸로 만들면 Transaction을 사용할 수 없어요.&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;&lt;p&gt;&lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;CREATE&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;TABLE&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;`&lt;/span&gt;random_hangul&lt;span style=&quot;color: #333333&quot;&gt;`&lt;/span&gt; (
  &lt;span style=&quot;color: #333333&quot;&gt;`&lt;/span&gt;id&lt;span style=&quot;color: #333333&quot;&gt;`&lt;/span&gt; &lt;span style=&quot;color: #007020&quot;&gt;bigint&lt;/span&gt;(&lt;span style=&quot;color: #0000DD; font-weight: bold&quot;&gt;20&lt;/span&gt;) &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;NOT&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;NULL&lt;/span&gt; AUTO_INCREMENT,
  &lt;span style=&quot;color: #333333&quot;&gt;`&lt;/span&gt;hangul&lt;span style=&quot;color: #333333&quot;&gt;`&lt;/span&gt; &lt;span style=&quot;color: #007020&quot;&gt;text&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;NOT&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;NULL&lt;/span&gt;,
  &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;PRIMARY&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;KEY&lt;/span&gt; (&lt;span style=&quot;color: #333333&quot;&gt;`&lt;/span&gt;id&lt;span style=&quot;color: #333333&quot;&gt;`&lt;/span&gt;),
  FULLTEXT &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;KEY&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;`&lt;/span&gt;hangul&lt;span style=&quot;color: #333333&quot;&gt;`&lt;/span&gt; (&lt;span style=&quot;color: #333333&quot;&gt;`&lt;/span&gt;hangul&lt;span style=&quot;color: #333333&quot;&gt;`&lt;/span&gt;) &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;COMMENT&lt;/span&gt; &lt;span style=&quot;background-color: #fff0f0&quot;&gt;'parser &quot;TokenBigramIgnoreBlankSplitSymbolAlphaDigit&quot;'&lt;/span&gt;
) ENGINE&lt;span style=&quot;color: #333333&quot;&gt;=&lt;/span&gt;Mroonga &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;DEFAULT&lt;/span&gt; CHARSET&lt;span style=&quot;color: #333333&quot;&gt;=&lt;/span&gt;utf8 &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;COMMENT&lt;/span&gt;&lt;span style=&quot;color: #333333&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;background-color: #fff0f0&quot;&gt;'engine &quot;InnoDB&quot;'&lt;/span&gt;
&lt;/p&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;아래는 그냥 InnoDB&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;&lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;CREATE&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;TABLE&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;`&lt;/span&gt;random_hangul2&lt;span style=&quot;color: #333333&quot;&gt;`&lt;/span&gt; (
  &lt;span style=&quot;color: #333333&quot;&gt;`&lt;/span&gt;id&lt;span style=&quot;color: #333333&quot;&gt;`&lt;/span&gt; &lt;span style=&quot;color: #007020&quot;&gt;bigint&lt;/span&gt;(&lt;span style=&quot;color: #0000DD; font-weight: bold&quot;&gt;20&lt;/span&gt;) &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;NOT&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;NULL&lt;/span&gt; AUTO_INCREMENT,
  &lt;span style=&quot;color: #333333&quot;&gt;`&lt;/span&gt;hangul&lt;span style=&quot;color: #333333&quot;&gt;`&lt;/span&gt; &lt;span style=&quot;color: #007020&quot;&gt;text&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;NOT&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;NULL&lt;/span&gt;,
  &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;PRIMARY&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;KEY&lt;/span&gt; (&lt;span style=&quot;color: #333333&quot;&gt;`&lt;/span&gt;id&lt;span style=&quot;color: #333333&quot;&gt;`&lt;/span&gt;)
) ENGINE&lt;span style=&quot;color: #333333&quot;&gt;=&lt;/span&gt;InnoDB &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;DEFAULT&lt;/span&gt; CHARSET&lt;span style=&quot;color: #333333&quot;&gt;=&lt;/span&gt;utf8
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;데이터를 아래와 같이 허접한 php스크립트로 넣고-_- 넣다보니 120만개 넣었는데, 지금부터 막 느려지더라구요ㅠ 구린 컴이라ㅠ&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;&lt;span style=&quot;color: #557799&quot;&gt;&amp;lt;?php&lt;/span&gt;

&lt;span style=&quot;color: #996633&quot;&gt;$servername&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;background-color: #fff0f0&quot;&gt;&quot;localhost&quot;&lt;/span&gt;;
&lt;span style=&quot;color: #996633&quot;&gt;$username&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;background-color: #fff0f0&quot;&gt;&quot;root&quot;&lt;/span&gt;;
&lt;span style=&quot;color: #996633&quot;&gt;$password&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;background-color: #fff0f0&quot;&gt;&quot;1234&quot;&lt;/span&gt;;
&lt;span style=&quot;color: #996633&quot;&gt;$db&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;background-color: #fff0f0&quot;&gt;&quot;mudchobo&quot;&lt;/span&gt;;

&lt;span style=&quot;color: #996633&quot;&gt;$words&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;=&lt;/span&gt; [&lt;span style=&quot;background-color: #fff0f0&quot;&gt;'가'&lt;/span&gt;, &lt;span style=&quot;background-color: #fff0f0&quot;&gt;'나'&lt;/span&gt;, &lt;span style=&quot;background-color: #fff0f0&quot;&gt;'다'&lt;/span&gt;, &lt;span style=&quot;background-color: #fff0f0&quot;&gt;'라'&lt;/span&gt;, &lt;span style=&quot;background-color: #fff0f0&quot;&gt;'마'&lt;/span&gt;, &lt;span style=&quot;background-color: #fff0f0&quot;&gt;'바'&lt;/span&gt;, &lt;span style=&quot;background-color: #fff0f0&quot;&gt;'사'&lt;/span&gt;, &lt;span style=&quot;background-color: #fff0f0&quot;&gt;'아'&lt;/span&gt;, &lt;span style=&quot;background-color: #fff0f0&quot;&gt;'자'&lt;/span&gt;, &lt;span style=&quot;background-color: #fff0f0&quot;&gt;'차'&lt;/span&gt;, &lt;span style=&quot;background-color: #fff0f0&quot;&gt;'카'&lt;/span&gt;, &lt;span style=&quot;background-color: #fff0f0&quot;&gt;'타'&lt;/span&gt;, &lt;span style=&quot;background-color: #fff0f0&quot;&gt;'파'&lt;/span&gt;, &lt;span style=&quot;background-color: #fff0f0&quot;&gt;'하'&lt;/span&gt;];

&lt;span style=&quot;color: #888888&quot;&gt;// Create connection&lt;/span&gt;
&lt;span style=&quot;color: #996633&quot;&gt;$conn&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #007020&quot;&gt;mysqli_connect&lt;/span&gt;(&lt;span style=&quot;color: #996633&quot;&gt;$servername&lt;/span&gt;, &lt;span style=&quot;color: #996633&quot;&gt;$username&lt;/span&gt;, &lt;span style=&quot;color: #996633&quot;&gt;$password&lt;/span&gt;, &lt;span style=&quot;color: #996633&quot;&gt;$db&lt;/span&gt;);

&lt;span style=&quot;color: #888888&quot;&gt;// Check connection&lt;/span&gt;
&lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;if&lt;/span&gt; (&lt;span style=&quot;color: #333333&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #996633&quot;&gt;$conn&lt;/span&gt;) {
    &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;die&lt;/span&gt;(&lt;span style=&quot;background-color: #fff0f0&quot;&gt;&quot;Connection failed: &quot;&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;.&lt;/span&gt; mysqli_connect_error());
}
&lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;background-color: #fff0f0&quot;&gt;&quot;Connected successfully&quot;&lt;/span&gt;;
&lt;span style=&quot;color: #996633&quot;&gt;$conn&lt;/span&gt;&lt;span style=&quot;color: #333333&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #0000CC&quot;&gt;query&lt;/span&gt;(&lt;span style=&quot;background-color: #fff0f0&quot;&gt;&quot;set names utf8&quot;&lt;/span&gt;);
&lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color: #996633&quot;&gt;$i&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #0000DD; font-weight: bold&quot;&gt;0&lt;/span&gt;; &lt;span style=&quot;color: #996633&quot;&gt;$i&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #0000DD; font-weight: bold&quot;&gt;1000000&lt;/span&gt;; &lt;span style=&quot;color: #996633&quot;&gt;$i&lt;/span&gt;&lt;span style=&quot;color: #333333&quot;&gt;++&lt;/span&gt;) {
    &lt;span style=&quot;color: #996633&quot;&gt;$randomWords&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;background-color: #fff0f0&quot;&gt;''&lt;/span&gt;;
    &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color: #996633&quot;&gt;$j&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #0000DD; font-weight: bold&quot;&gt;0&lt;/span&gt;; &lt;span style=&quot;color: #996633&quot;&gt;$j&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #0000DD; font-weight: bold&quot;&gt;100&lt;/span&gt;; &lt;span style=&quot;color: #996633&quot;&gt;$j&lt;/span&gt;&lt;span style=&quot;color: #333333&quot;&gt;++&lt;/span&gt;) {
        &lt;span style=&quot;color: #996633&quot;&gt;$randomWords&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;.=&lt;/span&gt; &lt;span style=&quot;color: #996633&quot;&gt;$words&lt;/span&gt;[mt_rand(&lt;span style=&quot;color: #0000DD; font-weight: bold&quot;&gt;0&lt;/span&gt;, &lt;span style=&quot;color: #007020&quot;&gt;count&lt;/span&gt;(&lt;span style=&quot;color: #996633&quot;&gt;$words&lt;/span&gt;) &lt;span style=&quot;color: #333333&quot;&gt;-&lt;/span&gt; &lt;span style=&quot;color: #0000DD; font-weight: bold&quot;&gt;1&lt;/span&gt;)];
    }
    &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;background-color: #fff0f0&quot;&gt;'randomWords = '&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;.&lt;/span&gt; &lt;span style=&quot;color: #996633&quot;&gt;$randomWords&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;.&lt;/span&gt; PHP_EOL;

    &lt;span style=&quot;color: #996633&quot;&gt;$conn&lt;/span&gt;&lt;span style=&quot;color: #333333&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #0000CC&quot;&gt;query&lt;/span&gt;(&lt;span style=&quot;background-color: #fff0f0&quot;&gt;&quot;insert into random_hangul(hangul) values ('&lt;/span&gt;&lt;span style=&quot;background-color: #eeeeee&quot;&gt;$randomWords&lt;/span&gt;&lt;span style=&quot;background-color: #fff0f0&quot;&gt;')&quot;&lt;/span&gt;);
}

&lt;span style=&quot;color: #996633&quot;&gt;$conn&lt;/span&gt;&lt;span style=&quot;color: #333333&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #0000CC&quot;&gt;close&lt;/span&gt;();
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그리고 검색하면....뭐 거의 비슷한데....이상하네... 암튼 그래도 조금 더 빠르네요. 아 잘모르겠네요... 동시접속하면 더 빠르려나요 ㄷㄷ&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;MariaDB &lt;span style=&quot;color: #333333&quot;&gt;[&lt;/span&gt;mudchobo&lt;span style=&quot;color: #333333&quot;&gt;]&lt;/span&gt;&amp;gt; &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;select &lt;/span&gt;count&lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;*&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt; from random_hangul;
+----------+
| count&lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;*&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt; |
+----------+
|  1298192 |
+----------+
1 row in &lt;span style=&quot;color: #007020&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;0.00 sec&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;

MariaDB &lt;span style=&quot;color: #333333&quot;&gt;[&lt;/span&gt;mudchobo&lt;span style=&quot;color: #333333&quot;&gt;]&lt;/span&gt;&amp;gt; &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;select&lt;/span&gt; * from random_hangul where match&lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;hangul&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt; against&lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #fff0f0&quot;&gt;'가나다'&lt;/span&gt; in boolean mode&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;;
...
45681 rows in &lt;span style=&quot;color: #007020&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;1.69 sec&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;MariaDB &lt;span style=&quot;color: #333333&quot;&gt;[&lt;/span&gt;mudchobo&lt;span style=&quot;color: #333333&quot;&gt;]&lt;/span&gt;&amp;gt; &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;select &lt;/span&gt;count&lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;*&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt; from random_hangul2;
+----------+
| count&lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;*&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt; |
+----------+
|  1297523 |
+----------+
1 row in &lt;span style=&quot;color: #007020&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;0.00 sec&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;

MariaDB &lt;span style=&quot;color: #333333&quot;&gt;[&lt;/span&gt;mudchobo&lt;span style=&quot;color: #333333&quot;&gt;]&lt;/span&gt;&amp;gt; &lt;span style=&quot;color: #008800; font-weight: bold&quot;&gt;select&lt;/span&gt; * from random_hangul2 where hangul like &lt;span style=&quot;background-color: #fff0f0&quot;&gt;'%가나다%'&lt;/span&gt;;
...
45904 rows in &lt;span style=&quot;color: #007020&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: #333333&quot;&gt;(&lt;/span&gt;3.53 sec&lt;span style=&quot;color: #333333&quot;&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;암튼 Fulltext에 옵션이 있는데, 공백과 검색, or and검색 등 다양한 옵션을 제공하니 참고요.&lt;br /&gt;&lt;a href=&quot;http://mroonga.org/docs/tutorial/wrapper.html#how-to-use-wrapper-mode&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot; style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;http://mroonga.org/docs/tutorial/wrapper.html#how-to-use-wrapper-mode&lt;/a&gt;&lt;/p&gt;&lt;p&gt;확실히 간단하게 사용할 검색이라면 쓰기에 좋을 것 같습니다.&lt;/p&gt;</description>
      <category>DataBase</category>
      <category>database db 데이터베이스 mariadb mroonga fulltext</category>
      <author>머드초보</author>
      <guid isPermaLink="true">https://mudchobo.tistory.com/553</guid>
      <comments>https://mudchobo.tistory.com/553#entry553comment</comments>
      <pubDate>Wed, 21 Jan 2015 16:26:08 +0900</pubDate>
    </item>
    <item>
      <title>[Linux] CentOS7에 rbenv 설치하기 - 부제: Ruby 2.2.0설치하기</title>
      <link>https://mudchobo.tistory.com/552</link>
      <description>&lt;p&gt;회사에 CI서버 셋팅할라고 삽질하는데 Ruby가 컴파일 하는데 겁나 에러나서 기록용-_-&lt;/p&gt;&lt;p&gt;yum install ruby로 설치되는 루비 버전이 2.1이여서 2.2.0을 설치하기 위해서 rbenv를 설치하려고 했는데, rbenv는 사실 그냥 스크립트라서 git으로 받으면 되는것인데, rbenv가 문제가 아니라 2.2.0이 컴파일이 잘 안되었어요.그래서 열심히 로그를 살펴본 결과 의존성패키지를 덜 설치해서 그렇더라구요.&lt;/p&gt;&lt;p&gt;아래사이트는 6.5에서 하는 방법인데, 여기에서 몇 개 더 설치를 해줘야 해요.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a href=&quot;http://mmclub.github.io/blog/2014/03/30/install-ruby-on-rails-on-centos/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://mmclub.github.io/blog/2014/03/30/install-ruby-on-rails-on-centos/&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;1. 필요 패키지 설치&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;sudo yum update
sudo yum install git
sudo yum groupinstall -y &lt;span style=&quot;color: #BA2121&quot;&gt;'development tools'&lt;/span&gt;
sudo yum install -y gcc-c++ glibc-headers openssl-devel readline libyaml-devel readline-devel zlib zlib-devel  sqlite-devel
&lt;b&gt;sudo yum install glibc-devel libffi-devel&lt;/b&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;맨 아래줄에 있는 거 설치안하면 컴파일할 때 에러나더라구요.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;2. rbenv 설치&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;다른 계정에서도 실행할 수 있게 하려면 보통 /usr/local/rbenv 위치에 설치하기도 합니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;3. ruby-build 설치&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;rbenv에 설치한 경로 안에 plugins/ruby-build 디렉토리에 설치합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;4. 환경변수 설정&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;글로벌 하게 쓰려면 /etc/profile.d/rbenv.sh로 파일을 생성해서 전체 유저에 영향받게 하고, 해당 유저만 사용하려면 그냥 .bashrc에 넣어도 됩니다.&lt;/p&gt;&lt;p&gt;일반적으로 RBENV_ROOT가 ~/.rbenv로 되어 있습니다. 이걸 바꾸고 싶으면 RBENV_ROOT환경변수를 정의하면 됩니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;rbenv를 /usr/local/rbenv에 설치한 경우 /etc/profile.d/rbenv.sh 추가&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;&lt;span style=&quot;color: #008000&quot;&gt;export &lt;/span&gt;&lt;span style=&quot;color: #19177C&quot;&gt;RBENV_ROOT&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #BA2121&quot;&gt;&quot;/usr/local/rbenv&quot;&lt;/span&gt;
&lt;span style=&quot;color: #008000&quot;&gt;export &lt;/span&gt;&lt;span style=&quot;color: #19177C&quot;&gt;PATH&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #BA2121&quot;&gt;&quot;$RBENV_ROOT/bin:$PATH&quot;&lt;/span&gt;
&lt;span style=&quot;color: #008000&quot;&gt;eval&lt;/span&gt; &lt;span style=&quot;color: #BA2121&quot;&gt;&quot;$(rbenv init -)&quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;그냥 .rbenv에 설치한 경우에는 rbenv path만 잡아주면 됩니다. (~/.bashrc)&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;&lt;span style=&quot;color: #008000&quot;&gt;export &lt;/span&gt;&lt;span style=&quot;color: #19177C&quot;&gt;PATH&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #BA2121&quot;&gt;&quot;$HOME/.rbenv/bin:$PATH&quot;&lt;/span&gt;
&lt;span style=&quot;color: #008000&quot;&gt;eval&lt;/span&gt; &lt;span style=&quot;color: #BA2121&quot;&gt;&quot;$(rbenv init -)&quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;5. 루비를 설치&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;rbenv install 2.2.0
rbenv rehash
rbenv global 2.2.0
ruby -v
ruby 2.2.0p0 &lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;2014-12-25 revision 49005&lt;span style=&quot;color: #666666&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;[&lt;/span&gt;x86_64-linux&lt;span style=&quot;color: #666666&quot;&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;6. 레일즈도 해볼까...&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;gem install rails
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/255AA14D54BB25FF1D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F255AA14D54BB25FF1D&quot; width=&quot;600&quot; height=&quot;441&quot; filename=&quot;스크린샷 2015-01-18 오후 12.17.39.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;오 잘된다!&lt;/p&gt;</description>
      <category>유닉스와 리눅스</category>
      <category>ruby 2.2.0 centos7 centos rails</category>
      <author>머드초보</author>
      <guid isPermaLink="true">https://mudchobo.tistory.com/552</guid>
      <comments>https://mudchobo.tistory.com/552#entry552comment</comments>
      <pubDate>Sun, 18 Jan 2015 12:20:06 +0900</pubDate>
    </item>
    <item>
      <title>[리뷰] 안드로이드 4년 넘게 쓴 사용자가 쓰는 아이폰6플러스 리뷰</title>
      <link>https://mudchobo.tistory.com/551</link>
      <description>&lt;p&gt;스마트폰을 아이폰6플러스로 바꿨습니다. 그 동안 할부원금(?) 아이폰보다 싼 안드로이드폰을 계속 써왔는데요.&lt;/p&gt;&lt;p&gt;처음에 멋도 모르고 난 구글이 좋으니까 한국 최초 출시된 안드로이드폰인 &lt;b&gt;모토로이&lt;/b&gt;&amp;nbsp;쓰다가 SKT안드로이드 공모전에서 앱을 내고 받은 &lt;b&gt;갤럭시S&lt;/b&gt;! 그러다가 &lt;b&gt;갤럭시S3&lt;/b&gt; 대란이 뽐뿌발로 펼쳐지면서 탑승! 그 뒤에 &lt;b&gt;G2&lt;/b&gt;가 미친듯한 가격하락으로 급뽐뿌가 와서 구매!&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/210E7A3D54B7BE8322&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F210E7A3D54B7BE8322&quot; width=&quot;600&quot; height=&quot;337&quot; filename=&quot;20150112_075412 (2).jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;span class=&quot;cap1&quot; style=&quot;display: block; max-width:100%; &quot;&gt;골드 + 에어자켓(클리어메이트)입니다! 겁나 이뻐!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이러다보니 가격 방어 잘 되는 아이폰 계열을 쓸 기회가 없었네요. 그러다가 회사에서 아이폰6플러스를 줘서 갈아타게 되었습니다(사...사....아니 감사합니다&amp;nbsp;회사님ㅠ).&amp;nbsp;&lt;/p&gt;&lt;p&gt;확실히 안드로이드를 쓰다가 아이폰을 쓰니 장점도 있고, 단점도 있네요. 외관이야 뭐 많이 봤을테니&amp;nbsp;제가 주로 사용하는 기능 위주로 리뷰를...(뭐 주로 하는 게 게임이지만ㅠ)&lt;/p&gt;&lt;p&gt;가장 기본적인 음악과 동영상 기능부터...&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;1. 음악&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;넣기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;안드로이드폰은 그냥 컴퓨터랑 연결해서 mp3파일을 복사하고 음악플레이어를 실행하면 자동으로 파일을 스캔해서 리스트에 떠서 바로 재생할 수 있는 구조입니다. 그래서 보통 음악 폴더를 통째로 올리고, 음악폴더별로 재생이 가능하고, 재생목록도 만들 수 있어서 듣고 싶은 음악 리스트를 넣을 수 있습니다.&lt;/p&gt;&lt;p&gt;아이폰에서는 mp3를 폴더로 복사하는 기능이 없고(뭐 다른 방법이 있겠지만 보편적으로 itunes로 해야하는 것 같더라구요), 아이튠즈에서 음악을 드래그로 추가해서 재생목록을 만든 뒤 동기화를 시키면 바로 아이폰에서 동일한 재생목록으로 그대로 들을 수 있습니다. &lt;b&gt;맥과 아이폰끼리 서로 완벽히 동기화&lt;/b&gt;가 된다는 장점이 있습니다. 맥에서 재생목록만 잘 관리하면 매우 편합니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2768DE4654B7A8D119&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2768DE4654B7A8D119&quot; width=&quot;600&quot; height=&quot;1067&quot; filename=&quot;IMG_0034.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;span class=&quot;cap1&quot; style=&quot;display: block; max-width:100%; &quot;&gt;아..걸스데이 노래 겁나 좋네요. 몇 년을 들어도 안질려요.
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;그리고 아이폰 전용 이어폰이 꽤 맘에 드네요. 귀에 쏙 맞고 음질도 꽤 괜찮아요(이어팟이라는 이름이 있네요). 그리고 다른 것보다 맘에 드는 것은 &lt;b&gt;맥북에 연결하면 맥북 볼륨 조절도 된다는 것입니다!! &lt;/b&gt;회사 맥북에 모니터 연결해서 쓰고 있는데, 볼륨 조절 하려면 맥북에 있는 fn+F10~F12로 조절해야 해서(윈도우 세대로 fn키를 켜놨...) 귀찮았는데, 바로 누르니 볼륨 조절이 됩니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;2. 동영상 넣기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;안드로이드는 음악처럼 동영상 파일 그대로 안드로이드폰에 복사해버리면 플레이어가 알아서 인식해서 재생할 수 있습니다. 음악이랑 똑같죠. 그리고, 보편적인 코덱은 대부분 지원해서 복사만하면 재생못하는 영상은 거의 없습니다. 그래서 꽤나 편했죠.&lt;/p&gt;&lt;p&gt;근데, 아이폰은 비디오 재생을 하려면 기본 내장된 비디오앱에서&amp;nbsp;iTunes에서 구매를 하거나 인코딩해서 동영상을 동기화하는 방법이 있습니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;다른 방법으로는&amp;nbsp;&lt;b&gt;써드파티 동영상앱을 설치하고,&amp;nbsp;아이튠즈를 통해&amp;nbsp;파일공유라는&amp;nbsp;기능을 이용해서 무인코딩&amp;nbsp;동영상을 넣어서 재생&lt;/b&gt;할 수 있습니다. 대부분 써드파티 동영상앱으로 하는 방법을 선호하죠. 아래 사이트에 잘 나와&amp;nbsp;있네요.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a href=&quot;http://azdesigntm.com/700&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://azdesigntm.com/700&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2450BF3354B7AC3115&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2450BF3354B7AC3115&quot; width=&quot;600&quot; height=&quot;338&quot; filename=&quot;IMG_0037.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;span class=&quot;cap1&quot; style=&quot;display: block; max-width:100%; &quot;&gt;우사미짱. 잘 나오네요. kmp플레이어에요.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;동영상도 위와 같은 방법으로 넣으면 쉽게 넣을 순 있어요. 근데, 코덱이&amp;nbsp;재생할 수 있는 앱이 있고, 재생할 수 없는 앱들이 있어요. 동영상 앱 선택할 때 신중히 선택하셔서 구매하세요.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;3. 가로로 전환?&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;이건 쓰면서 느낀건데 제 폰이 맛이 간건지 원래 그런건지는 정확하게는 잘 모르겠어요. 안드로이드 같은 경우는 폰을 애초부터 가로 거꾸로 잡고 있고, 거꾸로 잡고 있으면 앱이 실행될 때 자동으로 거꾸로 된 위치가 바뀌는데, 아이폰은 안그렇더라구요. 애초에 거꾸로 잡고 가로앱을 실행하면, 계속 거꾸로 되는데, 다시 폰을 돌렸다가 다시 거꾸로 돌리면 그때 화면이 바뀌더라구요. 뭐 별거 아니지만 그냥 그렇다구요... 써놓고 보니 뭔말이지....무...무시하세요...&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;4. 스팸전화 필터 앱&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;안드로이드폰은 전화올 때 이벤트 같은 것을&amp;nbsp;써드파티앱이 받을 수 있습니다. 그래서 후후, 후스콜 처럼 전화가 오면 그 전화번호를 자신의 스팸데이터에서 검색을 해서 이게 스팸전화인지 아닌지를 알 수 있는 앱들이 있죠.&lt;/p&gt;&lt;p&gt;아이폰에서는 이런 필터앱 구현을 할 수 없습니다. 그래서 &lt;b&gt;&quot;뭐야 이번호&quot;라는 앱&lt;/b&gt;이 있는데, 아이폰에서는 연락처에는 접근할 수 있어서 그 연락처에 모든 스팸번호를 등록해서 그 스팸번호로 전화가 오면 뭐야이번호로 저장된 번호로 전화가 옵니다.&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/211C404954B7AFC105&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F211C404954B7AFC105&quot; width=&quot;600&quot; height=&quot;1067&quot; filename=&quot;IMG_0038.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;span class=&quot;cap1&quot; style=&quot;display: block; max-width:100%; &quot;&gt;최신정보를 앱을 실행해서 받아줘야하는 단점이 있습니다ㅠ&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/243A3C4454B7B1581E&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F243A3C4454B7B1581E&quot; width=&quot;600&quot; height=&quot;1067&quot; filename=&quot;IMG_0039.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;span class=&quot;cap1&quot; style=&quot;display: block; max-width:100%; &quot;&gt;스팸전화 두 개 걸렀네요. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;위와 같이 전화가 오면 뭐야이번호로 오기 때문에 안받으면 됩니다. 연락처에 다양한 전화번호가 저장될 수 있어서 가능한 것 같습니다. 만든 사람 머리 좋네요. 스팸전화를 어제 두 건이나 받았는데, 걸렀네요.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;또 다른 방식의 스팸필터앱 중에 후스콜(안드로이드 처럼 실시간 앱이 아님)이라는 게 있는데, 이것은 모르는 번호에 전화가 오면 받지 않고 끊은 다음에 전화번호를 복사하면 그 번호로 인터넷을 통해 검색을 해서 위젯에 표시해주는 원리의 앱입니다.&lt;br /&gt;전화번호에서 최근통화해서 i버튼을 누르면 전화번호가 나오는데, 그거 오래 누르고 있으면 복사하기가 되는데 복사하자마자 후스콜이 바로 검사를 해줍니다. 위에서 위젯을 보여주면 이게 스팸인지 아닌지 나와요......귀찮아 하는 사람들은&amp;nbsp;전화받고 스팸이면 끊는 게 더 낫겠어요.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/232A794054B7B23C17&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F232A794054B7B23C17&quot; width=&quot;600&quot; height=&quot;1067&quot; filename=&quot;IMG_0040.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;span class=&quot;cap1&quot; style=&quot;display: block; max-width:100%; &quot;&gt;텔레마케팅이라고 나오네요.
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;5. 움직이는 아이콘!&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;오 신기했던 게 바탕화면에 있는 &lt;b&gt;아이콘에 오늘 날짜가 표기되고, 시계는 초침이 움직이면서 현재 시계가 아날로그로 표기&lt;/b&gt;되고 있어요! 근데, 이거 개발자가 앱으로 구현할 수는 없는거죠? 이런 종류의 앱을 본 적이 없어서... 암튼 신기한 아이콘이네요. 아 근데 생각해보니 안드로이드는 위젯이 있으니...별로 신기할 것도 없는데, 뭔가 더욱 깔끔해보여서 신기하게 느껴지는 것 같네요.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;6. 웹브라우저 사파리(Safari)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;저는 크롬이 좋아서 크롬을 깔았는데, 깔자마자 네이버들어가고 바로 지웠습니다. 속도가 안드로이드폰이나 기본 아이폰 사파리에 비해서 너무 느렸어요. 그래서 그냥 사파리를 쓰기로 했습니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;브라우저는 빠릿빠릿해서 좋네요. 더욱 좋은 점은 컨트롤인데, 처음에 안드로이드는 뒤로가기 할 때 그냥 뒤로가기 버튼 누르면 알아서 뒤로 가는데, 아이폰은 그 버튼이 없어서 뒤로가기 하려면 버튼을 눌러야 하는데, 버튼을 누르려면 스크롤을 다시 올려야 메뉴가 나오는데, 그때 좌측하단에 있는 버튼을 눌러야 뒤로 갈 수 있습니다. ㅣㄴ아러ㅣㅏㅁㄴㄹ얼ㅇ 아오 뒤로가기 겁나 힘드네 하고 있는데,&amp;nbsp;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;다른 사람들 쓰는 거 보니&lt;b&gt; 왼쪽끝에서 오른쪽으로 드래그&lt;/b&gt;를 하니 뒤로 가집니다!&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2456124154B7B5561F&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2456124154B7B5561F&quot; width=&quot;600&quot; height=&quot;1067&quot; filename=&quot;IMG_0041.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;span class=&quot;cap1&quot; style=&quot;display: block; max-width:100%; &quot;&gt;전체 열려 있는 탭이 간지나게 나오네요. 역시 UI는 애플이죠. 왼쪽으로 밀면 바로 닫을 수 있어요 짱이에요.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2253764154B7B55823&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2253764154B7B55823&quot; width=&quot;600&quot; height=&quot;1067&quot; filename=&quot;IMG_0042.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;span class=&quot;cap1&quot; style=&quot;display: block; max-width:100%; &quot;&gt;드래그로 뒤로가기를 쉽게 할 수 있어요!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;7. 건강&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;오 이런 기능은 정말 처음이네요. 안드로이드에는 없어요ㅠ 자신이 얼마나 걸었는지 계단 오르내리기를 얼마나 했는지 그래프로 이쁘게 보여줍니다. 아...볼 때마다 운동해야지 하는데...회사가 코앞이라... 하루에 2km미만으로 걷고 있네요ㅠ&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2539B63F54B7B6E634&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2539B63F54B7B6E634&quot; width=&quot;600&quot; height=&quot;1067&quot; filename=&quot;IMG_0043.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;span class=&quot;cap1&quot; style=&quot;display: block; max-width:100%; &quot;&gt;이제 계단으로 출퇴근해야겠다...3계단이라니...
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;8. 핫스팟 기능&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;핫스팟이 좀 맘에 안드는 게 이상하게 연결이 잘 안됩니다ㅠ 제가 안드로이드 게임밖에 없는 게임을 위해 폰을 안드로이드폰과 같이 들고 다니는데, 핫스팟기능을 켜면 한 번에 연결이 안될 때가 많습니다(설마 이것도 내 폰만 문제인건가ㅠ). 몇 번 다시 껐다켜면 연결이 되더라구요.&amp;nbsp;&lt;/p&gt;&lt;p&gt;좋은 점이 폰이 연결이 되면 &lt;b&gt;몇 개 연결이 되었는지 상단&lt;/b&gt;에 나와요. 그래서 어떤 놈이 내꺼 몰래 쓰고 있는지 나오죠. 그리고, 안드로이드는 테더링이라고 표시하는데, 타임아웃 시간을 지정할 수 있습니다. 무제한까지 가능한데, 아이폰은 타임아웃 시간을 지정하는 것이 없고, 그냥 한 5분동안 인터넷을 하지 않으면 끊어지는 느낌입니다ㅠ 끊어지면 또 바로 연결이 안되고, 핫스팟 기능을 다시 껐다 켜야 하더라구요. &amp;nbsp;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/224B553654B7B90A21&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F224B553654B7B90A21&quot; width=&quot;600&quot; height=&quot;1067&quot; filename=&quot;IMG_0045.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;span class=&quot;cap1&quot; style=&quot;display: block; max-width:100%; &quot;&gt;우오오! 저기 선택하면 설정화면으로 가요.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;9. NFC기능이 없...&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;이거 좀 아쉽습니다. 원래 NFC가 아이폰에 들어는 있는데, 애플페이 만을 위한 기능이라고 하네요. 예전에 안드로이드폰에는&amp;nbsp;NFC가 있어서 체크카드가 없을 때&amp;nbsp;NFC를 이용해서 ATM에서 돈을 뺄 수 있는데, 그걸 할 수 없어요ㅠ 교통카드 기능도 되는데ㅠ 애플이 하루 빨리 풀어줘야 한다고 생각합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;10. 지문인식 기능&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;지문인식 기능 겁나 신세계입니다. 화면 잠금 풀 때 자연스럽게 가운데 버튼을 누르면 잠금이 풀립니다. 이렇게 지문인식이 신기하게 잘 되는 거 처음보네요. 예전에 제 노트북이 소니지문인식노트북이였는데, 살 때 처음 테스트해보고 봉인했었는데, 이건 인식율이 너무 좋으니 이걸 활용한 앱들이 나오면 좋을 것 같습니다(아..근데 이것도 사용자가 구현할 수 있나 모르겠네요).&amp;nbsp;&lt;/p&gt;&lt;p&gt;그리고, 앱스토어에서 앱을 구매 및 다운로드할 때에도 비밀번호 겁나 쳐야하는데, 지문인식만으로 앱을 구매 및 다운로드할 수 있어요. 근데 안드로이드에서는 사실 무료앱 다운로드할 때에는 비밀번호 안물어보죠. 유료앱살 때 결제할 때에만 비밀번호를 물어보죠. 앱스토어도 무료앱살 때에는 비번 안치게 좀......&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;11. 게임&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;게임은 안드로이드폰보다 훨씬 부드럽게 잘 돌아가네요. 요즘 즐겨하는 게임 중 영웅이 있는데요. 확실히 G2에서 하던 것보단 렉도 없이 잘 돌아갑니다. G2에서 할 때에는 몹이 미친듯이 많아지면 렉이 걸려서 죽기 일쑤여서 해상도 조절을 최하로 맞춰놓고 했는데요(그래서 렉걸리고...ㅠㅠ). 아이폰에서는 그런 게 전혀 없어서 좋네요. 고해상도로 해놔도 매우 부드럽게 잘 돌아가요! 게임은 아이폰에서 하는 게 좋을 것 같아요.&lt;/p&gt;&lt;p&gt;단.... 아이폰 게임이.... 출시가.... 잘 .... 안됩...니다.... 카카오게임만 해도 주로 안드로이드만 출시하는 게임이 대부분이에요. 아이폰 유저가 좀 더 늘어나야 게임 개발사들이 아이폰에 더 눈을 돌릴텐데요ㅠ 우리나라 현실은 그렇지 않으니 안타깝네요.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;결론&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;이제 쓴 지 한달이 다되어가는데요. 장점도 있고 단점도 있는 것 같습니다. 일부 안타까운 단점은 뭐 그닥 불편한 점은 아니고,&amp;nbsp;게임을 주로(?)하기 때문에 매우 만족스럽습니다. 지금 하고 있는 영웅이 매우 잘 돌아가서 기쁘네요ㅠ 그리고 맘에 드는 점은 부드러운 UI전환과 애니메이션입니다. 아주 깔끔해요. 이래서 다들 아이폰아이폰 하나 봅니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;인기 있고 유명한 게임(이런 게임들은 대부분 아이폰도 같이 냄!)만 하실 분들은 아이폰 강추합니다. 게임이 잘 돌아갑니다! 최고의 게임기 입니다!&lt;/p&gt;</description>
      <category>나의 삶/리뷰</category>
      <category>아이폰 아이폰6 아이폰6플러스 iphone6plus</category>
      <author>머드초보</author>
      <guid isPermaLink="true">https://mudchobo.tistory.com/551</guid>
      <comments>https://mudchobo.tistory.com/551#entry551comment</comments>
      <pubDate>Mon, 12 Jan 2015 23:07:21 +0900</pubDate>
    </item>
    <item>
      <title>소스 코드 보기 좋게 css 입혀주는 Syntax Highlight Tool - hilite.me</title>
      <link>https://mudchobo.tistory.com/550</link>
      <description>&lt;p&gt;기존에 syntax highlighter라는 플러그인은 js를 업로드하거나 script로 include해서 &amp;lt;code&amp;gt;&amp;lt;/code&amp;gt;태그를 찾아서 css를 입히는 형태가 있습니다. 근데 티스토리에서 할라니까 html skin도 편집해야 하고 js, css파일도 업로드해야 합니다. 이거 말고도&amp;nbsp;&lt;a href=&quot;https://highlightjs.org/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://highlightjs.org/&lt;/a&gt;라는 플러그인도 있지만, 이것도 위와 같은 동일한 형태입니다.&lt;/p&gt;&lt;p&gt;결정적으로 글을 쓸 때 html형태는 Syntax Highlight를 하기 힘들더라구요. 그래서 찾다보니 그냥 소스코드를 붙여넣으면 바로 css까지 입힌 형태의 소스코드를 생성합니다. 그래서 티스토리에서 글을 쓸 때 그냥 &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;사이에 코드를 그대로 넣으면 매우 잘 나옵니다.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;사이트 주소&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;/span&gt;&lt;a href=&quot;http://hilite.me/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;http://hilite.me/&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;아래와 같이 그냥 소스코드 대추 붙여놓으면 이쁘게 html로 바꿔서 오른쪽에 표시해줍니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2111564954B2740A28&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2111564954B2740A28&quot; width=&quot;600&quot; height=&quot;485&quot; filename=&quot;스크린샷 2015-01-11 오후 10.00.10.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;아래는 html태그를 붙인 예제입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;&lt;span style=&quot;color: #BC7A00&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;&amp;lt;head&lt;/span&gt; &lt;span style=&quot;color: #7D9029&quot;&gt;lang=&lt;/span&gt;&lt;span style=&quot;color: #BA2121&quot;&gt;&quot;en&quot;&lt;/span&gt;&lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;&amp;lt;meta&lt;/span&gt; &lt;span style=&quot;color: #7D9029&quot;&gt;charset=&lt;/span&gt;&lt;span style=&quot;color: #BA2121&quot;&gt;&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;&amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
    테스트입니다.
&lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;php도 붙여보니 잘되네요.&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;&lt;span style=&quot;color: #BC7A00&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span style=&quot;color: #19177C&quot;&gt;$osInfo&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt; strtoupper(substr(&lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;PHP_OS&lt;/span&gt;, &lt;span style=&quot;color: #666666&quot;&gt;0&lt;/span&gt;, &lt;span style=&quot;color: #666666&quot;&gt;3&lt;/span&gt;));

&lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;if&lt;/span&gt; (&lt;span style=&quot;color: #008000&quot;&gt;count&lt;/span&gt;(&lt;span style=&quot;color: #19177C&quot;&gt;$argv&lt;/span&gt;) &lt;span style=&quot;color: #666666&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;4&lt;/span&gt;)
{
    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: #BA2121&quot;&gt;'argv enter. area stage isChallenge device deviceip ex) 5 3 1 genymotion (101)'&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;.&lt;/span&gt; PHP_EOL;
    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;exit&lt;/span&gt;;
}
&lt;span style=&quot;color: #19177C&quot;&gt;$area&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #19177C&quot;&gt;$argv&lt;/span&gt;[&lt;span style=&quot;color: #666666&quot;&gt;1&lt;/span&gt;];
&lt;span style=&quot;color: #19177C&quot;&gt;$stage&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #19177C&quot;&gt;$argv&lt;/span&gt;[&lt;span style=&quot;color: #666666&quot;&gt;2&lt;/span&gt;];
&lt;span style=&quot;color: #19177C&quot;&gt;$isChallenge&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt; (&lt;span style=&quot;color: #19177C&quot;&gt;$argv&lt;/span&gt;[&lt;span style=&quot;color: #666666&quot;&gt;3&lt;/span&gt;] &lt;span style=&quot;color: #666666&quot;&gt;==&lt;/span&gt; &lt;span style=&quot;color: #BA2121&quot;&gt;'1'&lt;/span&gt;) &lt;span style=&quot;color: #666666&quot;&gt;?&lt;/span&gt; &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;true&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;false&lt;/span&gt;;
&lt;span style=&quot;color: #19177C&quot;&gt;$device&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #19177C&quot;&gt;$argv&lt;/span&gt;[&lt;span style=&quot;color: #666666&quot;&gt;4&lt;/span&gt;];
&lt;span style=&quot;color: #19177C&quot;&gt;$data&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #008000&quot;&gt;json_decode&lt;/span&gt;(&lt;span style=&quot;color: #008000&quot;&gt;file_get_contents&lt;/span&gt;(&lt;span style=&quot;color: #BA2121&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #BB6688; font-weight: bold&quot;&gt;$device&lt;/span&gt;&lt;span style=&quot;color: #BA2121&quot;&gt;.json&quot;&lt;/span&gt;), &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;true&lt;/span&gt;);
&lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;if&lt;/span&gt; (&lt;span style=&quot;color: #19177C&quot;&gt;$data&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;==&lt;/span&gt; &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;null&lt;/span&gt;) {
    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: #BA2121&quot;&gt;'Error!'&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;.&lt;/span&gt; PHP_EOL;
    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;exit&lt;/span&gt;;
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;프로그래밍 언어 관련 글 쓰시는 분들 잘 애용하세요. 보니까 소스코드도 공개되어 있더라구요. 혹시나 사이트가 나중에 죽어버려도 소스가 깃헙에 있으니 괜찮을 것 같아요.&lt;/p&gt;</description>
      <category>나의 삶/리뷰</category>
      <category>code syntax highlight 코드 hilite css</category>
      <author>머드초보</author>
      <guid isPermaLink="true">https://mudchobo.tistory.com/550</guid>
      <comments>https://mudchobo.tistory.com/550#entry550comment</comments>
      <pubDate>Sun, 11 Jan 2015 21:54:51 +0900</pubDate>
    </item>
    <item>
      <title>[Spring Boot] 간단한 RestAPI 및 JPA 예제.</title>
      <link>https://mudchobo.tistory.com/549</link>
      <description>&lt;p&gt;스프링 오랜만에 다시 보내 새롭네요. 우연히 접할 기회가 있어서 스프링 부트를 접하게 되었습니다. 기존에 주로 회사에서는 php, ruby on rails, javascript 등 스크립트 언어를 해오다 보니 꽤나 쉽지 않네요. 뭐 이걸로 프로젝트를 한 번 하면 금방 배우겠죠. 루비 같은 경우도 작년까지 전혀 몰랐는데, 프로젝트를 하다보니 점점 알게 되더라구요.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;1. 셋팅&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;이걸 하면서 gradle이라는 것을 알게 되었는데, 보니까 maven 같은 것인데, 확실히 maven보단 설정 문법이 더욱 깔끔하고 좋네요. maven에서는 xml 지옥이라 알아보기 힘들었는데, gradle은 그냥 스크립트 형식으로 되어있어서 더 알아보기 쉽게 되어있습니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;build.gradle&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath(&lt;span style=&quot;color: #BA2121&quot;&gt;&quot;org.springframework.boot:spring-boot-gradle-plugin:1.1.10.RELEASE&quot;&lt;/span&gt;)
    }
}

&lt;span style=&quot;color: #008000&quot;&gt;apply&lt;/span&gt; plugin: &lt;span style=&quot;color: #BA2121&quot;&gt;'java'&lt;/span&gt;
&lt;span style=&quot;color: #008000&quot;&gt;apply&lt;/span&gt; plugin: &lt;span style=&quot;color: #BA2121&quot;&gt;'spring-boot'&lt;/span&gt;

sourceCompatibility &lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;1.5&lt;/span&gt;
version &lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #BA2121&quot;&gt;'1.0'&lt;/span&gt;

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: &lt;span style=&quot;color: #BA2121&quot;&gt;'junit'&lt;/span&gt;, name: &lt;span style=&quot;color: #BA2121&quot;&gt;'junit'&lt;/span&gt;, version: &lt;span style=&quot;color: #BA2121&quot;&gt;'4.11'&lt;/span&gt;
    &lt;span style=&quot;color: #008000&quot;&gt;compile&lt;/span&gt;(&lt;span style=&quot;color: #BA2121&quot;&gt;&quot;org.springframework.boot:spring-boot-starter-web:1.2.0.RELEASE&quot;&lt;/span&gt;)
    &lt;span style=&quot;color: #008000&quot;&gt;compile&lt;/span&gt;(&lt;span style=&quot;color: #BA2121&quot;&gt;&quot;org.springframework.boot:spring-boot-starter-data-jpa&quot;&lt;/span&gt;)
    &lt;span style=&quot;color: #008000&quot;&gt;compile&lt;/span&gt;(&lt;span style=&quot;color: #BA2121&quot;&gt;&quot;mysql:mysql-connector-java:5.1.34&quot;&lt;/span&gt;)
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;맨 위에 buildscript부분은 jar파일 만들기 위해서 필요한 것 같아요. 그 외에 plugin이 spring-boot가 추가되었는데, bootRun 이런 task 등이 추가 되어있어요.&lt;/p&gt;&lt;p&gt;dependencies는 스프링 부트를 쓰려면 spring-boot-starter-web이 있어야 하고, 데이터연동하는 것을 하기 위해서는 spring-boot-starter-data-jpa가 있어야 하고, mysql을 쓰려면 mysql-connector-java를 추가해야 해요.&lt;br /&gt;jpa에는 하이버네이트가 내장되어 있어요.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;2. 메인 클래스&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;스프링 부트는 예전 개발방식이랑 틀리게 톰캣 받고, web.xml을 셋팅하고, 웹개발을 위한 셋팅이 필요없이 기존 java 실행 방식으로 실행하며 이 실행과 동시에 내장된 톰캣이 작동하여 서버를 만들어버립니다. 아래와 같이 메인클래스를 만들어버리면 그냥 웹서버애플리케이션이 뜹니다.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Application.java&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;&lt;span style=&quot;color: #AA22FF&quot;&gt;@SpringBootApplication&lt;/span&gt;
&lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #0000FF; font-weight: bold&quot;&gt;Application&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;{&lt;/span&gt;
    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #B00040&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #0000FF&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;String&lt;span style=&quot;color: #666666&quot;&gt;[]&lt;/span&gt; args&lt;span style=&quot;color: #666666&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;{&lt;/span&gt;
        ConfigurableApplicationContext context &lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt; SpringApplication&lt;span style=&quot;color: #666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #7D9029&quot;&gt;run&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;Application&lt;span style=&quot;color: #666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #7D9029&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;,&lt;/span&gt; args&lt;span style=&quot;color: #666666&quot;&gt;);&lt;/span&gt;

    &lt;span style=&quot;color: #666666&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #666666&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;보면 예전에 자바처음 배울 때 쓰는 public static void main클래스로 실행만 합니다. @SpringBootApplication어노테이션을 붙이면 최초 기본셋팅으로 톰캣을 띄워서 8080포트로 서버를 만들어 줍니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;3. 모델 생성&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;그 전에 접속할 db정보를 입력해야 합니다.&amp;nbsp;&lt;br /&gt;&lt;b&gt;application.properties&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;&lt;span style=&quot;color: #7D9029&quot;&gt;spring.datasource.url&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #BA2121&quot;&gt;jdbc:mysql://127.0.0.1/sosi?autoReconnect=true&amp;amp;useUnicode=true&amp;amp;characterEncoding=utf8&lt;/span&gt;
&lt;span style=&quot;color: #7D9029&quot;&gt;spring.datasource.username&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #BA2121&quot;&gt;root&lt;/span&gt;
&lt;span style=&quot;color: #7D9029&quot;&gt;spring.datasource.password&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt;
&lt;span style=&quot;color: #7D9029&quot;&gt;spring.jpa.hibernate.ddl-auto&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #BA2121&quot;&gt;create-drop&lt;/span&gt;
&lt;span style=&quot;color: #7D9029&quot;&gt;spring.jpa.database&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #BA2121&quot;&gt;mysql&lt;/span&gt;
&lt;span style=&quot;color: #7D9029&quot;&gt;spring.jpa.show-sql&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #BA2121&quot;&gt;true&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;대략 설정값은 저런데 ddl-auto부분이 create-drop은 서버 재시작 때마다 테이블을 날려버리는 옵션입니다. 처음에 개발할 때에는 매우 편리합니다. 값을 매번 지우지 않고도 서버만 재시작해도 처음부터 다시 개발 해놓은 것을 테스트해볼 수 있으니깐염.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Sosi.java&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;&lt;p&gt;&lt;span style=&quot;color: #AA22FF&quot;&gt;@Entity&lt;/span&gt;
&lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #0000FF; font-weight: bold&quot;&gt;Sosi&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;{&lt;/span&gt;
    &lt;span style=&quot;color: #AA22FF&quot;&gt;@Id&lt;/span&gt;
    &lt;span style=&quot;color: #AA22FF&quot;&gt;@GeneratedValue&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;strategy &lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt; GenerationType&lt;span style=&quot;color: #666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #7D9029&quot;&gt;AUTO&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;)&lt;/span&gt;
    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #B00040&quot;&gt;long&lt;/span&gt; id&lt;span style=&quot;color: #666666&quot;&gt;;&lt;/span&gt;

    &lt;span style=&quot;color: #AA22FF&quot;&gt;@Column&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;nullable &lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;)&lt;/span&gt;
    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;private&lt;/span&gt; String name&lt;span style=&quot;color: #666666&quot;&gt;;&lt;/span&gt;

    &lt;span style=&quot;color: #AA22FF&quot;&gt;@OneToMany&lt;/span&gt;
    &lt;span style=&quot;color: #AA22FF&quot;&gt;@JoinColumn&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;name&lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #BA2121&quot;&gt;&quot;sosi_id&quot;&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;,&lt;/span&gt; referencedColumnName&lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #BA2121&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;)&lt;/span&gt;
    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;private&lt;/span&gt; List&lt;span style=&quot;color: #666666&quot;&gt;&amp;lt;&lt;/span&gt;Schedule&lt;span style=&quot;color: #666666&quot;&gt;&amp;gt;&lt;/span&gt; scheduleList&lt;span style=&quot;color: #666666&quot;&gt;;&lt;/span&gt;

    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000FF&quot;&gt;Sosi&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;{&lt;/span&gt;
    &lt;span style=&quot;color: #666666&quot;&gt;}&lt;/span&gt;

    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000FF&quot;&gt;Sosi&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;String name&lt;span style=&quot;color: #666666&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #7D9029&quot;&gt;name&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt; name&lt;span style=&quot;color: #666666&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #666666&quot;&gt;}&lt;/span&gt;

    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #B00040&quot;&gt;long&lt;/span&gt; &lt;span style=&quot;color: #0000FF&quot;&gt;getId&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;return&lt;/span&gt; id&lt;span style=&quot;color: #666666&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #666666&quot;&gt;}&lt;/span&gt;

    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #B00040&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #0000FF&quot;&gt;setId&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #B00040&quot;&gt;long&lt;/span&gt; id&lt;span style=&quot;color: #666666&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #7D9029&quot;&gt;id&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt; id&lt;span style=&quot;color: #666666&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #666666&quot;&gt;}&lt;/span&gt;

    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;public&lt;/span&gt; String &lt;span style=&quot;color: #0000FF&quot;&gt;getName&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;return&lt;/span&gt; name&lt;span style=&quot;color: #666666&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #666666&quot;&gt;}&lt;/span&gt;

    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #B00040&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #0000FF&quot;&gt;setName&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;String name&lt;span style=&quot;color: #666666&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #7D9029&quot;&gt;name&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt; name&lt;span style=&quot;color: #666666&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #666666&quot;&gt;}&lt;/span&gt;

    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;public&lt;/span&gt; List&lt;span style=&quot;color: #666666&quot;&gt;&amp;lt;&lt;/span&gt;Schedule&lt;span style=&quot;color: #666666&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000FF&quot;&gt;getScheduleList&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;return&lt;/span&gt; scheduleList&lt;span style=&quot;color: #666666&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #666666&quot;&gt;}&lt;/span&gt;

    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #B00040&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #0000FF&quot;&gt;setScheduleList&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;List&lt;span style=&quot;color: #666666&quot;&gt;&amp;lt;&lt;/span&gt;Schedule&lt;span style=&quot;color: #666666&quot;&gt;&amp;gt;&lt;/span&gt; scheduleList&lt;span style=&quot;color: #666666&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #7D9029&quot;&gt;scheduleList&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt; scheduleList&lt;span style=&quot;color: #666666&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #666666&quot;&gt;}&lt;/span&gt;

&lt;span style=&quot;color: #666666&quot;&gt;}&lt;/span&gt;
&lt;/p&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Schedule.java&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;&lt;span style=&quot;color: #AA22FF&quot;&gt;@Entity&lt;/span&gt;
&lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #0000FF; font-weight: bold&quot;&gt;Schedule&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;{&lt;/span&gt;
    &lt;span style=&quot;color: #AA22FF&quot;&gt;@Id&lt;/span&gt;
    &lt;span style=&quot;color: #AA22FF&quot;&gt;@GeneratedValue&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;strategy &lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt; GenerationType&lt;span style=&quot;color: #666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #7D9029&quot;&gt;AUTO&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;)&lt;/span&gt;
    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;private&lt;/span&gt; Long id&lt;span style=&quot;color: #666666&quot;&gt;;&lt;/span&gt;

    &lt;span style=&quot;color: #AA22FF&quot;&gt;@ManyToOne&lt;/span&gt;
    &lt;span style=&quot;color: #AA22FF&quot;&gt;@JsonBackReference&lt;/span&gt;
    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;private&lt;/span&gt; Sosi sosi&lt;span style=&quot;color: #666666&quot;&gt;;&lt;/span&gt;

    &lt;span style=&quot;color: #AA22FF&quot;&gt;@Column&lt;/span&gt;
    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;private&lt;/span&gt; String program&lt;span style=&quot;color: #666666&quot;&gt;;&lt;/span&gt;

    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000FF&quot;&gt;Schedule&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;{&lt;/span&gt;
    &lt;span style=&quot;color: #666666&quot;&gt;}&lt;/span&gt;

    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000FF&quot;&gt;Schedule&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;Sosi sosi&lt;span style=&quot;color: #666666&quot;&gt;,&lt;/span&gt; String program&lt;span style=&quot;color: #666666&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #7D9029&quot;&gt;sosi&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt; sosi&lt;span style=&quot;color: #666666&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #7D9029&quot;&gt;program&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt; program&lt;span style=&quot;color: #666666&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #666666&quot;&gt;}&lt;/span&gt;

    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;public&lt;/span&gt; Long &lt;span style=&quot;color: #0000FF&quot;&gt;getId&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;return&lt;/span&gt; id&lt;span style=&quot;color: #666666&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #666666&quot;&gt;}&lt;/span&gt;

    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #B00040&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #0000FF&quot;&gt;setId&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;Long id&lt;span style=&quot;color: #666666&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #7D9029&quot;&gt;id&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt; id&lt;span style=&quot;color: #666666&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #666666&quot;&gt;}&lt;/span&gt;

    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;public&lt;/span&gt; Sosi &lt;span style=&quot;color: #0000FF&quot;&gt;getSosi&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;return&lt;/span&gt; sosi&lt;span style=&quot;color: #666666&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #666666&quot;&gt;}&lt;/span&gt;

    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #B00040&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #0000FF&quot;&gt;setSosi&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;Sosi sosi&lt;span style=&quot;color: #666666&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #7D9029&quot;&gt;sosi&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt; sosi&lt;span style=&quot;color: #666666&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #666666&quot;&gt;}&lt;/span&gt;

    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;public&lt;/span&gt; String &lt;span style=&quot;color: #0000FF&quot;&gt;getProgram&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;return&lt;/span&gt; program&lt;span style=&quot;color: #666666&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #666666&quot;&gt;}&lt;/span&gt;

    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #B00040&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #0000FF&quot;&gt;setProgram&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;String program&lt;span style=&quot;color: #666666&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #7D9029&quot;&gt;program&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt; program&lt;span style=&quot;color: #666666&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #666666&quot;&gt;}&lt;/span&gt;

&lt;span style=&quot;color: #666666&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;두 개의 모델이 1:N관계 입니다. Sosi가 스케줄을 여러개 가질 수 있는 구조입니다. 여기서 Schedule에는 ManyToOne을 걸었는데, @JsonBackReference도 같이 넣었습니다. 이걸 안 넣으면 서로 계속 참조해서 JSON출력할 때 무한루프에 빠지더라구요-_- 이제 Sosi참조는 json에서 안쓰는 그런 옵션 같습니다.&lt;/p&gt;&lt;p&gt;그리고 예전에는 Dao만들어서 뭔가 하이버네이트세션 가져와서 그걸 통해서 했던 것 같은데, Spring Data JPA에서는&amp;nbsp;JpaRepository라는 것을 제공하는데, 이것을 통하면 해당 모델에 대해서 CRUD를 제공합니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;SosiRepository.java&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;&lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;interface&lt;/span&gt; &lt;span style=&quot;color: #0000FF; font-weight: bold&quot;&gt;SosiRepository&lt;/span&gt; &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;extends&lt;/span&gt; JpaRepository&lt;span style=&quot;color: #666666&quot;&gt;&amp;lt;&lt;/span&gt;Sosi&lt;span style=&quot;color: #666666&quot;&gt;,&lt;/span&gt; Long&lt;span style=&quot;color: #666666&quot;&gt;&amp;gt;{&lt;/span&gt;
&lt;span style=&quot;color: #666666&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;ScheduleRepository.java&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;&lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;interface&lt;/span&gt; &lt;span style=&quot;color: #0000FF; font-weight: bold&quot;&gt;ScheduleRepository&lt;/span&gt; &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;extends&lt;/span&gt; JpaRepository&lt;span style=&quot;color: #666666&quot;&gt;&amp;lt;&lt;/span&gt;Schedule&lt;span style=&quot;color: #666666&quot;&gt;,&lt;/span&gt; Long&lt;span style=&quot;color: #666666&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;{&lt;/span&gt;
&lt;span style=&quot;color: #666666&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;4. 컨트롤러 생성&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;간단하게 소녀시대 정보를 가져오는 컨트롤러와 스케줄 추가 및 가져오는 컨트롤러를 생성합니다.&lt;/p&gt;&lt;p&gt;&lt;b&gt;SosiController.java&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;&lt;span style=&quot;color: #AA22FF&quot;&gt;@RestController&lt;/span&gt;
&lt;span style=&quot;color: #AA22FF&quot;&gt;@RequestMapping&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #BA2121&quot;&gt;&quot;/sosi&quot;&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #0000FF; font-weight: bold&quot;&gt;SosiController&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;{&lt;/span&gt;

    &lt;span style=&quot;color: #AA22FF&quot;&gt;@Autowired&lt;/span&gt;
    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;private&lt;/span&gt; SosiRepository sosiRepository&lt;span style=&quot;color: #666666&quot;&gt;;&lt;/span&gt;

    &lt;span style=&quot;color: #AA22FF&quot;&gt;@RequestMapping&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #BA2121&quot;&gt;&quot;{sosiId}&quot;&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;)&lt;/span&gt;
    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;public&lt;/span&gt; Sosi &lt;span style=&quot;color: #0000FF&quot;&gt;getSosi&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AA22FF&quot;&gt;@PathVariable&lt;/span&gt; Long sosiId&lt;span style=&quot;color: #666666&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;{&lt;/span&gt;
        Sosi sosi &lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt; sosiRepository&lt;span style=&quot;color: #666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #7D9029&quot;&gt;findOne&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;sosiId&lt;span style=&quot;color: #666666&quot;&gt;);&lt;/span&gt;
        &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;return&lt;/span&gt; sosi&lt;span style=&quot;color: #666666&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #666666&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #666666&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;ScheduleController.java&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;&lt;span style=&quot;color: #AA22FF&quot;&gt;@RestController&lt;/span&gt;
&lt;span style=&quot;color: #AA22FF&quot;&gt;@RequestMapping&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #BA2121&quot;&gt;&quot;/schedule&quot;&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #0000FF; font-weight: bold&quot;&gt;ScheduleController&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;{&lt;/span&gt;

    &lt;span style=&quot;color: #AA22FF&quot;&gt;@Autowired&lt;/span&gt;
    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;private&lt;/span&gt; ScheduleRepository scheduleRepository&lt;span style=&quot;color: #666666&quot;&gt;;&lt;/span&gt;

    &lt;span style=&quot;color: #AA22FF&quot;&gt;@Autowired&lt;/span&gt;
    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;private&lt;/span&gt; SosiRepository sosiRepository&lt;span style=&quot;color: #666666&quot;&gt;;&lt;/span&gt;

    &lt;span style=&quot;color: #AA22FF&quot;&gt;@RequestMapping&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #BA2121&quot;&gt;&quot;{scheduleId}&quot;&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;)&lt;/span&gt;
    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;public&lt;/span&gt; Schedule &lt;span style=&quot;color: #0000FF&quot;&gt;getSchedule&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AA22FF&quot;&gt;@PathVariable&lt;/span&gt; Long scheduleId&lt;span style=&quot;color: #666666&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;{&lt;/span&gt;
        Schedule schedule &lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt; scheduleRepository&lt;span style=&quot;color: #666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #7D9029&quot;&gt;findOne&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;scheduleId&lt;span style=&quot;color: #666666&quot;&gt;);&lt;/span&gt;
        Sosi sosi &lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt; schedule&lt;span style=&quot;color: #666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #7D9029&quot;&gt;getSosi&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;();&lt;/span&gt;
        &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;return&lt;/span&gt; schedule&lt;span style=&quot;color: #666666&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #666666&quot;&gt;}&lt;/span&gt;

    &lt;span style=&quot;color: #AA22FF&quot;&gt;@RequestMapping&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #BA2121&quot;&gt;&quot;add/{sosiId}&quot;&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;)&lt;/span&gt;
    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;public&lt;/span&gt; Schedule &lt;span style=&quot;color: #0000FF&quot;&gt;addSchedule&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AA22FF&quot;&gt;@PathVariable&lt;/span&gt; Long sosiId&lt;span style=&quot;color: #666666&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #AA22FF&quot;&gt;@RequestParam&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;value&lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #BA2121&quot;&gt;&quot;program&quot;&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;)&lt;/span&gt; String program&lt;span style=&quot;color: #666666&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;{&lt;/span&gt;
        Sosi sosi &lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt; sosiRepository&lt;span style=&quot;color: #666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #7D9029&quot;&gt;findOne&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;sosiId&lt;span style=&quot;color: #666666&quot;&gt;);&lt;/span&gt;
        Schedule schedule &lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt; scheduleRepository&lt;span style=&quot;color: #666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #7D9029&quot;&gt;save&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;new&lt;/span&gt; Schedule&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;sosi&lt;span style=&quot;color: #666666&quot;&gt;,&lt;/span&gt; program&lt;span style=&quot;color: #666666&quot;&gt;));&lt;/span&gt;

        &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;return&lt;/span&gt; schedule&lt;span style=&quot;color: #666666&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #666666&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #666666&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;소스 내용을 보면 Repository클래스를 통해 Autowired하면 기본 인터페이스를 해당 모델기반 구현체를 만듭니다. 그 구현체에서 save, findOne 등 함수를 통해 데이터 삽입 및 가져올 수 있습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;5. 기본 값 삽입&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;기본적으로 소녀시대 멤버를 삽입하고 시작할 수 있습니다. 기존 application.properties에 하이버네이트 설정을 재시작하면 꺼지게 해놨기 때문에 기본적으로 앱을 시작할 때 값을 삽입하고 하면 편하게 테스트할 수 있습니다.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Application.java&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;!-- HTML generated using hilite.me --&gt;&lt;/p&gt;&lt;div style=&quot;background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&quot;&gt;&lt;pre style=&quot;margin: 0; line-height: 125%&quot;&gt;&lt;span style=&quot;color: #AA22FF&quot;&gt;@SpringBootApplication&lt;/span&gt;
&lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #0000FF; font-weight: bold&quot;&gt;Application&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;{&lt;/span&gt;
    &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #B00040&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #0000FF&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;String&lt;span style=&quot;color: #666666&quot;&gt;[]&lt;/span&gt; args&lt;span style=&quot;color: #666666&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #666666&quot;&gt;{&lt;/span&gt;
        ConfigurableApplicationContext context &lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt; SpringApplication&lt;span style=&quot;color: #666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #7D9029&quot;&gt;run&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;Application&lt;span style=&quot;color: #666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #7D9029&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;,&lt;/span&gt; args&lt;span style=&quot;color: #666666&quot;&gt;);&lt;/span&gt;
        SosiRepository sosiRepository &lt;span style=&quot;color: #666666&quot;&gt;=&lt;/span&gt; context&lt;span style=&quot;color: #666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #7D9029&quot;&gt;getBean&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;SosiRepository&lt;span style=&quot;color: #666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #7D9029&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;);&lt;/span&gt;

        sosiRepository&lt;span style=&quot;color: #666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #7D9029&quot;&gt;save&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;new&lt;/span&gt; Sosi&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #BA2121&quot;&gt;&quot;태연&quot;&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;));&lt;/span&gt;
        sosiRepository&lt;span style=&quot;color: #666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #7D9029&quot;&gt;save&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;new&lt;/span&gt; Sosi&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #BA2121&quot;&gt;&quot;윤아&quot;&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;));&lt;/span&gt;
        sosiRepository&lt;span style=&quot;color: #666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #7D9029&quot;&gt;save&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;new&lt;/span&gt; Sosi&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #BA2121&quot;&gt;&quot;수영&quot;&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;));&lt;/span&gt;
        sosiRepository&lt;span style=&quot;color: #666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #7D9029&quot;&gt;save&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;new&lt;/span&gt; Sosi&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #BA2121&quot;&gt;&quot;효연&quot;&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;));&lt;/span&gt;
        sosiRepository&lt;span style=&quot;color: #666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #7D9029&quot;&gt;save&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;new&lt;/span&gt; Sosi&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #BA2121&quot;&gt;&quot;유리&quot;&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;));&lt;/span&gt;
        sosiRepository&lt;span style=&quot;color: #666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #7D9029&quot;&gt;save&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;new&lt;/span&gt; Sosi&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #BA2121&quot;&gt;&quot;티파니&quot;&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;));&lt;/span&gt;
        sosiRepository&lt;span style=&quot;color: #666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #7D9029&quot;&gt;save&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;new&lt;/span&gt; Sosi&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #BA2121&quot;&gt;&quot;써니&quot;&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;));&lt;/span&gt;
        sosiRepository&lt;span style=&quot;color: #666666&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #7D9029&quot;&gt;save&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #008000; font-weight: bold&quot;&gt;new&lt;/span&gt; Sosi&lt;span style=&quot;color: #666666&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #BA2121&quot;&gt;&quot;서현&quot;&lt;/span&gt;&lt;span style=&quot;color: #666666&quot;&gt;));&lt;/span&gt;
    &lt;span style=&quot;color: #666666&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #666666&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;6. 실행&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;소녀시대 정보 가져오기&lt;br /&gt;http://localhost:8080/sosi/1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/211B254A54B2519F08&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F211B254A54B2519F08&quot; width=&quot;600&quot; height=&quot;497&quot; filename=&quot;스크린샷 2015-01-11 오후 7.33.18.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;스케줄 추가하기&lt;br /&gt;http://localhost:8080/schedule/add/1?program=무한도전&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2117153454B2521F3A&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2117153454B2521F3A&quot; width=&quot;600&quot; height=&quot;410&quot; filename=&quot;스크린샷 2015-01-11 오후 7.35.57.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;다시 소녀시대정보 가져오기&lt;br /&gt;http://localhost:8080/sosi/1&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/25611D3C54B2528A16&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F25611D3C54B2528A16&quot; width=&quot;600&quot; height=&quot;411&quot; filename=&quot;스크린샷 2015-01-11 오후 7.37.35.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;예제 소스는 깃헙에...&lt;br /&gt;&lt;a href=&quot;https://github.com/mudchobo/sosi-schedule-sb&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://github.com/mudchobo/sosi-schedule-sb&lt;/a&gt;&lt;/p&gt;&lt;p&gt;끗&lt;/p&gt;</description>
      <category>자바(Java)</category>
      <category>java spring boot 자바 스프링 부트 rest api jpa</category>
      <author>머드초보</author>
      <guid isPermaLink="true">https://mudchobo.tistory.com/549</guid>
      <comments>https://mudchobo.tistory.com/549#entry549comment</comments>
      <pubDate>Sun, 11 Jan 2015 19:43:25 +0900</pubDate>
    </item>
    <item>
      <title>[게임] SuperStar SMTOWN - 리듬게임에 카드시스템 조합!</title>
      <link>https://mudchobo.tistory.com/547</link>
      <description>&lt;p&gt;리듬 게임을 참 좋아했는데요. 중학교&amp;nbsp;때 비트매니아 보고 반해서 그때부터 좋아하기 시작해서 아직까지 즐기고 있네요. 그 당시 비트매니아는 300원이였는데, 부평에 가야지만 있어서 버스타고 가서 했던 기억이 나네요. 너무 비싸서 집에 컴퓨터용 비트매니아 프로그램으로 연습해서 오락실에서 하고 그랬던 기억이 나네요.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;tt-youtube-plugin&quot; style=&quot;text-align: left;&quot;&gt;이제 스마트폰이 보급화 되면서 스마트폰에서도 리듬게임이 한창 인기가 있었는데, 그 1세대가 탭소닉이였던 것 같습니다. 탭소닉은 스마트폰에 맞게 터치앤드래그 형식으로 리듬게임을 즐기는 방식입니다. 이것도 한창 인기가 있었는데, 어느새 시들해졌네요. 그러고 나서 많은 리듬게임이 나왔는데, 탭소닉 링스타 for Kakao, DJMAX 태크니카 for Kakao 등 다양한 리듬게임이 나왔어요.&lt;/div&gt;&lt;div class=&quot;tt-youtube-plugin&quot; style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;tt-youtube-plugin&quot; style=&quot;text-align: left;&quot;&gt;탭소닉 링스타는 예전 NDS시절 리듬히어로 방식처럼 큰 원이 점점 작아지면서 터치할 원에 일치할 때 터치하는 방식의 리듬게임입니다. 그리고 DJMAX는 노트들이 나타나고 그 노트들을 선이 지나갈 때 터치하는 리듬게임이죠. 이렇게 다양한 리듬게임이 나왔는데, 대부분 성공하지 못했어요.&lt;/div&gt;&lt;div class=&quot;tt-youtube-plugin&quot; style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;tt-youtube-plugin&quot; style=&quot;text-align: left;&quot;&gt;그래서 최근에 나온 것이 SuperStar SMTOWN인데, 이게 어느정도 중박을 친 게 아이돌과 리듬 게임의 조합입니다. 그래서 아이돌 팬들이 이 게임에서 자신이 원하는 아이돌의 카드를 모으기 위해서 게임을 할 수 있습니다. 이런 방식이 어느 정도 먹힌 것이죠.&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;tt-youtube-plugin&quot; style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;tt-youtube-plugin&quot; style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;tt-youtube-plugin&quot; style=&quot;text-align: left;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;1. 전체적으로 깔끔한 외쿡 스타일 디자인&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;tt-youtube-plugin&quot; style=&quot;text-align: left;&quot;&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/25133E3954ABD89927&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F25133E3954ABD89927&quot; width=&quot;600&quot; height=&quot;338&quot; alt=&quot;로고화면&quot; filename=&quot;IMG_0021.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;위의 로고 화면처럼 전체적으로 외쿡스타일의 게임형태로 되어 있습니다. 실제로도 이 게임은 외국 사람들도 꽤 많이 하고 있죠. 물론 디자인 때문이 아니라 외국에 팬을 많이 보유하고 있는 SM가수의 영향이 가장 크죠.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2745B53954ABD89B05&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2745B53954ABD89B05&quot; width=&quot;600&quot; height=&quot;338&quot; filename=&quot;IMG_0022.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;랭킹 화면입니다. 화면의 아이콘도 매우 심플하게 설명없이 배치되어 있네요.&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;b&gt;(1) 상단 메뉴&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;b&gt;헤드폰&lt;/b&gt; - &lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;게임을 플레이할 수 있는 수 인데(애니팡의 하트같은...), 지금 52개 있는데, 나중에 다 쓰면 5분마다 한 개씩 차며 맥스 5개입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;b&gt;R(리듬포인트)&lt;/b&gt; -&amp;nbsp;곡을 클리어 하면 주는 포인트인데, 이걸 모아서 일반 카드를 뽑거나 카드를 강화에 사용합니다.&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;b&gt;다이아몬드&lt;/b&gt; - 현질하거나 주간 랭킹에 순위권에 들면 얻을 수 있는 돈 같은 존재입니다. 프리미엄 카드(B~S등급)를 뽑을 수 있고, 헤드폰을 구매하거나 R을 살 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;b&gt;(2) 하단 메뉴&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;b&gt;카드&lt;/b&gt; - 내가 보유하고 있는 카드 덱을 보여줍니다. 여기에 SM가수별로 나열되어 보여집니다. BoA(보아), TVXQ!(동방신기), Super Junior(슈퍼주니어), KyuHyun(규현), Super Junior-M(슈퍼주니어엠), Henry(헨리), ZhouMi(조미), Girls'Generation(소녀시대), Girls'Generation-TTS(태티서), SHINee(샤이니), TAEMIN(태민), f(x)(함수), EXO-K(엑소케이), EXO-M(엑소엠), RedVelvet(레드밸벳), SMTOWN으로 나눠져 있습니다. 카드를 장착하면 그 곡을 클리어 시 더 높은 점수를 얻을 수 있습니다. 카드 시스템은 아래에 다시 한 번 더...&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;b&gt;상점&lt;/b&gt; - 다이아몬드, R(리듬포인트), 헤드폰, 카드팩, 인벤토리확장 등을 구매할 수 있는 페이지입니다.&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;b&gt;우편함&lt;/b&gt; - 운영자가 보상을 주거나, 주간랭킹 보상 등은 다 이곳을 통해서 받습니다.&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;b&gt;도움말&lt;/b&gt; - 게임에 필요한 도움말입니다.&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;2. 곡 목록 화면&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2248D63E54ABDC9019&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2248D63E54ABDC9019&quot; width=&quot;600&quot; height=&quot;338&quot; filename=&quot;IMG_0023.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;처음에 곡이 다 잠겨있는데, 계속 클리어해야 다음 곡이 열립니다. 한 100여곡 되는 것 같았어요. 최초 미션 클리어 시에는 C급 카드도 한장씩 줍니다. 클리어 시에 주는 줄 알았는데, 그게 아니더라구요. 전부 다 깨면 그때부터는 리듬포인트 모아서 카드팩을 구매하셔야 합니다.&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;그리고 가끔 &lt;b&gt;챌린지&lt;/b&gt;가 뜨는데, 이게 언제 뜨는지 모르겠는데, 지 꿀리는 대로 뜨는 것 같더라구요-_- 자신의 점수 그 이상을 받으면 C급카드랑 리듬포인트10배수치(약 5000~6000정도 주는 것 같음)을 줍니다. 챌린지가 뜨면 약 3번의 기회가 주어지는데, 3번안에 못깨면 챌린지모드는 사라집니다. 다시 개 노가다...&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;3. 게임 화면&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;아이폰6가 깔끔하게 동영상 캡쳐가 되어서 게임 화면은 잘 찍어놨습니다. 으핫. 유튜브에서 노래는 저작권에 위반되어서 삭제했습니다ㅠ&lt;br /&gt;게임은 탭소닉과 동일한 형태입니다. 롱노트와 터치노트 두가지 방식으로 구성되어있는데, 약간 다른 점이라면 터치포인트가 정확하게 없다는 것입니다. 그냥 내려오는 것에 맞춰서 터치해야 합니다.&lt;br /&gt;그리고 생명 게이지가 떨어지면 사망합니다. 생명게이지에서 안 틀리고 더 잘하면 게이지가 하나 더 차는데, 그때부터 점수보너스가 더 주는 것 같더라구요.&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;/p&gt;&lt;div class=&quot;tt-youtube-plugin&quot; style=&quot;text-align: center&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/V9NZnx2rs5U?rel=0&quot; width=&quot;560&quot; height=&quot;420&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;4. 카드 시스템&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;카드시스템은 최근 유행하는 카드 시스템과 매우 많이 닮았습니다. 카드를 강화하거나 카드를 진화(여기에선 업그레이드)하는 시스템이 있습니다.&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;b&gt;(1)가수별 덱&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;가수별로 카드를 장착하는 슬롯이 정해져있습니다. 보아를 보면 카드에 VOCAL, DANCE, RHYTHM 슬롯이 있으며, 여기에 장착을 하게 됩니다.&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2624B24E54ABE25802&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2624B24E54ABE25802&quot; width=&quot;600&quot; height=&quot;338&quot; filename=&quot;IMG_0024.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;카드 슬롯을 선택하면 또 해당 카드를 장착할 수 있는 카드가 있습니다. 여기선 해당가수-슬롯위치만 장착할 수 있습니다. 마치 무기아이템이 무기슬롯에만 장착이 가능한 것 처럼요. 그래서 리듬슬롯을 누르면 리듬슬롯 카드만 아래에 나와서 선택하면 비교화면이 나와서 장착할 것인지 묻습니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;b&gt;(2)카드 파워업&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;카드가 처음에 파워업을 하지 않으면 1성부터 시작하는데, 여기서 같은 종류의 가수 카드를 통해서 파워업을 할 수 있습니다. 파워업을 할 때에는 실패를 하면 그냥 카드가 사라져버립니다. 몬스터 길들이기처럼 강화포인트 개념이 없어서 그냥 생카드만 날라갑니다-_-(이것때문에 좀 빡치는...).&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;C등급 카드로 C등급 카드를 강화하면 Power Up 성공률이 High인 반면에, C등급 카드로 S등급 카드를 강화하면 Power Up 성공률이 Low가 나옵니다. 등급에 가까울수록 강화확율이 높습니다.&lt;br /&gt;S등급 카드에 B를 넣으니 Normal이네요.&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/243BEA4D54ABE43308&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F243BEA4D54ABE43308&quot; width=&quot;600&quot; height=&quot;338&quot; filename=&quot;IMG_0025.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&amp;nbsp;성공을 하면 별이 하나씩 붙습니다. 4번성공하면 5개의 별이 붙어서 더 이상 파워업을 할 수 없게 됩니다. 그 뒤로는 Power Up버튼이 Upgrade버튼이 바뀝니다.&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;b&gt;(3) 카드 업그레이드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;카드 5성이 되면 그 다음부터 업그레이드를 할 수 있습니다. 업그레이드는 같은 등급의 5성카드 2개끼리 합치면 다음 등급으로 업그레이드를 할 수 있는 기능입니다. 그래서 상위등급으로 갈 수 있는 것이지요. 결국 생각해보면 노현질로 엄청난 곡클리어 노가다를 하게 되면 언젠가 전부 R로 덱을 도배할 수 있다는 것이지요. 그게 힘들다면...현질을 해야하는 뭐 다른 모바일게임과 전혀 다르지 않는 시스템입니다.&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;5. 총평&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;리듬게임 치고 꽤나 잘 만든 게임 같습니다. 다만 SM노래밖에 없다는 것이... 이게 장점이 될 수도 단점이 될 수도 있겠네요. 리듬게임에 아이돌카드를 접목한 것은 꽤나 잘 한 것 같습니다.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</description>
      <category>나의 삶/리뷰</category>
      <category>SUPERSTAR SMTOWN 리듬 게임 리뷰</category>
      <author>머드초보</author>
      <guid isPermaLink="true">https://mudchobo.tistory.com/547</guid>
      <comments>https://mudchobo.tistory.com/547#entry547comment</comments>
      <pubDate>Tue, 6 Jan 2015 22:40:27 +0900</pubDate>
    </item>
    <item>
      <title>[크롬확장프로그램] IMAP Mail Checker(읽지않은 메일 표시 및 새 메일 표시)</title>
      <link>https://mudchobo.tistory.com/548</link>
      <description>&lt;div&gt;회사메일이 뭔가 맥용 메일 클라이언트랑 호환이 잘 안되는지 메일 푸쉬가 잘 안되어서 크롬플러그인으로 만들었습니다. 지메일용 unread 체크 표시해주는 플러그인이 있어서 거기서 영감을 받아 만들었습니다.&amp;nbsp;이게 근데 Node.js용 서버가 있어야 합니다-_- 크롬 익스텐션에서 뭔가 소켓통신이 될 줄 알았는데, 잘 안되더라구요.&lt;/div&gt;&lt;p&gt;
&lt;/p&gt;&lt;div&gt;그래서 chorme-extension -&amp;gt; Node.js서버로 읽지 않은 메일이 있는지 확인 요청&amp;nbsp;-&amp;gt; Node.js가 imap서버에 연결하여 읽지 않은 메일을 가져오기 방식으로 구현했습니다. 그리고 Socket.io를 쓴 이유가 커넥션을 계속 맺고 있으려고 그렇게 했는데, 최초 imap서버에 로그인하는데 오래걸려서 이미 커넥션을 맺고 있으면 읽지않은 메일 가져오는 서치는 빠르게 되더라구요. 그래서 그렇게 했는데...&amp;nbsp;음… 만들다보니 이게 최선이였…..&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Node.js에서는 Socket.io를 이용해 크롬 익스텐션과 통신을 합니다.&lt;/div&gt;&lt;div&gt;imap서버를 지원하는 다음메일, 네이트메일, 네이버메일은 잘 되네요. 지메일도 잘 되는데, 신뢰하지 않은 애플리케이션 옵션을 꺼야지 되네요.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;1. Socket.io 프로토콜 구조&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;client -&amp;gt; server&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;login(id, pw, imap_server, imap_port, imap_tls)&lt;/div&gt;&lt;div&gt;로그인 요청. IMAP서버 연결정보를 전달해서 줌. 서버는 IMAP서버에 연결.&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;unseen()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;읽지 않은 메일 아이디 목록 요청.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;mail_info(mailId)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;메일아이디로 메일정보 요청.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;server -&amp;gt; client&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;connect()&lt;/div&gt;&lt;div&gt;클라이언트가 연결되면 전송.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;login_success()&lt;/div&gt;&lt;div&gt;로그인 요청올 때 IMAP서버에 연결 후 이상이 없으면 전송.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;unseen_result()&lt;/div&gt;&lt;div&gt;unseen요청이 올 때 unseen목록을 전송.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;mail_info_result()&lt;/div&gt;&lt;div&gt;mail_info요청이 올 때 메일의 제목 및 보낸 사람 정보 전송.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;server_error()&lt;/div&gt;&lt;div&gt;서버에서 IMAP서버에서 끊어지거나 예외 에러가 발생한 경우 전송.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;대충 이렇습니다. 서버 에러가 나면 disconnect날려서 끊어버리면 클라가 다시 또 재연결을 시도합니다. 이런 식으로 좀비적으로 계속 붙어서 서버가 살아낼 때까지 연결합니다-_-&lt;/div&gt;&lt;div&gt;이제 실행법은 아래와 같습니다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;2. 로컬 서버 실행&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;서버 소스주소입니다.&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://github.com/mudchobo/imap-mail-checker-server&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://github.com/mudchobo/imap-mail-checker-server&lt;/a&gt;&lt;/div&gt;&lt;div&gt;RSA키키 만들고 실행하면 서버가 실행됩니다.&lt;/div&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(219, 232, 251); padding: 10px; background-color: rgb(219, 232, 251);&quot;&gt;&lt;div&gt;openssl genrsa -out rsa_1024_priv 1024&lt;/div&gt;&lt;div&gt;openssl ras -pubout -in rsa_1024_priv -out rsa_1024_pub&lt;br /&gt;&lt;/div&gt;&lt;div&gt;node app.js&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;3. 크롬확장프로그램 설치&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;크롬 확장프로그램 소스주소입니다.&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://github.com/mudchobo/imap-mail-checker-cx&quot; style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;https://github.com/mudchobo/imap-mail-checker-cx&lt;/a&gt;&lt;/div&gt;&lt;div&gt;위에서 만든 RSA키의 rsa_1024_pub키를 클론받은 소스 경로에 복사합니다.&lt;/div&gt;&lt;div&gt;크롬 실행 -&amp;gt; 설정 -&amp;gt; 확장프로그램 -&amp;gt; 개발자모드 체크 -&amp;gt; 압축해제된 확장프로그램 로드 후 소스 받은 경로 선택 하면 자동으로 설치가 됩니다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;4. 옵션 설정&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;p&gt;오른쪽 상단에 표시된 크롬확장프로그램 아이콘에 오른쪽 버튼 클릭 후 옵션 선택하면 옵션이 나옵니다.&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/245C2A3B54ABCEA206&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F245C2A3B54ABCEA206&quot; width=&quot;600&quot; height=&quot;490&quot; filename=&quot;스크린샷 2015-01-06 오후 9.01.00.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;IMAP Server셋팅 대로 그대로 쓰시면 되고, 마지막 Enter WebMail Url은 크롬확장프로그램 클릭 시 이동하는 URL을 쓰면 됩니다.&lt;br /&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;저장 누르면 제대로 작동할 것입니다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;부록&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;Heroku서버에 올린 것과 연동된 플러그인을 크롬 웹스토어에 올렸습니다. 로컬서버 안 띄우고 제가 올린 서버와 연동되서 하는 것이긴 한데, 서버가 언제 죽을지는 모르니 참고하세요-_-&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://chrome.google.com/webstore/detail/imap-mail-checker/kbjiiglaopkgdnimdapohppnaeiocnbg?utm_source=chrome-ntp-icon&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://chrome.google.com/webstore/detail/imap-mail-checker/kbjiiglaopkgdnimdapohppnaeiocnbg?utm_source=chrome-ntp-icon&lt;/a&gt;&lt;/p&gt;</description>
      <category>자바스크립트(Javascript)</category>
      <category>nodejs node.js javascript chrome extension IMAP 메일 MAIL</category>
      <author>머드초보</author>
      <guid isPermaLink="true">https://mudchobo.tistory.com/548</guid>
      <comments>https://mudchobo.tistory.com/548#entry548comment</comments>
      <pubDate>Tue, 6 Jan 2015 21:08:46 +0900</pubDate>
    </item>
    <item>
      <title>[php][osx] brew로 apache2.4+php5.6+laravel 셋팅</title>
      <link>https://mudchobo.tistory.com/546</link>
      <description>&lt;p&gt;laravel설치법 나중에 찾아볼라고 기록 ㅇㅇ&lt;/p&gt;&lt;p&gt;brew&lt;/p&gt;&lt;p&gt;MAC에서는 brew라는 게 있는데, 없는 거 빼고 다 있는 만능 도구에요.&amp;nbsp;필요한 패키지는 검색해서 찾아서 설치하면 됩니다. apache, php, composer 등도 전부 brew로 설치할 수 있어요.&lt;/p&gt;&lt;p&gt;php framework Laravel&lt;/p&gt;&lt;p&gt;php프레임워크인데, ruby on rails스타일과 매우 흡사하고,&amp;nbsp;일반적인 MVC형태이며, DB마이그레이션도 제공하고, ORM같은 것도 제공하는&amp;nbsp;프레임워크에요.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;1. apache설치&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(219, 232, 251); padding: 10px; background-color: rgb(219, 232, 251);&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;brew install httpd24&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;설치하면 가끔 brew tap어쩌구 나오는데, 그거 그냥 치고 하면 되는듯염.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;2. php56설치 및 필요 extension 설치&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(219, 232, 251); padding: 10px; background-color: rgb(219, 232, 251);&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;brew install php56&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;brew install php56-mcrypt&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;3. apache + php 연동&lt;/b&gt;&lt;/p&gt;&lt;p&gt;brew로 설치했다면 아파치설정파일이 /usr/local/etc/apache2/밑에 존재합니다. php랑 연동하려면 module을 추가해야 합니다.&lt;br /&gt;추가로 rewrite.so도 추가해야합니다(이건 원래 있는건지 잘 모르겠지만 rewrite기능이 되야 합니다)&amp;nbsp;&lt;/p&gt;&lt;p&gt;httpd.conf&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(219, 232, 251); padding: 10px; background-color: rgb(219, 232, 251);&quot;&gt;







&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: 'Courier New';&quot;&gt;LoadModule&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt; rewrite_module libexec/mod_rewrite.so&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;s1&quot; style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt;LoadModule&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt; php5_module /usr/local/opt/php56/libexec/apache2/libphp5.so&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;&amp;lt;FilesMatch \.php$&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;&amp;nbsp; &amp;nbsp; SetHandler application/x-httpd-php&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt;&amp;lt;/FilesMatch&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;그러고 apachectl restart 하면 재시작.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;4. composer 설치&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(219, 232, 251); padding: 10px; background-color: rgb(219, 232, 251);&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;brew install composer&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;5. laravel 설치&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://laravel.com/docs/4.2/quick#installation&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://laravel.com/docs/4.2/quick#installation&lt;/a&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;설치방법은 위에 사이트대로&amp;nbsp;두 가지 방법이 나와 있어요. 한 가지는 composer를 통해 laravel-installer를 설치해서 laravel 실행파일로 프로젝트를 앞으로 계속 생성하는 것이고, 다른 한 가지는 composer로 그냥 프로젝트를 만드는 방법이 나와있어요.&lt;br /&gt;첫번째 laravel-installer 설치하는 게 뭔가 더 레일즈 스러워 첫번째 방법으로...&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(219, 232, 251); padding: 10px; background-color: rgb(219, 232, 251);&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;composer global require &quot;laravel/installer=~1.1&quot;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;이거 할 때 혹시 메모리가 딸리다고 나오면, php의 메모리설정을 늘려주면 됩니다.&lt;br /&gt;brew로 설치한 php가 기본이라면&amp;nbsp;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;/usr/local/etc/php/5.6/php.ini에 memory_limit=1G로 바꿔주고 하면 잘 됩니다. 설치할 때 뭔&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;가 메모리를 겁나 먹는듯염.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;b&gt;6. laravel 프로젝트 만들기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(219, 232, 251); padding: 10px; background-color: rgb(219, 232, 251);&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;laravel new blog&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;원하는 디렉토리에서 위와 같은 명령어를 치면 blog로 디렉토리를 만들어주면서 기본적으로 필요한 프로젝트를 만들어줍니다.&lt;/p&gt;







&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;7. 해당 프로젝트와 아파치 virtualhost 연동&lt;/b&gt;&lt;/p&gt;&lt;p&gt;아파치에는 해당 프로젝트에 public디렉토리를 DocumentRoot로 잡으면 됩니다. 아파치 vhost파일을 수정해요. 그리고 기본적으로 httpd.conf파일에&amp;nbsp;Include /usr/local/etc/apache2/2.4/extra/httpd-vhosts.conf부분에 주석처리 제거해야해요. 그러고 httpd-vhost.conf파일을 수정해봅시다.&lt;br /&gt;/usr/local/etc/apache2/2.4/extra/httpd-vhosts.conf&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(219, 232, 251); padding: 10px; background-color: rgb(219, 232, 251);&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;&amp;lt;VirtualHost *:8080&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;&amp;nbsp; &amp;nbsp; DocumentRoot &quot;/Volumes/d/laravel/blog/public&quot; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;Directory &quot;/Volumes/d/laravel/blog/public&quot;&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Options Indexes FollowSymLinks &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; AllowOverride &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; All Require all granted &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DirectoryIndex index.php &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/Directory&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;&amp;nbsp; &amp;nbsp; ServerName local.blog.com &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;&amp;nbsp; &amp;nbsp; ErrorLog &quot;/usr/local/var/log/apache2/blog.com-error_log&quot; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;&amp;nbsp; &amp;nbsp; CustomLog &quot;/usr/local/var/log/apache2/blog.com-access_log&quot; common &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;&amp;lt;/VirtualHost&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;ServerName을 local.blog.com으로 들어오는 것에 대해서는 위와 같이 처리하도록 했습니다.&lt;br /&gt;그럼 host를 잡고 테스트를 해봅시다.&amp;nbsp;&lt;br /&gt;/etc/hosts 파일에 아래와 같이 추가해야 해당 서버로 인식합니다.&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(219, 232, 251); padding: 10px; background-color: rgb(219, 232, 251);&quot;&gt;







&lt;p&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt;127.0.0.1 &lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt;local.blog.com&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;8. 실행!&lt;/p&gt;&lt;p&gt;기본아파치 포트가 8080으로 되어있더라구요.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/21043F4054A4E9790C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F21043F4054A4E9790C&quot; width=&quot;600&quot; height=&quot;381&quot; filename=&quot;스크린샷 2015-01-01 오후 3.29.39.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;우오오 잘됨 ㅇㅇ&lt;br /&gt;&lt;/p&gt;</description>
      <author>머드초보</author>
      <guid isPermaLink="true">https://mudchobo.tistory.com/546</guid>
      <comments>https://mudchobo.tistory.com/546#entry546comment</comments>
      <pubDate>Thu, 1 Jan 2015 15:31:02 +0900</pubDate>
    </item>
    <item>
      <title>[Javascript] html5, Android, iOS 게임 개발 가능한 Cocos2d-JS</title>
      <link>https://mudchobo.tistory.com/545</link>
      <description>&lt;p&gt;Javascript로 html5게임과 Android랑 iOS&amp;nbsp;게임을 만들 수 있는 멀티플랫폼 게임개발툴입니다. 제가 웹게임을 만드려고 알아보고 있었는데, 이게 가장 적합한 것 같네요. 게다가 같은 소스코드로 그대로 Android, iOS도 같이 빌드할 수 있습니다.&lt;/p&gt;&lt;p&gt;Cocos2d-x인 경우에는 c++을 이용해서 멀티플랫폼을 지원하는데,Cocos2d-x를 잠깐 해봤을 때 c++은 대학교 때 이후로 해보질 않아서 조금 어려운 점이 많았습니다. string을 다루는 법부터 시작해서 헤더파일도 다루고 그러는 것이 익숙치 않더라구요(아...쉬운 문법 언어만 해와서ㅠ).&amp;nbsp;&lt;/p&gt;&lt;p&gt;그래서 사이트에 가서 찾아보니 Javascript로도 개발을 할 수 있는 제품도 있더군요. 그래서 살짝 맛보기를 해보니 클래스명은 x와 서로 비슷하며 사용법 또한 비슷한데, 이것을 Javascript로만 표현을 했습니다. 문법면에서는 훨씬 쉽게 개발할 수 있을 겁니다(물론 저는 웹개발이 주여서 그게 더 쉽게 느껴지지만, c++만 한사람은 x가 더 쉽겠죠?).&lt;/p&gt;&lt;p&gt;간단히 다운로드 셋팅을 한 번 해봅시다. 참고로 저는 맥 이용자입니다. 윈도우에서도 되는지는 잘 모르겠네요.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;0. 준비물&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Apache ANT :&amp;nbsp;&lt;a href=&quot;http://ant.apache.org/bindownload.cgi&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://ant.apache.org/bindownload.cgi&lt;/a&gt;&lt;br /&gt;Python2.7.6 :&amp;nbsp;&lt;a href=&quot;https://www.python.org/downloads/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://www.python.org/downloads/&lt;/a&gt;&lt;br /&gt;AndroidSDK :&amp;nbsp;&lt;a href=&quot;https://developer.android.com/sdk/index.html?hl=sk&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://developer.android.com/sdk/index.html?hl=sk&lt;/a&gt;&lt;br /&gt;AndroidNDK :&amp;nbsp;&lt;a href=&quot;https://developer.android.com/tools/sdk/ndk/index.html&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://developer.android.com/tools/sdk/ndk/index.html&lt;/a&gt;&lt;br /&gt;XCode : AppStore에서 받으삼.&lt;br /&gt;WebStorm: 있으면 좋음. 없으면 그냥 에디터에서 편집해도 됨 ㅇㅇ&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;1. Cocos2d-JS&amp;nbsp;다운로드&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://cocos2d-x.org/download&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://cocos2d-x.org/download&lt;/a&gt;&lt;br /&gt;위 사이트에서 받을 수 있습니다. Cocos2d-JS를 받습니다. 아직까지는 베타버전입니다. 곧 정식버전이 나오길 ㄷㄷ.&amp;nbsp;&lt;span style=&quot;font-size: 9pt; line-height: 1.5; background-color: transparent;&quot;&gt;그리고 다운로드 사이트에서는&amp;nbsp;크게 3가지를 받을 수 있는데요. Cocos2d-x, Cocos2d-JS, CocoStudio입니다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5; background-color: transparent;&quot;&gt;Cocos2d-x와 Cocos2d-JS는 말그대로 C++개발, JS개발 툴이구요. CocoStudio는 게임 개발할 때 필요한 Scene,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5; background-color: transparent;&quot;&gt;UI, Animation 등을 손쉽게 개발할 수 있는 툴입니다. 유니티를 개발할 때에도 유니티개발툴에서 애니메이션, UI를 개발하는데 그것과 비슷한 것이라고 보면 됩니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5; background-color: transparent;&quot;&gt;그리고 개발하기 위해서는 웹에디터가 하나 필요한데요. 여기서 추천하는 것은 WebStorm입니다. 웹스톰이 확실히 자바스크립트 코딩할 때에는 갑이거든요. 자바스크립트 디버깅도 할 수 있고, 코드힌트 에러도 제일 잘 잡는 에디터에요.&amp;nbsp;웹개발에도 갑이고 꽤 좋은 에디터에요. 여기서 만든 에디터들은 다 좋아요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;2. 환경 설정&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;환경설정은&amp;nbsp;Python으로 구현이 되어 있습니다. Cocos2d-JS압축을 풀면 setup.py파일이 나옵니다. 이걸 실행하면 NDK, Android SDK설정이 어디에 있냐고 물어보면서 그대로 대답하게 되면 그 값을 기반으로 .bash_profile에 환경변수와 패스를 저장해줍니다. NDK, SDK, ANT를 적당한 곳에 풀고 해당 패스를 물어보는 것에 적으면 알아서 .bash_profile에 넣어버립니다.&lt;br /&gt;그러면 아래와 같이 자동으로 잡아줍니다.&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(238, 238, 238); padding: 10px; background-color: rgb(238, 238, 238);&quot;&gt;







&lt;p class=&quot;p1&quot;&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;# Add environment variable COCOS_CONSOLE_ROOT for cocos2d-x&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;
&lt;/span&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: 'Courier New';&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: 'Courier New';&quot;&gt; COCOS_CONSOLE_ROOT=&lt;/span&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;/Volumes/d/mudchobo/cocos2d-js-v3.&lt;/span&gt;&lt;span class=&quot;s3&quot; style=&quot;font-family: 'Courier New';&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;-beta/tools/cocos2d-console/bin&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;s1&quot; style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt; PATH=&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt;$COCOS_CONSOLE_ROOT&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt;$PATH&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;
&lt;/span&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;# Add environment variable NDK_ROOT for cocos2d-x&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;s1&quot; style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt; NDK_ROOT=&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;/Volumes/d/mudchobo/android-ndk&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;s1&quot; style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt; PATH=&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt;$NDK_ROOT&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt;$PATH&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;
&lt;/span&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;# Add environment variable ANDROID_SDK_ROOT for cocos2d-x&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt; ANDROID_SDK_ROOT=&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;/Volumes/d/mudchobo/android-sdk&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;s1&quot; style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt; PATH=&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt;$ANDROID_SDK_ROOT&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;$PATH&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;s1&quot; style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt; PATH=&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt;$ANDROID_SDK_ROOT&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt;/tools:&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt;$ANDROID_SDK_ROOT&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt;/platform-tools:&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt;$PATH&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;근데 보면 버그인지 모르겠지만 ANT_ROOT는 안잡아주더군요. 그래서 그냥 ANT_ROOT는 수동으로 추가했습니다.&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(238, 238, 238); padding: 10px; background-color: rgb(238, 238, 238);&quot;&gt;







&lt;p class=&quot;p1&quot;&gt;&lt;span style=&quot;font-family: 'Courier New';&quot;&gt;# ant root&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;s1&quot; style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt; ANT_ROOT=&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt;/Volumes/d/mudchobo/apache-ant&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;3. 프로젝트 생성&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;source ~/.bash_profile을 해서 profile파일을 다시 읽던가 아니면 터미널을 껐다켜면 해당 패스와 환경변수가 잡혀있을 겁니다. 그러면 초간단 프로젝트를 생성할 수 있습니다. COCOS_CONSOLE_ROOT가 패스에 잡혀서 cocos를 실행할 수 있습니다. 얘가 프로젝트를 만들어 줍니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;만들고 싶은 경로 위치로 가서 아래와 같이 실행하면 바로 만들어 집니다.&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(238, 238, 238); padding: 10px; background-color: rgb(238, 238, 238);&quot;&gt;







&lt;p&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt;cocos new MudchoboTest -l js&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;new는 프로젝트 생성하라는 것이고 다음은 프로젝트 명입니다. 다음 옵션은 -l은 언어를 선택하는 건데, js로 하라는 것입니다. 그러면 바로 생성이 됩니다.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;4. 실행&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;바로 실행하면 최초 헬로우월드 게임이 나옵니다. 실행도 cocos로 하면 됩니다.&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(238, 238, 238); padding: 10px; background-color: rgb(238, 238, 238);&quot;&gt;







&lt;p&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5; font-family: 'Courier New';&quot;&gt;cocos run -p web|ios|android|mac&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;원소스로 4가지 플랫폼을 전부다 실행해볼 수 있습니다. 올인원 겁나 좋아하는데 딱 저한테 맞는 플랫폼이네요. web으로 띄우면 서버도 자체적으로 만들어서 띄웁니다. web은 따로 컴파일이 필요없고, ios와 android는 따로 컴파일 후에 실행하게 됩니다. 시간이 조금 걸리긴 합니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2568EE4453A4C59F14&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2568EE4453A4C59F14&quot; width=&quot;600&quot; height=&quot;382&quot; filename=&quot;스크린샷 2014-06-21 오전 8.36.23.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;확인해보니 websocket(socket.io모듈도 지원)도 지원을 합니다. 나중에 시간될 때 웹소켓으로 멀티유저게임을 한 번 만들어봐야겠네요.&amp;nbsp;&lt;/p&gt;&lt;p&gt;참고문서&lt;br /&gt;&lt;a href=&quot;http://cocos2d-x.org/docs/manual/framework/html5/v2/cocos-console/en&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://cocos2d-x.org/docs/manual/framework/html5/v2/cocos-console/en&lt;/a&gt;&lt;/p&gt;</description>
      <category>자바스크립트(Javascript)</category>
      <category>Android</category>
      <category>Cocos2D</category>
      <category>cocos2d-js</category>
      <category>cocos2d-x</category>
      <category>cocos2dx</category>
      <category>game</category>
      <category>html5</category>
      <category>ios</category>
      <category>JavaScript</category>
      <category>게임</category>
      <author>머드초보</author>
      <guid isPermaLink="true">https://mudchobo.tistory.com/545</guid>
      <comments>https://mudchobo.tistory.com/545#entry545comment</comments>
      <pubDate>Sat, 21 Jun 2014 08:07:31 +0900</pubDate>
    </item>
    <item>
      <title>[유틸리티] Genymotion 2.0 구글앱 설치하기(플레이스토어 등)</title>
      <link>https://mudchobo.tistory.com/544</link>
      <description>&lt;p&gt;이거슨 안드로이드 에뮬레이터 입니다. 우리가 안드로이드 개발할 때 쓰는 거지같이 느린 안드로이드 에뮬레이터와는 차원이 틀린 것입니다. 일단 겁나 빠릅니다.&lt;/p&gt;&lt;p&gt;공식사이트는 여기입니다.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.genymotion.com/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://www.genymotion.com/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;얘네들이 2.0으로 버전업을 하면서 부분 유료화를 선언을 했어요. 하긴 이거 만든 사람도 먹고는 살아야하니까... 최근 앱들도 부분유료화가 대세... 얘네도 대세를 따랐겠죠...&amp;nbsp;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;암턴간 원래&amp;nbsp;제니모션1.3.x에는 google app들이 다 포함이 되어있었어요. 근데, 뭐 라이센스 문제로 일단 그냥 뺀 것 같아요. 하지만, 구글링 해보니 방법은 있는 것 같아요. 하라는대로 하니까 잘 됐어요. 저도 까먹지 않고 다시 설치를 하기 위해 기록해둡니다.&lt;/p&gt;&lt;p&gt;&lt;b&gt;1. GENYMOTION 다운로드&lt;/b&gt;&lt;/p&gt;&lt;p&gt;http://www.genymotion.com/ 여기가서 signup을 눌러서 가입을 합니다. 그리고 로그인을 합니다. 그러면 Get Genymotion을 클릭하면 다운로드를 받을 수 있어요. 이건 VirtualBox위에서 돌아가는거라 VirtualBox도 같이 설치해줘야해요. Windows용은 올인원이 존재하는데, Mac OSX는 따로 받아야해요. VirtualBox사이트가서 받아와야해요.&amp;nbsp;&lt;br /&gt;&lt;a href=&quot;https://www.virtualbox.org/wiki/Downloads&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://www.virtualbox.org/wiki/Downloads&lt;/a&gt;&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;background-color: transparent; font-size: 9pt; line-height: 1.5;&quot;&gt;여기서 OS X용을 받아서 설치하면 돼요. 그리고 제니모션도 받아서 설치하면 돼요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;2. GENYMOTION실행 후 가상머신 추가.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;처음에 아무것도 없으면 가상머신 추가할꺼냐고 물어봐요. 한다고해요. 그럼 Connect버튼이 나오는데, 로그인을 해야 원하는 디바이스를 선택할 수 있대요. 로그인을 해요. 아까 가입한 걸로 로그인해요.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: transparent; font-size: 9pt; line-height: 1.5;&quot;&gt;원하는 기종과 버전을 골라요. 저는 넥서스7이 갖고 싶으니까 이걸로 선택했어요. 이렇게 기종이 참 많아요.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2353CF3752A5AB3A08&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2353CF3752A5AB3A08&quot; width=&quot;600&quot; height=&quot;444&quot; filename=&quot;스크린샷 2013-12-09 오후 8.35.50.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: transparent; font-size: 9pt; line-height: 1.5;&quot;&gt;선택하고 Next를 하면 해당 롬을 다운로드 받아요. 겁나 빨리 잘 돼요.&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: transparent; font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;b&gt;3. 옵션셋팅&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;옵션에는 원하는 해상도로 롬을 띄울 수 있어요. 그리고 우리는 한글 사용자이기 때문에 use virtual keyboard for typing을 선택해요. 이걸 선택하지 않으면 키보드가 안나오는데, 기본 키보드는 한글이 지원이 안돼요. 그래서 그냥 가상 키보드를 이용해서 타이핑을 하고 한글 키보드를 설치하면 한글을 쓸 수 있어요.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2623D83B52A5AC300B&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2623D83B52A5AC300B&quot; width=&quot;600&quot; height=&quot;729&quot; filename=&quot;스크린샷 2013-12-09 오후 8.40.11.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;4. 잘 실행되는지 확인&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;play를 하면 실행이 돼요. adb설정할껀지 물어요. 개발자이신 분들은 뭔지 알꺼에요. Android SDK패스를 지정해주면 되고, 그냥 한 번 돌려보고 싶으신 분들은 그냥 패스해도 돼요. 그만 물어봐 체크해도 돼요. 대신 adb를 설정하면 나중에 adb를 이용해서 앱도 설치하고 파일도 복사하고 adb기능을 사용할 수 있어요.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/272D1B4C52A5AD9C0B&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F272D1B4C52A5AD9C0B&quot; width=&quot;600&quot; height=&quot;389&quot; filename=&quot;스크린샷 2013-12-09 오후 8.46.14.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;잘 돼요. 근데 마켓도 없고 아무것도 설치할 수 없어요.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;5. ARM Translation Installer v1.1 설치&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://goo.gl/JBQmPa&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://goo.gl/JBQmPa&lt;/a&gt; 이 링크를 클릭하면 받을 수 있어요.&lt;br /&gt;그리고 그 받은 zip파일을 그대로 Genymotion에 드래그앤드랍으로 떨구면 지가알아서 복사해요. 경고가 뜨는데 system인데 복사할꺼냐 묻는 것 같아요. 그냥 무시하고 복사고고싱.&lt;br /&gt;그리고 재부팅 고고싱!&lt;/p&gt;&lt;p&gt;&lt;b&gt;6. Google Apps 다운로드 및 설치.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://wiki.rootzwiki.com/Google_Apps#Universal_Packages_2&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://wiki.rootzwiki.com/Google_Apps#Universal_Packages_2&lt;/a&gt;&lt;/p&gt;&lt;p&gt;위에 링크에서 받을 수 있는데, 여기서 좀 주의해야할 것이 버전에 주의해야 해요.&lt;br /&gt;만약 처음에 에뮬레이터 만들 때 4.2.2를 선택했다면 20130813버전을 깔면 안돼요. 맛이 가요. 굵은 글씨로 Not compatible with 4.2.x!라고 당당히 써있어요.&lt;br /&gt;4.2.2이면 20130812버전을 받아서 설치하면 돼요.&lt;/p&gt;&lt;p&gt;4.3버전을 설치했으면 20130813 최신버전을 설치해도 돼요.&amp;nbsp;&lt;/p&gt;&lt;p&gt;참고로 다운로드 받는데 더럽게 느려요. 그래서 구글링할 때 보면 해당 파일이름으로 검색하면 구글드라이브에 올라온 파일이 있어요.&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;background-color: transparent; font-size: 9pt;&quot;&gt;&lt;font color=&quot;#000000&quot; face=&quot;Helvetica, AppleGothic, sans-serif&quot;&gt;&lt;span style=&quot;line-height: normal;&quot;&gt;gapps-jb-20130813-signed.zip 이런식으로 구글에 검색하면 나와요.&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; font-size: 9pt; line-height: 1.5;&quot;&gt;그걸 받아서 똑같이 Genymotion에 드래그앤드랍하고 껐다가 켜면 지가알아서 플레이스토어, 지메일 등이 설치가 되어 있을꺼에요.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;7. 언어 변경&lt;/b&gt;&lt;/p&gt;&lt;p&gt;어플서랍에서 Settings에서 Language &amp;amp; input에서 한국어로 바꿔주면 돼요.&lt;/p&gt;&lt;p&gt;짠 완성이에요.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/230F954352A5B13035&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F230F954352A5B13035&quot; width=&quot;600&quot; height=&quot;389&quot; filename=&quot;스크린샷 2013-12-09 오후 9.01.30.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;이제 알아서 커스텀마이징해서 쓰면 돼요.&lt;/p&gt;&lt;p&gt;4.3버전을 기기없이 테스트 및 개발할 수 있게 되었어요.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>유틸리티 활용하기</category>
      <author>머드초보</author>
      <guid isPermaLink="true">https://mudchobo.tistory.com/544</guid>
      <comments>https://mudchobo.tistory.com/544#entry544comment</comments>
      <pubDate>Mon, 9 Dec 2013 21:05:27 +0900</pubDate>
    </item>
    <item>
      <title>[php] Google App Engine php 게링스따디드.</title>
      <link>https://mudchobo.tistory.com/543</link>
      <description>&lt;p&gt;구글앱엔진에서 php를 preview 맛보기로 제공을 하네요.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://developers.google.com/appengine/docs/php/gettingstarted/introduction&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://developers.google.com/appengine/docs/php/gettingstarted/introduction&lt;/a&gt;&lt;/p&gt;&lt;p&gt;여기 문서를 따라한건데, 얘는 콘솔로했는데, 보니까 Launcher로 하면 더 편하니까 런쳐로 설명할게요.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;1. 프로젝트 생성.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://cloud.google.com/console#/project&quot;&gt;https://cloud.google.com/console#/project&lt;/a&gt;&lt;br /&gt;여기가서 CreateProject를 해야해요. Project Name은 원하는 것으로 쓰고, Project ID를 유니크한 것으로 써야해요. 저는 mudchobo-php라고 썼어요. 생성하면 뭔가가 생겨요.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;2. 필요한 프로그램 설치 - Python 2.7.x, Google App Engine SDK&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;파이선 다운로드 :&amp;nbsp;http://www.python.org/download/&lt;br /&gt;Google App Engine SDK :&amp;nbsp;&lt;a href=&quot;https://developers.google.com/appengine/downloads&quot; style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;https://developers.google.com/appengine/downloads&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;3. Google App Engine Launcher&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;위에 대로 설치하면 Google App Engine Launcher가 설치돼요.&amp;nbsp;실행해요.&lt;br /&gt;메뉴에 File -&amp;gt; Create New Application하고, Application Name에 구글클라우드콘솔에서 생성한 Application ID를 넣고, Parent Directory에는 원하는 경로를 지정해요. 이 안에 새로운 폴더로 프로젝트가 생성돼요. runtime은 php로 하고, port는 원하는 포트로 지정하고 Create하면 해당 폴더에 프로젝트가 생겨요. 간단히 필요한 app.yaml과 main.php, favicon.ico만 생겨요. 다 끝났어요. 실행하면 끝나요.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 558px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/237EBC445260EC2F26&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F237EBC445260EC2F26&quot; width=&quot;558&quot; height=&quot;327&quot; filename=&quot;appengine1.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;4. 실행&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;아이콘 중에 Run이라고 있는데, 이걸 클릭하면 서버가 실행이 돼요. 그러고 그냥 localhost:8080으로 접속하면 Hello World!가 떠요. 그럼 끝난거에요. 이제 개발하면 돼요.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;5. 구글계정 Users&amp;nbsp;서비스.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;php도 python과 java처럼 구글계정 연동을 매우 손쉽게 제공해요.&lt;br /&gt;main.php&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 3px double rgb(121, 165, 228); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;&amp;lt;?php&lt;br /&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;require_once 'google/appengine/api/users/UserService.php' ;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;use google \ appengine \api \ users \User ;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;use google \ appengine \api \ users \UserService ;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;$user = UserService ::getCurrentUser() ;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if ($user ) {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;echo 'Hello, ' . htmlspecialchars ( $user -&amp;gt; getNickname());&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;header ( 'Location: ' . UserService ::createLoginURL ($_SERVER [ 'REQUEST_URI' ])) ;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;소스를 보면 알겠지만, 그냥 UserService라는 클래스를 가져와서 유저값이 있으면 유저 닉네임을 보여주고 없으면 로그인으로 이동시켜요.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 333px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2309E43F5260ECE128&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2309E43F5260ECE128&quot; width=&quot;333&quot; height=&quot;184&quot; filename=&quot;appengine2.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;이게 로컬에서는 이렇게 나오는데, 실제로 Deploy(배포)를 하면 구글로그인으로 로그인이 돼요.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;6. 폼&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;main.php에 아래와 같이 또 추가해요.&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 3px double rgb(121, 165, 228); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;body&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;?php&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (array_key_exists('content', $_POST)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; echo &quot;You wrote:&amp;lt;pre&amp;gt;\n&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; echo htmlspecialchars($_POST['content']);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; echo &quot;\n&amp;lt;/pre&amp;gt;&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ?&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;form action=&quot;/sign&quot; method=&quot;post&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;&amp;lt;textarea name=&quot;content&quot; rows=&quot;3&quot; cols=&quot;60&quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;&amp;lt;input type=&quot;submit&quot; value=&quot;Sign Guestbook&quot; /&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/form&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;소스를 보면 알겠지만, 그냥 폼값 읽어서 보여주는거에요.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;7. static파일&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;php 굳이 거쳐도 되지 않는, css나 js파일 같은 것들을 그냥 뿌려주려고 하려고 해요.&lt;br /&gt;app.yaml을 수정해야해요.&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(121, 165, 228); background-color: rgb(219, 232, 251); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;- url: /stylesheets&lt;br /&gt;&amp;nbsp; static_dir: stylesheets&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;/stylesheets라는 url은 stylesheets에 있는 것을 그대로 내려준다는 거에요.&lt;/p&gt;&lt;p&gt;main.css파일을 stylesheets폴더를 만들고 생성해보아요.&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(121, 165, 228); background-color: rgb(219, 232, 251); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;body {&lt;br /&gt;&amp;nbsp; font-family: Verdana, Helvetica, sans-serif;&lt;br /&gt;&amp;nbsp; background-color: #DDDDDD;&lt;br /&gt;}&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;백그라운드값을 바꿔보아요.&lt;br /&gt;main.php에 head부분에 css를 추가해보아요.&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(121, 165, 228); background-color: rgb(219, 232, 251); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;link type=&quot;text/css&quot; rel=&quot;stylesheet&quot; href=&quot;/stylesheets/main.css&quot; /&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;다 만든 결과에요.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 522px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/235669345260EF0123&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F235669345260EF0123&quot; width=&quot;522&quot; height=&quot;201&quot; filename=&quot;e4aa4983796bc74e431a1a4736c7d626.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;8. 배포&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Google App Engine Launcher에서 Deploy를 눌러요. Email과 Password를 입력해요. 구글계정이에요. 그럼 이상한 콘솔창 하나 뜨더니 그냥 올라가요. 매우 간편해요!&lt;br /&gt;&lt;/p&gt;</description>
      <category>피에이치피(PHP)</category>
      <author>머드초보</author>
      <guid isPermaLink="true">https://mudchobo.tistory.com/543</guid>
      <comments>https://mudchobo.tistory.com/543#entry543comment</comments>
      <pubDate>Fri, 18 Oct 2013 17:14:03 +0900</pubDate>
    </item>
    <item>
      <title>[node.js] File system(파일 시스템)</title>
      <link>https://mudchobo.tistory.com/542</link>
      <description>&lt;p&gt;&lt;a href=&quot;http://book.mixu.net/ch11.html&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://book.mixu.net/ch11.html&lt;/a&gt;&amp;nbsp;에 대한 번역입니다. 제가 직접 했으니 아마 그지 같을 것입니다. 오류는 피드백 부탁!&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;11. File system&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;이 챕터는 파일시스템 모듈에 대해서 설명한다.&lt;/p&gt;&lt;p&gt;파일시스템 함수들은 파일I/O와 디렉토리I/O함수에 관한 것이다. 모든 파일싀스템 함수들은 동기/비동기 함수를 제공한다. 이 둘의 차이점을 설명하면 동기는 값을 함수안에서 바로 리턴하며(함수이름에 Sync가 붙음), I/O작업이 수행하는 동안 다른 코드가 실행되는 것을 막는다.&lt;/p&gt;&lt;pre class=&quot;prettyprint&quot; style=&quot;padding: 0.5em 1em; margin: -1em 0px 1em; font-size: 14px; vertical-align: top; background-image: none; border-style: solid; border-color: rgb(232, 232, 232); border-width: 1px 1px 1px 6px; font-style: normal; font-variant: normal; font-weight: normal; font-family: 'droid sans mono', 'lucida console', monospace; line-height: 1.5; color: rgb(0, 0, 0); letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-position: initial initial; background-repeat: initial initial;&quot;&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; fs &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'fs'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; data &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; fs&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;readFileSync&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'./index.html'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'utf8'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;com&quot; style=&quot;color: rgb(136, 0, 0); font-size: 9pt;&quot;&gt;// wait for the result, then use it&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
console&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;);&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;비동기 함수는 리턴값을 콜백함수를 통해서 제공한다.&lt;/p&gt;&lt;pre class=&quot;prettyprint&quot; style=&quot;padding: 0.5em 1em; margin: -1em 0px 1em; font-size: 14px; vertical-align: top; background-image: none; border-style: solid; border-color: rgb(232, 232, 232); border-width: 1px 1px 1px 6px; font-style: normal; font-variant: normal; font-weight: normal; font-family: 'droid sans mono', 'lucida console', monospace; line-height: 1.5; color: rgb(0, 0, 0); letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-position: initial initial; background-repeat: initial initial;&quot;&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; fs &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'fs'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
fs&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;readFile&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'./index.html'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'utf8'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; data&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;com&quot; style=&quot;color: rgb(136, 0, 0); font-size: 9pt;&quot;&gt;// the data is passed to the callback in the second argument&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
  console&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;});&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;아래 목록은 FS API의 비동기 함수들 전부이다. 이 함수들은 동기함수를 가지고 있지만, 읽기 쉽게 하기 위해 목록에서 뺐다.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Read &amp;amp; write a file (fully buffered)&lt;/b&gt;&lt;br /&gt;fs.readFile(filename, [encoding], [callback])&lt;br /&gt;fs.writeFile(filename, data, encoding='utf8', [callback])&lt;br /&gt;&lt;b&gt;Read &amp;amp; write a file (in parts)&lt;/b&gt;&lt;br /&gt;fs.open(path, flags, [mode], [callback])&lt;br /&gt;fs.read(fd, buffer, offset, length, position, [callback])&lt;br /&gt;fs.write(fd, buffer, offset, length, position, [callback])&lt;br /&gt;fs.fsync(fd, callback)&lt;br /&gt;fs.truncate(fd, len, [callback])&lt;br /&gt;fs.close(fd, [callback])&lt;br /&gt;&lt;b&gt;Directories: read, create &amp;amp; delete&lt;/b&gt;&lt;br /&gt;fs.readdir(path, [callback])&lt;br /&gt;fs.mkdir(path, mode, [callback])&lt;br /&gt;fs.rmdir(path, [callback])&lt;br /&gt;&lt;b&gt;Files: info&lt;/b&gt;&lt;br /&gt;fs.stat(path, [callback])&lt;br /&gt;fs.lstat(path, [callback])&lt;br /&gt;fs.fstat(fd, [callback])&lt;br /&gt;fs.realpath(path, [callback])&lt;br /&gt;&lt;b&gt;Readable streams&lt;/b&gt;&lt;br /&gt;fs.ReadStream&lt;br /&gt;Event: 'open'&lt;br /&gt;fs.createReadStream(path, [options])&lt;br /&gt;&lt;b&gt;Writable streams&lt;/b&gt;&lt;br /&gt;fs.WriteStream&lt;br /&gt;Event: 'open'&lt;br /&gt;file.bytesWritten&lt;br /&gt;fs.createWriteStream(path, [options])&lt;br /&gt;&lt;b&gt;Files: rename, watch changes &amp;amp; change timestamps&lt;/b&gt;&lt;br /&gt;fs.rename(path1, path2, [callback])&lt;br /&gt;fs.watchFile(filename, [options], listener)&lt;br /&gt;fs.unwatchFile(filename)&lt;br /&gt;fs.watch(filename, [options], listener)&lt;br /&gt;fs.utimes(path, atime, mtime, callback)&lt;br /&gt;fs.futimes(path, atime, mtime, callback)&lt;br /&gt;&lt;b&gt;Files: Owner and permissions&lt;/b&gt;&lt;br /&gt;fs.chown(path, uid, gid, [callback])&lt;br /&gt;fs.fchown(path, uid, gid, [callback])&lt;br /&gt;fs.lchown(path, uid, gid, [callback])&lt;br /&gt;fs.chmod(path, mode, [callback])&lt;br /&gt;fs.fchmod(fd, mode, [callback])&lt;br /&gt;fs.lchmod(fd, mode, [callback])&lt;br /&gt;&lt;b&gt;Files: symlinks&lt;/b&gt;&lt;br /&gt;fs.link(srcpath, dstpath, [callback])&lt;br /&gt;fs.symlink(linkdata, path, [callback])&lt;br /&gt;fs.readlink(path, [callback])&lt;br /&gt;fs.unlink(path, [callback])&lt;/p&gt;&lt;p&gt;아마도 주로 비동기 형태를 많이 사용하겠지만, 동기 형태가 더 적절한 케이스도 있다(예를 들어 서버 시작 시 설정 파일을 읽는 작업). 비동기 작업 시에는 작업이 시작되고 금방 끝날 수 있기 때문에 조금 더 생각을 하고 작업할 필요가 있다.&lt;/p&gt;&lt;pre class=&quot;prettyprint&quot; style=&quot;padding: 0.5em 1em; margin: -1em 0px 1em; font-size: 14px; vertical-align: top; background-image: none; border-style: solid; border-color: rgb(232, 232, 232); border-width: 1px 1px 1px 6px; font-style: normal; font-variant: normal; font-weight: normal; font-family: 'droid sans mono', 'lucida console', monospace; line-height: 1.5; color: rgb(0, 0, 0); letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-position: initial initial; background-repeat: initial initial;&quot;&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;fs&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;readFile&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'./file.html'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; data&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;com&quot; style=&quot;color: rgb(136, 0, 0); font-size: 9pt;&quot;&gt;// ...&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;});&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
fs&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;readFile&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'./other.html'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; data&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;com&quot; style=&quot;color: rgb(136, 0, 0); font-size: 9pt;&quot;&gt;// ..&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;});&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;각각 파일을 읽는데 걸리는 시간이 순서에 상관없이 완료될 수 있다. 가장 쉬운 해결책으로 콜백체인 방식으로 해결할 수 있다.&lt;/p&gt;&lt;pre class=&quot;prettyprint&quot; style=&quot;padding: 0.5em 1em; margin: -1em 0px 1em; font-size: 14px; vertical-align: top; background-image: none; border-style: solid; border-color: rgb(232, 232, 232); border-width: 1px 1px 1px 6px; font-style: normal; font-variant: normal; font-weight: normal; font-family: 'droid sans mono', 'lucida console', monospace; line-height: 1.5; color: rgb(0, 0, 0); letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-position: initial initial; background-repeat: initial initial;&quot;&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;fs&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;readFile&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'./file.html'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; data&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;com&quot; style=&quot;color: rgb(136, 0, 0); font-size: 9pt;&quot;&gt;// ...&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
   fs&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;readFile&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'./other.html'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; data&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;com&quot; style=&quot;color: rgb(136, 0, 0); font-size: 9pt;&quot;&gt;// ...&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;});&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;});&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;그렇지만, control flow챕터에서 좀 더 나은 패턴을 연구해볼 필요가 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;11.1. 파일: 읽기 쓰기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;한번에 읽고 쓰는 방법은 매우 간단하다. 함수 호출할 때 문자나 버퍼로 쓰고, 콜백 리턴값을 확인하면 된다.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;레시피: 파일 읽기(Fully buffered)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;pre class=&quot;prettyprint&quot; style=&quot;padding: 0.5em 1em; margin: -1em 0px 1em; font-size: 14px; vertical-align: top; background-image: none; border-style: solid; border-color: rgb(232, 232, 232); border-width: 1px 1px 1px 6px; font-style: normal; font-variant: normal; font-weight: normal; font-family: 'droid sans mono', 'lucida console', monospace; line-height: 1.5; color: rgb(0, 0, 0); letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-position: initial initial; background-repeat: initial initial;&quot;&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;fs&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;readFile&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'./index.html'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'utf8'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; data&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;com&quot; style=&quot;color: rgb(136, 0, 0); font-size: 9pt;&quot;&gt;// the data is passed to the callback in the second argument&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
  console&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;});&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;레시피: 파일 쓰기(Fully buffered)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;pre class=&quot;prettyprint&quot; style=&quot;padding: 0.5em 1em; margin: -1em 0px 1em; font-size: 14px; vertical-align: top; background-image: none; border-style: solid; border-color: rgb(232, 232, 232); border-width: 1px 1px 1px 6px; font-style: normal; font-variant: normal; font-weight: normal; font-family: 'droid sans mono', 'lucida console', monospace; line-height: 1.5; color: rgb(0, 0, 0); letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-position: initial initial; background-repeat: initial initial;&quot;&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;fs&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;writeFile&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'./results.txt'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'Hello World'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;throw&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
  console&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'File write completed'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;});&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;파일의 일부의 쓰기 읽기 작업을 할 때에는 open()함수가 필요로 하는데, 이것을 통해 파일디스크립터를 얻고 이것과 함께 작업할 수 있다.&lt;/p&gt;&lt;p&gt;fs.open(path, flags, [mode], [callback]) 아래와 같은 flag를 지원한다.&lt;/p&gt;&lt;p&gt;'r' - 읽기로 열기. 파일이 존재하지 않으면 에러발생.&lt;br /&gt;'r+' - 읽기/쓰기로 열기. 파일이 존재하지 않으면 에러발생.&lt;br /&gt;'w' - 쓰기로 열기. 파일이 존재하지 않으면 만들어지고, 파일이 존재하면 지우고 처음부터 씀.&lt;br /&gt;'w+' - 읽기/쓰기로 열기. 파일이 존재하지 않으면 만들어지고, 파일이 존재하면 처음부터 씀.&lt;br /&gt;'a' - 추가 쓰기로 열기. 파일이 존재하지 않으면 만들어짐.&lt;br /&gt;'a+' - 파일을 읽고/추가쓰기모드로 열기. 파일이 존재하지 않으면 만들어짐.&lt;/p&gt;&lt;p&gt;새로 생성되는 퍼미션에 대해서는 기본값 0666으로 지정됨.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;레시피: 파일을 열고 쓰기를 한 뒤 닫기(in parts)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;pre class=&quot;prettyprint&quot; style=&quot;padding: 0.5em 1em; margin: -1em 0px 1em; font-size: 14px; vertical-align: top; background-image: none; border-style: solid; border-color: rgb(232, 232, 232); border-width: 1px 1px 1px 6px; font-style: normal; font-variant: normal; font-weight: normal; font-family: 'droid sans mono', 'lucida console', monospace; line-height: 1.5; color: rgb(0, 0, 0); letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-position: initial initial; background-repeat: initial initial;&quot;&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;fs&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'./data/index.html'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'w'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; fd&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;throw&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; buf &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;typ&quot; style=&quot;color: rgb(102, 0, 102); font-size: 9pt;&quot;&gt;Buffer&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'bbbbb\n'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
  fs&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;fd&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; buf&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: rgb(0, 102, 102); font-size: 9pt;&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; buf&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; written&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; buffer&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;throw&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
    console&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; written&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; buffer&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
    fs&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;fd&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
      console&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'Done'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;});&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;});&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: rgb(0, 0, 0); font-size: 9pt;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;});&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;read()와 write()함수는 버퍼에서 돌아가는 함수라서, 문자열을 new Buffer()로 생성했다. 명심할 것은 리턴값이 buffer객체로 리턴된다.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;레시피: 파일 열고, 특정위치 탐색 후 읽고 닫기.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;pre class=&quot;prettyprint&quot; style=&quot;padding: 0.5em 1em; margin-top: -1em; font-size: 14px; vertical-align: top; background-image: none; border-style: solid; border-color: rgb(232, 232, 232); border-width: 1px 1px 1px 6px; font-family: 'droid sans mono', 'lucida console', monospace; line-height: 1.5; color: rgb(0, 0, 0);&quot;&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;fs&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'./data/index.html'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'r'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; fd&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;throw&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; str &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;typ&quot; style=&quot;color: rgb(102, 0, 102); font-size: 9pt;&quot;&gt;Buffer&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: rgb(0, 102, 102); font-size: 9pt;&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
    fs&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;read&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;fd&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; buf&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: rgb(0, 102, 102); font-size: 9pt;&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; buf&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; bytesRead&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; buffer&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;throw&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
      console&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; bytesRead&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; buffer&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
      fs&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;fd&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
        console&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'Done'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;});&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;});&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;});&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;11.2 디렉토리: 읽기 생성 삭제&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;레시피: 디렉토리 읽기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;디렉토리에 있는 아이템(파일, 디렉토리 등)의 이름들을 리턴해준다.&lt;/p&gt;&lt;pre class=&quot;prettyprint&quot; style=&quot;padding: 0.5em 1em; margin-top: -1em; font-size: 14px; vertical-align: top; background-image: none; border-style: solid; border-color: rgb(232, 232, 232); border-width: 1px 1px 1px 6px; font-family: 'droid sans mono', 'lucida console', monospace; line-height: 1.5; color: rgb(0, 0, 0);&quot;&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; path &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'./data/'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
fs&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;readdir&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; files&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;throw&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
  files&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
    console&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
    fs&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;stat&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; stats&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
      console&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;stats&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;});&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;});&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;});&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;fs.stat()함수는 아이템에 대한 정보를 제공한다. stat객체는 아래와 같은 정보를 제공한다.&lt;/p&gt;&lt;pre class=&quot;prettyprint&quot; style=&quot;padding: 0.5em 1em; margin-top: -1em; font-size: 14px; vertical-align: top; background-image: none; border-style: solid; border-color: rgb(232, 232, 232); border-width: 1px 1px 1px 6px; font-family: 'droid sans mono', 'lucida console', monospace; line-height: 1.5; color: rgb(0, 0, 0);&quot;&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; dev&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: rgb(0, 102, 102); font-size: 9pt;&quot;&gt;2114&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
  ino&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: rgb(0, 102, 102); font-size: 9pt;&quot;&gt;48064969&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
  mode&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: rgb(0, 102, 102); font-size: 9pt;&quot;&gt;33188&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
  nlink&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: rgb(0, 102, 102); font-size: 9pt;&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
  uid&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: rgb(0, 102, 102); font-size: 9pt;&quot;&gt;85&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
  gid&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: rgb(0, 102, 102); font-size: 9pt;&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
  rdev&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: rgb(0, 102, 102); font-size: 9pt;&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
  size&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: rgb(0, 102, 102); font-size: 9pt;&quot;&gt;527&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
  blksize&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: rgb(0, 102, 102); font-size: 9pt;&quot;&gt;4096&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
  blocks&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: rgb(0, 102, 102); font-size: 9pt;&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
  atime&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;typ&quot; style=&quot;color: rgb(102, 0, 102); font-size: 9pt;&quot;&gt;Mon&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: rgb(0, 102, 102); font-size: 9pt;&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;typ&quot; style=&quot;color: rgb(102, 0, 102); font-size: 9pt;&quot;&gt;Oct&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: rgb(0, 102, 102); font-size: 9pt;&quot;&gt;2011&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: rgb(0, 102, 102); font-size: 9pt;&quot;&gt;23&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: rgb(0, 102, 102); font-size: 9pt;&quot;&gt;24&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: rgb(0, 102, 102); font-size: 9pt;&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; GMT&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
  mtime&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;typ&quot; style=&quot;color: rgb(102, 0, 102); font-size: 9pt;&quot;&gt;Mon&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: rgb(0, 102, 102); font-size: 9pt;&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;typ&quot; style=&quot;color: rgb(102, 0, 102); font-size: 9pt;&quot;&gt;Oct&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: rgb(0, 102, 102); font-size: 9pt;&quot;&gt;2011&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: rgb(0, 102, 102); font-size: 9pt;&quot;&gt;23&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: rgb(0, 102, 102); font-size: 9pt;&quot;&gt;24&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: rgb(0, 102, 102); font-size: 9pt;&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; GMT&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
  ctime&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;typ&quot; style=&quot;color: rgb(102, 0, 102); font-size: 9pt;&quot;&gt;Mon&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: rgb(0, 102, 102); font-size: 9pt;&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;typ&quot; style=&quot;color: rgb(102, 0, 102); font-size: 9pt;&quot;&gt;Oct&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: rgb(0, 102, 102); font-size: 9pt;&quot;&gt;2011&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: rgb(0, 102, 102); font-size: 9pt;&quot;&gt;23&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: rgb(0, 102, 102); font-size: 9pt;&quot;&gt;24&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: rgb(0, 102, 102); font-size: 9pt;&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; GMT &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;atime, mtime, ctime은 Date인스턴스다. stat객체는 또한 아래와 같은 함수를 제공한다.&lt;/p&gt;&lt;p&gt;stats.isFile()&lt;br /&gt;stats.isDirectory()&lt;br /&gt;stats.isBlockDevice()&lt;br /&gt;stats.isCharacterDevice()&lt;br /&gt;stats.isSymbolicLink() (only valid with fs.lstat())&lt;br /&gt;stats.isFIFO()&lt;br /&gt;stats.isSocket()&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;레시피: 디렉토리 생성과 삭제&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;pre class=&quot;prettyprint&quot; style=&quot;padding: 0.5em 1em; margin-top: -1em; font-size: 14px; vertical-align: top; background-image: none; border-style: solid; border-color: rgb(232, 232, 232); border-width: 1px 1px 1px 6px; font-family: 'droid sans mono', 'lucida console', monospace; line-height: 1.5; color: rgb(0, 0, 0);&quot;&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;fs&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;mkdir&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'./newdir'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: rgb(0, 102, 102); font-size: 9pt;&quot;&gt;0666&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;throw&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
  console&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'Created newdir'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
  fs&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;rmdir&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'./newdir'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;throw&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
    console&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'Removed newdir'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;});&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;});&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;stream객체를 이용해서 읽고 쓰기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;stream객체는 chapter9에서 설명한다.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;레시피: 파일을 읽어서 다른 파일에 쓰기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;pre class=&quot;prettyprint&quot; style=&quot;padding: 0.5em 1em; margin-top: -1em; font-size: 14px; vertical-align: top; background-image: none; border-style: solid; border-color: rgb(232, 232, 232); border-width: 1px 1px 1px 6px; font-family: 'droid sans mono', 'lucida console', monospace; line-height: 1.5; color: rgb(0, 0, 0);&quot;&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; file &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; fs&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;createReadStream&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'./data/results.txt'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;flags&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'r'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; fs&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;createWriteStream&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'./data/results2.txt'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;flags&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'w'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;});&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
file&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'data'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
  console&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'data'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; data&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;});&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
file&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'end'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
  console&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'end'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
    console&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'Finished writing to file'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
    //test&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;done&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;();&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;});&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;});&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;다른 방법으로 pipe()함수를 이용해서 할 수 있다.&lt;/p&gt;&lt;pre class=&quot;prettyprint&quot; style=&quot;padding: 0.5em 1em; margin-top: -1em; font-size: 14px; vertical-align: top; background-image: none; border-style: solid; border-color: rgb(232, 232, 232); border-width: 1px 1px 1px 6px; font-family: 'droid sans mono', 'lucida console', monospace; line-height: 1.5; color: rgb(0, 0, 0);&quot;&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; file &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; fs&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;createReadStream&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'./data/results.txt'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;flags&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'r'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; fs&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;createWriteStream&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'./data/results2.txt'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;flags&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'w'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;});&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
file&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;pipe&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;);&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;레시피: 파일에 추가하기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;pre class=&quot;prettyprint&quot; style=&quot;padding: 0.5em 1em; margin-top: -1em; font-size: 14px; vertical-align: top; background-image: none; border-style: solid; border-color: rgb(232, 232, 232); border-width: 1px 1px 1px 6px; font-family: 'droid sans mono', 'lucida console', monospace; line-height: 1.5; color: rgb(0, 0, 0);&quot;&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; file &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; fs&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;createWriteStream&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'./data/results.txt'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;flags&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'a'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
file&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'HELLO!\n'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
file&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
  test&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;done&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;();&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;});&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;연습용 예제&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Node는 여러 파일에 대한 비동기 접근이 자주 일어나기 때문에 큰 용량의 파일I/O처리에 대해서 주의해야 한다. 사용 가능한 파일핸들을 다 써버릴 수도 있다(제한된 운영 시스템에서 파일을 사용하는 경우). 또한 비동기 처리로 동작하면서 끝나는 순서가 보장되지 않은 상황이 오기 때문에 이전 챕터인 CONTROL FLOW에서 실행 순서를 조정하는 패턴에 대해서 논의를 했었다. 아래 예를 보자.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;예제: 특정 디렉토리를 재귀적으로 탐색해서 파일을 찾기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;이 예제에서는 주어진 경로에 대해서 재귀적으로 파일을 검색할 것이다. 검색할 경로, 검색할 파일이름, 찾기가 끝났을 때 호출할 콜백함수, 이렇게 3개의 파라메터를 받는다.&lt;/p&gt;&lt;pre class=&quot;prettyprint&quot; style=&quot;padding: 0.5em 1em; margin-top: -1em; font-size: 14px; vertical-align: top; background-image: none; border-style: solid; border-color: rgb(232, 232, 232); border-width: 1px 1px 1px 6px; font-family: 'droid sans mono', 'lucida console', monospace; line-height: 1.5; color: rgb(0, 0, 0);&quot;&gt;&lt;p&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; fs &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'fs'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; findFile&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; searchFile&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; callback&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
  fs&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;readdir&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; files&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; callback&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
    files&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
      fs&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;stat&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'/'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(err, stats)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; callback&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;stats&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;isFile&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; file &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; searchFile&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
          callback&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;undefined&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; path&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'/'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;stats&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;isDirectory&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;())&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
          findFile&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'/'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; searchFile&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; callback&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;});&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;});&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;});&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;

findFile&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'./test'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'needle.txt'&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; path&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot; style=&quot;color: rgb(0, 0, 136); font-size: 9pt;&quot;&gt;throw&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; err&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
  console&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;color: rgb(0, 136, 0); font-size: 9pt;&quot;&gt;'Found file at: '&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;font-size: 9pt;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: rgb(102, 102, 0); font-size: 9pt;&quot;&gt;});&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;함수를 분리하여 좀 이해하기 쉽게 만들었다.&lt;/p&gt;&lt;pre class=&quot;prettyprint&quot; style=&quot;padding: 0.5em 1em; margin-top: -1em; vertical-align: top; background-image: none; border-style: solid; border-color: rgb(232, 232, 232); border-width: 1px 1px 1px 6px;&quot;&gt;&lt;font color=&quot;#000088&quot; face=&quot;droid sans mono, lucida console, monospace&quot;&gt;var fs = require('fs');

function findFile(path, searchFile, callback){
    function isMatch(err, stats, file){
        if(err) { return callback(err); }
        if(stats.isFile() &amp;amp;&amp;amp; file == searchFile) {
            callback(undefined, path + '/' + file);
        } else if (stats.isDirectory()){
            statDirectory(path + '/' + file, isMatch);
        }
    }
    statDirectory(path, isMatch);
}

function statDirectory(path, callback){
    fs.readdir(path, function(err, files){
        if(err) { return callback(err); }
        files.forEach(function(file){
            fs.stat(path + '/' + file, function(err, stats){
                callback(err, stats, file);
            });
        });
    });
}

findFile('./test', 'needle.txt', function(err, path){
    if(err) { throw err; }
    console.log('Found file at: ' + path);
});&lt;/font&gt;&lt;/pre&gt;&lt;p&gt;함수를 작은 파트별로 분리했다.&lt;/p&gt;&lt;p&gt;findFile: 이 코드는 전체 프로세스의 시작점이며, 입력값에 의해서 결과값과 함께 콜백을 리턴한다.&lt;br /&gt;isMatch: stat()함수의 결과값을 가져오는 함수이고, 매칭이 됐는지 체크하는 필수로직이 있는 부분이다.&lt;br /&gt;statDirectory: 이 함수는 경로를 읽고, 각각의 파일의 stat정보를 파라메터로 받는 콜백함수로 리턴한다.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;PathIterator: EventEmitter를 이용하여 재사용을 향상시키기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;EventEmitter를 이용하여&amp;nbsp;디렉토리를 탐색하는 방법의 모듈을 생성해서 재사용하는 방식으로 만들 것이다.&lt;/p&gt;&lt;pre class=&quot;prettyprint&quot; style=&quot;padding: 0.5em 1em; margin-top: -1em; vertical-align: top; background-image: none; border-style: solid; border-color: rgb(232, 232, 232); border-width: 1px 1px 1px 6px;&quot;&gt;&lt;font color=&quot;#000088&quot; face=&quot;droid sans mono, lucida console, monospace&quot;&gt;var fs = require('fs'),
    EventEmitter = require('events').EventEmitter,
    util = require('util');

var PathIterator = function() { };

// augment with EventEmitter
util.inherits(PathIterator, EventEmitter);

// Iterate a path, emitting 'file' and 'directory' events.
PathIterator.prototype.iterate = function(path) {
    var self = this;
    this.statDirectory(path, function(fpath, stats) {
        if(stats.isFile()) {
            self.emit('file', fpath, stats);
        } else if(stats.isDirectory()) {
            self.emit('directory', fpath, stats);
            //self.iterate(path+'/'+file);
            self.iterate(fpath);
        }
    });
};

// Read and stat a directory
PathIterator.prototype.statDirectory = function(path, callback) {
    fs.readdir(path, function (err, files) {
        if(err) { self.emit('error', err); }
            files.forEach(function(file) {
            var fpath = path+'/'+file;
            console.log(fpath);
            fs.stat(fpath, function (err, stats) {
                if(err) { self.emit('error', err); }
                callback(fpath, stats);
            });
        });
    });
};
module.exports = PathIterator;&lt;/font&gt;&lt;/pre&gt;&lt;p&gt;보시다시피 EventEmitter를 확장해서 새로운 클래스를 만들었다. 그리고, 아래와 같이 발생시킬 수 있는 이벤트를 정의했다.&lt;/p&gt;&lt;p&gt;error - function(error): 에러 발생 시 발생.&lt;br /&gt;file - function(filepath, stats): 파일의 전체경로와 fs.stat()의 결과&lt;br /&gt;directory - function(dirpath, stats): 디렉토리의 전체경로와 fs.stat()의 결과&lt;/p&gt;&lt;p&gt;이제 디렉토리를 탐색하기 위해 이 유틸리티 클래스를 사용할 수 있다.&lt;/p&gt;&lt;pre class=&quot;prettyprint&quot; style=&quot;padding: 0.5em 1em; margin-top: -1em; vertical-align: top; background-image: none; border-style: solid; border-color: rgb(232, 232, 232); border-width: 1px 1px 1px 6px;&quot;&gt;&lt;font color=&quot;#000088&quot; face=&quot;droid sans mono, lucida console, monospace&quot;&gt;var PathIterator = require('./pathiterator.js');
function findFile(path, searchFile, callback) {
    var pi = new PathIterator();
    pi.on('file', function(file, stats) {
        if(file.indexOf(searchFile) &amp;gt; 0) {
            callback(undefined, file);
        }
    });
    pi.on('error', callback);
    pi.iterate(path);
}

findFile('./test', 'needle.txt', function(err, path){
    if(err) { throw err; }
    console.log('Found file at: ' + path);
});&lt;/font&gt;&lt;/pre&gt;&lt;p&gt;이 방식이 순수 콜백 방식보다 좀 더 나은 결과와 확장성을 보여준다(예를 들어 file이벤트에서 file목록을 쉽게 찾을 수 있다).&lt;/p&gt;&lt;p&gt;경로를 탐색하는 코드 작성을 완료했다면, PathIterator EventEmitter는 코드를&amp;nbsp;단순화시킬될 것이다. 넌블로킹I/O가 이벤트 루프를 통해서 콜백하는 것이 남아있지만, 인터페이스는 매우 이해하기 쉽게 되었을 것이다. 아마 findFile()함수를 프로세스 일부에 쓰일 것이라면, 같은 모듈로&amp;nbsp;일부 로직을 몰라도 경로를 탐색하는 코드를 작성할 수 있다.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;특화된 모듈 사용: async.js&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;EventEmitter를 이용한 I/O처리의 캡슐화는 도움이 되었지만, 좀 더 나은 모듈인 fjacob의 async.js모듈을 사용하여서도 처리할 수 있다. 이것은 FileSystem모듈에 정의된 것을 체인 방식으로 잘 캡슐화한 것이다. async.js를 이용한 findFile()함수를 보자:&lt;/p&gt;&lt;pre class=&quot;prettyprint&quot; style=&quot;padding: 0.5em 1em; margin-top: -1em; vertical-align: top; background-image: none; border-style: solid; border-color: rgb(232, 232, 232); border-width: 1px 1px 1px 6px;&quot;&gt;&lt;font color=&quot;#000088&quot; face=&quot;droid sans mono, lucida console, monospace&quot;&gt;var async = require('asyncjs');

function findFile(path, searchFile, callback){
    async.readdir(path)
        .stat()
        .filter(function(file){
            if (!file.stat.isFile()){
                findFile(file.path, searchFile, callback);
                return false;
            }
            return file.name == searchFile;
        })
        .end(function(err, file){
            if (!file){
                return;
            }
            callback(err, file.path);
        });
}

findFile('./test', 'needle.txt', function(err, path){
    if(err) { throw err; }
    console.log('Found file at: ' + path);
});&lt;/font&gt;&lt;/pre&gt;&lt;p&gt;async.js에서는 다양한 기술들로 구성되어 있지만(Control flow챕터 참조), 체인 인터페이스를 사용한 작동만 사용했다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;포인트 - 노드에서 비동기I/O로 구성하는 것은 다른 환경이나 언어에서 보다 복잡할 수 있다. 이것은 파일 시스템을 다룰 때 매우 중요하다. 왜냐하면 어떤 것을 얻기 위해서는 긴 비동기 호출을 수행할 수 있기 때문이다.&lt;/p&gt;&lt;p&gt;그렇지만, 메인 코드로부터 더 나은 해결책을 찾아낼 가능성이 있다. 어떤 경우에는 매우 간결한 방법을 제공하는 라이브러리를 찾아서 처리할 수 있다(예를 들어 async.js 같은 것). 그리고, 다른 경우에는 모듈을 분리해서 프로세스의 파트를 나눠서 작업하는 경우도 있다(PathIterator 같은 것).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Node.js</category>
      <author>머드초보</author>
      <guid isPermaLink="true">https://mudchobo.tistory.com/542</guid>
      <comments>https://mudchobo.tistory.com/542#entry542comment</comments>
      <pubDate>Tue, 16 Jul 2013 12:55:36 +0900</pubDate>
    </item>
    <item>
      <title>[Hadoop] 하둡 클러스터 구성 및 테스트(Cluster Setup)</title>
      <link>https://mudchobo.tistory.com/541</link>
      <description>&lt;p&gt;하둡설치 클러스터 구성 이렇게 치면 다양한 설치 방법이 나오는데요. 그거랑 제가 지금 쓰는거랑 틀리지 않습니다-_- 그 문서를 가지고 삽질했습니다. 저도 나중에 진짜 업무에서 클러스터 구성할 기회가 있을지도 모르니 문서화합니다. 그냥 참고만 하세요.&lt;/p&gt;&lt;p&gt;공식문서입니다.&lt;br /&gt;&lt;a class=&quot;tx-link&quot; target=&quot;_blank&quot; href=&quot;http://hadoop.apache.org/docs/r1.1.2/cluster_setup.html&quot;&gt;http://hadoop.apache.org/docs/r1.1.2/cluster_setup.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;아마 나중에는 2.x방식 대로 뭔가 바뀔 것 같은데, 현재 알파버전이 나왔습니다. 문서를 보면 뭔가 좀 틀리긴 합니다. 그건 또 나중에 삽질하기로 하고...&lt;br /&gt;하둡 1.1.2버전 기준입니다.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;서버를 3대로 했습니다. 운영체제는 ubuntu에서 했습니다.&lt;br /&gt;namenode, jobtracker = 1대&lt;br /&gt;secondarynamenode = 1대&lt;br /&gt;datanode1 = 1대&lt;br /&gt;그 외에 계속 datanode만 확장하면 됩니다.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;1. 기본적으로 설치되어야할 것.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;기본적으로 sshd, ssh, rsync가 설치되어야 함.&lt;br /&gt;서로 접속이 가능하도록 키값 authorized_keys에 등록. 비밀번호 없이 모든 서버가 통신이 가능해야 합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;2. 서버를 알아보기 쉽게 하기 위해 /etc/hosts 수정&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(121, 165, 228); background-color: rgb(219, 232, 251); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;sudo vi /etc/hosts&lt;br /&gt;192.168.0.1 namenode&lt;br /&gt;192.168.0.2 secondarynode&lt;br /&gt;192.168.0.3 datanode1&lt;br /&gt;#192.168.0.4 datanode2&lt;br /&gt;#192.168.0.5 datanode3&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;해당 아이피는 각각 서버 아이피를 입력하면 됩니다. 저는 가상머신이라.....&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;3. ssh-key값을 모든 서버가 비번없이 접속 가능하게 수정.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(121, 165, 228); background-color: rgb(219, 232, 251); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;ssh localhost&lt;br /&gt;ssh-keygen -t dsa -P '' ~/.ssh/id_dsa&lt;br /&gt;cat ~/.ssh/id_dsa.pub &amp;gt;&amp;gt; ~/.ssh/authorized_keys&lt;/p&gt;&lt;/div&gt;&lt;p&gt;보면 키값을 만들고 자신에게 접속해도 비밀번호 묻지 않게 authorized_keys에 공개키를 추가하는 과정입니다.&lt;br /&gt;그리고 나서 이 키값을 모든 서버에 동일하게 넣습니다. 그러면 모든 서버가 비밀번호 없이 접속할 수 있습니다.&lt;br /&gt;손쉽게 rsync를 이용해서 넣으세요. 처음에는 비밀번호 물어볼겁니다. 대신 넣고 나서는 잘 될겁니다.&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(121, 165, 228); background-color: rgb(219, 232, 251); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;rsync -avz ~/.ssh/ mudchobo@secondarynode:~/.ssh/&lt;br /&gt;rsync -avz ~/.ssh/ mudchobo@datanode1:~/.ssh/&lt;/p&gt;&lt;/div&gt;&lt;p&gt;그리고 다 접속한번 해보고 known_hosts에 등록이 되어야 합니다. 안그러면 hadoop이 서로 접속할 때 ssh로 접속하는데 yes/no 뜨는 거&lt;br /&gt;The authenticity of host '~~~' can't be established.&lt;br /&gt;RSA key fingerprint is 8e:52:c0:a7:1f:d8:4f:b5:5b:c3:05:f2:76:85:ab:65.&lt;br /&gt;Are you sure you want to continue connecting (yes/no)?&lt;br /&gt;요런거 뜨는데, 그래서 무슨 서로 연결이 안되어서 에러나요. 그래서 한번씩 접속해줘야 합니다. 모든 서버에서 다 해줘야함. 이것때문에 고생함ㅠ&lt;br /&gt;&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(121, 165, 228); background-color: rgb(219, 232, 251); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;ssh namenode&lt;br /&gt;ssh secondarynode&lt;br /&gt;ssh datanode1&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;4. 하둡은 자바기반이라 java설치&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;우분투라 저는 간단하게 아래명령어로 설치했습니다. 모든서버에 다 설치합니다.&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(121, 165, 228); background-color: rgb(219, 232, 251); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;sudo apt-get install openjdk-7-jdk&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;5. 하둡다운로드 및 압축풀기&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;namenode서버에서만 일단 다운로드 및 셋팅합니다. 나중에 다른 서버는 rsync로 그냥 동기화 시켜버릴겁니다.&lt;br /&gt;&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(121, 165, 228); background-color: rgb(219, 232, 251); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;wget http://apache.tt.co.kr/hadoop/common/hadoop-1.1.2/hadoop-1.1.2.tar.gz&lt;br /&gt;tar xvf hadoop-1.1.2.tar.gz&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;6. 하둡설정 core-site.xml, hdfs-site.xml, mapred-site.xml&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;최소 필요설정만 할겁니다. 나머지 디폴트값은 src/core, src/hdfs, src/mapred에 있습니다. 대부분 자기 업무에 맞게 최적화하면 되는데, 옵션이....많군요....ㄷㄷ&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;core-site.xml&lt;/b&gt;&lt;/p&gt;&lt;p&gt;보면 hdfs:// 으로 시작해야 합니다. 그리고 namenode는 아이피로 써도 됩니다. 결국 호스트와 포트설정임.&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(121, 165, 228); background-color: rgb(219, 232, 251); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;name&amp;gt;fs.default.name&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;hdfs://namenode:9000&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;hdfs-site.xml&lt;/b&gt;&lt;/p&gt;&lt;p&gt;namenode저장 경로랑 datanode저장 경로 지정합니다. 아무곳이나 원하는 곳을 설정하세요.&lt;br /&gt;&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(121, 165, 228); background-color: rgb(219, 232, 251); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;name&amp;gt;dfs.name.dir&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;/home/mudchobo/hdfs/name&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;name&amp;gt;dfs.data.dir&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;/home/mudchobo/hdfs/data&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;mapred-site.xml&lt;/b&gt;&lt;/p&gt;&lt;p&gt;맵리듀스 관련해서 설정하는 겁니다. jobtracker를 어디다가 놓을지 설정하는데, 보통 namenode랑 같이 놓는 것 같은데, 일부 서버 따로 빼서 놓는다는 사람도 있는 것 같아요. 뭐 잘 몰라서 일단 저는 namenode서버에 설정합니다. 그리고, local.dir system.dir설정합니다. 뭐하는 디렉토리인지는 잘 모르겠어요.&lt;br /&gt;&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(121, 165, 228); background-color: rgb(219, 232, 251); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;name&amp;gt;mapred.job.tracker&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;namenode:9001&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;name&amp;gt;mapred.local.dir&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;/home/mudchobo/hdfs/mapred&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;name&amp;gt;mapred.system.dir&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;/home/mudchobo/hdfs/mapred&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;conf/hadoop-env.sh&lt;/b&gt;&lt;/p&gt;&lt;p&gt;여기에 JAVA_HOME 환경변수를 추가해줘야 해요. 전역으로 되어있다면 안해도 되는데 혹시 모르니...&lt;br /&gt;우분투 oepnjdk-7-jdk로 설치한 경우 JAVA_HOME은 /usr/lib/jvm/java-7-openjdk-amd64&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(121, 165, 228); background-color: rgb(219, 232, 251); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;conf/master&lt;/b&gt;&lt;/p&gt;&lt;p&gt;여기 서버리스트는 secondary namenode서버목록을 넣습니다. 아이피로 써도 되고 네임호스트로 써도 됩니다.&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(121, 165, 228); background-color: rgb(219, 232, 251); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;secondarynode&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;conf/slaves&lt;/b&gt;&lt;/p&gt;&lt;p&gt;여기 서버리스트는 datanode를 넣습니다. 아이피로 써도 되고 네임호스트로 써도 됩니다. 나중에 확장할 때 datanode서버만 추가해주면 손쉽게 확장을 할 수 있습니다.&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(121, 165, 228); background-color: rgb(219, 232, 251); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;datanode1&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;7. rsync로 secondary namenode서버와 datanode서버에 하둡 복사&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;rsync로 그냥 복사해버립니다.&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(121, 165, 228); background-color: rgb(219, 232, 251); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;rsync -avz ~/hadoop-1.1.2/ mudchobo@secondarynode:~/hadoop-1.1.2/&lt;br /&gt;rsync -avz ~/hadoop-1.1.2/ mudchobo@datanode1:~/hadoop-1.1.2/&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;8. 데몬 구동 실행&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;하둡홈/bin/start-all.sh 이라는 스크립트가 있는데, 이게 이제 위에 설정대로 구동하게 됩니다. namenode, jobtracker, secondarynamenode, datanode들을 띄우게 되는데, 설정대로 라면 namenode와 jobtracker는 namenode호스트로 9000, 9001로 뜨게 되고, secondarynamenode는 masters목록에서 띄우고, datanode는 slaves목록에 있는 것을 띄우게 됩니다. 그러니 다 각각 서버에 같은 디렉토리와 셋팅이 있으면 됩니다. 7번에서 rsync로 맞췄기 때문에 다 같은 환경설정입니다.&lt;/p&gt;&lt;p&gt;시작하기전에 namenode를 포맷하고 시작해야해요.&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(121, 165, 228); background-color: rgb(219, 232, 251); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;bin/hadoop namenode -format&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;시작 스크립트를 수행합니다.&lt;br /&gt;&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(121, 165, 228); background-color: rgb(219, 232, 251); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;mudchobo@ubuntu1:~/hadoop-1.1.2$ &lt;b&gt;bin/start-all.sh&lt;/b&gt;&lt;br /&gt;starting namenode, logging to /home/mudchobo/hadoop-1.1.2/libexec/../logs/hadoop-mudchobo-namenode-ubuntu1.out&lt;br /&gt;datanode1: starting datanode, logging to /home/mudchobo/hadoop-1.1.2/libexec/../logs/hadoop-mudchobo-datanode-ubuntu3.out&lt;br /&gt;secondarynode: starting secondarynamenode, logging to /home/mudchobo/hadoop-1.1.2/libexec/../logs/hadoop-mudchobo-secondarynamenode-ubuntu2.out&lt;br /&gt;starting jobtracker, logging to /home/mudchobo/hadoop-1.1.2/libexec/../logs/hadoop-mudchobo-jobtracker-ubuntu1.out&lt;br /&gt;datanode1: starting tasktracker, logging to /home/mudchobo/hadoop-1.1.2/libexec/../logs/hadoop-mudchobo-tasktracker-ubuntu3.out&lt;br /&gt;mudchobo@ubuntu1:~/hadoop-1.1.2$&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;jps 라는 명령어가 있는데 java에서 지원하는 건데, java로 실행하고 있는 프로세스 목록을 보여주는 것이에요. 그래서 각각 서버 들어가서 데몬이 잘 떠있는지 확인해봐야해요.&lt;/p&gt;&lt;p&gt;&lt;b&gt;namenode 서버&lt;/b&gt;&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(121, 165, 228); background-color: rgb(219, 232, 251); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;mudchobo@ubuntu1:~/hadoop-1.1.2$ &lt;b&gt;jps&lt;/b&gt;&lt;br /&gt;26206 NameNode&lt;br /&gt;26498 Jps&lt;br /&gt;26383 JobTracker&lt;br /&gt;mudchobo@ubuntu1:~/hadoop-1.1.2$&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;b&gt;secondarynamenode 서버&lt;/b&gt;&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(121, 165, 228); background-color: rgb(219, 232, 251); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;mudchobo@ubuntu2:~$ &lt;b&gt;jps&lt;/b&gt;&lt;br /&gt;10704 Jps&lt;br /&gt;10434 SecondaryNameNode&lt;br /&gt;mudchobo@ubuntu2:~$&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;b&gt;datanode1 서버&lt;/b&gt;&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(121, 165, 228); background-color: rgb(219, 232, 251); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;mudchobo@ubuntu3:~$ jps&lt;br /&gt;17049 TaskTracker&lt;br /&gt;16827 DataNode&lt;br /&gt;17347 Jps&lt;br /&gt;mudchobo@ubuntu3:~$&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;9. 초간단 MapReduce 예제 실행&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;다 잘 떠있으니 예제를 돌려보면요. 기본 문서에 나와있는 예제를 돌려봅시다.&lt;br /&gt;conf파일을 hdfs에 put하고 거기서 dfs문자를 찾아서 grep하는 예제입니다.&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(121, 165, 228); background-color: rgb(219, 232, 251); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;mudchobo@ubuntu1:~/hadoop-1.1.2$ &lt;b&gt;bin/hadoop fs -put conf input&lt;/b&gt;&lt;br /&gt;mudchobo@ubuntu1:~/hadoop-1.1.2$ &lt;b&gt;bin/hadoop fs -ls&lt;/b&gt;&lt;br /&gt;Found 1 items&lt;br /&gt;drwxr-xr-x&amp;nbsp;&amp;nbsp; - mudchobo supergroup&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2013-07-02 18:35 /user/mudchobo/input&lt;br /&gt;mudchobo@ubuntu1:~/hadoop-1.1.2$&lt;b&gt; bin/hadoop jar hadoop-examples-1.1.2.jar grep input output 'dfs[a-z.]+'&lt;/b&gt;&lt;br /&gt;13/07/02 18:36:26 INFO util.NativeCodeLoader: Loaded the native-hadoop library&lt;br /&gt;13/07/02 18:36:26 WARN snappy.LoadSnappy: Snappy native library not loaded&lt;br /&gt;13/07/02 18:36:26 INFO mapred.FileInputFormat: Total input paths to process : 16&lt;br /&gt;13/07/02 18:36:26 INFO mapred.JobClient: Running job: job_201307021835_0001&lt;br /&gt;13/07/02 18:36:27 INFO mapred.JobClient:&amp;nbsp; map 0% reduce 0%&lt;br /&gt;13/07/02 18:36:35 INFO mapred.JobClient:&amp;nbsp; map 12% reduce 0%&lt;br /&gt;13/07/02 18:36:41 INFO mapred.JobClient:&amp;nbsp; map 25% reduce 0%&lt;br /&gt;13/07/02 18:36:46 INFO mapred.JobClient:&amp;nbsp; map 37% reduce 0%&lt;br /&gt;13/07/02 18:36:51 INFO mapred.JobClient:&amp;nbsp; map 50% reduce 0%&lt;br /&gt;13/07/02 18:36:53 INFO mapred.JobClient:&amp;nbsp; map 50% reduce 16%&lt;br /&gt;13/07/02 18:36:56 INFO mapred.JobClient:&amp;nbsp; map 62% reduce 16%&lt;br /&gt;13/07/02 18:37:00 INFO mapred.JobClient:&amp;nbsp; map 68% reduce 16%&lt;br /&gt;13/07/02 18:37:01 INFO mapred.JobClient:&amp;nbsp; map 75% reduce 16%&lt;br /&gt;13/07/02 18:37:02 INFO mapred.JobClient:&amp;nbsp; map 75% reduce 20%&lt;br /&gt;13/07/02 18:37:05 INFO mapred.JobClient:&amp;nbsp; map 75% reduce 25%&lt;br /&gt;13/07/02 18:37:06 INFO mapred.JobClient:&amp;nbsp; map 87% reduce 25%&lt;br /&gt;13/07/02 18:37:11 INFO mapred.JobClient:&amp;nbsp; map 100% reduce 29%&lt;br /&gt;13/07/02 18:37:15 INFO mapred.JobClient:&amp;nbsp; map 100% reduce 100%&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient: Job complete: job_201307021835_0001&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient: Counters: 30&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp; Job Counters&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Launched reduce tasks=1&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SLOTS_MILLIS_MAPS=82690&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Total time spent by all reduces waiting after reserving slots (ms)=0&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Total time spent by all maps waiting after reserving slots (ms)=0&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Launched map tasks=16&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Data-local map tasks=16&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SLOTS_MILLIS_REDUCES=40275&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp; File Input Format Counters&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bytes Read=27225&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp; File Output Format Counters&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bytes Written=206&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp; FileSystemCounters&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FILE_BYTES_READ=102&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HDFS_BYTES_READ=28995&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FILE_BYTES_WRITTEN=871542&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HDFS_BYTES_WRITTEN=206&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp; Map-Reduce Framework&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Map output materialized bytes=192&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Map input records=771&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Reduce shuffle bytes=192&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Spilled Records=8&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Map output bytes=88&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Total committed heap usage (bytes)=3252924416&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPU time spent (ms)=4080&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Map input bytes=27225&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPLIT_RAW_BYTES=1770&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Combine input records=4&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Reduce input records=4&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Reduce input groups=4&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Combine output records=4&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Physical memory (bytes) snapshot=2754953216&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Reduce output records=4&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Virtual memory (bytes) snapshot=12783337472&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Map output records=4&lt;br /&gt;13/07/02 18:37:16 INFO mapred.FileInputFormat: Total input paths to process : 1&lt;br /&gt;13/07/02 18:37:16 INFO mapred.JobClient: Running job: job_201307021835_0002&lt;br /&gt;13/07/02 18:37:17 INFO mapred.JobClient:&amp;nbsp; map 0% reduce 0%&lt;br /&gt;13/07/02 18:37:23 INFO mapred.JobClient:&amp;nbsp; map 100% reduce 0%&lt;br /&gt;13/07/02 18:37:31 INFO mapred.JobClient:&amp;nbsp; map 100% reduce 33%&lt;br /&gt;13/07/02 18:37:33 INFO mapred.JobClient:&amp;nbsp; map 100% reduce 100%&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient: Job complete: job_201307021835_0002&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient: Counters: 30&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp; Job Counters&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Launched reduce tasks=1&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SLOTS_MILLIS_MAPS=5959&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Total time spent by all reduces waiting after reserving slots (ms)=0&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Total time spent by all maps waiting after reserving slots (ms)=0&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Launched map tasks=1&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Data-local map tasks=1&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SLOTS_MILLIS_REDUCES=9109&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp; File Input Format Counters&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bytes Read=206&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp; File Output Format Counters&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bytes Written=64&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp; FileSystemCounters&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FILE_BYTES_READ=102&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HDFS_BYTES_READ=324&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FILE_BYTES_WRITTEN=100996&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HDFS_BYTES_WRITTEN=64&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp; Map-Reduce Framework&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Map output materialized bytes=102&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Map input records=4&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Reduce shuffle bytes=102&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Spilled Records=8&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Map output bytes=88&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Total committed heap usage (bytes)=211382272&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPU time spent (ms)=710&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Map input bytes=120&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPLIT_RAW_BYTES=118&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Combine input records=0&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Reduce input records=4&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Reduce input groups=1&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Combine output records=0&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Physical memory (bytes) snapshot=236998656&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Reduce output records=4&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Virtual memory (bytes) snapshot=1511505920&lt;br /&gt;13/07/02 18:37:34 INFO mapred.JobClient:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Map output records=4&lt;br /&gt;mudchobo@ubuntu1:~/hadoop-1.1.2$ &lt;b&gt;bin/hadoop fs -cat output/*&lt;/b&gt;&lt;br /&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dfs.data.dir&lt;br /&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dfs.name.dir&lt;br /&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dfs.server.namenode.&lt;br /&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dfsadmin&lt;br /&gt;cat: File does not exist: /user/mudchobo/output/_logs&lt;br /&gt;mudchobo@ubuntu1:~/hadoop-1.1.2$&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;dfs로 시작하는거 4개를 찾았네요. 간단히 하둡위에서 돌아가는 맵리듀스 예제였음 ㅇㅇ&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Hadoop</category>
      <author>머드초보</author>
      <guid isPermaLink="true">https://mudchobo.tistory.com/541</guid>
      <comments>https://mudchobo.tistory.com/541#entry541comment</comments>
      <pubDate>Tue, 2 Jul 2013 18:42:48 +0900</pubDate>
    </item>
    <item>
      <title>[Node.js] socket.io의 room 기능을 이용한 랜덤채팅</title>
      <link>https://mudchobo.tistory.com/540</link>
      <description>&lt;p&gt;socket.io에는 room 기능이 있습니다. 말그대로 그 방에 들어가면 그 방에 있는 사람들끼리만 메세지를 주고 받을 수 있는 기능입니다.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/LearnBoost/socket.io/wiki/Rooms&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://github.com/LearnBoost/socket.io/wiki/Rooms&lt;/a&gt;&lt;/p&gt;&lt;p&gt;처음에 이런 기능이 있는 줄 모르고 구현했었는데, wiki를 찾아보니 있네요. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;사용법은 간단해요. 해당 socket 객체에 join, leave함수가 존재해요. join하고 방이름을 string으로 적으면 방에 입장하는 것이고, leave하면 방에서 나가는 것이에요.&amp;nbsp;&lt;/p&gt;&lt;p&gt;그리고 방에 있는 사용자들에게 메세지를 보내려면&lt;br /&gt;io.sockets.in('room').emit('event_name', data);&lt;br /&gt;이렇게 하면 돼요.&lt;/p&gt;&lt;p&gt;그래서 이걸 이용해서 손쉽게 랜덤채팅을 만들 수 있어요. 사용자가 접속하면 자기 id로 방을 만들고, 다른 사용자가 들어왔을 때 1명이 있는 방이 있으면 입장시키면 돼요. 그럼 두명이서만 대화를 할 수 있어요. 나중에 disconnect할 때에는 그 사용자가 어디에 접속해있는지 socketRoom객체에 저장해두었다가 그 방을 폭파시키고 로비로 보내버리면 돼요.&lt;/p&gt;&lt;p&gt;※여기서 좀 주의할 점이 방을 만들면 io.sockets.manager.rooms에 방 목록을 볼 수 있는데, 여기에 방키값 앞에 &quot;/&quot;가 붙습니다. 그래서 다른 사용자들을 그 키로 입장 시킬 때 그 값을 제거하고 넣어야 하더라구요.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;app.js&lt;/b&gt;&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(121, 165, 228); background-color: rgb(219, 232, 251); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;var app = require('http').createServer(handler),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; io = require('socket.io').listen(app),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fs = require('fs');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;app.listen(process.env.PORT || 9000);&lt;br /&gt;&lt;br /&gt;function handler(req, res){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fs.readFile(__dirname + '/index.html',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; function (err, data) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (err) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; res.writeHead(500);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return res.end('Error loading index.html');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; res.writeHead(200);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data = data.toString('utf-8').replace('&amp;lt;%=host%&amp;gt;', req.headers.host);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; res.end(data);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// socket.io 셋팅&lt;br /&gt;io.configure(function(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; io.set('transports', ['xhr-polling']);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; io.set('polling duration', 10);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; io.set('log level', 2);&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;var socketRoom = {};&lt;br /&gt;&lt;br /&gt;io.sockets.on('connection', function(socket){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 접속완료를 알림.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; socket.emit('connected');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // chat요청을 할 시&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; socket.on('requestRandomChat', function(data){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 빈방이 있는지 확인&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; console.log('requestRandomChat');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var rooms = io.sockets.manager.rooms;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (var key in rooms){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (key == ''){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; continue;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 혼자있으면 입장&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (rooms[key].length == 1){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var roomKey = key.replace('/', '');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; socket.join(roomKey);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; io.sockets.in(roomKey).emit('completeMatch', {});&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; socketRoom[socket.id] = roomKey;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 빈방이 없으면 혼자 방만들고 기다림.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; socket.join(socket.id);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; socketRoom[socket.id] = socket.id;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 요청 취소 시&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; socket.on('cancelRequest', function(data){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; socket.leave(socketRoom[socket.id]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // client -&amp;gt; server Message전송 시&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; socket.on('sendMessage', function(data){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; console.log('sendMessage!');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; io.sockets.in(socketRoom[socket.id]).emit('receiveMessage', data);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // disconnect&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; socket.on('disconnect', function(data){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var key = socketRoom[socket.id];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; socket.leave(key);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; io.sockets.in(key).emit('disconnect');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var clients = io.sockets.clients(key);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (var i = 0; i &amp;lt; clients.length; i++){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; clients[i].leave(key);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;});&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;index.html&lt;/b&gt;&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(121, 165, 228); background-color: rgb(219, 232, 251); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;socketio redis store&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;link href=&quot;//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css&quot; rel=&quot;stylesheet&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script type=&quot;text/javascript&quot; src=&quot;http://code.jquery.com/jquery-1.10.1.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script type=&quot;text/javascript&quot; src=&quot;/socket.io/socket.io.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var socket = io.connect('http://&amp;lt;%=host%&amp;gt;');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(document).ready(function(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; socket.on('connected', function(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; console.log('connected');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 매칭완료되었을 때&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; socket.on('completeMatch', function(data){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; console.log('completeMatch!');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $('.lobby').hide();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $('.wait').hide();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $('.chat').show();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 대화를 받았을 때&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; socket.on('receiveMessage', function(data){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $('.chatResult').append('&amp;lt;li&amp;gt;' + data.message + '&amp;lt;/li&amp;gt;');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 상대방이 나갔을 때 나도 같이 로비로 나감.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; socket.on('disconnect', function(data){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; console.log('disconnect');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $('.lobby').show();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $('.chat').hide();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 랜덤요청 시&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $('#btnRequestRandomChat').click(function(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $('.lobby').hide();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $('.wait').show();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; socket.emit('requestRandomChat');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 요청 취소 시&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $('#btnCancelRequest').click(function(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $('.lobby').show();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $('.wait').hide();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $('.chat').hide();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; socket.emit('cancelRequest');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 엔터입력 시&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $('#inputMessage').keyup(function(e){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (e.keyCode == 13){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; send();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 채팅 내용 전송 시&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $('#btnChat').click(function(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; send();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; function send(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var message = $('#inputMessage').val();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (message.length &amp;lt; 1){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert('내용을 입력하세요.');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; socket.emit('sendMessage', {message:message});&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $('#inputMessage').val('');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class=&quot;lobby container&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;button id=&quot;btnRequestRandomChat&quot; class=&quot;btn&quot;&amp;gt;채팅입장&amp;lt;/button&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class=&quot;wait container&quot; style=&quot;display:none&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;상대방을 기다리는 중...&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;button id=&quot;btnCancelRequest&quot; class=&quot;btn&quot;&amp;gt;취소&amp;lt;/button&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class=&quot;chat container&quot; style=&quot;display:none&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input type=&quot;text&quot; id=&quot;inputMessage&quot; class=&quot;input-medium search-query&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;button type=&quot;submit&quot; id=&quot;btnChat&quot; class=&quot;btn&quot;&amp;gt;전송&amp;lt;/button&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ul class=&quot;chatResult&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ul&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;이상입니다.&lt;/p&gt;&lt;p&gt;heroku에도 올려봤어요.&lt;br /&gt;&lt;a href=&quot;http://random-chat.herokuapp.com/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://random-chat.herokuapp.com/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;소스는 github에.....&lt;br /&gt;&lt;a href=&quot;https://github.com/mudchobo/nodejs-random_chat&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://github.com/mudchobo/nodejs-random_chat&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Node.js</category>
      <author>머드초보</author>
      <guid isPermaLink="true">https://mudchobo.tistory.com/540</guid>
      <comments>https://mudchobo.tistory.com/540#entry540comment</comments>
      <pubDate>Wed, 26 Jun 2013 17:36:22 +0900</pubDate>
    </item>
    <item>
      <title>[Node.js] socket.io에 redis를 이용해서 여러 서버에서 사용하기</title>
      <link>https://mudchobo.tistory.com/539</link>
      <description>&lt;p&gt;socket.io는 일단 기본 store가 메모리 기반이여서 프로세스를 하나 띄우면 거기서 밖에 socket.io 접속자들을 공유를 못해요. 그래서 socket.io에서는 store를 redis로 변경해서 여러 프로세스에서도 공유를 할 수 있는 옵션을 제공을 해요.&lt;/p&gt;&lt;pre style=&quot;font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; margin-top: 15px; margin-bottom: 15px; background-color: rgb(248, 248, 248); border: 1px solid rgb(221, 221, 221); line-height: 19px; overflow: auto; padding: 6px 10px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;&quot;&gt;&lt;span class=&quot;kd&quot; style=&quot;font-weight: bold;&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;RedisStore&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;font-weight: bold;&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot; style=&quot;color: rgb(221, 17, 68);&quot;&gt;'socket.io/lib/stores/redis'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;redis&lt;/span&gt;  &lt;span class=&quot;o&quot; style=&quot;font-weight: bold;&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot; style=&quot;color: rgb(221, 17, 68);&quot;&gt;'socket.io/node_modules/redis'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;pub&lt;/span&gt;    &lt;span class=&quot;o&quot; style=&quot;font-weight: bold;&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;redis&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;createClient&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;sub&lt;/span&gt;    &lt;span class=&quot;o&quot; style=&quot;font-weight: bold;&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;redis&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;createClient&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;font-weight: bold;&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;redis&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;createClient&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;io&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot; style=&quot;color: rgb(221, 17, 68);&quot;&gt;'store'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot; style=&quot;font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;RedisStore&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;redisPub&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;font-weight: bold;&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;pub&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;redisSub&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;font-weight: bold;&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;sub&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;redisClient&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;font-weight: bold;&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}));&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;이렇게 하면 된답니다.&lt;/p&gt;&lt;p&gt;그래서 한 번 해보면, redis를 설치해야해요. 저는 windows환경이라 virtualbox에 ubuntu설치하고 redis를 설치했어요. 아 그리고 나중에 redis도 1대로 못버티면 redis도 clustering해야하는데, 이건 나중에 삽질 해보고....&lt;/p&gt;&lt;p&gt;이게 원리가 redis에서 제공하는 pub/sub기능을 이용해서 하는건데, 하나의 서버에서 pub/sub를 만들고 연결해놓고 나중에 현재 서버에서 접속이 들어오면 다른 서버들에 publish를 해서 알려주고, 다른 서버는 구독중이기에 연결된 데이터를 받을 수 있습니다.&lt;/p&gt;&lt;p&gt;대략 소스는 이러합니다.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;server.js&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;var redisInfo = {&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; host: '192.168.56.1',&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; port: 6379&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;};&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;var app = require('http').createServer(handler),&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; io = require('socket.io').listen(app),&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fs = require('fs'),&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RedisStore = require('socket.io/lib/stores/redis'),&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; redis = require('socket.io/node_modules/redis'),&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pub = redis.createClient(redisInfo.port, redisInfo.host),&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sub = redis.createClient(redisInfo.port, redisInfo.host),&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; client = redis.createClient(redisInfo.port, redisInfo.host);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;if (process.argv.length &amp;lt; 3){&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; console.log('ex) node app &amp;lt;port&amp;gt;');&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; process.exit(1);&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;app.listen(process.argv[2]);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;function handler(req, res) {&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fs.readFile(__dirname + '/index.html',&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; function (err, data) {&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (err) {&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; res.writeHead(500);&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return res.end('Error loading index.html');&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; res.writeHead(200);&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data = data.toString('utf-8').replace('&amp;lt;%=host%&amp;gt;', req.headers.host);&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; res.end(data);&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;io.configure(function(){&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; io.set('store', new RedisStore({&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; redisPub: pub,&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; redisSub : sub,&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; redisClient : client&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }));&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;});&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;io.sockets.on('connection', function (socket) {&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; socket.on('message', function(data){&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; socket.broadcast.emit('message', data);&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;});&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;index.html&lt;/p&gt;&lt;div style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;lt;html&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;lt;head&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;socketio redis store&amp;lt;/title&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script type=&quot;text/javascript&quot; src=&quot;http://code.jquery.com/jquery-1.10.1.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script type=&quot;text/javascript&quot; src=&quot;/socket.io/socket.io.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var socket = io.connect('http://&amp;lt;%=host%&amp;gt;');&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(document).ready(function(){&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; socket.on('message', function(data){&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $('#chat').append('&amp;lt;li&amp;gt;' + data.message + '&amp;lt;/li&amp;gt;');&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $('#btnSend').click(function(){&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; send();&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $('#inputText').keyup(function(e){&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (e.keyCode == 13){&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; send();&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; function send(){&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var message = $('#inputText').val();&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (message.length &amp;lt; 1){&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; socket.emit('message', {message:message});&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $('#chat').append('&amp;lt;li&amp;gt;' + message + '&amp;lt;/li&amp;gt;');&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $('#inputText').val('');&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; socketio redis store...&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input type=&quot;text&quot; id=&quot;inputText&quot; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;button id=&quot;btnSend&quot;&amp;gt;보내기&amp;lt;/button&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ul id=&quot;chat&quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ul&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Verdana;&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;node app.js 10001&lt;/p&gt;&lt;p&gt;node app.js 10002&lt;/p&gt;&lt;p&gt;두 개 띄워놓고 localhost:10001, localhost:10002 접속하면 두 서버에서 같은 방에 있는 것처럼 채팅을 할 수 있습니다.&lt;/p&gt;&lt;p&gt;redis는 기본적으로 127.0.0.1로 bind를 해서 외부에서 접속을 할 수 없습니다. 그래서 /etc/redis/redis.conf 파일을 수정해서 bind 127.0.0.1을 주석처리하거나 알맞게 수정하시면 됩니다.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;socket.io는 참 잘해놓은게 다른 것은 전혀 신경쓸 것이 없이 store옵션만 바꾸어서 socket들의 정보 저장위치를 변경하게 만들어 놨습니다. 나중에 서버 확장을 할 때에도 매우 쉽게 할 수 있습니다.(하지만, redis clustering 조회해보고 있는데 힘들어보이는.....)&lt;/p&gt;&lt;p&gt;소스는 github에.......&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/mudchobo/nodejs-socketio_redis_store&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://github.com/mudchobo/nodejs-socketio_redis_store&lt;/a&gt;&lt;/p&gt;</description>
      <category>Node.js</category>
      <category>Node</category>
      <category>node.js</category>
      <category>Redis</category>
      <category>socket.io</category>
      <category>프로그래밍</category>
      <author>머드초보</author>
      <guid isPermaLink="true">https://mudchobo.tistory.com/539</guid>
      <comments>https://mudchobo.tistory.com/539#entry539comment</comments>
      <pubDate>Tue, 25 Jun 2013 11:47:34 +0900</pubDate>
    </item>
    <item>
      <title>[git] 서버에 hooks을 이용해서 push 후 자동으로 웹서버에 배포하기</title>
      <link>https://mudchobo.tistory.com/538</link>
      <description>&lt;p&gt;제목이 뭔가 거창한데, 그냥 소스파일을 그대로 원하는 웹서버에 배포하는 내용입니다. java 개발인 경우에는 뭐 필요없지만, php인 경우에는 컴파일이 필요없이 웹서버에 복사만 하면 되는 경우라 이 방법을 택했습니다. &lt;br /&gt;개인별로 개발하고 푸쉬타임에 해당 웹서버에 배포하게 되어서 서버에서 테스트해볼 수 있는 구조를 만드려고 했습니다.&lt;br /&gt;&lt;br /&gt;환경은 gitolite + gitlab으로 설치되어 있는 환경입니다.&lt;br /&gt;&lt;br /&gt;구조는 간단합니다.&lt;br /&gt;배포하려는 서버에 git을 clone을 합니다. 그리고, 서버훅을 이용해서 push 후에 스크립트를 실행할 수 있는 스크립트를 실행해서 그 서버에서 pull을 하거나 reset을 하면 됩니다.&lt;br /&gt;이 구조는 git서버, 배포서버, 로컬 이렇게 다 나눠진 경우입니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. 배포할 서버에 git서버 공개키 추가&lt;/b&gt;&lt;br /&gt;이걸 하는 이유가 서버와 git서버가 틀린 경우에 하는 겁니다. git서버에서 해당 배포서버에 비번없이 접속하려고 하다보니 ssh키가 필요합니다. &lt;br /&gt;git서버로 접속해서 ssh키를 생성합니다.&lt;br /&gt;&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(243, 197, 52); background-color: rgb(254, 254, 184); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;sudo su git&lt;br /&gt;ssh-keygen -t rsa&lt;br /&gt;cd ~/.ssh&lt;br /&gt;cat id_rsa.pub&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;id_rsa.pub 파일을 복사해서 배포할 서버의 ~/.ssh 디렉토리 안에 authorized_keys 파일을 생성해서 붙여넣습니다. 그럼 이제, git -&amp;gt; 배포서버에서 ssh접속 시 비밀번호 없이 접속할 수 있습니다.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;2. 해당 서버에 공개키를 git서버에 추가&lt;/b&gt;&lt;br /&gt;이걸 하는 이유는 해당 서버에서 git서버에서 clone을 받아야 하기 때문입니다. 즉 서로 등록이 필요한 것이죠. 으핫. 위와 동일한 방법으로 ssh-keygen으로 생성합니다. 그리고 id_rsa.pub파일을 복사해서 authorized_keys파일에 추가합니다. gitlab을 사용하고 있다면 사용자 ssh키 등록만 해주면 되겠죠?&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;b&gt;3. 해당 배포 디렉토리에 git clone하기&lt;/b&gt;&lt;br /&gt;소스가 있는 git repository를 해당 배포할 디렉토리에 clone을 합니다. 저는 일단 아파치 기본 폴더에 했습니다. 일단 clone 시에는 다 지워야해서... 다 지우고 clone!&lt;br /&gt;&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(243, 197, 52); background-color: rgb(254, 254, 184); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;cd /var/www&lt;br /&gt;rm -rf *&lt;br /&gt;cd ..&lt;br /&gt;git clone 해당git주소(ex:git@domain:mudchobo.git) www&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;이렇게 하면 /var/www가 해당 repository가 되어버립니다. 루트가 되어버리는 것이죠.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4. hooks 설정&lt;/b&gt;&lt;br /&gt;일단 해당 서버에 pull을 하는 스크립트를 작성해서 스크립트가 실행될 수 있게 합니다.&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(243, 197, 52); background-color: rgb(254, 254, 184); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;vi /var/www/pull.sh&lt;br /&gt;cd /var/www/&lt;br /&gt;
git pull origin&lt;br /&gt;
:wq&lt;br /&gt;
chmod +x pull.sh&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;gitolite로 설치를 해서 해당 서버훅을 사용하려면 git계정으로 접속하면 repositories 디렉토리에 hooks 관련 
스크립트 디렉토리가 있습니다. 여기서 post-update 스크립트에 넣으면 client에서 push를 할 때 실행되게 됩니다. &lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(243, 197, 52); background-color: rgb(254, 254, 184); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;cd /home/git/repositories/mudchobo.git/hooks&lt;br /&gt;
vi post-update&lt;br /&gt;
ssh mudchobo@서버주소 &quot;/var/www/pull.sh&quot;&lt;br /&gt;
:wq&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;여기서 post-update를 한 번 실행을 해줘서 신뢰할 수 있는 사이트에 등록을 해줘야합니다. 스크립트 실행 시 한번에 다 실행이 되야해서 yes/no 물음이 없어야 하거든요. 그래서 한번 실행해서 신뢰할 수 있는 사이트에 등록합니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5. 클라이언트에서 push하기&lt;/b&gt;&lt;br /&gt;이제 다른 pc에서 push하면 바로 해당 서버에서 자동으로 pull이 되게 됩니다. 그래서 push타임에 서버에 배포되는 것처럼 되는 것이지요.&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(243, 197, 52); background-color: rgb(254, 254, 184); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;vi index.php&lt;br /&gt;&amp;lt;?php&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; phpinfo();&lt;br /&gt;?&amp;gt;&lt;br /&gt;:wq&lt;br /&gt;git add .&lt;br /&gt;git commit -m &quot;index add&quot;&lt;br /&gt;git push origin&lt;br /&gt;Counting objects: 5, done.&lt;br /&gt;Delta compression using up to 2 threads.&lt;br /&gt;Compressing objects: 100% (2/2), done.&lt;br /&gt;Writing objects: 100% (3/3), 282 bytes, done.&lt;br /&gt;Total 3 (delta 0), reused 0 (delta 0)&lt;br /&gt;remote: From localhost:mudchobo&lt;br /&gt;remote:&amp;nbsp;&amp;nbsp;&amp;nbsp; 3455f24..308e01a&amp;nbsp; master&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;gt; origin/master&lt;br /&gt;remote: Updating 3455f24..308e01a&lt;br /&gt;remote: Fast-forward&lt;br /&gt;remote:&amp;nbsp; index.php |&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 +&lt;br /&gt;remote:&amp;nbsp; 1 file changed, 1 insertion(+)&lt;br /&gt;To git@192.168.198.130:mudchobo.git&lt;br /&gt;&amp;nbsp;&amp;nbsp; 3455f24..308e01a&amp;nbsp; master -&amp;gt; master&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;저희는 일단 이렇게 쓰려고 지금 셋팅을 하고 있는데.....제대로 된 것이 맞는지 의문이네요. 하다가 잘 안되면 다시 방법이 바뀔지도......ㅠㅠ&lt;br /&gt;&lt;/p&gt;</description>
      <category>유틸리티 활용하기</category>
      <author>머드초보</author>
      <guid isPermaLink="true">https://mudchobo.tistory.com/538</guid>
      <comments>https://mudchobo.tistory.com/538#entry538comment</comments>
      <pubDate>Tue, 1 May 2012 19:17:55 +0900</pubDate>
    </item>
    <item>
      <title>[GITLAB] GITLAB 우분투(Ubuntu) 서버에 설치하기</title>
      <link>https://mudchobo.tistory.com/537</link>
      <description>&lt;p&gt;회사에서 git를 도입하려고 하는데, 그래서 막 조사하다보니 github enterprise같은 게 있더라구요. 근데, 이건 한 달에 $20 금액을 내야해서 너무 비쌌습니다. 그래서 오픈소스로 github같은 UI의 툴이 있더라구요. 그게 GITLAB입니다.&lt;br /&gt;&lt;br /&gt;이거 근데 설치하는데 너무 힘들어서.......설치하다가 빡칠 뻔했습니다. 근데, 회사에선 오래 걸렸는데, 집에서 다시 와서 차근차근 해보니 금방 설치했네요. 뭔가 좀 이해를 하고 설치를 하니까 금방 설치한 것 같네요.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아 우분투는 최신버전인 12.04 버전을 사용했습니다.&lt;/p&gt;&lt;p&gt;gitlab 사이트입니다.&lt;br /&gt;&lt;a class=&quot;tx-link&quot; target=&quot;_blank&quot; href=&quot;http://gitlabhq.com/&quot;&gt;http://gitlabhq.com/&lt;/a&gt;&lt;br /&gt;보면 사이트에서 Try It을 하면 체험할 수 있어요. &lt;br /&gt;&lt;br /&gt;아래 문서는 gitlab 공식 설치 페이지입니다.&lt;br /&gt;&lt;a class=&quot;tx-link&quot; target=&quot;_blank&quot; href=&quot;https://github.com/gitlabhq/gitlabhq/blob/master/doc/installation.md&quot;&gt;https://github.com/gitlabhq/gitlabhq/blob/master/doc/installation.md&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;이 문서대로 보고 하면 잘 되야는데, 저 같은 경우에는 뭔가 삑사리가 몇 번 났습니다. 뭔가 설치가 안되어있다고 자주 떴는데, 그래서 이것저것 모아보니 apt-get install로 이것저것 많이 설치해줘야 하더라구요.&lt;br /&gt;제가 설치한 히스토리를 정리합니다.&lt;br /&gt;&lt;br /&gt;요거 아래 것처럼 이렇게 많이 설치합니다.&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(243, 197, 52); background-color: rgb(254, 254, 184); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;sudo apt-get install build-essential git-core wget curl gcc checkinstall libxml2-dev libxslt-dev sqlite3 libsqlite3-dev libcurl4-openssl-dev libreadline-dev libc6-dev libssl-dev libmysql++-dev make build-essential zlib1g-dev libicu-dev redis-server openssh-server python-dev python-pip libyaml-dev&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;그 다음 공식사이트에서 제공하는 루비 + gitolite를 한번에 설치해주는 스크립트를 실행합니다.&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(243, 197, 52); background-color: rgb(254, 254, 184); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;curl https://raw.github.com/gitlabhq/gitlabhq/master/doc/debian_ubuntu.sh | sh&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;근데, 저 같은 경우에는 마지막에 뭔가 퍼미션 에러랑 패스에러가 같이 나면서 설치가 잘 안된 것 같았습니다. 그래서 이 부분을 다시 했습니다. 이런 에러가 떴었어요.&lt;/p&gt;&lt;p&gt;&amp;nbsp;***** WARNING *****&lt;br /&gt;gl-setup is not in your $PATH.&lt;br /&gt;&lt;br /&gt;Since gl-setup MUST be run from the PATH (and not as src/gl-setup or such),&lt;br /&gt;you must fix this before running gl-setup.&amp;nbsp; The simplest way is to add&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PATH=/home/git/bin:$PATH&lt;br /&gt;&lt;br /&gt;to the end of your bashrc or similar file.&amp;nbsp; You can even simply run that&lt;br /&gt;command manually each time you log in and want to run a gitolite command.&lt;br /&gt;&lt;br /&gt;그래서 패스잡아주는 게 잘 안된 것 같아 .profile만드는 부분 부터 다시 했습니다.&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(243, 197, 52); background-color: rgb(254, 254, 184); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;sudo -u git sh -c 'echo &quot;PATH=\$PATH:/home/git/bin\nexport PATH&quot; &amp;gt; /home/git/.profile'&lt;br /&gt;sudo -u git -i -H /home/git/gitolite/src/gl-system-install&lt;br /&gt;sudo cp /home/gitlab/.ssh/id_rsa.pub /home/git/gitlab.pub&lt;br /&gt;sudo chmod 777 /home/git/gitlab.pub&lt;br /&gt;&lt;br /&gt;sudo -u git -H sed -i 's/0077/0007/g' /home/git/share/gitolite/conf/example.gitolite.rc&lt;br /&gt;sudo -u git -H sh -c &quot;PATH=/home/git/bin:$PATH; gl-setup -q /home/git/gitlab.pub&quot;&lt;br /&gt;&lt;br /&gt;sudo chmod -R g+rwX /home/git/repositories/&lt;br /&gt;sudo chown -R git:git /home/git/repositories/&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;sudo -u gitlab -H git clone git@localhost:gitolite-admin.git /tmp/gitolite-admin&lt;br /&gt;sudo rm -rf /tmp/gitolite-admin&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;해보니 테스트로 잘 받아지고, 잘 삭제가 되었습니다.&lt;br /&gt;그 다음 문서에 4단계부터 하는 것은 그대로 진행하면 잘 됩니다.&lt;br /&gt;&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(243, 197, 52); background-color: rgb(254, 254, 184); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;sudo gem install charlock_holmes&lt;br /&gt;sudo pip install pygments&lt;br /&gt;sudo gem install bundler&lt;br /&gt;cd /home/gitlab&lt;br /&gt;sudo -H -u gitlab git clone git://github.com/gitlabhq/gitlabhq.git gitlab&lt;br /&gt;cd gitlab&lt;br /&gt;sudo -u gitlab cp config/gitlab.yml.example config/gitlab.yml&lt;br /&gt;sudo -u gitlab cp config/database.yml.sqlite config/database.yml&lt;br /&gt;sudo -u gitlab -H bundle install --without development test --deployment&lt;br /&gt;sudo -u gitlab bundle exec rake gitlab:app:setup RAILS_ENV=production&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;이렇게 하면 설치가 잘 됩니다. 또 저 같은 경우에는 pygments 설치하다가 잠시 다운로드 에러가 나서 안된 경우도 있었는데, 에러가 났는지 잘 확인하시고, 에러나면 다시 시도해서 하면 될 것 같습니다.&lt;br /&gt;&lt;br /&gt;그 다음 서버를 시작하면 끝입니다.&lt;br /&gt;&lt;/p&gt;&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(243, 197, 52); background-color: rgb(254, 254, 184); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;&lt;p&gt;sudo -u gitlab bundle exec rails s -e production -d&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;http://서버ip:3000/ 하면 로그인 하라고 뜨고, 로그인 아이디와 비번은 db셋팅할 때 나오는 것처럼 &lt;br /&gt;admin@local.host&lt;br /&gt;5iveL!fe&lt;br /&gt;하면 됩니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 500px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/1758A7434F9F7F6633&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F1758A7434F9F7F6633&quot; width=&quot;500&quot; height=&quot;350&quot; filename=&quot;11.png&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;PS. 블로그를 보니 5월 22일에 3.0릴리즈를 준비중인 것 같은데, 코드를 최적화해서 할 것 같은데, 설치도 간편하게 만드는 게 더 중요할 듯?ㅠㅠ&lt;br /&gt;&lt;/p&gt;</description>
      <category>유틸리티 활용하기</category>
      <author>머드초보</author>
      <guid isPermaLink="true">https://mudchobo.tistory.com/537</guid>
      <comments>https://mudchobo.tistory.com/537#entry537comment</comments>
      <pubDate>Tue, 1 May 2012 14:56:12 +0900</pubDate>
    </item>
    <item>
      <title>[책] Javascript 자바스크립트 성능 최적화...</title>
      <link>https://mudchobo.tistory.com/536</link>
      <description>최근 자바스크립트가 급부상하면서 자바스크립트 관련된 책을 여러 개 읽고 있습니다. 진짜 보면서 느끼는 게 내가 지금까지 병신같이 개발해왔구나 라는 생각이 많이 드네요.&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;table key='0nVbj' category='book_detail' openpost='false' width='374' height='105' cellpadding='12' cellspacing='0' border='0' style='border:1px #F3F3F3 solid; background-color:#ffffff; line-height:16px !important;'&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td style='padding-bottom:0px'&gt;
 &lt;table width='350' cellpadding='0' cellspacing='0' border='0'&gt;
 &lt;tbody&gt;&lt;tr&gt;
  &lt;td width='68' valign='top'&gt;&lt;a href='http://book.daum.net/detail/book.do?bookid=KOR9788979148558' target='_blank'&gt;&lt;img width='55' height='80' src='http://book.daum-img.net/R72x100/KOR9788979148558' border='0'/&gt;&lt;/a&gt;&lt;/td&gt;
 
  &lt;td width='12'&gt;&lt;/td&gt;
  &lt;td width='278' valign='top'&gt;
   &lt;table width='100%' cellpadding='0' cellspacing='0' border='0'&gt;
   &lt;tbody&gt;&lt;tr&gt;
    &lt;th height='18' colspan='2' align='left' valign='top'&gt;
     &lt;font style='font-size:12px; font-weight:bold; color:#333333; font-family:굴림,gulim,sans-serif;'&gt;&lt;a style='color:#333333 !important;text-decoration:none !important;' href='http://book.daum.net/detail/book.do?bookid=KOR9788979148558' target='_blank'&gt;JavaScript자바스크립트성능최적화&lt;/a&gt;&lt;/font&gt;
    &lt;/th&gt;
   &lt;/tr&gt;
   &lt;tr&gt;
    &lt;td width='55' height='18' align='left' valign='top'&gt;
     &lt;font style='font-size:12px; color:#999999; font-family:굴림,gulim,sans-serif; line-height:1.4;'&gt;카테고리&lt;/font&gt;
    &lt;/td&gt;
    &lt;td height='18' align='left' valign='top'&gt;
     &lt;span style='display:block; float:left; height:14px; overflow:hidden; text-overflow:ellipsis;'&gt;&lt;font style='font-size:12px; color:#333333; font-family:굴림,gulim,sans-serif; line-height:1.4;'&gt;컴퓨터/IT &gt; 프로그래밍/언어&lt;/font&gt;&lt;/span&gt;
    &lt;/td&gt;
   &lt;/tr&gt;
   &lt;tr&gt;
    &lt;td width='55' height='36' align='left' valign='top'&gt;
     &lt;font style='font-size:12px; color:#999999; font-family:굴림,gulim,sans-serif; line-height:1.4;'&gt;지은이&lt;/font&gt;
    &lt;/td&gt;
    &lt;td height='36' align='left' valign='top'&gt;
     &lt;span style='display:block; float:left; height:14px; overflow:hidden; text-overflow:ellipsis;'&gt;&lt;font style='font-size:12px; color:#333333; font-family:굴림,gulim,sans-serif; line-height:1.4;'&gt;니콜라스 자카스 (한빛미디어, 2011년)&lt;/font&gt;&lt;/span&gt;
    &lt;/td&gt;
   &lt;/tr&gt;
   &lt;tr&gt;
    &lt;td colspan='2' align='left' valign='top'&gt;
     &lt;a style='padding:0px 5px 0px 0px; background:url(http://deco.daum-img.net/contents/info/ic_more.gif) no-repeat 100% 3px; font-size:11px; color:#999999 !important; font-family:돋움,dotum,verdana; text-decoration:underline;' href='http://book.daum.net/detail/book.do?bookid=KOR9788979148558' target='_blank'&gt;상세보기&lt;/a&gt;
    &lt;/td&gt;
   &lt;/tr&gt;
   &lt;/table&gt;
  &lt;/td&gt;
 
 &lt;/tr&gt;
&lt;/tbody&gt;
 &lt;/table&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;보니까 야후에서 YUI라는 라이브러리가 있는데, 그걸 만든 사람이 쓴 것 같아요. 그걸 만든 사람 시리즈 중에 자바스크립트 패턴이라고 있는데, 그것도 같이 보고 있어요.&lt;br /&gt;
&lt;br /&gt;일단, 다 읽어보면 매우 기본적인 내용을 바탕으로 하고 있습니다. 이렇게 쓰면 더 빠르다는 것을 주로 강조를 하며 빠르게 사용할 수 있는 여러 방법을 제시합니다. 보면 대부분 매우 간단하거나 쉽게 적용할 수 있는 내용이 많습니다. 이런 것들을 하나하나 모으면 사이트가 정말 최적화가 잘 되겠죠. 좋은 책인 것 같습니다. 그래서 우리가 만든 사이트들이 너무 느리다는 것을 이 책을 읽고 깨닫게 되었죠ㅠㅠ&lt;br /&gt;
&lt;br /&gt;1. 로딩과 실행&lt;br /&gt;
첫번째 장에서는 스크립트 위치와 로딩하는 순서에 대해서 간단히 얘기합니다. 보면 동적으로도 로딩하는 방법이 나옵니다. 이런 식으로도 스크립트를 삽입할 수 있는지 몰랐네요. 뭐 결론은 스크립트 태그를 포함하는 파일을 최소화하고 UI표시에 영향을 주지 않게 하는 것이 가장 큰 목적이겠네요.&lt;br /&gt;
&lt;br /&gt;2. 데이터접근&lt;br /&gt;
Javascript 코딩할 때 this가 짜증나서 전역변수를 선언해서 그냥 쓰거나 매번 document에 접근해서 쓰거나 뭐 이런 식의 코딩을 많이 했는데, 이런 전역변수를 계속 쓰게 되면 엔진이 스코프를 뒤지면서 계속 찾아야하니 느려진다는 것입니다. 그래서 지역변수를 주로 쓰는 것을 말하고 있고, 객체멤버 깊이도 줄여서 선언 및 사용해야 한다는 것을 설명하고 있네요.&lt;br /&gt;
&lt;br /&gt;3. DOM 스크립팅&lt;br /&gt;
DOM을 컨트롤하기 위해서는 DOM을 객체에서 찾거나 생성해야 해요. 찾으려면 selector를 통해 찾아야하고, 생성하려면 createElement를 통해 생성해야 해요. 그래서 이 책이 얘기하는 것은 비표준이더라도 innerHTML이나 querySelectorAll같은 함수를 활용하여 처리하는 게 빠르게 해결할 수 있는 것이라고 하네요. 그 외에 리페인트와 리플로우 개념에 대해서는 꼭 이해를 하고 가야 더욱 빠르게 dom을 추가하고 수정할 수 있다는 걸 설명하네요.&lt;br /&gt;
&lt;br /&gt;4. 알고리즘과 흐름 제어&lt;br /&gt;
루프는 뭐 다 비슷한데, 반복문이라면 length값 캐쉬하는 게 가장 중요합니다. 그 외에 반복횟수 줄이거나 그런 것들은 여러 프로그래밍 개발 언어에서도 충분히 적용될만한 내용이네요. 재귀함수(전 재귀가 싫어요.....-_-)에 대해서 캐쉬를 하는 메모이제이션 내용도 뭐 다른 프로그래밍 개발에도 잘 쓰이는 내용이네요.&lt;br /&gt;
&lt;br /&gt;5. 문자열과 정규 표현식&lt;br /&gt;
정규식은.......좀 더 공부를 해봐야겠습니다......&lt;br /&gt;
&lt;br /&gt;6. 응답성좋은 인터페이스&lt;br /&gt;
클릭과 동시에 반응하는 웹이야 말로 제대로 된 웹이겠지요. 뭐 html5의 내용인 웹워커 내용이 있는데, 이건 뭐 적용할 수 없죠. IE에서 지원을 안하니... 내용은 타이머를 통해 오래걸리는 처리는 처리에 맡기고 반응은 타이머콜백을 통해 빨리빨리 보이겠다는 것입니다. 근데 내용을 좀 이해할 수 없군요....-_- 좀 더 읽어봐야겠네요...&lt;br /&gt;
&lt;br /&gt;7. Ajax&lt;br /&gt;
일반적인 ajax내용이고, 비콘이라는 Image태그를 이용해서 서버에 보내는 재미있는 내용이 있네요. 그냥 단순히 쏘기만 할 때 좋은 듯. 그 외에 데이터포맷은 뭐가 빠른지에 대해서 설명이 되어있네요. json이 역시 짱이죠 ㅇㅇ&lt;br /&gt;
&lt;br /&gt;8. 프로그래밍 사례&lt;br /&gt;
eval, function 뭐 이런거 앵간해서는 쓰지말고, 객체 배열 리터럴 쓰고, 작업을 반복하지 말고, 뭐 읽어보면 매우 간단한 내용들이 있는데, 우리들이 개발하다보면 빨리 개발하다가 지나칠 수 있는 내용들이 많이 있습니다. 그리 어렵지 않으니 잘 읽고 잘 적용하면 좋을 듯 합니다.&lt;br /&gt;
&lt;br /&gt;9. 고성능 자바스크립트 애플리케이션 빌드와 배포&lt;br /&gt;
js 압축에 대해서 다룹니다. 뭐 압축하면 용량도 줄어들고, 변수명도 바뀌니 빨라지겠죠&lt;br /&gt;
&lt;br /&gt;10. 도구&lt;br /&gt;
여러 도구를 소개하고 있습니다. YUI 개발자들이라고 YUIProfiler도 소개하고... 도구는.....파이어버그, 크롬개발자 도구 이런 게 짱이죠.&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
PS. 크롬은 정말 성능이 좋은 것 같습니다. 그래서 제가 그지같이 개념없이 JS개발을 해도 크롬은 그걸 다 받아주며 빠르게(?) 동작시켜줘서 너무 고마웠네요. 근데, 확실히 IE에서는 느려요ㅠ 이 책을 교훈삼아 IE에서도 빠르게 동작하는 자바스크립트 개발을 해야겠네요.&lt;br /&gt;</description>
      <category>자바스크립트(Javascript)</category>
      <author>머드초보</author>
      <guid isPermaLink="true">https://mudchobo.tistory.com/536</guid>
      <comments>https://mudchobo.tistory.com/536#entry536comment</comments>
      <pubDate>Thu, 22 Mar 2012 11:32:56 +0900</pubDate>
    </item>
    <item>
      <title>제12회 한국자바개발자 컨퍼런스 다녀왔습니다~!</title>
      <link>https://mudchobo.tistory.com/535</link>
      <description>주말에 이렇게 헛되이 보내지 않고, 이런 행사를 다녀와서 너무 좋네요~ 개발자들을 위한 행사가 점점 더 많아졌으면 좋겠네요. 혼자서 최신 기술이나 동향에 대해서 조사하는 것은 너무 힘들거든요~ 여기오면 매번 좋은 정보를 많이 얻고 가서 좋은 것 같습니다.&lt;br /&gt;
&lt;br /&gt;
그러나, 요즘 제가 공부를 너무 게을리한 탓에... 여러 세션 제목들이 무엇을 말하려는지 감이 잘 안오더라구요. 여러 편리한 툴들과 새로운 프레임워크 등을 많이 알고 간 것 같습니다. 그리고 제가 들은 세션은 대용량관련된 세션이라 캐쉬관련된 내용도 많이 들었던 것 같네요. 얼른 공부를 시작해야겠네요 핫핫~ 못들은 세션에 대해서 PT자료를 공유하겠죠? 얼른 PT자료를 받았으면 좋겠네요^^&lt;br /&gt;
&lt;br /&gt;
제가 들은 세션은 대략 이런 내용이였습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: 12pt; &quot;&gt;1. 아키텍트가 알아야할 12/97가지&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
97가지가 있었던 것 같은데, 12가지만 얘기를 하신 것 같네요. 주로 정말 당연한 얘기지만, 잘 지켜지지 않은 것들에 대해서 말씀을 잘해주셨어요. &lt;br /&gt;
Vasa호 얘기는 우리 소프트웨어구조에 정말 잘 맞는 비유였던 것 같아요. 물론 소프트웨어는 배와 달라서 모든 것을 잘 만족시키게 만들 수는 있지만, 우선순위를 중요시하고 이 프로젝트의 목표에 대해서 정확하게 이해를 해야 좀 더 나은 프로젝트가 탄생할 것 같습니다. &lt;br /&gt;
그리고 가장 공감이 갔던 것이 걸어다니는 해골인데, 확실히 어느정도 돌아가는 구현체를 보여줘야 거기에 대한 피드백이 나오면서 좀 더 완전체로 다가가는 것 같습니다. &lt;br /&gt;
그리고 아키텍트는 너무 멀리도 가까이도 보지말고 적당히 봐야한다는 1000피트의 뷰도 공감이 갔던 것 같고... 그리고 아키텍트입장에서 좋은 툴을 하나 소개해줬는데, STAN 인가.. 대략찾아보니 이거 같네요. &lt;br /&gt;
&lt;a target=&quot;_blank&quot; href=&quot;http://stan4j.com/&quot;&gt;http://stan4j.com/&lt;/a&gt;&lt;br /&gt;
이걸로 해당 프로젝트의 구조를 분석하고 잘못된 것을 알려주는 툴 같습니다.&lt;br /&gt;
그 외에 가장 중요한 것은 사람중심의 관한 것이기에... 사람들관의 커뮤니케이션, 대화가 참 중요하다는 것을 강조한 것 같습니다.&lt;br /&gt;
앞으로 저도 레베루가 올라가면서 아키텍트로 다가가게될텐데 저에게 참 도움이 되는 내용이였네요.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;
&lt;span style=&quot;font-size: 12pt; &quot;&gt;2. JBoss RHQ와 Byteman을 이용한 오픈소스 자바 애플리케이션 모니터링&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
JBoss는 어디서 많이 듣긴했는데 무슨 제품인 줄 알았는데, 그게 아니더군요. JBoss는 자바를 기반으로 하는 오픈소스 미들웨어의 총칭이라고 하네요. &lt;br /&gt;
&lt;a target=&quot;_blank&quot; href=&quot;http://ko.wikipedia.org/wiki/%EC%A0%9C%EC%9D%B4%EB%B3%B4%EC%8A%A4&quot;&gt;http://ko.wikipedia.org/wiki/%EC%A0%9C%EC%9D%B4%EB%B3%B4%EC%8A%A4&lt;/a&gt;&lt;br /&gt;
JBoss에는 여러 미들웨어가 있더군요. 그 중 Hibernate도 있네요. 원래 여기였는지 여기로 옮긴건지 모르겠지만, WAS도 있고....&lt;br /&gt;
이 중에 RHQ와 Byteman이라는 것을 소개했는데, RHQ는 운영서비스모니터링툴이였고, Byteman은 JVM을 bytecode로 들여다보는 것이라고 했습니다.&lt;br /&gt;
RHQ는 뭐 흔한 웹서버의 모니터링 툴인 것 같은데, Byteman이라는 것에 대해서 좀 신기했습니다. 애플리케이션을 개발하게 되면 그 애플리케이션을 실행하는 JVM을 통해서 메소드의 시작과 끝을 캐치를 한다던가 하는 룰을 입력하면 그것대로 모니터링을 할 수 있는 툴인 것 같습니다. 제 설명이 뭐 이상하지만 나중에 PT를 보시면 쉽게 이해가 갈 겁니다ㅠ&lt;br /&gt;
RHQ의 모니터링UI는 참으로 이뻤으며, Byteman의 동작원리는 놀라웠다는 느낌을 받은 발표였네요.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;
&lt;span style=&quot;font-size: 12pt; &quot;&gt;3. 초보자를 위한 분산 캐시 활용 전략&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
음......이때부터 좀 졸리더니....내용이 잘 생각이 안나네요ㅠ 분명 Memcached얘기가 좀 나온 것 같은데... 변화하는 데이터와 변화하지 않는 데이터를 잘 나눠라는 것과 디비의 저장할 때 해쉬얘기도 좀 나온 것 같은데, 기억이 잘 안나네요. Radis라는 것도 나온 것 같은데, 이건 뭔지 모르겠네요. DB인가...역시 아직 대용량과 캐쉬에 대해서 너무 모르는 부분이 많네요ㅠㅠ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;
&lt;span style=&quot;font-size: 12pt; &quot;&gt;4. 대용량 고가용성 분산 캐쉬서버(infinispan)를 활용한 웹서비스&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
이건 분산캐쉬서버인 inifinispan이라는 것을 소개하는 시간이였는데요. 이것도 JBoss에서 크고 있는 오픈소스네요^^ JBoss에는 참 훌륭한 제품들이 많은 듯!&lt;br /&gt;
실제로 구현체로 예를 들어 보여주시니 더욱 이해가 잘 되었던 것 같네요. 실제로 많은 요청에 의해서 매번 db를 접속해서 가져오다가, 실제로 해당 제품을 이용해서 캐시를 이용하는 것을 보여주었어요. 게다가 세션유지되는 것도 보여주었고...&lt;br /&gt;
해당 소스를 github에 올리셨다던데 주소가 어딘지 모르겠네요. 나중에 PT나오면 보고 해봐야겠네요ㅠ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: 12pt; &quot;&gt;5. 스타트업을 위한 Rapid Development&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Play! Framework를 소개하는 것 같네요. php나 Ruby On Rails만큼 쉽게 개발할 수 있다는 것을 말씀하셨네요. 작년에 JCO를 통해서 처음 들었던 프레임워크인데, 요즘 많이 뜨고 있나봐요. 여기저기 몇 번 들은 기억이 나네요. 어떤 것인지 한 번 봐야겠네요.&lt;br /&gt;
&lt;a target=&quot;_blank&quot; href=&quot;http://www.playframework.org/&quot;&gt;http://www.playframework.org/&lt;/a&gt;&lt;br /&gt;
뭐 그냥 play framework를 소개하는 자리였습니다. 음......그래도 전 php로 게시판 만드는 게 가장 빠른 것 같습니다-_-&lt;br /&gt;
&lt;br /&gt;
끝나고 경품 추첨! 역시...되지는 않습니다! 하지만! 이번에 사전 이벤트인 블로그 트랙백 이벤트에서 당당히 당첨되었습니다! 그래서 리얼포스키보드를 받게 되었어요!ㅠ 관계자분들 감사합니다~&lt;br /&gt;
&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2009AA4F4F3FB0A51D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2009AA4F4F3FB0A51D&quot; width=&quot;500&quot; height=&quot;375&quot; alt=&quot;&quot; filename=&quot;2012-02-18 20.30.12.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/div&gt;
&lt;br /&gt;
그런데, 부스에서 기념품을 주는 곳이 많이 줄어든 느낌입니다ㅠ&lt;br /&gt;
&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2017FC4F4F3FB0AC0E&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2017FC4F4F3FB0AC0E&quot; width=&quot;500&quot; height=&quot;375&quot; alt=&quot;&quot; filename=&quot;2012-02-18 22.14.13.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/div&gt;
&lt;br /&gt;
ps. 저는 오라클에서 준 스마트폰 거치대 목걸이가 가장 맘에 드네요. 스마트폰을 거치하고 목에 걸수도 있다니...-_-&lt;br /&gt;
&lt;br /&gt;</description>
      <category>나의 삶/생활속에 나</category>
      <author>머드초보</author>
      <guid isPermaLink="true">https://mudchobo.tistory.com/535</guid>
      <comments>https://mudchobo.tistory.com/535#entry535comment</comments>
      <pubDate>Sat, 18 Feb 2012 23:09:48 +0900</pubDate>
    </item>
    <item>
      <title>[Adobe AIR] Javascript(jQuery)를 이용한 초간단 파일서버</title>
      <link>https://mudchobo.tistory.com/533</link>
      <description>이거 제가 쓰려고 만들었었는데, 이어 받기도 되고, 더 좋은 파일서버가 많아서 만들다가 포기했던.....&lt;br /&gt;
최근에 Adobe AIR로 개발할 일이 생겼는데, HTML + Javascript 구조로 가져가면 유지보수도 편하게 할 수 있고, Javascript공부에 더 좋을 것 같아서 일단 기록해둡니다....&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
html+js로 Adobe AIR는 개발을 안해봤는데, 해보니까 그리 어렵지도 않고, 기존 ActionScript3 클래스를 그대로 포팅이 되어서 그걸 air.클래스명 해서 그대로 쓰면 돼서 어렵진 않았네요. 다만 디버깅할 도구가 조금 부족하다는 것이 좀 아쉽습니다.&lt;br /&gt;
이걸 이용한 툴이 그나마 드림위버인데, 드림위버는 저랑 맞지 않는 것 같습니다. 그래서 그냥 Aptana3로 개발을 하고, AIR에서 제공하는 AIRIntrospector.js를 이용해서 하니까 디버깅도 그리 불편하진 않네요.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;border-style: double; border-width: 3px; border-color: rgb(243, 197, 52); background-color: rgb(254, 254, 184); padding: 10px;&quot; class=&quot;txc-textbox&quot;&gt;
&amp;lt;html&amp;gt; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;head&amp;gt; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;Simple File Server&amp;lt;/title&amp;gt; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;/css/main.css&quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script type=&quot;text/javascript&quot; src=&quot;/js/lib/AIRAliases.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script type=&quot;text/javascript&quot; src=&quot;/js/lib/AIRIntrospector.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script type=&quot;text/javascript&quot; src=&quot;/js/lib/jquery-1.7.1.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // 기본값 지정&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var port = 50000;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var shareFolder = air.File.documentsDirectory;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var serverSocket;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var isStart = false;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; $(document).ready(function(){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; $(&quot;#inputPort&quot;).val(port);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; $(&quot;#inputShareFolder&quot;).val(shareFolder.nativePath);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; shareFolder.addEventListener(air.Event.SELECT, selectShareFolderHandler);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; $(&quot;#btnStart&quot;).click(function(){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (!isStart){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; try{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; serverSocket = new air.ServerSocket();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; serverSocket.addEventListener(air.Event.CONNECT, connectSocketHandler);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; serverSocket.bind($(&quot;#inputPort&quot;).val());&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; serverSocket.listen();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; isStart = true;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; $(this).attr(&quot;value&quot;, &quot;중지&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch(e){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; alert(&quot;에러! = &quot; + e.message);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; serverSocket.removeEventListener(air.Event.CONNECT, connectSocketHandler);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; serverSocket.close();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; isStart = false;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; $(this).attr(&quot;value&quot;, &quot;시작&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; $(&quot;#btnBrowser&quot;).click(function(){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; shareFolder.browseForDirectory(&quot;폴더를 선택하세요.&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; function selectShareFolderHandler(e){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; $(&quot;#inputShareFolder&quot;).val(shareFolder.nativePath);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; function connectSocketHandler(e){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var socket = e.socket;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; socket.addEventListener(air.ProgressEvent.SOCKET_DATA, proressSocketHandler);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; function proressSocketHandler(e){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var socket = e.target;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var bytes = new air.ByteArray();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; socket.readBytes(bytes);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var request = &quot;&quot; +bytes;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; air.Introspector.Console.log(&quot;request = &quot; + bytes);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var path = request.substring(5, request.indexOf(&quot;HTTP/&quot;) - 1);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; air.Introspector.Console.log(&quot;path = &quot; + path);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var file = shareFolder.resolvePath(path);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; air.Introspector.Console.log(file.nativePath);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; air.Introspector.Console.log(file.exists);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (file.isDirectory){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; socket.writeUTFBytes(&quot;HTTP/1.1 200 OK\n&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; socket.writeUTFBytes(&quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; else if (file.exists &amp;amp;&amp;amp; !file.isDirectory){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var stream = new air.FileStream();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; stream.open(file, air.FileMode.READ);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var content = new air.ByteArray();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; stream.readBytes(content);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; stream.close();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; socket.writeUTFBytes(&quot;HTTP/1.1 200 OK\n&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; socket.writeUTFBytes(&quot;Content-Disposition: attachment;filename=&quot; + path + &quot;\n&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; socket.writeUTFBytes(&quot;Content-Length: &quot; + file.size + &quot;\n&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; socket.writeUTFBytes(&quot;\n&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; socket.writeBytes(content);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; socket.writeUTFBytes(&quot;HTTP/1.1 404 Not Found\n&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; socket.writeUTFBytes(&quot;Content-Type: text/html\n\n&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; socket.writeUTFBytes(&quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h2&amp;gt;Page Not Found&amp;lt;/h2&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; socket.flush();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; socket.close();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; log(file.nativePath);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; function log(s){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; $(&quot;.divStatus&quot;).prepend(&quot;&amp;lt;div&amp;gt;&quot; + s + &quot;&amp;lt;/div&amp;gt;&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/head&amp;gt; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;body&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 포트 : &amp;lt;input type=&quot;text&quot; id=&quot;inputPort&quot; /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 공유폴더 : &amp;lt;input type=&quot;text&quot; id=&quot;inputShareFolder&quot; disabled=&quot;true&quot;/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input type=&quot;button&quot; id=&quot;btnBrowser&quot; value=&quot;폴더선택&quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input type=&quot;button&quot; id=&quot;btnStart&quot; value=&quot;시작&quot;/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class=&quot;divStatus&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
&amp;nbsp;각종 air에서 제공하는 js파일들은 여기에 다 있습니다.&lt;br /&gt;
AdobeAIRSDK\frameworks\libs\air&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
개발관련된 문서는 여기에!&lt;br /&gt;
&lt;a href=&quot;http://www.adobe.com/devnet/air/articles/getting_started_air_js.html&quot; target=&quot;_blank&quot;&gt;http://www.adobe.com/devnet/air/articles/getting_started_air_js.html&lt;/a&gt;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
풀소스는 여기에!&lt;br /&gt;
&lt;a href=&quot;https://github.com/mudchobo/SimpleFileServer&quot; target=&quot;_blank&quot;&gt;https://github.com/mudchobo/SimpleFileServer&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/19082F3A4F1CC3170F&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F19082F3A4F1CC3170F&quot; width=&quot;400&quot; height=&quot;400&quot; alt=&quot;&quot; filename=&quot;11.png&quot; filemime=&quot;&quot;/&gt;&lt;/div&gt;</description>
      <category>에어(AIR)</category>
      <author>머드초보</author>
      <guid isPermaLink="true">https://mudchobo.tistory.com/533</guid>
      <comments>https://mudchobo.tistory.com/533#entry533comment</comments>
      <pubDate>Mon, 23 Jan 2012 11:17:07 +0900</pubDate>
    </item>
  </channel>
</rss>