<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Embian Blog</title>
    <link>https://embian.tistory.com/</link>
    <description>(주) 엠비안 블로그
Big Data, Real-time</description>
    <language>ko</language>
    <pubDate>Fri, 5 Jun 2026 15:39:17 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>forcemax</managingEditor>
    <item>
      <title>AWS CloudFront 객체 무효화 방법</title>
      <link>https://embian.tistory.com/125</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: 350px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/212AB23A576CB8B405&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F212AB23A576CB8B405&quot; width=&quot;350&quot; height=&quot;228&quot; filename=&quot;cloudfront_logo.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;br /&gt;&lt;/p&gt;&lt;p&gt;최근 진행되고 있는 프로젝트에서 AWS S3 와 CloudFront를 사용하여 동영상 서비스를 하고 있는데&amp;nbsp;CBT중이라 버그 리포팅이 자주 오고 있다.&lt;/p&gt;&lt;p&gt;분명히 테스트때는 정상 작동을 했는데 왜 항상 실제 사용하면 버그가 튀어나올까...?!&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Video Thumbnail 파일을 새로 업로드 하였는데 이미지가 바뀌지 않는다는 내용의 문제가 접수되었다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Thumbnail 수정 로직은&amp;nbsp;기존에 사용하던 파일 이름에 확장자만 새로 올린 사진 파일을 따르게 되어있었다. 해서,&amp;nbsp;사진이&amp;nbsp;업로드된 S3에는 새로 올려진 파일이 존재하는데, CloudFront에 요청을 하면 캐시되어있는 예전 사진이 보여지는것이었다.&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: 100px; width: 100px; height: 107px;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/220F483A576CB77F0C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F220F483A576CB77F0C&quot; width=&quot;100&quot; height=&quot;107&quot; filename=&quot;카카오_이모티콘032.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;width: 100px; height: 107px;&quot; original=&quot;yes&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;파일이 새로 올라왔는데 CloudFront는 왜 새로운 파일을 캐시하지 못했을까?&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;문제 해결을 위해 문서를 찾아보니 다음과 같은 내용을 확인하였다.&lt;/p&gt;&lt;blockquote class=&quot;tx-quote-tistory&quot;&gt;&lt;span style=&quot;color: rgb(68, 68, 68); font-family: &amp;quot;Open Sans&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Arial; font-size: 16px; line-height: 24px;&quot;&gt;CloudFront 배포에서 기존 객체를 업데이트하고 동일한 객체 이름을 사용할 수는 있지만 권장되지는 않습니다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(68, 68, 68); font-family: &amp;quot;Open Sans&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Arial; font-size: 16px; line-height: 1.5em;&quot;&gt;CloudFront에서는 오리진에 새 객체나 업데이트된 객체를 배치할 때가 아닌 객체가 요청된 경우에만 엣지 로케이션에 객체를 배포합니다. 이름이 같은 최신 버전으로 오리진에서 기존 객체를 업데이트한 경우, 다음 두 가지 상황이 모두 발생하기 전까지는 엣지 로케이션에서 오리진으로부터 새 버전을 가져오지 않습니다.&lt;/span&gt;&lt;div class=&quot;itemizedlist&quot; style=&quot;font-family: &amp;quot;Open Sans&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Arial; font-size: 16px; color: rgb(68, 68, 68);&quot;&gt;&lt;ul class=&quot;itemizedlist&quot; type=&quot;disc&quot;&gt;&lt;li class=&quot;listitem&quot; style=&quot;line-height: 1.5em;&quot;&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; line-height: 1.5em;&quot;&gt;캐시에 있는 객체의 기존 버전은 만료됩니다. 자세한 내용은&amp;nbsp;&lt;a class=&quot;xref&quot; href=&quot;http://docs.aws.amazon.com/ko_kr/AmazonCloudFront/latest/DeveloperGuide/Expiration.html&quot; title=&quot;객체가 CloudFront 엣지 캐시에 보관되는 시간 지정(만료)&quot; style=&quot;color: rgb(153, 102, 51);&quot;&gt;객체가 CloudFront 엣지 캐시에 보관되는 시간 지정(만료)&lt;/a&gt;단원을 참조하십시오.&lt;/p&gt;&lt;/li&gt;&lt;li class=&quot;listitem&quot; style=&quot;line-height: 1.5em;&quot;&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; line-height: 1.5em;&quot;&gt;엣지 로케이션에는 객체에 대한 최종 사용자 요청이 존재합니다.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;문제에 대한 이유를 찾았으니, 문제 해결을 해보도록 했다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;CloudFront 엣지 캐시에서 객체가 만료되기 전에 이것을 제거하는것, 즉 CloudFront의 객체 무효화를 사용하면 된다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1. AWS Console에 접속하여 CloudFront 페이지로 이동한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;2. 문제가 발생한 Distribution을 선택한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 630px; text-align: center;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/254C583F576CB3C90D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F254C583F576CB3C90D&quot; width=&quot;630&quot; height=&quot;306&quot; filename=&quot;3333.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;text-align: center;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;3. Invalidations탭을 선택한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 630px; text-align: center;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/26272E3F576CB3C82A&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F26272E3F576CB3C82A&quot; width=&quot;630&quot; height=&quot;309&quot; filename=&quot;2222.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;text-align: center;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;4. Create Invalidation을 선택한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 630px; text-align: center;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2246143F576CB3C813&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2246143F576CB3C813&quot; width=&quot;630&quot; height=&quot;239&quot; filename=&quot;4444.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;text-align: center;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;5. Object Paths에 Invalidate할 파일 이름을 적어준다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이때 Origin Path를 제외하고 난 나머지를&amp;nbsp;적어주면 된다.&lt;/p&gt;&lt;p&gt;예를 들어,&amp;nbsp;&lt;/p&gt;&lt;p&gt;Invalidate할 파일이&amp;nbsp;S3 bucket에 /thumbnail/1234.jpg이고,&lt;/p&gt;&lt;p&gt;CloudFront의 Origin Path가 /thumbnail로 잡혀있다면,&amp;nbsp;&lt;/p&gt;&lt;p&gt;Create Invalidation의 Object Path에 1234.jpg를 적어주면 된다.&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: 630px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2546143F576CB4E219&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2546143F576CB4E219&quot; width=&quot;630&quot; height=&quot;357&quot; filename=&quot;5555.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;6. Invalidate버튼을 누르고 Status가 Completed가 되길 기다리면 된다. (생각보다 오래 걸린다...)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;참고로 Invalidation은 무료 갯수가 제한되어있어서 그 이상 Invalidate을 하게 되면 과금되니 주의해야 한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;과금 정보는 다음 페이지에서 확인 가능하다.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://aws.amazon.com/cloudfront/pricing/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://aws.amazon.com/cloudfront/pricing/&lt;/a&gt;&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;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;참고자료&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://docs.aws.amazon.com/ko_kr/AmazonCloudFront/latest/DeveloperGuide/ReplacingObjectsSameName.html&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://docs.aws.amazon.com/ko_kr/AmazonCloudFront/latest/DeveloperGuide/ReplacingObjectsSameName.html&lt;/a&gt;&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;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Amazon Web Services</category>
      <author>알 수 없는 사용자</author>
      <guid isPermaLink="true">https://embian.tistory.com/125</guid>
      <comments>https://embian.tistory.com/125#entry125comment</comments>
      <pubDate>Fri, 24 Jun 2016 12:19:15 +0900</pubDate>
    </item>
    <item>
      <title>Firebase: Robo Test</title>
      <link>https://embian.tistory.com/124</link>
      <description>&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h1 style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 24pt;&quot;&gt;Firebase: Robo&amp;nbsp;Test&lt;/span&gt;&lt;/b&gt;&lt;/h1&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;Firebase는 앱 개발을 위한 실시간 데이터베이스, 사용자 인증 및 호스팅 기능을 제공하는 서비스에서&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;Google에서 인수한&amp;nbsp;후 앱(Android, iOS, 모바일 웹)을&amp;nbsp;위한 통합 앱 플랫폼으로 확장되었다.&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;Firebase에서는 앱 개발을 위한 기능 뿐만 아니라 분석, 관리, 마케팅등을 위한 기능들이 다수가 포함되어 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;594&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;border:none;border-collapse:collapse;;font-family:&quot; 맑은=&quot;&quot; 고딕&quot;,=&quot;&quot; sans-serif;font-size:13px&quot;=&quot;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width:594;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-top:1px solid #ccc;border-left:1px solid #ccc;;&quot;&gt;&lt;p&gt;&lt;u&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;/span&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=tb2GZ3Bh4p8&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- Firebase Overview Google I/O 2016[1]&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;u&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;/span&gt;&lt;a href=&quot;https://firebase.google.com/features/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- Firebase Features[2]&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/p&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: 12pt;&quot;&gt;본 포트스에서는 &lt;b&gt;Firebase의 앱 자동화 테스트 기능인 &quot;Robo Test&quot;&lt;/b&gt;에 대해서 살펴보려고 한다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;594&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;border:none;border-collapse:collapse;;font-family:&quot; 맑은=&quot;&quot; 고딕&quot;,=&quot;&quot; sans-serif;font-size:13px&quot;=&quot;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width:594;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-top:1px solid #ccc;border-left:1px solid #ccc;;&quot;&gt;&lt;p&gt;&lt;u&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;/span&gt;&lt;a href=&quot;https://developers.google.com/cloud-test-lab/robo-ux-test&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- Google Cloud Test Lab for Robo Test[3]&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;u&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;/span&gt;&lt;a href=&quot;https://firebase.google.com/docs/test-lab/robo-ux-test&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- Firebase Test Lab for Android Robo Test[4]&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;테스트를 위한 대상 앱을 회사에서 개발한 &quot;On-ly 앱&quot;을 테스트 해보기로 결정하였다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;On-ly는 &quot;스마트 게임 만보계&quot;&lt;/b&gt;로&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;1) On-ly를 설치한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;2) 평소대로 스마트폰(게임)을 사용한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;3) 내가 스마트폰으로 게임을 얼마나 어떤 패턴으로 하는지 궁굼하면 On-ly에서 살펴본다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;와 같은 간단한 컨셉을 바탕으로 개발되었다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;594&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;border:none;border-collapse:collapse;;font-family:&quot; 맑은=&quot;&quot; 고딕&quot;,=&quot;&quot; sans-serif;font-size:13px&quot;=&quot;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width:594;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-top:1px solid #ccc;border-left:1px solid #ccc;;&quot;&gt;&lt;p&gt;&lt;u&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;- &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.embian.only&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;On-ly 앱[5]&lt;/a&gt;&lt;/span&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.embian.only&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&amp;nbsp;&lt;/a&gt;&lt;/u&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h1&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;1. On-ly 테스트 Coverage&lt;/span&gt;&lt;/h1&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;테스트를 진행해 보기에 앞서, Robo Test가 &quot;어디까지 테스트를 해줄 수 있을까? 또는 이런것도 테스트가 가능할까?&quot;에 대해서 생각을 해보았다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;1) 게임 플레이 시간 수집&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;앞서 설명한 바와 같이, On-ly는 사용자의 게임 플레이 시간을 수집하여 정보를 제공하는 앱이다. 게임 플레이 시간 수집을 테스트하기 위해서는, &quot;a) 게임이 설치되어 있어야하고, b) On-ly가 설치되어 있어야 한다. c)&amp;nbsp;게임을 일정시간(5분이상) 실행한 후, d) On-ly를 실행해야 한다.&quot;와 같이 타 앱과의 연계가 필요하다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;2) Facebook 연동(로그인 기능)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;부가 기능(친구 데이터 공유, 데이터 persistency등)을 위해 Facebook 연동을 제공하고 있다. 만약,&amp;nbsp;Robo Test에서 로그인이 가능하다면&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;서버에 저장된 데이터를 사용하여, UI 테스트가 가능하다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;3) 전체&amp;nbsp;페이지(State)&amp;nbsp;테스트&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;사용자가 접할 수 있는 On-ly의 총 페이지(State)는 43개이다. 43개는 동일한 기능(상세 팝압)은 1개의 페이지로 고려하였을때 확인된 수치이다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;실제로는 더많은 페이지를 접하게 된다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;이번 테스트에서는 전체 중&lt;/span&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&amp;nbsp;몇%&lt;/span&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;의 페이지를 Robo Test가 테스트 할 수 있는지를 확인하려고 한다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;(* 페이지별 세부 테스트&amp;nbsp;또는 페이지의 연계성을 고려한 테스트는 고려하지 않음)&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 630px; text-align: center;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/23682C485760E39B1D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F23682C485760E39B1D&quot; width=&quot;630&quot; height=&quot;191&quot; filename=&quot;On-ly페이지목록.png&quot; filemime=&quot;image/png&quot; style=&quot;text-align: center;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none; margin-left: 2em;&quot;&gt;&amp;lt;On-ly 페이지별 스크린샷&amp;gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none; margin-left: 2em;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;4) 시스템 권한&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;On-ly는 게임 모니터링을 위해, &quot;android.permission.PACKAGE_USAGE_STATS&quot; 시스템 권한이 필요하다.(*Android 5.1, Lollipop 부터 시스템 권한으로 변경됨)&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;시스템 권한은 앱을 설치후 사용자가 직접 안드로어드 OS 설정 페이지에서 권한을 추가해야 한다. 즉, 테스트시 안드로이드 OS와의 연계가 필요하다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; text-align: center;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 630px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2216733D5760E75A1D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2216733D5760E75A1D&quot; width=&quot;630&quot; height=&quot;352&quot; filename=&quot;only_permission.png&quot; filemime=&quot;image/png&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; text-align: center;&quot;&gt;&amp;lt;PACKAGE_USAGE_STATS 시스템 권한 획득과정&amp;gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;당연히 내부에서 테스트를 진행할 시 위 4가지만을 고려하는 것은 아니다. 더 많은 항목을 테스트 해야 한다. 단, 본 테스트에서는 Robo Test로 큰 틀에서 어느 범위까지 테스트가 가능한지를 확인하기 위해 위 4가지 항목으로 정해보았다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;h1&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;2. Robo Test 실행&lt;/span&gt;&lt;/h1&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;Test Lab을 사용하기 위해서는 Firebase가입 및 카드 등록이 필요하다. 시간당 $5로, 테스트 장비 대여 및 관리 비용이라고 생각하면 비싼 가격은 아니라고 생각된다.&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: 630px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/222D5A335760EC4E12&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F222D5A335760EC4E12&quot; width=&quot;630&quot; height=&quot;366&quot; filename=&quot;firebase_price.png&quot; filemime=&quot;image/png&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&amp;lt;&lt;a href=&quot;https://firebase.google.com/pricing/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;Firebase Pricing[6]&lt;/a&gt;&amp;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;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;2.1. 프로젝트 만들기&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;프로젝트는&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;Firebase console에서 &quot;새 프로젝트 만들기&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&quot;로 생성할 수 있다. 해당 프로젝트로 이동하면, 좌측 DEVELOP -&amp;gt; Test Lab을 확인할 수 있다.&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: 475px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2415F0505760EF592E&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2415F0505760EF592E&quot; width=&quot;475&quot; height=&quot;443&quot; filename=&quot;r_create_project.png&quot; filemime=&quot;image/png&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&amp;lt;새 프로젝트 만들기&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;2.2. 테스트 실행&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;메뉴의 DEVELOP -&amp;gt; Test Lab을 선택하고, &quot;테스트 실행 -&amp;gt; Robo 테스트 실행&quot;을 선택한다.&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: 630px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/265AD7465760F53D24&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F265AD7465760F53D24&quot; width=&quot;630&quot; height=&quot;285&quot; filename=&quot;r_테스트_실행.png&quot; filemime=&quot;image/png&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&amp;lt;Robo Test 실행&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;테스트할 앱(On-ly)의 APK를 업로드한 후 &quot;계속&quot;을 선택한다.&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: 630px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/274945385760F58A19&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F274945385760F58A19&quot; width=&quot;630&quot; height=&quot;346&quot; filename=&quot;r_apk_업로드.png&quot; filemime=&quot;image/png&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&amp;lt;앱 선택(&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;APK 업로드)&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;테스트 실행 단계에서 가장 복잡한단계로, [실제기기, API수준, 방향, 언어, 고급 옵션1, 고급 옵션2]6개의 측정기준을 선택하는 단계이다. &amp;nbsp;&quot;&lt;/span&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;테스트의 개수&amp;nbsp;= 실제기기 수&amp;nbsp;x API수준 수 x 방향 수 x 언어 수&quot;로 결정된다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;본 예제는 1x3x1x1=3으로 3개의 테스트를 진행한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;고급 옵션은&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;1) 테스트 제한시간&lt;/b&gt;: 테스트를 실행할 최대 시간(분)으로, 기본은 5분으로 설정되어 있다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;2) 최대 깊이&lt;/b&gt;:&amp;nbsp;Robo 테스트에서 앱 UI의 특정 분기를 얼마나 깊이 탐색한 후 UI 루트(기본 화면)로 돌아가서 다른 분기를 탐색할지를 결정합니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&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: 546px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2225AE3C5760F5E012&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2225AE3C5760F5E012&quot; width=&quot;546&quot; height=&quot;768&quot; filename=&quot;r_측정기준_선택.png&quot; filemime=&quot;image/png&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;측정기준 선택&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;테스트가 모두 완료되면 아래와 같은 결과를 확인할 수 있다.&amp;nbsp;모두 통과 하였다. 이제 상세 결과를 확인해 보자.&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: 630px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2621ED49576102001C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2621ED49576102001C&quot; width=&quot;630&quot; height=&quot;211&quot; filename=&quot;r_test_complete.png&quot; filemime=&quot;image/png&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&amp;lt;테스트 매트릭스&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&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;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;3. Robo Test 결과 확인&lt;/span&gt;&lt;/h2&gt;&lt;h2&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;3.1. 테스트 결과 항목&lt;/span&gt;&lt;/h2&gt;&lt;h1&gt;&lt;p style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;테스트 결과는&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;font-weight: normal; margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;a)로그: Device에서 발생한 level별 로그&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;font-weight: normal; margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;b)스크린샷: 테스트를 진행한 페이지의 스크린샷 목록&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;font-weight: normal; margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;c)활동 지도: 테스트를 진행한 과정의 &lt;u&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Activity_diagram&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;a&lt;/a&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Activity_diagram&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;ctivity d&lt;/a&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Activity_diagram&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;iagram[7]&lt;/a&gt;&lt;/u&gt;형태의 diagram&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;font-weight: normal; margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;d)동영상: 테스트를 진행한 과정이&amp;nbsp;녹화된&amp;nbsp;동영상&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;으로 구성되어 있다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 13px; font-weight: normal; text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 630px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/27155B4257610A8A2F&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F27155B4257610A8A2F&quot; width=&quot;630&quot; height=&quot;310&quot; filename=&quot;r_test_result.png&quot; filemime=&quot;image/png&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 13px; font-weight: normal; text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 13px; font-weight: normal; text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&amp;lt;테스트 결과 화면&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/h1&gt;&lt;h2&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;3.2. 결과 확인&lt;/span&gt;&lt;/h2&gt;&lt;h1&gt;&lt;p style=&quot;font-size: 13px; font-weight: normal;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&quot;1. On-ly 테스트 Coverage&quot;에서 생각해 보았던 내용을 충족시킬 수 있는지를 확인해 보자.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 13px; font-weight: normal; margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;1) 게임 플레이 시간 수집 &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;(테스트 할 수 없음&lt;/span&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; font-size: 13px;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-weight: normal;&quot;&gt;&quot;2.2. 테스트 실행&quot;에서 확인한 바와 같이, 테스트 대상 앱 이외의 앱은 설치가 불가능 하다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 13px; margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 13px; font-weight: normal; margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;2) Facebook 연동 &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;(실패 테스트만 가능)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; font-size: 13px;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-weight: normal;&quot;&gt;테스트 Input에 사용자 데이터가 없다. 즉, 로그인 Action을 수행(테스트)할 수 는 있지만 로그인 성공에 대한 테스트는 불가능 하다. &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 16px; font-weight: normal;&quot;&gt;아래 &quot;활동&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 16px; font-weight: normal;&quot;&gt;지도&lt;/span&gt;&lt;span style=&quot;font-size: 16px; font-weight: normal;&quot;&gt;&quot;에서 &quot;Facebook 로그인&quot; 페이지에서 실패를 반복하고 있다. 또한, 이로인해 &amp;nbsp;테스트 시간을 모두 소비하여 다른 페이지는 테스트를 진행하지&amp;nbsp;못한것으로 판단된다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; font-size: 13px; text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 82px; width: 82px; height: 630px;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/245D074A57610D3710&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F245D074A57610D3710&quot; width=&quot;82&quot; height=&quot;630&quot; filename=&quot;r_activity_diagram.png&quot; filemime=&quot;image/png&quot; style=&quot;width: 82px; height: 630px;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; font-size: 13px; text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-weight: normal;&quot;&gt;&amp;lt;활동 지도 결과&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 13px; font-weight: normal; margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 13px; font-weight: normal; margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;3) 전체 페이지(State) 테스트 &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;(약 79%는&amp;nbsp;테스트 하지 못함)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 13px; margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-weight: normal;&quot;&gt;Facebook 로그인을 실패한 페이지의 중복을 제거하면, 9개의 페이지를 테스트 하였다. On-ly의 전체 페이지(49) 중 약 21%의 페이지만을 테스트한 것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 13px; margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 13px; margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-weight: normal;&quot;&gt;또한, 로그인 실패(수집된 데이터가 없는경우)한 경우만 확인을 하면 전체 17페이지 중 약 53%의 페이지만을 테스트 하였다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 13px; margin-left: 2em; text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 630px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/236EBA4D57610EA00F&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F236EBA4D57610EA00F&quot; width=&quot;630&quot; height=&quot;441&quot; filename=&quot;r_screen_result.png&quot; filemime=&quot;image/png&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 13px; margin-left: 2em; text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-weight: normal;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&amp;lt;스크린샷 결과&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 13px; font-weight: normal; margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 13px; font-weight: normal; margin-left: 2em;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 13px; font-weight: normal; margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;4) 시스템 권한 &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;(테스트&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;하지 못함&lt;/span&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; font-size: 13px;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-weight: normal;&quot;&gt;API 22(Lollipop)에서 새로 추가된 PACKAGE_USAGE_STATS를 위한 시스템 권한 획득에서 더이상&amp;nbsp;진행되지 않았다. &amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; font-size: 13px; text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 437px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/222D92365761117210&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F222D92365761117210&quot; width=&quot;437&quot; height=&quot;563&quot; filename=&quot;r_permission_error.png&quot; filemime=&quot;image/png&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em; font-size: 13px; text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 16px; font-weight: normal;&quot;&gt;&amp;lt;API 22 테스트의 활동 지도 결과&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 13px; font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/h1&gt;&lt;h2&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;4. 마치며&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;어찌보면 당연한 결과일지 모른다. 또는, Firebase에서 Robo Test의 사용목적과 부합하지 않는&amp;nbsp;테스트만 진행한 것 일&amp;nbsp;수도 있다. 그러나,&amp;nbsp;만약, 모두 자동으로 잘&amp;nbsp;테스트 되어 진다면 얼마나 좋을까?라는 생각을 해보았다.(누군가는 허황된 꿈? 이라고 할 수 있을 것이다)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;최근 자동화 앱&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;테스트(Automated App Test) 또는 자동화 테스트 입력 생성(Automated Test Input Generation)에 대한 연구 자료들을 보기 시작했다. 자료들에서도 Robo Test와 동일한 컨셉으로 연구를 진행하고 있다[9-12].&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;a)&lt;/b&gt;Android Activity분석 -&amp;gt;&amp;nbsp;&lt;b&gt;b)&lt;/b&gt;분석 결과를 model&lt;/span&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;(Finite&lt;/span&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&amp;nbsp;State Machine[8])화 -&amp;gt;&amp;nbsp;&lt;b&gt;c)&lt;/b&gt;Model의 최적화(learning&amp;nbsp;algorithm, heuristics 등을 이용) -&amp;gt;&amp;nbsp;&lt;b&gt;d)&lt;/b&gt; 테스트 입력 생성(Test Input Generation)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;연구 자료를 보면서 전체는 아니더라도 지금보다는 더 나은 방향으로 갈 수 있지 않을까 생각해 보았다. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;*본 글은 절대로 Firebase의 Robo Test를 비판 또는 평가하기 위한 목적으로 작성되지 않았습니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&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;References&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;[1] &lt;/b&gt;Firebase Overview Google I/O 2016, https://www.youtube.com/watch?v=tb2GZ3Bh4p8&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;[2] &lt;/b&gt;Firebase Features[2], https://firebase.google.com/features/&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;[3] &lt;/b&gt;Google Cloud Test Lab for Robo Test, https://developers.google.com/cloud-test-lab/robo-ux-test&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;[4] &lt;/b&gt;Firebase Test Lab for Android Robo Test, https://firebase.google.com/docs/test-lab/robo-ux-test&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;[5] &lt;/b&gt;On-ly 앱, https://play.google.com/store/apps/details?id=com.embian.only&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;[6] &lt;/b&gt;Firebase Pricing,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;https://firebase.google.com/pricing/&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;[7] &lt;/b&gt;Activity Diagram Wiki,&amp;nbsp;https://en.wikipedia.org/wiki/Activity_diagram&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;[8] &lt;/b&gt;Finite State Machine Wiki,&amp;nbsp;https://en.wikipedia.org/wiki/Finite-state_machine&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;[9]&amp;nbsp;&lt;/b&gt;Guided GUI Testing of Android Apps with Minimal Restart and Approximate Learning,&amp;nbsp;http://www.cs.berkeley.edu/~necula/Papers/swifthand-oopsla13.pdf&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;[10]&amp;nbsp;&lt;/b&gt;MobiGUITAR – A Tool for Automated Model-Based Testing of Mobile Apps,&amp;nbsp;https://scholar.google.co.kr/scholar?q=A+Tool+for+Automated+Model-Based+Testing+of+Mobile+Apps&amp;amp;btnG=&amp;amp;hl=ko&amp;amp;as_sdt=0%2C5&amp;amp;as_vis=1&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;[11]&amp;nbsp;&lt;/b&gt;Reducing Combinatorics in GUI Testing of Android Applications,&amp;nbsp;https://seal.ics.uci.edu//wp-content/uploads/seal/PID4096715.pdf&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;b&gt;[12] &lt;/b&gt;A GUI State Comparison Technique for Effective Model-based Android GUI Testing,https://scholar.google.co.kr/scholar?q=A+GUI+State+Comparison+Technique+for+Effective+Model-based+Android+GUI+Testing&amp;amp;hl=ko&amp;amp;as_sdt=0&amp;amp;as_vis=1&amp;amp;oi=scholart&amp;amp;sa=X&amp;amp;ved=0ahUKEwj6gMbo16nNAhXj3aYKHW5TA1sQgQMIGjAA&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Test Lab</category>
      <author>알 수 없는 사용자</author>
      <guid isPermaLink="true">https://embian.tistory.com/124</guid>
      <comments>https://embian.tistory.com/124#entry124comment</comments>
      <pubDate>Wed, 15 Jun 2016 18:16:07 +0900</pubDate>
    </item>
    <item>
      <title>AWS S3와 CloudFront를 사용하여 동영상 스트리밍 서비스 하기</title>
      <link>https://embian.tistory.com/123</link>
      <description>&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; text-align: center; width: 300px; height: 200px;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/24257944575A49A41A&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F24257944575A49A41A&quot; width=&quot;300&quot; height=&quot;200&quot; filename=&quot;logo-amazon-web-services.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;text-align: center; width: 300px; height: 200px;&quot; original=&quot;no&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;요새&amp;nbsp;AWS에서 제공하는 서비스들을 사용하여 동영상 스트리밍 서비스를 구축을 하고 있다. AWS쪽 관리와&amp;nbsp;운영 방법을 인수인계를 받는 중에 정리를 위하여 블로그를 작성해보기로 했다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;AWS S3와 CouldFront를 사용하여 동영상 스트리밍 서비스 해보기.&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: center; clear: none; float: none;&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&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;margin-left: 2em;&quot;&gt;이 동영상 스트리밍 서비스는 권한이 부여된 사용자에게만 서비스를 하기 위하여 Signed Cookie와 Signed URL을 사용하여 서비스 한다.&amp;nbsp;&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;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;1) AWS CloudFront,&amp;nbsp;S3&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;2) 서비스 대상&amp;nbsp;HLS 파일&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1. 먼저 S3에 Bucket을 생성한다.&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: 630px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2240FF3E575E5C701F&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2240FF3E575E5C701F&quot; width=&quot;630&quot; height=&quot;564&quot; filename=&quot;aws2.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;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 630px; text-align: center;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/217FEC43575E5C992C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F217FEC43575E5C992C&quot; width=&quot;630&quot; height=&quot;198&quot; filename=&quot;aws3.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;text-align: center;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 630px; text-align: center;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/24035043575E5C9A2C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F24035043575E5C9A2C&quot; width=&quot;630&quot; height=&quot;109&quot; filename=&quot;aws4.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;text-align: center;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;2. 서비스 대상 HLS파일을&amp;nbsp;S3에&amp;nbsp;업로드 한다. 파일 업로드 방법은&amp;nbsp;다양한데, 이번 예제에서는&amp;nbsp;AWS Consol을&amp;nbsp;사용하여 업로드 해 보도록 하겠다.&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;/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: 630px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/231BF435575F9A8920&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F231BF435575F9A8920&quot; width=&quot;630&quot; height=&quot;167&quot; filename=&quot;aws100.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;서비스 대상 HLS&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: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 630px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/26376335575F9A8804&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F26376335575F9A8804&quot; width=&quot;630&quot; height=&quot;600&quot; filename=&quot;aws13.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;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;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: 630px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/26214D35575F9A871A&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F26214D35575F9A871A&quot; width=&quot;630&quot; height=&quot;189&quot; filename=&quot;aws15.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;3. CloudFront 설정&lt;/p&gt;&lt;p&gt;CloudFront를 셋팅하기 위해 CloudFront페이지로 접근한다.&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;3.1 주요 설정&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;CloudFront의 주요설정은 다음과 같다.&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;Delivery Method&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin-left: 6em;&quot;&gt;- RTMP와 WEB이 있다. HLS는 WEB 방식의 Delivery를 사용하기 때문에 값을 WEB으로 선택한다.&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;Origin Domain Name&lt;/p&gt;&lt;p style=&quot;margin-left: 6em;&quot;&gt;- CloudFront로 서비스 하고자 하는 S3 Bucket이름이다. 클릭하면 select box가 나타난다.&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;Origin Path&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin-left: 6em;&quot;&gt;- S3&amp;nbsp;Bucket내의 DocumentRoot. S3 Bucket 내의 디렉토리 중 어느 위치를 해당 CloudFront의 /로 사용할 것인지를 나타낸다.&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;Restricted Bucket Access&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin-left: 6em;&quot;&gt;- S3에서 자체적으로 서비스를 하지 않고 CloudFront를 통해서만 서비스가 가능하도록 한다. &lt;/p&gt;&lt;p style=&quot;margin-left: 6em;&quot;&gt;설정값은 Yes.&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;Origin Access Identity&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin-left: 6em;&quot;&gt;- S3 접근에 사용할 접근 정보. 이미 기존에 만들어진 것이 있기 때문에 기존 내용을 사용하면 된다. CloudFront의 좌측 하단 메뉴에서도 관리가 가능하다. 설정 값은&amp;nbsp;Use Existing Identity.&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;Grant Read Permissions on Bucket&lt;/p&gt;&lt;p style=&quot;margin-left: 6em;&quot;&gt;- Origin Access Identity가 S3에 접근 가능하도록 하기 위해서는 S3의 Policy를 업데이트 해야 한다. 이것을 자동으로 해준다. 설정값은 Yes.&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;Forward Header&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin-left: 6em;&quot;&gt;- CORS가 정상적으로 적용되도록 하기 위해서는 Origin을 Forward해줘야 한다. 설정 값은 WhiteList.&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;Restricted Viewer Access&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin-left: 6em;&quot;&gt;-&amp;nbsp;Signed Cookie, Signed URL이 필요하도록 할 경우 Yes. Signed Cookie, Signed URL을 통해서만 접근이 가능하도록 할 경우 설정한다.&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;그 외의 옵션은 모두 기본값으로 설정한다.&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p style=&quot;margin-left: 6em; text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 630px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/222D95445768F49D04&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F222D95445768F49D04&quot; width=&quot;630&quot; height=&quot;594&quot; filename=&quot;1.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 6em; text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 630px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2226C7445768F4A00B&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2226C7445768F4A00B&quot; width=&quot;630&quot; height=&quot;594&quot; filename=&quot;2.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 6em;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;3.2 CloudFront Key Pairs&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;Signed Cookie, Signed URL을 사용할&amp;nbsp;경우 Security Credential에서 CloudFront Key Pairs를 설정해야 한다. Security Credential 메뉴는 우측 상단의 로그인 아이디를 클릭하면 메뉴에 나타난다.&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;여기에서 CloudFront Key Pairs를 추가하거나 Access Key ID를 확인할 수 있다.&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 630px; text-align: center;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/262521445768F49E0C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F262521445768F49E0C&quot; width=&quot;630&quot; height=&quot;572&quot; filename=&quot;5.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;text-align: center;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;4. 동영상 재생을 하기 위해&amp;nbsp;HLS 파일 주소 가져오기&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;지금 하고 있는 프로젝트에서는 Signed URL, Signed Cookie&amp;nbsp;생성시&amp;nbsp;expire time을 1분으로 주어 생성된 url을 1분간 유효하도록&amp;nbsp;하였다. 하지만 1분이 지나면 비디오 시청이 불가능해지므로, 비디오 재생 후 매 30초 마다 Signed Cookie를 발급받는&amp;nbsp;api를 호출하여 인증 갱신하도록 하였다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;4.1 동영상 시청을 위하여 Signed Cookie를 발급하는 API를 호출한다. 이 API는&amp;nbsp;CloudFront-Key-Pair-Id,&amp;nbsp;CloudFront-Policy,&amp;nbsp;CloudFront-Signature를 키값으로 하는&amp;nbsp;쿠키를 발급한다. Signed Cookie&amp;nbsp;생성은&amp;nbsp;아래 문서를&amp;nbsp;참고하여 만든다.&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;a href=&quot;http://docs.aws.amazon.com/ko_kr/AmazonCloudFront/latest/DeveloperGuide/private-content-signed-cookies.html&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://docs.aws.amazon.com/ko_kr/AmazonCloudFront/latest/DeveloperGuide/private-content-signed-cookies.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;4.2 Signed URL로 비디오 파일을 요청한다.&amp;nbsp;Signed URL은 암호화된 CloudFront-Policy, CloudFront-Signature와 위의 3.2에서 발급된&amp;nbsp;CloudFront-Key-Pair-Id를 포함하고 있다.&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;Signed URL생성은&amp;nbsp;아래 문서를 참고 한다.&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;a href=&quot;http://docs.aws.amazon.com/ko_kr/AmazonCloudFront/latest/DeveloperGuide/private-content-signed-urls.html&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://docs.aws.amazon.com/ko_kr/AmazonCloudFront/latest/DeveloperGuide/private-content-signed-urls.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;API에서 생성하는 Signed URL 구성은 다음과 같다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;http://도메인 이름/{Path가 포함된 file명}?Policy={암호화된 Custom Policy값}&amp;amp;Signature={암호화 된&amp;nbsp;signature값}&amp;amp;Key-Pair-Id={Access Key ID값}&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;위의 방법을 통해 S3내의 HLS파일을 받아와 플레이어에서 재생시킬 수 있다. 현재 진행중인 프로젝트에서는 html의 video태그와 hls.js를 이용하여 라이브스트리밍을 가능하게 하였다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;마치며...&lt;/div&gt;&lt;div&gt;AWS에서 제공하는 Product로 구성해본 동영상 스트리밍 서비스는 HLS파일이 있다면&amp;nbsp;매우 간단하고 빠르게 구성하여 서비스 가능하다. 또한 CloudFront설정에서 Signed Cookie와 Signed URL사용으로 파일 보안까지 유지 할 수 있다. 물론 HLS파일이 준비되어있다는 가정 하에 구성한것이라 간단한 작업을 통해 구성될 수 있었다. AWS Elastic Transcoder를 이용하여&amp;nbsp;Video파일을 HLS파일로 Transcoding을 할 수 있는데 이것은 다음번 포스팅에서 다루도록 하겠다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Amazon Web Services</category>
      <author>알 수 없는 사용자</author>
      <guid isPermaLink="true">https://embian.tistory.com/123</guid>
      <comments>https://embian.tistory.com/123#entry123comment</comments>
      <pubDate>Fri, 10 Jun 2016 11:33:54 +0900</pubDate>
    </item>
    <item>
      <title>텔레그램 봇으로 음성채팅 하기</title>
      <link>https://embian.tistory.com/122</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 24pt;&quot;&gt;&lt;b&gt;텔레그램 봇으로 음성채팅 하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 24pt;&quot;&gt;- Telegram Bot&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 24pt;&quot;&gt;for Text to Speech&amp;nbsp;(TTS)&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;table cellspacing=&quot;5&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; align=&quot;center&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&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;table cellspacing=&quot;5&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; align=&quot;center&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;table cellspacing=&quot;5&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; align=&quot;center&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 315px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2228AF4F57076A972F&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2228AF4F57076A972F&quot; width=&quot;315&quot; height=&quot;560&quot; filename=&quot;08.오빠 라면먹고 가세요.png&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;지난번 포스팅에서&amp;nbsp;Chrome Speech를 활용해서 웹 기반 어플에서&amp;nbsp;말하기 기능을 쉽게 사용하는 방법에 대해서 포스팅 했습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 32px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;기존 기능을 테스트 해보다가, &amp;nbsp;메신저에서 여자사람 목소리를 친구에게 보내면 재미 있겠다 싶어서 (&lt;strike&gt;여자 목소리로 욕을&amp;nbsp;보내면 재미있을것 같..&amp;nbsp;ㅎ&lt;/strike&gt;) 무작정 만들어 보기로 했습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 32px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;일단 연동 가능한 메신저 후보군은 많은데, 그중에서 많이들 쓰시는 카톡/Line은 등록하고 하는게 귀찮을것 같고, 개발자에게 무지 친화적인&amp;nbsp;텔레그램으로 맛만 보기로&amp;nbsp;결정했습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 32px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;오늘은 만드는 과정은 차후에 알려 드리기로 기약하며,&amp;nbsp;결과물과 경험에 대한 공유를 하고자 합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 32px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 32px;&quot;&gt;1. 텔레그램&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;다들 아시리라 믿습니다. &amp;nbsp;항간에 보안에 용의한 메신저라고 국가적 보안크리에 반발하여&amp;nbsp;다들 가입 러쉬가 이뤄졌던 외산&amp;nbsp;메신저 입니다. 최근에 미국 FBI등 여러 국가&amp;nbsp;기관에서도 보안검열 같은 움직임에서 조금 이라도 자유로워&amp;nbsp;지기 위해서&amp;nbsp;&amp;nbsp;사용자들이 이쪽으로 많이들 갔죠.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 32px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;저는 보안에 좀 너그러운 상태라서, 굳이 이민까지는 생각하지 않았는데, 오픈소스를 지향하는 개발자로, &quot;오픈되어 있는 개발환경&quot;에 대한 필요성 때문에 올해 가입해서 테스트 용도로 사용중입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 32px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 32px;&quot;&gt;2. 텔레그램과 외부 (나의)&amp;nbsp;프로그램의 연동&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;텔레그램에서&amp;nbsp;외부 프로그램과 연계는&amp;nbsp;중간에 가상의 대화친구인 봇(bot)이라는 대리인을 구현하여&amp;nbsp;사용할수 있습니다. &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;여기서 봇(Bot)은 로봇의 준말로 생각하시면 되고, Telegram과 대화를 대신하는 기계/콜백 프로그램으로 생각하면 됩니다. &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;봇(bot)에 대한 제약은 거의 없는 편이고,&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&amp;nbsp;취향에 맞게 개인 서버에 심어서 텔레그램 서버에 제공하면 됩니다.&amp;nbsp;봇은 크게 2가지 방법으로 준비&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;할수 있는데, 가장 간단하게는&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;1) telegram-cli 라는 텔레그램의 프로토콜을 리버스 엔지니어링으로 만든 환경을 사용하는것이고&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 32px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;2) Telegram Bot API라는 official platform/library 기능을 활용하여 연동할수 있습니다. &amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;저희는 이것 저것 손볼께 있어서 그 나마 확장용이한 Telegram Bot API를 활용했습니다. &amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;일반적으로 bot을 만들고 텔레그램&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;에 *무료*로 등록하고&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;나면 (저희의 경우 isaybot) 누구나 대화 친구처럼 추가해서 사용가능합니다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;Note: &amp;nbsp;다른 메신저는 &lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;사용가능한 앱이 뭔지 알려주는 앱스토어 같은게 존재 하는데, 텔레그램은.. 아... 애석하게도 그런게 없습니다. &amp;nbsp;그냥 사용자가 지인을 통해서 그 봇의 존재에 점조직처럼&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;알음알음 퍼집니다. 앱을 열심히 만드는 사람의 경우 홍보의 이슈가 있어서 피곤하고 약간은&amp;nbsp;문제죠. &amp;nbsp;^^; &amp;nbsp;&lt;strike&gt;차후 바뀔수도 있을꺼라고 사료됩니다.&amp;nbsp;&lt;/strike&gt;&lt;/span&gt;&lt;/i&gt;&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;span style=&quot;font-size: 32px;&quot;&gt;3. 사용법&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 32px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 32px;&quot;&gt;3.1 봇(bot) 추가&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;일단 텔레그램 앱이 여러분의 스마트폰에 설치가 되어 있다고 가정을 하겠습니다. &amp;nbsp; 특정 봇(bot)을 추가하려면, 대화상대 추가와 똑같이 생각하면 됩니다. &amp;nbsp;대화상대 추가하듯이, &amp;nbsp;텔레그램 친구목록의 위쪽에 돋보기(Search)를 누르면, 두번째와 같은&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;화면이 나옵니다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;&amp;nbsp;그창의 맨위 입력부분에&amp;nbsp;&quot;isaybot&quot;이라고 치면 아래와 같이 &amp;nbsp;isaybot이 보입니다. &amp;nbsp;그럼,&amp;nbsp;봇을 선택하여 추가하세요.&amp;nbsp;&lt;/span&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;/p&gt;&lt;p&gt;&lt;table cellspacing=&quot;5&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; align=&quot;center&quot; width=&quot;230&quot; style=&quot;width: 230px;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 210px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2714C94E5709B5B20C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2714C94E5709B5B20C&quot; width=&quot;210&quot; height=&quot;373&quot; filename=&quot;telegram-search.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;width: 0px;&quot;&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style=&quot;width: 440px;&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;table cellspacing=&quot;5&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; align=&quot;center&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 210px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/222F604F57076A9528&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F222F604F57076A9528&quot; width=&quot;210&quot; height=&quot;373&quot; filename=&quot;02.search isaybot.png&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 210px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2720854F57076A952E&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2720854F57076A952E&quot; width=&quot;210&quot; height=&quot;373&quot; filename=&quot;03.search isaybot.png&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&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&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;isaybot을 누구나 추가할수 있는 가상의&amp;nbsp;대화상대/친구로 생각하면 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&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&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 32px;&quot;&gt;3.2 isaybot 사용하기&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;isaybot이 대화상대로&amp;nbsp;추가되면, &amp;nbsp;맨 처음으로 아래에 나타나는&amp;nbsp;[ start ] 버튼을 눌러서 시작합니다. &amp;nbsp;이후에는&amp;nbsp;언제든지 친구리스트에서 isaybot을 선택하여 봇과 대화를 시작하면 됩니다.&amp;nbsp;우리 isaybot의 경우에는 제일 처음 내리는 /change 명령(command)을 통해서 음성대화를 하기 위한 환경세팅이 끝납니다.&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: center; clear: none; float: none;&quot;&gt;&lt;table cellspacing=&quot;5&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; align=&quot;center&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 210px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/244C864F57076A960B&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F244C864F57076A960B&quot; width=&quot;210&quot; height=&quot;373&quot; filename=&quot;04.start isaybot.png&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 210px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2557964F57076A9601&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2557964F57076A9601&quot; width=&quot;210&quot; height=&quot;373&quot; filename=&quot;06.change command.png&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&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;span style=&quot;font-size: 14pt;&quot;&gt;/change 명령어는 &amp;nbsp;말하고 싶은 언어를 선택하는건데, &amp;nbsp; /change라고 치면 위와&amp;nbsp;같은 사용자 키보드가 뜹니다. &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;위의 그림 처럼, 사용자 키보드에서 isaybot이 한국음성으로 말&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;하게 하고&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&amp;nbsp;싶으면, /koKR을 선택하면 됩니다. &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: 18.6667px;&quot;&gt;Note: &amp;nbsp;목소리는 언어별로 약 40여개 지원 합니다. &amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;table cellspacing=&quot;5&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; align=&quot;center&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 210px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2228AF4F57076A972F&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2228AF4F57076A972F&quot; width=&quot;210&quot; height=&quot;373&quot; filename=&quot;08.오빠 라면먹고 가세요.png&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 210px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2150024F57076A9808&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2150024F57076A9808&quot; width=&quot;210&quot; height=&quot;373&quot; filename=&quot;09.change anther voice.png&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 210px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2250FA4F57076A9807&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2250FA4F57076A9807&quot; width=&quot;210&quot; height=&quot;373&quot; filename=&quot;10.40 some voices.png&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&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&gt;&lt;span style=&quot;font-size:14pt;&quot;&gt;한국어 음성으로 설정이 언어설정이 끝난 후, 마지막으로 Message (입력&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;창)에 아무글이나 적어 보세요. &amp;nbsp;저는 &amp;nbsp;친구를&amp;nbsp;놀려 먹기 좋은&amp;nbsp;&quot;오빠 라면먹고 가세요&quot;를 쳐봤습니다 ㅎ&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 32px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;그러면 위의 그림과 같이 서버에 입력된 글을 보내서, 잠시후 입력한 글을&amp;nbsp;여자사람 음성을 만들어서 다시 내게 보내줍니다. &amp;nbsp; &amp;nbsp;보내준 메시지에 파란 플레이 버튼을 눌러주면, &quot;오빠 라면먹고 가세요&quot;가 음성으로 나옵니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;혼자만 듣기 아깝죠? &amp;nbsp;친구에게 텔레그램으로 보내보세요. ^^&amp;nbsp; 음성&amp;nbsp;메시지의 오른쪽에 보면 화살표 버튼이 있습니다. &amp;nbsp;그걸 누르면 친구목록 뜨며, 친구 이름을 선택하여 보내기 버튼만 누르면&amp;nbsp;됩니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;재미있죠? ㅋ&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 32px;&quot;&gt;4. 확장 사용법: &amp;nbsp;&quot;inline&quot; &amp;nbsp;isaybot&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 32px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;위의 isaybot을 친구와 대화하는 방식으로 사용하는 방법 말고,&amp;nbsp;친구 추가 없이 다른 사람과 대화중에&amp;nbsp;사용가능하는&amp;nbsp;방법이 있습니다. &amp;nbsp; &amp;nbsp;텔레그램에서는 이걸 &quot;inline&quot; bot 이라고 하는데, &amp;nbsp;아무 대화창에서 &quot;@&quot;로 시작하는 명령어를 날리면 되는데, &quot;@&quot; 명령으로는 봇의 이름을 사용하면 됩니다. &amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;table cellspacing=&quot;5&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; align=&quot;center&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 210px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/224E914F57076A9809&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F224E914F57076A9809&quot; width=&quot;210&quot; height=&quot;373&quot; filename=&quot;11.inline bot- isay.png&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 210px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/274EC24F57076A9909&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F274EC24F57076A9909&quot; width=&quot;210&quot; height=&quot;373&quot; filename=&quot;12.inline bot-isay2.png&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 210px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/214CB44F57076A990B&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F214CB44F57076A990B&quot; width=&quot;210&quot; height=&quot;373&quot; filename=&quot;13.inline bot - isay3.png&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;가령, isaybot을 inline 봇으로 사용하고 싶은경우, &amp;nbsp;위&lt;/span&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;의 그림처럼 @isaybot을 대화 입력창에 치고, &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;글 내용을 치고 잠시 머물면, 위와 같이 팝업&amp;nbsp;메뉴가 뜹니다. &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;이후 언어중&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;하나를 눌러주면, 아래와 같이 새로운 링크를 포함한 메세지(Facebook Open Graph)가 대화창에 나타납니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;table cellspacing=&quot;5&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; align=&quot;center&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 315px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2447C04F57076A9910&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2447C04F57076A9910&quot; width=&quot;315&quot; height=&quot;560&quot; filename=&quot;14. inline bot-inline player.png&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;위 수신된 메세지&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;본문의&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;그림&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;을 눌러주면 음성을 들어 볼수 있는 웹플레이어가 뜹니다. &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;참고로, 팝업 플레이어는 &amp;nbsp;본분의 그림을 눌렀을때만 뜹니다. &amp;nbsp;반면 링크를 누르면, &amp;nbsp;추가적인 새 웹창이 뜨면서 플레이어가 뜹니다. &amp;nbsp;(텔레그램에서는 PC나 태블릿인 경우 팝업플레이어가 지원되지 않고, 웹플레이어만 지원됩니다.)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;여기에서 플레이 버튼을 누르면 수신된 내용을 음성으로 들어 볼수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 24pt;&quot;&gt;5. 마치며&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;봇의 이해를 위해 재미로 만들어본 서비스입니다. &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;가입없고&amp;nbsp;계정따위는 없는&amp;nbsp;&amp;nbsp;무료 서비스이니 부담없이 쓰셔도 좋습니다. ㅎ&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;table cellspacing=&quot;5&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; align=&quot;center&quot; width=&quot;428&quot; style=&quot;width: 428px;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width: 418px;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;화창한&amp;nbsp;봄날에&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;화려한 벗꼬ㅊ엔딩을 간절히 기다리는&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;가망없는 벗&lt;/span&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;에게&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;봇으로 여자&amp;nbsp;목소리를&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;흘려보내보세요.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;잘하면 꽁짜술 한잔 하실수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;- 골름골름&lt;/span&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: 630px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/274EF63A5709BECF3D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F274EF63A5709BECF3D&quot; width=&quot;630&quot; height=&quot;840&quot; filename=&quot;cherryblossom1.jpg&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;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;p&gt;PS &amp;nbsp;isaybot을 만드는데, 이번에도&amp;nbsp;forcemax님과 mo님이 수고해 주셨습니다. 감사합니다.&lt;br /&gt;&lt;table cellspacing=&quot;5&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; align=&quot;center&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width: 20px;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style=&quot;width: 288px;&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</description>
      <category>Smart-Mirror</category>
      <category>bot API</category>
      <category>Telegram</category>
      <category>text to speech (TTS)</category>
      <category>ㅆ</category>
      <author>알 수 없는 사용자</author>
      <guid isPermaLink="true">https://embian.tistory.com/122</guid>
      <comments>https://embian.tistory.com/122#entry122comment</comments>
      <pubDate>Sun, 10 Apr 2016 15:53:52 +0900</pubDate>
    </item>
    <item>
      <title>chrome speech synthesis service 개발기</title>
      <link>https://embian.tistory.com/121</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 24pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: Batang, 바탕; font-size: 24pt;&quot;&gt;chrome speech synthesis service&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Batang, 바탕; font-size: 24pt;&quot;&gt;개발기&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 24pt; font-family: Batang, 바탕;&quot;&gt;- &quot;크롬을 음성합성 서버&quot;로 사용해보자&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&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: 630px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/265A1F4556CBBF1A01&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F265A1F4556CBBF1A01&quot; width=&quot;630&quot; height=&quot;486&quot; filename=&quot;usage.jpg&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;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;&quot;사장님, 스마트 미러가 리눅스에서 잘 안돼요. 어떻하죠?&quot;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px; font-family: Batang, 바탕;&quot;&gt;작년 말에 접하게 된 마이크로소프트의 에반군이 만든 garage 프로젝트인 스마트미러(Smart Mirror)&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px; font-family: Batang, 바탕;&quot;&gt;에서 확인 했었고, 거의 모든 오픈소스 스마트 미러 프로젝트는 라즈베리파이(RPi)등의&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px; font-family: Batang, 바탕;&quot;&gt;Arm기반 보드에서 &quot;리눅스&quot;로 돌리고 있었기 때문에 믿기 힘든 비보였습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;&quot;쫌! 잘해봐. 말이돼냐? (썩소)&quot; &amp;nbsp;&quot;아니예요, 실제 잘 안된다고 어디서 본것도 같아요.(떨리는 눈빛)&quot;&lt;/span&gt;&lt;/b&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: 11pt; font-family: Batang, 바탕;&quot;&gt;'에이 설마, 또 초짜 주우우니어 호빗 개발자의 닥질..' &amp;nbsp;여전히 그 생각이였고, 솔직히&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Batang, 바탕; font-size: 11pt; line-height: 1.5;&quot;&gt;다른 OS에서 다되는데 리눅스에서 안된다는 건 약간은 리눅스(마이프레셔스!)를 데탑으로&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Batang, 바탕; font-size: 11pt; line-height: 1.5;&quot;&gt;끌어 안고 사는 한때 호빗 개발자였던 골름의 밥상에 돌 던진듯한 느낌을 받는...&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&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: 11pt; font-family: Batang, 바탕;&quot;&gt;&quot;그래 뭐가 안된다는 건데?(썩소2)&quot; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;아, 제가 이번에 연동한게 유투브, 지도API, 어쩌구 저쩌구...&quot;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;&quot;아 그러니까 뭐가 안된다는 건데?(확신찬 썩소썩소썩소)&quot; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt; &lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;&quot;.. 그러니까.. 저.. 말하는게 안되요!&quot;&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: 11pt; font-family: Batang, 바탕;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;&quot;응?!? &amp;nbsp;혹시 말하기 기능 넣었어?(반짝반짝)&quot; &amp;nbsp; &quot;..네..&quot;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt; &amp;nbsp;(이 시점에서 소으니:골름 = 1:0!)&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&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;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;바로 소으니는 맥에서 잘되는걸 보여줬고, 리눅스에서는 안되는것도 보여줬다. (2:0!)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;&quot;아.. 그..러네. &amp;nbsp;그래도 니가 비동기 방식의 javascript 쓰다가 뭔가 잘못한거?&quot; (쓸데없는 의심, 3:0!)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b style=&quot;font-family: Batang, 바탕; font-size: 14.6667px; line-height: 22px;&quot;&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;&quot;네, &amp;nbsp;그런데 일단 코드가 너무 간단해서... 잘못하기 힘든데요?&quot;&lt;/span&gt;&lt;/b&gt;&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;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;Batang, 바탕&quot;&gt;&lt;span style=&quot;font-size: 18pt; line-height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;크롬에서 음성합성 예제: HTML5 Speech Synthesis API 사용&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;Batang, 바탕&quot;&gt;&lt;span style=&quot;font-size: 18pt; line-height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;========================================&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&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;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: 630px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/21178D3B56CBC4B818&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F21178D3B56CBC4B818&quot; width=&quot;630&quot; height=&quot;467&quot; filename=&quot;please talk to me.png&quot; filemime=&quot;image/png&quot;/&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;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;여기서 말하기 기능이라는 것은 '음성합성' 또는 'Speech Synthesis'라고 불립니다. &amp;nbsp;다들 아시겠지만, 우리가 은행이나 콜센터에 전화를 걸었을 때 자동으로 대답을 해주는 약간 어색한 사람 목소리를 위장한 마디마디 리코딩된&amp;nbsp;기계음 등이 이 부류입니다. &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;코드군:&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;var utterance = new SpeechSynthesisUtterance('Hello, 세상');&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;var voices = window.speechSynthesis.getVoices();&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;utterance.voice = voices.filter(function(voice) { return voice.name == 'Google 한국의'; })[0];&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;window.speechSynthesis(utterance);&lt;/span&gt;&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;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;'잉, 코드군이 너무 간단한데? '&amp;nbsp;&lt;/span&gt;&lt;/b&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: 11pt; font-family: Batang, 바탕;&quot;&gt;뒷목이 뻑뻑한 느낌이 들더군요. 지은죄가 있는지라 몇일 구글군의 힘을 빌어 뒷북 뒤지기를&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;시작했는데, 음성합성을 쓰기 위해서 엔지니어링 관점에서 몇가지 알고 있어야 될것들이 나왔습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&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: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt; line-height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;음성합성(Speech Synthesis) 간략정리&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt; line-height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;=========================&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt; line-height: 22px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px; font-family: Batang, 바탕;&quot;&gt;0. Speech Synthesis는 나름 긴역사가 있다. &amp;nbsp;특히 예전에 sphinxsearch검색하면 검색결과 밀어&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px; font-family: Batang, 바탕;&quot;&gt;버리고 쓸데 없이 나오던 sphinx도 speech 관련해서 꽤 유명한 놈이더라. (제대로 잡설!)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px; font-family: Batang, 바탕;&quot;&gt;1. 웹브라우저가 사용할수 있는 Speech Synthesis API는 &amp;nbsp;Speech Recognition API와 나름 2년이나 되었다. &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px; font-family: Batang, 바탕;&quot;&gt;(since google chrome 33+, 현재 쓰고 있는 버젼은 48+)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px; font-family: Batang, 바탕;&quot;&gt;구글 크롬이야 당연히 지원하고 있었고, 사파리도 지원하고 브라우저들이 다들 지원하는 분위기다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px; font-family: Batang, 바탕;&quot;&gt;2. &amp;nbsp;위의 내용 1을 순진하게 믿고 테스트 하다보면, 지금 그닥 쓸만한 놈은 chrome이다. &amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px; font-family: Batang, 바탕;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;그리고 된다는 SSML은 아직 안된다.&amp;nbsp; SSML은 음성합성을 XML로 표기하여 끝말올리기, 반복하기 등을 표기할수 있는 방법입니다. &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px; font-family: Batang, 바탕;&quot;&gt;3. &amp;nbsp;그리고 결정적인, Speech Synthesis가 &quot;리눅스에서는 안되고, 맥에서는 된다&quot;는 틀렸다. &amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt; font-family: Batang, 바탕;&quot;&gt;정확한 정보는 &quot;(목소리가 없기 때문에) chromium에서는 안되고, chrome에서는 된다&quot; 이다. &amp;nbsp;(앗싸. &amp;nbsp;3:1!)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px; font-family: Batang, 바탕;&quot;&gt;3번은 알고 나면 허무하지만, 약간의 보충설명이 필요합니다. 그래서 조금 내용을 살펴 보겠습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px;&quot;&gt;&lt;br /&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: 14.6667px; line-height: 22px;&quot;&gt;&lt;br /&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: 14.6667px; line-height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt; font-family: Batang, 바탕;&quot;&gt;Chromium은 Chrome과 다르기 때문에&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt; font-family: Batang, 바탕;&quot;&gt;구글의 완성도 높은&amp;nbsp;&amp;nbsp;아름다운 목소리를 가져올수 없습니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt; font-family: Batang, 바탕;&quot;&gt;======================================&lt;/span&gt;&lt;/b&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: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;원래 웹브라우저의 Speech Synthesis API에 대한 표준화 문서를 보면,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; line-height: 1.5; font-family: Batang, 바탕;&quot;&gt;Speech Synthesis API는 API이지 실제 voice라는 리소스는 웹브라우저가&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;지원(provision)할수도 있고, OS가 지원하는 네이티브 리소스로 (따라서 chrome external)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;voice를 사용할 수도 있습니다. (양자택일!)&lt;/span&gt;&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;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;그런데, 대부분의 우리가 수행했던 Speech Synthesis의 테스트는&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;구글 크롬(default로 날아오는 voice는 google이 제공)했기 때문에 문제가 없었고,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;쓸수 있는 API만 있지만, chromium은 google의 voice API 키가 없기 때문에,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;말할 '목소리'가 없습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;기계가 목소리가 없어서 인간이 안되고 결국 허무하게 여기서 거품으로 끝난다는건 어디서 많이본&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;동화같습니다.&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; line-height: 1.5; font-family: Batang, 바탕;&quot;&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;span style=&quot;font-size: 11pt; line-height: 1.5;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&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;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;그럼 소으니가 말했던&amp;nbsp;스마트 미러가 맥은 되고 리눅스에서는 목소리가 안나오는 이유는 뭘까요? &amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;네. 우리가 쓴&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; line-height: 1.5; font-family: Batang, 바탕;&quot;&gt;node.js의 electron은 (예전에는 ATOM으로 불렸었죠) chrom&quot;ium&quot;의 분신이고&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;따라서 보이스 실물 리소스가 존재하지 않습니다. 구글에서 허락없이 땡겨올수 없기 때문이죠. &amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;하지만, Mac에서 제공하는 네이티브 목소리가 있기 때문에 맥(electron)에서는 잘 되었던거고,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;리눅스(electron)에서는 안된겁니다. &amp;nbsp;여기서 &quot;댕~&quot;하는 상황은 리눅스의 chrome에서는 되니까&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;더 헛갈린겁니다. &amp;nbsp;알고나면, 구글의 chrome이니까. &amp;nbsp;구글 목소리니까 당연한거죠.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;즉, 확실한건 chrome != chromium에서 생기는 문제인거요.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px; font-family: Batang, 바탕;&quot;&gt;아, 참고로 chromium을 걍 컴파일 해서 쓸까 (electron) 했는데요, 저같은 생각을&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px;&quot;&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;하는 골름들이 무지 많나 봅니다. chromium 사이트에 &lt;/span&gt;&lt;span style=&quot;color: rgb(255, 255, 255); font-family: Batang, 바탕; background-color: rgb(255, 187, 0);&quot;&gt;노란색 볼드체&lt;/span&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt; 으로&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px; font-family: Batang, 바탕;&quot;&gt;이렇게 적혀 있네요. ㅎ&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;https://www.chromium.org/developers/how-tos/api-keys&lt;/span&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: 630px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/214FFC4556CBBEA803&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F214FFC4556CBBEA803&quot; width=&quot;630&quot; height=&quot;581&quot; filename=&quot;do not ask speech api key.png&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&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;span style=&quot;font-family: Batang, 바탕;&quot;&gt;&quot;Do NOT post to the various Chromium groups/mailing lists for questions about the Speech API.&quot;&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 style=&quot;font-size: 14.6667px; line-height: 22px; font-family: Batang, 바탕;&quot;&gt;(헐- 넹. 골름골름)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;Chrome에서 사용 가능한 목소리들은 OS별로 살짝 다릅니다.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 18pt; font-family: Batang, 바탕;&quot;&gt;========================================&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;실제 가장 많이들 쓰시는 Windows 10(7,8도 비슷할겁니다)에서 chrome을 사용하면&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;운영체제가 제공하는 네이티브목소리 (언어별로 하나씩 있는듯 보입니다!) 한개만&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;&quot;Lang&quot;환경에 딱 맞춰서 추가 사용가능하며, 크롬에서는 가지고 있는 목소리&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;다주세요 라고 하면 구글 목소리 리스트에 딸랑 한개 더 얹어서 나옵니다. &amp;nbsp;맥의&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;경우에는 맥이 제공하는 목소리들 전체를 &quot;Lang&quot;환경을 &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; line-height: 1.5; font-family: Batang, 바탕;&quot;&gt;고려하지 않고 모두 다 선택할수&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; line-height: 1.5; font-family: Batang, 바탕;&quot;&gt;있게&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; line-height: 1.5; font-family: Batang, 바탕;&quot;&gt;주즈륵 보태서 보여줍니다. &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;(아, 나름 맥의 목소리 리스트도 구글군같이 아름답습니다)&amp;nbsp;&lt;/span&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;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;그럼 모바일 환경에서는 어떨까요? &amp;nbsp;일단 안드로이드의 크롬에서는 구글의 많은 언어별&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;목소리가 리스트로는 다 사용가능한것 처럼 나옵니다. 이건 근데 나름 함정입니다.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;다른 언어의 목소리를 선택하더라도 같은 목소리 한개의 목소리만 나오는데, 우리나라의&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;경우(ko-KR)를 예로 들면, 한국 여성분의 목소리 하나로 통일되어 나옵니다.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;다른 목소리를 듣고 싶으시면, 안드로이드의 OS언어환경을 바꾸시면 그 환경에&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;맞는 한개의 목소리만 나옵니다. &amp;nbsp;즉 동시에 두개의 언어의 목소리는 들을수&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;없습니다. &amp;nbsp;이런 접근은 Windows의 접근이랑 비슷합니다.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; line-height: 1.5; font-family: Batang, 바탕;&quot;&gt;(네. 착한 구글군이 요즘은 많이 다르네요.&amp;nbsp;&amp;nbsp;아마도 단일 언어 사용자가 대부분인 OS&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; line-height: 1.5; font-family: Batang, 바탕;&quot;&gt;환경을 고려한&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; line-height: 1.5; font-family: Batang, 바탕;&quot;&gt;배려이겠지만서도, 선택 따위는 니가가라 하와이~네요. OS가 되는 순간,&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; line-height: 1.5; font-family: Batang, 바탕;&quot;&gt;약간&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; line-height: 1.5; font-family: Batang, 바탕;&quot;&gt;거만한 느낌이 듭니다. 쩝.) &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;참 여담으로 애플사의 iPad 에서는 chrome이 뭐가 잘못되었는지 소리가 안나더군요. &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;그리고 ChromeOS/ChromeBit는 없어서 테스트 못해봤습니다.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;Note: &amp;nbsp;그리고 약간 더 헛갈리는건 다같은 chrome이라도 안드로이드의 목소리&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;이름(voice name)이 데탑용 OS에서 와는 다르게 나옵니다. &amp;nbsp;예를들어,&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;원도우,맥,리눅스 OS에서는 구글의 우리나라 목소리는 &quot;Google 한국의&quot;(ko-KR) 인데&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;한국어일때는 &quot;대한민국&quot; 한국 으로 나오고, 영어일때는 심지어&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;&quot;Korean South Korea&quot;(ko_KR)로 나옵니다. &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt; font-family: Batang, 바탕;&quot;&gt;범용적 웹어플 만들때 무지 곤란할것 같습니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 18.6667px; line-height: 28px;&quot;&gt;&lt;b&gt;&lt;div&gt;&lt;span style=&quot;font-size: 18pt; font-family: Batang, 바탕;&quot;&gt;그럼, 크로미엄(chromium)기반 또는&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 18pt; font-family: Batang, 바탕;&quot;&gt;스마트 미러에서 목소리가 나오게 하려면 어떻게 해야 할까요?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;===================================================&lt;/span&gt;&lt;/div&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;힘듭니다. 대신 정품 무료 chrome을 쓰시면 됩니다. 하지만, kiosk같이 원도우 매니저의 기능으로&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;웹앱을 만드시려면, 또는 저희같이 node.js electron.js 를 쓰려면 얄짜없이 OS에서&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;제공하는 목소리를 &amp;nbsp;fallback됩니다.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;근데 이렇게 대충 하다보면 개발비 백만원짜리 거울아거울아 탄생도 가능합니다. &amp;nbsp;두둥.&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;이건&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; line-height: 1.5; font-family: Batang, 바탕;&quot;&gt;여러모로 봅잡하죠. 그래도 꼭 하시고 싶으시면 OS를 구분으로 제가 생각할수 있는 몇가지&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;옵션을 생각해 볼수 있습니다. &amp;nbsp;일단 제 개인적인 생각이니 참고만 하시면 좋겠네요. &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;(가정: 모든 OS에서 node.js electron은 돕니다.) &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;1) 원도우로 한다. &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;&amp;nbsp; &amp;nbsp;일단 제일 싸고 입맛에 맞는 저렴한 Intel Stick PC (아톰 기반) 나 패드를 약 10만원에 구입합니다.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;&amp;nbsp; &amp;nbsp;원도우8 깔려있으니 걍 쓰거나 7월전에 빨리 10으로 공짜 업그레이드 합니다. &amp;nbsp;작고 이쁘고 나쁘지&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;&amp;nbsp; &amp;nbsp;않은 옵션인듯 보입니다. (RPi2관련 약 2배 정도 가격으로 생각하시면 되지만서도)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;2) 맥으로한다. &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;&amp;nbsp; 미친척하고 1)에 해킨토시를 설치한다. 근데요, 아톰은 설치가 안된다는&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; line-height: 1.5; font-family: Batang, 바탕;&quot;&gt;이야기가 있던데요.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; line-height: 1.5; font-family: Batang, 바탕;&quot;&gt;&amp;nbsp; 이런 도전은 정신건강에 해로울수 있습니다.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;3) 리눅스로 한다.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;&amp;nbsp; &amp;nbsp; 아, 그런데 RPi/odroid가 안되네요. 으.. &amp;nbsp; Intel Stick PC도 안되네요. &amp;nbsp;(위설명 참조) 으...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;&amp;nbsp; &amp;nbsp;3)이 안된다는것 &amp;nbsp;심히 골름골름합니다. 그래서 RPi는 구글님이 chrome을 안주니&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;(chromium만 존재) 포기 하더라도, &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; line-height: 1.5; font-family: Batang, 바탕;&quot;&gt;인텔에서 안되는건 진짜 못참겠습니다. &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; line-height: 1.5;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px; font-family: Batang, 바탕;&quot;&gt;(아, RPi qemu로 x86 emul 하면 어떨지는 모르겠네요. OS2개 크롬(미엄) 2개? ㅎ)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; line-height: 1.5; font-family: Batang, 바탕;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; line-height: 1.5;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; line-height: 1.5;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14pt; font-family: Batang, 바탕;&quot;&gt;음 &lt;/span&gt;&lt;span style=&quot;font-size: 14pt; font-family: Batang, 바탕;&quot;&gt;&amp;nbsp;포기하기는 좀 그렇고, 뭔가 하면 될것도 같은데요?&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p style=&quot;clear: both; float: right;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; line-height: 1.5; font-family: Batang, 바탕;&quot;&gt;Note: &amp;nbsp;참, 여기 한번 가보세요. http://labs.naver.com/&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px; font-family: Batang, 바탕;&quot;&gt;&amp;nbsp; &amp;nbsp;이번 스마트 미러 프로젝트에 필요한 모든 기술을 다 똬악 모아서 하고 있네요. ㅎ&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; line-height: 1.5; font-family: Batang, 바탕;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 나름 열심히 잘하는것 같기는 합니다. &amp;nbsp;음성인식/음성합성/기계번역등은 앞으로 IT의 발전에&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 중요한 공공재와 같다고 &amp;nbsp;생각합니다. &amp;nbsp;그런 취지에서 보면 정말 칭찬해주고 싶습니다. &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; line-height: 1.5; font-family: Batang, 바탕;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 어째튼,&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; line-height: 1.5; font-family: Batang, 바탕;&quot;&gt;&amp;nbsp;막써야 되는 공공재를 약간 조심스럽고 고급스럽게 접근하는게 제 취향은 아닌듯 보입니다.&lt;/span&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;div&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;그럼 내 데스크탑&amp;nbsp;Chrome을 서버로 써서,&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt; font-family: Batang, 바탕;&quot;&gt;&quot;Chrome이 대신 말하게&quot; 하면 어떨까요?&lt;/span&gt;&lt;span style=&quot;font-size: 18pt; line-height: 1.5; font-family: Batang, 바탕;&quot;&gt;=============================&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&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: 630px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/274A9C4556CBBF1107&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F274A9C4556CBBF1107&quot; width=&quot;630&quot; height=&quot;426&quot; filename=&quot;brainstroming.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;이렇게 하면, 위의 인텔PC 기반에서 리눅스(마이프레셔스!)에서 돌릴수 있습니다.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;그리고 여차하면, RPi를 그냥 쓰고 말하기를 딴데로 보낼수도 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;(물론 생각해 보면 &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; line-height: 1.5; font-family: Batang, 바탕;&quot;&gt;다시 택배 받을수도 있을겁니다. WebRTC? ㅋ 가난하게 살다보면 뭐..)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;어째튼, Chrome을 서버로 쓰는걸 만들기로 해봅니다, 골름골름~&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;그래서 Chrome을 웹 보이스 서버로 세워봤습니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;==================================&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;준비물:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;0) 스피커 달린 Intel PC + 마이프레셔스 &amp;nbsp;(뭐 개발용 아무거나)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;1) 웹서버 (node.js, express 씁시다. npm install 좋던데요?)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;2) 대신 말해줄 google chrome (네 여기 까지는 구글군이 꽁짜로 줍니다)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;여기서 문제는 1)과 2)의 연결 문제인데요, 제가 동굴에서 물고기를 쌩으로 자바(script) 먹을 때랑은&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;다른 새로운 세상이 열렸더군요. socket.io라는 그물(socket)으로 편하게 잡을수 있더군요.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;그래서 그걸로 1)과 2)를 연결하면 되겠더군요.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;... 그리고 &amp;nbsp;결과물이 여기 있습니다. &amp;nbsp;코드는 이것저것 빌려왔는데,&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;만들다 보니 살짝 재미있는 장난감이 나왔습니다.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt; line-height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;쓸데없는 소리 이제 그만! &amp;nbsp;Show Me! Please talk&amp;nbsp;to me!&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt; line-height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;======================================&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&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;div class=&quot;tt-youtube-plugin&quot; style=&quot;text-align: center&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/i22C0WzVB1Q?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 style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px; font-family: Batang, 바탕;&quot;&gt;1) &amp;nbsp;기본테스트: &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px; font-family: Batang, 바탕;&quot;&gt;너그러운 마음에서 데모 한번 봐주시고, &amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px; font-family: Batang, 바탕;&quot;&gt;http://speech.embian.com/&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px; font-family: Batang, 바탕;&quot;&gt;2) &amp;nbsp;확장테스트:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px; font-family: Batang, 바탕;&quot;&gt;재미로 준비한 추가 데모 꼭 해보시고, 한번 쭉 소리나는거 들으시고,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px; font-family: Batang, 바탕;&quot;&gt;*setting: 의 en-GB 를 ko-KR로 바꿔 들어 보세요 ㅎ&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px; font-family: Batang, 바탕;&quot;&gt;(강추! 우리집 꼬마가 좋아합니다.)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px; font-family: Batang, 바탕;&quot;&gt;중국어/영어/일어/스페인어등 언어 공부하시는 분들 무료로 활용법을 찾으시면&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px; font-family: Batang, 바탕;&quot;&gt;만든 골름은 무지 감사할것 같습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px; font-family: Batang, 바탕;&quot;&gt;http://speech.embian.com/rap&lt;/span&gt;&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;span style=&quot;font-size: 14.6667px; line-height: 22px; font-family: Batang, 바탕;&quot;&gt;3) &amp;nbsp;혹시 수정이나 설치 필요하신 분 계시면 github에서 오픈소스로 제공합니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px; font-family: Batang, 바탕;&quot;&gt;https://github.com/embian-inc/chrome-speech-synthesis&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px;&quot;&gt;&lt;strike&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;아, 외로운 친구의 PC/폰에 크롬띄워놓고 이성의 목소리로 &quot;밥 먹으로 가요&quot;를&amp;nbsp;&lt;/span&gt;&lt;/strike&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; line-height: 22px;&quot;&gt;&lt;strike&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;날려볼수 있습니다. &amp;nbsp;퍽이나 재미집니다. &amp;nbsp;골름골름~&lt;/span&gt;&lt;/strike&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 24px; line-height: 36px; font-family: Batang, 바탕;&quot;&gt;맺음말&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt; font-family: Batang, 바탕;&quot;&gt;=====&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;동굴에 들어간지 오래 되어 소스가 날것이라 전혀 이쁘지는 않습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; line-height: 1.5; font-family: Batang, 바탕;&quot;&gt;지나가던 저희 개발자 호빗 무리들이 무지 비웃었습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; line-height: 1.5;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; line-height: 1.5; font-family: Batang, 바탕;&quot;&gt;하지만, 골름은 사랑받기 위해서&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;태어난 한때 호빗이였던 아이입니다. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;이뻐해 주시면 좋겠네요. (최종스코어: &amp;nbsp;3:2!)&lt;/span&gt;&lt;/b&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: 11pt; font-family: Batang, 바탕;&quot;&gt;그럼 전 가족부양하러 물고기 잡으러 다시 동굴로 돌아갑니다.&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; line-height: 1.5; font-family: Batang, 바탕;&quot;&gt;긴글 읽어 주셔서 감사합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;마이프레셔스, 골름골름~&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;ps 결국 구글님이 무료로 열어줘서 편하게 쓰지 않을까 생각합니다.&amp;nbsp;언젠가는 ^^&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; line-height: 1.5;&quot;&gt;&lt;strike&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;아님 네이버님, 왓쓴님&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Batang, 바탕;&quot;&gt;이라도. &amp;nbsp;아니면 누군가는 문익점 되서&amp;nbsp;디지탈씨앗 몇개 날라야죠,&amp;nbsp;뭐.&amp;nbsp;&lt;/span&gt;&lt;/strike&gt;&lt;/span&gt;&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;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;References:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;Standard for Web Speech Synthesis&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;:&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;* https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#examples-synthesis&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;Standard for SSML&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;* http://stackoverflow.com/questions/21952736/the-right-way-to-use-ssml-with-web-speech-api&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;* https://www.w3.org/TR/speech-synthesis11/#edef_emphasis&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;Main Code of Speech Synthesis API Example&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; font-family: Batang, 바탕;&quot;&gt;* http://blog.teamtreehouse.com/getting-started-speech-synthesis-api&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Smart-Mirror</category>
      <category>smart-mirror</category>
      <category>smartmirror</category>
      <category>스마트미러</category>
      <author>알 수 없는 사용자</author>
      <guid isPermaLink="true">https://embian.tistory.com/121</guid>
      <comments>https://embian.tistory.com/121#entry121comment</comments>
      <pubDate>Tue, 23 Feb 2016 12:30:23 +0900</pubDate>
    </item>
    <item>
      <title>주니어 개발자의 smart-mirror 프로젝트 경험기</title>
      <link>https://embian.tistory.com/120</link>
      <description>&lt;p&gt;12월 중순&amp;nbsp;쯤&amp;nbsp;회사내에&amp;nbsp;흥미로운 동영상이&amp;nbsp;공유 되었는데&amp;nbsp;바로&amp;nbsp;&lt;span style=&quot;line-height: 1.5;&quot;&gt;smart-mirror 라는 프로젝트였습니다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;아래 동영상을 보시면 smart-mirror에서&amp;nbsp;사용자의 음성으로&amp;nbsp;지도나&amp;nbsp;philips hue 전등을 컨트롤 하는 모습을 보실 수 있을 것입니다. 되게 fancy해 보이지 않나요?&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;smart-mirror에서 사용한 언어는 javascript이며&amp;nbsp;&amp;nbsp;speech recognition library로는&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://github.com/TalAter/annyang&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot; style=&quot;line-height: 1.5;&quot;&gt;annyang&lt;/a&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt; 을 사용하고 있었습니다.&lt;/span&gt;&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/PDIbhV8Nvq8?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: center;&quot;&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;&lt;span style=&quot;font-size: 8pt;&quot;&gt;[ &amp;nbsp;smart-mirror[&lt;a href=&quot;https://github.com/evancohen/smart-mirror&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;링크&lt;/a&gt;]&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 8pt;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;회사 내에서도&amp;nbsp;우리도 해보자라는 의견이 나오기도 했고&amp;nbsp;&lt;span style=&quot;line-height: 1.5;&quot;&gt;마침 이전 프로젝트도 끝나고 시간이 남아 G&lt;/span&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;ar&lt;/span&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;age Project로 smart-mirror를 하게 되었습니다.&lt;/span&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;2주 동안 진행했던&amp;nbsp;이 프로젝트의 1단계 목표는 아래와 같습니다.&lt;/span&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;line-height: 1.5;&quot;&gt;첫번째, smart-mirror 한글화&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;두번째, 재미있는 기능(&lt;/span&gt;youtube search, 지하철 도착 정보, Sound Cloud 음악 재생 등&lt;span style=&quot;line-height: 1.5;&quot;&gt;) 추가&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;이 프로젝트에서&amp;nbsp;추가로 사용한 API는 다음과 같습니다.&amp;nbsp;&lt;/span&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;1. Youtube Data API&amp;nbsp;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;2. 서울시 지하철 도착정보 open API&amp;nbsp;&lt;/p&gt;&lt;p&gt;3. Sound Cloud API&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;smart-mirror는 소프트웨어 측면보다 하드웨어 측면에서 준비하는 시간이 걸렸습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;준비물(원하는 결과물에 따라 가격이 달라질 수 있습니다&lt;span style=&quot;line-height: 1.5;&quot;&gt;.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;594&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;border:none;border-collapse:collapse;;font-family:돋움;font-size:12px&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width:297;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-top:1px solid #ccc;border-left:1px solid #ccc;;&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;물품&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width:297;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-top:1px solid #ccc;;&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;가격 (단위: 원)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width:297;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-top:1px solid #ccc;border-left:1px solid #ccc;;&quot; rowspan=&quot;1&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;회사에 안쓰고 굴러다니던 오래된 태블릿&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;width:297;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-top:1px solid #ccc;;&quot; rowspan=&quot;1&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;0&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:297;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-top:1px solid #ccc;border-left:1px solid #ccc;;&quot; rowspan=&quot;1&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;philips hue 전등&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;width:297;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-top:1px solid #ccc;;&quot; rowspan=&quot;1&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;279,000&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:297;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-top:1px solid #ccc;border-left:1px solid #ccc;;&quot; rowspan=&quot;1&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;고대유물이 되어&amp;nbsp;방치 되었던 서버랙 유리 문짝&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;width:297;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-top:1px solid #ccc;;&quot; rowspan=&quot;1&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;0&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:297;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-top:1px solid #ccc;border-left:1px solid #ccc;;&quot; rowspan=&quot;1&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;절연테이프&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;width:297;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-top:1px solid #ccc;;&quot; rowspan=&quot;1&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;1300&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:297;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-top:1px solid #ccc;border-left:1px solid #ccc;;&quot; rowspan=&quot;1&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;아크릴 (가로:&amp;nbsp;40cm ,&amp;nbsp;세로 : 50cm)&amp;nbsp;&amp;nbsp;1개&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;width:297;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-top:1px solid #ccc;;&quot; rowspan=&quot;1&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;10,000&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:297;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-top:1px solid #ccc;border-left:1px solid #ccc;;&quot; rowspan=&quot;1&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;미러필름 1m~2m&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;width:297;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-top:1px solid #ccc;;&quot; rowspan=&quot;1&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;18,000&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:297;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-top:1px solid #ccc;border-left:1px solid #ccc;;&quot; rowspan=&quot;1&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;총 비용&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;width:297;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-top:1px solid #ccc;;&quot; rowspan=&quot;1&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;308,300&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;하드웨어 구성을 살펴 보면 라즈베리파이 2, USB microphone, 모니터, one-way mirror,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;philips hue 전등으로 구성되어 있었는데 &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;라즈베리파이 2 + 모니터 &amp;nbsp;대신 사용한지 오래된 노트북이나 태블릿 등을 사용하였고,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;philips hue 전등은&amp;nbsp;&lt;a href=&quot;http://www.frisbeekorea.com/shop/goods/goods_view.php?goodsno=2838&amp;amp;category=003021&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;color: rgb(0, 85, 255);&quot;&gt;프리스비&lt;/span&gt;&lt;/a&gt;에서 구매하였습니다. 한가지 남은게 있다면 &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;one-way mirror가 관건이었습니다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;현재 한국에서&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;one-way mirror를 구하는 것이 어려울 뿐만 아니라 상당히 비싼&amp;nbsp;가격에 판매되고 있어서 대체&amp;nbsp;할 만한 것을 계속&amp;nbsp;찾아보다 유리에 미러필름을 &amp;nbsp;붙였습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;미러필름의 판매처는&amp;nbsp;&lt;a href=&quot;http://www.any-mall.co.kr/shop/shopdetail.html?branduid=111053&amp;amp;NaPm=ct%3Dijxz0abr%7Cci%3Dcheckout%7Ctr%3Dco%7Ctrx%3D%7Chk%3Da693fe3a0d4047c74cdf96b79d9b507b6e6cee22&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;color: rgb(0, 85, 255);&quot;&gt;다음 링크&lt;/span&gt;&lt;/a&gt;에서 확인하세요.[사이트내에 가격이 30m가&amp;nbsp;180,000원, 1m~2m가 18,000원에 판매 되고 있습니다.&amp;nbsp;]&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;594&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;border:none;border-collapse:collapse;;font-family:돋움;font-size:12px&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width:297;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-top:1px solid #ccc;border-left:1px solid #ccc;;&quot; rowspan=&quot;1&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;evancohen의 smart-mirror&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;width:297;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-top:1px solid #ccc;;&quot; rowspan=&quot;1&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;embian의 smart-mirror&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width:297;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-top:1px solid #ccc;border-left:1px solid #ccc;;&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-size: 10.6667px; line-height: 16px; text-align: center;&quot;&gt;라즈베리파이 2, USB microphone, 모니터&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width:297;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-top:1px solid #ccc;;&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-size: 10.6667px; line-height: 16px;&quot;&gt;&amp;nbsp;사용한지 오래된 노트북이나 태블릿&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;&lt;td style=&quot;width:297;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-left:1px solid #ccc;;&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-size: 10.6667px; line-height: 16px; text-align: center;&quot;&gt;&amp;nbsp;one-way mirror&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width:297;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;;&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-size: 8pt;&quot;&gt;아크릴 +&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.any-mall.co.kr/shop/shopdetail.html?branduid=111053&amp;amp;NaPm=ct%3Dijxz0abr%7Cci%3Dcheckout%7Ctr%3Dco%7Ctrx%3D%7Chk%3Da693fe3a0d4047c74cdf96b79d9b507b6e6cee22&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot; style=&quot;line-height: 1.5;&quot;&gt;&lt;span style=&quot;font-size: 8pt;&quot;&gt;미러필름&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 8pt;&quot;&gt;&amp;nbsp;or 유리 + 미러필름 or 유리 액자 + 미러 필름&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&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;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: 630px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2201364B56C43E7B25&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2201364B56C43E7B25&quot; width=&quot;630&quot; height=&quot;473&quot; filename=&quot;IMG_0838 (1).jpg&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;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: 630px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/222C734B56C43E7D14&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F222C734B56C43E7D14&quot; width=&quot;630&quot; height=&quot;473&quot; filename=&quot;IMG_0852 (1).jpg&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;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: 630px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/253BEB4B56C43E7E0D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F253BEB4B56C43E7E0D&quot; width=&quot;630&quot; height=&quot;473&quot; filename=&quot;IMG_0886 (1).jpg&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;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: 630px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/273E5C4B56C43E800C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F273E5C4B56C43E800C&quot; width=&quot;630&quot; height=&quot;473&quot; filename=&quot;IMG_0890 (1).jpg&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;font-size: 8pt; line-height: 1.5;&quot;&gt;[one-way mirror 제작 과정]&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 8pt; 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;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: 473px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2760754B56C53AEE0B&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2760754B56C53AEE0B&quot; width=&quot;473&quot; height=&quot;630&quot; filename=&quot;IMG_0945.jpg&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;font-size: 8pt; line-height: 1.5;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;font-size: 10.6667px; line-height: 16px;&quot;&gt;절연테이프를 붙인&amp;nbsp;one-way mirror 뒷면&lt;/span&gt;&lt;span style=&quot;font-size: 8pt; line-height: 1.5;&quot;&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: 473px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2723F84B56C53AEF25&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2723F84B56C53AEF25&quot; width=&quot;473&quot; height=&quot;630&quot; filename=&quot;IMG_0946.jpg&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;font-size: 10.6667px; line-height: 16px;&quot;&gt;[one-way mirror 앞면]&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 8pt; line-height: 1.5;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;2주 동안 작업한 이 프로젝트의 최종 결과물은 다음과 같습니다.&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: 630px; width: 630px; height: 473px;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/272A054056C4415132&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F272A054056C4415132&quot; width=&quot;630&quot; height=&quot;473&quot; filename=&quot;IMG_0937.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;width: 630px; height: 473px;&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;font-size: 8pt; line-height: 1.5;&quot;&gt;[스마트 미러]&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 8pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;코드는 다음 링크에서 확인하실 수 있습니다. Github :&amp;nbsp;https://github.com/embian-inc/smart-mirror-ko.git&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;시연동영상은 다음과 같습니다.&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style=&quot;text-align: center&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/hluRkE8JwHM&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt; &lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;현재 smart-mirror는 mac,window,ubuntu 환경에서 모두 사용&amp;nbsp;가능하며 android의 경우 &lt;a href=&quot;https://github.com/HannahMitt/HomeMirror&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;color: rgb(0, 85, 255);&quot;&gt;다음링크&lt;/span&gt;&lt;/a&gt;를 참고하세요.&amp;nbsp;&lt;/p&gt;</description>
      <category>Smart-Mirror</category>
      <category>smart-mirror</category>
      <category>스마트 미러</category>
      <author>알 수 없는 사용자</author>
      <guid isPermaLink="true">https://embian.tistory.com/120</guid>
      <comments>https://embian.tistory.com/120#entry120comment</comments>
      <pubDate>Wed, 17 Feb 2016 18:10:36 +0900</pubDate>
    </item>
    <item>
      <title>E2E Monitor 고도화 - BCI를 통한 자동 정보 수집</title>
      <link>https://embian.tistory.com/119</link>
      <description>&lt;p&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;&quot;&lt;/span&gt;&lt;a href=&quot;http://blog.embian.com/106&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot; style=&quot;line-height: 1.5;&quot;&gt;&lt;span style=&quot;color: rgb(9, 0, 255);&quot;&gt;E2E Monitor 프로젝트&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;&quot;가 끝난 후 고도화 작업이 진행되었습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(9, 0, 255);&quot;&gt;&lt;a href=&quot;http://blog.embian.com/106&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;color: rgb(9, 0, 255);&quot;&gt;E2E Monitor 프로젝트&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(9, 0, 255);&quot;&gt;&lt;a href=&quot;http://blog.embian.com/106&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;color: rgb(9, 0, 255);&quot;&gt;&amp;nbsp;회고&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;&quot;포스팅을 보면,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;프로젝트 진행 당시&amp;nbsp;빠른 시간 안에 결과물을 만들어서 검증하기 위해 추적 정보 생성기를&amp;nbsp;&quot;수동 추적 방식&quot;으로&amp;nbsp;개발하였습니다. 하지만&amp;nbsp;&quot;수동 추적 방식&quot;은 모니터링 대상&amp;nbsp;시스템에 바로&amp;nbsp;적용이 어렵기&amp;nbsp;때문에 E2E Monitor의 최우선 과제로 &quot;자동 추적 방식&quot;을 꼽았습니다. 따라서 자연스럽게 Back-end&amp;nbsp;고도화는 &quot;&lt;/span&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;BCI(Byte Code Instrumentation)기법을 사용한 자동 추적 정보 생성기 개발&quot; 이 되었습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;고도화 부분&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;E2E Monitor 프로젝트는 아래 &amp;lt;그림1.&amp;gt;처럼&amp;nbsp;크게 3가지의 구성요소로 나뉘는데요,&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 16.3636px; text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 400px; width: 400px; height: 245px;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/230C723556C2AEB328&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F230C723556C2AEB328&quot; width=&quot;400&quot; height=&quot;245&quot; filename=&quot;고도화-2.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;width: 400px; height: 245px;&quot;/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;&amp;lt;그림 1. E2E Monitor 구성요소&amp;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;에 대해 &quot;자동 추적 방식&quot;을 사용할 수 있도록 고도화를 진행하였습니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;font color=&quot;#4c4c4c&quot;&gt;&lt;span style=&quot;font-size: 16px; line-height: 21.8182px;&quot;&gt;&lt;b&gt;추적 정보 생성기 개발&lt;/b&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;자동 추적 방식을 도입하기 위해 BCI 기법을 사용한 여러 가지 모니터링&amp;nbsp;툴을 조사하던 중 ASM 기반으로 구현되어있는&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;Java Agent&amp;nbsp;프로그램인 Byteman을&amp;nbsp;접하게 되었습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;Byteman은 재컴파일이나 재구동 없이 실행 중인 어플리케이션에 Bytecode를 변형, 주입 및 제거 가능한 기능을 가지고 있습니다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;Byteman에서 사용하는 DSL(Domain-Specific Language)로&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;&quot;Rule&quot; base&amp;nbsp;script를 생성하여&lt;/span&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;&lt;b&gt;동적으로 디버깅 코드를 디버깅 대상&amp;nbsp;Application에&amp;nbsp;적용&amp;nbsp;가능&lt;/b&gt;합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;즉, Byteman을 도입하면&amp;nbsp;&quot;Rule&quot; Script를 통해 E2E Monitor에서 필요한&lt;/span&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;&amp;nbsp;정보를 모을 수 있는 추적정보 생성기를 &lt;b&gt;모니터링 대상 Application에 동적으로 적&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;&lt;b&gt;용 가능&lt;/b&gt;한 것입니다. 이러한 이점 때문에 &amp;nbsp;Byteman을 도입, 자&lt;/span&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;동 추적 정보 생성기를 개발하였습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#4c4c4c&quot;&gt;&lt;span style=&quot;font-size: 16px; line-height: 21.8182px;&quot;&gt;&lt;b&gt;자동 추적 정보 생성기가 수집하는 정보&lt;/b&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;기존에 개발했던 수동 추적 정보 생성기에서 생성한&amp;nbsp;정보들을 전부 수집 및 생성할 수 없었지만, 사용자 프로그램에 표시하기 위한&amp;nbsp;기본정보가&amp;nbsp;추출됨을 확인하였습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;자동 추적 정보 생성기에서&amp;nbsp;추출할 수 있었던 정보는 다음과 같습니다.&lt;br /&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;line-height: 16.3636px;&quot;&gt;1. 하나의&lt;/span&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;&amp;nbsp;네트워크 통신의&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;시작과 끝&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 16.3636px;&quot;&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;2. 하나의 네트워크&amp;nbsp;통신을 처리하는 데&amp;nbsp;걸린 시간&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 16.3636px;&quot;&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;3. 네트워크&amp;nbsp;Request&amp;nbsp;종류, URI,&amp;nbsp;파라미터 이름, 파라미터값 -&amp;gt; 고도화에서 추가된 정보&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 16.3636px;&quot;&gt;4.&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;현재 모니터링&amp;nbsp;하고 있는 Application의 이름&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 16.3636px;&quot;&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;5.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;네트워크 통신 처리 시&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;수행된 Method 이름&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 16.3636px;&quot;&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;6. 네트워크 통신 시퀀스 정보(네트워크 통신&amp;nbsp;또는&amp;nbsp;DB 질의가 발생한 경우 Call Stack처럼 수집) -&amp;gt; 고도화에서&amp;nbsp;추가된&amp;nbsp;정보&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;line-height: 16.3636px;&quot;&gt;7. DB&amp;nbsp;쿼리와 수행 시간 -&amp;gt; 고도화에서 추가된 정보&lt;/p&gt;&lt;p style=&quot;line-height: 16.3636px;&quot;&gt;8. E2E Monitor에서 추적에&amp;nbsp;필요한 필수 정보를 HTTP&amp;nbsp;통신 시 사용하는 Client 헤더에 자동으로 Inject&lt;/p&gt;&lt;p style=&quot;line-height: 16.3636px;&quot;&gt;9. Throw된 Exception 기록&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;Emulator에 자동 추적 정보 생성기를 실행하여&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;E2E Monitor의 사용자 프로그램이 어떻게&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;표현&lt;/span&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;해 주는지 확인해 보았습니다.&lt;/span&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;먼저 수동 추적 생성기를 적용한 경우 사용자 프로그램은&amp;nbsp;아래와 같이 표현됩니다.&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 630px; text-align: center; line-height: 1.5;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/261B943D56C43F2730&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F261B943D56C43F2730&quot; width=&quot;630&quot; height=&quot;453&quot; filename=&quot;12345.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;text-align: center; line-height: 1.5;&quot;/&gt;&lt;/span&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;&amp;lt;그림 1. 수동 추적 정보 수집기를 사용한 경우 볼 수 있는&amp;nbsp;정보&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&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: 630px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2373314356C43D7F18&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2373314356C43D7F18&quot; width=&quot;630&quot; height=&quot;432&quot; filename=&quot;1234.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;&amp;lt;그림 2. 자동 추적 정보 수집기만을&amp;nbsp;사용한 경우 볼 수 있는&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;정보&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;수동 추적 정보 수집기가&amp;nbsp;보여주는 정보에 비해서 빈약한 정보를 보여주고 있지만, 자동으로 수집된 정보는&amp;nbsp;사용자에게 대략적인 네트워크 플로우를 보여줄 수 있는 수준입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;font color=&quot;#4c4c4c&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;마무리&lt;/span&gt;&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;이번 고도화에서&amp;nbsp;모니터링 대상 시스템에&amp;nbsp;BCI 기법을 도입한 자동추적 정보 수집기를&amp;nbsp;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;동적으로 적용 할 수 있게 하였습니다. 기본적인 정보를 자동 수집하여&amp;nbsp;사용자 프로그램에서&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;표현이 가능했지만, 추가로&amp;nbsp;모은 정보를 표현하지 못한 부분이 있었습니다.&amp;nbsp;이는&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;추적정보 처리기와 사용자 프로그램이 같이 개발&amp;nbsp;되어야 했기 때문입니다. 이 부분은&amp;nbsp;향후 개발 계획에 넣어 놓고 이번 고도화를&amp;nbsp;마무리 지었습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;E2E Monitor는 이제 기존의 수동 정보 수집 방식에 더하여 자동 정보 수집 방식까지 갖추게 되었습니다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;E2E Monitor v3.0을 기대하며 이번 포스팅을 마칩니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>E2E-Monitor</category>
      <author>알 수 없는 사용자</author>
      <guid isPermaLink="true">https://embian.tistory.com/119</guid>
      <comments>https://embian.tistory.com/119#entry119comment</comments>
      <pubDate>Tue, 16 Feb 2016 12:30:25 +0900</pubDate>
    </item>
    <item>
      <title>E2E Monitor UI 고도화 회고</title>
      <link>https://embian.tistory.com/118</link>
      <description>&lt;p style=&quot;font-size: 12px;&quot;&gt;얼마전에 마무리 되었던&amp;nbsp;E2E Monitor 프로젝트의&amp;nbsp;고도화 작업이 있었습니다. 이 작업에 제가 참여하게 되었는데요.&lt;/p&gt;&lt;p style=&quot;font-size: 12px;&quot;&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;font-size: 8pt;&quot;&gt;*혹시 E2E Monitor에 대해 궁금하시다면 &lt;a href=&quot;http://blog.embian.com/106&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;다음 링크&lt;/a&gt;를 참조해 주세요!&lt;/span&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12px;&quot;&gt;E2E Monitor 고도화 작업은&amp;nbsp;크게 두가지로 나뉘었습니다.&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;font-size: 12px;&quot;&gt;&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&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt; font-family: Dotum, 돋움;&quot;&gt;첫번째, &lt;/span&gt;&lt;span style=&quot;font-size: 9pt; font-family: Dotum, 돋움;&quot;&gt;BCI(Byte Code&amp;nbsp;Instrument)&amp;nbsp;작업&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;&lt;span style=&quot;font-size: 9pt; font-family: Dotum, 돋움;&quot;&gt;두번째, &lt;/span&gt;&lt;span style=&quot;font-size: 9pt; font-family: Dotum, 돋움;&quot;&gt;E2E Monitor UI 고도화&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;line-height: 1.5; font-size: 9pt; font-family: Dotum, 돋움;&quot;&gt;&amp;nbsp;→&amp;nbsp;저랑 종민씨가 담당했던 부분&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/div&gt;&lt;p style=&quot;font-size: 12px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12px;&quot;&gt;이번 글에는 저랑 종민씨가&amp;nbsp;담당했던&amp;nbsp;E2E Monitor UI 고도화 작업에 대한 이야기를 풀어볼까 합니다.&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;font-size: 12px;&quot;&gt;E2E Monitor UI 고도화 작업의 목표는 Dashboard 개인화였습니다.&amp;nbsp;&lt;span style=&quot;line-height: 1.5;&quot;&gt;Dashboard 개인화란&lt;/span&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;&amp;nbsp;운영자마다 또는 시스템 마다 보고 싶은 정보가 조금씩 다를 수 있기 때문에&amp;nbsp;사용자들이 원하는 데로&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;Dashboard를 편집 할 수 있도록 하는 것입니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12px;&quot;&gt;본격적으로 작업을 시작하기 전에 Dashboard UI와 관련된 자료를 찾아 보기 시작 했고 Dashboard 개인화를 하는데 참고한 오픈소스는&amp;nbsp;아래와 같습니다.&lt;/p&gt;&lt;p style=&quot;font-size: 12px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12px;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;b&gt;1. &lt;a href=&quot;http://nickholub.github.io/angular-dashboard-app/#/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://nickholub.github.io/angular-dashboard-app/#/&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12px;&quot;&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;이 오픈 소스의 경우에는 사용자들이 원하는 위젯을 추가 삭제할 수 있도록 구현 되어있었습니다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;아쉬운 점이라면 정렬이 되지 않아 다소 산만해 보이는다는 점입니다.&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;font-size: 12px; text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12px; text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 630px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2640F54D5694A3EB11&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2640F54D5694A3EB11&quot; width=&quot;630&quot; height=&quot;492&quot; filename=&quot;Screenshot from 2016-01-12 11:16:07.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12px; text-align: center;&quot;&gt;[nickholub - angular-dashboard-app]&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12px;&quot;&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12px;&quot;&gt;&lt;span style=&quot;line-height: 1.5; font-size: 12pt;&quot;&gt;&lt;b&gt;2. &lt;a href=&quot;http://angular-dashboard-framework.github.io/angular-dashboard-framework/#/sample/01&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://angular-dashboard-framework.github.io/angular-dashboard-framework/#/sample/01&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12px;&quot;&gt;이 오픈 소스의 경우에는 사용자가 위젯을 추가 삭제 할 수 있고, 일정한 비율로 정렬 할 수 있으며 , 원하는 위치로 drag&amp;amp;drop 할 수 있도록 구현되어 있었습니다.&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;font-size: 12px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12px; text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 630px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2471094E5694A40306&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2471094E5694A40306&quot; width=&quot;630&quot; height=&quot;487&quot; filename=&quot;Screenshot from 2016-01-12 11:24:55.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12px; text-align: center;&quot;&gt;[angular-dashboard-framework]&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12px; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12px;&quot;&gt;위 2가지 오픈소스의 장점을 참고해 만들었던&amp;nbsp;&lt;span style=&quot;line-height: 1.5;&quot;&gt;E2E Monitor의 대략적인&amp;nbsp;스토리보드 중 하나는&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;아래와 같습니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12px; text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12px; text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 630px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/25167F4B5694A41527&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F25167F4B5694A41527&quot; width=&quot;630&quot; height=&quot;470&quot; filename=&quot;Screenshot from 2016-01-12 11:41:56.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12px; text-align: center;&quot;&gt;[E2E Monitor &amp;nbsp;스토리보드]&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12px;&quot;&gt;이렇게 스토리 보드를 작성하고, 약 1개월 동안 개발을 하였습니다.&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;font-size: 12px;&quot;&gt;E2E Monitor 2.0에는 Responsive Web, Dashboard Customizing, Widget Modularization 등의 기능을 추가로 개발하였는데요.&lt;/p&gt;&lt;p style=&quot;font-size: 12px;&quot;&gt;Dashboard Customizing에서는 편집모드에서&amp;nbsp;Dashboard 하나 하나를 이루고 잇는 그래프들을 하나의 위젯이라 생각하고 Drag&amp;amp;drop을 하는 기능이 필요했고, 이 와 관련된 라이브러리로 사용했던 것이 &lt;a href=&quot;https://github.com/RubaXa/Sortable&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot; style=&quot;line-height: 1.5;&quot;&gt;SortableJS&lt;/a&gt;입니다.&lt;/p&gt;&lt;p style=&quot;font-size: 12px;&quot;&gt;&lt;a href=&quot;https://github.com/codef0rmer/angular-dragdrop&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;angular-dragdrop&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://github.com/a5hik/ng-sortable&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;ng-sortable&lt;/a&gt; 같은 라이브러리도 고려 하였으나 가장 많이 사용하기도 하고, 사용하기도 쉽고, 문서도 잘 되있어&amp;nbsp;SortableJS를 사용하게 되었습니다.&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;font-size: 12px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12px;&quot;&gt;그래서 Dashboard를 Customizing할 수 있는&amp;nbsp;E2E Monitor는 다음과 같습니다.&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;font-size: 12px; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12px; text-align: center;&quot;&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12px; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;Demo는&lt;/span&gt;&lt;a href=&quot;http://e2edemo.embian.com/#/e2emDashboard&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;http://e2edemo.embian.com/#/e2emDashboard &lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;에서 확인 하실 수 있습니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12px; text-align: center;&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;1&quot; border=&quot;0&quot; class=&quot;txc-layout-wz&quot;&gt;&lt;tbody&gt;			
&lt;tr&gt;				&lt;td width=&quot;259&quot; valign=&quot;top&quot; class=&quot;txc-layout-image&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: 300px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2272923F5694A4CE2B&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2272923F5694A4CE2B&quot; width=&quot;300&quot; height=&quot;206&quot; filename=&quot;pastedImage0.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;				&lt;td width=&quot;6&quot; class=&quot;txc-layout-blank&quot;&gt;&lt;/td&gt;				&lt;td width=&quot;259&quot; valign=&quot;top&quot; class=&quot;txc-layout-image&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: 300px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/274899465694A4E601&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F274899465694A4E601&quot; width=&quot;300&quot; height=&quot;234&quot; filename=&quot;Screenshot from 2016-01-12 14:36: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;br /&gt;&lt;/p&gt;&lt;/td&gt;			&lt;/tr&gt;			
&lt;tr&gt;				&lt;td valign=&quot;top&quot; class=&quot;txc-layout-details&quot; style=&quot;padding:8px 0 2px 5px;&quot;&gt;&lt;p class=&quot;txc-notexist &quot; style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;line-height: 1.5; text-align: justify;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;line-height: 1.5; text-align: justify;&quot;&gt;E2E-Monitor v1.0&lt;/span&gt;&lt;span style=&quot;line-height: 1.5; text-align: justify;&quot;&gt;]&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;				&lt;td class=&quot;txc-layout-blank&quot;&gt;&lt;/td&gt;				&lt;td valign=&quot;top&quot; class=&quot;txc-layout-details&quot; style=&quot;padding:8px 0 2px 5px;&quot;&gt;&lt;p class=&quot;txc-notexist &quot; style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;line-height: 1.5; text-align: justify;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 1.5; text-align: justify;&quot;&gt;[E2E-Monitor v2.0]&lt;/span&gt;&lt;span style=&quot;line-height: 1.5; text-align: justify;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;			&lt;/tr&gt;			
&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12px;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;b&gt;추후 고려해야 할 사항&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;font-size: 12px;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 9pt; line-height: 20px;&quot;&gt;개발 완료 후&amp;nbsp;회사 분들과 함께 논의를 한 결과 좀 더 개선 해야 할 사항과 의견들이 있었습니다.&amp;nbsp;&lt;/span&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: 20px;&quot;&gt;&lt;b&gt;첫번째, Performance 측면에서 문제가 없을까?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 13.3333px; line-height: 20px;&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&lt;b&gt;두번째,활용의 측면에서 Widget에 대한 설명이 명확하지 않다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 20px; font-size: 9pt; font-family: Dotum, 돋움;&quot;&gt;&lt;b&gt;세번째,Dashboard에서 한번에 여러 서비스를 관제하게 될 경우를 고려해 보자&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 20px;&quot;&gt;&lt;b&gt;.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 20px;&quot;&gt;&lt;b&gt;.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p style=&quot;font-size: 12px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 9pt; font-family: Dotum, 돋움;&quot;&gt;&amp;nbsp;이러한 사항은 추후 E2E-Monitor v3.0에서 적용해 볼 계획입니다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>E2E-Monitor</category>
      <category>Angular</category>
      <category>Angular Dashboard</category>
      <category>apm</category>
      <category>Dashboard</category>
      <category>E2E Monitor</category>
      <category>sortable</category>
      <author>알 수 없는 사용자</author>
      <guid isPermaLink="true">https://embian.tistory.com/118</guid>
      <comments>https://embian.tistory.com/118#entry118comment</comments>
      <pubDate>Tue, 12 Jan 2016 16:04:31 +0900</pubDate>
    </item>
    <item>
      <title>E2E-Monitor와 Pinpoint 비교</title>
      <link>https://embian.tistory.com/117</link>
      <description>&lt;p&gt;E2E-Monitor와 Pinpoint를 비교한 Slide자료 입니다. 비교시 사용한 &lt;span style=&quot;line-height: 16.3636px;&quot;&gt;Pinpoint&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;버전은 1.5.0 입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 16.3636px;&quot;&gt;더불어, 아래 데모 사이트에서 E2E-Monitor를 체험 해 보실 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a href=&quot;http://e2edemo.embian.com/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot; style=&quot;line-height: 16.3636px;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;데모 사이트&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;http://e2edemo.embian.com/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot; style=&quot;line-height: 16.3636px;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&amp;nbsp;바로가기 :&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;http://e2edemo.embian.com/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot; style=&quot;line-height: 16.3636px;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;http://e2edemo.embian.com/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot; style=&quot;line-height: 16.3636px;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;http://e2edemo.embian.com/&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/key/6TxQQ1yoi8QsaJ&quot; width=&quot;595&quot; height=&quot;485&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;&quot; allowfullscreen=&quot;&quot;&gt; &lt;/iframe&gt; &lt;div style=&quot;margin-bottom:5px&quot;&gt; &lt;strong&gt; &lt;a href=&quot;//www.slideshare.net/JungKim12/e2emonitor-pinpoint-56188343&quot; title=&quot;E2E-Monitor와 Pinpoint 비교&quot; target=&quot;_blank&quot;&gt;E2E-Monitor와 Pinpoint 비교&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href=&quot;//www.slideshare.net/JungKim12&quot; target=&quot;_blank&quot;&gt;Jung Kim&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;참고 자료:&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/naver/pinpoint&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://github.com/naver/pinpoint&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://d2.naver.com/helloworld/1194202&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://d2.naver.com/helloworld/1194202&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>E2E-Monitor</category>
      <author>알 수 없는 사용자</author>
      <guid isPermaLink="true">https://embian.tistory.com/117</guid>
      <comments>https://embian.tistory.com/117#entry117comment</comments>
      <pubDate>Mon, 14 Dec 2015 11:31:21 +0900</pubDate>
    </item>
    <item>
      <title>E2E-Monitor 개발 프로젝트 회고(3/3), 시스템 구성과 기술들</title>
      <link>https://embian.tistory.com/116</link>
      <description>&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;&quot;E2E-Monitor 개발 프로젝트 회고&quot;&amp;nbsp;마지막 글이 되겠네요.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;마지막으로 다룰 내용은&amp;nbsp;E2E-Monitor의 Back-end 부분에 대한 이야기 입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;초기에 설계했던 시스템 구조에서부터&amp;nbsp;프로젝트 완료 당시의 변화된&amp;nbsp;시스템 구조까지, 그&amp;nbsp;변화 과정을 살펴 보면서&amp;nbsp;왜&amp;nbsp;구조가 이렇게&amp;nbsp;변경되어 왔는지, 그리고 거기에 사용했던 솔루션들은 어떤 기준으로 도입했는지에 대해서 이야기해 볼까 합니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(53, 53, 53);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;E2E-Monitor의 시스템 구성과 사용했던 기술들&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;처음에 고객사로부터 받은 요구 사항은 상당히 구체적인 것처럼 보이면서도 한편으로는&amp;nbsp;모호한 것들이 많은 상태였습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(76, 76, 76);&quot;&gt;가장 먼저 필요했던 것은,&amp;nbsp;고객의 요구 사항에&amp;nbsp;대해서 저희가 정확하게&amp;nbsp;이해하고 있는지에 대한&amp;nbsp;확인 작업이었습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(76, 76, 76);&quot;&gt;그래서 일단, 1차적으로&amp;nbsp;분석한&amp;nbsp;요구 사항을 바탕으로 &quot;시스템 구조도&quot;를 작성해 보기로 했습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;모호했던&amp;nbsp;부분들은 우선&amp;nbsp;나름대로의&amp;nbsp;상상력을 동원해 가며 채워 넣고, 나중에 고객사에게 확인을 받기로 했습니다.&lt;/span&gt;&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;span style=&quot;color: rgb(76, 76, 76); font-size: 14pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;첫번째 시스템 구조도&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;아래의 그림이 E2E-Monitor의 첫번째&amp;nbsp;시스템 구조도 입니다.&lt;/span&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: 630px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/26526F46566916A028&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F26526F46566916A028&quot; width=&quot;630&quot; height=&quot;455&quot; filename=&quot;E2E_1st_architecture.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;i&gt;&lt;span style=&quot;font-size: 8pt; color: rgb(76, 76, 76);&quot;&gt;[그림 1.&amp;nbsp;E2E-Monitor 시스템 구조도 - v1]&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;Log Transmission Layer는 모니터링 대상이 될&amp;nbsp;시스템으로부터&amp;nbsp;추적&amp;nbsp;정보를 전달 받는&amp;nbsp;부분입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;구조도를&amp;nbsp;보시면 Log Collector와 Polling Processor가 각각 Message Queue로 데이터를 보낼 수 있도록&amp;nbsp;연결되어 있는 것을&amp;nbsp;보실 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;Log Collector와 Polling Processor를&amp;nbsp;함께 둔 이유는, 당시에는 대상&amp;nbsp;시스템에서 어떤 방식으로 추적 정보를 전달받을 수 있을지&amp;nbsp;몰랐기 때문입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;그래서&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(76, 76, 76);&quot;&gt;일단 Push 방식과 Polling 방식 두가지 모두를 처리할 수 있는 구조를 생각하게 되었습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;그리고,&amp;nbsp;Message Queue를 임시 저장소로 사용함으로써&amp;nbsp;여러가지 전달 방식에 따라 유동적으로 대처할 수 있도록 설계했습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;Log Process Layer는 수집된 추적 정보를 분석하고&amp;nbsp;재가공해서 저장소에&amp;nbsp;저장하는 부분입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;Log Pre-processor는&amp;nbsp;Message Queue에서 추적 정보를 가져와 저장소에 저장하고 CEP Engine으로 데이터를 전달&amp;nbsp;하는 역할을 합니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;CEP&amp;nbsp;Engine(실시간 이벤트 분석,&amp;nbsp;처리&amp;nbsp;솔루션)은 Log Pre-processor로부터 전달 받은 데이터에서 특정 이벤트 또는,&amp;nbsp;이벤트 패턴이 발견되면&amp;nbsp;데이터를 Log Post-processor로 전달합니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;Log Post-processor는 CEP Engine으로 부터 전달 받은 데이터의 유형에 따라 사용자에게 바로 메세지를 보내거나 저장소에 저장하는 역할을 담당하게 됩니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;그리고 웹 클라이언트에게 화면에 보여줄 데이터를 전송하는&amp;nbsp;API 서버도 이 Layer에 두었습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;그 외 데이터를 저장소하기 위한 Data Layer,&amp;nbsp;사용자가 웹브라우저를 통해 접근할 수 있는 Presentation Layer를 분리 시켜놓았습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;첫번째 시스템 구조도는 비록, 이 후 많은 변경이 이루어지긴 했지만, 고객사의 요구사항 분석이나, 고객사와의 업무 범위를 조율하는데 많은 도움이 되었고, 시스템의 골격을 잡는 데 큰 역할을 했습니다.&lt;/span&gt;&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;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76); font-size: 14pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;두번째 시스템 구조도&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;다음에 있는&amp;nbsp;구조도는 고객사와의 업무 범위 조율 및 요구 사항 협의가 어느정도 마무리 된 다음에&amp;nbsp;작성된 것으로, E2E-Monitor의 두번째 시스템 구조도 입니다.&lt;/span&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: 630px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/27097B4B566E2D1C1B&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F27097B4B566E2D1C1B&quot; width=&quot;630&quot; height=&quot;285&quot; filename=&quot;E2E_2st_architecture.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;i&gt;&lt;span style=&quot;font-size: 8pt; color: rgb(76, 76, 76);&quot;&gt;[그림 2. 요구 사항 협의 후 수정된 시스템 구조도 - v2]&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;첫번째 구조도와 달라진 점을 찾아볼까요?&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;우선 첫번째 시스템 구조에 있던 Polling processor가 없어졌습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;기존 대상 시스템들을 확인한 결과, 모든 시스템들이 Log Collector를 통해 Message Queue로 추적 정보를 보내는데 문제가 없는 것으로 확인되었습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;그래서 추적 정보를 수집하는 것은 Log Collector로 단일화 하기로 하고, Polling processor는 구조도에서 제외했습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;다음으로 달라진 점은 CEP Engine을 빼고 그자리에 Log Filter와 WebSocket 모듈이 추가된 부분입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;CEP Engine을 추가하는 것은, 필요 이상으로 개발 비용 및 기간이 증가할 수 있다는 점과 CEP Engine 운영 인력 부제등의 문제가 주요 이유로 작용했습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;그대신 간단하게 CEP Engine의 역할을 할 수 있도록 간단하게 Log Filter를 구현하고 실시간 서비스를 위해 WebSocket 모듈을 추가해 놓았습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;그리고 데이터 저장소 부분은 MySQL이나 PostgreSQL같은 RDBMS가 아닌 Elastic Search을&amp;nbsp;사용하기로 했습니다.&lt;/span&gt;&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;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;Elastic Search 도입 이유&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;Elastic Search를 사용하기로 한 가장 큰 이유는&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(76, 76, 76);&quot;&gt;데이터&amp;nbsp;분산 저장 때문이었습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(76, 76, 76);&quot;&gt;E2E-Monitor는 대상&amp;nbsp;시스템에 종속적인 시스템입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(76, 76, 76);&quot;&gt;대상 시스템에서 발생하는 모든 이벤트를 저장해야 하고, 시스템&amp;nbsp;Scale-out 가능성에 대비해야 합니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(76, 76, 76);&quot;&gt;이러한 특성을 만족시키기 위해 가장 신경썻던 부분은&amp;nbsp;데이터&amp;nbsp;저장소 부분이었습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;원활한 Scale-out을 위해서는 늘어나는 데이터량에 대응할 수 있는 Write 성능과 데이터 분산 저장이 필요했습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(76, 76, 76);&quot;&gt;MySQL이나&amp;nbsp;PostgreSQL같은 오픈소스 DB&lt;/span&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(76, 76, 76);&quot;&gt;로는 Write 성능도 일정 수준 이상 높이기 힘들었고(스토리지를 SSD를 쓰면 될것 같은데 비용이 문제), 데이터도 분산해서 저장할 수 없었습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(76, 76, 76);&quot;&gt;결국 Data Sharding&amp;nbsp;기술을 이용하는 솔루션을 사용해야 했는데, 오픈소스 진영을 솔루션들 중에서&amp;nbsp;Data Sharding을 지원하는 솔루션으로 고려 대상이 되었던&amp;nbsp;것이&amp;nbsp;MongoDB와 Elastic Search였습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(76, 76, 76);&quot;&gt;두가지 솔루션 모두 시스템 Scale-out과 데이터 Sharding을 지원합니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(76, 76, 76);&quot;&gt;이제 두가지 솔루션 중 어떤 것이 E2E-Monitor에 더 적합한 솔루션인지 이것저것&amp;nbsp;고려해보고 결정하는&amp;nbsp;일이 남았습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(76, 76, 76);&quot;&gt;두가지 솔루션중 Elastic Search를 선택한 이유는 E2E-Monitor가&amp;nbsp;주로 사용해야 할&amp;nbsp;쿼리 패턴 때문이었습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(76, 76, 76);&quot;&gt;E2E-Monitor에서 사용해야 할&amp;nbsp;쿼리의 대부분은&amp;nbsp;Grouping, Sorting, Searching 기능들이었습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(76, 76, 76);&quot;&gt;관제를 위해 필요한 데이터는 넉넉하게 잡아도 두달치 정도면 충분 할 것으로 예상했습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(76, 76, 76);&quot;&gt;옛날&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(76, 76, 76);&quot;&gt;데이터까지&lt;/span&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(76, 76, 76);&quot;&gt;&amp;nbsp;모두 저장할 필요가&amp;nbsp;없었습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(76, 76, 76);&quot;&gt;최근&amp;nbsp;데이터만 저장하고 있으면서 데이터 Aggregation과 Searching 쿼리를 주로 사용&amp;nbsp;하기에는 MongoDB보다는&amp;nbsp;Elastic Search가 더 적합한&amp;nbsp;솔루션이라고 판단했습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b style=&quot;font-size: 18.6667px; line-height: 28px;&quot;&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;시스템 구조도 최종본&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(76, 76, 76);&quot;&gt;두번째 시스템 구조도가 완성된 시점에는 요구사항 수집 및 분석은 거의 마무리 된 상태였습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;시스템 구조도의 최종본은 시스템 설계를 완료하면서 함께 완성되었습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;불확실했던 부분들이 확실히 지고, 구체적인 기능들이 명세화 되면서 실제 구현해야 될 시스템의 모습이 Diagram위에 그 모습을 드러내기 시작했습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;완성된 시스템의 구조도는&lt;/span&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;&amp;nbsp;다음과 같습니다.&lt;/span&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: 630px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/23178B44566E2A6103&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F23178B44566E2A6103&quot; width=&quot;630&quot; height=&quot;339&quot; filename=&quot;e3e_architecture.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;i&gt;&lt;span style=&quot;font-size: 8pt; color: rgb(76, 76, 76);&quot;&gt;[그림 3. 최종 시스템 구조도 - v3]&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;마지막 시스템 구조도에서는 일단 Log Pre-processor가 MQ Consumer로 이름이 바뀌었습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;실제 기능에 맞는 직관적인 이름을 주는 것이 개발중에 이루어지는 커뮤니케이션에&lt;/span&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;&amp;nbsp;더 효율적일 것이라는 판단때문이었습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;그리고 두번째 시스템 구조도에 있었던 Log Filter와 WebSocket 모듈을 모두 빠졌습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;실시간 이벤트 패턴 검색 기능 및 알람 기능&lt;/span&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;은 &lt;/span&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;개발 비용 및 일정 때문에 우선순위에서 계속 밀리다가 결국에는&amp;nbsp;기능 자체를 없에는 것으로 결정되었습니다. (고도화 계획에&amp;nbsp;포함)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(53, 53, 53);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;초기에 계획에 없다가 마지막에 추가된 모듈도 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;새로 추가된 Log Composer는 Transaction에 대한 통계를 내기 위한 모듈입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;이 모듈이 추가되기 전까지&amp;nbsp;E2E-Monitor는 하나의 Request에 대한 처리 결과를 하나의 데이터로 취급했었습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(76, 76, 76);&quot;&gt;예를 들어 &quot;/user/join&quot;이라는 하나의 Request에 대한 처리 과정을 span이라고 부르고, 이 span에 대한 통계 데이터를 보여주기로 했습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(76, 76, 76);&quot;&gt;하지만,&amp;nbsp;여러차례 논의 과정을 거치면서 span에 대한 정보만으로는 전체적인 서비스의 흐름을 파악하기 힘들다는 결론을 내리게 됩니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;이제 E2E-Monitor는 &lt;/span&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;하나의 논리적인 Action을 구성하는 여러개의 span을 하나의&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;Transaction으로 보고, 이 Transaction을 기준 데이터로 사용하기로 합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;Transaction이라는 것이 여러개의 span들로 구성되어 있기 때문에 span들을 Grouping하고 Transaction에 대한 정보를 추가로 생산해 내기 위해서는 새로운 모듈이 필요하게 되었고, 그래서 추가된 모듈이 Log Composer입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;Log Composer는 Span 데이터를 Grouping하고 재구성해서 새로운 Transaction 정보를 만들어내서 저장소에 저장하는 역할을 합니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(53, 53, 53);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(53, 53, 53);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#353535&quot;&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;PostgreSQL 도입 이유&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;Log Composer가 사용하는 저장소를 보시면 Elastic Search와 함께&amp;nbsp;PostgreSQL이 있는 것을 보실 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;두번째 시스템 구조에서는 없던 PostgreSQL을 새로 추가한 이유는 통계 데이터를 저장하기 위해서 입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;단순 환경 설정 값들과,&lt;/span&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(76, 76, 76);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(76, 76, 76);&quot;&gt;영구적으로 보관해야 하는&amp;nbsp;Transaction 통계 데이터를 저장하기 위한 공간으로,&lt;/span&gt;&lt;span style=&quot;color: rgb(76, 76, 76); line-height: 1.5;&quot;&gt;&amp;nbsp;고객사에서 기존에 사용하고 있던 PostgreSQL사용하기로 했습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;최종 시스템 구조도에서는 변경된 구조를 반영한 것 뿐만 아니라,&amp;nbsp;각&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(76, 76, 76); line-height: 1.5;&quot;&gt;모듈에서&amp;nbsp;실제로 사용할 구체적인 솔루션들에 대한 내용도 추가되었습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76); line-height: 1.5;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(53, 53, 53); font-size: 14pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;LogStash 도입 이유&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;Log Collector에서 사용한 LogStash는 대상 시스템과의 Coupling을 최소화하기 위해 사용했습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;대상 시스템에서 바로 다른 저장소로 데이터를 전송하는 것보다는, 대상 시스템은 추적 정보를&amp;nbsp;파일에&amp;nbsp;적게 하고, 파일에 적힌 데이터는 다른 프로그램이 읽어서 전송하게 함으로써, E2E-Monitor와&amp;nbsp;대상 시스템간의 Coupling이 줄 수 있도록 설계했습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;그리고 Log파일을 읽어서 Message Queue로 전송하는 일은 LogStash가 하도록 했습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;LogStash는 Fleuntd나 기타 다른 솔루션으로 대체가 가능한데, 저희에게는 가장 손이 익은 솔루션이 LogStash라서&amp;nbsp;선택하게 되었습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#353535&quot;&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#353535&quot;&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;Kafka 도입 이유&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(76, 76, 76);&quot;&gt;Message Queue는 Kafka를 사용하기로 했는데, 가장 많이 사용되고 있는 Rabbit MQ 대신 Kafka를 사용한 이유는, Kafka가&amp;nbsp;실시간 대용량 분산 Message 처리에 특화되어 있기 때문이었습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#353535&quot;&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;그리고 이미 고객사에서 Message Queue로 Kafka를 사용하고 있기 때문에 도입하는데 아무런 문제가 없었습니다.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(53, 53, 53);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(76, 76, 76);&quot;&gt;시스템 구조도 최종본은 실제 시스템 개발이 들어가기 바로 전에 완성되었습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(76, 76, 76);&quot;&gt;그리고 다행히도&amp;nbsp;실제 개발 중에 구조도가 바뀌진 않았습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(76, 76, 76);&quot;&gt;만약 개발 도중 시스템 구조가 바뀌었다면, 아마도 개발 일정을 맞추지 못하는 사태가 생겼을 것 같습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#353535&quot;&gt;&lt;br /&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#353535&quot;&gt;&lt;br /&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#353535&quot;&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;마무리, 진짜 프로젝트 회고&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#353535&quot;&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;이 글을 마지막으로, E2E-Monitor 개발 프로젝트 회고 글을 모두 마쳤습니다.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#353535&quot;&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;이번 프로젝트는 2개월이라는 짧은 시간 동안 개발 인력 5명이라는&amp;nbsp;투입된 프로젝트였습니다.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#353535&quot;&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;당초 예상했던 MM이&amp;nbsp;9MM이었던 점을 감안하면, 결론적으로는 1MM이 초과되었는데, 이부분은 신입 인력 교육에&amp;nbsp;투자한 것으로&amp;nbsp;생각하기로 했습니다. (손해난 부분을 이런식으로 대충 퉁치고 넘어가기로.... ㅠ.ㅠ)&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#353535&quot;&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;사실 3명이서 3개월 정도로 예상한 프로젝트인데, 기간이 2개월로 줄면서 어쩔 수 없이 인력을 추가 투입한&amp;nbsp;케이스라고 보시면 될 것 같습니다.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#353535&quot;&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;여러가지 프로젝트를 많이 해보셨던 분들은, &lt;/span&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;&quot;3개월에 3명이서 할 일&quot;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;을 &lt;/span&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;&quot;5명을 투입해서&amp;nbsp;2개월만에 끝내라&quot;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;는 것이 그렇게 계산대로 쉽게 되는 일이 아니라는 것을 잘 아실겁니다.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#353535&quot;&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;Man-Month의 함정이라고도 하죠.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#353535&quot;&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;어찌되었건 기간은 촉박한데, 인력은 충분한 상황이었습니다.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#353535&quot;&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;그래도 어찌어찌 해서 기간안에 프로젝트를 일정대로 진행하고 완료 할 수 있었던 것은, 무리한 일정과&amp;nbsp;개발 계획 때문에 매일 매일 새벽까지 야근하면서도 웃으면서 즐겁게 일했던,&amp;nbsp;똑똑하면서도 오덕스럽고, 그리고&amp;nbsp;순박했던&amp;nbsp;우리 개발자들 때문이라고 생각합니다.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#353535&quot;&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;이 글을 빌려서, 함께 했던 우리 개발자들에게 감사의 뜻을 전하고 싶습니다.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(76, 76, 76);&quot;&gt;김민기 부장&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(76, 76, 76);&quot;&gt;&amp;lt;smoon@embian.com&amp;gt;:&lt;/span&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(76, 76, 76);&quot;&gt;&amp;nbsp;Back-end 설계 /&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;line-height: 1.5; color: rgb(76, 76, 76);&quot;&gt;개발&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;김정 대리 &amp;lt;jung@embian.com&amp;gt;: Back-end / API 개발&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;조석현 과장 &amp;lt;zoe@embian.com&amp;gt;: Front-end 개발 / 산출 문서 작성&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;한종민 사원 &amp;lt;hjm@embian.com&amp;gt;; Front-end 개발&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76);&quot;&gt;그리고 저는 (주)엠비안 개발2본부장 박재영 &amp;lt;yam@embian.com&amp;gt; 이었습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(76, 76, 76); line-height: 1.5;&quot;&gt;지금까지 긴글 읽어 주셔서 감사합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;* E2E-Monitor가&amp;nbsp;실제 작동되는 모습을 보시고 싶으신 분들은&amp;nbsp;&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;text-decoration: underline; color: rgb(65, 116, 217);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(65, 116, 217);&quot;&gt;&lt;a href=&quot;http://e2edemo.embian.com/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;color: rgb(65, 116, 217);&quot;&gt;&lt;u&gt;&lt;span style=&quot;color: rgb(65, 116, 217);&quot;&gt;E2E 데모&lt;/span&gt;&lt;/u&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/i&gt;&lt;span style=&quot;color: rgb(65, 116, 217);&quot;&gt;&lt;u&gt;&lt;span style=&quot;color: rgb(65, 116, 217);&quot;&gt;&quot;&lt;/span&gt;&lt;/u&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;를 방문하시면 확인하실 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>E2E-Monitor</category>
      <author>알 수 없는 사용자</author>
      <guid isPermaLink="true">https://embian.tistory.com/116</guid>
      <comments>https://embian.tistory.com/116#entry116comment</comments>
      <pubDate>Wed, 9 Dec 2015 16:32:04 +0900</pubDate>
    </item>
  </channel>
</rss>