<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Owl Life</title>
    <link>https://softwaree.tistory.com/</link>
    <description>개발자입니다 :-)</description>
    <language>ko</language>
    <pubDate>Sat, 11 Apr 2026 11:09:58 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Owl Life</managingEditor>
    <image>
      <title>Owl Life</title>
      <url>https://tistory1.daumcdn.net/tistory/1673495/attach/d49774cdea2744a58d699624f5b5c186</url>
      <link>https://softwaree.tistory.com</link>
    </image>
    <item>
      <title>Free Json Formatter (Beautify)</title>
      <link>https://softwaree.tistory.com/121</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 개발하다 보면 API 응답, 설정 파일, 로그에 섞인 JSON을 한눈에 읽기 좋게 만들고 싶을 때가 많습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; AllThatConverter의 JSON 포맷터(Beautify)는 브라우저에서 바로 JSON을 정리하고, 필요하면 로그에 끼어든 JSON까지 전처리한 뒤 포맷할 수 있는 무료 도구입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;이럴&amp;nbsp;때&amp;nbsp;쓰면&amp;nbsp;좋아요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- API로 받은 한 줄짜리(minified) JSON를 들여쓰기해서 보고 싶을 때 &lt;br /&gt;- 에디터/메모에 붙여 넣은 JSON이 따옴표&amp;middot;쉼표만으로는 읽기 어려울 때 &lt;br /&gt;- 로그 한 줄마다 앞에 타임스탬프&amp;middot;[body] 같은 접두어가 붙어 있어, 진짜 JSON만 이어 붙여야 할 때 &lt;br /&gt;- 정리된 JSON을 트리 구조로 펼쳐 보고 싶을 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;핵심&amp;nbsp;기능&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Beautify &amp;mdash; JSON 정리 &lt;br /&gt;붙여&amp;nbsp;넣은&amp;nbsp;문자열을&amp;nbsp;파싱한&amp;nbsp;뒤,&amp;nbsp;일정한&amp;nbsp;들여쓰기로&amp;nbsp;다시&amp;nbsp;출력합니다.&amp;nbsp;서버로&amp;nbsp;파일을&amp;nbsp;올리지&amp;nbsp;않고&amp;nbsp;브라우저&amp;nbsp;안에서만&amp;nbsp;처리됩니다. &lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;(선택)&amp;nbsp;전처리&amp;nbsp;&amp;mdash;&amp;nbsp;로그&amp;middot;특수&amp;nbsp;포맷&amp;nbsp;대응 &lt;br /&gt;로그처럼&amp;nbsp;줄마다&amp;nbsp;앞부분이&amp;nbsp;다른&amp;nbsp;경우,&amp;nbsp;정규식&amp;nbsp;프리셋으로&amp;nbsp;앞쪽&amp;nbsp;노이즈를&amp;nbsp;제거한&amp;nbsp;다음&amp;nbsp;포맷할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;자주&amp;nbsp;쓰는&amp;nbsp;패턴은&amp;nbsp;저장해&amp;nbsp;두고,&amp;nbsp;필요할&amp;nbsp;때만&amp;nbsp;켜면&amp;nbsp;됩니다. &lt;br /&gt;&lt;br /&gt;3.&amp;nbsp;트리&amp;nbsp;뷰어 &lt;br /&gt;포맷이&amp;nbsp;성공하면&amp;nbsp;Tree&amp;nbsp;viewer로&amp;nbsp;객체&amp;middot;배열&amp;nbsp;구조를&amp;nbsp;펼쳐&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;4.&amp;nbsp;샘플&amp;nbsp;불러오기 &lt;br /&gt;동작을&amp;nbsp;확인하고&amp;nbsp;싶을&amp;nbsp;때&amp;nbsp;일반&amp;nbsp;JSON&amp;nbsp;샘플과&amp;nbsp;로그에&amp;nbsp;감싼&amp;nbsp;JSON&amp;nbsp;샘플을&amp;nbsp;불러올&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://allthatconverter.web.app/tools/json/beautify-json&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;바로가기&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://allthatconverter.web.app/tools/json/beautify-json&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://allthatconverter.web.app/tools/json/beautify-json&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1775662842271&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Beautify Json | AllThatConverter&quot; data-og-description=&quot;Use AllThatConverter to beautify json in your browser. Free, no signup.&quot; data-og-host=&quot;allthatconverter.web.app&quot; data-og-source-url=&quot;https://allthatconverter.web.app/tools/json/beautify-json&quot; data-og-url=&quot;https://allthatconverter.web.app/tools/json/beautify-json&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://allthatconverter.web.app/tools/json/beautify-json&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://allthatconverter.web.app/tools/json/beautify-json&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Beautify Json | AllThatConverter&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Use AllThatConverter to beautify json in your browser. Free, no signup.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;allthatconverter.web.app&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;713&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bd9sBB/dJMcadn1I7O/PNEVKH1UW5Ervvud9ch81k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bd9sBB/dJMcadn1I7O/PNEVKH1UW5Ervvud9ch81k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bd9sBB/dJMcadn1I7O/PNEVKH1UW5Ervvud9ch81k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbd9sBB%2FdJMcadn1I7O%2FPNEVKH1UW5Ervvud9ch81k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;744&quot; height=&quot;713&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;713&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1141&quot; data-origin-height=&quot;953&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ct0hMb/dJMb990irBA/vMq3WZFMpowzxPDWmSzlM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ct0hMb/dJMb990irBA/vMq3WZFMpowzxPDWmSzlM0/img.png&quot; data-alt=&quot;Tree Viewer &amp;amp;amp; Search&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ct0hMb/dJMb990irBA/vMq3WZFMpowzxPDWmSzlM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fct0hMb%2FdJMb990irBA%2FvMq3WZFMpowzxPDWmSzlM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1141&quot; height=&quot;953&quot; data-origin-width=&quot;1141&quot; data-origin-height=&quot;953&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Tree Viewer &amp;amp; Search&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>AllThatConverter</category>
      <category>free json format</category>
      <category>json beautifier</category>
      <category>JSON Formatter</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/121</guid>
      <comments>https://softwaree.tistory.com/121#entry121comment</comments>
      <pubDate>Thu, 9 Apr 2026 00:43:49 +0900</pubDate>
    </item>
    <item>
      <title>Coroutines &amp;amp; Flows - 다섯가지 안티 패턴</title>
      <link>https://softwaree.tistory.com/120</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5 Anti-Patterns With Coroutines &amp;amp;amp; Flows You MUST Avoid!_mindmap (1).png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;520&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXep7T/btsOCMkhZX5/HXNzdv8XF7BKiSlSfKOWgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXep7T/btsOCMkhZX5/HXNzdv8XF7BKiSlSfKOWgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXep7T/btsOCMkhZX5/HXNzdv8XF7BKiSlSfKOWgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXep7T%2FbtsOCMkhZX5%2FHXNzdv8XF7BKiSlSfKOWgk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;520&quot; data-filename=&quot;5 Anti-Patterns With Coroutines &amp;amp; Flows You MUST Avoid!_mindmap (1).png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;520&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. UI 업데이트를 메인 스레드에서 하면 안 되는 이유&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5 Anti-Patterns With Coroutines &amp;amp;amp; Flows You MUST Avoid!_mindmap (2).png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;520&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqvqJL/btsOBfIdor4/XmtuPoVoCxi97yo8XSRxf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqvqJL/btsOBfIdor4/XmtuPoVoCxi97yo8XSRxf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqvqJL/btsOBfIdor4/XmtuPoVoCxi97yo8XSRxf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqvqJL%2FbtsOBfIdor4%2FXmtuPoVoCxi97yo8XSRxf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;520&quot; data-filename=&quot;5 Anti-Patterns With Coroutines &amp;amp; Flows You MUST Avoid!_mindmap (2).png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;520&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-pm-slice=&quot;3 5 [&amp;quot;lilysSection&amp;quot;,{&amp;quot;id&amp;quot;:&amp;quot;aa10a0ec-f9d1-4af9-8397-c0592309c14c&amp;quot;,&amp;quot;display&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;chunkindex&amp;quot;:0,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;loading&amp;quot;:false,&amp;quot;layout&amp;quot;:&amp;quot;paragraph&amp;quot;,&amp;quot;trigger&amp;quot;:&amp;quot;timeline&amp;quot;,&amp;quot;sentenceIndices&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;data-value&amp;quot;:&amp;quot;&amp;quot;}]&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-id=&quot;be356fd5-f960-4058-80a0-cef25e867f0e&quot;&gt;여러분 앱의 화면(UI)은 마치 상점의 간판처럼 항상 손님(사용자)에게 최신 정보를 보여줘야 합니다.&lt;/li&gt;
&lt;li data-id=&quot;566647db-8990-4ae7-a88e-48806f758c83&quot;&gt;그런데 이 간판을 업데이트하는 작업이 너무 복잡하고 오래 걸리면(CPU를 많이 사용하면), 간판이 잠시 멈춰버리겠죠?
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-id=&quot;42255ba0-836a-4dd1-8c5a-bdb519958302&quot;&gt;이처럼 뷰 모델에서 UI 상태를 업데이트하는 복잡한 로직을 실행할 때, 기본적으로는 &lt;b&gt;메인 스레드&lt;/b&gt;라는 중요한 길에서 작업하게 됩니다.&lt;/li&gt;
&lt;li data-id=&quot;4d1835a7-8dc9-45e6-b262-f2cd31388157&quot;&gt;이 길이 막히면 앱 화면 전체가 멈추는 것처럼 느껴져서 사용자가 불편함을 느낍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-id=&quot;34fec203-e725-410a-8443-8cd36407af3f&quot;&gt;이 문제를 해결하려면 복잡한 UI 업데이트 작업은 &lt;b&gt;Default Dispatcher&lt;/b&gt;라는 다른 작업자에게 맡겨야 합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-id=&quot;73f0252e-2bf8-48c3-b996-b39cd014d069&quot;&gt;이렇게 하면 메인 스레드가 막히지 않고, UI는 계속 부드럽게 움직일 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 화면 이동 시 데이터 저장이 날아가 버리는 문제&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5 Anti-Patterns With Coroutines &amp;amp;amp; Flows You MUST Avoid!_mindmap (3).png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;520&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dh4QY3/btsOCazp1xT/eWM6mQFXKcf3KyKf47OlLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dh4QY3/btsOCazp1xT/eWM6mQFXKcf3KyKf47OlLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dh4QY3/btsOCazp1xT/eWM6mQFXKcf3KyKf47OlLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdh4QY3%2FbtsOCazp1xT%2FeWM6mQFXKcf3KyKf47OlLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;520&quot; data-filename=&quot;5 Anti-Patterns With Coroutines &amp;amp; Flows You MUST Avoid!_mindmap (3).png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;520&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-pm-slice=&quot;3 5 [&amp;quot;lilysSection&amp;quot;,{&amp;quot;id&amp;quot;:&amp;quot;712a0cef-87fd-4ae6-8986-ca5591530cfd&amp;quot;,&amp;quot;display&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;chunkindex&amp;quot;:0,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;loading&amp;quot;:false,&amp;quot;layout&amp;quot;:&amp;quot;paragraph&amp;quot;,&amp;quot;trigger&amp;quot;:&amp;quot;timeline&amp;quot;,&amp;quot;sentenceIndices&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;data-value&amp;quot;:&amp;quot;&amp;quot;}]&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-id=&quot;18f022ab-c278-4d62-b6d0-fa0d97d53c09&quot;&gt;앱에서 화면을 이동할 때(예: 노트 작성 화면에서 목록 화면으로 돌아갈 때), 현재 화면과 연결된 &lt;b&gt;View Model Scope&lt;/b&gt;에서 실행 중인 코루틴은 자동으로 취소됩니다.&lt;/li&gt;
&lt;li data-id=&quot;23365571-eed7-4bee-8590-a14c7b6e4291&quot;&gt;만약 이 코루틴안에서 &lt;b&gt;데이터를 저장하거나 서버와 동기화하는 중요한 작업&lt;/b&gt;을 하고 있었다면, 화면을 이동하는 순간 그 작업이 중간에 멈춰버릴 수 있습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-id=&quot;67828fb8-22d5-4055-b7d5-01669e6af473&quot;&gt;예를 들어, 작성 중인 노트를 저장 버튼을 눌러 저장하고 바로 이전 화면으로 돌아갔는데, View Model Scope가 취소되면서 &lt;b&gt;서버에 저장되지 않는 문제&lt;/b&gt;가 발생할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-id=&quot;7cf70500-918d-4389-a7e8-254862995189&quot;&gt;이 문제를 막으려면 두 가지 방법이 있습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-id=&quot;a6318944-420a-4c3a-8879-371fa0d2ad7b&quot;&gt;첫째, 데이터 저장이 완료될 때까지 &lt;b&gt;UI에게 기다리라고 알려주고&lt;/b&gt;, 저장이 끝난 후에 화면 이동을 시킵니다.&lt;/li&gt;
&lt;li data-id=&quot;2c73ed2b-9d7f-42af-a3b3-d72a4ccdc243&quot;&gt;둘째, View Model Scope 대신 앱이 살아있는 동안 계속 유지되는 &lt;b&gt;Application Scope&lt;/b&gt;를 사용해서 중요한 백그라운드 작업을 실행합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 병렬로 할 수 있는 일을 순서대로 시키는 문제&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-pm-slice=&quot;1 1 []&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 12.3255%;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;안티 패턴&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.3256%;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;문제점&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 24.7674%;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;올바른 해결 방법&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 35.4651%;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;예시&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 12.3255%;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;병렬 작업 순차 실행&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.3256%;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;여러 코루틴 작업을 병렬로 실행하여 시간을 단축할 수 있음에도 불구하고, 순서대로 실행하게 만듦.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 24.7674%;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;모든 코루틴 작업을 먼저 시작(launch)시킨 후, 마지막에 모든 코루틴이 완료될 때까지 한꺼번에 기다림(join).&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 35.4651%;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;프로필 사진 업로드와 프로필 정보 업데이트를 동시에 진행.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 12.3255%;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;`launch` 사용 후 바로 `join` 호출&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.3256%;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;코루틴을 시작하고 바로 완료될 때까지 기다리므로, 다음 작업이 시작되기 전에 현재 작업이 끝나야 함.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 24.7674%;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;모든 `launch` 호출을 먼저 완료한 후, 마지막에 모든 `join` 호출을 수행.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 35.4651%;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;`launch { 작업1() }; launch { 작업2() }; 작업1.join(); 작업2.join()` (잘못된 방식) vs `launch { 작업1() }; launch { 작업2() }; joinAll()` (올바른 방식)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 12.3255%;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;`async` 사용 후 바로 `await` 호출&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.3256%;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;비동기 작업을 시작하고 바로 결과를 기다리므로, 비동기 작업의 이점을 살리지 못하고 순차적으로 실행됨.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 24.7674%;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;모든 `async` 호출을 먼저 완료한 후, 마지막에 모든 `await` 호출을 수행.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 35.4651%;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;`val 결과1 = async { 작업1() }.await(); val 결과2 = async { 작업2() }.await()` (잘못된 방식) vs `val 작업1 = async { 작업1() }; val 작업2 = async { 작업2() }; val 결과1 = 작업1.await(); val 결과2 = 작업2.await()` (올바른 방식)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-id=&quot;3941473d-76a8-4e85-b7b1-404fcadbfb06&quot;&gt;여러 코루틴작업을 &lt;b&gt;동시에(병렬로)&lt;/b&gt; 실행하면 전체 작업 시간을 크게 줄일 수 있습니다. 예를 들어, 프로필 사진 업로드와 프로필 정보 업데이트는 서로 기다릴 필요 없이 동시에 진행될 수 있습니다.&lt;/li&gt;
&lt;li data-id=&quot;9551cce3-a9cc-4f72-a394-7f1a9466a095&quot;&gt;하지만 launch를 사용해서 코루틴을 시작하자마자 바로 join을 호출하거나, async를 사용하고 바로 await를 호출하면, 마치 한 사람씩 줄 서서 일을 처리하는 것처럼 &lt;b&gt;순서대로 실행&lt;/b&gt;되게 만들어 버립니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-id=&quot;2a679912-cd79-4a6f-80e7-463bc2fac798&quot;&gt;launch는 코루틴을 시작하라는 명령이고, join은 그 코루틴이 끝날 때까지 기다리라는 명령입니다.&lt;/li&gt;
&lt;li data-id=&quot;a6e64adf-80cf-4860-95b1-4b0063d14eda&quot;&gt;launch 다음에 바로 join을 쓰면, 첫 번째 작업이 끝날 때까지 기다렸다가 두 번째 작업을 시작하게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-id=&quot;e7c368a1-b362-451f-827a-a2e3eccd0b63&quot;&gt;&lt;b&gt;올바르게 병렬 실행&lt;/b&gt;을 하려면, 모든 코루틴작업을 먼저 다 시작( launch)시켜 놓습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-id=&quot;c18e60e9-f041-4878-b7ea-0175f325be4e&quot;&gt;그리고 마지막에 &lt;b&gt;모든 코루틴이 완료될 때까지 한꺼번에 기다리도록&lt;/b&gt;( join) 하면 됩니다. 이렇게 해야 비로소 여러 작업이 동시에 착착 진행됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. while true 반복문에서 취소 요청이 무시되는 문제&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-pm-slice=&quot;3 5 [&amp;quot;lilysSection&amp;quot;,{&amp;quot;id&amp;quot;:&amp;quot;8a0bbbee-f620-4929-ba98-8dbb9426db77&amp;quot;,&amp;quot;display&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;chunkindex&amp;quot;:0,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;loading&amp;quot;:false,&amp;quot;layout&amp;quot;:&amp;quot;paragraph&amp;quot;,&amp;quot;trigger&amp;quot;:&amp;quot;timeline&amp;quot;,&amp;quot;sentenceIndices&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;data-value&amp;quot;:&amp;quot;&amp;quot;}]&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-id=&quot;7dfb2912-2194-45da-b883-c29e9b3213f8&quot;&gt;데이터를 주기적으로 가져오는 작업처럼 while true 무한 반복문 안에서 코루틴을 실행할 때 주의해야 할 점이 있습니다.&lt;/li&gt;
&lt;li data-id=&quot;ae155528-84f0-460c-9efb-6bc9f10cb5f8&quot;&gt;만약 이 반복문 안에 try-catch 블록을 사용하여 &lt;b&gt;일반적인 예외&lt;/b&gt;를 잡도록 코드를 작성하면 문제가 생길 수 있습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-id=&quot;6b43d720-40e3-437a-a0b2-fff99d1ea9d3&quot;&gt;코루틴이 취소될 때 발생하는 &lt;b&gt;취소 예외(Cancellation Exception)&lt;/b&gt;는 try-catch 블록에 의해 일반 예외처럼 잡혀버릴 수 있습니다.&lt;/li&gt;
&lt;li data-id=&quot;c230cfbb-8adc-4b6b-aac5-bd6bbae5e02b&quot;&gt;이렇게 되면 코루틴은 사실상 취소된 상태인데, 반복문은 취소 사실을 인지하지 못하고 계속 돌게 됩니다. 마치 &quot;&lt;b&gt;취소됐는데 취소 안 된 척&lt;/b&gt;&quot;하며 무한 루프에 빠지는 거죠.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-id=&quot;e36b6766-82ea-4c26-b6d9-4817c1fa5853&quot;&gt;이 문제를 해결하려면 try-catch 블록 안에서 예외를 잡은 후, coroutineContext.ensureActive()를 호출하여 &lt;b&gt;현재 코루틴이 활성 상태인지 다시 확인&lt;/b&gt;해야 합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-id=&quot;130ebca7-d95c-49b8-9ff8-c518369b5ad2&quot;&gt;이 함수는 만약 코루틴이 취소된 상태라면 &lt;b&gt;취소 예외를 다시 발생시켜서&lt;/b&gt; 반복문이 제대로 종료되도록 돕습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. Supervisor Job을 잘못 사용하는 문제&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-pm-slice=&quot;1 1 []&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;안티 패턴&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;문제점&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;올바른 사용법&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;Supervisor Job을 launch 함수에 직접 전달&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;자식 코루틴들이 Supervisor Job의 독립적인 실패 처리 혜택을 받지 못하고 부모의 실패에 영향을 받음&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;`supervisorScope` 블록 안에서 코루틴 실행&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;`supervisorScope` 안에서 시작된 코루틴은 서로 독립적으로 실패 처리됨&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-pm-slice=&quot;3 5 [&amp;quot;lilysSection&amp;quot;,{&amp;quot;id&amp;quot;:&amp;quot;3bb710b5-6cfc-48c2-ac51-e591f78f7218&amp;quot;,&amp;quot;display&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;chunkindex&amp;quot;:0,&amp;quot;color&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;loading&amp;quot;:false,&amp;quot;layout&amp;quot;:&amp;quot;paragraph&amp;quot;,&amp;quot;trigger&amp;quot;:&amp;quot;timeline&amp;quot;,&amp;quot;sentenceIndices&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;data-value&amp;quot;:&amp;quot;&amp;quot;}]&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-id=&quot;4148e808-e345-4a17-a099-849bd3dea442&quot;&gt;&lt;b&gt;supervisor job&lt;/b&gt;은 특정 코루틴이 실패하더라도 다른 자식 코루틴들이 &lt;b&gt;영향받지 않고 계속 실행&lt;/b&gt;될 수 있도록 해주는 특별한 Job입니다.&lt;/li&gt;
&lt;li data-id=&quot;c49cc0f2-2740-4f56-8ee4-40b2e7a17c7e&quot;&gt;하지만 launch 함수에 Supervisor Job을 &lt;b&gt;직접 인자로 전달&lt;/b&gt;하는 것은 올바른 사용법이 아닙니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-id=&quot;c2d26312-aa5a-4922-944a-11cb0b6e7a5d&quot;&gt;코루틴의 &lt;b&gt;Job은 자식 코루틴에게 상속되지 않는 유일한 컨텍스트 요소&lt;/b&gt;입니다.&lt;/li&gt;
&lt;li data-id=&quot;3b9f843d-a86e-4ef2-a8da-d668dd400eb2&quot;&gt;그래서 launch에 Supervisor Job을 직접 넘겨주면, 코틀린 내부적으로 이상한 계층 구조가 만들어져서, 자식 코루틴들이 supervisor job의 혜택(실패 시 독립적인 실행)을 제대로 받지 못합니다. 즉, &lt;b&gt;따로 놀아야 할 자식들이 부모 때문에 같이 실패&lt;/b&gt;하게 되는 거죠.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-id=&quot;8d57d3bf-2d50-453e-b94a-657b314b067a&quot;&gt;supervisor job의 기능을 제대로 사용하려면 supervisorScope라는 특별한 함수 블록 안에서 코루틴을 실행해야 합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-id=&quot;cdbf7b0e-7157-4531-944d-eeecce05129c&quot;&gt;supervisorScope 안에서 launch로 시작된 코루틴들은 &lt;b&gt;서로 독립적으로 실패&lt;/b&gt;할 수 있게 됩니다. 마치 &lt;b&gt;각자 알아서 책임지고 실패하는 자식&lt;/b&gt;들처럼 말이죠.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처 : &lt;a href=&quot;https://youtu.be/JyBq76N4Zc4?si=OEGCPCf9D0_37NTY&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/JyBq76N4Zc4?si=OEGCPCf9D0_37NTY&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Android Dev/dev</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/120</guid>
      <comments>https://softwaree.tistory.com/120#entry120comment</comments>
      <pubDate>Sat, 14 Jun 2025 20:32:52 +0900</pubDate>
    </item>
    <item>
      <title>메타 쓰레드 이미지 / 비디오 다운로드</title>
      <link>https://softwaree.tistory.com/119</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;소개&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메타에서 만든 쓰레드 앱의 이미지나 비디오를 다운로드 받는 방법에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 싸이트에 접속 후 게시글의 주소를 복사해서 붙여 넣으면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://www.threads-media-downloader.com&quot;&gt;www.threads-media-downloader.com&amp;nbsp;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1691670541662&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Threads Media Downloader&quot; data-og-description=&quot;threads-media-downloader.com. Threads 앱 비디오, GIF 및 이미지를 JPEG 또는 mp4 형식으로 장치에 다운로드하고 저장할 수 있는 무료 온라인 플랫폼입니다. 모바일 또는 PC에 스레드 미디어를 저장하고 오프&quot; data-og-host=&quot;www.threads-media-downloader.com&quot; data-og-source-url=&quot;http://www.threads-media-downloader.com&quot; data-og-url=&quot;http://www.threads-media-downloader.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cqlyve/hyTCDJbJJt/hTUUz7zerrOC85DqkPSJmk/img.jpg?width=1080&amp;amp;height=1142&amp;amp;face=0_0_1080_1142,https://scrap.kakaocdn.net/dn/iJeY4/hyTBEiCtYP/HjED4QU9KyJQpfto7twdpk/img.jpg?width=1078&amp;amp;height=1142&amp;amp;face=0_0_1078_1142&quot;&gt;&lt;a href=&quot;http://www.threads-media-downloader.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://www.threads-media-downloader.com&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cqlyve/hyTCDJbJJt/hTUUz7zerrOC85DqkPSJmk/img.jpg?width=1080&amp;amp;height=1142&amp;amp;face=0_0_1080_1142,https://scrap.kakaocdn.net/dn/iJeY4/hyTBEiCtYP/HjED4QU9KyJQpfto7twdpk/img.jpg?width=1078&amp;amp;height=1142&amp;amp;face=0_0_1078_1142');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Threads Media Downloader&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;threads-media-downloader.com. Threads 앱 비디오, GIF 및 이미지를 JPEG 또는 mp4 형식으로 장치에 다운로드하고 저장할 수 있는 무료 온라인 플랫폼입니다. 모바일 또는 PC에 스레드 미디어를 저장하고 오프&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.threads-media-downloader.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;사용 가능한 환경&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PC / SmartPhone Web (IOS, Android OS)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 환경에서 사용 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;유튜브 영상 참고&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtube.com/shorts/9pyFgJaj2Sc&quot;&gt;https://youtube.com/shorts/9pyFgJaj2Sc&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/shorts/9pyFgJaj2Sc&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/nxV6L/hyTCCcq1dl/Cuvj91wQQQF28jhKkcklnk/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360,https://scrap.kakaocdn.net/dn/bd6FyF/hyTBD46EnV/fFxwfVC9NkzFDk1gHaegG0/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot; data-video-width=&quot;480&quot; data-video-height=&quot;360&quot; data-video-origin-width=&quot;480&quot; data-video-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;쓰레드 이미지 다운로더&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/9pyFgJaj2Sc&quot; width=&quot;480&quot; height=&quot;360&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;속도가 매우 빠르고 사용이 간편하다는 큰 장점이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 한글로 되어 있어서 가독성 또한 좋습니다. ^^&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;------------------------------------------------&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쓰레드 미디어 다운로더&lt;/p&gt;</description>
      <category>가벼운 정보</category>
      <category>meta threads</category>
      <category>메타 쓰레드</category>
      <category>쓰레드 비디오 다운로드</category>
      <category>쓰레드 이미지 다운로드</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/119</guid>
      <comments>https://softwaree.tistory.com/119#entry119comment</comments>
      <pubDate>Thu, 10 Aug 2023 21:31:23 +0900</pubDate>
    </item>
    <item>
      <title>GRASP</title>
      <link>https://softwaree.tistory.com/118</link>
      <description>&lt;h2 contenteditable=&quot;true&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;GRASP Pattern&lt;/span&gt;&lt;/h2&gt;
&lt;p contenteditable=&quot;true&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;General Responsibility Assignment Software Pattern&lt;/span&gt;&lt;/p&gt;
&lt;p contenteditable=&quot;true&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;**&lt;/span&gt;&lt;b&gt;&lt;span&gt;OO 디자인의 핵심은 각 객체에 책임을 부여 하는것&lt;/span&gt;&lt;/b&gt;&lt;span&gt;**&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;**&lt;/span&gt;&lt;b&gt;&lt;span&gt;책임을 부여하는 원칙을 말하는 패턴&lt;/span&gt;&lt;/b&gt;&lt;span&gt;**&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 contenteditable=&quot;true&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;Informatoin Expert (제일 중요)&lt;/span&gt;&lt;/h2&gt;
&lt;p contenteditable=&quot;true&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;책임을 수행할 수 있는 데이터를 가지고 있는 객체에 책임을 부여하는 것.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;객체는 데이터와 처리로직이 함께 묶여 있는것.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;정보 은닉을 통해 자신의 데이터를 감추고 오직 메서드로만 데이터를 처리하고, 외부에는 그 기능(책임)만을 제공.&lt;/span&gt;&lt;/p&gt;
&lt;h2 contenteditable=&quot;true&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;Creator&lt;/span&gt;&lt;/h2&gt;
&lt;p contenteditable=&quot;true&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;객체의 생성은 생성되는 객체의 컨텍스트를 알고 있는 다른 객체가 있다면, 컨텍스트를 알고 있는 객체에 부여.&lt;/span&gt;&lt;/p&gt;
&lt;h2 contenteditable=&quot;true&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;Controller&lt;/span&gt;&lt;/h2&gt;
&lt;p contenteditable=&quot;true&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;시스템 이벤트(사용자의 요청)을 맞이할 객체를 만들자.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;처리 하는것이 아님.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;apache&quot;&gt;&lt;code&gt;&amp;lt;UseCaseName&amp;gt;Handler,
&amp;lt;UseCaseName&amp;gt;Coordinator,
&amp;lt;UseCaseName&amp;gt;Session&lt;/code&gt;&lt;/pre&gt;
&lt;h2 contenteditable=&quot;true&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;Low Coupling&lt;/span&gt;&lt;/h2&gt;
&lt;p contenteditable=&quot;true&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;객체들간, 서브 시스템들간의 상호의존도가 낮게 책임을 부여.&lt;/span&gt;&lt;/p&gt;
&lt;h2 contenteditable=&quot;true&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;High Cohesion&lt;/span&gt;&lt;/h2&gt;
&lt;p contenteditable=&quot;true&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;각 객체가 밀접하게 연관된 책임들만 가지도록 구성.&lt;/span&gt;&lt;/p&gt;
&lt;h2 contenteditable=&quot;true&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;Polymorphism&lt;/span&gt;&lt;/h2&gt;
&lt;p contenteditable=&quot;true&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;객체의 종류에 따라 행동양식이 바뀐다면, Polymorphism 기능을 사용하자. Object-Oriented 시스템은 상속과 Polymorphism(다형성)을 지원한다. 만약 객체의 종류에 따라 행동이 바뀐다면 객체의 종류를 체크하는 조건문을 사용하지 말고, Object-Oriented 시스템의 Polymorphism 기능을 사용하라.&lt;/span&gt;&lt;/p&gt;
&lt;h2 contenteditable=&quot;true&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;Pure Fabrication&lt;/span&gt;&lt;/h2&gt;
&lt;p contenteditable=&quot;true&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;**&lt;/span&gt;&lt;b&gt;&lt;span&gt;Information Expert 패턴을 적용하면 Low Coupling과 High Cohesion의 원칙이 깨어진다면, 기능적인 역할을 별도로 한 곳으로 모으자.&lt;/span&gt;&lt;/b&gt;&lt;span&gt;**&lt;/span&gt;&lt;/span&gt;&lt;span&gt; 데이터베이스 정보를 저장하거나, 로그 정보를 기록하는 역할에 대해 생각해 보자. 각 정보는 각각의 객체들이 가지고 있을 것이다. 이 때 Information Expert 패턴을 적용하면, 각 객체들이 정보를 저장하고, 로그를 기록하는 역할을 담당해야 하지만, 실제로 그렇게 사용하는 사람들은 없다. 이것은 그 기능들이 시스템 전반적으로 사용되고 있기 때문에 각 객체에 그 기능을 부여하는 것은 각 객체들이 특정 데이터베이스에 종속을 가져오거나, 로그을 기록하는 매커니즘을 수정할 경우, 모든 객체를 수정해야 하는 결과를 가져온다. 즉 Low Coupling의 원칙이 깨어지게 된다. 이럴 경우에는 공통적인 기능을 제공하는 역할을 한 곳으로 모아서 가상의 객체, 서브시스템을 만들어라.&lt;/span&gt;&lt;/p&gt;
&lt;h2 contenteditable=&quot;true&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;Indirection&lt;/span&gt;&lt;/h2&gt;
&lt;p contenteditable=&quot;true&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;두 객체 사이의 직접적인 Coupling을 피하고 싶으면, 그 사이에 다른 객체를 사용하라. 여기서 말하는 다른 객체란 인터페이스가 될 수 있고, 주로 인터페이스인 경우가 많다. 그런 특별한 경우는 아래에 설명된 Protected Variations 패턴이라고 부를 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 contenteditable=&quot;true&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;Protected Variations&lt;/span&gt;&lt;/h2&gt;
&lt;p contenteditable=&quot;true&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;변경될 여지가 있는 곳에 안정된 인터페이스를 정의해서 사용하자. JDBC에 대해서 생각해 보자. JDBC는 일련의 인터페이스들로 구성되어 있으며, 각 데이터베이스 벤더들이 인터페이스를 구현한 Concrete 클래스를 제공하고 있다. 데이터베이스 기능을 사용하는 시스템의 입장에선 각 벤더들이 구현방식을 바꾸었을 때, 자신의 코드를 수정하고 싶지 않을 것이다. 그래서 Driver를 로딩하는 코드를 제외하고는 모두 인터페이스를 사용함으로서 데이터베이스의 변경시에도 Driver 로딩만 바꾸어 주면 되도록 데이터베이스 관련 작업이 필요한 곳에는 안정된 JDBC 인터페이스를 사용한 것이다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Software Architecture</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/118</guid>
      <comments>https://softwaree.tistory.com/118#entry118comment</comments>
      <pubDate>Wed, 21 Dec 2022 23:57:41 +0900</pubDate>
    </item>
    <item>
      <title>11. Re-engineering / Refactoring</title>
      <link>https://softwaree.tistory.com/116</link>
      <description>&lt;h3 id=&quot;Reverse_Engineering_무엇인가요?&quot; data-ke-size=&quot;size23&quot;&gt;Reverse Engineering 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제품의&amp;nbsp;유지보수,&amp;nbsp;개선&amp;nbsp;또는&amp;nbsp;교체를&amp;nbsp;돕기&amp;nbsp;위해&amp;nbsp;제품에&amp;nbsp;대한&amp;nbsp;설계&amp;nbsp;수준의&amp;nbsp;충분한&amp;nbsp;이해&amp;nbsp;를&amp;nbsp;얻는&amp;nbsp;프로세스.&lt;br /&gt;재문서화,&amp;nbsp;설계&amp;nbsp;복구&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;Reengineering_무엇인가요?&quot; data-ke-size=&quot;size23&quot;&gt;Reengineering 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리엔지니어링은&amp;nbsp;일반적으로&amp;nbsp;일부&amp;nbsp;형태의&amp;nbsp;리버스&amp;nbsp;엔지니어링(보다&amp;nbsp;추상적인&amp;nbsp;설명을&amp;nbsp;달성하&amp;nbsp;기&amp;nbsp;위해)에&amp;nbsp;이어&amp;nbsp;일부&amp;nbsp;형태의&amp;nbsp;순방향&amp;nbsp;엔지니어링&amp;nbsp;또는&amp;nbsp;구조&amp;nbsp;조정을&amp;nbsp;포함합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;Reengineering_방식은?&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;Reengineering&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;방식은?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;리팩토링&amp;nbsp;대상을&amp;nbsp;선정&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;한다&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;선정된&amp;nbsp;대상을&amp;nbsp;테스트&amp;nbsp;코드&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&amp;nbsp;작성한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;코드를&amp;nbsp;분해한&amp;nbsp;후&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;재조립한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;재조립&amp;nbsp;코드를&amp;nbsp;테스트한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;위 과정을 반복한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;Test_Driven_Refactoring_무엇인가요?&quot; data-ke-size=&quot;size23&quot;&gt;Test Driven Refactoring&lt;span&gt;&amp;nbsp;&lt;/span&gt;무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1&amp;nbsp;실패한&amp;nbsp;단위&amp;nbsp;테스트를&amp;nbsp;만듭니다.&lt;br /&gt;2.&amp;nbsp;해당&amp;nbsp;테스트를&amp;nbsp;통과하는&amp;nbsp;프로덕션&amp;nbsp;코드를&amp;nbsp;작성합니다&lt;br /&gt;3.&amp;nbsp;방금&amp;nbsp;만든&amp;nbsp;혼란을&amp;nbsp;정리하십시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;Golden_Master_Test&quot; data-ke-size=&quot;size23&quot;&gt;Golden Master Test&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스를 수행한 다음 저장된 &quot;골드 마스터&quot;와 향후 실행을 비교하여 예기치 않은 변경 사항을 발견합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;리팩토링이란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리팩토링 또는 전체 코드 리팩토링은 새로운 기능을 도입하거나 대상 소프트웨어의 기본 작업을 변경하지 않고 이전에 빌드된 소스 코드를 수정하는 체계적인 프로세스.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어의 원래 기능을 방해하지 않고 기본 코드의 구조, 정의 및 구현을 최적화하기 위한 사소한 프로그래밍 조정이라고 생각할 수 있습니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;최종 결과는 일반적으로 소프트웨어의 가독성, 유지 관리성 및 확장성에 대한 개선입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리팩토링 중에 소프트웨어 개발 팀이 일반적으로 수행하는 몇 가지 조치는 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;코드 크기 줄이기&lt;/li&gt;
&lt;li&gt;혼란스러운 코드를 더 간단한 코드로 재구성&lt;/li&gt;
&lt;li&gt;코드를 정리하여 더 깔끔하게 만들기&amp;nbsp;&lt;/li&gt;
&lt;li&gt;중복되고 사용되지 않는 코드 및 주석 제거&amp;nbsp;&lt;/li&gt;
&lt;li&gt;불필요한 반복 없애기&lt;/li&gt;
&lt;li&gt;유사한 코드 결합&lt;/li&gt;
&lt;li&gt;재사용 가능한 코드 생성&lt;/li&gt;
&lt;li&gt;긴 기능을 더 간단하고 관리하기 쉬운 비트로 나누기&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;리팩토링 이점&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;가독성 향상&lt;/li&gt;
&lt;li&gt;유지 보수성, 확장성 증가&lt;/li&gt;
&lt;li&gt;성능 개선&lt;/li&gt;
&lt;li&gt;시간/돈 절약&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;리팩토링 몇가지 테크닉&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Red-Green Refactoring&lt;/li&gt;
&lt;li&gt;Extract Method&lt;/li&gt;
&lt;li&gt;Simplifying Methods&lt;/li&gt;
&lt;li&gt;Composing Method&lt;/li&gt;
&lt;li&gt;Abstraction&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Process&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리팩토링이 필요한 부분을 찾아서 진행한다?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Instructions&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Re-engineering for Different Paradigms&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;From C Programs to Object-Oriented Design&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;도메인&amp;nbsp;엔티티를&amp;nbsp;식별해내고&amp;nbsp;그것을&amp;nbsp;객체로&amp;nbsp;만듭니다&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;Procedure에&amp;nbsp;있던&amp;nbsp;책임을&amp;nbsp;GRASP&amp;nbsp;원칙을&amp;nbsp;지키면서&amp;nbsp;객체들에&amp;nbsp;옮겨줍니다&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;Procedure을&amp;nbsp;Usecase라고&amp;nbsp;본다면&amp;nbsp;Loose&amp;nbsp;coupling,&amp;nbsp;high&amp;nbsp;cohesion으로&amp;nbsp;묶어서&amp;nbsp;객체화,&amp;nbsp;Component화&amp;nbsp;합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;Abstraction, Encapsulation하여 객체를 만들어야합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Software Architecture</category>
      <category>re-engineering</category>
      <category>리팩토링</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/116</guid>
      <comments>https://softwaree.tistory.com/116#entry116comment</comments>
      <pubDate>Sun, 4 Dec 2022 17:56:37 +0900</pubDate>
    </item>
    <item>
      <title>10. Architecture Evaluation</title>
      <link>https://softwaree.tistory.com/115</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1453&quot; data-origin-height=&quot;756&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K7Cqx/btrS1aom2ZI/FYAMmMu6FL1vVLAGlZJsN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K7Cqx/btrS1aom2ZI/FYAMmMu6FL1vVLAGlZJsN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K7Cqx/btrS1aom2ZI/FYAMmMu6FL1vVLAGlZJsN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK7Cqx%2FbtrS1aom2ZI%2FFYAMmMu6FL1vVLAGlZJsN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1453&quot; height=&quot;756&quot; data-origin-width=&quot;1453&quot; data-origin-height=&quot;756&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ATAM&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Architecture&amp;nbsp;Tradeoff&amp;nbsp;Analysis&amp;nbsp;Method&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아키텍처가 품질 목표를 만족하는지 여부와 품질 목표간에 발생하는 충돌에 대해서도 분석함.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BvDth/btrS1cTW0qe/j7t0OW3xx6Hn652qRUT6g0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BvDth/btrS1cTW0qe/j7t0OW3xx6Hn652qRUT6g0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BvDth/btrS1cTW0qe/j7t0OW3xx6Hn652qRUT6g0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBvDth%2FbtrS1cTW0qe%2Fj7t0OW3xx6Hn652qRUT6g0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;871&quot; height=&quot;550&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;550&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1619&quot; data-origin-height=&quot;677&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOPBOm/btrSYCmldR0/sthGCkGZO2skkiSPSHARYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOPBOm/btrSYCmldR0/sthGCkGZO2skkiSPSHARYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOPBOm/btrSYCmldR0/sthGCkGZO2skkiSPSHARYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOPBOm%2FbtrSYCmldR0%2FsthGCkGZO2skkiSPSHARYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1619&quot; height=&quot;677&quot; data-origin-width=&quot;1619&quot; data-origin-height=&quot;677&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;CBAM&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cost&amp;nbsp;Benefit&amp;nbsp;Analysis&amp;nbsp;Method&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;ATAM에&amp;nbsp;경제적&amp;nbsp;평가를&amp;nbsp;보강함&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;요구사항과 투자에&amp;nbsp;관한&amp;nbsp;의사&amp;nbsp;결정을&amp;nbsp;지원함&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;투자 비용 대비 이득&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Software Architecture</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/115</guid>
      <comments>https://softwaree.tistory.com/115#entry115comment</comments>
      <pubDate>Sun, 4 Dec 2022 17:56:00 +0900</pubDate>
    </item>
    <item>
      <title>9. Tactics for NFR</title>
      <link>https://softwaree.tistory.com/114</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Architecture Design for Conventional NFRs&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SRS에 공통으로 나타나는 NFR&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국, Quality Attribute 가 됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tactics for common NFRs: Available&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1137&quot; data-origin-height=&quot;548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bg5g7Z/btrSYnJtNuj/aowXsOnlMskfmOOVb57Wk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bg5g7Z/btrSYnJtNuj/aowXsOnlMskfmOOVb57Wk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bg5g7Z/btrSYnJtNuj/aowXsOnlMskfmOOVb57Wk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbg5g7Z%2FbtrSYnJtNuj%2FaowXsOnlMskfmOOVb57Wk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1137&quot; height=&quot;548&quot; data-origin-width=&quot;1137&quot; data-origin-height=&quot;548&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Architecture Design for Non-Conventional NFRs&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타겟 시스템에 특정됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tactics to be devised by Architectures&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Impact of Tactics on Views&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;NFR Design 과정&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Identify Facts and Policies&lt;/li&gt;
&lt;li&gt;Define Criteria for Tactics&lt;/li&gt;
&lt;li&gt;Define Candidate Tactics&lt;/li&gt;
&lt;li&gt;Evaluate Candidate Tactics&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Benefit, Cost, Decision&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Analyze Impacts of Tactics on Views&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;각 뷰에서 어떤 영향을 미치는지 표로 만듬&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Apply Tactics on Views&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;각 뷰에 택틱을 적용&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Validate Conformance&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;Traceability 검증&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>Software Architecture</category>
      <category>conventional NFR</category>
      <category>NFR</category>
      <category>non conventional NFR</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/114</guid>
      <comments>https://softwaree.tistory.com/114#entry114comment</comments>
      <pubDate>Sun, 4 Dec 2022 17:54:42 +0900</pubDate>
    </item>
    <item>
      <title>8. Architecture Viewpoints</title>
      <link>https://softwaree.tistory.com/113</link>
      <description>&lt;h3 id=&quot;View_란?&quot; data-ke-size=&quot;size23&quot;&gt;View 란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템을&amp;nbsp;이루는&amp;nbsp;SW요소들의&amp;nbsp;집합&amp;nbsp;과&amp;nbsp;SW요소들의&amp;nbsp;연관&amp;nbsp;관계를&amp;nbsp;추상적&amp;nbsp;으로&amp;nbsp;표현한&amp;nbsp;것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;Module_View_무엇인가요?&quot; data-ke-size=&quot;size23&quot;&gt;Module View 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Module간의&amp;nbsp;상호&amp;nbsp;연결&amp;nbsp;관계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;Runtime_View_=_Component_and_Connector_View(C&amp;amp;C_View)&quot; data-ke-size=&quot;size23&quot;&gt;Runtime View = Component and Connector View(C&amp;amp;C View)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를&amp;nbsp;들어&amp;nbsp;뭐가&amp;nbsp;있을까요?&lt;br /&gt;split&amp;nbsp;lower&amp;nbsp;upper&amp;nbsp;merge&amp;nbsp;등&lt;br /&gt;&lt;br /&gt;파이프-필터&amp;nbsp;스타일(Pipe-and-Filter&amp;nbsp;Style)&lt;br /&gt;공유-데이터&amp;nbsp;스타일(Shared-Data&amp;nbsp;Style)&lt;br /&gt;게시-구독&amp;nbsp;스타일(Publish-Subscribe&amp;nbsp;Style)&lt;br /&gt;클라이언트-서버&amp;nbsp;스타일(Client-Server&amp;nbsp;Style)&lt;br /&gt;피어&amp;nbsp;투&amp;nbsp;피어&amp;nbsp;스타일(Peer-to-Peer&amp;nbsp;Style)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;Allocation_View_무엇인가요?&quot; data-ke-size=&quot;size23&quot;&gt;Allocation View 무엇인가요?&lt;/h3&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Software Architecture와 환경을 매핑시키는 역할을 한다. 우선 Deployment Style와 Work Assignment Style을 살펴 보자. Deployment Style은 Software Element가 어떤 물리적 장치에 탑재되는지 보여 준다. 시스템 동작 시, Deployment 내용이 변경 될 수 있으므로 할당은 동적일 수 있다. &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;Work Assignment Style은 Module View의 내용 중 구현 책임이 있는 개인이나 그룹에 할당하는 것이다. 즉, 구조와 작업하는 개발 그룹간의 관계를 보여 주는 모습이라고 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;4+1_View&quot; data-ke-size=&quot;size23&quot;&gt;4+1&amp;nbsp;View&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Logical View&lt;br /&gt;Process&amp;nbsp;View&lt;br /&gt;Development&amp;nbsp;View&lt;br /&gt;Physical&amp;nbsp;View&lt;br /&gt;+Use&amp;nbsp;Cases/Scenarios&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유스케이스 뷰&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(Usecase&amp;nbsp;View)&lt;br /&gt;다른&amp;nbsp;뷰를&amp;nbsp;검증하는데&amp;nbsp;사용&lt;br /&gt;사용자,&amp;nbsp;설계자,&amp;nbsp;개발자,&amp;nbsp;테스트&amp;nbsp;관점&lt;br /&gt;유스케이스&amp;nbsp;다이어그램&lt;br /&gt;&lt;br /&gt;논리&amp;nbsp;뷰&lt;br /&gt;(Logical&amp;nbsp;View)&lt;br /&gt;시스템&amp;nbsp;기능&amp;nbsp;적인&amp;nbsp;요구사항이&amp;nbsp;어떻게&amp;nbsp;제공되는지&lt;br /&gt;클래스나&amp;nbsp;컴포넌트의&amp;nbsp;종류와&amp;nbsp;관계를&amp;nbsp;설명하고&amp;nbsp;설계가&amp;nbsp;실제로&amp;nbsp;구현&amp;nbsp;되는지&amp;nbsp;설명&lt;br /&gt;설계자&amp;nbsp;관점&amp;nbsp;(순서도나&amp;nbsp;UML&amp;nbsp;그리는&amp;nbsp;시점)&lt;br /&gt;클래스/시퀀스&amp;nbsp;다이어그램&lt;br /&gt;&lt;br /&gt;프로세스&amp;nbsp;뷰&lt;br /&gt;(Process&amp;nbsp;View)&lt;br /&gt;시스템의&amp;nbsp;비기능적인&amp;nbsp;속성으로&amp;nbsp;자원의&amp;nbsp;효율적인&amp;nbsp;사용,&amp;nbsp;병행&amp;nbsp;실행,&amp;nbsp;비동기,&amp;nbsp;이벤트&amp;nbsp;처리&amp;nbsp;등을&amp;nbsp;표현한&amp;nbsp;뷰&lt;br /&gt;성능,&amp;nbsp;확장성,&amp;nbsp;효율성&amp;nbsp;관련&lt;br /&gt;시스템&amp;nbsp;통합자의&amp;nbsp;관점&lt;br /&gt;시퀀스/협력&amp;nbsp;다이어그램&lt;br /&gt;&lt;br /&gt;Development&amp;nbsp;뷰&lt;br /&gt;개발&amp;nbsp;환경&amp;nbsp;안에서&amp;nbsp;정적인&amp;nbsp;소프트웨어&amp;nbsp;모듈의&amp;nbsp;구성을&amp;nbsp;보여주는&amp;nbsp;뷰&lt;br /&gt;컴포넌트&amp;nbsp;구조와&amp;nbsp;의존성을&amp;nbsp;보여주고&amp;nbsp;컴포넌트에&amp;nbsp;관한&amp;nbsp;부가적인&amp;nbsp;정보&amp;nbsp;정의&lt;br /&gt;실제&amp;nbsp;구현할&amp;nbsp;수&amp;nbsp;있는지&amp;nbsp;여부를&amp;nbsp;확인&lt;br /&gt;직접&amp;nbsp;만드는&amp;nbsp;개발자의&amp;nbsp;관점&lt;br /&gt;컴포넌트&amp;nbsp;다이어그램&lt;br /&gt;&lt;br /&gt;Physical&amp;nbsp;뷰&lt;br /&gt;컴포넌트가&amp;nbsp;물리적&amp;nbsp;환경에서&amp;nbsp;배치&amp;nbsp;연결&amp;nbsp;작업이&amp;nbsp;어떻게&amp;nbsp;실행&amp;nbsp;되는지를&amp;nbsp;매핑해서&amp;nbsp;보여주는&amp;nbsp;뷰&lt;br /&gt;배치(배포)&amp;nbsp;다이어그램&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;Context_View_무엇인가요?&quot; data-ke-size=&quot;size23&quot;&gt;Context View 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템과&amp;nbsp;환경사이의&amp;nbsp;상호작용과&amp;nbsp;의존성&amp;nbsp;관계를&amp;nbsp;표현한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;DFD_-_Data_Flow_Diagram_무엇인가요?&quot; data-ke-size=&quot;size23&quot;&gt;DFD - Data Flow Diagram 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 기능을 나타냅니다. 레벨 0 DFD에서는 전체 대상 시스템을 나타냅니다&lt;br /&gt;공통&amp;nbsp;터미널&amp;nbsp;-&amp;nbsp;.사용자,&amp;nbsp;외부&amp;nbsp;시스템,&amp;nbsp;&amp;nbsp;하드웨어&amp;nbsp;장치&lt;br /&gt;데이터&amp;nbsp;저장소&lt;br /&gt;데이터&amp;nbsp;흐름&amp;nbsp;정의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;DFD의_터미널에_유스케이스_액터가_안되는_경우가_있는지&quot; data-ke-size=&quot;size23&quot;&gt;DFD의 터미널에 유스케이스&lt;span&gt;&amp;nbsp;&lt;/span&gt;액터가 안되는 경우가 있는지&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DFD에서 터미널이란 입력 정보를 주는 주체, 인풋 아웃풋&lt;br /&gt;usecase에서&amp;nbsp;엑터는&amp;nbsp;특정&amp;nbsp;기능을&amp;nbsp;인보크하는&amp;nbsp;주체&amp;nbsp;또는&amp;nbsp;인보크를&amp;nbsp;당하는&amp;nbsp;주체&lt;br /&gt;=&amp;nbsp;터미널에&amp;nbsp;있었다고&amp;nbsp;해서&amp;nbsp;전부&amp;nbsp;액터로&amp;nbsp;쓸필요는&amp;nbsp;없다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Functional Viewpoints&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템의 기능을 정의&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Functional Characteristics를 관찰&lt;/li&gt;
&lt;li&gt;Skeleton Architecture로부터 UseCase Diagram을 정제&lt;/li&gt;
&lt;li&gt;Functional Components를 도출&lt;br /&gt;- 유즈케이스를 Functional Components 단위로 할당&lt;br /&gt;- Functional Components 테이블 도출.&lt;/li&gt;
&lt;li&gt;Tier로 Functional Components를 할당하기 위하여 정제&lt;/li&gt;
&lt;li&gt;Tier별로 Functional Components를 할당&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 Functional Components를 &lt;span style=&quot;background-color: #f3c000;&quot;&gt;디테일하게 디자인&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Criterion 1. Visibility of Functional Component&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;Whitebox Component or Blackbox Component&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Criterion 2. Type of Interface (for Blackbox Components)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;Fa&amp;ccedil;ade-type or Mediator-type&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;facade-type&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;각각의 객체들을 숨긴 Representative API set&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;API에 50개의 기능이 있을 때, 다 사용 위해서는 50개의 request가 필요하다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Component의 Method 수가 많다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Workflow가 가변적이다.&lt;/b&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;869&quot; data-origin-height=&quot;396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvttNe/btrUgiMN9yA/CklGmUSxK7PJhTZjcHvmUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvttNe/btrUgiMN9yA/CklGmUSxK7PJhTZjcHvmUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvttNe/btrUgiMN9yA/CklGmUSxK7PJhTZjcHvmUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvttNe%2FbtrUgiMN9yA%2FCklGmUSxK7PJhTZjcHvmUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;869&quot; height=&quot;396&quot; data-origin-width=&quot;869&quot; data-origin-height=&quot;396&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mediator type&lt;/p&gt;
&lt;div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;각각의 객체들을 숨긴 Representative API set + Workflow automation 제공&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Workflow는 재사용 가능하며, 자동적이다. (공통)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;API에 50개의 기능이 있을 때, 한 번의 요청으로 사용 가능&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;상대적으로 적은 Method 수&lt;/b&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;843&quot; data-origin-height=&quot;372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biMT35/btrUfJX65yh/5WKdjVtrSnYqwVb2cdZ3R1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biMT35/btrUfJX65yh/5WKdjVtrSnYqwVb2cdZ3R1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biMT35/btrUfJX65yh/5WKdjVtrSnYqwVb2cdZ3R1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiMT35%2FbtrUfJX65yh%2F5WKdjVtrSnYqwVb2cdZ3R1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;843&quot; height=&quot;372&quot; data-origin-width=&quot;843&quot; data-origin-height=&quot;372&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Criterion 3. Variability of Functional Component&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;Closed Component or Open Component&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Criterion 4. Variation Points (for Open Component)&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Variation point where the variability occurs.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Functional Component의 &lt;span style=&quot;background-color: #f3c000;&quot;&gt;인터페이스 정의&lt;br /&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;provided interface, required interface 정의&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Information Viewpoints&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Architecture design for Information View is to make decisions about &lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;persistent datasets, properties and their management&lt;/b&gt;&lt;/span&gt;. This activity includes a number of tasks including identifying data components, allocating data components, defining their data contents, ownership, data distribution, replication, migration, data security, and data timeliness.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;타겟 시스템의 Informational Characteristics 을 관찰&lt;/li&gt;
&lt;li&gt;Skeleton Architecture로부터 &lt;span style=&quot;background-color: #f3c000;&quot;&gt;Persistent Object Model 을 정제&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Data Components 를 도출&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;클래스간의 상호 작용이 강한 경우, data component의 그룹으로 도출.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Tier로 Data Components를 할당하기 위하여 정제&lt;/li&gt;
&lt;li&gt;Data Components 를 tier에 할당.&lt;/li&gt;
&lt;li&gt;Design Data Components&lt;br /&gt;Data Component의 &lt;span style=&quot;background-color: #f3c000;&quot;&gt;내부 상세를 디자인&lt;/span&gt;한다. persistent attribute 정의.&lt;/li&gt;
&lt;li&gt;Data Components의 &lt;span style=&quot;background-color: #f3c000;&quot;&gt;인터페이스 정의&lt;/span&gt;&lt;br /&gt;각각의 Data Component의 인터페이스를 정의. 대부분 CRUD가 됨.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Behavioral Viewpoints&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아키텍처의 Behavioral View는 &lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;시스템의 런타임 동작에 초점을 맞춘 시스템의 동적 측면을 설명&lt;/b&gt;&lt;/span&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Behavioral Characteristics 관찰&lt;br /&gt;Explicit Invocation, Event-driven, Parallel Processing, Closed-loop control flow, time based invocation, etc...&lt;/li&gt;
&lt;li&gt;전체 시스템에 대한 Control Flow 를 정제&lt;/li&gt;
&lt;li&gt;상세한 Control Flow를 정의&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Deployment Viewpoints&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아키텍처의 Deployment View는 물리적 계층의 소프트웨어 구성 요소 토폴로지와 이러한 구성 요소 간의 물리적 연결에 관한 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Deployment Characteristics 관찰&lt;/li&gt;
&lt;li&gt;Nodes 정의&lt;/li&gt;
&lt;li&gt;Network Connectivity 정의&lt;br /&gt;티어간의 http, https 등&lt;/li&gt;
&lt;li&gt;배포할 Artifacts 정의&lt;/li&gt;
&lt;li&gt;노드별로 Artifacts를 할당&lt;br /&gt;Deployment Diagram 활용&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>Software Architecture</category>
      <category>Architecture Viewpoints</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/113</guid>
      <comments>https://softwaree.tistory.com/113#entry113comment</comments>
      <pubDate>Sun, 4 Dec 2022 17:54:13 +0900</pubDate>
    </item>
    <item>
      <title>7. Skeleton / Core Architecture</title>
      <link>https://softwaree.tistory.com/112</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Architect란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Architect : 한정된 자원 내에서 기능 및 품질 요구사항을 최대한 끌어올릴수 있도록 균형을 맞추는 사람, Concern을 잘 포착하고 이것을 설계에 반영함&lt;br /&gt;통찰력,&amp;nbsp;추상화,&amp;nbsp;설득력&amp;nbsp;필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;Architecture_Style_Pattern_적용_효과&quot; data-ke-size=&quot;size23&quot;&gt;Architecture Style Pattern 적용 효과&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;i&gt;안정성, 의사소통, 생산성, 재사용, 접근성&lt;/i&gt;&lt;/u&gt;&lt;br /&gt;디자인 패턴에서는 솔루션이 들어가야한다.&lt;br /&gt;아키텍쳐스타일에선&amp;nbsp;유형이&amp;nbsp;들어가야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;Architecture_설득_방법.&quot; data-ke-size=&quot;size23&quot;&gt;Architecture 설득 방법.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ATAM, Trade off, Risk 등을 분석 설득, 판단의 근거를 Tracebility하게 남겨두어야 근거로 쓸 수 있다.&lt;br /&gt;Architecture:&amp;nbsp;Definition&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;Architecture_Style_&amp;amp;_Pattern_차이?_&quot; data-ke-size=&quot;size23&quot;&gt;Architecture Style &amp;amp; Pattern 차이?&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1149&quot; data-origin-height=&quot;213&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VT0RP/btrTg3KVucj/QrEskUMkDjKN4qln3x6Sf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VT0RP/btrTg3KVucj/QrEskUMkDjKN4qln3x6Sf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VT0RP/btrTg3KVucj/QrEskUMkDjKN4qln3x6Sf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVT0RP%2FbtrTg3KVucj%2FQrEskUMkDjKN4qln3x6Sf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;527&quot; height=&quot;97&quot; data-origin-width=&quot;1149&quot; data-origin-height=&quot;213&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;Architecture_Description의_세_가지는?&quot; data-ke-size=&quot;size23&quot;&gt;Architecture Description의 세 가지는?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Skeleton&amp;nbsp;Architecture&amp;nbsp;-&amp;nbsp;Architecture&amp;nbsp;Styles&lt;br /&gt;Design&amp;nbsp;for&amp;nbsp;NFRs&amp;nbsp;-&amp;nbsp;Architecture&amp;nbsp;Tactics&amp;nbsp;for&amp;nbsp;NFRs&lt;br /&gt;Design&amp;nbsp;for&amp;nbsp;Views&amp;nbsp;-&amp;nbsp;Architecture&amp;nbsp;&amp;nbsp;Viewpoints&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Skeleton Architecture Design&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;A skeleton architecture is a description of the structural aspect of the target system &lt;span style=&quot;background-color: #f3c000;&quot;&gt;without fully describing the key components and their properties&lt;/span&gt;. It can be effectively derived by applying architectural style(s). Each architectural style is a named collection of architectural decisions that are applicable in a given development context.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;How to evaluate the Applicability of Architect Styles?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;Situation, 장점, 단점&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 상황에서 쓰여질 수 있는지를 명시합니다. 그리고 각각에 대하여 장점과 단점을 나열합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후에 적용하기에 적합한지를 판단합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;How to Derive(도출하는가?) Skeleton Architecture from Styles?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Instantiating each selected Style,&amp;nbsp;&amp;nbsp;Merging Styles&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선택된 스타일들을 하나씩 그려가면서 합칩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Defining Interfactions among Components in the Architecture&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Q) Why we do define Interactions among components?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Interaction Path를 정의한다. Interaction Path는 &lt;span style=&quot;background-color: #f3c000;&quot;&gt;casual dependency 나 persistent relationship&lt;/span&gt; 일 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 호출하는 Path를 제공하거나 컴포넌트들간의 통신을 위한 메시지를 보냅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;Skeleton_Architecture_Design,_Step_말하세요.&quot; data-ke-size=&quot;size23&quot;&gt;Skeleton Architecture Design, Step 말하세요.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요구사항 정제 (incompleteness, ambiguity, etc)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정제된 SRS 산출물 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 컨텍스트 분석&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 시스템 바운더리 컨텍스트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기능적 컨텍스트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 정보 컨텍스트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 행위 컨텍스트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스켈레톤 아키텍트 디자인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 아키텍트 특징 관찰&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 아키텍트 스타일 후보 선정 및 각각의 장,단점 명시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 아키텍트 스타일 통합&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;아키텍처_스타일_통합_순서&quot; data-ke-size=&quot;size23&quot;&gt;아키텍처 스타일 통합 순서&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Tiers 관련된 스타일&lt;br /&gt;-&amp;nbsp;Tier-based&amp;nbsp;Architecture&amp;nbsp;Styles&lt;br /&gt;-&amp;nbsp;Client&amp;nbsp;Server&amp;nbsp;architecture&amp;nbsp;style&lt;br /&gt;-&amp;nbsp;N-tier&amp;nbsp;architecture&amp;nbsp;style&lt;br /&gt;-&amp;nbsp;Peer-to-Peer&amp;nbsp;architecture&amp;nbsp;style&lt;br /&gt;-&amp;nbsp;Load-balancing&amp;nbsp;Architecture&amp;nbsp;Styles&lt;br /&gt;-&amp;nbsp;Broker&amp;nbsp;architecture&amp;nbsp;style&lt;br /&gt;-&amp;nbsp;Dispatcher&amp;nbsp;architecture&amp;nbsp;style&lt;br /&gt;-&amp;nbsp;Master&amp;nbsp;Slave&amp;nbsp;architecture&amp;nbsp;style&amp;bull;&lt;br /&gt;-&amp;nbsp;Edge-based&amp;nbsp;architecture&amp;nbsp;style&lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;서비스&amp;nbsp;관련&amp;nbsp;스타일&lt;br /&gt;-&amp;nbsp;Microservice&amp;nbsp;architecture&amp;nbsp;style&lt;br /&gt;-&amp;nbsp;Service-Oriented&amp;nbsp;Architecture&amp;nbsp;(SOA)&amp;nbsp;style&lt;br /&gt;&lt;br /&gt;3&amp;nbsp;레이어드&amp;nbsp;스타일&lt;br /&gt;-&amp;nbsp;Layered&amp;nbsp;architecture&amp;nbsp;Style&lt;br /&gt;-&amp;nbsp;MVC&amp;nbsp;architecture&amp;nbsp;style&lt;br /&gt;&lt;br /&gt;4.&amp;nbsp;행동&amp;nbsp;스타일&lt;br /&gt;-&amp;nbsp;Batch&amp;nbsp;Sequential&amp;nbsp;architecture&amp;nbsp;style&lt;br /&gt;-&amp;nbsp;Pipe-n-Filter&amp;nbsp;architecture&amp;nbsp;style&lt;br /&gt;-&amp;nbsp;Event-Driven&amp;nbsp;architecture&amp;nbsp;style&lt;br /&gt;-&amp;nbsp;Publish-and-Subscriber&amp;nbsp;architecture&amp;nbsp;style&lt;br /&gt;&lt;br /&gt;5.&amp;nbsp;가변성&amp;nbsp;있는&amp;nbsp;스타일&lt;br /&gt;-&amp;nbsp;Micro&amp;nbsp;Kernel&amp;nbsp;architecture&amp;nbsp;style&lt;br /&gt;-&amp;nbsp;Microservice&amp;nbsp;architecture&amp;nbsp;style&lt;br /&gt;-&amp;nbsp;Blackboard&amp;nbsp;architecture&amp;nbsp;style&lt;br /&gt;Component간의&amp;nbsp;Interactions&lt;/p&gt;</description>
      <category>Software Architecture</category>
      <category>skeleton architecture</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/112</guid>
      <comments>https://softwaree.tistory.com/112#entry112comment</comments>
      <pubDate>Sun, 4 Dec 2022 17:53:39 +0900</pubDate>
    </item>
    <item>
      <title>6. Software Architecture Styles</title>
      <link>https://softwaree.tistory.com/111</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;각 스타일별 주요 포인트&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;언제 사용하는가? 컴포넌트와 연결자는 어떻게 되는가? 장단점은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nEYnM/btrSW58bIsT/Dr4i94nx85vLmZ19KLrQo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nEYnM/btrSW58bIsT/Dr4i94nx85vLmZ19KLrQo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nEYnM/btrSW58bIsT/Dr4i94nx85vLmZ19KLrQo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnEYnM%2FbtrSW58bIsT%2FDr4i94nx85vLmZ19KLrQo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;591&quot; height=&quot;591&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;591&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Batch Sequential&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타겟 시스템의 기능이 dataset를 조작하기 위하여 독립적인 구성 요소로 decompose 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;구성 요소는 일련의 데이터 변환을 순차적 및 배치 방식으로 수행합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자는 모든 배치 처리가 완료 되기전까지 interact 할 수 없고, 끝날때까지 기다려야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대용량 처리에 용이. 각 서브 시스템을 독립적으로 처리하는 프로그램이 될 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Pipe and Filter&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필터는 데이터 세트를 조작하는 구성 요소를 나타내고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이프는 데이터 세트를 필터 간에 스트림 모드로 전송하는 데이터 버스를 나타낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 Batch Sequential Architecture Style로 한 번에 전체 데이터 세트를 전송하는 것과 대조된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Benefits&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Concurrency&lt;/span&gt;: It provides high overall throughput for excessive data processing.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Reusability&lt;/span&gt;: Encapsulation of filters makes it easy to plug and play, and to substitute.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Modifiability&lt;/span&gt;: It feature low coupling between filters, less impact, from adding new filters and modifying the implementation of any existing filters as long as the I/O interfaces are unchanged.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Simplicity&lt;/span&gt;: It offers clear division between any two filters connected by a pipe.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Flexibility&lt;/span&gt;: It supports both sequential and parallel execution.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Drawbacks&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;It is not suitable for dynamic interactions.&lt;/li&gt;
&lt;li&gt;A low common denominator is required for data transmission in the ASCIII formats since filters may need to handle data streams in different formats, such as record type or XML type rather than character type.&lt;/li&gt;
&lt;li&gt;Overhead of data transformation among filters such as parsing is repeated in two consecutive filters.&lt;/li&gt;
&lt;li&gt;It can be difficult to configure a pipe and filter system dynamically.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Layered&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;span style=&quot;color: #292929;&quot;&gt;&amp;lsquo;관심사에 분리(Separation of concerns)&amp;rsquo;에 따라 시스템을&amp;nbsp;&lt;/span&gt;&lt;b&gt;유사한 책임(관심)&lt;/b&gt;&lt;span style=&quot;color: #292929;&quot;&gt;을 지닌 Layer로 분해하고&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;각각의 Layer&lt;/b&gt;&lt;span style=&quot;color: #292929;&quot;&gt;가&amp;nbsp;&lt;/span&gt;&lt;b&gt;하위 Layer에만 의존&lt;/b&gt;&lt;span style=&quot;color: #292929;&quot;&gt;하도록 구성하는 아키텍처 패턴 (Organized Vertically)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 레이어는 인터페이스를 가진 가상 머신. 가상 머신은 엄격한 순서 관계에 따라 상호작용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 계층에는 시스템에서 고유한 역할이 부여되며, 바로 아래 계층에서 제공하는 서비스를 호출한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하위 레이어는 상위 레이어 사용 불가.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;486&quot; data-origin-height=&quot;614&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctrOwV/btrSJydbz7X/7Ib4OjGneeDIf2hu4C2i61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctrOwV/btrSJydbz7X/7Ib4OjGneeDIf2hu4C2i61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctrOwV/btrSJydbz7X/7Ib4OjGneeDIf2hu4C2i61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctrOwV%2FbtrSJydbz7X%2F7Ib4OjGneeDIf2hu4C2i61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;301&quot; height=&quot;380&quot; data-origin-width=&quot;486&quot; data-origin-height=&quot;614&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;가상 머신&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;레이어의 목적은 가상 머신의 제공&lt;/li&gt;
&lt;li&gt;이식성(portability) 향상이 목적.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;장점&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체적인 시스템의 결합도를 낮추고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자의 인지 과부하를 방지하며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재사용성을 높이고 유지보수성을 향상.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 도메인이 복잡하 논리를 포함하지 않거나,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;확장성보다는 일관성을 가져가는 것이 목표&lt;/span&gt;이거나,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소규모로 구성된 팀인 경우에는 적용하기 좋다고 생각.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;단점&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;프로젝트 규모가 커질수록, 확장성이 떨어짐.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레이어로 분리된 관심사 외에 다른 관심사가 발견된 경우, 패키지 분리 및 코드 배치가 난감한 경우가 발생.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복잡한 비즈니스 논리를 해결하고 성능적 이점을 얻기는 어려움.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;MVC&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GUI가 있는 시스템을 모델, 뷰, 컨트롤러의 세개의 컴포넌트로 구분하는 아키텍처.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유저 인터페이스와 비즈니스 로직들을 서로 분리하여 개발하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;MVC 모델 작동 순서&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Controller로 사용자의 입력이 들어옴&lt;/li&gt;
&lt;li&gt;Controller로 Model에 데이터를 업데이트&lt;/li&gt;
&lt;li&gt;Model은 해당 데이터로 보여줄 View를 업데이트하여 화면에 보여 주게 됨&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;365&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pLMhW/btrSQTVTebK/p1qkYdO2kU1YWGGJVKy4n1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pLMhW/btrSQTVTebK/p1qkYdO2kU1YWGGJVKy4n1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pLMhW/btrSQTVTebK/p1qkYdO2kU1YWGGJVKy4n1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpLMhW%2FbtrSQTVTebK%2Fp1qkYdO2kU1YWGGJVKy4n1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;351&quot; height=&quot;365&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;365&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Separation of Concern 달성 (재사용성, 유지 보수성)&lt;/li&gt;
&lt;li&gt;동일한 모델로부터 다양한 View들을 표현할 수 있음&lt;/li&gt;
&lt;li&gt;View의 추가, 변경, 삭제가 자유로움. model과 decouple 되어 있으므로.&lt;/li&gt;
&lt;li&gt;View들의 동기화&lt;br /&gt;모델의 변경전파 메커니즘에 의하여 데이터 변경사항 통지.&lt;/li&gt;
&lt;li&gt;뷰와 모델에 영향을 끼치지 않고 워크플로우를 수정하는게 수월함.&lt;/li&gt;
&lt;li&gt;Persistent 데이터 스토어가 view, control에 영향을 미치지 않음.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;간단한 애플리케이션에 적용하기에는 복잡성만 증가.&lt;/li&gt;
&lt;li&gt;View와 Controller는 밀접히 관련되어 있음.&lt;/li&gt;
&lt;li&gt;View와 Controller는 모델에 의존.&lt;br /&gt;모델의 인터페이스를 변경하면 View와 Controller도 변경 되어야 함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Blackboard&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;Shared data, database와 같은 데이터 중심 패턴 중에 하나&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;명확히&amp;nbsp;정의된&amp;nbsp;문제&amp;nbsp;해법이&amp;nbsp;없을&amp;nbsp;때&amp;nbsp;문제를&amp;nbsp;풀어가는&amp;nbsp;하나의&amp;nbsp;방식을&amp;nbsp;정의한&amp;nbsp;패턴&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;대략적으로&amp;nbsp;해법을&amp;nbsp;수립하기&amp;nbsp;위해&amp;nbsp;특수한&amp;nbsp;서비스&amp;nbsp;시스템의&amp;nbsp;지식을&amp;nbsp;조합하는&amp;nbsp;패턴&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #444444;&quot;&gt;그 다음 단계의 결과가 실행할때마다 다르게 나올 수 있는 알고리즘을 구현하는데 사용되는 스타일&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 음성인식, 차량식별, 신호해석&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5AGe6/btrSW5G6Dj9/m7pFvzKl43wOfAVP355Hw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5AGe6/btrSW5G6Dj9/m7pFvzKl43wOfAVP355Hw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5AGe6/btrSW5G6Dj9/m7pFvzKl43wOfAVP355Hw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5AGe6%2FbtrSW5G6Dj9%2Fm7pFvzKl43wOfAVP355Hw1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;552&quot; height=&quot;294&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;405&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ul00w/btrSUSaEXhe/LzykkKn9jypJeW4PQOOH51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ul00w/btrSUSaEXhe/LzykkKn9jypJeW4PQOOH51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ul00w/btrSUSaEXhe/LzykkKn9jypJeW4PQOOH51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ful00w%2FbtrSUSaEXhe%2FLzykkKn9jypJeW4PQOOH51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;452&quot; height=&quot;264&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;블랙보드(blackboard)&amp;nbsp;:&amp;nbsp;솔루션의 객체를 포함하는 구조화된 전역 메모리&lt;/li&gt;
&lt;li&gt;지식 소스(knowledge source):&amp;nbsp;자체 표현을 가진 특수 모듈&lt;/li&gt;
&lt;li&gt;제어 컴포넌트&amp;nbsp;(control component) :&amp;nbsp;모듈 선택,&amp;nbsp;설정 및 실행을 담당&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;KS는&amp;nbsp;타&amp;nbsp;문제&amp;nbsp;도메인에&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;재사용될&amp;nbsp;수&amp;nbsp;있음&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;계산&amp;nbsp;결과가&amp;nbsp;항상&amp;nbsp;동일하지&amp;nbsp;않아&amp;nbsp;테스트가&amp;nbsp;어려움&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;어떤&amp;nbsp;좋은&amp;nbsp;해법도&amp;nbsp;완벽하다고&amp;nbsp;장담할&amp;nbsp;수&amp;nbsp;없음&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Shared&amp;nbsp;Repository&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;공유 데이터는 central data repo에 저장됨. 이 repo는 여기에 관련된 모든 client app에 의해서 접근이 가능.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Client app들은 데이터를 읽고 쓰기 위하여 pulling을 사용&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bi8NA5/btrSUb9Ef2O/VwkkfklDtsiS8DiH5BI25K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bi8NA5/btrSUb9Ef2O/VwkkfklDtsiS8DiH5BI25K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bi8NA5/btrSUb9Ef2O/VwkkfklDtsiS8DiH5BI25K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbi8NA5%2FbtrSUb9Ef2O%2FVwkkfklDtsiS8DiH5BI25K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;412&quot; height=&quot;319&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;536&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Efficient way of sharing datasets among applications&lt;/li&gt;
&lt;li&gt;Efficient way of storing a large amount of datasets&lt;/li&gt;
&lt;li&gt;Separating data storage concern from data manupulation concern&lt;/li&gt;
&lt;li&gt;Allowing concurrent accesses to the datasets.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Difficulty to manage the data scheme of the repository&lt;/li&gt;
&lt;li&gt;Potential performance overhead due to the remote access&lt;/li&gt;
&lt;li&gt;Concern on Availability&lt;/li&gt;
&lt;li&gt;Concern on Security&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Micro&amp;nbsp;Kernel&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;시스템의 요구사항이 변할때, 이를 쉽게 시스템에 반영하기 위한 패턴&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 시스템의 기능에서 최소 핵심 기능은 공통으로 두고 변경이 가능한 확장 부분을 플러그인 방식으로 추가할 수 있는 패턴.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1251&quot; data-origin-height=&quot;611&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjfdUx/btrSWbt2kdf/KttGGpH4Sdmo4SIgwwUrok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjfdUx/btrSWbt2kdf/KttGGpH4Sdmo4SIgwwUrok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjfdUx/btrSWbt2kdf/KttGGpH4Sdmo4SIgwwUrok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjfdUx%2FbtrSWbt2kdf%2FKttGGpH4Sdmo4SIgwwUrok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;643&quot; height=&quot;314&quot; data-origin-width=&quot;1251&quot; data-origin-height=&quot;611&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;이식성이 보장 (시스템을 새로운 환경으로 이동 시, Microkernel만 수정하면 됨)&lt;/li&gt;
&lt;li&gt;유연성과 교환가능성이 확보 (Internal/External Server를 수정하거나 확장)&lt;/li&gt;
&lt;li&gt;유지보수성과 가변성을 향상 (정책과 메커니즘을 분리)&lt;/li&gt;
&lt;li&gt;확장성 확보, 신뢰성 지원, 투명성을 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;시스템 설계가 복잡하고 개발이 어려움.&lt;/li&gt;
&lt;li&gt;성능이 떨어짐. internal server와 external server에 대한 호출로 인하여, 하나의 애플리케이션에서 훨씬 많은 프로세스 간 통신이 필요함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Micro&amp;nbsp;Service&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대형 소프트웨어 프로젝트의 기능들을 &lt;span style=&quot;background-color: #f3c000;&quot;&gt;작고 독립적이며 느슨하게 결합된 모듈로 분해하여 서비스를 제공&lt;/span&gt;하는 아키텍처&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;도메인은 공통 REST 기반 웹 인터페이스 &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;서비스를&amp;nbsp;독립적으로&amp;nbsp;배포할&amp;nbsp;수&amp;nbsp;있습니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;확장성, 탄력성, 진화성&lt;/li&gt;
&lt;li&gt;복잡한 애플리케이션의 지속적 배포, 배치가 가능&lt;/li&gt;
&lt;li&gt;상대적으로 작아서 이해하기 쉽고 생산적일 수 있음&lt;/li&gt;
&lt;li&gt;오류의 고립(Fault Isolation)을 도움&lt;/li&gt;
&lt;li&gt;ex) 메모리 릭이 있다면, 해당 서비스만 진행을 멈추고 다른 서비스는 지속 운영 가능.&lt;/li&gt;
&lt;li&gt;새로운 기술을 도입, 적용하기가 용이&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;성능, 단순성, 비용&lt;/li&gt;
&lt;li&gt;개발자는 분산 시스템에서 나오는 추가적인 문제들을 다루어야 함.&lt;/li&gt;
&lt;li&gt;여러 서비스를 배치 하는것이 좀 더 복잡해 짐.&lt;/li&gt;
&lt;li&gt;메모리 사용량이 증가. (예를 들어 각 서비스가 각자 VM을 사용하는 경우)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Dispatcher&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Client에게 QoS가 높은 서버를 연결하기 위하여 중간에 속해 있는 서버.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;QoS가 높은 서버 정보를 클라이언트에 넘겨주면, Client가 직접 서버에 연결됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Broker보다 성능이 좋음.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kX4Fa/btrSQTBDlbe/rTO1FIkeorZp7grxZV3Hg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kX4Fa/btrSQTBDlbe/rTO1FIkeorZp7grxZV3Hg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kX4Fa/btrSQTBDlbe/rTO1FIkeorZp7grxZV3Hg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkX4Fa%2FbtrSQTBDlbe%2FrTO1FIkeorZp7grxZV3Hg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;611&quot; height=&quot;301&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Broker&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서로 다른 기종의 머신에 분산되어 있는 서비스(객체 혹은 컴포넌트)간에 어떻게 협력을 잘 할지 고민하다 나온 패턴.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;분산 시스템이나 RPC를 구현할 때 많이 사용됨&lt;/span&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브로커가 해야 할일은 server locating, request를 포워딩, 결과와 예외처리를 클라이언트 측에 전달하는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언제 사용?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;실제 시스템 컴포넌트를 사용하는 사용자로부터, 서비스의 구체적인 구현을 감추어야 할때(캡슐화)&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;런타임에, 시스템 컴포넌트들을 교체 할 수 있습니다.&lt;/li&gt;
&lt;li&gt;시스템 컴포넌트가 어디에 위치해있던지 신경쓰지 않고 호출 가능합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1089&quot; data-origin-height=&quot;522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1ioGO/btrSN1GUFsj/NO0zE91m2vYvkBLIM6H7j1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1ioGO/btrSN1GUFsj/NO0zE91m2vYvkBLIM6H7j1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1ioGO/btrSN1GUFsj/NO0zE91m2vYvkBLIM6H7j1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1ioGO%2FbtrSN1GUFsj%2FNO0zE91m2vYvkBLIM6H7j1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;662&quot; height=&quot;317&quot; data-origin-width=&quot;1089&quot; data-origin-height=&quot;522&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어 예&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0x5001|semtax|22&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0x5001은 어떠한 방법으로 요청을 처리하라는 일종의 커맨드이고, 나머지 부분이 데이터의 역할을 하게 됨.&lt;br /&gt;Broker에서는 이 명령어를 파싱하여 서버에 요청 및 응답을 받아서 다시 리턴.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Client&amp;nbsp;Server&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;서버 티어는 클라이어트 티어를 위한 공통 서비스를 제공&lt;/span&gt;. 클라이언트 티어는 사용자와 소통.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복수개의 클라이언트 앱은 서버 티어의 기능을 공유 할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;responsbility 분리, 서버 components 재사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;이기종 인프라에 대해 요구 만족 어려움, 보안취약,&amp;nbsp;&lt;/li&gt;
&lt;li&gt;server availability and reliability, testability and scalability 어려움&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Publish&amp;nbsp;and&amp;nbsp;Subscribe&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트 기반의 아키텍트 스타일.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Subscriber들은 특정 이벤트를 받기 위하여 등록/해제&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Publisher들은 매시지를 브로드캐스팅. (동기/비동기 형태로)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵저버 패턴과 유사.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언제 사용?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;There is a need for decoupling content producers from content consumers.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;There is a need to deliver the same content to multiple consumers.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;There is a need to deliver the content when it is available.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;There is a need to avoid polling for the content.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;709&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTaAfi/btrSWbOk3kt/PeeGXjGlFJnrWvKU4mENA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTaAfi/btrSWbOk3kt/PeeGXjGlFJnrWvKU4mENA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTaAfi/btrSWbOk3kt/PeeGXjGlFJnrWvKU4mENA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTaAfi%2FbtrSWbOk3kt%2FPeeGXjGlFJnrWvKU4mENA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;709&quot; height=&quot;130&quot; data-origin-width=&quot;709&quot; data-origin-height=&quot;130&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Flexibility to add new subscribers dynamically.&lt;/li&gt;
&lt;li&gt;Loose coupling between publisher and subscribers&lt;/li&gt;
&lt;li&gt;Increased Efficiency due to Reduced Polling / Pulling&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Overhead of Distributing Events&lt;/li&gt;
&lt;li&gt;With broker, publishers have no control on the delivery ordering&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Software Architecture</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/111</guid>
      <comments>https://softwaree.tistory.com/111#entry111comment</comments>
      <pubDate>Sun, 4 Dec 2022 17:51:04 +0900</pubDate>
    </item>
    <item>
      <title>5. Requirement Engineering</title>
      <link>https://softwaree.tistory.com/110</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/whXNW/btrSJT2pRV7/uadGZQ7Mt7E9EwRJL5IuTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/whXNW/btrSJT2pRV7/uadGZQ7Mt7E9EwRJL5IuTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/whXNW/btrSJT2pRV7/uadGZQ7Mt7E9EwRJL5IuTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwhXNW%2FbtrSJT2pRV7%2FuadGZQ7Mt7E9EwRJL5IuTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;591&quot; height=&quot;591&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;591&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Definition of SW Quality&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;주어진 요구사항을 만족&lt;/b&gt;시킬 수 있는 소프트웨어의 기능 및 특성.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Conventional NFRs in ISO 9126&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Types of Quality Aspects&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Process Quality&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Quality of Life-cycle Process&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Internal Quality&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Quality of Intermediate Artifacts&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;External Quality&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Quality of Implementation Code&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Quality in Use&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어가 동작하는 환경에서의 사용자 관점에서의 퀄리티&lt;br /&gt;ex) 실행 속도 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어 실행하면서 발생되는 결과로부터 평가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1473&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FNOjc/btrSKRiNSpx/UgmDs663WZIAjQAikv3mE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FNOjc/btrSKRiNSpx/UgmDs663WZIAjQAikv3mE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FNOjc/btrSKRiNSpx/UgmDs663WZIAjQAikv3mE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFNOjc%2FbtrSKRiNSpx%2FUgmDs663WZIAjQAikv3mE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1473&quot; height=&quot;470&quot; data-origin-width=&quot;1473&quot; data-origin-height=&quot;470&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Quality Model of ISO 9126&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6 Main Factors(&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;FRUMPE&lt;/b&gt;&lt;/span&gt;) and Sub-Factors for each&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Quality Model은 크게 External, Internal Quality로 나뉠 수 있음.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1644&quot; data-origin-height=&quot;860&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bczhCY/btrSJTOLt7Q/C6hBCNrBeI3tdz1Yisjkr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bczhCY/btrSJTOLt7Q/C6hBCNrBeI3tdz1Yisjkr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bczhCY/btrSJTOLt7Q/C6hBCNrBeI3tdz1Yisjkr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbczhCY%2FbtrSJTOLt7Q%2FC6hBCNrBeI3tdz1Yisjkr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1644&quot; height=&quot;860&quot; data-origin-width=&quot;1644&quot; data-origin-height=&quot;860&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Functionality&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기능 적합성. 소프트웨어가 사용자의 요구기능을 충족 시키는가? 목적했던 기능이 정확히 동작하는가?&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Reliability&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기능이 오차나 오류 없이 동작하는가? 일관된 결과가 도출되는가?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Maturity (성숙성)&lt;br /&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #000000;&quot;&gt;소프트웨어의 결함으로 인한 실패를 방지하는 소프트웨어 제품의 기능.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Fault Tolerance (결함 허용성)&lt;br /&gt;소프트웨어&amp;nbsp;결함&amp;nbsp;또는&amp;nbsp;지정된&amp;nbsp;인터페이스&amp;nbsp;침해의&amp;nbsp;경우에&amp;nbsp;특정&amp;nbsp;수준의&amp;nbsp;성능을&amp;nbsp;유지하는&amp;nbsp;소프트웨어&amp;nbsp;제품의&amp;nbsp;기능.&lt;/li&gt;
&lt;li&gt;Recoverability (복구성)&lt;br /&gt;소프트웨어&amp;nbsp;제품이&amp;nbsp;지정된&amp;nbsp;수준의&amp;nbsp;성능을&amp;nbsp;재설정하고&amp;nbsp;장애&amp;nbsp;발생&amp;nbsp;시&amp;nbsp;직접&amp;nbsp;영향을&amp;nbsp;받는&amp;nbsp;데이터를&amp;nbsp;복구하는&amp;nbsp;기능&lt;/li&gt;
&lt;li&gt;Reliability Compliance&amp;nbsp; (신뢰성 준수)&lt;br /&gt;신뢰성과&amp;nbsp;관련된&amp;nbsp;표준,&amp;nbsp;규약&amp;nbsp;또는&amp;nbsp;규정을&amp;nbsp;준수하는&amp;nbsp;소프트웨어&amp;nbsp;제품의&amp;nbsp;능력&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Usability&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 배우고 사용할 수 있는가?&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Efficiency&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기능을 수행하는데 적절한 자원이 소요되는가? 기능이 필요한만큼 빠르게 수해오디는가?&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Maintainability&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경 및 오류 교정 시 쉽게 수정할 수 있는가?&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Portability&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다양한 플랫폼 및 하드웨어에서도 동작하는가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Process of Requirement Engineering (REP)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요구사항을 정의, 문서화 및 유지 관리하는 프로세스. 시스템에서 제공하는 서비스를 모으고 정의하는 과정.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;주요 과정&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;요구사항 추출&lt;/li&gt;
&lt;li&gt;요구사항 모델링과 분석&lt;/li&gt;
&lt;li&gt;요구사항 우선순위화&lt;/li&gt;
&lt;li&gt;요구 명세&lt;/li&gt;
&lt;li&gt;품질 요구&lt;/li&gt;
&lt;li&gt;요구 검증과 변경 관리&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;요구사항 추출&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 도메인 및 요구 사항에 대한 지식을 얻는 데 사용되는 다양한 방법과 관련이 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용되는 기술에는 &lt;span style=&quot;background-color: #f3c000;&quot;&gt;인터뷰, 브레인스토밍, 작업 분석, 프로토타이핑&lt;/span&gt; 등이 포함되어 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 단계는 이해된 요구사항의 공식 모델을 생성하지 않음. 대신 분석가의 도메인 지식을 넓히고 다음 단계에 입력을 제공하는데 도움이 됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;요구사항 모델링과 분석&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식적인 소프트웨어 요구 사항 모델을 생성하는데 사용. &lt;span style=&quot;color: #006dd7;&quot;&gt;추상적 요구사항을 정확하고 상세하게 정의.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 기능, 성능 및 인터페이스 등을 정의. &lt;span style=&quot;color: #006dd7;&quot;&gt;고객의 needs가 충족됨을 확인&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 단계에서 사용되는 모델로는 &lt;span style=&quot;background-color: #f3c000;&quot;&gt;Enterprise Modeling, Data Modeling(DFD), Behavioural Modeling, Domain Modeling, NFR Modeling &lt;/span&gt;등이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;요구사항 우선순위화&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고객의 Needs와 요구사항 사이의 match가 성공을 결정.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;단계&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Define Priority classes&lt;br /&gt;High / Medium / Low // 1~10 score&lt;/li&gt;
&lt;li&gt;Assess Priority Data&lt;br /&gt;모든 참여자가 Priority Scale에 따라 분류&lt;/li&gt;
&lt;li&gt;Resolve Differences&lt;br /&gt;우선순위에 대한 Informal Agreement 확보&lt;/li&gt;
&lt;li&gt;Create schedules based on priorities&lt;br /&gt;각 요구사항의 작업 시작과 종료 시점&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;요구 명세&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요구문서는 완전하고, 일관성이 있어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명세는 모든 필요로 하는 요소를 포함하고 있어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명세에 포함된 요소들 간에는 모순이나 충돌이 없어야 한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;품질 요구&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;품질 속성은 기능, 비기능 관점을 모두 포함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Quality Model of ISO 9126&quot; 참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;품질 속성 시나리오 활용. (Source, Stimulus, Artifacts, Environment, Response, Response Measure)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;요구검증과 변경관리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경을 이해하고, 관리하라.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요구사항 관리를 위한 커뮤니케이션을 제공.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요구사항 변경으로 개발에 대한 영향을 최소화.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Agile하게 고객의 Needs 변화를 요구사항 변경으로 반영&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Agile Constructs for Requirement Management&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요구사항 변경은 필연적임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 개발 초기에 고객은 원하는 요구사항을 정확히 표현하지 못함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러므로 변경을 이해하고, 관리하라.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;Agile하게 고객의 Needs 변화를 요구사항 변경으로 반영&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Requirements for Platform Software&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Q) How do you define / refine requirements for Platform Software?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비기능이기 때문에 Non Functional Requirements에 명세합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Non-Functional Requirements (NFRs)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;소프트웨어 기능들에 대한 조건(시스템의 속성)과 제약사항에 관한 요구사항&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;기능적 요구사항보다 더 결정적인 부분이 될 수 있다.&lt;br /&gt;why? 이부분이 충족되지 않으면 시스템 이용가치 X&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 특징과 서비스보다는 전체적인 시스템에 적용&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 314px;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;height: 34px; width: 99.8837%; text-align: center;&quot; colspan=&quot;3&quot;&gt;&lt;b&gt;&lt;span&gt;비기능적 요구사항&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 120px; width: 25.3488%;&quot; rowspan=&quot;5&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;제품 요구사항&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;(Product Requirement)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px; width: 74.5349%;&quot; colspan=&quot;2&quot;&gt;&lt;span&gt;&lt;b&gt;사용성(Usability)&lt;/b&gt;&amp;nbsp; :&amp;nbsp; &amp;nbsp;사용자가 어떻게 쉽게 사용할 수 있는가&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 60px; width: 35.2325%;&quot; rowspan=&quot;2&quot;&gt;&lt;b&gt;&lt;span&gt;효율성(Efficiency)&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px; width: 39.3024%;&quot;&gt;&lt;span&gt;&lt;b&gt;성능(Performance)&lt;/b&gt;&amp;nbsp; :&amp;nbsp; 특정 기능이 특정시간 내에 실행&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;height: 40px; width: 39.3024%;&quot;&gt;&lt;span&gt;&lt;b&gt;공간 (Space)&amp;nbsp;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;:&amp;nbsp; 특정 기능 수행시 메모리를 최대 얼마까지 사용할 수 있는가&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px; width: 74.5349%;&quot; colspan=&quot;2&quot;&gt;&lt;span&gt;&lt;b&gt;신뢰성(Reliableility)&lt;/b&gt;&amp;nbsp; :&amp;nbsp; 특정 기능 실행시 실패할 가능성이 몇 %보다 낮아야 하는가&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px; width: 74.5349%;&quot; colspan=&quot;2&quot;&gt;&lt;span&gt;&lt;b&gt;이식성 (Portability)&lt;/b&gt;&amp;nbsp; :&amp;nbsp; 다양한 플랫폼 위에서 작동하는가&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 60px; width: 25.3488%;&quot; rowspan=&quot;3&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;조직 요구사항&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;(Organizational&lt;br /&gt;Requirement)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px; width: 74.5349%;&quot; colspan=&quot;2&quot;&gt;&lt;span&gt;&lt;b&gt;배포(Delivery)&amp;nbsp;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;:&amp;nbsp; 소프트 웨어를 어떻게 배포할 것인가&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px; width: 74.5349%;&quot; colspan=&quot;2&quot;&gt;&lt;span&gt;&lt;b&gt;구현(Implement)&amp;nbsp;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;:&amp;nbsp; 소프트웨어 구현 ; 어떤 방법론? 어떤 프로그래밍 언어?&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px; width: 74.5349%;&quot; colspan=&quot;2&quot;&gt;&lt;span&gt;&lt;b&gt;표준(Standard)&lt;/b&gt;&amp;nbsp; :&amp;nbsp; 소프트웨어 개발 시 어떤 표준을 따를 것인가&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;height: 100px; width: 25.3488%;&quot; rowspan=&quot;4&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;외부 요구사항&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;(External Requirement)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 40px; width: 74.5349%;&quot; colspan=&quot;2&quot;&gt;&lt;span&gt;&lt;b&gt;상호 운용성 (Interoperability)&lt;br /&gt;&lt;/b&gt;구현할 소프트웨어가 다른 소프트웨어와 어떻게 연동할지 정의&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px; width: 74.5349%;&quot; colspan=&quot;2&quot;&gt;&lt;span&gt;&lt;b&gt;윤리적 (Ethical)&amp;nbsp;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;:&amp;nbsp; 소프트 웨어의 내용의 윤리적 범위을 정의 ex) 성인용 게임 19세 이상&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 40px; width: 35.2325%;&quot; rowspan=&quot;2&quot;&gt;&lt;b&gt;&lt;span&gt;법적 (Legislative)&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px; width: 39.3024%;&quot;&gt;&lt;span&gt;&lt;b&gt;사생활(privacy)&amp;nbsp;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;ex) 공개범위 선택&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px; width: 39.3024%;&quot;&gt;&lt;span&gt;&lt;b&gt;안전성(safety)&lt;/b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;ex) 자료 저장방식, DBMS 어떤것? 자료의 암호화 여부&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Software Architecture</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/110</guid>
      <comments>https://softwaree.tistory.com/110#entry110comment</comments>
      <pubDate>Sun, 4 Dec 2022 17:50:12 +0900</pubDate>
    </item>
    <item>
      <title>GOF - Software Design Pattern</title>
      <link>https://softwaree.tistory.com/109</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;왜 디자인 패턴을 사용하나?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;재사용 가능하고, 유연한 구조&lt;/span&gt;를 가지는 소프트웨어 개발&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;커뮤니케이션&lt;/span&gt; : 구체적인 설명 없이 구조화된 패턴에 대한 사전 지식으로 커뮤니케이션에 드는 비용, 비용 절약.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;설계 과정의 속도&lt;/span&gt;를 높일 수 있음. 이미 검증되고 테스트된 구조이기 때문.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;구현이 아닌 인터페이스에 맞춰서 프로그래밍&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;바뀌는 부분은 따로 뽑아서 &lt;span style=&quot;background-color: #f3c000;&quot;&gt;캡슐화&lt;/span&gt;.&lt;/li&gt;
&lt;li&gt;상속 보다는 &lt;span style=&quot;background-color: #f3c000;&quot;&gt;구성&lt;/span&gt;을 활용. &amp;rarr; 구성을 활용하면 &lt;span style=&quot;background-color: #f3c000;&quot;&gt;유연성&lt;/span&gt;을 크게 향상 시킴.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5NDmc/btrSIq7LC8s/N86mZ40lNIKS7Pfexh5Iak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5NDmc/btrSIq7LC8s/N86mZ40lNIKS7Pfexh5Iak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5NDmc/btrSIq7LC8s/N86mZ40lNIKS7Pfexh5Iak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5NDmc%2FbtrSIq7LC8s%2FN86mZ40lNIKS7Pfexh5Iak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;591&quot; height=&quot;591&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;591&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Principles of Design Patterns&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Interface Separated from implementation&lt;/li&gt;
&lt;li&gt;Substitution with various implementation&lt;/li&gt;
&lt;li&gt;Open Closed Principle (OCP)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Classification of Design Patterns&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Creation Patterns&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;객체 생성에 관련된 패턴.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;객체의 생성과 조합을 캡슐화해 특정 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 크게 받지 않도록 유연성을 제공한다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;Structure Patterns&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;클래스나 객체를 조합해 더 큰 구조를 만드는 패턴&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;예를 들어 서로 다른 인터페이스를 지닌 2개의 객체를 묶어 단일 인터페이스를 제공하거나 객체들을 서로 묶어 새로운 기능을 제공하는 패턴이다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;Behavioral Patterns&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;객체나 클래스 사이의 알고리즘이나 책임 분배에 관련된 패턴&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;한 객체가 혼자 수행할 수 없는 작업을 여러 개의 객체로 어떻게 분배하는지, 또 그렇게 하면서도 객체 사이의 결합도를 최소화하는 것에 중점을 둔다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;생성 패턴&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;Factory Method&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;: 객체를 생성하기 위해 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할지에 대해서는 하위 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;클래스에서 결정 -&amp;gt; 클래스의 상속 이용, 인터페이스의 다형성&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;Abstract Factory&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;: 구체적 클래스를 정의하지 않고도 서로 관련성이 있거나 독립적인 여러 객체의 군을 생성하기 위한 인터&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;페이스 제공&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;Builder&lt;/span&gt;&lt;/span&gt;&lt;span&gt; : 데이터의 순서에 상관없이 객체 생성 가능. setter 메서드가 없으므로 변경 불가능한 객체 생성 가능. 한번에 객체&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;를 생성하므로 객체 일관성이 깨지지 않음.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;Prototype&lt;/span&gt;&lt;/span&gt;&lt;span&gt; : 객체를 생성하는데 비용이 들고, 이미 유사한 객체가 존재하는 경우에 사용. Client에 Map 형태로 생성될 객체&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;를 등록해놓고, 타입에 따라 객체를 clone 하는 형태로 객체 생성. ex) DB로부터 읽어온 객체 등록 후 복사.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;Singleton&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;: 클래스에서 만들 수 있는 인스턴스가 오직 하나일 경우. 어디에서 접근 하든지 하나로만 통일하여 제공.&lt;/span&gt;&lt;/p&gt;
&lt;p contenteditable=&quot;true&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;구조 패턴&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;Adapter&lt;/span&gt;&lt;/span&gt;&lt;span&gt; : 클래스의 인터페이스를 클라이언트가 기대하는 형태의 인터페이스로 변환. 기존의 클래스를 사용해야 하나 인터&lt;/span&gt;&lt;span&gt;페이스가 수정되어야 하는 경우에 사용. adapter 클래스의 멤버로 타겟 클래스를 가짐. (has a) Adaptee 클래스의 하위 클&lt;/span&gt;&lt;span&gt;래스기 때문에 곧바로 Adaptee의 멤버 함수들을 override 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;Bridge&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;: 구현부에서 추상층을 분리하여 각자 독립적으로 변형이 가능하고 확장이 가능하도록 합니다. 즉 기능과 구현에 대&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;해서 두 개를 별도의 클래스로 구현을 합니다. 런타임 시 구현 방법을 선택하거나 구현 내용을 변경하고 싶은 경우 사용.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;Composite&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;: 부분과 전체의 계층을 표현하기 위해 복합 객체를 트리 구조로 만드는 패턴. 복합 객체와 단일 객체의 처리 방법이 다르지 않을 경우, 전체-부분 관계로 정의. Directory-File 존재. SRP를 깨는 대신 투명성을 확보하는 패턴. 투명성(transparency)란 Component 인터페이스에 자식들을 관리하는 기능과 leaf으로써의 기능을 전부 넣어서 클라이언트가 복합 객체와 잎을 똑같은 방식으로 처리할 수 있도록 만들 수 있다.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;Decorator&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;: 객체에 동적으로 새로운 서비스를 추가 할 수 있게 한다. 기능의 추가를 위해서 하위 클래스를 생성하는것보다 융통성 있는 방법을 제공. (상속보다 위임을 통하여 제공)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;Flyweight&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;: 어떤 클래스의 인스턴스 한개만 가지고 여러 개의 &quot;가상 인스턴스&quot;를 제공하고 싶을때 사용하는 패턴. 즉 인스&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;턴스를 가능한 대로 공유시켜 쓸데없는 new 연산자를 통한 메모리 낭비를 줄이는 방식. 대규모의 미세한 객체들을 효과적&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;으로 사용하기 위해서 공유 개념 도입.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;Facade&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;: 복잡한 서브시스템에 대한 단순한 인터페이스 제공이 필요할때. 클라이언트와 구현 클래스 간에 너무 많은 종속&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;성이 존재하여 클라이언트와 다른 서브 시스템 간의 결합도를 낮추고 싶을 때.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;Proxy&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;: 프록시에게 일을 대신 시킴. 어떤 객체 사용할때, 직접 참조하는것이 아닌 해당 객체를 대항하는 객체를 통해 대상 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;객체에 접근하는 방식을 사용하면 해당 객체가 메모리에 존재하지 않아도 기본적인 정보를 참조하거나 설정할 수 있고, 실&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;제 객체의 기능이 필요한 시점까지 객체의 생성을 미룰 수 있음. 사이즈가 큰 객체가 로딩되기전에 프록시를 통해 참조 가&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;능. 객체 생서이 한단계 거치게 되므로 빈번한 객체 생성시에 성능 저하.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p contenteditable=&quot;true&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;행위 패턴&lt;/span&gt;&lt;/b&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;Template Method&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;: 알고리즘의 변하지 않는 부분을 한 번 정의하고 다양해질 수 있는 부분을 하위 클래스에서 정의할 수 있&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;도록 구현하고자 할 때. 훅을 사용하여 하위 클래스 확장을 제어 가능. 코드 재사용을 위한 기본 기술.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;Strategy&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;: 다양한 알고리즘이 존재하면 이들 각각을 하나의 클래스로 캡슐화하여 알고리즘의 대체가 가능하도록 함. 행위&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;들이 조금씩 다를 뿐 개념적으로 관련된 많은 클래스들이 존재하는 경우.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;State&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;: 객체 내부의 상태에 따라 행위를 변경하도록 함.상태에 따른 행위를 국지화하여 서로 다른 상태에 대한 행위를 별도&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;의 객체로 관리함. 상태 전이 규칙을 명확하게 만듬. 상태 객체는 공유 될 수 있음.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;Command&lt;/span&gt;&lt;/span&gt;&lt;span&gt; : 요청 자체를 객체화 하는것. 서로 다른 요청을 객체화하여 클라이언트에게 파라미터로 넘겨 줄 수 있게 한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;Chain of Responsibility&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;: 메시지를 보내는 객체와 이를 받아 처리하는 객체들 간의 결합도를 없애기 위한 패턴. 메시지를 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;수신하여 처리를 담당하는 객체들을 하나의 연결 고리로 만들고 실제로 요청을 처리하는 객체를 만날 때까지 계속 요청을 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;전달. 메시지를 받을 객체를 명시하지 않은 채 여러 객체 중 하나에게 처리를 요청하고 싶을때 사용.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;Memento&lt;/span&gt;&lt;/span&gt;&lt;span&gt; : 캡슐화를 위배하지 않으면서 객체의 내부 상태를 파악하고 표현함으로써 객체의 상태를 저장해 둔 상태로 다시 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;복귀할 수 있게 함. 각 시점에서의 객체 상태를 저장한 후 나중에 이 상태로 복구해야 할 때 활용.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;Observer&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;: 일대다의 관련성을 갖는 객체들의 경우 한 객체의 상태가 변하면 다른 모든 객체에 그 사항을 알리고 필요한 수&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;정이 자동으로 이루어지도록 할 때. 프로그래머는 얼마나 많은 객체들이 변경되어야 하는지 몰라도 됨.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;Iterator&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;: 복합 객체 요소들의 내부 표현 방식을 공개하지 않고도 순차적으로 접근할 수 있는 방법을 제공. (구현과 순회 분&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;리)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;Visitor&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;: 데이터 구조와 처리를 분리. 데이터 구조 안을 돌아다니는 주체인 방문자를 나타내는 클래스를 준비해서 처리를 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;맡긴다. 새로운 처리를 추가하고 싶을 땐 새로운 방문자를 만들고 데이터 구조는 방문자를 받아들이면 됨. OCP적용. 새로&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;운 concreteelement 클래스 추가하기는 어려움.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;Mediator&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;:클래스 간의 복잡한 관계를 캡슐화하여 하나의 클래스에서 관리하도록 처리하는 패턴. M:N 관계를 M:1 관계로 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;만들어 복잡도를 내리므로 유지 보수 및 확장성에 유리.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;Interpretor&lt;/span&gt;&lt;/span&gt;&lt;span&gt; : 간단한 언어의 문법을 정의하고 싶을 때&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Facade 패턴과 Mediator 패턴&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Mediator의 역할은 Colleague 역할의 중재자로서 주고받기를 수행함 -&amp;gt; &lt;span style=&quot;background-color: #f3c000;&quot;&gt;양방향&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Facade 역할은 일방적으로 다른 역할을 이용해서 높은 레벨의 인터페이스(API)를 만듦 -&amp;gt; &lt;span style=&quot;background-color: #f3c000;&quot;&gt;단방향&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #fafafa; color: #22272a;&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;퍼사드가 자신의 정책을 가시적이고 강제적으로 적용&lt;/span&gt;하는 반면, 미디에이터는 자신의 정책을 &lt;span style=&quot;background-color: #f3c000;&quot;&gt;은밀하고 강제적이지 않은 방식&lt;/span&gt;으로 적용한다.&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa; color: #22272a;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #fafafa; color: #22272a;&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #22272a;&quot;&gt;퍼사드 패턴은 클래스 라이브러리와 같은 어떤 소프트웨어의 다른 커다란 코드 부분에 대한 &lt;span style=&quot;background-color: #f3c000;&quot;&gt;Unified Interface를 제공&lt;/span&gt;하며, 퍼사드는 그러한 인터페이스를 제공하는 객체다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #fafafa; color: #22272a;&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #22272a;&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #22272a;&quot;&gt;미디에이터 패턴은 &lt;span style=&quot;background-color: #f3c000;&quot;&gt;객체들의 집합이 상호작용하는 방법을 함축해놓은 객체를 정의&lt;/span&gt;한다. 객체 간 통신은 미디에이터 객체 안에 함축된다. 객체들은 서로 직접 통신하지 않으며, 미디에이터를 통해 통신한다. 이를 통해 객체 간 의존성을 줄여 결합도를 감소시킬 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Observer 패턴과 Mediator 패턴&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;옵저버 패턴은 1개의 publisher에 대해 N개의 subscriber가 존재. 옵저버는 pulling이나 push 방식을 통해 관리.&lt;/li&gt;
&lt;li&gt;중재자 패턴은 M개의 publisher와 N개의 subscriber 사이에서 1개의 중재자를 통해 통신하는 방식.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Prototype 패턴과 Flyweight 패턴&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Prototype은 복제를 하는 것이고 Flyweight는&amp;nbsp;있는것 그대로 쓴다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Strategy Pattern&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;알고리즘을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다. Strategy를 활용하면 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BNOlU/btrSJEcAhbg/2OEZ8iHmunJ2vN1M9EGqVK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BNOlU/btrSJEcAhbg/2OEZ8iHmunJ2vN1M9EGqVK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BNOlU/btrSJEcAhbg/2OEZ8iHmunJ2vN1M9EGqVK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/BNOlU/btrSJEcAhbg/2OEZ8iHmunJ2vN1M9EGqVK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;437&quot; height=&quot;164&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;164&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;특징&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;관련 알고리즘의 군을 형성함&lt;/li&gt;
&lt;li&gt;서브클래싱을 사용하지 않른 방법.&lt;/li&gt;
&lt;li&gt;사용자는 서로 다른 전략을 알고 있어야 함&lt;/li&gt;
&lt;li&gt;Strategy와 Context 클래스 사이에 과다한 메시지가 전송됨&lt;/li&gt;
&lt;li&gt;객체 수가 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;Observer Pattern&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들에게 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다(one to many) 의존성을 정의.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;일반적으로, Subject 인터페이스와 Observer 인터페이스가 들어있는 클래스 디자인을 바탕으로 구현.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Subject와 Observer가 Loose coupling 되어 있는 개체 디자인을 제공&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 가져오는 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pulling : 루프를 돌면서 계속 호출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pushing : 등록하면, 변경되었을때 통지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;observe : 항상 필요X, 선택적으로 필요, notification만 전달받고, data는 전달받지 않음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;387&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDnlxc/btrSHKrAW2h/2WEHuKYwb97qw3ww3tnpd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDnlxc/btrSHKrAW2h/2WEHuKYwb97qw3ww3tnpd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDnlxc/btrSHKrAW2h/2WEHuKYwb97qw3ww3tnpd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDnlxc%2FbtrSHKrAW2h%2F2WEHuKYwb97qw3ww3tnpd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;387&quot; height=&quot;325&quot; data-origin-width=&quot;387&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;특징&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Subject가 Observer에 대하여 아는것은 Observer가 특정 인터페이스를 구현한다는 것뿐.&lt;/li&gt;
&lt;li&gt;Observer는 언제든지 새로 추가 가능.&lt;/li&gt;
&lt;li&gt;새로운 형식의 Observer를 추가하려고 할 때도 Subject를 전혀 변경 할 필요가 없음.&lt;/li&gt;
&lt;li&gt;Subject, Observer 는 서로 독립적으로 재사용 가능. 서로 영향을 미치지 않음.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;서로 상호작용을 하는 객체 사이에서는 가능하면 느슨하게 결합하는 디자인을 사용해야 한다.&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Decorator Pattern&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체에 추가적인 요건을 동적으로 첨가한다. 데코레이터는 서브클래스를 만드는 것을 통해서 기능을 유연하게 확장 할 수 있는 방법을 제공.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;예) 카페에서 음료 제조시, 첨가물을 데코로 표현.&lt;/i&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Open Closed Principle&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&quot;클래스는 확장에 대해서는 열려 있어야 하지만 코드 변경에 대해서는 닫혀 있어야 한다.&quot;&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Class Diagram&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1128&quot; data-origin-height=&quot;872&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOA3rk/btrSKt3bJe3/o4jo94JC8ucNWM5a4ZVY0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOA3rk/btrSKt3bJe3/o4jo94JC8ucNWM5a4ZVY0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOA3rk/btrSKt3bJe3/o4jo94JC8ucNWM5a4ZVY0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOA3rk%2FbtrSKt3bJe3%2Fo4jo94JC8ucNWM5a4ZVY0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1128&quot; height=&quot;872&quot; data-origin-width=&quot;1128&quot; data-origin-height=&quot;872&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;특징&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;기존 코드는 건드리지 않은 채로 확장을 통해서 새로운 행동을 간단하게 추가할 수 있음&lt;/li&gt;
&lt;li&gt;이 목표를 달성했을 때 새로운 기능을 추가하는데 있어서 매우 유연해서 새로 급변하는 주변 환경에 잘 적응할 수 있으면서도 강하고 튼튼한 디자인을 만들 수 있음.&lt;/li&gt;
&lt;li&gt;데코레이터의 슈퍼 클래스는 자신이 장식하고 있는 객체의 슈퍼클래스와 같음.&lt;/li&gt;
&lt;li&gt;한 객체를 여러 개의 데코레이터로 감쌀 수 있음.&lt;/li&gt;
&lt;li&gt;데코레이터는 자신이 감싸고 있는 객체와 같은 슈퍼클래스를 가지고 있기 때문에 원래 객체가 들어갈 자리에 데코레이터 객체를 집어넣어도 상관없음.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;데코레이터는 자신이 장식하고 있는 객체에게&amp;nbsp;어떤 행동을 위임(Delegate)하는 것 외에 원하는 추가적인 작업을 수행할&amp;nbsp;수 있음. &amp;ndash; 키 포인트&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;객체는 언제든지 감쌀 수 있기 때문에 실행 중에 필요한 데코레이터를 마음대로 적용할 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데코레이터를 사용하는 목적은 컴파잉리할 때 모든 서비스의 객체를 다 결정할 수 없는 상황에서 적절하게 대응하기 위해서임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Factory method pattern&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 팩토리 패턴에서는 객체 생성을 캡슐화.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팩토리 메소드 패턴에서는 서브클래스에서 어떤 클래스를 만들지를 결정함으로써 객체 생성을 캡슐화.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;예제 ) 피자 가게에서 피자 생성&lt;/i&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Dependency Inversion Principle&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;추상화된 것(Abstract or Interface)에 의존하도록 만들어라. Concrete Class에 의존하지 않도록 한다.&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;Class Diagram&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1651&quot; data-origin-height=&quot;967&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chetvS/btrSJT8Ucyi/nGGyLaPcIQhnDUamLobqG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chetvS/btrSJT8Ucyi/nGGyLaPcIQhnDUamLobqG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chetvS/btrSJT8Ucyi/nGGyLaPcIQhnDUamLobqG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchetvS%2FbtrSJT8Ucyi%2FnGGyLaPcIQhnDUamLobqG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1651&quot; height=&quot;967&quot; data-origin-width=&quot;1651&quot; data-origin-height=&quot;967&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;특징&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;어떤 변수에도 구상 클래스에 대한 레퍼런스를 저장하지 말 것.&lt;br /&gt;클라이언트에서 New 연산자를 사용하면 구상 클래스에 대한 레퍼런스를 사용하게 되는 것.&lt;br /&gt;이 패턴을 사용하여 구상 클래스에 대한 레퍼런스를 변수에 저장하는 일을 미리 방지.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&quot;New&quot; 연산자를 캡슐화&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;Abstract Factory Method Pattern&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;추상 팩토리 패턴에서는 인터페이스를 이용하여 서로 연관된, 또는 의존하는 객체를 구상 클래스를 지정하지 않고도 생성 가능.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;Class Diagram&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1535&quot; data-origin-height=&quot;1251&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clS1Fy/btrSL0fjy1C/v9KIqqzwhEwOlkrMwKgRK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clS1Fy/btrSL0fjy1C/v9KIqqzwhEwOlkrMwKgRK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clS1Fy/btrSL0fjy1C/v9KIqqzwhEwOlkrMwKgRK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclS1Fy%2FbtrSL0fjy1C%2Fv9KIqqzwhEwOlkrMwKgRK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1535&quot; height=&quot;1251&quot; data-origin-width=&quot;1535&quot; data-origin-height=&quot;1251&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;Factory Method vs Abstract Factory Method&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;공통 : 둘다 객체 생성 패턴. 객체 생성을 캡슐화해서 Client와의 결합을 느슨하게 하고, 특정 구현에 덜 의존하도록 만듬.&lt;/li&gt;
&lt;li&gt;차이점 : Factory Method는 &lt;span style=&quot;background-color: #f3c000;&quot;&gt;상속&lt;/span&gt;을 통해서 객체를 생성. Abstract Factory Method는 객체 &lt;span style=&quot;background-color: #f3c000;&quot;&gt;구성&lt;/span&gt;(Composition)을 통해 생성.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;팩토리 메서드 패턴을 통해 객체 생성시에는 클래스를 확장하고 팩토리 메서드를 오버라이딩 해야 함.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;팩토리 메서드 패턴을 사용한다는것은 서브 클래스를 통해서 객체를 만들기 위한 것. 클라이언트에서는 자신이 사용할 추상 형식만 알면 되고, 구상 형식은 서브클래스에서 처리해 줌. 즉, 클라이언트와 구상 형식을 분리해주는 역할&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;Singleton Pattern&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;해당 클래스의 인스턴스가 하나만 만들어지고, 어디서든지 그 인스턴스에 접근할 수 있도록 하기 위한 패턴.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Double Checked Locking 에서 volatile 키워드 관련 알고 있을것.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;특징&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;한 앱에 들어 있는 어떤 객체에서도 똑같은 자원을 활용할 수 있도록 함.&lt;br /&gt;예) 쓰레드 풀, 연결 풀 등 자원 풀을 관리하는게 유용함.&lt;/li&gt;
&lt;li&gt;단순 싱글턴 패턴 적용시 멀티 쓰레딩에 따른 문제가 발생할 수 있음. synchronized, volatile 등 사용 할 것&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Command Pattern&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 작업을 요청한 쪽과 그 작업을 처리하는 쪽을 분리 시킬 수 있음. 커맨드 객체는 특정 객체에 대한 요청을 캡슐화 시켜줌.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Class Diagram&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1357&quot; data-origin-height=&quot;1023&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z4bHs/btrSISQi5xo/jni28JkezpkchA9dsjAeFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z4bHs/btrSISQi5xo/jni28JkezpkchA9dsjAeFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z4bHs/btrSISQi5xo/jni28JkezpkchA9dsjAeFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ4bHs%2FbtrSISQi5xo%2Fjni28JkezpkchA9dsjAeFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1357&quot; height=&quot;1023&quot; data-origin-width=&quot;1357&quot; data-origin-height=&quot;1023&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;특징&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;오퍼레이션을 호출하는 객체와 오퍼레이션을 수행 방법을 구현하는 객체를 분리.&lt;/li&gt;
&lt;li&gt;요구사항을 캡슐화.&lt;/li&gt;
&lt;li&gt;Command 자체도 클래스로서 다른 객체와 같은 방식으로 조작되고 확장될 수 있음.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;명령어를 조합해서 다른 명령어를 만들 수 있음. (Composite 패턴 활용)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;새로운 명령어를 쉽게 추가 할 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;Adapter Pattern&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #503e2b;&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환합니다&lt;/span&gt;. 어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;클라이언트 : 타겟 인터페이스에 맞게 구현되어 있음.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;어댑터 : 타겟 인터페이스를 구현하며, 여기에는 어댑티 클래스가 들어 있음.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;클라이언트에서 어댑터 사용하는 방법&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;클라이언트에서 타겟 인터페이스를 사용하여 메소드를 호출함으로써 어댑터에 요청&lt;/li&gt;
&lt;li&gt;어댑터에서는 어댑티 인터페이스를 사용하여 그 요청을 어댑티에 대한 (하나 이상의) 메소드 호출로 변환&lt;/li&gt;
&lt;li&gt;클라이언트에서는 호출 결과를 받긴 하지만 중간에 어댑터가 껴 있는지는 전혀 알지 못함.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Class Diagram&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1661&quot; data-origin-height=&quot;750&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4HLIT/btrSIPTJ08Z/J7PpwaUHi5eLPJgkVeIahk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4HLIT/btrSIPTJ08Z/J7PpwaUHi5eLPJgkVeIahk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4HLIT/btrSIPTJ08Z/J7PpwaUHi5eLPJgkVeIahk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4HLIT%2FbtrSIPTJ08Z%2FJ7PpwaUHi5eLPJgkVeIahk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1661&quot; height=&quot;750&quot; data-origin-width=&quot;1661&quot; data-origin-height=&quot;750&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Client는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;Target&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;인터페이스를 구현한&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #800080;&quot;&gt;Adaptee&lt;/span&gt;가 필요하다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #800080;&quot;&gt;Adaptee&lt;/span&gt;는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;Target&lt;/span&gt;인터페이스를 구현하지 않고 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #800080;&quot;&gt;Adaptee&lt;/span&gt;는 이미 개발이 완료되어 사용중이다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #800080;&quot;&gt;Adaptee&lt;/span&gt;를 변경하는 것이 적절하지 않은 상황이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;특징&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어댑티를 새로 바뀐 인터페이스로 감쌀 때는 &lt;span style=&quot;background-color: #f3c000;&quot;&gt;composition&lt;/span&gt;을 사용합니다. 이런 접근법을 쓰면 어댑티의 어떤 서브 클래스에 대해서도 어댑터를 쓸 수 있다는 장점이 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Fa&amp;ccedil;ade Pattern&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;어떤 서브 시스템의 일련의 인터페이스에 대한 통합된 인터페이스를 제공&lt;/b&gt;. 퍼사드에서 고수준 인터페이스를 정의하기 때문에 서브 시스템을 더 쉽게 사용 가능.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Class Diagram&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1633&quot; data-origin-height=&quot;967&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W7f7R/btrSM4hrT0v/VUydTJjRHAKBozObgZe2dK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W7f7R/btrSM4hrT0v/VUydTJjRHAKBozObgZe2dK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W7f7R/btrSM4hrT0v/VUydTJjRHAKBozObgZe2dK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW7f7R%2FbtrSM4hrT0v%2FVUydTJjRHAKBozObgZe2dK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1633&quot; height=&quot;967&quot; data-origin-width=&quot;1633&quot; data-origin-height=&quot;967&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Principle of Least Knowledge&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;u&gt;정말 친한 친구와 얘기하라.&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;특징&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;서브시스템의 구성 요소를 보호 할 수 있다.&lt;/li&gt;
&lt;li&gt;서브시스템과 클라이언트 코드 간의 결합도를 줄일 수 있다.&lt;/li&gt;
&lt;li&gt;서브시스템 클래스를 사용하는 것을 완전히 막지는 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Template Method Pattern&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알고리즘의 각 단계들을 정의하며, 그 중 한 개 이상의 단계가 서브클래스에 의해 제공되는 경우에 사용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AbstractClass에서 알고리즘의 골격을 정하고, 서브클래스에서 특정 메서드를 구현.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Hook&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알고리즘의 특정 부분이 선택적으로 적용된다는가 하는 경우에 사용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Class Diagram&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;555&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPZt1u/btrSIsK8Usu/poCcKKirbQfTlvKdxZ8tCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPZt1u/btrSIsK8Usu/poCcKKirbQfTlvKdxZ8tCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPZt1u/btrSIsK8Usu/poCcKKirbQfTlvKdxZ8tCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPZt1u%2FbtrSIsK8Usu%2FpoCcKKirbQfTlvKdxZ8tCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;262&quot; height=&quot;350&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;555&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Hollywood Principle&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;먼저 연락하지 마세요. 저희가 연락 드리겠습니다.&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이를 활용하면, 의존성 부패를 방지 할 수 있음.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;Iterator Pattern&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Collection 구현 방법을 노출시키지 않으면서도 그 집합체 안에 들어있는 모든 항목에 접근할 수 있는 방법을 제공.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;모든 항목에 일일이 접근하는 작업을 컬렉션 객체가 아닌 반복자 객체에서 맡게 된다. 이렇게 하면 집합체의 인터페이스 및 구현이 간단해질뿐 아니라, 집합체에서는 반복작업에서 손을 떼고 원래 자신이 할 일에만 전념할 수 있음.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;Class Diagram&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1619&quot; data-origin-height=&quot;1096&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cphkIK/btrSN1rupam/uSF9jyuA1rGp2SLVye5RyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cphkIK/btrSN1rupam/uSF9jyuA1rGp2SLVye5RyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cphkIK/btrSN1rupam/uSF9jyuA1rGp2SLVye5RyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcphkIK%2FbtrSN1rupam%2FuSF9jyuA1rGp2SLVye5RyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1619&quot; height=&quot;1096&quot; data-origin-width=&quot;1619&quot; data-origin-height=&quot;1096&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1332&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qLvcQ/btrSJXQ3nyU/XMVYYSKnmaRfgiiP1n95tK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qLvcQ/btrSJXQ3nyU/XMVYYSKnmaRfgiiP1n95tK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qLvcQ/btrSJXQ3nyU/XMVYYSKnmaRfgiiP1n95tK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqLvcQ%2FbtrSJXQ3nyU%2FXMVYYSKnmaRfgiiP1n95tK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1332&quot; height=&quot;468&quot; data-origin-width=&quot;1332&quot; data-origin-height=&quot;468&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Single Responsibility Principle&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;클래스를 변경하는 목적은 단 하나여야 한다.&lt;/b&gt;&lt;/span&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Composite Pattern&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체들을 트리 구조로 구성하여 부분과 전체를 나타내는 계층구조로 만들 수 있음.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Class Diagram&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAMpBy/btrSPQQMSmM/bdNIuSJr8f92HORoOYCFB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAMpBy/btrSPQQMSmM/bdNIuSJr8f92HORoOYCFB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAMpBy/btrSPQQMSmM/bdNIuSJr8f92HORoOYCFB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAMpBy%2FbtrSPQQMSmM%2FbdNIuSJr8f92HORoOYCFB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;310&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;310&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;특징&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;클라이언트에서 단일 객체와 복합 객체를 똑같은 방법으로 다룰 수 있음.&lt;/li&gt;
&lt;li&gt;메뉴와 메뉴 항목을 같은 구조에 집어 넣어서 부분-전체 계증구조를 생성 할 수 있음. 컴포지트를 따르는 디자인을 사용하면 간단한 코드만 가지고도 똑 같은 작업을 전체 메뉴 구조에 대해서 반복해서 적용할 수 있음.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; background-color: #f3c000;&quot;&gt;&lt;b&gt;단일 책임 원칙을 깨면서 대신에 투명성을 확보&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; background-color: #f3c000;&quot;&gt;&lt;b&gt;가장 큰 장점 : Client를 단순화시킬 수 있음&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;State Pattern&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;147&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8k98i/btrTtBTYiA0/Zx7fUgIKnwuJo258O5aNd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8k98i/btrTtBTYiA0/Zx7fUgIKnwuJo258O5aNd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8k98i/btrTtBTYiA0/Zx7fUgIKnwuJo258O5aNd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8k98i%2FbtrTtBTYiA0%2FZx7fUgIKnwuJo258O5aNd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;335&quot; height=&quot;123&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;147&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OCP, 위임, DIP&lt;br /&gt;객체의&amp;nbsp;내부상태에&amp;nbsp;따라&amp;nbsp;&amp;nbsp;스스로&amp;nbsp;행동을&amp;nbsp;변경할&amp;nbsp;수&amp;nbsp;있게끔&amp;nbsp;허가하는&amp;nbsp;패턴.&lt;br /&gt;상태가&amp;nbsp;변할&amp;nbsp;때마다&amp;nbsp;서브클래스&amp;nbsp;중&amp;nbsp;하나의&amp;nbsp;인스턴스로&amp;nbsp;변경함.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;장점으로는&amp;nbsp;한&amp;nbsp;State와&amp;nbsp;관계된&amp;nbsp;모든&amp;nbsp;동작들이&amp;nbsp;하나의&amp;nbsp;Object&amp;nbsp;안에&amp;nbsp;모두&amp;nbsp;모인다.&lt;br /&gt;State&amp;nbsp;추가&amp;nbsp;시&amp;nbsp;다른&amp;nbsp;Object에&amp;nbsp;대한&amp;nbsp;수정&amp;nbsp;없이&amp;nbsp;하나의&amp;nbsp;Object만&amp;nbsp;추가되면&amp;nbsp;된다.&lt;br /&gt;따라서&amp;nbsp;State에&amp;nbsp;따른&amp;nbsp;조건문&amp;nbsp;없이&amp;nbsp;관리가&amp;nbsp;가능하다.&lt;br /&gt;단점으로는&amp;nbsp;State&amp;nbsp;수만큼&amp;nbsp;Object가&amp;nbsp;관리되어야&amp;nbsp;함으로&amp;nbsp;Object가&amp;nbsp;늘어나고,&lt;br /&gt;State&amp;nbsp;안에&amp;nbsp;동작이&amp;nbsp;추가될&amp;nbsp;경우&amp;nbsp;모든&amp;nbsp;Object들에&amp;nbsp;대해서&amp;nbsp;추가되어야&amp;nbsp;해서&amp;nbsp;수정범위가&amp;nbsp;늘어나게&amp;nbsp;된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Proxy Pattern&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;536&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJ1aEP/btrUeXbCwYn/ETwNOFHiocg9izk5VmJ5w0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJ1aEP/btrUeXbCwYn/ETwNOFHiocg9izk5VmJ5w0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJ1aEP/btrUeXbCwYn/ETwNOFHiocg9izk5VmJ5w0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJ1aEP%2FbtrUeXbCwYn%2FETwNOFHiocg9izk5VmJ5w0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;527&quot; height=&quot;316&quot; data-origin-width=&quot;536&quot; data-origin-height=&quot;322&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 다른 객체로 접근하는 것을 통제하기 위해서 그 객체의 대리자(Surrogate) 또는 Placeholder를 제공하는 패턴.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Proxy pattern의 활용되는 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Real subject가 필요한 경우에 생성될 수 있도록 컨트롤 하거나 생성되기 전까지 대리인 역할을 한다. Real subject가 생성되면 Client로부터의 요청사항을 Real subject로 전달한다.&lt;br /&gt;Client와&amp;nbsp;Real&amp;nbsp;subject가&amp;nbsp;서로&amp;nbsp;다른&amp;nbsp;주소체계에&amp;nbsp;있거나&amp;nbsp;Real&amp;nbsp;subject가&amp;nbsp;생성하는데&amp;nbsp;오래걸리거나&amp;nbsp;비싸거나,&amp;nbsp;Real&amp;nbsp;subject에&amp;nbsp;접근하는&amp;nbsp;권한의&amp;nbsp;관리가&amp;nbsp;필요할&amp;nbsp;경우&amp;nbsp;활용된다.&lt;br /&gt;&lt;br /&gt;- remote proxy : responsible for encoding a request and its arguments and for sending the encoded request to the real subject in a different address space &amp;ndash;&amp;nbsp;&lt;br /&gt;- virtual proxy : may cache additional information about the real subject so that they can postpone accessing it &amp;ndash;&amp;nbsp;&lt;br /&gt;- protection proxy : checks that the caller has the access permissions required to perform a request&lt;br /&gt;&lt;br /&gt;원격 프록시 : 요청과 해당 인수를 인코딩하고 인코딩된 요청을 다른 주소 공간의 실제 주체에게 보내는 역할을 합니다.&lt;br /&gt;- 가상 프록시 : 실제 주제에 대한 추가 정보를 캐시에 저장하여 액세스를 연기할 수 있습니다.&lt;br /&gt;- 보호 프록시 : 호출자가 요청을 수행하는 데 필요한 액세스 권한이 있는지 확인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Visitor Pattern&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;627&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xD5Qj/btrUdLWQZeH/yQLOcXQ1kP0kTM847usnjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xD5Qj/btrUdLWQZeH/yQLOcXQ1kP0kTM847usnjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xD5Qj/btrUdLWQZeH/yQLOcXQ1kP0kTM847usnjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxD5Qj%2FbtrUdLWQZeH%2FyQLOcXQ1kP0kTM847usnjk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;527&quot; height=&quot;452&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;627&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체 구조를 이루는 원소에 대해 수행할 연산을 표현하는 패턴.&lt;br /&gt;연산을&amp;nbsp;적용할&amp;nbsp;원소의&amp;nbsp;클래스를&amp;nbsp;변경하지&amp;nbsp;않고도(구조&amp;nbsp;변경&amp;nbsp;없이)&amp;nbsp;새로운&amp;nbsp;연산을&amp;nbsp;정의(새로운&amp;nbsp;기능&amp;nbsp;추가)할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;합니다.&amp;nbsp;다양한&amp;nbsp;객체에&amp;nbsp;새로운&amp;nbsp;기능을&amp;nbsp;추가해야&amp;nbsp;하는데&amp;nbsp;캡슐화가&amp;nbsp;별로&amp;nbsp;중요하지&amp;nbsp;않은&amp;nbsp;경우에&amp;nbsp;사용.&lt;br /&gt;&lt;u&gt;데이터&amp;nbsp;구조와&amp;nbsp;처리를&amp;nbsp;분리&lt;/u&gt;하자.&amp;nbsp;&lt;br /&gt;&amp;ndash;&amp;nbsp;데이터&amp;nbsp;구조를&amp;nbsp;돌아다니는&amp;nbsp;&amp;ldquo;방문자&amp;rdquo;를&amp;nbsp;정의해서,&amp;nbsp;이&amp;nbsp;방문자가&amp;nbsp;&amp;ldquo;처리&amp;rdquo;를&amp;nbsp;담당하도록&amp;nbsp;하자.&amp;nbsp;&lt;br /&gt;&amp;ndash; 새로운 처리를 추가하고 싶을 때는, 새로운 &amp;ldquo;방문자&amp;rdquo;를 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Mediator Pattern&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중재자가 복잡하게 얽혀있는 객체들 간의 상호 통신을 중재시키고, 객체들 간의 상호 작용 로직을 Mediator에 집중시킴으로써 처리를 원할하게 한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;중재자 패턴은&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;복잡한 M개의 객체 사이에 N개의 관계가 형성되어 있을 때&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;M개의 객체 사이에 중재자를 하나 넣어서&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이를 M:1 관계로 바꿔준다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;621&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhTVdc/btrS5NtAb88/LQPrK2PjacfJveF4kJiMg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhTVdc/btrS5NtAb88/LQPrK2PjacfJveF4kJiMg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhTVdc/btrS5NtAb88/LQPrK2PjacfJveF4kJiMg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhTVdc%2FbtrS5NtAb88%2FLQPrK2PjacfJveF4kJiMg0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;621&quot; height=&quot;290&quot; data-origin-width=&quot;621&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;주요 컴포넌트&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mediator&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Colleague 역할들과의 통신을 조정하기 위한 인터페이스를 정하는 역할&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ConcreteMediator&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Mediator 구체 클래스.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Colleague&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Mediator 역할과 통신을 할 인터페이스를 정함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ConcreteColleague&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Colleague 구체 클래스.&lt;/li&gt;
&lt;li&gt;ex) ColleagueButton, ColleagueTextField&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Builder Pattern&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;424&quot; data-origin-height=&quot;179&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LckHD/btrUfILwTKn/SDJqx6QJuBUSxYtQGLYmb0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LckHD/btrUfILwTKn/SDJqx6QJuBUSxYtQGLYmb0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LckHD/btrUfILwTKn/SDJqx6QJuBUSxYtQGLYmb0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/LckHD/btrUfILwTKn/SDJqx6QJuBUSxYtQGLYmb0/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;424&quot; height=&quot;179&quot; data-origin-width=&quot;424&quot; data-origin-height=&quot;179&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Composition&lt;br /&gt;복잡한&amp;nbsp;객체의&amp;nbsp;생성&amp;nbsp;과정과&amp;nbsp;표현&amp;nbsp;방법을&amp;nbsp;분리하여&amp;nbsp;동일한&amp;nbsp;생성&amp;nbsp;절차에서&amp;nbsp;서로&amp;nbsp;다른&amp;nbsp;표현&amp;nbsp;결과를&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;하는&amp;nbsp;패턴.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Bridge Pattern&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCu3Sw/btrUdLCwJyf/0eQrEBqTinT9KzQiH8NLwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCu3Sw/btrUdLCwJyf/0eQrEBqTinT9KzQiH8NLwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCu3Sw/btrUdLCwJyf/0eQrEBqTinT9KzQiH8NLwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCu3Sw%2FbtrUdLCwJyf%2F0eQrEBqTinT9KzQiH8NLwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;527&quot; height=&quot;197&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;278&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;구현부에서&amp;nbsp;추상층을&amp;nbsp;분리하여&amp;nbsp;각자&amp;nbsp;독립적으로&amp;nbsp;변형할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;하는&amp;nbsp;패턴.&lt;br /&gt;추상적&amp;nbsp;개념과&amp;nbsp;이에&amp;nbsp;대한&amp;nbsp;구현&amp;nbsp;사이의&amp;nbsp;지속적인&amp;nbsp;종속&amp;nbsp;관계를&amp;nbsp;피하고&amp;nbsp;싶을&amp;nbsp;때&amp;nbsp;사용.&amp;nbsp;추상적&amp;nbsp;개념과&amp;nbsp;구현&amp;nbsp;모두가&amp;nbsp;독립적으로&amp;nbsp;서브클래싱을&amp;nbsp;통해&amp;nbsp;확장되어야&amp;nbsp;할때&amp;nbsp;사용.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Chain of Responsibility Pattern&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책임 떠넘기기 패턴.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 요구가 발생했을 때 그 요구를 처리할 객체를 바로 결정할 수 없는 경우에는 다수의 객체를 사슬처럼 연결해 두고 객체의 사슬을 차례로 돌아다니면서 목적에 맞는 객체를 결 정하는&amp;nbsp;경우&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1502&quot; data-origin-height=&quot;733&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C05yn/btrS7uz4hVx/LNTFDly1rGI110FQvCYiL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C05yn/btrS7uz4hVx/LNTFDly1rGI110FQvCYiL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C05yn/btrS7uz4hVx/LNTFDly1rGI110FQvCYiL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC05yn%2FbtrS7uz4hVx%2FLNTFDly1rGI110FQvCYiL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1502&quot; height=&quot;733&quot; data-origin-width=&quot;1502&quot; data-origin-height=&quot;733&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;요구하는&amp;nbsp;사람과&amp;nbsp;요구를&amp;nbsp;처리하는&amp;nbsp;사람을&amp;nbsp;느슨하게&amp;nbsp;연결&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Client 는 맨 처음 사람에게만 요구를 한다&lt;/li&gt;
&lt;li&gt;그 요구가 처리자들을 연결한 사슬을 돌아다니다가 적절한 처리자에 의해 처리된다 &lt;br /&gt;이 패턴을 사용하지 않으면 , 이 요구는 이 처리자가 처리해야 한다 라는 지식을 누군가 중앙 집중적으로 가지고 있어야 한다. 이 지식을 요구자에게 맡기는 것은 현명하지 않다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;동적으로 처리자들의 순서를 바꿀 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자신의 일에 집중할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;유연성은 높지만, 처리 속도는 느린 단점.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Flyweight Pattern&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;크기가 큰 객체가 여러 개 있을 때, 공유를 통해 이들을 효율적으로 지원하는 패턴. 해쉬 테이블에 자주 사용되고 반복적이며 메모리가 큰 것을 저장해두고 재사용하는것&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;인스턴스를&amp;nbsp;가능한&amp;nbsp;한&amp;nbsp;공유시켜서,&amp;nbsp;쓸데없이&amp;nbsp;new를&amp;nbsp;하지&amp;nbsp;않도록&amp;nbsp;한다.&amp;nbsp;&amp;ndash;&amp;nbsp;인스턴스가&amp;nbsp;필요할&amp;nbsp;때&amp;nbsp;마다&amp;nbsp;new를&amp;nbsp;하는&amp;nbsp;것이&amp;nbsp;아니라,&amp;nbsp;이미&amp;nbsp;만들어져&amp;nbsp;있는&amp;nbsp;인스턴스를&amp;nbsp;이용할&amp;nbsp;수&amp;nbsp;있으면&amp;nbsp;공유하자.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;u&gt;Prototype은 복제를 하는 것이고 Flyweight는&lt;span&gt;&amp;nbsp;&lt;/span&gt;있는것 그대로 쓴다.&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Prototype Pattern&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;459&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9XPgQ/btrUh4fJB8b/D1CuUnMPgvbC2fRy0oXrAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9XPgQ/btrUh4fJB8b/D1CuUnMPgvbC2fRy0oXrAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9XPgQ/btrUh4fJB8b/D1CuUnMPgvbC2fRy0oXrAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9XPgQ%2FbtrUh4fJB8b%2FD1CuUnMPgvbC2fRy0oXrAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;527&quot; height=&quot;305&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;459&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성할 객체의 종류를 명시하는 데에 원형이 되는(Prototypical) 인스턴스를 이용하고, 그 원형을 복사함으로써 새로운 객체를 생성하는 패턴.&lt;br /&gt;클래스로부터&amp;nbsp;인스턴스를&amp;nbsp;새로&amp;nbsp;만드는&amp;nbsp;것이&amp;nbsp;아니라,&amp;nbsp;현재&amp;nbsp;존재&amp;nbsp;하는&amp;nbsp;인스턴스를&amp;nbsp;복사(복제)해서&amp;nbsp;새로운&amp;nbsp;인스턴스를&amp;nbsp;만들&amp;nbsp;필요&amp;nbsp;가&amp;nbsp;있을&amp;nbsp;때,&amp;nbsp;이&amp;nbsp;작업을&amp;nbsp;편하게&amp;nbsp;하기&amp;nbsp;위해&amp;nbsp;사용한다&lt;br /&gt;&lt;br /&gt;pros&amp;nbsp;:&amp;nbsp;인스턴스를&amp;nbsp;만드는&amp;nbsp;복잡한&amp;nbsp;과정을&amp;nbsp;몰라도&amp;nbsp;되고&amp;nbsp;속도가&amp;nbsp;빠르다&lt;br /&gt;cons&amp;nbsp;:&amp;nbsp;복사본&amp;nbsp;자체를&amp;nbsp;만드는일&amp;nbsp;자체가&amp;nbsp;복잡할&amp;nbsp;수&amp;nbsp;있다.&lt;br /&gt;&lt;br /&gt;객체를 빨리 생성하는 패턴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Memento Pattern&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;519&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZJRUk/btrUdMak0sm/hCmrQXjTY0kbRNTuwThC61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZJRUk/btrUdMak0sm/hCmrQXjTY0kbRNTuwThC61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZJRUk/btrUdMak0sm/hCmrQXjTY0kbRNTuwThC61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZJRUk%2FbtrUdMak0sm%2FhCmrQXjTY0kbRNTuwThC61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;527&quot; height=&quot;363&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;519&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 객체의 상태를 기록하여 보존하기 위한 Memento 패턴&amp;nbsp;&lt;br /&gt;&amp;ndash;&amp;nbsp;Caretaker&amp;nbsp;역할은&amp;nbsp;중간&amp;nbsp;중간&amp;nbsp;Originator&amp;nbsp;역할에게&amp;nbsp;부탁하여&amp;nbsp;&amp;lsquo;현&amp;nbsp;재의&amp;nbsp;상태&amp;rsquo;를&amp;nbsp;표현하는&amp;nbsp;Memento&amp;nbsp;역할을&amp;nbsp;만든다.&amp;nbsp;&lt;br /&gt;&amp;ndash;&amp;nbsp;Caretaker&amp;nbsp;역할은&amp;nbsp;필요할&amp;nbsp;때&amp;nbsp;서랍&amp;nbsp;안에서&amp;nbsp;Memento&amp;nbsp;역할을&amp;nbsp;꺼&amp;nbsp;내서&amp;nbsp;Originator&amp;nbsp;역할에게&amp;nbsp;건네주면,&amp;nbsp;그&amp;nbsp;상태로&amp;nbsp;복원이&amp;nbsp;된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Software Architecture</category>
      <category>Design Pattern</category>
      <category>디자인 패턴</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/109</guid>
      <comments>https://softwaree.tistory.com/109#entry109comment</comments>
      <pubDate>Sun, 4 Dec 2022 13:24:36 +0900</pubDate>
    </item>
    <item>
      <title>3. Principles of SW Design</title>
      <link>https://softwaree.tistory.com/108</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DMkOA/btrSM3JEqyZ/NTHUHJ0s7D07tL2HveSM00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DMkOA/btrSM3JEqyZ/NTHUHJ0s7D07tL2HveSM00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DMkOA/btrSM3JEqyZ/NTHUHJ0s7D07tL2HveSM00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDMkOA%2FbtrSM3JEqyZ%2FNTHUHJ0s7D07tL2HveSM00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;591&quot; height=&quot;591&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;591&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;SOLID&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In computer programming, the term SOLID is a mnemonic acronym for five design principles intended to &lt;span style=&quot;background-color: #f3c000;&quot;&gt;make software designs more understandable, flexible and maintainable&lt;/span&gt;. The principles are a subset of many principles promoted by Robert C.Martin. Though they apply to any object-oriented design, the SOLID principles can also form a &lt;span style=&quot;background-color: #f3c000;&quot;&gt;core philosophy&lt;/span&gt;&amp;nbsp;for methodologies such as agile development or Adaptive Software Development. The SOLID acronym was introduced by Michael Feathers.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;SRP&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;A class should &lt;/span&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;have only a single responsibility&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;(i.e. changes to only one part of the software&amp;rsquo;s specification should be able to affect the specification of the class)&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;OCP&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Don&amp;rsquo;t modify code, just extend class using inheritance, composition.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;LSP&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;상속을 얼마나 잘 사용하고 있는가에 대한 원칙&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상위 타입 : Base 클래스, 하위 타입 : 구체 클래스&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1669901292598&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class apple extends Item {}

// 메서드 인자로 item 대신에 apple을 넘기더라도 동작해야 함.
// 여기서 리스코프 치환 원칙이 지켜지지 않는다면, 다형성에 기반한 개방 폐쇄 원칙 역시 위반하는것.
// instanceof를 통하여 하위 클래스의 존재를 알아야 하는 순간 잘못 사용하고 있는것.
public int calculate(final Item item) {
	return item.calculate();
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ISP&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;클라이언트는 자신이 사용하는 메서드에만 의존해야 한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리함으로써,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;클라이언트로부터 발생하는 인터페이스의 여파가 다른 클라이언트에 미치는 영향을 최소화 하는것을 목표로 한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 251px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;ISP 미적용&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;&amp;nbsp;ISP 적용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 231px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 231px;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;239&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cevdmY/btrSB4pvRQo/gKmIut6PY51PRSEauKxtb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cevdmY/btrSB4pvRQo/gKmIut6PY51PRSEauKxtb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cevdmY/btrSB4pvRQo/gKmIut6PY51PRSEauKxtb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcevdmY%2FbtrSB4pvRQo%2FgKmIut6PY51PRSEauKxtb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;364&quot; height=&quot;201&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;239&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;User2 코드 수정시, User1도 새로 컴파일 해야 할 수 있음.&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 231px;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Cqwa6/btrSC8rbTah/PMyJCjLKEPvfki4375JNuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Cqwa6/btrSC8rbTah/PMyJCjLKEPvfki4375JNuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Cqwa6/btrSC8rbTah/PMyJCjLKEPvfki4375JNuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCqwa6%2FbtrSC8rbTah%2FPMyJCjLKEPvfki4375JNuk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;344&quot; height=&quot;228&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;228&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;DIP&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;고수준 모듈은 저수준 모듈의 구현에 의존해서는 안 된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;저수준 모듈이 고수준 모듈에서 정의한 추상 타입에 의존해야 한다.&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;즉, &lt;span style=&quot;background-color: #f3c000;&quot;&gt;자신보다 변하기 쉬운 것에 의존하지 마라&lt;/span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;span&gt;Example&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;자동차가 스노우타이어에 의존. 즉, 고수준 모듈인 자동차가 저수준 모듈인 스노우타이어에 의존.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이런 경우, 타이어 변경시 자동차의 부속품도 변경 해야 함. &amp;rarr; OCP 위배&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;이슈 해결 위하여, DIP는 &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;b&gt;추상화&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;를 활용하여 아래처럼 설계&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3OZJw/btrSDFWzeuu/mAxCPHqSk2bm4gtDXIJEW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3OZJw/btrSDFWzeuu/mAxCPHqSk2bm4gtDXIJEW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3OZJw/btrSDFWzeuu/mAxCPHqSk2bm4gtDXIJEW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3OZJw%2FbtrSDFWzeuu%2FmAxCPHqSk2bm4gtDXIJEW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;494&quot; height=&quot;174&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p contenteditable=&quot;true&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;Separaction of Concerns&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;개발 및 유지관리를 단순하게 해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;잘 나뉘어 있는 관심사(concern)는 개별 섹션을 재사용 할 수 있을 뿐 아니라 다른 섹션의 세부 사항을 알지도 변경하지 않고도 개발된 코드를 재사용할 수 있게 함.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;span&gt;Q) Give examples of applying Separation of Concerns.&lt;/span&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;span&gt;A) Internet protocol stack, MVC, Microservice 등&lt;/span&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;Modularity, Functional Independence&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Cohesion : Indication of the relative functional strength of a module&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Coupling : Indication of the relative interdependance among modules.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Software Architecture</category>
      <category>Cohesion</category>
      <category>Coupling</category>
      <category>dip</category>
      <category>ISP</category>
      <category>LSP</category>
      <category>ocp</category>
      <category>Separation of Concerns</category>
      <category>Software Design</category>
      <category>Solid</category>
      <category>SRP</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/108</guid>
      <comments>https://softwaree.tistory.com/108#entry108comment</comments>
      <pubDate>Thu, 1 Dec 2022 22:46:00 +0900</pubDate>
    </item>
    <item>
      <title>2. OO Analysis and Design (OOAD)</title>
      <link>https://softwaree.tistory.com/107</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1BU0m/btrSIqGDZqu/1iJfIRRNZ9ViF9pE953qsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1BU0m/btrSIqGDZqu/1iJfIRRNZ9ViF9pE953qsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1BU0m/btrSIqGDZqu/1iJfIRRNZ9ViF9pE953qsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1BU0m%2FbtrSIqGDZqu%2F1iJfIRRNZ9ViF9pE953qsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;591&quot; height=&quot;591&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;591&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;OOA 단계&lt;span&gt;&lt;b&gt;객체지향 분석 (Object Oriented Analysis)&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- 문제를 정의하고 이 정의로부터 개념 모델(객체에 대한 추상적 정의)을 사용하여 객체, 관계 및 동작을 식별한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;사물이나 컨셉을 설명하거나 찾아내는 것.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;즉,&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;요구사항&lt;/b&gt;을 찾아내고, 그 속의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;객체들의 목록&lt;/b&gt;을 찾아내는 것&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;OOA 단계&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1. 요구사항 도출&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;- 소프트웨어가 수행해야 하는 작업과 해결하려는 문제를 정의&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;2. 요구사항 지정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;- 일반적으로 사용사례 및 시나리오 또는 사용자 스토리를 사용하여 요구사항 설명&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;3. 개념 모델(Conceptual model)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;- 중요한 객체를 식별하고 다듬고 관계와 동작을 정의하여 간단한 도표로 표현&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;개념 모델의 종류&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1. 객체 모형 (Object Model)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;- 객체들과 그 특성을 식별하여 객체들의 정적 구조(static structure)와 그들과의 관계(Interface)를 보여주는 객체 다이어그램(Object Diagram)을 작성한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;2. 동적 모형 (Dynamic Model)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;- 시간 흐름에 따른 시스템의 변화를 보여주는 상태 다이어그램(State Diagram)을 작성한다. 실시간(real-time) 시스템에서는 반드시 필요하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;3. 기능 모형 (Function Model)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;- 시스템 내에서 데이터 값이 변하는 과정을 보여주는 것으로 잘 알려진 자료 흐름도(DFD)가 사용된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;객체지향 설계 (Object Oriented Design)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- 설계 단계에서는 객체와 그들의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;속성&lt;/b&gt;(attribute),&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;동작&lt;/b&gt;(behavior),&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;상호작용&lt;/b&gt;(interaction)을 설명한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;즉, OOA를 통해 찾아진&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;객체들 간의 관계&lt;/b&gt;를 설정하는 것.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span&gt;설계 단계에서는...&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;올바른 요구에 맞는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;다양한 다이어그램&lt;/b&gt;을 선택하는 것이 중요하다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span&gt;1.&amp;nbsp;&lt;b&gt;클래스 다이어그램&lt;/b&gt;를 사용하여 클래스와 클래스의 관계를 설명&lt;/span&gt;&lt;br /&gt;&lt;span&gt;- 필요한 클래스를 시각적으로 나타낸다. 이 단계에서 유전성(Inheritance)이나 다형성(Polymorphism)과 같은 객체 지향적인 원칙에 대해서 구체적으로 알게 된다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;2.&amp;nbsp;&lt;b&gt;시퀀스 다이어그램&lt;/b&gt;를 사용하여&amp;nbsp;개체 간의 상호작용을 설명&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;3. 그 외에도 객체간의 상호작용, 시스템의 구조, 시스템의 동작, 어떻게 이벤트에 반응하는지에 대해 표현할 수 있는 다이어그램이 많다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그리고 소프트웨어&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;설계 원칙&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;및&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;설계 패턴&lt;/b&gt;을 적용하여 설계한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;객체지향 설계의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;종류&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1. 시스템 설계(System Design)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;- 시스템의 구조를 서브시스템으로 분해한다. 이 과정중에서 성능 최적 방안, 문제 해결 전략, 자원 분배 등이 확정된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;2. 객체 설계(Object Design)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;- 구현에 필요한 상세한 내역을 설계 모형으로 제작하고 상세화된다. 구체적인 자료구조와 알고리즘 들이 정의된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Q) When would you use X Diagram?&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Use Case Diagram&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자의 요구를 기능적인 측면에서 명시하며, 시스템이 제공해야 하는 서비스의 목록을 얻기 위해 사용.&lt;br /&gt;또한,&amp;nbsp;특정&amp;nbsp;기능이&amp;nbsp;동작&amp;nbsp;후에&amp;nbsp;어떤&amp;nbsp;기능이&amp;nbsp;추가로&amp;nbsp;실행되는지,&amp;nbsp;또는&amp;nbsp;어떤&amp;nbsp;조건&amp;nbsp;하에&amp;nbsp;후속&amp;nbsp;기능이&amp;nbsp;수행되는지를&amp;nbsp;검토해보면서&amp;nbsp;공통&amp;nbsp;기능을&amp;nbsp;추출해&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있고,&amp;nbsp;유사&amp;nbsp;기능&amp;nbsp;분류를&amp;nbsp;통해&amp;nbsp;기능&amp;nbsp;단위로&amp;nbsp;Encapsulation을&amp;nbsp;수행해&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;&quot;시스템이&amp;nbsp;제공하고&amp;nbsp;있는&amp;nbsp;기능&amp;nbsp;및&amp;nbsp;그와&amp;nbsp;관련된&amp;nbsp;외부요소를&amp;nbsp;사용자의&amp;nbsp;관점에서&amp;nbsp;표현하는&amp;nbsp;다이어그램&quot; &lt;br /&gt;&quot;시스템&amp;nbsp;외의&amp;nbsp;요소와&amp;nbsp;기능적&amp;nbsp;요구사항을&amp;nbsp;Actor와&amp;nbsp;Use&amp;nbsp;case,&amp;nbsp;Relationship으로&amp;nbsp;표현&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Relationships&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;연관(Association): Use Case와 Actor의 관계를 표현(실선)&lt;/li&gt;
&lt;li&gt;확장(Extend): 기본 Use Case 수행 시 특별한 조건을 만족할 때 수행하는 Use Case&lt;/li&gt;
&lt;li&gt;포함(Include): 시스템의 기능이 별도의 기능을 포함(점선)&lt;/li&gt;
&lt;li&gt;일반화(Generalization): 하위 Use Case/Actor가 상위 Use Case/Actor에게 기능/역할을 상속 받음&lt;/li&gt;
&lt;li&gt;그룹화(Grouping): 여러 개의 Use Case를 단순화 하는 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Granularity of Use Case&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Use Case의 적당한 크기는 Use Case의 정의에 충실하게 되어 있고, 개발과 관리에 용이한가를 만족하면 된다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Use Case Description / Scenario&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 중심 접근 (story와 예제 중심의 형식으로 기술)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 시나리오를 사용하여 요구사항 분석 지원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Class Diagram&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도출한 Class들 간의 관계를 정의하고 검증함으로써 Persistence한 Dataset과 그들의 관계, 속성들을 결정한다. &lt;br /&gt;Entity&amp;nbsp;type의&amp;nbsp;class와&amp;nbsp;그들의&amp;nbsp;관계&amp;nbsp;및&amp;nbsp;cardinality,&amp;nbsp;그리고&amp;nbsp;몇개의&amp;nbsp;key&amp;nbsp;속성을&amp;nbsp;보여준다. &lt;br /&gt;시스템을&amp;nbsp;구성하는&amp;nbsp;클래스의&amp;nbsp;구성&amp;nbsp;(Attribute,&amp;nbsp;Operation)과&amp;nbsp;클래스&amp;nbsp;간의&amp;nbsp;관계를&amp;nbsp;표현하기위해&amp;nbsp;사용 &lt;br /&gt;Class&amp;nbsp;Name,&amp;nbsp;Attribute,&amp;nbsp;Operation,&amp;nbsp;Relationship을&amp;nbsp;가지고&amp;nbsp;있음.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5 Types of Relationship&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Q) Order the strengths of 5 relationship types. Justify the ordering.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Inheritance : 상속 &lt;span style=&quot;color: #ee2323;&quot;&gt;(Strong)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Composition : 생명 주기 함께&lt;/li&gt;
&lt;li&gt;Aggregation : 레퍼런스 객체 가지고 있음.&lt;/li&gt;
&lt;li&gt;Associate : 지속적 호출 (보통 한 클래스 내에서만 사용) / 한 객체가 다른 객체와 연결되어 있음을 나타낼때 사용.&lt;/li&gt;
&lt;li&gt;Dependency : 잠깐 호출 (보통 한 메서드 내에서만 사용) &lt;span style=&quot;color: #ee2323;&quot;&gt;(Weak)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Sequence Diagram&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&quot;Workflow&amp;nbsp;related&amp;nbsp;to&amp;nbsp;Use&amp;nbsp;Case&amp;nbsp;Description&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&quot;Applying MVC style paradigm in drawing Sequence Diagram&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Use case에 대해서 어떻게 Sequence적으로 동작하는지 설명&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부 사용자 또는 Actor가 발생시키는 이벤트, 메시지 호출의 순서 등을 이용하여 기능적인 요소들이 실시간에 어떤 메시지를 주고 받는지를 설계하기 위한 다이어그램. &lt;br /&gt;시간의 흐름에 따라 여러 Object간의 상호작용을 구성 요소 간의 메시지 전달로 표현.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;State Machine Diagram&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목표 시스템이 State 종속적으로 실행되는 Behavior를 가지고 있을 때, 상태와 상태 간에 전이에 관련된 설계.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;State Machine이 이벤트에 따라 어떠한 상태변화가 있는지를 모델링하는 다이어그램.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Transition, Event, Guard, Action&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Event가 발생하면 현재 상태에 따라 상태 Transition이 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Guard를 만족하지 못하면 이벤트가 발생하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;State가 변경되면 entry, exit, do에 명시된 Action이 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Final State는 실제로 존재할 수 있는 State이지만 Terminated Node는 아예 State Machine이 종료.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Timing Diagram&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;295&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DfVFQ/btrThG8AN3Q/1ruXZss8OIUt8z33ANoam1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DfVFQ/btrThG8AN3Q/1ruXZss8OIUt8z33ANoam1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DfVFQ/btrThG8AN3Q/1ruXZss8OIUt8z33ANoam1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDfVFQ%2FbtrThG8AN3Q%2F1ruXZss8OIUt8z33ANoam1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;295&quot; height=&quot;120&quot; data-origin-width=&quot;295&quot; data-origin-height=&quot;120&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타이밍 다이어그램은 시퀀스 다이어그램 의 특수한 형태입니다 . 타이밍 다이어그램과 시퀀스 다이어그램의 차이점은 축이 반대로 되어 왼쪽에서 오른쪽으로 시간이 증가하고 생명선이 수직으로 배열된 별도의 구획에 표시된다는 것입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Activity Diagram&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 Action들이 순차 병행 방식 등을 수행하는 상황을 표현.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복잡한 Workflow나 병행 처리, 시간 제약이 있는 중요한 알고리즘에 대한 설계.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Action을 묶어 Activity로 나타낼 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설계 단계에서는 클래스나 컴포넌트의 알고리즘을 Activity Diagram을 통해서 표현할 수도 있음.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Component Diagram&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴포넌트란 시스템을 구성하는 임의의 물리적인 요소를 의미 &lt;br /&gt;물리적인 요소란 가상의 모델을 실제로 구현하여 나타낸 것 &lt;br /&gt;객체지향 원리에서 컴포넌트는 인터페이스에 의해서 기능이 정의된 독립적으로 개발, 배포, 조립이 가능한 시스템의 구성 단위 (Ex. JAR, DLL) &lt;br /&gt;컴포넌트 다이어그램의 구성요소는 컴포넌트, 인터페이스, 의존관계, 지원관계로 나뉨 &lt;br /&gt;의존관계는 컴포넌트와 컴포넌트 사이의 관계이고 지원관계는 인터페이스와 컴포넌트의 관계 &lt;br /&gt;컴포넌트들은 서로간 loosely coupled 해야 함.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Provided Interface&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 컴포넌트가 사용할 수 있는 서비스를 명시하는것.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Required Interface&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;플러그인 컴포넌트가 구현해야 하는 프로토콜을 명시하는것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Q) Why is required interface essential in designinig platform SW?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A) &lt;u&gt;컴포넌트는 하나의 구성 요소. S/W 디자인의 SRP에 따라 모든 인터페이스를 하나의 컴포넌트에 구현하는 것은 불가능함. 따라서 필요한 인터페이스는 외부의 다른 컴포넌트에서 얻어와야 할 수 있으며, 그렇기에 필수적이라 생각&lt;/u&gt;.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Deployment Diagram&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 다이어그램은 노드, 노드 간 네트워크 연결 및 노드에 배포된 소프트웨어 아티팩트를 지정.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;UML Constructs for Parallel Processing&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Activity Diagrm에서 fork &amp;amp; join 을 활용하여 표현 할 수 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Consistency&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Among Use Case Model, Class Diagram, &amp;amp; Sequence Diagram&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Between State Machine Diagram &amp;amp; Class Diagram&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Between Activity Diagram &amp;amp; Use Case Diagram&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Q) How do you check the consistency between &amp;lt;X diagram&amp;gt; &amp;amp; &amp;lt;Y diagram&amp;gt;&lt;/p&gt;</description>
      <category>Software Architecture</category>
      <category>5 types relationships</category>
      <category>activity diagram</category>
      <category>Class Diagram</category>
      <category>sequence diagram</category>
      <category>State machine diagram</category>
      <category>Timing diagram</category>
      <category>usecase diagram</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/107</guid>
      <comments>https://softwaree.tistory.com/107#entry107comment</comments>
      <pubDate>Thu, 1 Dec 2022 22:21:16 +0900</pubDate>
    </item>
    <item>
      <title>객체지향 프로그래밍 / OOP란?</title>
      <link>https://softwaree.tistory.com/106</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdLLoV/btrSJno0rkx/WfICEPMozXAJy3o8HzKFy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdLLoV/btrSJno0rkx/WfICEPMozXAJy3o8HzKFy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdLLoV/btrSJno0rkx/WfICEPMozXAJy3o8HzKFy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdLLoV%2FbtrSJno0rkx%2FWfICEPMozXAJy3o8HzKFy1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;425&quot; height=&quot;425&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;591&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Object-Oriented Paradigm&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체 지향 패러다임을 설명할때 절차지향 프로그래밍과 비교하여 설명하곤 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 표를 통해 잠깐 살펴 보겠습니다. ^^&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Procedural Programming&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Object Oriented Programming&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;- 위에서 아래로 순서대로 수행되는 개발 방법 (C언어)&lt;br /&gt;- 컴퓨터 작업 처리 방식과 유사하기 때문에 실행 속도가 빠름&lt;br /&gt;- 유지보수가 힘들고 시간이 많이 소요됨&lt;br /&gt;- 수정시 모든 절차에 영향을 줄 수 있음&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;- 실제 세계를 모델링.&lt;br /&gt;- 데이터와 절차를 하나의 덩어리로 묶어서 표현.&lt;br /&gt;- Encapsulation, Inheritance, Polymorphism이 있음.&lt;br /&gt;- 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 사용.&lt;br /&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;span style=&quot;color: #444444;&quot;&gt;- increase the flexibility and maintainability&lt;/span&gt;&lt;span style=&quot;color: #444444;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Class and Objects&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&amp;nbsp; An object is an instance of a class&lt;/span&gt;. Objects are&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;unit of abstraction&lt;/span&gt;. An object can communicate with other using messages. An object passes a message to another object, which results in the invocation of a method. Objects then perform the actions that are required to get a response from the system.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Real world objects all share two characteristics; they all have&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;state and behavior&lt;/span&gt;. One-way to begin thinking in an object oriented way is&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;to identify the state and behavior of real world objects&lt;/span&gt;. The complexity of objects can differ, some object have more states and more complex behaviors than other object. Compare the state and behavior of a television to the states and behaviors of a car.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Software objects are conceptually similar to real world objects. An object&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;stores its state in fields&lt;/span&gt;, and it&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;exposes its behaviors through its methods&lt;/span&gt;.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Encapsulation&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;하나의 객체에 대해 그 객체가 특정한 목적을 위해 필요한 변수나 메소드를 하나로 묶는 것.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;데이터와 코드의 형태를 외부로부터 알 수 없게 은닉.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-mark=&quot;-&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;Cohesion 증가, Coupling 감소&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;SoC 달성&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;외부의 변화에 영향을 덜 받음&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;Inheritance&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&quot;is-a&quot; 관계. 부모 객체의 속성과 메서드를 자식이 물려 받는 것. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;객체들 간의 관계를 구축하는 방법 중 하나.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;상속을 통해 부모 클래스의 기능을 자식 클래스가 재사용할 수 있고 기능을 확장 할 수 있음.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Polymorphism&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;상속을 통해 기능을 확장하거나 변경하는 것을 가능하게 해 줌.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;즉, 형태가 같은데 다른 기능을 하는 것을 의미.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; 자바의 오버라이딩, 오버로딩이 대표적인 예.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. Overloading&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드의 이름은 같고 매개변수의 갯수나 타입이 다른 함수를 정의하는 것.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;2.&lt;span&gt; &lt;/span&gt;&amp;nbsp;Overriding&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;상속 받은 하위 클래스가 메서드의 내용만 변경(재정의) 하는 것.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;3. Dynamic Binding&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체의 성격이 컴파일 타임이 아닌 런타임에 결정됨. &lt;span style=&quot;background-color: #f3c000;&quot;&gt;다형성을 사용하고 OCP를 가능하게 하는 장치&lt;/span&gt;.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;장점 : 유연성 (런타임까지 타입에 대한 결정을 끌고 갈 수 있기 때문에 많은 선택의 여지가 있음)&lt;/li&gt;
&lt;li&gt;단점 : 안정성 (실행 도중에 예상치 못한 타입이 들어와서 타입 에러를 발생시키는 경우가 발생)&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 반면, 정적 바인딩은 컴파일 타임에 결정됨.&lt;/li&gt;
&lt;li&gt;Q) Why is Dynamic Binding essential in object-oriented programming?&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;4. Substitutability (대체 가능성)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;특정 타입을 사용해야 하는 곳이 있다면, 이 타입의 서브타입을 대신 쓸 수 있다는 원칙.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Abstraction&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체의 공통적인 속성과 기능을 추출하여 정의하는 것. 실제로 존재하는 객체들을 프로그램으로 만들기 위한 공통적인 특성을 파악해서 필요 없는 특성을 제거하는 과정&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;장점&lt;br /&gt;- 재사용성&amp;nbsp;:&amp;nbsp;상속을&amp;nbsp;통해&amp;nbsp;프로그래밍시&amp;nbsp;코드의&amp;nbsp;재사용을&amp;nbsp;높일&amp;nbsp;수&amp;nbsp;있음. &lt;br /&gt;- 생산성 향상 : 잘 설계된 클래스를 만들어서 독립적인 객체를 사용함으로써 개발의 생산성을 향상할 수 있음. &lt;br /&gt;- 유지보수 우수성 : 프로그램 수정 시 캡슐화를 통해 주변 영향이 적기 때문에 유지보수가 쉬워서 매우 경제적이라고 할 수 있음.&lt;/li&gt;
&lt;li&gt;단점&lt;br /&gt;- 느린&amp;nbsp;개발&amp;nbsp;속도,&amp;nbsp;느린&amp;nbsp;실행&amp;nbsp;속도,&amp;nbsp;높은&amp;nbsp;난이도.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Information Hiding&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 내부의 data와 method를 숨기고 공개된 Interface를 통해서만 접근이 가능하도록 하는 개념이다. 공개범위는 &lt;b&gt;접근지시자&lt;/b&gt;로 지정 합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;Visibility(접근성)&lt;/b&gt;&lt;br /&gt;Public, Protected, Private같은 접근 지시자를 이용해 데이터나 메소드에 대한 접근 권한을 제어하는 키워드&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Encapsulation은&amp;nbsp;관련된&amp;nbsp;요소를&amp;nbsp;묶어&amp;nbsp;캡슐&amp;nbsp;내부와&amp;nbsp;외부를&amp;nbsp;구별지는&amp;nbsp;장치이고&amp;nbsp;Information&amp;nbsp;Hiding은&amp;nbsp;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;캡슐&amp;nbsp;내부요소들에&amp;nbsp;대한&amp;nbsp;세부&amp;nbsp;구현사항을&amp;nbsp;외부에&amp;nbsp;숨기는&amp;nbsp;장치&lt;/span&gt;이다.&amp;nbsp;따라서&amp;nbsp;캡슐화&amp;nbsp;했다고&amp;nbsp;해서&amp;nbsp;반드시&amp;nbsp;Hide&amp;nbsp;되는&amp;nbsp;것은&amp;nbsp;아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;모듈간 의존도를 낮춰서 Coupling이 낮아지고 Modularity가 좋아진다&lt;/span&gt;. 모듈내에 변경해도 외부에 미치는 영향을 최소화 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Abstract Class &amp;amp; Interface&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Q) What is the difference between Abstract Class and Interface?&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Abstract Class&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;추상&amp;nbsp;클래스를&amp;nbsp;상속&amp;nbsp;받아&amp;nbsp;기능을&amp;nbsp;이용하고&amp;nbsp;확장&amp;nbsp;시키기&amp;nbsp;위함&lt;/li&gt;
&lt;li&gt;추상 메소드가 하나 이상 포함되면 반드시 추상 클래스로 선언되어야 함.&lt;/li&gt;
&lt;li&gt;반드시 추상 클래스를 상속하는 자식 클래스에서 부모가 가진 추상 메소드를 모두 Overriding해야 함.&lt;/li&gt;
&lt;li&gt;추상 클래스에서 추상 메소드가 아닌 일반 메소드를 포함시킬 수 있다.&lt;/li&gt;
&lt;li&gt;추상 메소드는 몸체가 없고 선언부만 존재한다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;다중 상속 불가능&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Interface&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;구현 객체의 같은 동작을 보장하기 위함&lt;/li&gt;
&lt;li&gt;오로지 추상 메소드와 상수만을 가집니다. 즉 로직을 작성할 수 없습니다.&lt;/li&gt;
&lt;li&gt;인터페이스 내에 존재하는 메소드는 무조건 public abstract로 선언됩니다.&lt;/li&gt;
&lt;li&gt;인터페이스 내에 존재하는 변수는 무조건 public static final로 선언됩니다.&lt;/li&gt;
&lt;li&gt;인터페이스는 다중 상속과 비슷한 기능을 제공합니다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;다중 상속 가능&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Generic Class &amp;amp; Template&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;형식 매개 변수&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용자가 전달하는 &amp;ldquo;형식&amp;rdquo;을 매개변수로 사용하여 형식 내부에서 형식 매개 변수로 정의된 (주로 단일 형식 매개 변수에서는 T를 사용합니다.) 형식을 교체하는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;- 클래스를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;정의&lt;/b&gt;할 때&lt;/span&gt;&lt;span style=&quot;color: #555555;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555;&quot;&gt;구체적인 타입&lt;/span&gt;&lt;span style=&quot;color: #555555;&quot;&gt;(type)&lt;/span&gt;&lt;span style=&quot;color: #555555;&quot;&gt;을 적지 않고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;변수 형태&lt;/b&gt;로 적어 놓는 것이다&lt;/span&gt;&lt;span style=&quot;color: #555555;&quot;&gt;.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Software Architecture</category>
      <category>abstract class and interface</category>
      <category>Dynamic Binding</category>
      <category>encapsulation</category>
      <category>informationhiding</category>
      <category>inheritance</category>
      <category>OOP</category>
      <category>overloading and overriding</category>
      <category>polymorphism</category>
      <category>객치지향프로그래밍</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/106</guid>
      <comments>https://softwaree.tistory.com/106#entry106comment</comments>
      <pubDate>Thu, 1 Dec 2022 21:47:00 +0900</pubDate>
    </item>
    <item>
      <title>자음 한자 특수문자</title>
      <link>https://softwaree.tistory.com/104</link>
      <description>&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-v-866385a2=&quot;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-v-866385a2=&quot;&quot;&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td colspan=&quot;10&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #08d8c2;&quot; data-v-866385a2=&quot;&quot;&gt;문장 부호&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;1&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;2&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;3&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;4&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;5&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;6&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;7&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;8&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;9&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td rowspan=&quot;5&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;ㄱ&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;　&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;！&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;＇&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;，&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;．&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;／&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;：&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;；&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;？&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;＾&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;＿&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;｀&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;｜&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;￣&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;、&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;。&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;middot;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;‥&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;hellip;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;uml;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;〃&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;shy;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;―&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;∥&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;＼&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;sim;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;acute;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;～&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ˇ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;˘&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;˝&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;˚&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;˙&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;cedil;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;˛&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;iexcl;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;iquest;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ː&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td colspan=&quot;10&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #08d8c2;&quot; data-v-866385a2=&quot;&quot;&gt;괄호&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;1&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;2&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;3&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;4&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;5&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;6&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;7&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;8&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;9&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td rowspan=&quot;3&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;ㄴ&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;＂&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;（&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;）&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;［&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;］&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;｛&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;｝&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;lsquo;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;rsquo;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;ldquo;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;rdquo;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;〔&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;〕&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;〈&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;〉&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;《&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;》&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;「&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;」&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;『&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;』&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;【&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;】&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td colspan=&quot;10&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #08d8c2;&quot; data-v-866385a2=&quot;&quot;&gt;수학 기호&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;1&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;2&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;3&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;4&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;5&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;6&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;7&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;8&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;9&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td rowspan=&quot;6&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;ㄷ&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;＋&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;－&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;＜&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;＝&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;＞&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;plusmn;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;times;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;divide;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;ne;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;le;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;ge;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;infin;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;there4;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;♂&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;♀&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;ang;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;perp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⌒&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;part;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nabla;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;equiv;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;≒&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;≪&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;≫&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;radic;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;∽&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;prop;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;∵&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;int;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;∬&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;isin;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;ni;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;sube;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;supe;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;sub;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;sup;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;cup;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;cap;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;and;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;or;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;￢&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;rArr;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;hArr;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;forall;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;exist;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;∮&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;sum;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;prod;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-v-866385a2=&quot;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-v-866385a2=&quot;&quot;&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td colspan=&quot;10&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #08d8c2;&quot; data-v-866385a2=&quot;&quot;&gt;단위 기호&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;1&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;2&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;3&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;4&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;5&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;6&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;7&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;8&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;9&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td rowspan=&quot;11&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;ㄹ&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;＄&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;％&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;￦&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ｆ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;prime;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;Prime;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;℃&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Å&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;￠&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;￡&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;￥&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;curren;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;℉&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;permil;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;euro;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎕&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎖&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎗&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ℓ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎘&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㏄&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎣&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎤&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎥&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎦&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎙&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎚&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎛&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎜&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎝&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎞&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎟&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎠&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎡&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎢&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㏊&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎍&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎎&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎏&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㏏&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎈&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎉&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㏈&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎧&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎨&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎰&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎱&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎲&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎳&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎴&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎵&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎶&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎷&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎸&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎹&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎀&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎁&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎂&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎃&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎄&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎺&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎻&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎼&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎽&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎾&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎿&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎐&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎑&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎒&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎓&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎔&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ω&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㏀&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㏁&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎊&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎋&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎌&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㏖&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㏅&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎭&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎮&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎯&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㏛&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎩&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎪&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎫&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㎬&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㏝&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㏐&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㏓&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㏃&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㏉&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㏜&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㏆&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td colspan=&quot;10&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #08d8c2;&quot; data-v-866385a2=&quot;&quot;&gt;도형 문자&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;1&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;2&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;3&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;4&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;5&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;6&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;7&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;8&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;9&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td rowspan=&quot;9&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;ㅁ&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;＃&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;＆&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;＊&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;＠&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;sect;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;※&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;☆&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;★&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;○&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;●&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;◎&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;◇&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;◆&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;□&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;■&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;△&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;▲&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;▽&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;▼&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;rarr;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;larr;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;uarr;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;darr;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;harr;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;〓&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;◁&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;◀&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;▷&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;▶&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;♤&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;spades;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;♡&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;hearts;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;♧&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;clubs;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⊙&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;◈&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;▣&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;◐&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;◑&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;▒&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;▤&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;▥&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;▨&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;▧&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;▦&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;▩&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;♨&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;☏&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;☎&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;☜&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;☞&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;para;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;dagger;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;Dagger;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;↕&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;↗&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;↙&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;↖&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;↘&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;♭&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;♩&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;♪&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;♬&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㉿&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㈜&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;№&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㏇&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;trade;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㏂&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㏘&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;℡&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;reg;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;ordf;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;ordm;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㉾&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td colspan=&quot;10&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #08d8c2;&quot; data-v-866385a2=&quot;&quot;&gt;괘선 문자&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;1&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;2&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;3&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;4&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;5&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;6&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;7&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;8&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;9&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td rowspan=&quot;8&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;ㅂ&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;─&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;│&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┌&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┐&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┘&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;└&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;├&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┬&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┤&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┴&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┼&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;━&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┃&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┏&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┓&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┛&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┗&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┣&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┳&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┫&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┻&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;╋&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┠&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┯&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┨&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┷&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┿&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┝&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┰&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┥&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┸&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;╂&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┒&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┑&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┚&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┙&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┖&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┕&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┎&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┍&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┞&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┟&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┡&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┢&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┦&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┧&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┩&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┪&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┭&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┮&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┱&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┲&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┵&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┶&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┹&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┺&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┽&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;┾&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;╀&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;╁&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;╃&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;╄&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;╅&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;╆&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;╇&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;╈&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;╉&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;╊&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td colspan=&quot;10&quot; data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-v-866385a2=&quot;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-v-866385a2=&quot;&quot;&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td colspan=&quot;10&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #08d8c2;&quot; data-v-866385a2=&quot;&quot;&gt;원 문자/괄호 문자(한글)&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;1&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;2&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;3&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;4&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;5&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;6&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;7&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;8&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;9&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td rowspan=&quot;7&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;ㅅ&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㉠&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㉡&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㉢&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㉣&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㉤&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㉥&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㉦&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㉧&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㉨&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㉩&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㉪&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㉫&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㉬&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㉭&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㉮&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㉯&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㉰&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㉱&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㉲&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㉳&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㉴&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㉵&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㉶&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㉷&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㉸&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㉹&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㉺&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㉻&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㈀&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㈁&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㈂&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㈃&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㈄&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㈅&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㈆&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㈇&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㈈&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㈉&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㈊&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㈋&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㈌&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㈍&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㈎&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㈏&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㈐&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㈑&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㈒&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㈓&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㈔&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㈕&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㈖&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㈗&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㈘&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㈙&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㈚&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;㈛&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td colspan=&quot;10&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #08d8c2;&quot; data-v-866385a2=&quot;&quot;&gt;원 문자/괄호 문자(영/숫자)&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;1&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;2&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;3&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;4&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;5&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;6&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;7&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;8&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;9&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td rowspan=&quot;10&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;ㅇ&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⓐ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⓑ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⓒ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⓓ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⓔ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⓕ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⓖ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⓗ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⓘ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⓙ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⓚ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⓛ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⓜ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⓝ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⓞ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⓟ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⓠ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⓡ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⓢ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⓣ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⓤ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⓥ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⓦ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⓧ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⓨ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⓩ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;①&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;②&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;③&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;④&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⑤&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⑥&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⑦&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⑧&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⑨&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⑩&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⑪&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⑫&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⑬&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⑭&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⑮&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⒜&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⒝&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⒞&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⒟&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⒠&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⒡&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⒢&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⒣&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⒤&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⒥&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⒦&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⒧&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⒨&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⒩&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⒪&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⒫&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⒬&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⒭&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⒮&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⒯&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⒰&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⒱&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⒲&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⒳&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⒴&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⒵&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⑴&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⑵&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⑶&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⑷&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⑸&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⑹&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⑺&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⑻&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⑼&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⑽&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⑾&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⑿&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⒀&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⒁&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⒂&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td colspan=&quot;10&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #08d8c2;&quot; data-v-866385a2=&quot;&quot;&gt;전각 숫자(아라비아/로마)&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;1&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;2&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;3&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;4&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;5&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;6&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;7&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;8&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;9&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td rowspan=&quot;4&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;ㅈ&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;０&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;１&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;２&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;３&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;４&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;５&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;６&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;７&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;８&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;９&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⅰ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⅱ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⅲ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⅳ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⅴ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⅵ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⅶ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⅷ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⅸ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⅹ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ⅰ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ⅱ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ⅲ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ⅳ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ⅴ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ⅵ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ⅶ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ⅷ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ⅸ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ⅹ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-v-866385a2=&quot;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-v-866385a2=&quot;&quot;&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td colspan=&quot;10&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #08d8c2;&quot; data-v-866385a2=&quot;&quot;&gt;분수/첨자&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;1&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;2&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;3&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;4&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;5&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;6&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;7&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;8&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;9&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td rowspan=&quot;2&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;ㅊ&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;frac12;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⅓&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⅔&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;frac14;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;frac34;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⅛&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⅜&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⅝&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⅞&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;sup1;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;sup2;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;sup3;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;⁴&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ⁿ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;₁&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;₂&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;₃&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;₄&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td colspan=&quot;10&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #08d8c2;&quot; data-v-866385a2=&quot;&quot;&gt;현대 한글 낱자&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;1&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;2&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;3&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;4&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;5&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;6&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;7&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;8&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;9&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td rowspan=&quot;6&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;ㅋ&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㄱ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㄲ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㄳ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㄴ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㄵ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㄶ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㄷ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㄸ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㄹ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㄺ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㄻ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㄼ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㄽ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㄾ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㄿ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅀ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅁ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅂ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅃ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅄ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅅ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅆ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅇ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅈ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅉ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅊ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅋ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅌ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅍ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅎ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅏ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅐ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅑ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅒ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅓ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅔ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅕ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅖ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅗ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅘ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅙ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅚ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅛ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅜ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅝ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅞ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅟ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅠ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅡ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅢ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅣ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td colspan=&quot;10&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #08d8c2;&quot; data-v-866385a2=&quot;&quot;&gt;옛한글 낱자&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;1&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;2&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;3&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;4&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;5&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;6&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;7&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;8&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;9&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td rowspan=&quot;5&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;ㅌ&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅥ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅦ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅧ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅨ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅩ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅪ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅫ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅬ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅭ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅮ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅯ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅰ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅱ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅲ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅳ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅴ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅵ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅶ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅷ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅸ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅹ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅺ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅻ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅼ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅽ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅾ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㅿ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㆀ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㆁ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㆂ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㆃ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㆄ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㆅ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㆆ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㆇ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㆈ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㆉ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㆊ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㆋ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㆌ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㆍ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ㆎ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td colspan=&quot;10&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #08d8c2;&quot; data-v-866385a2=&quot;&quot;&gt;전각 로마자&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;1&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;2&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;3&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;4&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;5&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;6&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;7&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;8&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;9&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td rowspan=&quot;6&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;ㅍ&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ａ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ｂ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ｃ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ｄ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ｅ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ｆ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ｇ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ｈ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ｉ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ｊ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ｋ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ｌ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ｍ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ｎ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ｏ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ｐ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ｑ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ｒ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ｓ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ｔ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ｕ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ｖ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ｗ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ｘ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ｙ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ｚ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ａ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ｂ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ｃ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ｄ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ｅ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ｆ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ｇ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ｈ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ｉ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ｊ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ｋ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ｌ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ｍ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ｎ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ｏ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ｐ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ｑ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ｒ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ｓ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ｔ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ｕ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ｖ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ｗ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ｘ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ｙ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ｚ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td colspan=&quot;10&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://namu.wiki/w/%EA%B7%B8%EB%A6%AC%EC%8A%A4%20%EB%AC%B8%EC%9E%90&quot; data-v-866385a2=&quot;&quot;&gt;&lt;span style=&quot;color: #08d8c2;&quot; data-v-866385a2=&quot;&quot;&gt;그리스 문자&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;1&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;2&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;3&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;4&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;5&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;6&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;7&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;8&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;9&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td rowspan=&quot;6&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;ㅎ&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;Alpha;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;Beta;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;Gamma;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;Delta;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;Epsilon;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;Zeta;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;Eta;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;Theta;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;Iota;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;Kappa;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;Lambda;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;Mu;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;Nu;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;Xi;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;Omicron;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;Pi;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;Rho;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;Sigma;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;Tau;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;Upsilon;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;Phi;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;Chi;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;Psi;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;Omega;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;alpha;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;beta;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;gamma;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;delta;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;epsilon;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;zeta;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;eta;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;theta;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;iota;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;kappa;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;lambda;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;mu;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nu;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;xi;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;omicron;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;pi;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;rho;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;sigma;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;tau;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;upsilon;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;phi;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;chi;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;psi;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;omega;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-v-866385a2=&quot;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-v-866385a2=&quot;&quot;&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td colspan=&quot;10&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://namu.wiki/w/%EB%9D%BC%ED%8B%B4%20%EB%AC%B8%EC%9E%90&quot; data-v-866385a2=&quot;&quot;&gt;&lt;span style=&quot;color: #08d8c2;&quot; data-v-866385a2=&quot;&quot;&gt;확장 라틴 문자&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;1&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;2&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;3&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;4&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;5&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;6&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;7&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;8&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;9&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td rowspan=&quot;3&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;ㄲ&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;AElig;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;ETH;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ħ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ĳ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ŀ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ł&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;Oslash;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;OElig;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;THORN;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ŧ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ŋ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;aelig;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;đ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;eth;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ħ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ı&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ĳ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ĸ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ŀ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ł&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;oslash;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;oelig;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;szlig;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;thorn;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ŧ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ŋ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ŉ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td colspan=&quot;10&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://namu.wiki/w/%ED%9E%88%EB%9D%BC%EA%B0%80%EB%82%98&quot; data-v-866385a2=&quot;&quot;&gt;&lt;span style=&quot;color: #08d8c2;&quot; data-v-866385a2=&quot;&quot;&gt;히라가나&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;1&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;2&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;3&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;4&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;5&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;6&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;7&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;8&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;9&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td rowspan=&quot;10&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;ㄸ&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ぁ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;あ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ぃ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;い&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ぅ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;う&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ぇ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;え&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ぉ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;お&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;か&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;が&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;き&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ぎ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;く&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ぐ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;け&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;げ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;こ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ご&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;さ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ざ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;し&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;じ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;す&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ず&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;せ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ぜ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;そ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ぞ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;た&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;だ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ち&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ぢ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;っ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;つ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;づ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;て&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;で&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;と&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ど&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;な&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;に&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ぬ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ね&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;の&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;は&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ば&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ぱ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ひ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;び&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ぴ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ふ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ぶ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ぷ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;へ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;べ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ぺ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ほ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ぼ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ぽ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ま&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;み&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;む&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;め&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;も&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ゃ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;や&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ゅ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ゆ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ょ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;よ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ら&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;り&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;る&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;れ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ろ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ゎ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;わ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ゐ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ゑ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;を&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ん&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td colspan=&quot;10&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://namu.wiki/w/%EA%B0%80%ED%83%80%EC%B9%B4%EB%82%98&quot; data-v-866385a2=&quot;&quot;&gt;&lt;span style=&quot;color: #08d8c2;&quot; data-v-866385a2=&quot;&quot;&gt;가타카나&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;1&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;2&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;3&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;4&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;5&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;6&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;7&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;8&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;9&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td rowspan=&quot;10&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;ㅃ&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ァ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ア&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ィ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;イ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ゥ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ウ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ェ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;エ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ォ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;オ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;カ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ガ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;キ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ギ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ク&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;グ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ケ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ゲ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;コ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ゴ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;サ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ザ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;シ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ジ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ス&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ズ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;セ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ゼ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ソ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ゾ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;タ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ダ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;チ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ヂ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ッ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ツ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ヅ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;テ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;デ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ト&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ド&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ナ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ニ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ヌ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ネ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ノ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ハ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;バ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;パ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ヒ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ビ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ピ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;フ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ブ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;プ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ヘ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ベ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ペ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ホ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ボ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ポ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;マ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ミ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ム&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;メ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;モ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ャ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ヤ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ュ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ユ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ョ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ヨ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ラ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;リ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ル&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;レ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ロ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ヮ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ワ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ヰ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ヱ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ヲ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ン&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ヴ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ヵ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ヶ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td colspan=&quot;10&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://namu.wiki/w/%ED%82%A4%EB%A6%B4%20%EB%AC%B8%EC%9E%90&quot; data-v-866385a2=&quot;&quot;&gt;&lt;span style=&quot;color: #08d8c2;&quot; data-v-866385a2=&quot;&quot;&gt;키릴 문자&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;1&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;2&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;3&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;4&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;5&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;6&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;7&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;8&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #dbe6b0;&quot; data-v-866385a2=&quot;&quot;&gt;9&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td rowspan=&quot;8&quot; data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&lt;b&gt;ㅆ&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;А&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Б&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;В&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Г&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Д&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Е&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ё&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ж&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;З&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;И&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Й&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;К&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Л&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;М&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Н&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;О&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;П&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Р&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;С&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Т&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;У&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ф&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Х&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ц&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ч&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ш&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Щ&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ъ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ы&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ь&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Э&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Ю&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;Я&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;а&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;б&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;в&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;г&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;д&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;е&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ё&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ж&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;з&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;и&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;й&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;к&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;л&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;м&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;н&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;о&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;п&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;р&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;с&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;т&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;у&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ф&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;х&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ц&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ч&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ш&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;щ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ъ&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ы&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ь&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-v-866385a2=&quot;&quot;&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;э&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;ю&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;я&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td data-v-866385a2=&quot;&quot;&gt;
&lt;div data-v-866385a2=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>가벼운 정보</category>
      <category>ㄱ특수문자</category>
      <category>ㄴ특수문자</category>
      <category>특수문자</category>
      <category>한글특수문자</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/104</guid>
      <comments>https://softwaree.tistory.com/104#entry104comment</comments>
      <pubDate>Fri, 14 Oct 2022 22:53:44 +0900</pubDate>
    </item>
    <item>
      <title>예쁜 특수문자 이모티콘 (바로 복붙 가능)</title>
      <link>https://softwaree.tistory.com/103</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;하트 특수문자 이모티콘&quot;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;( ღ'ᴗ'ღ )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;◟( ˘ &amp;sup3;˘)◞ ♡&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(&amp;bull;ө&amp;bull;)♡&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(ฅ&amp;bull;&amp;omega;&amp;bull;ฅ)♡&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;( ்́ꇴ ்̀)♡&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;ღ'ᴗ'ღ&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;๑❤‿❤๑&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(๑˃̵ᴗ˂̵)و ♡&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;꒰◍ˊ◡ˋ꒱੭ु⁾⁾♡&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(*ฅ́˘ฅ̀*)♡&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;( ˇ͈ᵕˇ͈ ) &amp;uml;̮♡⃛&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(*ˊૢᵕˋૢ*)ෆ&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;( ˃̆ૢ௰˂̆ૢഃ ) ლ&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;٩(๑&amp;bull; ₃ -๑)۶&amp;hearts;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(๑˃̵ᴗ˂̵)و ♡&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;ʕ&amp;bull;ﻌ&amp;bull;ʔ ♡&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;ღ˘‿˘ற꒱&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;ෆ╹ .̮ ╹ෆ&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;ლ|'ー'ლ|&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;ლ( ╹ ◡ ╹ ლ)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;₍₍ ( ๑॔˃̶◡˂̶๑॓)◞♡⁰&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(✿◖◡◗)❤&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;웃는 표정 이모티콘&quot;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;( ⁼̴̤̆◡̶͂⁼̴̤̆ )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(❁&amp;acute;▽`❁)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(❀╹◡╹)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(๑･̑◡･̑๑)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;❛◡ુ❛&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;'◡'✿&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;✦‿✦&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;๑･̑◡･̑๑&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;๑❛◡ુ❛๑&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;꒰( ˵&amp;macr;͒ꇴ&amp;macr;͒˵ )꒱&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;◕‿◕✿&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;๑&amp;bull;‿&amp;bull;๑&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;๑◕‿‿◕๑&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;✪‿✪&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;✿˘◡˘✿&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;ღ˘‿˘ற꒱&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(▰˘◡˘▰)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;˘◡˘&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;✿˘◡˘✿&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(๑&amp;prime;ᴗ‵๑)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(&amp;lowast;❛⌄❛&amp;lowast;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(๑&amp;acute;◡ુ`๑)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;p(&amp;acute;&amp;nabla;｀)q&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;๑&amp;bull;‿&amp;bull;๑&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(*&amp;acute; ワ `*)&amp;ldquo;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;xi;(✿ ❛‿❛)&amp;xi;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(๑・‿・๑)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;신나는 표정 이모티콘&quot;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;♪(&amp;acute;&amp;epsilon;｀*)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;♪(*&amp;acute;&amp;theta;｀)ノ&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;deg;˖✧◝(⁰▿⁰)◜✧˖&amp;deg;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;٩(ˊᗜˋ*)و&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;҉ ٩(๑&amp;gt;&amp;omega;&amp;lt;๑)۶҉&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;o(*'▽'*)/☆ﾟ&amp;rsquo;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;٩(๑&amp;gt;&amp;forall;&amp;lt;๑)۶&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;( ๑˃̶ ꇴ ˂̶)♪⁺&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;✧*.◟(ˊᗨˋ)◞.*✧&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;⁽⁽◝( ˙ ꒳ ˙ )◜⁾⁾&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;( ˃⍨˂̥̥ )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;✺◟(&amp;lowast;❛ัᴗ❛ั&amp;lowast;)◞✺&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(๑˃̵ᴗ˂̵)و&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;ᕕ( ᐛ )ᕗ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;귀여운 특수문자 이모티콘&quot;&lt;/b&gt;(๑˃̵ᴗ˂̵)و&lt;br /&gt;&lt;br /&gt;(╹౪╹*๑)&lt;br /&gt;&lt;br /&gt;(˃̶᷄‧̫ ˂̶᷅๑ )&lt;br /&gt;&lt;br /&gt;(✪ິັ໌໋໊ ꆚ ✪ິັ໌໋໊)&lt;br /&gt;&lt;br /&gt;⁽⁽ૢ(⁎❝ົཽ&amp;omega;❝ົཽ⁎)✧&lt;br /&gt;&lt;br /&gt;₍₍ ◝(・&amp;omega;・)◟ ⁾⁾&lt;br /&gt;&lt;br /&gt;❛˓◞˂̵✧&lt;br /&gt;&lt;br /&gt;( &amp;deg;ټ&amp;deg;)&lt;br /&gt;&lt;br /&gt;(๑･̑◡･̑๑)&lt;br /&gt;&lt;br /&gt;⁰▿⁰&lt;br /&gt;&lt;br /&gt;(๑&amp;prime;ᴗ‵๑)&lt;br /&gt;&lt;br /&gt;*❀्꒰⋆ᶿ̴͈᷇⌣ᶿ̴͈᷆⋆꒱ఇ&lt;br /&gt;&lt;br /&gt;(๑╹&amp;forall;╹๑)&lt;br /&gt;&lt;br /&gt;❛&amp;epsilon; ❛♪&lt;br /&gt;p`&amp;gt;&amp;omega;&amp;lt;&amp;acute;q)&lt;br /&gt;&lt;br /&gt;(づ￣ &amp;sup3;￣)づ&lt;br /&gt;&lt;br /&gt;(*ૂ❛ัᴗ❛ั*ૂ)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;화이팅 이모티콘&quot;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;ᕙ(&amp;bull;̀‸&amp;bull;́‶)ᕗ&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;٩( '&amp;omega;' )و&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(ง &amp;bull;̀_&amp;bull;́)ง&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(๑و&amp;bull;̀&amp;Delta;&amp;bull;́)و&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;٩(๑&amp;bull;̀o&amp;bull;́๑)و&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(๑ &amp;bull;̀&amp;omega;&amp;bull;́)۶&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;٩(`･&amp;omega;･&amp;acute;)و ҉*&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;\(`&amp;bull;&amp;omega;&amp;bull;&amp;acute;)/*҉&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;٩( '&amp;omega;' )و ٩( '&amp;omega;' )و&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;✧ ☆ ٩(`･&amp;omega;･&amp;acute;)و&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;시무룩한 삐진 표정 이모티콘&quot;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;Sigma;(￣□￣;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;へ(￣&amp;nabla;￣へ)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;( ｰ̀&amp;epsilon;ｰ́ )✧*⁎&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;꒰⑅ᵕ̆‧̯ᵕ̆⑅꒱&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(￣(ｴ)￣)ﾉ&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(*￣(ｴ)￣*)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;( &amp;bull;́ ̯&amp;bull;̀ )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;ಡ&amp;nbsp;̯ ಡ&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;ｰ̀&amp;epsilon;ｰ́&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;๑Ő&amp;epsilon;Ő๑&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;￣□￣&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(&amp;acute;･ʖ̫･`)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;๑&amp;deg;⌓&amp;deg;๑&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(ㅇ︿ㅇ)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;( &amp;bull;᷄⌓&amp;bull;᷅ )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(｡&amp;bull;́︿&amp;bull;̀｡)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;๑&amp;deg;⌓&amp;deg;๑&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(ﾟヘﾟ)？&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(๑ӦㅅӦ๑)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(&amp;bull;&amp;epsilon;&amp;bull;；)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;슬픈 표정 이모티콘&quot;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;⁺◟( ᵒ̴̶̷̥́ &amp;middot;̫ ᵒ̴̶̷̣̥̀ )&lt;br /&gt;&lt;br /&gt;o̴̶̷᷄﹏o̴̶̷̥᷅&lt;br /&gt;&lt;br /&gt;(｡&amp;bull;́︿&amp;bull;̀｡)&lt;br /&gt;&lt;br /&gt;ಡ︷ಡ)&lt;br /&gt;&lt;br /&gt;(｡･ˇ_ˇ･｡)&lt;br /&gt;&lt;br /&gt;( Ĭ ^ Ĭ )&lt;br /&gt;&lt;br /&gt;(&amp;acute;&amp;deg;̥̥̥̥̥̥̥̥&amp;omega;&amp;deg;̥̥̥̥̥̥̥̥｀)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;놀란 표정 이모티콘&quot;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(ఠ ̥̆ ఠ)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(๑ŏ╻ŏ๑)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(๑&amp;deg;ㅁ&amp;deg;๑)‼✧&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;ŏ̥̥̥̥םŏ̥̥̥̥&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(๑⊙ﾛ⊙๑)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(๑&amp;bull;́o&amp;bull;̀๑)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(оﾟдﾟо)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(╬☉д⊙)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(；◔д◔）&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;๑&amp;bull;̀ㅁ&amp;bull;́ฅ✧&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;화난 표정 이모티콘&quot;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;٩(๑`^&amp;acute;๑)۶&lt;br /&gt;&lt;br /&gt;☄ฺ◣д◢)☄ฺ&lt;br /&gt;&lt;br /&gt;(╬◣д◢)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;특수문자 이모티콘 공유&quot;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(͒ ˊ&amp;bull; ૢ&amp;middot;̫&amp;bull;ˋૢ)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(՟ິͫઘ ՟ິͫ)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;( &amp;bull;̀.̫&amp;bull;́)✧&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;❛ัᴗ❛&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(｡♋‸♋｡)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;( ͡&amp;deg; ͜ʖ ͡&amp;deg;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(ɔ ˘⌣˘)˘⌣˘ c)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;₍₍ (ง ˙&amp;omega;˙)ว ⁾⁾&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;( ･ิ&amp;piv;･ิ)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;( ⌯᷄௰⌯᷅ )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;( ⁎ᵕᴗᵕ⁎ )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;( &amp;deg;ټ&amp;deg;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(๑ᵕ⌓ᵕ̤)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(⚭◡⚭ )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;( ˇ͈ᵕˇ͈ )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(｡･&amp;omega;･｡)o&quot;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;˘◡˘&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(&amp;acute;͈ ᵕ `͈ )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;ʅ（&amp;acute;◔౪◔）ʃ&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(◔ิ&amp;omega;◔ิ)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(〃･ิ‿･ิ)ゞ&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(๑ᵕ⌓ᵕ̤)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(･ิ&amp;omega;･ิ)&lt;/span&gt;&lt;/p&gt;</description>
      <category>가벼운 정보</category>
      <category>예쁜이모티콘</category>
      <category>이모티콘</category>
      <category>특수문자</category>
      <category>하트이모티콘</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/103</guid>
      <comments>https://softwaree.tistory.com/103#entry103comment</comments>
      <pubDate>Tue, 30 Aug 2022 00:01:44 +0900</pubDate>
    </item>
    <item>
      <title>Ubuntu 16.04에서 Python 3.7 설치</title>
      <link>https://softwaree.tistory.com/85</link>
      <description>&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;들어가며...&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;django를 사용하려면 Python이 최소 3.7 버전이 설치 되어 있어야 합니다. 하지만 우분투 16.04에서 지원하는 버전은 3.5이기 때문에 추가로 설치를 하여야 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;본인의 PC에 설치되어 있는 버전을 먼저 확인 해보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1580213852688&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;owllife@owllife-ubuntu:~$ python3
Python 3.5.2 (default, Oct  8 2019, 13:06:37) 
[GCC 5.4.0 20160609] on linux
Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.
&amp;gt;&amp;gt;&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;3.5가 설치 되어 있는것을 확인하였습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;3.7 버전을 설치 할 때 한가지 유의 해야 할 점은,&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;우분투 16.04의 많은 시스템 프로그램(터미널, 프로그램 업데이트 등)에서 파이썬 3.5를 사용하고 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;만약, 파이썬3 default 버전을 현재처럼 3.5가 아닌 3.7로 변경하게 되면 시스템 프로그램등이 제대로 동작하지 않을 수 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;시스템 재부팅 후 갑자기 프로그램이 동작되지 않는 상황을 맞이 할 수 있기 때문에 &quot;update-alternatives&quot; 를 이용하여 &lt;u&gt;강제로 변경하지 않도록 유의하여야 합니다.&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;파이썬 3.7 설치&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;아래 명령어를 통하여 설치를 할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1580214194938&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo apt update
$ sudo apt install software-properties-common

$ sudo add-apt-repository ppa:deadsnakes/ppa

$ sudo apt update
$ sudo apt install python3.7&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;python3.7이 설치 되었지만, 파이썬3의 기본 버전으로 변경되지 않았는지 확인을 하기 위하여 터미널에서 확인을 해보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1580214294236&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;owllife@owllife-ubuntu:~$ python3
Python 3.5.2 (default, Oct  8 2019, 13:06:37) 
[GCC 5.4.0 20160609] on linux
Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.
&amp;gt;&amp;gt;&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;파이썬 3.7이 설치 되었지만, 디폴트 버전은 여전히 3.5로 표시되는것을 확인하였습니다.&lt;/b&gt; 즉, 시스템 응용 프로그램들은 이전과 마찬가지로 정상적으로 동작하게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;venv 설치&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;파이썬으로 개발하다보면 별도의 고립된 공통의 환경을 만들어두고 개발하는 경우가 많이 있습니다.&lt;/p&gt;
&lt;p&gt;venv를 많이 사용하는데 이 역시 3.7 버전에 맞추어 설치하도록 하겠습니다. 터미널에서 아래 명령어를 입력합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1580214502963&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo apt-get install python3.7-venv&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;만약, python3.7-venv로 설치하지 않고 python3-venv 명령어로 설치하게 되면, 현재 시스템 디폴트 버전으로 잡혀 있는 python3.5 버전에 맞추어서 설치 되기 때문에 사용 할때 django와 같이 그 이상의 파이썬 버전이 필요한 경우에는 정상적으로 동작하지 않게 됩니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;예를 들어 아래와 같은 에러 메시지를 보게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1580214634675&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ python3.7 -m venv my_common_env

Error: Command '['/home/owllife/PycharmProjects/my_common_env/bin/python3.7', 
       '-Im', 'ensurepip', '--upgrade', '--default-pip']' 
       returned non-zero exit status 1.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;정상적으로 python3.7 및 venv가 설치 되었다면 아래 명령어를 통하여 가상 환경을 생성 할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1580214761215&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ python3.7 -m venv my_common_env&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;venv 활성화&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;이제 activate 명령어를 실행하고 파이썬 3.7이 사용 중인지 확인 해보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷, 2020-01-28 21-34-00.png&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vV8iw/btqBxAFIDpi/EwWhSP1VDgDAtaS0nymED0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vV8iw/btqBxAFIDpi/EwWhSP1VDgDAtaS0nymED0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vV8iw/btqBxAFIDpi/EwWhSP1VDgDAtaS0nymED0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvV8iw%2FbtqBxAFIDpi%2FEwWhSP1VDgDAtaS0nymED0%2Fimg.png&quot; data-filename=&quot;스크린샷, 2020-01-28 21-34-00.png&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;190&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;위 이미지의 명령어대로 방금 생성한 env를 활성화 시키면 명령어 프롬프트 앞쪽에 (my_common_env)와 같이 prefix가 붙게 됩니다. 이후에는 python 명령어만 입력 했을뿐인데 3.7 버전으로 실행 되는것을 확인 할 수 있습니다. django를 사용한다면 이 상태에서 django를 설치하고 기본 프로젝트 등을 생성하여 진행하시면 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;pip 버전 확인&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1580215236073&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(my_common_env) owllife@owllife-ubuntu:~/PycharmProjects$ pip -V
pip 19.2.3 from /home/owllife/PycharmProjects/my_common_env/lib/python3.7/site-packages/pip (python 3.7)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;파이썬의 여러 라이브러리르 설치 하기 위하여 pip를 사용하는데 pip가 파이썬 3.7 버전을 정확히 매핑하고 있는지 확인하였습니다.&lt;/p&gt;</description>
      <category>Python</category>
      <category>django python</category>
      <category>python 3.7 install</category>
      <category>우분투 16.04 파이썬 3.7</category>
      <category>파이썬 3.7 설치</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/85</guid>
      <comments>https://softwaree.tistory.com/85#entry85comment</comments>
      <pubDate>Tue, 28 Jan 2020 21:25:30 +0900</pubDate>
    </item>
    <item>
      <title>우분투 16.04 LTS 설치 후 초기 설정작업</title>
      <link>https://softwaree.tistory.com/84</link>
      <description>&lt;p&gt;개인적으로 설정하는 항목들을 정리하기 위하여 포스팅 하는 글입니다.&lt;/p&gt;
&lt;p&gt;프록시나 고정IP를 사용하는 회사망이 아닌 홈환경입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;ROOT 비밀번호 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1580176670595&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;터미널을 열고
$ sudo passwd&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;apt-get 패키지 다운로드 서버 변경하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1580177084793&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 파일은 /etc/apt/sources.list

# 터미널 열고
$ sudo vi /etc/apt/sources.list

# 우분투 설치시 한국으로 설정하시고 한국어 언어를 설정하였다면 
# http://kr.archive.ubuntu.com/ubuntu/ 가 보일텐데 이를 다음 카카오 서버로 변경.
# 콜론 입력 후 아래 명령어 입력 후 저장.
:%s/kr.archive.ubuntu.com/ftp.daumkakao.com

# 동작 확인
$ sudo apt-get update

# 업그레이드 원하면
$ sudo apt-get upgrade -y&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;완료 된 화면&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷, 2020-01-28 11-05-57.png&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;867&quot; width=&quot;707&quot; height=&quot;713&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bi4S93/btqBuxoQlid/fBdKga2MBFBlmso4K332jk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bi4S93/btqBuxoQlid/fBdKga2MBFBlmso4K332jk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bi4S93/btqBuxoQlid/fBdKga2MBFBlmso4K332jk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbi4S93%2FbtqBuxoQlid%2FfBdKga2MBFBlmso4K332jk%2Fimg.png&quot; data-filename=&quot;스크린샷, 2020-01-28 11-05-57.png&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;867&quot; width=&quot;707&quot; height=&quot;713&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;언어 지원&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;윈도우 키 눌러서 &quot;언어 지원&quot; 입력 후 실행합니다. 필수 언어를 다운로드 진행하고, 키보드 입력기는 fcitx 로 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;우분투 설치시 키보드 설정하는 단계에서 한국어를 선택하지 않고, 영문으로 선택하게 되면 한/영 전환 키보드가 매핑되지 않아서 한영키가 동작하지 않습니다. 한/영키가 동작하지 않고 좌측 쉬프트+스페이스로 동작되기 때문에 별도로 설정해야 하는데 이 부분은 구글링을 통해 해결책을 찾을수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;D2 Coding 글꼴 설치&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://softwaree.tistory.com/22&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://softwaree.tistory.com/22&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;우분투 업데이트 및 그래픽 드라이브 설치&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;AMD나 NVIDIA 홈페이지에서 직접 다운로드 받아서 설치하게 되면 조금 번거롭습니다. 하지만, 소프트웨어 업데이트 도구를 이용하면 매우 쉽게 업데이트 할 수 있습니다. &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&quot;소프트웨어 업데이트 도구&quot; 를 선택 후 설정을 누르면 아래 두번째 창이 보이는데 &quot;추가 드라이버&quot; 탭으로 이동해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷, 2020-01-28 11-15-08.png&quot; data-origin-width=&quot;799&quot; data-origin-height=&quot;764&quot; width=&quot;674&quot; height=&quot;644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bI00pG/btqBui6vWwV/eL3fyyFTiCF9mNnp8wT5lK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bI00pG/btqBui6vWwV/eL3fyyFTiCF9mNnp8wT5lK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bI00pG/btqBui6vWwV/eL3fyyFTiCF9mNnp8wT5lK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbI00pG%2FbtqBui6vWwV%2FeL3fyyFTiCF9mNnp8wT5lK%2Fimg.png&quot; data-filename=&quot;스크린샷, 2020-01-28 11-15-08.png&quot; data-origin-width=&quot;799&quot; data-origin-height=&quot;764&quot; width=&quot;674&quot; height=&quot;644&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;사용가능한 여러 드라이브들이 버전별로 나오는데 그 중에서 본인 그래픽 드라이브와 호환 가능한 안정화 된 버전을 선택 후 적용을 선택하면 됩니다. 적용 후 꼭 재부팅을 하고 다시 위 화면으로 진입해서 정상적으로 적용되었는지 확인을 해 보는것을 권장합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;추가로, 안정화를 위하여 우분투 업데이트를 한번 진행 하는것을 권장한다. (첫번째 팝업의 지금 설치 버튼)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;키보드 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;키보드의 반복키 입력 간격을 줄이기 위하여 설정합니다. 지연 시간을 좀 짧게 설정하면 타이핑할때 딜레이 없이 입력이 가능합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷, 2020-01-28 11-30-20.png&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;491&quot; width=&quot;737&quot; height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qO0nm/btqBua8NWhE/Gd1UMdg5ASNTtlmr3FJfPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qO0nm/btqBua8NWhE/Gd1UMdg5ASNTtlmr3FJfPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qO0nm/btqBua8NWhE/Gd1UMdg5ASNTtlmr3FJfPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqO0nm%2FbtqBua8NWhE%2FGd1UMdg5ASNTtlmr3FJfPK%2Fimg.png&quot; data-filename=&quot;스크린샷, 2020-01-28 11-30-20.png&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;491&quot; width=&quot;737&quot; height=&quot;426&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;마우스 속도 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;마우스 포인트 속도가 너무 빠르거나 느릴 경우에 아래처럼 설정 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;먼저 아래 명령어를 통하여 마우스의 &lt;b&gt;input id&lt;/b&gt;를 알아야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1580211793471&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ xinput --list --short&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷, 2020-01-28 20-44-15.png&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l5ikO/btqBAEtAkHM/A3zdEBCA0Jw47tUKCaLud1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l5ikO/btqBAEtAkHM/A3zdEBCA0Jw47tUKCaLud1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l5ikO/btqBAEtAkHM/A3zdEBCA0Jw47tUKCaLud1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl5ikO%2FbtqBAEtAkHM%2FA3zdEBCA0Jw47tUKCaLud1%2Fimg.png&quot; data-filename=&quot;스크린샷, 2020-01-28 20-44-15.png&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;334&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;저는 MX Master 마우스를 사용하는데 id가 9번인 것을 확인 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;이제 터미널에 아래 명령어를 통하여 마우스 감도를 설정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1580211946007&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ xinput -set-prop 9 'Device Accel Constant Deceleration' 1.5&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;마지막 인자인 1.5가 감도인데, 제 환경에서는 1.5가 가장 적당하여 이렇게 설정하였습니다. &lt;b&gt;숫자가 낮을수록 포인트 속도는 빨라지고, 숫자가 커질수록 포인트 속도는 느려집니다.&lt;/b&gt; 각자의 환경에 맞추어 실험 후 최적의 값을 찾으면 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;xinput 변경값은 시스템이 재부팅되면 다시 리셋이 되어 또 다시 설정을 해 주어야 합니다. 이런 번거로움을 없애기 위해서는 &lt;b&gt;&quot;시작 프로그램&quot;&lt;/b&gt;을 통하여 재부팅 될때마다 자동으로 스크립트를 실행 하도록 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷, 2020-01-28 20-48-33.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;473&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMr1Gp/btqBxAZZUgo/ITzLgkdJJNyvHkM3ONpOj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMr1Gp/btqBxAZZUgo/ITzLgkdJJNyvHkM3ONpOj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMr1Gp/btqBxAZZUgo/ITzLgkdJJNyvHkM3ONpOj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMr1Gp%2FbtqBxAZZUgo%2FITzLgkdJJNyvHkM3ONpOj1%2Fimg.png&quot; data-filename=&quot;스크린샷, 2020-01-28 20-48-33.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;473&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;VIM 설치&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;다른 글에서 작성한 링크로 대신합니다. vim 설치 및 vimrc 설정도 포함하고 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a href=&quot;https://softwaree.tistory.com/20?category=729597&quot;&gt;https://softwaree.tistory.com/20?category=729597&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;터미널 설정&lt;/p&gt;
&lt;p&gt;터미널을 열고 '편집'의 '프로파일 기본 설정'을 선택합니다. 최초 터미널 크기를 좀 더 키우고, 터미널 삑소리는 disable 하였습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷, 2020-01-28 11-58-34.png&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vpUy1/btqByGyULJX/KBTxKaCemieddKHgNJ9k4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vpUy1/btqByGyULJX/KBTxKaCemieddKHgNJ9k4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vpUy1/btqByGyULJX/KBTxKaCemieddKHgNJ9k4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvpUy1%2FbtqByGyULJX%2FKBTxKaCemieddKHgNJ9k4k%2Fimg.png&quot; data-filename=&quot;스크린샷, 2020-01-28 11-58-34.png&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;514&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;'색' 탭으로 이동 후 '투명한 배경 사용' 을 활성화 시키고 적당히 투명 감도를 조절해줍니다. 개인적으로 투명 배경을 매우 선호하기 때문에 꼭 설정하는 부분입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷, 2020-01-28 11-59-12.png&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dF2Z4y/btqBAEmQ9Ax/iI1bQHHGuqJXSNwznPVrB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dF2Z4y/btqBAEmQ9Ax/iI1bQHHGuqJXSNwznPVrB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dF2Z4y/btqBAEmQ9Ax/iI1bQHHGuqJXSNwznPVrB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdF2Z4y%2FbtqBAEmQ9Ax%2FiI1bQHHGuqJXSNwznPVrB0%2Fimg.png&quot; data-filename=&quot;스크린샷, 2020-01-28 11-59-12.png&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;514&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;마지막으로 '스크롤' 탭으로 이동 후 스크롤 막대 표시를 없애고, 제한 범위를 *10배로 상향시켰습니다. 콘솔로 개발 작업을 많이 하다보니 히스토리창을 꽤 이전것까지 참고하는 경우가 많아서 상당히 버퍼를 높여서 사용하는 편입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷, 2020-01-28 12-00-35.png&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0tDLM/btqByGTbxID/J0TXT3fc47eMKlNB07Tk8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0tDLM/btqByGTbxID/J0TXT3fc47eMKlNB07Tk8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0tDLM/btqByGTbxID/J0TXT3fc47eMKlNB07Tk8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0tDLM%2FbtqByGTbxID%2FJ0TXT3fc47eMKlNB07Tk8K%2Fimg.png&quot; data-filename=&quot;스크린샷, 2020-01-28 12-00-35.png&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;514&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Unity Tweak Tool 설치 및 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Ubuntu Gnome Tweak과 마찬가지로 Unity에도 Tweak 툴이 있는데 상세한 부분까지 설정이 가능한 추천 프로그램입니다. 런처를 상하좌우로 이동하는것부터, 테마/아이콘/font 까지 설정하고 virtual desktop의 배치 또한 설정이 가능합니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;설치는 터미널에서 명령어로 가능합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1580212708436&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo apt-get install unity-tweak-tool&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;실행하면 아래 화면처럼 다양한 메뉴가 나타납니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷, 2020-01-28 11-38-32.png&quot; data-origin-width=&quot;664&quot; data-origin-height=&quot;649&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfamdb/btqBziECQhT/H16aj08fsDrEw4WRHUsOp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfamdb/btqBziECQhT/H16aj08fsDrEw4WRHUsOp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfamdb/btqBziECQhT/H16aj08fsDrEw4WRHUsOp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbfamdb%2FbtqBziECQhT%2FH16aj08fsDrEw4WRHUsOp0%2Fimg.png&quot; data-filename=&quot;스크린샷, 2020-01-28 11-38-32.png&quot; data-origin-width=&quot;664&quot; data-origin-height=&quot;649&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;런처 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Launcher 메뉴에서는 런쳐의 위치를 설정하거나 아이콘의 사이즈 등을 변경 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;테마 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Tweak Tool을 사용하는 가장 큰 이유이기도 합니다. 개인적으로 Numix 테마를 선호하기 때문에 설치하는 방법을 설명하겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1580213161472&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 터미널을 열고

$ sudo add-apt-repository ppa:numix/ppa
$ sudo apt-get update
$ sudo apt-get install numix-*&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷, 2020-01-28 21-06-56.png&quot; data-origin-width=&quot;663&quot; data-origin-height=&quot;685&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOgrVq/btqBuwRwCkS/4ZPe51byv6rtbMFtUIgrUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOgrVq/btqBuwRwCkS/4ZPe51byv6rtbMFtUIgrUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOgrVq/btqBuwRwCkS/4ZPe51byv6rtbMFtUIgrUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOgrVq%2FbtqBuwRwCkS%2F4ZPe51byv6rtbMFtUIgrUk%2Fimg.png&quot; data-filename=&quot;스크린샷, 2020-01-28 21-06-56.png&quot; data-origin-width=&quot;663&quot; data-origin-height=&quot;685&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;테마에서 방금 설치 한 Numix를 선택합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷, 2020-01-28 21-07-33.png&quot; data-origin-width=&quot;663&quot; data-origin-height=&quot;685&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dINfwO/btqBBftlZ1k/SS6NNS0Xdw2hSqFs7ZYkik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dINfwO/btqBBftlZ1k/SS6NNS0Xdw2hSqFs7ZYkik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dINfwO/btqBBftlZ1k/SS6NNS0Xdw2hSqFs7ZYkik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdINfwO%2FbtqBBftlZ1k%2FSS6NNS0Xdw2hSqFs7ZYkik%2Fimg.png&quot; data-filename=&quot;스크린샷, 2020-01-28 21-07-33.png&quot; data-origin-width=&quot;663&quot; data-origin-height=&quot;685&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;아이콘은 Numix-circle을 선택합니다. 개인적으로 가장 심플하면서 마음에 드는 스타일입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷, 2020-01-28 11-51-32.png&quot; data-origin-width=&quot;708&quot; data-origin-height=&quot;708&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cInzxq/btqBBeuq9lX/kQlGqhjVYDKrJK6kWXo7fK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cInzxq/btqBBeuq9lX/kQlGqhjVYDKrJK6kWXo7fK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cInzxq/btqBBeuq9lX/kQlGqhjVYDKrJK6kWXo7fK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcInzxq%2FbtqBBeuq9lX%2FkQlGqhjVYDKrJK6kWXo7fK%2Fimg.png&quot; data-filename=&quot;스크린샷, 2020-01-28 11-51-32.png&quot; data-origin-width=&quot;708&quot; data-origin-height=&quot;708&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;폰트는 위와같이 설정하였습니다. Ubuntu 16.04 에서는 기본적으로 Noto Sans 폰트를 포함하고 있기 때문에 해당 폰트를 기본으로 설정하였고, monospace 또한 Noto Sans Mono로 변경하였습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;배경화면&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;개인적으로 심플한 배경화면을 좋아해서 아래 웹페이지에서 주로 다운로드를 합니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://wallpaperplay.com/board/4k-minimalist-wallpapers&quot;&gt;https://wallpaperplay.com/board/4k-minimalist-wallpapers&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;참고로, 만약 Tweak Tool을 이용해서 테마를 사용하고 있다면, 로그인 화면에 보이는 배경화면은 현재 설정한 배경 화면이 그대로 보이게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;GIT 설치&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1580218173728&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo apt-get install git&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;이미지 뷰어 설치&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;개인적으로 PhotoQT Image Viewer을 선호합니다. UI가 매우 직관적이고 속도도 빨라서 다른 프로그램을 설치하더라도 결국엔 PhotoQT만 사용하게 되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1580216196175&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo apt-add-repository ppa:lumas/photoqt
$ sudo apt update &amp;amp;&amp;amp; sudo apt install photoqt&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷, 2020-01-28 21-57-11.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1004&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWsMSP/btqBvuy0Bz3/NzSXMsqOCrYvwig6p8Tswk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWsMSP/btqBvuy0Bz3/NzSXMsqOCrYvwig6p8Tswk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWsMSP/btqBvuy0Bz3/NzSXMsqOCrYvwig6p8Tswk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWsMSP%2FbtqBvuy0Bz3%2FNzSXMsqOCrYvwig6p8Tswk%2Fimg.png&quot; data-filename=&quot;스크린샷, 2020-01-28 21-57-11.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1004&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷, 2020-01-28 21-58-34.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1004&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biFLwF/btqBAFlLXkT/I5lk96QYPKN74UUFykbJv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biFLwF/btqBAFlLXkT/I5lk96QYPKN74UUFykbJv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biFLwF/btqBAFlLXkT/I5lk96QYPKN74UUFykbJv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiFLwF%2FbtqBAFlLXkT%2FI5lk96QYPKN74UUFykbJv1%2Fimg.png&quot; data-filename=&quot;스크린샷, 2020-01-28 21-58-34.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1004&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Ctrl+O 입력을 통해 Folder 선택을 할 수 있고 선택을 하면 두번째 스크린샷 처럼 하단에 폴더 이미지가 모두 보여집니다. 기타 상세한 정보나 view 스타일 또한 메인 화면에서 설정 할 수 있습니다.&lt;/p&gt;</description>
      <category>Ubuntu</category>
      <category>ubuntu 16.04 LTS 설정</category>
      <category>Unity Tweak Tool</category>
      <category>우분투 16.04 설정</category>
      <category>우분투 설정</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/84</guid>
      <comments>https://softwaree.tistory.com/84#entry84comment</comments>
      <pubDate>Tue, 28 Jan 2020 11:18:53 +0900</pubDate>
    </item>
    <item>
      <title>우분투 18.04 자바 설치</title>
      <link>https://softwaree.tistory.com/82</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;버전 확인&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1574769934912&quot; class=&quot;kotlin&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; cursor: default; z-index: 1;&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ java -version
openjdk version &quot;1.8.0_222&quot;
OpenJDK Runtime Environment (build 1.8.0_222-8u222-b10-1ubuntu1~18.04.1-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;자바가 설치되지 않았다면 1.8을 설치&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- Oracle :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://www.oracle.com/java/technologies/jdk8-downloads.html&quot;&gt;https://www.oracle.com/java/technologies/jdk8-downloads.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;- Bell-sw :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://bell-sw.com/pages/java-8u222/&quot;&gt;https://bell-sw.com/pages/java-8u222/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;* Oracle은 로그인해야 하는 번거로움이 있음.&lt;/p&gt;
&lt;p&gt;* Bell-sw에서 빠르게 다운로드 받을수 있으니 참고.&lt;/p&gt;
&lt;pre id=&quot;code_1574769934917&quot; class=&quot;html xml&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; cursor: default; z-index: 1;&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;빌드 할 때 아래와 같은 에러 발생시에는 제대로 된 JDK 가 설치되어 있지 않았으므로 위의 링크를 통해 다시 설치 필요.

* What went wrong: Execution failed for task ':app:compileDebugJavaWithJavac'. 
  &amp;gt; Could not find tools.jar. Please check that /usr/lib/jvm/java-8-openjdk-amd64 contains a valid JDK installation.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;* 여러개의 자바 버전이 설치되어 있는 경우에 선택해서 타겟팅 해야 함.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1574769934919&quot; class=&quot;html xml&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; cursor: default; z-index: 1;&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ update-alternatives --config java

대체 항목 java에 대해 (/usr/bin/java 제공) 2개 선택이 있습니다.

  선택       경로                                                 우선순위   상태
----------------------------------------------------------------------------------
* 0            /usr/lib/jvm/bellsoft-java8-amd64/jre/bin/java   2080222   자동 모드
  1            /usr/lib/jvm/bellsoft-java8-amd64/jre/bin/java   2080222   수동 모드
  2            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      수동 모드

Press &amp;lt;enter&amp;gt; to keep the current choice[*], or type selection number: 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Ubuntu</category>
      <category>우분투 자바 1.8 설치</category>
      <category>우분투 자바 설치</category>
      <category>자바 설치</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/82</guid>
      <comments>https://softwaree.tistory.com/82#entry82comment</comments>
      <pubDate>Tue, 26 Nov 2019 21:08:12 +0900</pubDate>
    </item>
    <item>
      <title>우분투 18.04 테마 변경하기</title>
      <link>https://softwaree.tistory.com/81</link>
      <description>&lt;p&gt;개인) 아래&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;링크 참고해서 셋팅.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1573996474226&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Linux] Ubuntu 18.04 테마 설정하기&quot; data-og-description=&quot;안녕하세요~ 이번 포스팅에서는 우분투 환경에서 테마를 적용하는 방법에 대해 알아보도록 하겠습니다! 우분투의 기본 테마는 아래와 같습니다. (이미지 출처: 구글) 이전의 16.xx 버전보다는 많이 깔끔해졌는데..&quot; data-og-host=&quot;codevkr.tistory.com&quot; data-og-source-url=&quot;https://codevkr.tistory.com/89&quot; data-og-url=&quot;https://codevkr.tistory.com/89&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dClLPD/hyDLumWqc9/i1CnReJAeTab8CNTuvNglK/img.jpg?width=800&amp;amp;height=449&amp;amp;face=0_0_800_449,https://scrap.kakaocdn.net/dn/Z6UAL/hyDJmjNv9n/HcE4dbxGbNUZVjEiKVqnXK/img.jpg?width=800&amp;amp;height=449&amp;amp;face=0_0_800_449,https://scrap.kakaocdn.net/dn/ezQbF6/hyDLA8w9W2/y4hU41zt5577P08a3ByVWK/img.jpg?width=820&amp;amp;height=461&amp;amp;face=0_0_820_461&quot;&gt;&lt;a href=&quot;https://codevkr.tistory.com/89&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://codevkr.tistory.com/89&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dClLPD/hyDLumWqc9/i1CnReJAeTab8CNTuvNglK/img.jpg?width=800&amp;amp;height=449&amp;amp;face=0_0_800_449,https://scrap.kakaocdn.net/dn/Z6UAL/hyDJmjNv9n/HcE4dbxGbNUZVjEiKVqnXK/img.jpg?width=800&amp;amp;height=449&amp;amp;face=0_0_800_449,https://scrap.kakaocdn.net/dn/ezQbF6/hyDLA8w9W2/y4hU41zt5577P08a3ByVWK/img.jpg?width=820&amp;amp;height=461&amp;amp;face=0_0_820_461');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;[Linux] Ubuntu 18.04 테마 설정하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;안녕하세요~ 이번 포스팅에서는 우분투 환경에서 테마를 적용하는 방법에 대해 알아보도록 하겠습니다! 우분투의 기본 테마는 아래와 같습니다. (이미지 출처: 구글) 이전의 16.xx 버전보다는 많이 깔끔해졌는데..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;codevkr.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Ubuntu</category>
      <category>18.04 테마 변경</category>
      <category>우분투</category>
      <category>우분투 테마 변경</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/81</guid>
      <comments>https://softwaree.tistory.com/81#entry81comment</comments>
      <pubDate>Sun, 17 Nov 2019 22:17:26 +0900</pubDate>
    </item>
    <item>
      <title>특수문자 유니코드표 - 이모지, 이모티콘, 지도기호</title>
      <link>https://softwaree.tistory.com/80</link>
      <description>&lt;h3&gt;&lt;b&gt;이모지&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr style=&quot;box-sizing: content-box; height: 0px; margin-top: 20px; margin-bottom: 20px; border-width: 1px 0px 0px; border-image: initial; color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-decoration-style: initial; text-decoration-color: initial; border-color: #eeeeee initial initial initial; border-style: solid initial initial initial;&quot; /&gt;
&lt;h3&gt;&lt;b&gt;이모티콘&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr style=&quot;box-sizing: content-box; height: 0px; margin-top: 20px; margin-bottom: 20px; border-width: 1px 0px 0px; border-image: initial; color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-decoration-style: initial; text-decoration-color: initial; border-color: #eeeeee initial initial initial; border-style: solid initial initial initial;&quot; /&gt;
&lt;h3&gt;&lt;b&gt;지도 기호&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>가벼운 정보</category>
      <category>유니코드</category>
      <category>이모지</category>
      <category>이모티콘</category>
      <category>지도기호</category>
      <category>특수기호</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/80</guid>
      <comments>https://softwaree.tistory.com/80#entry80comment</comments>
      <pubDate>Sun, 17 Nov 2019 21:50:33 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 Django DB 초기화</title>
      <link>https://softwaree.tistory.com/79</link>
      <description>&lt;p&gt;&amp;nbsp; Django로 개발을 하다보면 DB 초기화를 종종 해야 할 경우가 있습니다.&lt;/p&gt;
&lt;p&gt;migration 하다가 DB가 꼬이는 경우 에러가 빈번하게 발생될 수 있기 때문에 어떻게 초기화 하는지에 대하여 한번 알아보겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;migrations 파일 삭제&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1573991756163&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ find . -path &quot;*/migrations/*.py&quot; -not -name &quot;__init__.py&quot; -delete
$ find . -path &quot;*/migrations/*.pyc&quot;  -delete&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 프로젝트의 root 위치에서 위와 같이 세 줄이면 DB 초기화가 완료되고 작성한 model의 스키마까지 적용이 완료됩니다. DB 관련 앱의 하위 폴더를 보면 migrations 폴더가 있을텐데 그 폴더에 존재하는 __init__.py 파일을 제외하고 폴더 내의 모든 파일을 삭제 합니다. 또한 파이썬 바이트코드인 pyc 파일들도 모두 제거합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;db.sqlite3&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;프로젝트의 root 디렉토리에 위치한 &lt;span style=&quot;color: #006dd7;&quot;&gt;db.sqlite3 파일을 삭제&lt;/span&gt;합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;migration&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1573992128858&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ python manage.py migrate&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;django 로 DB 생성할때 최초에 한번 migration 하는것처럼 위와 같은 명령어로 동일하게 수행합니다.&lt;/p&gt;</description>
      <category>Python</category>
      <category>django</category>
      <category>django db 초기화</category>
      <category>파이썬</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/79</guid>
      <comments>https://softwaree.tistory.com/79#entry79comment</comments>
      <pubDate>Sun, 17 Nov 2019 21:04:24 +0900</pubDate>
    </item>
    <item>
      <title>Trouble shooting - Python3: UnicodeEncodeError: 'ascii' codec can't encode character</title>
      <link>https://softwaree.tistory.com/76</link>
      <description>&lt;p&gt;print() 메서드를 이용하여 문자열을 출력할때 이러한 에러를 가끔씩 만날수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1573743086822&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;UnicodeEncodeError: 'ascii' codec can't encode character u'\xa1' 
in position 0: ordinal not in range(128)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;해결책으로, 아래처럼 encoding 타입을 utf-8로 설정하면 수정이 가능합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1573743025610&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ export PYTHONIOENCODING=utf-8&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python</category>
      <category>Python</category>
      <category>Python3 UnicodeEncodeError</category>
      <category>UnicodeEncodeError</category>
      <category>파이썬 ascii 인코딩</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/76</guid>
      <comments>https://softwaree.tistory.com/76#entry76comment</comments>
      <pubDate>Thu, 14 Nov 2019 23:54:12 +0900</pubDate>
    </item>
    <item>
      <title>파이썬으로 웹페이지 크롤링을 해보자. (2) 텔레그램으로 메시지 보내기</title>
      <link>https://softwaree.tistory.com/75</link>
      <description>&lt;p&gt;&amp;nbsp; 이번 시간에는 앞서 구현한 크롤링 모듈을 일정 시간마다 시스템에서 자동으로 실행 하도록 실습 해보겠습니다. 그리고 새로운 글을 찾았을때 텔레그램과 연동해서 메시지를 전달 하는 기능을 구현해보도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;크롤링 실행 주기 설정&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp; 주기적으로 어떤 프로그램이나 스크립트를 실행 할 때에는 &lt;b&gt;crontab&lt;/b&gt; 을 많이 사용합니다. 본 포스팅에서도 이 서비스를 이용하여 주기적으로 앞에서 만든 크롤링 모듈을 실행 해보도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;주기적으로 실행 되었다는것을 나타내기 위하여 clien_crawler.py 파일의 main 메서드에 현재의 시간을 기록하는 코드를 추가하겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1573477308753&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from datetime import datetime

if __name__ == '__main__':
    print('start - ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
    crawled_data = fetch_clien_latest_data()
    add_new_items(crawled_data)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;또한, fetch_clien_latest_data() 메서드의 &lt;span&gt;print&lt;/span&gt;(title) 코드도 더이상 불필요하기 때문에 삭제하였습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;자동 실행될 스크립트 파일 생성&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size23&quot;&gt;&amp;nbsp; crontab에 의하여 실행될 스크립트 파일을 root project에 위치시킵니다. 필자는 &lt;b&gt;start_crawling.sh&lt;/b&gt; 파일명으로 아래처럼 코드를 작성하였습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1573478359929&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#!/bin/bash

source ~/PycharmProjects/MyVirtualEnv/bin/activate
python3 ~/PycharmProjects/a/ClienCrawlingDjango/clien_crawler.py&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp; MyVirtualEnv라는 별도의 가상 환경을 사용하고 있기 때문에 액티베이션 시키는 코드를 첫줄에 추가하였습니다. 그 이후에 python3 로 clien_crawler.py 파일을 실행 시키는 코드를 작성하였습니다. 만약 가상 환경을 사용하지 않는다면 'source~' 줄은 추가하지 않아도 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 이제 이 스크립트를 실행하기 위하여&amp;nbsp; crontab 을 편집해보겠습니다. &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;터미널에서 crontab -e 명령어를 입력&lt;/b&gt;&lt;/span&gt;합니다. 그러면 에디터 창이 보이는데, 그 창에 crontab 관련 규칙과 실행할 명령어를 입력합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1573477242915&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ crontab -e

#여기부터 에디터 입력창
*/1 * * * * ~/PycharmProjects/a/ClienCrawlingDjango/start_crawling.sh &amp;gt;&amp;gt; ~/PycharmProjects/a/ClienCrawlingDjango/crontab_log.txt 2&amp;gt;&amp;amp;1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp; crontab 의 주기 설정 방법은 &lt;a href=&quot;https://loveroid.tistory.com/57&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크를&lt;/a&gt; 참고 부탁드립니다. 위 코드는 1분마다 크롤링을 하는 코드를 작성하였기 때문에 가장 앞쪽에 '분' 단위 룰을 나타내는곳에 */1 을 설정하였습니다. 5분마다 설정하고 싶다면 */5 라고 설정하시면 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;'&amp;gt;&amp;gt;' 오퍼레이터는 print되는 문자들을 별도의 로그 파일에 기록하기 위함입니다. '&amp;gt;'는 덮어쓰기 작업이고, '&amp;gt;&amp;gt;'는 파일에 추가하는 작업입니다.&amp;nbsp; 오랜 시간이 지나면 파일의 크기가 커지기 때문에 주기적으로 삭제해야 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 입력을 완료 하였으면 저장 후 터미널로 돌아옵니다. 정상적으로 추가 되었는지 확인하려면 &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;crontab -l&lt;/span&gt; &lt;/b&gt;명령어를 입력해보면 리스트를 확인 할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1573478990809&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ crontab -l
*/1 * * * * ~/PycharmProjects/a/ClienCrawlingDjango/start_crawling.sh &amp;gt;&amp;gt; ~/PycharmProjects/a/ClienCrawlingDjango/crontab_log.txt 2&amp;gt;&amp;amp;1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 몇분 정도의 시간 뒤에 로그 파일을 열어 보았습니다. 아래처럼 정상적으로 스크립트 파일이 실행되었고, 정확히 1분 간격으로 크롤링이 진행 되었음을 확인 할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1573478898233&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;start - 2019-11-11 13:26:00
start - 2019-11-11 13:27:01
start - 2019-11-11 13:28:02
start - 2019-11-11 13:29:03&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;텔레그램으로 메세지 전송하기&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;텔레그램으로 메시지를 전송하는 코드를 먼저 살펴보겠습니다. clien_crawler.py 파일에 추가하였습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1573479487726&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def send_noti_to_telegram(items):
    if len(items) == 0:
        return

    bot_token = '1034490xxxxxx'
    bot_chat_id = '-10010000000'

    for item in items:
        bot_message = &quot;\[클리앙] &quot; + item['title'] + \
                      &quot;\n&quot; + item['link']

        send_text = 'https://api.telegram.org/bot' + bot_token + \
                    '/sendMessage?chat_id=' + bot_chat_id + \
                    '&amp;amp;parse_mode=Markdown&amp;amp;text=' + bot_message

        requests.get(send_text)
        sleep(1)
        
        
if __name__ == '__main__':
    print('start - ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
    crawled_data = fetch_clien_latest_data()
    db_inserted_items = add_new_items(crawled_data)
    send_noti_to_telegram(db_inserted_items)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; main 함수를 보면 디비에 추가된 항목을 리스트로 전달받고 send_noti_to_telegram() 메서드를 호출하고 있습니다. 이 메서드에서는 텔레그램으로 전달할 메시지를 빌드하고, requests 를 통하여 전달하고 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;여기에서 필요한게 &lt;b&gt;bot token과 bot chat id&lt;/b&gt; 입니다. 어떻게 획득 할 수 있는지 한번 살펴보겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;텔레그램 bot token / bot chat id 획득하기&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;텔레그램을 실행 후 검색창에서 'BotFather'를 입력합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷 2019-11-11 오후 10.41.51.png&quot; data-origin-width=&quot;299&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJj880/btqzHaBtV3t/xNyJS3jdqoh1TZJsq9q9hK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJj880/btqzHaBtV3t/xNyJS3jdqoh1TZJsq9q9hK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJj880/btqzHaBtV3t/xNyJS3jdqoh1TZJsq9q9hK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJj880%2FbtqzHaBtV3t%2FxNyJS3jdqoh1TZJsq9q9hK%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-11-11 오후 10.41.51.png&quot; data-origin-width=&quot;299&quot; data-origin-height=&quot;360&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 선택 후 대화를 시작합니다. 대화 창에서 &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;/newbot&lt;/span&gt;&lt;/b&gt; 을 입력합니다. 그러면 새로운 봇 이름을 입력하라는 메시지가 전달됩니다. 새로운 봇 이름을 입력합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 본 포스팅에서 사용할 예제에서는 '&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;clien_test_bot&lt;/span&gt;&lt;/b&gt;' 으로 입력하겠습니다. 정상적으로 입력이 되면 이제 'bot'으로 끝나는 사용자 이름을 입력하라는 메시지가 전달됩니다. 똑같이 'clien_test_bot' 으로 입력하겠습니다. 완료되면 bot token 을 받을 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷 2019-11-11 오후 10.45.08.png&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;547&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZJYBC/btqzIfoyceE/gll2kIYn3B71XRVv1fxiBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZJYBC/btqzIfoyceE/gll2kIYn3B71XRVv1fxiBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZJYBC/btqzIfoyceE/gll2kIYn3B71XRVv1fxiBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZJYBC%2FbtqzIfoyceE%2Fgll2kIYn3B71XRVv1fxiBK%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-11-11 오후 10.45.08.png&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;547&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;숫자 9953으로 시작하는게 bot token 입니다.&lt;/p&gt;
&lt;p&gt;이제 새로운 채널을 하나 생성해야 합니다. 아래처럼 아이콘을 클릭 후 &quot;New Channel&quot;을 선택합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷 2019-11-11 오후 10.46.48.png&quot; data-origin-width=&quot;292&quot; data-origin-height=&quot;216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U8WKL/btqzH0yoVvQ/kqfOmlT7NLRkTratyDlMOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U8WKL/btqzH0yoVvQ/kqfOmlT7NLRkTratyDlMOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U8WKL/btqzH0yoVvQ/kqfOmlT7NLRkTratyDlMOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU8WKL%2FbtqzH0yoVvQ%2FkqfOmlT7NLRkTratyDlMOk%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-11-11 오후 10.46.48.png&quot; data-origin-width=&quot;292&quot; data-origin-height=&quot;216&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;채널 이름은 &quot;clien_test_channel&quot; 로 입력하였습니다. 원하시는 채널 이름을 입력하시면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷 2019-11-11 오후 10.48.05.png&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxq4u0/btqzFWDJdZE/Eu8WV2Nt1KK2GMLnOV5BGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxq4u0/btqzFWDJdZE/Eu8WV2Nt1KK2GMLnOV5BGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxq4u0/btqzFWDJdZE/Eu8WV2Nt1KK2GMLnOV5BGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcxq4u0%2FbtqzFWDJdZE%2FEu8WV2Nt1KK2GMLnOV5BGk%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-11-11 오후 10.48.05.png&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;270&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;입력을 완료하면 우측 상단에 있는 &quot;Next&quot; 버튼을 클릭합니다. 완료되면 채널이 하나 생성되는것을 확인 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;생성한 채널의 관리자로 텔레그램 봇을 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp; bot chat id을 알기 위해서는 봇을 채널의 관리자로 추가 하여야 합니다. 관리자로 추가 하는 방법은 채널의 우측의 Info 에서 관리자 또는 Administrators를 클릭합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; Add Admin 을 클릭 후, 조금전에 생성한 &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;clien_test_bot 을 검색 후 추가&lt;/b&gt;&lt;/span&gt; 해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷 2019-11-11 오후 10.56.47.png&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bd3LWS/btqzHTM2oEB/TXHQZwAvmLr8JBK91J4K0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bd3LWS/btqzHTM2oEB/TXHQZwAvmLr8JBK91J4K0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bd3LWS/btqzHTM2oEB/TXHQZwAvmLr8JBK91J4K0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbd3LWS%2FbtqzHTM2oEB%2FTXHQZwAvmLr8JBK91J4K0K%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-11-11 오후 10.56.47.png&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;562&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp; 선택 후 추가 권한을 선택하는 창이 한번 더 보이는데 &quot;Add Subscribers&quot;를 FALSE 로 선택 하여야 합니다. 완료하면 아래처럼 관리자가 두명인것을 확인 할 수 있습니다. Shun은 본인 계정이고, clien_test_bot은 관리자 권한을 위임받은 봇입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷 2019-11-11 오후 10.57.47.png&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6wyWG/btqzFeZaaTg/WDIA5KBvkxMpU9sLE1yFaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6wyWG/btqzFeZaaTg/WDIA5KBvkxMpU9sLE1yFaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6wyWG/btqzFeZaaTg/WDIA5KBvkxMpU9sLE1yFaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6wyWG%2FbtqzFeZaaTg%2FWDIA5KBvkxMpU9sLE1yFaK%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-11-11 오후 10.57.47.png&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;400&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;bot chat id 받기&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span&gt;이제 bot chat id 를 알아보도록 하겠습니다.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;아래 URL 에 API 내용을 붙여 넣기 하여 인터넷 주소창에 입력하고 이동 해 봅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;a href=&quot;https://api.telegram.org/bot&quot;&gt;https://api.telegram.org/bot&lt;/a&gt;&lt;b&gt;[&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span&gt;이부분]&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;/getUpdates&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷 2019-11-11 오후 11.01.58.png&quot; data-origin-width=&quot;1590&quot; data-origin-height=&quot;738&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cV4kEt/btqzGqR6lwH/W2MwH8T3zKAeL2j4JXEdG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cV4kEt/btqzGqR6lwH/W2MwH8T3zKAeL2j4JXEdG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cV4kEt/btqzGqR6lwH/W2MwH8T3zKAeL2j4JXEdG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcV4kEt%2FbtqzGqR6lwH%2FW2MwH8T3zKAeL2j4JXEdG0%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-11-11 오후 11.01.58.png&quot; data-origin-width=&quot;1590&quot; data-origin-height=&quot;738&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;위와 같이 입력을 하면 봇과 관련된 여러 정보들이 보여집니다. &lt;u&gt;만약 result에 아무런 정보가 보이지 않는다면 좀 기다렸다가 다시 시도 해보시기 바랍니다.&lt;/u&gt; &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;bot chat id는 &lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;-1001173133632&lt;/span&gt;&lt;/b&gt;라는 것을 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;텔레그램으로 메시지 보내기&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span&gt;주소창에 아래처럼 입력을 해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1573481321460&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;https://api.telegram.org/bot995398932:AAHsc4J34GC1UY59oUX0HrX6tcxs7sCTXjI/sendMessage?chat_id=-1001173133632&amp;amp;text=Hello&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그러면 텔레그램 채널로 Hello가 입력 되는것을 확인 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷 2019-11-11 오후 11.09.28.png&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;493&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nxzSm/btqzGpZZoUf/uig5GvfCRKiqBljEKE7fI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nxzSm/btqzGpZZoUf/uig5GvfCRKiqBljEKE7fI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nxzSm/btqzGpZZoUf/uig5GvfCRKiqBljEKE7fI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnxzSm%2FbtqzGpZZoUf%2Fuig5GvfCRKiqBljEKE7fI0%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-11-11 오후 11.09.28.png&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;493&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이제 저 URL을 python 코드상에서 적절히 조합을 하면 텔레그램으로 메시지를 손쉽게 전송 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;bot token과 bot chat id 둘다 알았으니 코드를 업데이트하고 실행해보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1573481539717&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def send_noti_to_telegram(items):
    if len(items) == 0:
        return

    bot_token = '995398932:AAHsc4J34GC1UY59oUX0HrX6tcxs7sCTXjI'
    bot_chat_id = '-1001173133632'

    for item in items:
        bot_message = &quot;\[클리앙] &quot; + item['title'] + \
                      &quot;\n&quot; + item['link']

        send_text = 'https://api.telegram.org/bot' + bot_token + \
                    '/sendMessage?chat_id=' + bot_chat_id + \
                    '&amp;amp;parse_mode=Markdown&amp;amp;text=' + bot_message

        requests.get(send_text)
        sleep(1)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;실행을 해보니 새로운 글이 2건 등록되었습니다.(PyCharm Console에서 확인)&lt;/p&gt;
&lt;p&gt;해당 2건은 DB에 추가 후 텔레그램으로 푸쉬가 오는것을 확인 할 수 있습니다. (텔레그램 채널 확인)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;TIP&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 만약, bot_message에 &amp;amp; 문자를 가진 url을 포함한다면 그대로 전송할시에 정상적으로 노출이 되지 않을수 있습니다.&lt;/p&gt;
&lt;p&gt;이럴 경우에는 아래처럼 UTF-8 문자로 변경하면 정상적으로 전송이 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1574344601855&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bot_message.replace('&amp;amp;', '%26')&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷 2019-11-11 오후 11.15.06.png&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;776&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xLwxd/btqzIfISvkD/Lze4ci3zBnfwKIMvtHjoOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xLwxd/btqzIfISvkD/Lze4ci3zBnfwKIMvtHjoOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xLwxd/btqzIfISvkD/Lze4ci3zBnfwKIMvtHjoOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxLwxd%2FbtqzIfISvkD%2FLze4ci3zBnfwKIMvtHjoOK%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-11-11 오후 11.15.06.png&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;776&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;여기까지 텔레그램으로 메시지를 보내는 기능을 살펴보았습니다.&lt;/p&gt;</description>
      <category>Python</category>
      <category>python telegram</category>
      <category>텔레그램 bot chat id와 bot token 생성</category>
      <category>파이썬</category>
      <category>파이썬 텔레그램</category>
      <category>파이썬크롤링</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/75</guid>
      <comments>https://softwaree.tistory.com/75#entry75comment</comments>
      <pubDate>Tue, 12 Nov 2019 00:40:44 +0900</pubDate>
    </item>
    <item>
      <title>파이썬으로 웹페이지 크롤링을 해보자. (1) Django 프로젝트 만들기</title>
      <link>https://softwaree.tistory.com/74</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;들어가며...&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp; 파이썬으로 웹페이지의 새로운 게시글을 크롤링하고, Django를 이용해서 DB에 저장하는 실습을 해보도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;crontab을 이용해서 주기적으로 크롤링을 실행되도록 하고, 새로운 글이 크롤링 되었을때 텔레그렘이나 슬랙으로 전송하는 기능과 VPS 에서 실행되도록 하는 실습을 진행해보겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 이번 첫 시간에는 Django 프로젝트를 생성 해보겠습니다. Django 프로젝트와 앱을 만들고, Model을 통해 DB를 생성하고 크롤링 된 데이터를 저장 및 관리자 페이지를 섿업하는것까지 진행해보겠습니다. 만약, Django가 처음이라면 &lt;a href=&quot;https://djangogirlsseoul.gitbooks.io/django-tube/content/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;이 링크&lt;/a&gt;를 참고 하시면 많은 도움이 될 것입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Python 3.7 버전 설치&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;Django 설치를 위한 파이썬 최소 버전은 3.7입니다. 만약, 본인의 개발 환경(우분투)에 3.7 버전이 설치되어 있지 않다면 아래 링크를 통하여 설치 후 진행을 권합니다. 만약, 본인이 초급자라면 venv도 설치를 권합니다. 설치 방법은 역시 링크에 포함되어 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://softwaree.tistory.com/85&quot;&gt;https://softwaree.tistory.com/85&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1580215580727&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Ubuntu 16.04에서 Python 3.7 설치&quot; data-og-description=&quot;들어가며... django를 사용하려면 Python이 최소 3.7 버전이 설치 되어 있어야 합니다. 하지만 우분투 16.04에서 지원하는 버전은 3.5이기 때문에 추가로 설치를 하여야 합니다. 본인의 PC에 설치되어 있는 버전을..&quot; data-og-host=&quot;softwaree.tistory.com&quot; data-og-source-url=&quot;https://softwaree.tistory.com/85&quot; data-og-url=&quot;https://softwaree.tistory.com/85&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Jang4/hyEIVeBHyY/Vk6IdbiBXF5PTUekZ8EIck/img.png?width=150&amp;amp;height=150&amp;amp;face=0_0_150_150,https://scrap.kakaocdn.net/dn/zqatm/hyEKFuqEw0/mvy8pVUQ55zcvSZ2T32aXk/img.png?width=150&amp;amp;height=150&amp;amp;face=0_0_150_150&quot;&gt;&lt;a href=&quot;https://softwaree.tistory.com/85&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://softwaree.tistory.com/85&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Jang4/hyEIVeBHyY/Vk6IdbiBXF5PTUekZ8EIck/img.png?width=150&amp;amp;height=150&amp;amp;face=0_0_150_150,https://scrap.kakaocdn.net/dn/zqatm/hyEKFuqEw0/mvy8pVUQ55zcvSZ2T32aXk/img.png?width=150&amp;amp;height=150&amp;amp;face=0_0_150_150');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Ubuntu 16.04에서 Python 3.7 설치&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;들어가며... django를 사용하려면 Python이 최소 3.7 버전이 설치 되어 있어야 합니다. 하지만 우분투 16.04에서 지원하는 버전은 3.5이기 때문에 추가로 설치를 하여야 합니다. 본인의 PC에 설치되어 있는 버전을..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;softwaree.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Django 설치하기&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;python 3.7버전 이상이 설치 되어 있다면 간단한 명령어로 Django를 설치 할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1573228000783&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ pip install django&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Django 프로젝트 생성하기&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp; django가 성공적으로 설치되면 django-admin 이라는 명령어로 장고 프로젝트를 생성 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;이번 포스트에서는 제가 좋아하는 '클리앙' 이라는 커뮤니티의 크롤링을 위하여 ClienCrawlingDjango 라는 이름으로 프로젝트를 만들어보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1573228584795&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ django-admin startproject ClienCrawlingDjango&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;생성을 완료하면 아래와 같은 폴더 트리를 볼 수 있습니다. (IDE는 PyCharm CE)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷 2019-11-09 오전 1.00.17.png&quot; width=&quot;601&quot; height=&quot;274&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YHZnT/btqzEg9IWe7/dIJkTGmSd9ylK8IgmLQcP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YHZnT/btqzEg9IWe7/dIJkTGmSd9ylK8IgmLQcP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YHZnT/btqzEg9IWe7/dIJkTGmSd9ylK8IgmLQcP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYHZnT%2FbtqzEg9IWe7%2FdIJkTGmSd9ylK8IgmLQcP1%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-11-09 오전 1.00.17.png&quot; width=&quot;601&quot; height=&quot;274&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;장고 앱 생성하기&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp; Django는 프로젝트와 그 안의 앱으로 관리됩니다. 이 앱은 하나의 기능을 담당하는 컴포넌트로 보면 될것 같습니다. 앱은 manage.py 파일을 통해서&amp;nbsp;&lt;b&gt; startapp&lt;/b&gt;이라는 명령어로 생성이 가능합니다. crawled_data라는 이름의 앱을 만들어보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1573229231743&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ python manage.py startapp crawled_data&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;정상적으로 생성이 되었다면 아래 스크린샷처럼 프로젝트의 구조를 볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷 2019-11-09 오전 1.11.38.png&quot; width=&quot;508&quot; height=&quot;393&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WNRBB/btqzEg9I13n/Lv4cBRyJSifMTqNE4o8Tu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WNRBB/btqzEg9I13n/Lv4cBRyJSifMTqNE4o8Tu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WNRBB/btqzEg9I13n/Lv4cBRyJSifMTqNE4o8Tu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWNRBB%2FbtqzEg9I13n%2FLv4cBRyJSifMTqNE4o8Tu1%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-11-09 오전 1.11.38.png&quot; width=&quot;508&quot; height=&quot;393&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 생성만으로 끝난게 아니라 이 앱을 Django가 관리하도록 수정 작업을 해야 합니다.&lt;/p&gt;
&lt;p&gt;ClienCrawlingDjango 폴더 안의 &lt;span style=&quot;color: #006dd7;&quot;&gt;settings.py 파일의 INSTALLED_APPS에 추가&lt;/span&gt; 하여야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1573229605664&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Application definition
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'crawled_data'
]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;DB 첫 마이그레이션&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp; DB를 사용하기 위하여 &lt;span style=&quot;color: #006dd7;&quot;&gt;최초 1회 마이그레이션을 진행&lt;/span&gt; 하여야 합니다. 명령어는 &lt;b&gt;python manage.py migrate&lt;/b&gt; 입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1573229703202&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying sessions.0001_initial... OK
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;crawled_data 앱의 모델 생성하기&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp; DB에 데이터를 저장할 모델을 만들어 보겠습니다. Django에서 모델은 앱 단위로 만들어지고 구성이 됩니다. 앞에서 만든 앱 단위인 &lt;span style=&quot;color: #006dd7;&quot;&gt;crawled_data 안에 있는 models.py파일을 수정&lt;/span&gt;해줘야 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 이 모델 파일은 크롤링한 데이터를 필드별로 저장하는것이 목적입니다. 따라서 크롤링한 데이터의 추출할 부분을 미리 파악해서 객체로 만들어주어야 합니다. Django는 NoSQL이 아닌 SQL DB이기 때문에 스키마 정의를 해 주어야 하는데 이 스키마 정의를 별도의 object 클래스로 정의하여야 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 본 실습 프로젝트에서는 requests 라이브러리와 BeautifulSoup4(bs4) 라이브러리를 주로 활용할 계획입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; DB에 저장할 데이터는 &lt;span style=&quot;color: #006dd7;&quot;&gt;타이틀과 링크, 고유 ID&lt;/span&gt;로 구성하겠습니다. BoardData라는 이름의 Table을 DB에 만들도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;django models의 class는 DB의 Table로 변환이 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1573392916893&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django.db import models


# Create your models here.
class BoardData(models.Model):
    title = models.CharField(max_length=300)
    link = models.URLField()
    specific_id = models.CharField(max_length=15)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp; 이렇게 만들면 title은 최대 300글자 제한의 CharField로, link는 URLField로, specific_id 는 15글자의 제한의 CharField로 생성됩니다. specific id는 클리앙 게시글에 부여되는 고유 ID로서 최신 데이터인지를 판단하는 기준으로 사용됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;DB Migration&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp; 새로운 DB가 추가되었으니 db migration을 진행하여야 합니다. 아래처럼 명령어를 입력하면 DB의 변경 정보를 정리하고, 실제 DB에 반영하는 과정을 진행하게 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1573393242515&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ python manage.py makemigrations crawled_data
Migrations for 'crawled_data':
  crawled_data/migrations/0001_initial.py
    - Create model BoardData
(common_env) owllife in ~/PycharmProjects/a/ClienCrawlingDjango
$ python manage.py migrate crawled_data
Operations to perform:
  Apply all migrations: crawled_data
Running migrations:
  Applying crawled_data.0001_initial... OK&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;&amp;nbsp; 마이그레이션을 할 때마다 crawled_data 앱 폴더의 하위에 있는 migrations 폴더를 보면 버전순으로 어떤점들이 변경되었는지를 볼 수 있습니다. &lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 최초로 DB 테이블을 생성하였기 때문에 _initial라는 suffix가 붙어 있습니다. 이 파일들은 &lt;b&gt;makemigrations&lt;/b&gt;라는 명령어를 통해 생성이 되고, 실제로 DB에 적용을 할 때에는 &lt;b&gt;migrate&lt;/b&gt;라는 명령어를 사용하게 됩니다. 바로 이전에 실행한 명령어들입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;클리앙 커뮤니티 크롤링 함수 구현&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp; 클리앙의 &quot;모두의 공원&quot; 이라는 게시물에서 &quot;쿠팡&quot;이라는 키워드로 검색후, 새로운 키워드가 있는 경우에만 DB에 추가 해보도록 하겠습니다. &lt;s&gt;(쿠팡 직원 아님)&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;해당 링크와 게시판을 스크린샷으로 살펴보겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;링크&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.clien.net/service/search/board/park?sk=title&amp;amp;sv=%EC%BF%A0%ED%8C%A1&quot;&gt;https://www.clien.net/service/search/board/park?sk=title&amp;amp;sv=%EC%BF%A0%ED%8C%A1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;스크린샷&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/93lii/btqzFznvxiu/N3yPJL5G0nP8jIcwvvFgOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/93lii/btqzFznvxiu/N3yPJL5G0nP8jIcwvvFgOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/93lii/btqzFznvxiu/N3yPJL5G0nP8jIcwvvFgOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F93lii%2FbtqzFznvxiu%2FN3yPJL5G0nP8jIcwvvFgOk%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이제 코드를 살펴보겠습니다.&lt;/p&gt;
&lt;p&gt;필요한 라이브러리를 설치하겠습니다. 웹페이지의 http 통신을 위해 requests 와 웹페이지를 파싱하는데 유용한 라이브러리인 bs4를 설치하겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1573395770347&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install requests
pip install bs4&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;프로젝트의 &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;root 디렉토리에 clien_crawler.py 파일을 생성&lt;/span&gt;&lt;/b&gt; 후 아래와 같이 코딩합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1573396274170&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os
from urllib.parse import urlparse

import requests
from bs4 import BeautifulSoup


def fetch_clien_latest_data():
    result = []

    url = 'https://www.clien.net/service/search/board/park?sk=title&amp;amp;sv=%EC%BF%A0%ED%8C%A1'
    response = requests.get(url)
    html = response.text
    soup = BeautifulSoup(html, 'html.parser')

    web_page_link_root = &quot;https://clien.net&quot;
    list_items = soup.find_all(&quot;div&quot;, &quot;list_item symph_row&quot;)

    for item in list_items:
        # title
        title = item.find(&quot;span&quot;, &quot;subject_fixed&quot;)[&quot;title&quot;]

        # link
        page_link_raw = web_page_link_root + item.find(&quot;div&quot;, &quot;list_title&quot;).find(&quot;a&quot;)[&quot;href&quot;]
        page_link_parts = urlparse(page_link_raw)
        normalized_page_link = page_link_parts.scheme + '://' + page_link_parts.hostname + page_link_parts.path

        # specific id
        specific_id = page_link_parts.path.split('/')[-1]

        item_obj = {
            'title': title,
            'link': normalized_page_link,
            'specific_id': specific_id,
        }

        print(title)
        result.append(item_obj)

    return result&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 링크의 데이터를 soup에서 받아오고, 그 데이터를 파싱 후 리스로 만들고, 루프를 돌면서 title, link 및 specific id 등을 얻어옵니다. specific id는 link에서 파싱을 해서 얻어오는데 게시글에 부여되는 고유 id로 생각하시면 될것 같습니다. DB에 저장 후 계속해서 크롤링을 하게 될텐데 이미 저장된 데이터인지 판단하는 기준으로 사용됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 얻어온 데이터는 item_obj에 dictionary 형태로 저장하고, 리스트로 생성해줍니다. 생성된 리스트는 리턴해서 db에 저장 할 수 있는 상태로 만들어줍니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷 2019-11-10 오후 11.37.09.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgzNyr/btqzD5VGibV/qtMNIty6jizPsGz6nutxEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgzNyr/btqzD5VGibV/qtMNIty6jizPsGz6nutxEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgzNyr/btqzD5VGibV/qtMNIty6jizPsGz6nutxEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgzNyr%2FbtqzD5VGibV%2FqtMNIty6jizPsGz6nutxEk%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-11-10 오후 11.37.09.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 파싱할 규칙은 크롬 브라우저의 '검사' 메뉴를 통해 소스를 볼 수 있으니 알맞은 규칙을 찾아서 파싱 할 수 있습니다. BeautifulSoup4에 대하여 자세히 알아보시려면 따로 구글링을 통해 찾을 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;파싱 메서드가 제대로 동작하는지 확인하려면 해당 메서드에 메인 메서드를 만들어서 호출해서 테스트 할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1573396793165&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if __name__ == '__main__':
    fetch_clien_latest_data()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;실행해보면 아래처럼 출력이 됩니다. 파싱 메서드에 타이틀을 출력하는 코드가 있습니다. '쿠팡' 이라는 키워드로 검색 후 나온 결과물을 그대로 보여준 것을 알 수 있습니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 62.631%; height: 563px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;오늘&amp;nbsp;쿠팡이츠&amp;nbsp;알바뛸껄&amp;nbsp;그랬어요.ㅋㅋㅋㅋ&lt;br /&gt;쿠팡맨&amp;nbsp;게임&amp;nbsp;ㅠㅠ&lt;br /&gt;쿠팡,&amp;nbsp;더&amp;nbsp;힘들어&amp;nbsp;질&amp;nbsp;듯&amp;nbsp;합니다...&lt;br /&gt;쿠팡에&amp;nbsp;이어팟(3.5파이버전)&amp;nbsp;16950원이네요&lt;br /&gt;쿠팡&amp;nbsp;로켓배송은&amp;nbsp;제가&amp;nbsp;집&amp;nbsp;앞에&amp;nbsp;편의점&amp;nbsp;가는&amp;nbsp;것보다&amp;nbsp;빠르네요.&lt;br /&gt;쿠팡&amp;nbsp;추천상품&amp;nbsp;보다가...&lt;br /&gt;쿠팡&amp;nbsp;누적&amp;nbsp;적자가&amp;nbsp;3조라는군요&lt;br /&gt;달려라&amp;nbsp;쿠팡맨&amp;nbsp;ost는&amp;nbsp;좋네요&lt;br /&gt;어제&amp;nbsp;결제한&amp;nbsp;쿠팡&amp;nbsp;12%&amp;nbsp;캐시백&amp;nbsp;행사&amp;nbsp;아이폰이&amp;nbsp;왔습니다&lt;br /&gt;전&amp;nbsp;이제&amp;nbsp;쿠팡없으면&amp;nbsp;못삽니다&lt;br /&gt;자급제&amp;nbsp;아이폰11%&amp;nbsp;쿠팡&amp;nbsp;12%&amp;nbsp;캐시백에&amp;nbsp;24개월&amp;nbsp;무이자할부&amp;nbsp;떴네요&lt;br /&gt;쿠팡&amp;nbsp;아이폰11취소했습니다.&lt;br /&gt;미밴드4&amp;nbsp;정발(쿠팡판)&amp;nbsp;업데이트&amp;nbsp;되네요&lt;br /&gt;쿠팡&amp;nbsp;아이폰&amp;nbsp;사전예약&amp;nbsp;무섭게&amp;nbsp;품절이네요&lt;br /&gt;쿠팡에서&amp;nbsp;결국&amp;nbsp;맥북&amp;nbsp;질렀네요&lt;br /&gt;쿠팡&amp;nbsp;아이폰이&amp;nbsp;왔는데&lt;br /&gt;쿠팡&amp;nbsp;아이폰&amp;nbsp;내일&amp;nbsp;도착&amp;nbsp;확정!&lt;br /&gt;쿠팡&amp;nbsp;새벽&amp;nbsp;아이폰프로맥스&lt;br /&gt;쿠팡&amp;nbsp;로켓직구&amp;nbsp;쓰면서&amp;nbsp;불편했던&amp;nbsp;점&lt;br /&gt;쿠팡이&amp;nbsp;판매자에게&amp;nbsp;돈이&amp;nbsp;바로&amp;nbsp;안가는지는&amp;nbsp;몰랐네요...&lt;br /&gt;다른분들은&amp;nbsp;쿠팡&amp;nbsp;아이폰&amp;nbsp;일찍&amp;nbsp;받으신다는데&amp;nbsp;저는&amp;nbsp;그대로네요&lt;br /&gt;쿠팡&amp;nbsp;아이뻐&amp;nbsp;내일&amp;nbsp;온데요&lt;br /&gt;쿠팡&amp;nbsp;아이폰&amp;nbsp;제발&amp;nbsp;내일&amp;nbsp;ㅠㅠㅠㅠ&lt;br /&gt;쿠팡&amp;nbsp;아이폰&amp;nbsp;새벽배송으로&amp;nbsp;오네요.&lt;br /&gt;쿠팡아이폰이&amp;nbsp;예정보다&amp;nbsp;일찍&amp;nbsp;오네요&lt;br /&gt;쿠팡&amp;nbsp;상품&amp;nbsp;가격&amp;nbsp;히스토리&amp;nbsp;/&amp;nbsp;설정가격&amp;nbsp;알림&amp;nbsp;/&amp;nbsp;상품추천&amp;nbsp;사이트를&amp;nbsp;제작해봤습니다&lt;br /&gt;쿠팡&amp;nbsp;로켓프레시&amp;nbsp;배송은&amp;nbsp;사랑입니다.&lt;br /&gt;쿠팡&amp;nbsp;리뷰&amp;nbsp;보다가&amp;nbsp;어떤&amp;nbsp;분이&amp;nbsp;영양제&amp;nbsp;테이블&amp;nbsp;사진을&amp;nbsp;찍어&amp;nbsp;놓았는데..&lt;br /&gt;쿠팡&amp;nbsp;아이폰11&amp;nbsp;분실건&amp;nbsp;오늘&amp;nbsp;연락&amp;nbsp;안오네요&amp;nbsp;ㄷㄷ&lt;br /&gt;쿠팡&amp;nbsp;로켓와우&amp;nbsp;멤버십이&amp;nbsp;또&amp;nbsp;무료체험이네요...?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;하지만, 이 함수는 아직 Django에 저장하는 기능을 갖고 있지 않습니다. 따라서 코드를 조금 더 추가 해 주어야 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;실행시 Trouble shooting&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href=&quot;https://softwaree.tistory.com/76&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;문자 encoding 이슈&lt;/a&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Django 환경 불러오기&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1573397050867&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os
from urllib.parse import urlparse

import requests
from bs4 import BeautifulSoup

os.environ.setdefault('DJANGO_SETTINGS_MODULE', &quot;ClienCrawlingDjango.settings&quot;)
import django

django.setup()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;os 를 import하고, environ을 설정 후 django를 불러와서 섿업을 하였습니다.&lt;/p&gt;
&lt;p&gt;이렇게 추가 후 컴파일 에러가 없다면 정상적으로 Django DB에 저장할 준비가 되었습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Django ORM으로 데이터 저장&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&amp;nbsp; 이제 models에서 우리가 만들었던 BoardData를 import해 보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1573397178968&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;django.setup()
from crawled_data.models import BoardData&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp; 한가지 주의해야 할점은&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt; django.setup() 이후에 호출&lt;/span&gt;&lt;/b&gt;하여야 합니다. 그렇지 않으면 django가 초기화 되지 않은 상황에서 model을 불러오려고 해서 에러가 발생합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 이제 DB 에 저장하는 코드를 살펴보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1573399976449&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def add_new_items(crawled_items):
    last_inserted_items = BoardData.objects.last()
    if last_inserted_items is None:
        last_inserted_specific_id = &quot;&quot;
    else:
        last_inserted_specific_id = getattr(last_inserted_items, 'specific_id')

    items_to_insert_into_db = []
    for item in crawled_items:
        if item['specific_id'] == last_inserted_specific_id:
            break
        items_to_insert_into_db.append(item)
    items_to_insert_into_db.reverse()

    for item in items_to_insert_into_db:
        print(&quot;new item added!! : &quot; + item['title'])

        BoardData(specific_id=item['specific_id'],
                  title=item['title'],
                  link=item['link']).save()

    return items_to_insert_into_db&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp; 크롤링한 리스트 데이터를 인자로 넘겨 받는 add_new_items라는 메서드입니다. 세 부분으로 나뉘어서 설명해보도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1573400050872&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    last_inserted_items = BoardData.objects.last()
    if last_inserted_items is None:
        last_inserted_specific_id = &quot;&quot;
    else:
        last_inserted_specific_id = getattr(last_inserted_items, 'specific_id')&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 처음에 BoardData 로부터 마지막에 추가된 항목을 불러옵니다. 아무런 데이터가 없다면 &quot;&quot; 로 초기화를 시켜주고, 그렇지 않다면 'specific_id'를 가져옵니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1573400090760&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    items_to_insert_into_db = []
    for item in crawled_items:
        if item['specific_id'] == last_inserted_specific_id:
            break
        items_to_insert_into_db.append(item)
    items_to_insert_into_db.reverse()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp; 크롤링한 리스트 데이터의 루프를 돌면서 만약 DB에 추가된 specific_id와 동일한 id를 가졌다면 바로 break를 시켜서 루프를 나옵니다. 그렇지 않다면 새로운 항목이므로 DB에 추가할 리스트에 추가를 합니다. 모든 체크가 끝난 이후에 reverse()로 리스트를 뒤집습니다. 오래된 항목부터 DB에 추가하여야 하기 때문에 오래된 항목을 리스트의 가장 앞쪽에 위치시킵니다. &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;DB의 가장 최신 row에는 항상 최신 데이터가 오도록 합니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1573400194364&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    for item in items_to_insert_into_db:
        print(&quot;new item added!! : &quot; + item['title'])

        BoardData(specific_id=item['specific_id'],
                  title=item['title'],
                  link=item['link']).save()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;BoardData라는 ORM에 데이터를 추가하는 코드입니다. &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;save() 호출&lt;/b&gt;&lt;/span&gt;을 하면 정상적으로 DB에 추가가 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이제 한번 실행해보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1573400276127&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ python clien_crawler.py&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;크롤링한 데이터의 제목과 &quot;new item added!! : [title]&quot; 이 쭈욱 보여지면 정상적으로 DB에 추가가 된 상태입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;저장된 데이터를 Django Admin에서 확인하기&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;관리자계정 만들기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;Django는 &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;Django Admin이라는 강력한 기능을 제공&lt;/b&gt;&lt;/span&gt;합니다.&lt;/p&gt;
&lt;p&gt;우선 Admin 계정을 하나 생성해야 합니다. &lt;b&gt;createsuperuser&lt;/b&gt; 명령어로 생성 할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1573400717291&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ python manage.py createsuperuser
Username (leave blank to use 'root'): owllife
Email address: 
Password: 
Password (again): 
Superuser created successfully.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ID 입력 후 email은 입력하지 않아도 됩니다. 비밀번호 두번 입력 완료하면 정상적으로 계정이 생성됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;앱에 Admin 등록하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;Django가 어떤 앱을 admin에서 관리하도록 하려면 앱 폴더(crawled_data) 안에 있는 admin.py 파일을 수정해 주어야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1573400820954&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django.contrib import admin

# Register your models here.
from crawled_data.models import BoardData

admin.site.register(BoardData)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Django 서버 실행하기&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;이제 manage.py 가 있는 위치에서 runserver 명령어로 장고 개발 서버를 실행해 보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1573400889682&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ python manage.py runserver&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;만약, 특정 port 번호로 실행시키려면 아래처럼 &lt;span style=&quot;color: #333333;&quot;&gt;IP:PORT 를 마지막에 추가로 입력하면 &lt;/span&gt;됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1573467060863&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ python manage.py runserver 127.0.0.1:8080&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래와 같이 로그가 출력된다면 정상적으로 서버가 실행된 상태입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1573400934618&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
November 10, 2019 - 15:48:21
Django version 2.2.7, using settings 'ClienCrawlingDjango.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이제 &lt;b&gt;http://localhost:8000/admin/&lt;/b&gt; 으로 들어가 보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷 2019-11-11 오전 12.50.06.png&quot; width=&quot;595&quot; height=&quot;442&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tl0gi/btqzFzOA7MP/z95jmLZKEtbu3tLQtopQmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tl0gi/btqzFzOA7MP/z95jmLZKEtbu3tLQtopQmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tl0gi/btqzFzOA7MP/z95jmLZKEtbu3tLQtopQmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftl0gi%2FbtqzFzOA7MP%2Fz95jmLZKEtbu3tLQtopQmK%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-11-11 오전 12.50.06.png&quot; width=&quot;595&quot; height=&quot;442&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;로그인을 하면 아래와 같은 화면을 볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷 2019-11-11 오전 12.50.45.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bH21op/btqzD6AgjE9/688KeBZ4ARTZYSBJlL3NBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bH21op/btqzD6AgjE9/688KeBZ4ARTZYSBJlL3NBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bH21op/btqzD6AgjE9/688KeBZ4ARTZYSBJlL3NBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbH21op%2FbtqzD6AgjE9%2F688KeBZ4ARTZYSBJlL3NBK%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-11-11 오전 12.50.45.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 이전에 생성한 crawled_data 라는 앱 모듈이 보이고 그 아래에 위치한 BoardData라는 테이블이 보입니다.&amp;nbsp; Board datas라고 적힌 테이블을 선택해서 들어가보면 아래와 같이 이미 추가된 항목들을 볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷 2019-11-11 오전 12.52.15.png&quot; width=&quot;684&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U6V4u/btqzGpY2AMa/xwazVthWxMiwjL7B1Ursl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U6V4u/btqzGpY2AMa/xwazVthWxMiwjL7B1Ursl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U6V4u/btqzGpY2AMa/xwazVthWxMiwjL7B1Ursl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU6V4u%2FbtqzGpY2AMa%2FxwazVthWxMiwjL7B1Ursl1%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-11-11 오전 12.52.15.png&quot; width=&quot;684&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 리스트가 보이고 가장 최근에 추가된 항목을 선택하면 아래처럼 추가된 데이터를 확인 할 수 있습니다. BoardData 라는 model에서 추가한 속성들의 값을 여기에서 모두 확인 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷 2019-11-11 오전 12.52.59.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzFken/btqzGqRbdA1/ERcuxwlOio9yELIbkMXl40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzFken/btqzGqRbdA1/ERcuxwlOio9yELIbkMXl40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzFken/btqzGqRbdA1/ERcuxwlOio9yELIbkMXl40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzFken%2FbtqzGqRbdA1%2FERcuxwlOio9yELIbkMXl40%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-11-11 오전 12.52.59.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;TIP&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp; BoardData의 리스트를 보면 이름이 BoardData object (숫자) 와 같이 보여지기 때문에 가독성이 매우 떨어집니다. BoardData model 파일을 조금만 수정하면 아래와 같이 보기 좋게 바꿀수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷 2019-11-11 오전 12.55.50.png&quot; width=&quot;571&quot; height=&quot;649&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boR8qh/btqzE06W7s2/zsO1WiloJF7BX19GU3ohm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boR8qh/btqzE06W7s2/zsO1WiloJF7BX19GU3ohm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boR8qh/btqzE06W7s2/zsO1WiloJF7BX19GU3ohm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboR8qh%2FbtqzE06W7s2%2FzsO1WiloJF7BX19GU3ohm1%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-11-11 오전 12.55.50.png&quot; width=&quot;571&quot; height=&quot;649&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;코드 수정&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1573401493210&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django.db import models


# Create your models here.
class BoardData(models.Model):
    title = models.CharField(max_length=300)
    link = models.URLField()
    specific_id = models.CharField(max_length=15)

    def __str__(self):
        return self.title&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp; models.py 파일을 열어서 위와 같이 __str__ 메서드를 오버라이딩 해줍니다. __str__ 메서드의 디폴트는 ClassName + object라는 값을 반환하기 때문에 위와 같이 재정의를 통하여 좀 더 보기좋게 관리자 페이지에서 읽을 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 참고로, models.py 파일을 수정하였지만 DB 테이블 구조가 변경되는 사항이 아니기 때문에 &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;makemigrations나 migrate를 해 줄 필요가 &lt;u&gt;없습니다&lt;/u&gt;.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Python</category>
      <category>beautifulsoup4</category>
      <category>django</category>
      <category>크롤링</category>
      <category>클리앙 크롤링</category>
      <category>파이썬</category>
      <category>파이썬 django</category>
      <category>파이썬 슬랙 봇</category>
      <category>파이썬 크롤링</category>
      <category>파이썬 텔레그램 봇</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/74</guid>
      <comments>https://softwaree.tistory.com/74#entry74comment</comments>
      <pubDate>Mon, 11 Nov 2019 19:14:50 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 버전과 pip 버전 호환이 되지 않아서 발생되는 문제 해결. ImportError: cannot import name 'main'</title>
      <link>https://softwaree.tistory.com/72</link>
      <description>&lt;pre id=&quot;code_1572528745023&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Traceback (most recent call last):
  File &quot;/usr/bin/pip3&quot;, line 9, in &amp;lt;module&amp;gt;
    from pip import main
ImportError: cannot import name 'main'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위 에러 때문에 잠깐 삽질을 하였습니다.&lt;/p&gt;
&lt;p&gt;Pycharm IDE에 설정된 python 버전은 3.6인데 콘솔에서 패키지 설치를 위하여 실행한 명령어는 pip 로 하니, 패키지가 제대로 설치되지도 않고 설치 되었다 하더라도 위와 같은 에러가 발생하면서 더이상 실행 조차 되지 않았습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;python3-pip를 다시 설치 하였지만 뭔가 버전이 꼬인건지 해결이 안되어서 검색을 좀 해보니 아래 명령어로 해결하였습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1572528937083&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python3 -m pip uninstall pip &amp;amp;&amp;amp; sudo apt install python3-pip --reinstall&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;출처 : &lt;a href=&quot;https://stackoverflow.com/a/53700609/1855457&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Stackoverflow&lt;/a&gt;&lt;/p&gt;</description>
      <category>Python</category>
      <category>pip3 ImportError</category>
      <category>Python</category>
      <category>python pip 에러</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/72</guid>
      <comments>https://softwaree.tistory.com/72#entry72comment</comments>
      <pubDate>Thu, 31 Oct 2019 22:38:00 +0900</pubDate>
    </item>
    <item>
      <title>Gradle의 root gradle file에서 멀티 프로젝트 관리. subprojects를 이용한 코드 공용화 작업.</title>
      <link>https://softwaree.tistory.com/71</link>
      <description>&lt;p&gt;안드로이드 앱 개발을 하다보면 모듈화를 위하여 &quot;&lt;span&gt;com.android.library&quot; plugin이 적용된 &lt;/span&gt;여러 sub proejct들을 생성하게 됩니다. 그로 인해 build.gradle 파일이 계속해서 추가가 되고 조금만 신경쓰지 않으면 boilerplate code가 기하급수적으로 늘어나게 됩니다. 또한, 같은 외부 라이브러리를 버전만 다르게 각 모듈에서 적용하여 사용하는 경우도 발생하게 되는데 예기치 못한 컴파일 또는 런타임 에러가 종종 발생되기도 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;관리 포인트가 늘어나게되면 유지보수 비용도 증가하게 되므로 최대한 중복 코드를 제거하여 중앙에서 컨트롤 할 수 있도록 빌드스크립트를 구성하여야 합니다. 본 포스팅에서는 프로젝트의 root에 위치한 build.gradle 파일을 수정하여 중복 코드를 삭제 하는 방법에 대하여 설명하고자 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;예제에 사용된 샘플 프로젝트는 총 3개의 library module과 하나의 application module로 구성되어 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;common_module&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;view_module&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;usecase_module&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;app&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;module간의 의존 관계는 아래와 같습니다.&lt;/p&gt;
&lt;p&gt;view_module과 usecase_module은 common_module에 의존하고 있습니다.&lt;/p&gt;
&lt;p&gt;app은 view_module과 usecase_module을 의존하고 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;common_module - build.gradle&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1572443937613&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apply plugin: 'com.android.library'

println project.name + &quot; sub project&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;단 두줄로 구성되어 있습니다. plugin을 적용하고, task configuration 순서를 보기 위하여 콘솔에 프로젝트명을 보여주는 디버기용 코드입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;view_module과 usecase_module의 - build.gradle&amp;nbsp; (동일)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1572443961972&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apply plugin: 'com.android.library'

println project.name + &quot; sub project&quot;

dependencies {
    implementation project(':common_module')
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;common_module과 큰 차이는 없습니다. dependencies {}에 common_module을 의존하고 있다는 것을 나타내는 코드 한줄이 추가되어 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;app - build.gradle&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1572444189280&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apply plugin: 'com.android.application'

android {
    defaultConfig {
        applicationId &quot;com.owllife.jenkinstestproject&quot;
        versionCode 1
        versionName &quot;1.0&quot;
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation project(':usecase_module')
    implementation project(':view_module')

    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;application module로서 defaultConfig, buildTypes 등이 추가되어있고, 이 모듈에서만 사용하고 있는 constraintlayout lib 또한 의존성을 두고 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;각 sub module의 빌드 스크립트 코드가 매우 간결한 것을 볼 수 있습니다. 이제 root에 위치한 빌드 스크립트 파일은 어떻게 구성되어 있는지 한번 살펴보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1572444491478&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;buildscript {
    repositories {
        google()
        jcenter()
        maven { url &quot;https://plugins.gradle.org/m2/&quot; }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.1'
    }
}

subprojects {

    if (project.name == 'app') {
        apply plugin: 'com.android.application'
    } else {
        apply plugin: 'com.android.library'
    }

    repositories {
        google()
        jcenter()
    }

    apply plugin: 'checkstyle'
    task checkstyle(type: Checkstyle) {
        showViolations true
        ignoreFailures true
        configFile file(rootDir.path + &quot;/checkstyle.xml&quot;)

        source 'src/main/java'
        include '**/*.java'
        exclude '**/gen/**'
        exclude '**/R.java'
        exclude '**/BuildConfig.java'

        classpath = files()
    }

    println project.name + &quot; - root project&quot;

    android {
        compileSdkVersion 29
        buildToolsVersion &quot;29.0.2&quot;
        defaultConfig {
            minSdkVersion 23
            targetSdkVersion 29
            testInstrumentationRunner &quot;androidx.test.runner.AndroidJUnitRunner&quot;
        }

        lintOptions {
            abortOnError false
        }
    }

    dependencies {
        implementation 'androidx.appcompat:appcompat:1.1.0'
        testImplementation 'junit:junit:4.12'
        androidTestImplementation 'androidx.test.ext:junit:1.1.1'
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;subprojects scope를 보시면 일반적으로 많이 보던 코드들이 위치한 것을 확인 할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1572444544880&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    if (project.name == 'app') {
        apply plugin: 'com.android.application'
    } else {
        apply plugin: 'com.android.library'
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이 코드는 android{}와 같은 closure를 읽기 위하여 필수적으로 추가 되어야 plugin입니다.&lt;/p&gt;
&lt;p&gt;추가하지 않으면 이런 에러가 발생하게 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&amp;gt;&amp;nbsp;Could&amp;nbsp;not&amp;nbsp;find&amp;nbsp;method&amp;nbsp;android()&amp;nbsp;for&amp;nbsp;arguments&amp;nbsp;[build_cl71o7g9m073cw0qlbvvkp09h$_run_closure1$_closure5@13e29c6c]&amp;nbsp;on&amp;nbsp;project&amp;nbsp;':app'&amp;nbsp;of&amp;nbsp;type&amp;nbsp;&lt;a style=&quot;color: #ee2323;&quot; href=&quot;org.gradle.api.Project.&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;org.gradle.api.Project.&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;plugin 적용 이후부터는 각 sub module에서 사용중인 boilerplate code 성격을 띄는것들을 추가하면 됩니다. 위 샘플에서는 defaultConfig나 lintOptions, dependencies 등을 추가하고 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Task Configuration 순서는 어떻게 될까?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;task를 configuration하는 순서를 보면 root gradle file에서 subproject 대상 갯수만큼 호출되고, 그 이후에 각 모듈별로 configuration을 진행하게 됩니다. module layer 관점에서 common_module이 가장 상단에 위치한다고 해서 root 와 sub project를 먼저 configuration 하지는 않습니다. 참고로 알아두시면 좋을것 같습니다. 무조건 root가 우선이고 그 다음에 차례대로 sub project의 configuration을 실행합니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&amp;gt;&amp;nbsp;Configure&amp;nbsp;project&amp;nbsp;:&lt;br /&gt;app&amp;nbsp;-&amp;nbsp;root&amp;nbsp;project&lt;br /&gt;common_module&amp;nbsp;-&amp;nbsp;root&amp;nbsp;project&lt;br /&gt;usecase_module&amp;nbsp;-&amp;nbsp;root&amp;nbsp;project&lt;br /&gt;view_module&amp;nbsp;-&amp;nbsp;root&amp;nbsp;project&lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;Configure&amp;nbsp;project&amp;nbsp;:common_module&lt;br /&gt;common_module&amp;nbsp;sub&amp;nbsp;project&lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;Configure&amp;nbsp;project&amp;nbsp;:usecase_module&lt;br /&gt;usecase_module&amp;nbsp;sub&amp;nbsp;project&lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;nbsp;Configure&amp;nbsp;project&amp;nbsp;:view_module&lt;br /&gt;view_module&amp;nbsp;sub&amp;nbsp;project&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;allprojects와 subprojects 차이점?&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;일반적으로 대부분의 프로젝트는 subprojects closure를 사용 하면 됩니다.&lt;/p&gt;
&lt;p&gt;allprojects closure는 root에 해당하는 프로젝트의 build.gradle 도 함께 실행 시킨다는 의미로 사용이 됩니다.&lt;/p&gt;
&lt;p&gt;보통 같은 모듈의 성격을 가지는 여러 library module을 하나의 folder을 만들고 그 하단에 위치시키기도 합니다. 이 때 그 새로 생성한 folder에 build.gradle 파일을 추가하는 경우는 거의 없을 것입니다. (현업에서 한번도 보지 못했고, 필요성을 느끼지 못함)&lt;/p&gt;
&lt;p&gt;만약, 이 폴더에 build.gradle 파일을 추가하여 별도의 동작을 수행해야 한다면 allprojects closure에 추가하면 됩니다.&lt;/p&gt;
&lt;p&gt;자세한 차이점을 알고 싶다면 권남님의 위키 페이지를 참고 바랍니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;권남님 위키 : &lt;a href=&quot;https://kwonnam.pe.kr/wiki/gradle/multiproject&quot;&gt;https://kwonnam.pe.kr/wiki/gradle/multiproject&lt;/a&gt;&lt;/p&gt;</description>
      <category>Maven &amp;amp; Gradle</category>
      <category>allprojects와 subprojects 차이점</category>
      <category>android multi project</category>
      <category>gradle multiproject</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/71</guid>
      <comments>https://softwaree.tistory.com/71#entry71comment</comments>
      <pubDate>Wed, 30 Oct 2019 23:32:56 +0900</pubDate>
    </item>
    <item>
      <title>.gitignore 가 정상적으로 동작하지 않을때 해결책</title>
      <link>https://softwaree.tistory.com/70</link>
      <description>&lt;p&gt;Android Studio로 개발하다보면 파일을 추가하거나 수정할때 .gitignore에 적용된 대상임에도 changes에 자꾸 나오는 경우가 있습니다. git의 캐시가 문제가 되는것이라서 아래처럼 terminal 명령어로 수정할 수 있습니다. git 캐시 문제이기 때문에 android studio IDE 대상 이슈가 아닌 git 사용하는 전체 프로젝트에 해당 될 수 있을것 같습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;s&gt;gitignore가 git에 의하여 ignore 되고 있는 아이러니한 상황&lt;/s&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1572365614904&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git rm -r --cached .

// 변경 파일들 다시 추가 후 commit.
git add .
git commit -m &quot;fixed untracked files&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;출처 : &lt;a href=&quot;https://stackoverflow.com/a/11451731&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Stackoverflow&lt;/a&gt;&lt;/p&gt;</description>
      <category>Git</category>
      <category>git</category>
      <category>gitignore</category>
      <category>gitignore가 git에서 ignore되고 있다</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/70</guid>
      <comments>https://softwaree.tistory.com/70#entry70comment</comments>
      <pubDate>Wed, 30 Oct 2019 01:16:52 +0900</pubDate>
    </item>
    <item>
      <title>젠킨스의 build description을 커스텀 해보자. [description setter plugin]</title>
      <link>https://softwaree.tistory.com/69</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;desc.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dEV2yE/btqzmS93ZnN/OP8vYJr43Kg0rBcfRngG10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dEV2yE/btqzmS93ZnN/OP8vYJr43Kg0rBcfRngG10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dEV2yE/btqzmS93ZnN/OP8vYJr43Kg0rBcfRngG10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdEV2yE%2FbtqzmS93ZnN%2FOP8vYJr43Kg0rBcfRngG10%2Fimg.png&quot; data-filename=&quot;desc.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;젠킨스의 빌드 히스토리에 보여지는 설명 부분을 어떻게 커스텀 하는지 알아보도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;사용 용도에 따라 다양한 정보들을 노출 시킬수 있겠지만, 본 포스팅에서는 빌드된 apk 파일명과 용량. 그리고 이전 빌드 산출물 대비 용량이 어떻게 변하였는지를 노출 시켜보도록 하겠습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;description setter plugin 설치&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;플러그인 관리 페이지에 접근 후 &quot;Available&quot; 탭에서 description setter plugin을 검색 후 설치합니다. 젠킨스 재시작까지 완료 하셔야 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;desc2.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpVcEK/btqzmkFMkfs/NlRjqHWt13IGiORUhw3on1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpVcEK/btqzmkFMkfs/NlRjqHWt13IGiORUhw3on1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpVcEK/btqzmkFMkfs/NlRjqHWt13IGiORUhw3on1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpVcEK%2FbtqzmkFMkfs%2FNlRjqHWt13IGiORUhw3on1%2Fimg.png&quot; data-filename=&quot;desc2.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;워크스페이스 Configure&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;워크스페이스의 Configure 메뉴로 진입 후 execute shell에 새로운 항목을 추가해줍니다. 이미 추가된 execute shell 항목이 있다면 그 하단에 추가하여 마지막에 수행 될 수 있도록 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;본 예제 사용한 샘플 스크립트를 첨부하니 참고 바랍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1572363592811&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#!/bin/bash -xe
set +x

APK_NAME=&quot;app-debug.apk&quot;
FILE_NAME_FOR_APK_SIZE=&quot;prev_apk_size.tmp&quot;

# 현재 빌드된 APK 사이즈 계산 (in KB)
CUR_APK_SIZE=$(ls -lk app/build/outputs/apk/debug/$APK_NAME | tr -s &quot; &quot; | cut -d &quot; &quot; -f5)
CUR_APK_SIZE_IN_KB=&quot;$(($CUR_APK_SIZE/1024))&quot;

# 이전에 빌드된 APK 사이즈와 비교 후 차이 계산
PREV_APK_SIZE=0
DIFF_APK_SIZE_IN_KB=0
if [ -f &quot;$FILE_NAME_FOR_APK_SIZE&quot; ]; then
    PREV_APK_SIZE=`cat $FILE_NAME_FOR_APK_SIZE`
    PREV_APK_SIZE_IN_KB=&quot;$(($PREV_APK_SIZE/1024))&quot;
    
    DIFF_APK_SIZE_IN_KB=&quot;$(($CUR_APK_SIZE_IN_KB-$PREV_APK_SIZE_IN_KB))&quot;
fi
echo cur $CUR_APK_SIZE byte
echo prev $PREV_APK_SIZE byte

# 현재 APK 사이즈를 파일에 저장. (in byte)
echo $CUR_APK_SIZE &amp;gt; $FILE_NAME_FOR_APK_SIZE

# Description setter
echo [BUILD_DESCRIPTION] &quot;$APK_NAME $CUR_APK_SIZE_IN_KB&quot;KB &quot;(&quot;$DIFF_APK_SIZE_IN_KB&quot;KB)&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다음과 같은 과정으로 스크립트가 실행됩니다.&lt;/p&gt;
&lt;p&gt;1. 빌드된 산출물의 apk size를 읽어옵니다. byte 단위로 가져온 후 KB로 치환해줍니다.&lt;/p&gt;
&lt;p&gt;2. 이전에 빌드된 산출물의 사이즈가 파일에 저장되어 있다면 사이즈를 읽어온 후에 diff 값을 계산해줍니다.&lt;/p&gt;
&lt;p&gt;3. 다음 빌드에 사용하기 위하여 현재 산출물의 사이즈는 다시 &quot;prev_apk_size.tmp&quot; 라는 파일에 저장시켜줍니다.&lt;/p&gt;
&lt;p&gt;4. 빌드 히스토리에 보여줄 description을 콘솔에 출력합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; 콘솔에 출력하는 이유는, 적용된 플러그인이 콘솔에 출력된 텍스트로부터 정규식을 통하여 조건에 해당하는 텍스트를 가져와서 그대로 빌드 히스토리에 보여주도록 되어 있기 때문입니다. &quot;[BUILD_DESCRIPTION]&quot;라는 prefix를 붙인 이유도 정규식에서 이용하기 위함입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이제, Add post-build action 으로부터 Set build description을 선택 후 항목을 추가해줍니다.&lt;/p&gt;
&lt;p&gt;정규식 입력란에 아래와 같이 입력해줍니다. &lt;b&gt;&lt;u&gt;띄워쓰기가 맞지 않아도 제대로 값을 읽어올수가 없으니 주의하셔야 합니다.&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1572364153598&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;\[BUILD_DESCRIPTION\] (.*)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Description은 몇개의 라인을 표시할것인지를 나타냅니다. \1\2\3 과 같이 사용이 가능하며 본 샘플은 한줄만 표시하기에 \1을 입력하였습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;desc3.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Tgu3N/btqzmTOGGxk/kFECcSbHSachbhOHukhvnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Tgu3N/btqzmTOGGxk/kFECcSbHSachbhOHukhvnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Tgu3N/btqzmTOGGxk/kFECcSbHSachbhOHukhvnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTgu3N%2FbtqzmTOGGxk%2FkFECcSbHSachbhOHukhvnk%2Fimg.png&quot; data-filename=&quot;desc3.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;저장 후 빌드를 하면 APK 사이즈의 증감을 한눈에 알아 볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;단순한 문자 뿐만 아니라 html 태그도 적용 가능한데 이 부분은 추가로 포스팅 하도록 하겠습니다.&lt;/p&gt;</description>
      <category>Jenkins</category>
      <category>build description setter</category>
      <category>jenkins description</category>
      <category>빌드 설명 작성</category>
      <category>젠킨스</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/69</guid>
      <comments>https://softwaree.tistory.com/69#entry69comment</comments>
      <pubDate>Tue, 29 Oct 2019 22:18:39 +0900</pubDate>
    </item>
    <item>
      <title>Jenkins에 checkstyle plugin 적용하기</title>
      <link>https://softwaree.tistory.com/68</link>
      <description>&lt;p&gt;프로그래밍하면서 코드 스타일을 체크해주는 유용한 플러그인으로 많은 개발자들이 사용하고 있습니다. 본 포스팅에서는&amp;nbsp;Android Project에 checkstyle plugin을 적용 후 젠킨스에도 결과를 보여주도록 적용해보겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Lint 그래프 아래쪽에 Checkstyle Trend가 표시되는것을 볼 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;checkstyle.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUPktX/btqzkabeXIR/Wc6VeLr4riO1LqISMYWI70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUPktX/btqzkabeXIR/Wc6VeLr4riO1LqISMYWI70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUPktX/btqzkabeXIR/Wc6VeLr4riO1LqISMYWI70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUPktX%2FbtqzkabeXIR%2FWc6VeLr4riO1LqISMYWI70%2Fimg.png&quot; data-filename=&quot;checkstyle.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;차트를 클릭하면 상세 내용을 확인 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;checkstyle2.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpojvo/btqzk7j6xRy/pfD3zkIB4YMwtuwUO6klZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpojvo/btqzk7j6xRy/pfD3zkIB4YMwtuwUO6klZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpojvo/btqzk7j6xRy/pfD3zkIB4YMwtuwUO6klZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbpojvo%2Fbtqzk7j6xRy%2FpfD3zkIB4YMwtuwUO6klZ1%2Fimg.png&quot; data-filename=&quot;checkstyle2.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;해당 항목을 클릭하면 어떤 부분 때문에 검출이 되었는지 확인 할 수 있습니다. 본 검출 내용은 메서드 이름은 소문자로 시작하여야 하는데 대문자로 시작했기 때문에 발생된 에러입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;checkstyle3.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzk3YI/btqzjKjyd9W/XotftOQjRQdMLptw8Girk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzk3YI/btqzjKjyd9W/XotftOQjRQdMLptw8Girk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzk3YI/btqzjKjyd9W/XotftOQjRQdMLptw8Girk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbzk3YI%2FbtqzjKjyd9W%2FXotftOQjRQdMLptw8Girk0%2Fimg.png&quot; data-filename=&quot;checkstyle3.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Android 프로젝트에 checkstyle 적용&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;프로젝트가 한개일 경우에는 app/build.gradle 파일에 적용하면 되고, 여러개의 멀티 프로젝트를 운용하고 있다면 root build.gradle 파일에 아래처럼 추가합니다. checkstyle이라는 태스크를 모든 프로젝트에 적용한다는 의미로 allprojects scope에 추가하였습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1572012179316&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apply plugin: 'checkstyle'
allprojects {
    repositories {
        google()
        jcenter()
    }

    task checkstyle(type: Checkstyle) {
        showViolations true
        ignoreFailures true
        configFile file(rootDir.path + &quot;/checkstyle.xml&quot;)

        source 'src/main/java'
        include '**/*.java'
        exclude '**/gen/**'
        exclude '**/R.java'
        exclude '**/BuildConfig.java'

        classpath = files()
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;lint와 마찬가지로 checkstyle을 커스텀하여 어떤 항목들을 검출할지 수정이 가능합니다. checkstyle.xml 이라는 파일을 생성후 프로젝트 root에 위치시킵니다. 해당 파일은 이전에 추가한 task의 &quot;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;configFile&amp;nbsp;file(&lt;a style=&quot;color: #006dd7;&quot; href=&quot;rootDir.path&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;rootDir.path&lt;/a&gt;&amp;nbsp;+&amp;nbsp;&quot;/&lt;a style=&quot;color: #006dd7;&quot; href=&quot;checkstyle.xml&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;checkstyle.xml&lt;/a&gt;&quot;)&lt;/span&gt;&lt;/b&gt;&quot; 에서 읽어옵니다.&lt;/p&gt;
&lt;pre id=&quot;code_1572012300799&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot;?&amp;gt;&amp;lt;!DOCTYPE module PUBLIC
    &quot;-//Puppy Crawl//DTD Check Configuration 1.2//EN&quot;
    &quot;http://www.puppycrawl.com/dtds/configuration_1_2.dtd&quot;&amp;gt;

&amp;lt;module name=&quot;Checker&quot;&amp;gt;
    &amp;lt;module name=&quot;NewlineAtEndOfFile&quot; /&amp;gt;
    &amp;lt;module name=&quot;FileLength&quot; /&amp;gt;
    &amp;lt;module name=&quot;FileTabCharacter&quot; /&amp;gt;

    &amp;lt;module name=&quot;RegexpSingleline&quot;&amp;gt;
        &amp;lt;property name=&quot;format&quot; value=&quot;\s+$&quot; /&amp;gt;
        &amp;lt;property name=&quot;message&quot; value=&quot;Line has trailing spaces.&quot; /&amp;gt;
    &amp;lt;/module&amp;gt;

    &amp;lt;module name=&quot;TreeWalker&quot;&amp;gt;
        &amp;lt;module name=&quot;JavadocStyle&quot; /&amp;gt;
        &amp;lt;module name=&quot;ConstantName&quot; /&amp;gt;
        &amp;lt;module name=&quot;LocalFinalVariableName&quot; /&amp;gt;
        &amp;lt;module name=&quot;LocalVariableName&quot; /&amp;gt;
        &amp;lt;module name=&quot;MemberName&quot; /&amp;gt;
        &amp;lt;module name=&quot;MethodName&quot; /&amp;gt;
        &amp;lt;module name=&quot;PackageName&quot; /&amp;gt;
        &amp;lt;module name=&quot;ParameterName&quot; /&amp;gt;
        &amp;lt;module name=&quot;StaticVariableName&quot; /&amp;gt;
        &amp;lt;module name=&quot;TypeName&quot; /&amp;gt;
    &amp;lt;/module&amp;gt;
&amp;lt;/module&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;checkstyle에서 제공하는 모든 규칙들은 아래 페이지에서 확인 가능합니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://checkstyle.sourceforge.io/checks.html&quot;&gt;https://checkstyle.sourceforge.io/checks.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;실행&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;checkstyle task 를 실행하여 바로 결과를 확인 할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1572012411118&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;~/AndroidStudioProjects/JenkinsTestProject2$ ./gradlew clean checkstyle

&amp;gt; Task :app:checkstyle
[ant:checkstyle] [ERROR] /home/allsoft/AndroidStudioProjects/JenkinsTestProject2/app/src/main/java/com/owllife/jenkinstestproject/MainActivity.java:15:18: Name 'TestCheckStyle' must match pattern '^[a-z][a-zA-Z0-9]*$'. [MethodName]
Checkstyle rule violations were found. See the report at: file:///home/allsoft/AndroidStudioProjects/JenkinsTestProject2/app/build/reports/checkstyle/checkstyle.html
Checkstyle files with violations: 1
Checkstyle violations by severity: [error:1]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Jenkins에 checkstyle plugin 적용&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;젠킨스 홈에서 관리 페이지에 접근 후 plugin 관리쪽으로 진입합니다. 상단에서 &quot;&lt;a href=&quot;http://wiki.jenkins-ci.org/x/GYCGAQ&quot;&gt;Checkstyle Plug-in&lt;/a&gt;&quot; 으로 검색 후 설치하고 젠킨스를 재시작합니다. 그 다음 워크스페이스의 설정 화면으로 진입후 하단에 위치한 &lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Post-build Actions&lt;/b&gt; 섹션에서 &quot;Publish checkstyle ....&quot; 항목을 선택하고 report 파일의 경로를 작성해줍니다. html은 안되고 꼭 xml 파일 형식으로만 작성하여야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;checkstyle5.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bA45iQ/btqzjJStoCA/klvLTOqhmtpQcmEthGfK40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bA45iQ/btqzjJStoCA/klvLTOqhmtpQcmEthGfK40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bA45iQ/btqzjJStoCA/klvLTOqhmtpQcmEthGfK40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbA45iQ%2FbtqzjJStoCA%2FklvLTOqhmtpQcmEthGfK40%2Fimg.png&quot; data-filename=&quot;checkstyle5.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;현재 기점으로 해당 액션은 deprecated 되었고, Report Violation 을 사용하여야 하는데 이 부분은 차후에 다시 다루어 보도록 하겠습니다.&lt;/p&gt;</description>
      <category>Jenkins</category>
      <category>android checkstyle</category>
      <category>checkstyle</category>
      <category>jenkins checkstyle</category>
      <category>젠킨스 정적분석툴</category>
      <category>젠킨스 체크스타일</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/68</guid>
      <comments>https://softwaree.tistory.com/68#entry68comment</comments>
      <pubDate>Fri, 25 Oct 2019 23:15:06 +0900</pubDate>
    </item>
    <item>
      <title>Jenkins에 lint plugin 적용하기</title>
      <link>https://softwaree.tistory.com/67</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;blob&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcDfHL/btqzidFKh6x/W9vRETvKv2GsbEsi8XZ8tk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcDfHL/btqzidFKh6x/W9vRETvKv2GsbEsi8XZ8tk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcDfHL/btqzidFKh6x/W9vRETvKv2GsbEsi8XZ8tk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcDfHL%2FbtqzidFKh6x%2FW9vRETvKv2GsbEsi8XZ8tk%2Fimg.png&quot; data-filename=&quot;blob&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;정적 분석툴 중에 하나인 lint plugin을 Jenkins에 적용 하는 방법에 대하여 알아보려고 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Android 프로젝트는 기본적으로 lint task를 지원하고 있기 때문에 별도로 추가를 하지 않아도 사용이 가능합니다.&lt;/p&gt;
&lt;p&gt;아래처럼 터미널에 명령어를 입력하면 lint task를 수행 후 report 파일까지 생성해서 결과를 제공해주고 있습니다.&lt;/p&gt;
&lt;p&gt;이러한 report file을 jenkins에서 보여주도록 설정만 해주면 손쉽게 사용이 가능합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1571926257125&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ ./gradlew lintDebug

&amp;gt; Task :app:lintDebug
Wrote HTML report to file:///JenkinsTestProject2/app/build/reports/lint-results-debug.html
Wrote XML report to file:///JenkinsTestProject2/app/build/reports/lint-results-debug.xml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Jenkins에 lint plugin 설치&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;jenkins에서는 plugin을 따로 설치 하여야 합니다.&lt;/p&gt;
&lt;p&gt;Manage Jenkins 메뉴로 진입 후 Manage Plugins 화면으로 진입합니다. 그러면 상단에 몇개의 탭이 나오는데 &quot;Available&quot; 탭을 선택 후 &quot;lint&quot; 키워드로 검색을 합니다. 검색 결과에서 &quot;&lt;a href=&quot;https://wiki.jenkins-ci.org/display/JENKINS/Android+Lint+Plugin&quot;&gt;Android Lint Plugin&lt;/a&gt;&quot; 을 선택 후 설치를 합니다. 설치 후 jenkins server 재시작까지 한번 하도록 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;Workspace에서 설정&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;Jenkins의 workspace에서 좌측에 있는 Configure 메뉴를 선택하여 설정 화면으로 진입합니다. gradle task 입력하는 섹션 (Execute shell) 에서 &quot;./gradlew clean assembleDebug lintDebug&quot; 처럼 lintDebug를 마지막에 입력합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그리고 아래쪽에 있는 &quot;Add post-build action&quot; 메뉴 선택 후 Publish Android Lint Results&quot;를 선택합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;lint.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biMVmU/btqzhhviKas/flE6jYfktbqupxHi7tSXek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biMVmU/btqzhhviKas/flE6jYfktbqupxHi7tSXek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biMVmU/btqzhhviKas/flE6jYfktbqupxHi7tSXek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiMVmU%2FbtqzhhviKas%2FflE6jYfktbqupxHi7tSXek%2Fimg.png&quot; data-filename=&quot;lint.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;위 스크린샷처럼 Lint files 에 lint 파일명을 입력합니다. 정확한 경로를 입력하여도 되지만 정규식 표현으로 대략적으로 입력하여도 표시가 가능하니 참고 바랍니다. 위와같이 입력 후 저장하고 빌드를 수행하면 lint task 수행 후 workspace 메인 화면에 그래프 형태로 결과를 보여주게 됩니다. 수정사항을 반영할때마다 lint 결과 갯수에 바로 반영이 되므로 지속적으로 관리하기에 용이합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;빌드 에러 발생시?&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;lint task 수행중에 이슈가 발견되어 빌드가 중지되는 경우에는 아래처럼 옵션을 설정합니다. build.gradle 파일의 android scope에 추가하면 정상적으로 빌드가 진행됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1572008780031&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;android {

    .... 중략

    lintOptions {
        abortOnError false
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;lint option 설명 페이지 참고&lt;br /&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;http://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.LintOptions.html&quot;&gt;http://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.LintOptions.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Lint 룰 적용&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;lint의 많은 rule중에서 필요한 부분만 적용하고 그 이외에는 ignore 시킬수가 있습니다.&lt;/p&gt;
&lt;p&gt;app이나 library 프로젝트 내부의 build.gradle 파일이 위치한 곳에 lint.xml 이라는 파일을 아래처럼 작성하면 lint task가 실행될때 lint.xml 파일을 읽은 후 rule대로 처리하게 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1572008855689&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;lint&amp;gt;
    &amp;lt;issue id=&quot;AllowBackup&quot; severity=&quot;ignore&quot; /&amp;gt;
    &amp;lt;issue id=&quot;AaptCrash&quot; severity=&quot;ignore&quot; /&amp;gt;
    &amp;lt;issue id=&quot;AccidentalOctal&quot; severity=&quot;ignore&quot; /&amp;gt;
    &amp;lt;issue id=&quot;AdapterViewChildren&quot; severity=&quot;ignore&quot; /&amp;gt;
    &amp;lt;issue id=&quot;AddJavascriptInterface&quot; severity=&quot;ignore&quot; /&amp;gt;
    &amp;lt;issue id=&quot;AllowBackup&quot; severity=&quot;ignore&quot; /&amp;gt;
    &amp;lt;issue id=&quot;AlwaysShowAction&quot; severity=&quot;ignore&quot; /&amp;gt;

    ... 생략
&amp;lt;/lint&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Lint task 구조&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;소스 코드 파일과 lint.xml 룰을 이용하여 툴이 동작.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;lint.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MjLEG/btqzjha0T6z/aTViFjlXGKwirEPkiJ5gX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MjLEG/btqzjha0T6z/aTViFjlXGKwirEPkiJ5gX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MjLEG/btqzjha0T6z/aTViFjlXGKwirEPkiJ5gX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMjLEG%2Fbtqzjha0T6z%2FaTViFjlXGKwirEPkiJ5gX1%2Fimg.png&quot; data-filename=&quot;lint.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;상세 설명 페이지&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://developer.android.com/studio/build/index.html&quot;&gt;https://developer.android.com/studio/build/index.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Jenkins</category>
      <category>jenkins</category>
      <category>lint</category>
      <category>lint plugin</category>
      <category>젠킨스 정적분석</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/67</guid>
      <comments>https://softwaree.tistory.com/67#entry67comment</comments>
      <pubDate>Thu, 24 Oct 2019 23:19:39 +0900</pubDate>
    </item>
    <item>
      <title>Jenkins Publickey 에러로 repository 접근할 때 error 발생하는 이슈 해결. (ssh 키 생성 및 등록)</title>
      <link>https://softwaree.tistory.com/66</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;에러 내용&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Failed to connect to repository.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Permission denied (publickey).&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;fatal: 리모트 저장소에서 읽을 수 없습니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;blob&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTFGtS/btqzhri4Eth/TS4HFXsMfFdLLwkLUXucKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTFGtS/btqzhri4Eth/TS4HFXsMfFdLLwkLUXucKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTFGtS/btqzhri4Eth/TS4HFXsMfFdLLwkLUXucKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTFGtS%2Fbtqzhri4Eth%2FTS4HFXsMfFdLLwkLUXucKk%2Fimg.png&quot; data-filename=&quot;blob&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;정상적으로 저장소에 접근이 가능한 경우&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;jenkins_normal.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMX6xc/btqzf4I7TM0/DDodaCeYqpkB7bJ1zPAsDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMX6xc/btqzf4I7TM0/DDodaCeYqpkB7bJ1zPAsDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMX6xc/btqzf4I7TM0/DDodaCeYqpkB7bJ1zPAsDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMX6xc%2Fbtqzf4I7TM0%2FDDodaCeYqpkB7bJ1zPAsDk%2Fimg.png&quot; data-filename=&quot;jenkins_normal.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;원인&lt;/h2&gt;
&lt;p&gt;public repository라면 url만 입력해도 바로 연동이 되지만 private repository인 경우에는 ssh key를 등록하여야 정상적으로 git 반영이 가능합니다. ssh 키 생성 및 repository에 등록하는 과정을 알아보도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;인증키 만들기&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;인증키는 ssh-keygen으로 생성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1571845195369&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ cd ~/.ssh
$ ls

만약 id_rsa / id_rsa.pub 와 같은 키 쌍이 존재한다면 키 생성없이 바로 등록 과정을 거쳐도 됩니다.

// 없는 경우에는 키 생성
:~/.ssh$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/allsoft/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/allsoft/.ssh/id_rsa.
Your public key has been saved in /home/allsoft/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:KxoQ6MNVJZh3pWqUsbObfl9d4zavt6ruK2+D5jIO4q0 allsoft@allsoft-ubuntu
The key's randomart image is:
+---[RSA 2048]----+
|    o+....       |
| . o..=..        |
|. ...=..         |
|o ... +          |
| +.  +  S      o |
|  ... o  .  . o .|
|   ..+. . .. . + |
|  . +o.= +.o  . +|
|   Eooo.*o**+.o+o|
+----[SHA256]-----+

// 키 생성시 비밀번호는 입력하지 않아도 됩니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;인증키를 메모리에 상주 시키고 키 등록&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1571845278117&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;~/.ssh$ eval $(ssh-agent -s)
Agent pid 9071
~/.ssh$ ssh-add ~/.ssh/id_rsa
Identity added: /home/allsoft/.ssh/id_rsa (/home/allsoft/.ssh/id_rsa)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ssh-agent 를 이용하여 인증키를 메모리에 상주시켜두면 한번만 인증키 암호를 입력하면 다음부터는 입력하지 않아도 같은 인증키를 사용하는 모든 서버들에 접속 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;private repository의 설정에 ssh 키 등록&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;방금 생성한 public key를 repository의 설정에 등록합니다. 등록하면 젠킨스에서 바로 접근이 가능합니다.&lt;/p&gt;
&lt;p&gt;본 예제의 경우에는 gitlab에서 테스트를 하였기 때문에 gitlab의 settings에서 키를 등록해줍니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;gitlab.com의 User settings(profile) 진입 후 SSH Keys 선택&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;입력할 public key는 아래처럼 command로 확인 가능. 복사 해서 붙여넣기 후 저장합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1571845618642&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;allsoft@allsoft-ubuntu:~/.ssh$ cat id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC........ allsoft@allsoft-ubuntu
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;aaa.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IJZZY/btqzib063ya/GE5Z2WkBxDMtKd8hiUkHP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IJZZY/btqzib063ya/GE5Z2WkBxDMtKd8hiUkHP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IJZZY/btqzib063ya/GE5Z2WkBxDMtKd8hiUkHP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIJZZY%2Fbtqzib063ya%2FGE5Z2WkBxDMtKd8hiUkHP1%2Fimg.png&quot; data-filename=&quot;aaa.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Jenkins Credentials 추가&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;jenkins 워크스페이스 설정에서 repository url 입력시 private key를 선택하도록 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;bbbb.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqwylq/btqzhJw0Zt3/n2WsmKmYINhZht0K3rzUOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqwylq/btqzhJw0Zt3/n2WsmKmYINhZht0K3rzUOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqwylq/btqzhJw0Zt3/n2WsmKmYINhZht0K3rzUOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbqwylq%2FbtqzhJw0Zt3%2Fn2WsmKmYINhZht0K3rzUOK%2Fimg.png&quot; data-filename=&quot;bbbb.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;- Kind에서 SSH Username with private key 를 선택&lt;/p&gt;
&lt;p&gt;- ID 및 username는 입력하지 않음.&lt;/p&gt;
&lt;p&gt;- Description은 키 이름 입력&lt;/p&gt;
&lt;p&gt;- Private Key에서 직접 입력을 선택 하고 Add Key 버튼 선택 후 private key를 직접 입력합니다.&lt;/p&gt;
&lt;p&gt;- Passphrase는 키 생성시 입력하지 않았으므로 빈칸으로 비워둡니다.&lt;/p&gt;
&lt;p&gt;- Add 버튼 클릭&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Credentials 선택&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;위에서 생성한 키를 선택후 잠시 기다리면 정상적으로 접근이 가능하다는 표시로 에러 문구가 사라집니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;ccc.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dMsSq3/btqzfGBWUQY/JJxbj1MWVeHwEPuBJbLBB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dMsSq3/btqzfGBWUQY/JJxbj1MWVeHwEPuBJbLBB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dMsSq3/btqzfGBWUQY/JJxbj1MWVeHwEPuBJbLBB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdMsSq3%2FbtqzfGBWUQY%2FJJxbj1MWVeHwEPuBJbLBB0%2Fimg.png&quot; data-filename=&quot;ccc.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이제부터 정상적으로 저장소에 접근이 가능합니다.&lt;/p&gt;</description>
      <category>Jenkins</category>
      <category>jenkins</category>
      <category>jenkins publickey 에러</category>
      <category>jenkins 키 생성</category>
      <category>permission denied(publickey)</category>
      <category>ssh 키 생성</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/66</guid>
      <comments>https://softwaree.tistory.com/66#entry66comment</comments>
      <pubDate>Thu, 24 Oct 2019 00:59:08 +0900</pubDate>
    </item>
    <item>
      <title>deal with와 handle 차이점.</title>
      <link>https://softwaree.tistory.com/65</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;deal with&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;- 누군가와 거래를 한다. (+someone)&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;- with가 있으므로 누군가와 의사소통을 통해서 해결을 보려는 느낌.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I usually &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;deal with&lt;/b&gt; &lt;/span&gt;patients with depression.&lt;/p&gt;
&lt;p&gt;저는 우울증을 앓고 있는 환자들을 주로 다룹니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;handle&lt;/b&gt;&lt;/h3&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;You can borrow my car if you &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;handle&lt;/b&gt;&lt;/span&gt; a stick.&lt;/p&gt;
&lt;p&gt;너 스틱 다룰 줄 알면 내 차 빌려도 돼.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I think i can &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;handle&lt;/b&gt;&lt;/span&gt; it.&lt;/p&gt;
&lt;p&gt;내 생각에 다룰 수 있을것 같아.&lt;/p&gt;</description>
      <category>영어</category>
      <category>deal with와 handle 차이</category>
      <category>영어회화</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/65</guid>
      <comments>https://softwaree.tistory.com/65#entry65comment</comments>
      <pubDate>Thu, 24 Oct 2019 00:08:59 +0900</pubDate>
    </item>
    <item>
      <title>apply 의 또 다른 의미에 대하여 알아보자.</title>
      <link>https://softwaree.tistory.com/64</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;apply&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;적용시키다 / 적용하다&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;The same principle &lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;can be applied to&lt;/span&gt;&lt;/b&gt; pretty much any skill or profession.&lt;/p&gt;
&lt;p&gt;같은 원칙이 적용이 될 수 있다. 그 어떤 기술이나 직업에도&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;많이 사용되는 다른 의미&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;바르다&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Apply&lt;/b&gt;&lt;/span&gt; just a small amount on the wound.&lt;/p&gt;
&lt;p&gt;약을 상처에 바르다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Apply&lt;/b&gt;&lt;/span&gt; plenty of lotion ...&lt;/p&gt;
&lt;p&gt;로션을 바르다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;해당된다&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;There are no exceptions.&lt;/p&gt;
&lt;p&gt;예외는 없다.&lt;/p&gt;
&lt;p&gt;This policy &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;applies&lt;/b&gt;&lt;/span&gt; to all employees.&lt;/p&gt;
&lt;p&gt;이 정책은 모든 직원에게 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;해당된다&lt;/b&gt;&lt;/span&gt;. (적용된다.)&lt;/p&gt;</description>
      <category>영어</category>
      <category>apply의미</category>
      <category>영어회화</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/64</guid>
      <comments>https://softwaree.tistory.com/64#entry64comment</comments>
      <pubDate>Wed, 23 Oct 2019 23:51:15 +0900</pubDate>
    </item>
    <item>
      <title>Jenkins에서 Github 저장소에 있는 Gradle 기반의 Android 프로젝트 생성하기</title>
      <link>https://softwaree.tistory.com/62</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;사전 조건&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: square;&quot; data-ke-list-type=&quot;square&quot;&gt;
&lt;li&gt;android sdk 설치 및 경로 확인&lt;br /&gt;ex) /home/allsoft/tools/android-sdk&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ANDROID_HOME 환경변수 설정&lt;/h4&gt;
&lt;p&gt;1. Jenkins의 Manage Jenkins 메뉴 선택&lt;/p&gt;
&lt;p&gt;2. 상단에 있는 Configure System 메뉴 선택&lt;/p&gt;
&lt;p&gt;3. Global properties 섹션에 있는 Environment variables 체크&lt;/p&gt;
&lt;p&gt;4. Add 선택&lt;/p&gt;
&lt;p&gt;5. Name에 ANDROID_HOME 입력&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; Value에 android sdk 경로 입력 (ex. /home/allsoft/tools/android-sdk)&lt;/p&gt;
&lt;p&gt;6. SAVE&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;WORKSPACE 생성&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;1. Jenkins 홈에서 새 항목 생성&lt;/p&gt;
&lt;p&gt;2. 항목 이름 입력 및 &quot;Freestyle project&quot; 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;jenkins1.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/duXM7d/btqy92DdDSr/s6gHkKwK3yCmeaJRuANs7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/duXM7d/btqy92DdDSr/s6gHkKwK3yCmeaJRuANs7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/duXM7d/btqy92DdDSr/s6gHkKwK3yCmeaJRuANs7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FduXM7d%2Fbtqy92DdDSr%2Fs6gHkKwK3yCmeaJRuANs7K%2Fimg.png&quot; data-filename=&quot;jenkins1.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3. 소스코드 관리쪽에서 Git 선택 및 repository url 입력. 브랜치는 디폴트가 master이고 다른 브랜치도 입력 가능.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;jenkins2.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KrZX4/btqy91deezP/Cn11YubvG0cr4nnnMQ1WGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KrZX4/btqy91deezP/Cn11YubvG0cr4nnnMQ1WGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KrZX4/btqy91deezP/Cn11YubvG0cr4nnnMQ1WGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKrZX4%2Fbtqy91deezP%2FCn11YubvG0cr4nnnMQ1WGK%2Fimg.png&quot; data-filename=&quot;jenkins2.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Trouble Shooting&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;만약 private 저장소를 이용하고 있다면 ssh 키 등록을 해야 하는데 하기 링크 참고&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://softwaree.tistory.com/66&quot;&gt;https://softwaree.tistory.com/66&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;4. Build 섹션에서 Add build step 선택 후 Execute shell 선택.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- Gradle 빌드라서 &quot;Invoke Gradle script&quot;를 선택하면 별도의 추가 작업이 필요하므로 선택하지 않고&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 자유도가 높은 &quot;Execute shell&quot; 선택.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- Android Studio 의 터미널에서 빌드하는것과 같은 command를 그대로 입력.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;gradle wrapper를 통해 빌드하므로 ./gradlew를 입력하고, 실행할 task들 입력.&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;jenkins3.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T68iX/btqy9FBtGWG/UCysFpN9J99xQ6xdTFsoB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T68iX/btqy9FBtGWG/UCysFpN9J99xQ6xdTFsoB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T68iX/btqy9FBtGWG/UCysFpN9J99xQ6xdTFsoB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT68iX%2Fbtqy9FBtGWG%2FUCysFpN9J99xQ6xdTFsoB1%2Fimg.png&quot; data-filename=&quot;jenkins3.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;5. &lt;span style=&quot;color: #333333;&quot;&gt;APK 산출물이 보이도록 &lt;/span&gt;설정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;jenkins_build_artifact.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOT9N5/btqy6dz5jlz/MwSR8u1YJYycSfg9mdSxhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOT9N5/btqy6dz5jlz/MwSR8u1YJYycSfg9mdSxhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOT9N5/btqy6dz5jlz/MwSR8u1YJYycSfg9mdSxhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOT9N5%2Fbtqy6dz5jlz%2FMwSR8u1YJYycSfg9mdSxhk%2Fimg.png&quot; data-filename=&quot;jenkins_build_artifact.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;6. &quot;SAVE&quot; 선택 후 좌측의 &quot;Build Now&quot; 클릭. 좌측에 Build Histroy에서 빌드 진행 확인.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;jenkins5.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmF5f2/btqy67TIhRY/BsPIBI7F4AWa4h5a7PCMG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmF5f2/btqy67TIhRY/BsPIBI7F4AWa4h5a7PCMG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmF5f2/btqy67TIhRY/BsPIBI7F4AWa4h5a7PCMG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmF5f2%2Fbtqy67TIhRY%2FBsPIBI7F4AWa4h5a7PCMG0%2Fimg.png&quot; data-filename=&quot;jenkins5.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;7. 빌드가 완료되면 artifacts(APK) 확인.&lt;/p&gt;</description>
      <category>Jenkins</category>
      <category>github</category>
      <category>gradle 빌드</category>
      <category>jenkins</category>
      <category>젠킨스</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/62</guid>
      <comments>https://softwaree.tistory.com/62#entry62comment</comments>
      <pubDate>Thu, 17 Oct 2019 23:03:46 +0900</pubDate>
    </item>
    <item>
      <title>우분투 18.04 젠킨스 설치</title>
      <link>https://softwaree.tistory.com/61</link>
      <description>&lt;p&gt;1. 자바 설치 확인 &lt;a href=&quot;https://softwaree.tistory.com/82&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;(링크)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2. apt-get 을 이용하여 Jenkins 설치.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;저장소 key 다운로드 및 sources.list에 추가.&lt;/p&gt;
&lt;pre id=&quot;code_1571311532811&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add -
OK
$ echo deb http://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list
deb http://pkg.jenkins.io/debian-stable binary/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;apt-get 업데이트 및 jenkins 설치&lt;/p&gt;
&lt;pre id=&quot;code_1571311631796&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo apt-get update
$ sudo apt-get install jenkins&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;3. 다른 서비스에서 젠킨스 기본 포트인 8080을 이미 사용하고 있다면 포트를 변경해야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1571311825467&quot; class=&quot;html xml&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; cursor: default; z-index: 1;&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo vi /etc/default/jenkins&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1571311825467&quot; class=&quot;html xml&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; cursor: default; z-index: 1;&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;HTTP_PORT=8080

윗 부분을 찾아서 포트 번호 변경.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;4. 젠킨스 서비스 재시작.&lt;/p&gt;
&lt;pre id=&quot;code_1571311674135&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo service jenkins restart&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;+ 젠킨스 서비스 상태 확인. Active 상태인지 확인.&lt;/p&gt;
&lt;pre id=&quot;code_1571312499526&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;owllife@owllife-ubuntu:~$ sudo systemctl status jenkins
[sudo] owllife의 암호: 
● jenkins.service - LSB: Start Jenkins at boot time
   Loaded: loaded (/etc/init.d/jenkins; generated)
   Active: active (exited) since Thu 2019-10-17 20:35:53 KST; 3min 57s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 9369 ExecStop=/etc/init.d/jenkins stop (code=exited, status=0/SUCCESS)
  Process: 9417 ExecStart=/etc/init.d/jenkins start (code=exited, status=0/SUCCESS)

10월 17 20:35:51 owllife-ubuntu systemd[1]: Starting LSB: Start Jenkins at boot time...
10월 17 20:35:52 owllife-ubuntu jenkins[9417]: Correct java version found
10월 17 20:35:52 owllife-ubuntu jenkins[9417]:  * Starting Jenkins Automation Server jenkins
10월 17 20:35:52 owllife-ubuntu su[9459]: Successful su for jenkins by root
10월 17 20:35:52 owllife-ubuntu su[9459]: + ??? root:jenkins
10월 17 20:35:52 owllife-ubuntu su[9459]: pam_unix(su:session): session opened for user jenkins by (
10월 17 20:35:52 owllife-ubuntu su[9459]: pam_unix(su:session): session closed for user jenkins
10월 17 20:35:53 owllife-ubuntu jenkins[9417]:    ...done.
10월 17 20:35:53 owllife-ubuntu systemd[1]: Started LSB: Start Jenkins at boot time.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;5. 브라우저(크롬 등)를 열고 &quot;&lt;a href=&quot;http://localhost:8080/&quot;&gt;http://localhost:8080/&lt;/a&gt;&quot; 입력. (포트 번호 맞춰서)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;6. 처음 접속시 한번에 한해서 admin password 입력해야 함.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;비밀번호 확인은?&lt;/p&gt;
&lt;pre id=&quot;code_1571311899665&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo cat /var/lib/jenkins/secrets/initialAdminPassword&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;비밀번호 확인 후 웹브라우저에 입력.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;7. 추천 플러그인 설치.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; (시간 좀 걸림)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;8. 첫 관리자 계정 생성.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;이것저것 정보 입력 후 하단에 있는 &quot;Save and continue&quot; 선택.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;9. 만약 웹페이지가 정상적으로 보이지 않는다면 젠킨스 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;서비스 재실행(5~6번 과정)&lt;/b&gt; &lt;/span&gt;후 웹페이지 다시 접속.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 8번에서 생성한 관리자 계정으로 로그인.&lt;/p&gt;</description>
      <category>Jenkins</category>
      <category>CI</category>
      <category>jenkins</category>
      <category>우분투18.04</category>
      <category>젠킨스</category>
      <category>형상관리</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/61</guid>
      <comments>https://softwaree.tistory.com/61#entry61comment</comments>
      <pubDate>Thu, 17 Oct 2019 20:37:44 +0900</pubDate>
    </item>
    <item>
      <title>must have 를 제대로 이해해봐요.</title>
      <link>https://softwaree.tistory.com/60</link>
      <description>&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;must have : 학교에서 보통 &quot;~ 했음에 틀림 없다&quot; 로 배움. 이건 잘못된 표현..&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;* must have&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. ~했나봐&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2.~했던 모양이야&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3.~했겠다&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;친구랑 밥을 먹고 있는데 정말 허겁지겁 먹고 있는 상황. 어떤 말을 하면 될까요?&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&quot;너 정말 배 고팠음에 틀림 없다&quot; 라고 이해하면 매우 어색.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&quot;너 정말 배 고팠나봐~~!!&quot; 로 해석하는게 훨씬 자연스러움.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Wow, you must've been really hungry, dude!!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;너 정말 짜증났겠다!!&lt;/p&gt;
&lt;p&gt;You &lt;span style=&quot;color: #f89009;&quot;&gt;must've&lt;/span&gt; been really frustrated!!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;교통사고가 발생했나봐.&lt;/p&gt;
&lt;p&gt;There &lt;span style=&quot;color: #f89009;&quot;&gt;must've been&lt;/span&gt; a traffic accident.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;제 친구 중 하나가요. 최근에 일을 그만뒀어요.&lt;/p&gt;
&lt;p&gt;One of my friends recently quit her job.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;글쎄요. 뭐.. 상사랑 문제가 좀 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;있었나보죠&lt;/b&gt;&lt;/span&gt;?&lt;/p&gt;
&lt;p&gt;I don't know. She &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;must've&lt;/b&gt; &lt;b&gt;had&lt;/b&gt;&lt;/span&gt; some problems with her boss.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그게 아니라면 갑자기 몸이 안좋아졌던거일 수도 있어요.&lt;/p&gt;
&lt;p&gt;Either that or, he might've had some health problems.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;어쨌든, 걔가 그 일이 질려서 그랬었을리가 없어.&lt;/p&gt;
&lt;p&gt;Either way, it &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;couldn't have been&lt;/b&gt;&lt;/span&gt; &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;because&lt;/span&gt;&lt;/b&gt; he was sick and tired of the job.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;couldn't + have + been&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;{couldn't've been} 발음.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;배고파서 그래. &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;심심해서 그래. &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;졸려서 그래.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt; ~~~해서 그래.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;보통 &quot;It's because + &amp;lt;....&amp;gt; 로 표현.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;is&amp;nbsp; 자리에 couldn't have been 을 넣으면 됨.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>영어</category>
      <category>couldn't have been because</category>
      <category>must have been</category>
      <category>must hve</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/60</guid>
      <comments>https://softwaree.tistory.com/60#entry60comment</comments>
      <pubDate>Tue, 15 Oct 2019 22:42:05 +0900</pubDate>
    </item>
    <item>
      <title>영어회화. &amp;quot;내가 알기로는&amp;quot;, &amp;quot;내가 듣기로는&amp;quot;, &amp;quot;내가 보기에는&amp;quot; 표현법</title>
      <link>https://softwaree.tistory.com/59</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;내가 알기로는, ... (보고형식)&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;as i know....... (완전히 틀린 표현)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;as far as I know (understand) 가 정확한 표현&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;...based on +&lt;/p&gt;
&lt;p&gt;...according to +&lt;/p&gt;
&lt;p&gt;To my knowledge, ....&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Based on what i know&lt;/b&gt;&lt;/span&gt;, ...&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;According to what i know&lt;/b&gt;&lt;/span&gt;, ...&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&quot;&lt;b&gt;As far as i know&lt;/b&gt;, that movie is releasing this week.&quot;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;내가 듣기로는, ...&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(보고형식)&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;from what i hear&lt;/b&gt;&lt;/span&gt; (현재형. 현재도 계속 이어져서 듣고 있는중인...)&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;from what i heard&lt;/span&gt; (과거형.)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;From what i hear, he bought a new car.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;내가 보기에는, ... (내 관점, 판단 형식)&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;The way I see it,&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;내가 보기에는 타이밍의 문제였어.&lt;/p&gt;
&lt;p&gt;The way i see it, the timing was the problem.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;내 생각에는&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;in my thinking (틀린 표현)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>영어</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/59</guid>
      <comments>https://softwaree.tistory.com/59#entry59comment</comments>
      <pubDate>Mon, 14 Oct 2019 21:19:27 +0900</pubDate>
    </item>
    <item>
      <title>원어민들이 사용하는 표현. so와 that's why의 차이점 / &amp;quot;누구에게 무엇을 주다&amp;quot; 표현.</title>
      <link>https://softwaree.tistory.com/58</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;that's why&lt;/h2&gt;
&lt;p&gt;폰 배터리가 다 되어 꺼졌어. &lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;그래서&lt;/span&gt;&lt;/b&gt; 전화 못한거였어.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&quot;그래서&quot; 를 보통 so 를 사용하는데 잘못됨.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;that's why 사용이 맞음.&lt;/p&gt;
&lt;p&gt;이유 설명. (해명 하는 상황)&lt;/p&gt;
&lt;p&gt;My phone ran out of battery. &lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;That's why&lt;/span&gt;&lt;/b&gt; I couldn't call you.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;so&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;어떤 일이 일어나서 대처하는 행위 설명 할때 사용. 인과 관계.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;손을 다쳤어. 그래서 병원에 갔어.&lt;/p&gt;
&lt;p&gt;I hurt my hand. &lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;So&lt;/span&gt;&lt;/b&gt; I went to the hospital.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;----------&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;----------&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;----------&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;----------&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;----------&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;------&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;누구에게 무엇을 주다&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;부모님에게 돈을 드렸어요.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;보통 아래처럼 사용하지만, &lt;span style=&quot;color: #ee2323;&quot;&gt;잘못된 사용.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;I gave some money to my parents.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;맞는 표현&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;I gave my parents some money.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;대명사가 있는 경우에는 대명사를 먼저 말하고, 아닌것은 뒤로 배치 하는게 일반적으로 사용하는 표현.&lt;/p&gt;
&lt;p&gt;I gave &lt;span style=&quot;color: #f89009;&quot;&gt;them some money&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;하지만, 둘다 대명사인 경우에는 아래처럼 사용함.&lt;/p&gt;
&lt;p&gt;I gave &lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;it&lt;/span&gt;&lt;/b&gt; to &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;them&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=TjCQUNJpiL8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;출처 : 유투브 라이브 아카데미&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <category>영어</category>
      <category>so와 that's why</category>
      <category>라이브아카데미</category>
      <category>시급한 교정</category>
      <category>영어회화</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/58</guid>
      <comments>https://softwaree.tistory.com/58#entry58comment</comments>
      <pubDate>Sun, 13 Oct 2019 22:53:31 +0900</pubDate>
    </item>
    <item>
      <title>[영어회화] instead of ~ 와 for ~ 차이점</title>
      <link>https://softwaree.tistory.com/57</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;instead of me&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;대신 ~을 하다&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이익이나 혜택이 여러사람에게 갈때 사용&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;우리 발표자가 갑자기 아파서 제가 대신 발표를 하게 됐어요.&lt;/p&gt;
&lt;p&gt;Our presenter suddenly got sick&lt;/p&gt;
&lt;p&gt;so i had to give the presentation &lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;instead of her&lt;/span&gt;&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;gt; 팀 프로젝트는 개인이 아니라 여러명이 속해있고, 다수가 결과에 영향을 받기 때문에 for ~가 아닌 instead of ~를 사용해야 함.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;~가 아니라 / ~ 말고&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Hey, can i get the salad &lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;instead of&lt;/span&gt;&lt;/b&gt; the soup?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&quot;&lt;b&gt;instead of + ing&lt;/b&gt;&quot; 형태도 많이 사용됨.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;I arrived a little early so &lt;span style=&quot;color: #f89009;&quot;&gt;instead of just waiting&lt;/span&gt;, I looked around the neighborhood.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;조금 일찍 도착해서 그냥 마냥 기다리는 대신 동네 구경을 좀 했어.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;for me&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;대신 ~을 해주다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;이익이나 혜택이 한사람(개인)에게 갈때 사용&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;내가 시간이 안될거 같아서 그러는데,&lt;/p&gt;
&lt;p&gt;이 책 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;나 대신&lt;/b&gt;&lt;/span&gt;에 좀 반납&lt;span style=&quot;color: #f89009;&quot;&gt;해줄래&lt;/span&gt;? 내가 나중에 밥사줄게.&lt;/p&gt;
&lt;p&gt;Could you return this book&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt; for me&lt;/span&gt;&lt;/b&gt;?&lt;/p&gt;
&lt;p&gt;(x) instead of&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&quot;대신 좀 받아줘(받아줄래?)&quot;&lt;/p&gt;
&lt;p&gt;Hey, I'm cooking right now. Can you get that &lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;for me&lt;/span&gt;&lt;/b&gt;?&lt;/p&gt;</description>
      <category>영어</category>
      <category>instead of 와 for ~ 차이</category>
      <category>영어회화</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/57</guid>
      <comments>https://softwaree.tistory.com/57#entry57comment</comments>
      <pubDate>Sat, 12 Oct 2019 22:51:15 +0900</pubDate>
    </item>
    <item>
      <title>[영어회화] 누구를 비난하다 / 누구를 탓하다 의 차이점.</title>
      <link>https://softwaree.tistory.com/56</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Blame&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;~을 탓하다, ~책임으로 보다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Don't blame me.&lt;/p&gt;
&lt;p&gt;내 탓하지마.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Criticize&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;누구를 비난하다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The athlete &lt;span style=&quot;color: #f89009;&quot;&gt;was criticized&lt;/span&gt; by people for taking drugs.&lt;/p&gt;
&lt;p&gt;그 운동선수는 약물 복용을 해서 사람들로부터 비난을 받았다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;You have no right &lt;span style=&quot;color: #f89009;&quot;&gt;to criticize&lt;/span&gt; me.&lt;/p&gt;
&lt;p&gt;너는 나를 비난할 권리가 없어.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;It's easy &lt;span style=&quot;color: #f89009;&quot;&gt;to criticize&lt;/span&gt; others.&lt;/p&gt;
&lt;p&gt;남의 말 하기는 쉽다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>영어</category>
      <category>blame과 criticize</category>
      <category>영어회화</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/56</guid>
      <comments>https://softwaree.tistory.com/56#entry56comment</comments>
      <pubDate>Sat, 12 Oct 2019 22:36:28 +0900</pubDate>
    </item>
    <item>
      <title>[영어회화] by와 until에 대하여 정확히 알고 사용하기.</title>
      <link>https://softwaree.tistory.com/55</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;■ until&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;무엇을 언제까지 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;지속적으로 반복해서 그때까지 완료&lt;/b&gt;&lt;/span&gt;하다.&lt;/p&gt;
&lt;p&gt;I'm going to study &lt;span style=&quot;color: #f89009;&quot;&gt;until&lt;/span&gt; 10 o'clock.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I have to finish this &lt;span style=&quot;color: #ee2323;&quot;&gt;until 2 o'clock.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2시까지 끝내고 또 끝내고 계속 끝내다. 올바른 의미가 아님.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Hey, let's wait until 6 o'clock.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;6시까지 (계속해서) 기다리자.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;And if she's not have until then we can just leave without her.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;만약 그녀가 오지 않으면 그녀 없이 출발하자.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;■&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;by&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;~까지 끝내야 돼&quot; - 기한&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;(그 전에 끝내면 더 좋다.)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;I have to submit this &lt;span style=&quot;color: #f89009;&quot;&gt;by Wednesday.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;나 이거 수요일까지 제출해야 해. (그 전에 제출하면 더 좋음)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;I have to finish this &lt;span style=&quot;color: #f89009;&quot;&gt;by the end of the day today.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나 이거 오늘까지 끝내야 해.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I have to be in Jongro &lt;span style=&quot;color: #f89009;&quot;&gt;by 2 o'clock.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;나 2시까지 종로에 가야해.&lt;/p&gt;</description>
      <category>영어</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/55</guid>
      <comments>https://softwaree.tistory.com/55#entry55comment</comments>
      <pubDate>Fri, 11 Oct 2019 20:33:48 +0900</pubDate>
    </item>
    <item>
      <title>미국인들이 자주 사용하는 실생활 표현 : for ~ing 표현 | 다른데, 딴데, 다른사람, 다른거 등 표현</title>
      <link>https://softwaree.tistory.com/54</link>
      <description>&lt;p style=&quot;font-size: 1.12em;&quot;&gt;■ &lt;span&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;for ~ing&lt;/b&gt;&lt;/span&gt; 은 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;용도&lt;/b&gt;&lt;/span&gt;! 를 의미, 존재의 목적 (~용)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;~을 하기 위해&amp;rsquo; 라는 의미가 아니다. (의도)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;이 버튼은 볼륨을 조절하기 위한거야.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;This button is&lt;span style=&quot;color: #f89009;&quot;&gt; for&lt;/span&gt; &lt;span style=&quot;color: #f89009;&quot;&gt;adjusting&lt;/span&gt; the volume.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;노트를 작성하려고 이 노트북을 샀어.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;I bought this notebook &lt;span style=&quot;color: #f89009;&quot;&gt;for taking&lt;/span&gt; notes.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;이 케익은 먹기 위한게 아니야. 장식용이야.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;This cake is not for eating - it&amp;rsquo;s &lt;span style=&quot;color: #f89009;&quot;&gt;for decorating&lt;/span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;내 지갑안에, 동전을 가지고 다니기 위한 작은 지갑이 있어.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;In my wallet, there is a small pocket &lt;span style=&quot;color: #f89009;&quot;&gt;for carrying&lt;/span&gt; coins.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;나는 영어 공부하려고 매일 여기에 와. &lt;b&gt;(용도 X) (의도)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;I come here &lt;span style=&quot;color: #006dd7;&quot;&gt;to study&lt;/span&gt; English.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;나는 사람들이 그들의 영어실력을 올리는 것을 돕기 위해 이 비디오들을 만들어. &lt;b&gt;(용도 X) (의도)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;I make these videos &lt;span style=&quot;color: #006dd7;&quot;&gt;to help&lt;/span&gt; people improve their english.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;■ 딴데로 | 다른데 | 다른거 | 다른사람&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;딴: some other ~&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;딴걸로: something else&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;■ &lt;/span&gt;딴데로 갔어&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;틀린 표현: other place, another place&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;another place 가 안돼는 이유는 이건 기존것이 있고 또 추가하는 느낌&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;맞는 표현: &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;somewhere else, some other place.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;거기를 갔는데 사람이 너무 많아서 딴데로 갔어.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;We went to the restaurant and there were too many people, so we went to somewhere else.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;■&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;딴걸로&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;something else, some other model&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;■&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;딴 사람&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;someone else, some other person, some other man&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;그녀는 그와 헤어지고 바로 다른 사람을 만났어.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Right after she broke up with him, she immediately met someone else (some other guy).&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;■&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;딴 방법&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;some other way&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;someway else (불가능, 없는 단어)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;우리는 다른 방법을 찾아야해.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;I think we need to find some other way.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;■&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;딴 이유&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;some other reason&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;someway else (불가능, 없는 단어)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;■&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;딴 때&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;some other time&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;sometime else (불가능, 없는 단어)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=q8lobFhu1fs&amp;amp;list=PLIsIUJcT0HIWJoR8MfbjD9qvGNIORmUJ3&amp;amp;index=15&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;출처: 유투브 라이브아카데미&lt;/a&gt;&lt;/p&gt;</description>
      <category>영어</category>
      <category>for~ing</category>
      <category>실생활회화</category>
      <category>영어회화</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/54</guid>
      <comments>https://softwaree.tistory.com/54#entry54comment</comments>
      <pubDate>Thu, 10 Oct 2019 23:26:42 +0900</pubDate>
    </item>
    <item>
      <title>미국인들이 자주 사용하는 자연스러운 표현 : 시간 / Home / Diet</title>
      <link>https://softwaree.tistory.com/53</link>
      <description>&lt;p style=&quot;font-size: 1.25em;&quot;&gt;1. 시간 표현&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 전치사 붙여서 말하지 말자. (in, on, at 등)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;일주일 내내&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;all week&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이번주 (일주일) 내내&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;all week + this week&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;all this week&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;평일에&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;on weekdays&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;월~금 5일이나 있어서 복수 사용해야 함.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;주말에&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;on weekends&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;주말도 이틀. 복수형.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;ex) 나 주말에는 그냥 집에 있어.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;I just stay home &lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;on weekends.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이번주에&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;this week&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다음 주에&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;next week&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;지난 주에&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;last week&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;2. Home 표현&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; House는 주택이라고 인식하므로 주택과 아파트는 구분하여 말해야 함.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;House : 주택 / Apartment : 아파트&lt;/p&gt;
&lt;p&gt;place 를 집 대신에 쓰기도 함. (미국인들이 많이 사용하는 단어) 집인지 아파트인지 굳이 구분할 필요가 없는 상황에 사용됨.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;얘들아, 수잔네 집에 가서 놀자~&lt;/p&gt;
&lt;p&gt;Hey, let's &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;go over&lt;/b&gt;&lt;/span&gt; to Susan's &lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;place&lt;/span&gt;&lt;/b&gt; and hang out there.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;go home&lt;/p&gt;
&lt;p&gt;&quot;집에 가다&quot; 표현. go home 자체를 하나의 동사로 보는게 좋음. go to home과같이 전치사 붙이지 말자.&lt;/p&gt;
&lt;p&gt;I'm going to go home.&lt;/p&gt;
&lt;p&gt;I have to go home.&lt;/p&gt;
&lt;p&gt;leave home 집에서 나오다/출발하다&lt;/p&gt;
&lt;p&gt;go home / get back home / go back home 집에 돌아가다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;3. Diet&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;앞으로 다이어트를 할 거다&lt;/p&gt;
&lt;p&gt;go one a diet&lt;/p&gt;
&lt;p&gt;I'm going to go on a diet from next week.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다이어트를 하고 있다. / 하는 중이다.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;be on a diet&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;I'm on a diet.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Are you on a diet now?&lt;/p&gt;
&lt;p&gt;I was on a diet until last week.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;얼마나 됬니? &lt;b&gt;How long has it been&lt;/b&gt;?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;살찌다&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;gain weight&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;살빼다&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;lose weight&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;gain 2kg.&lt;/p&gt;
&lt;p&gt;lose 5kg.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I've lost 2kg so far.&lt;/p&gt;
&lt;p&gt;I want to lose weight.&lt;/p&gt;
&lt;p&gt;Wow, you've lost a lot of weight.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>영어</category>
      <category>diet</category>
      <category>Home</category>
      <category>시간</category>
      <category>영어회화</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/53</guid>
      <comments>https://softwaree.tistory.com/53#entry53comment</comments>
      <pubDate>Thu, 10 Oct 2019 22:06:49 +0900</pubDate>
    </item>
    <item>
      <title>안드로이드 Dalvik과 ART, JIT과 AOT 차이점</title>
      <link>https://softwaree.tistory.com/52</link>
      <description>&lt;p&gt;apk를 설치하면 실행파일의 경우 storage에 dex 파일로 저장됩니다. dex 파일은 byte code로 이루어져 있기 때문에 이를 실행하려면 단말의 cpu에 맞게 machine code로 변환하여야 합니다. 이 machine code로 프로그램을 실행할 수 있기 때문입니다. 코드 변환에는 비용이 발생하기 때문에 어떤 방식으로 변환하느냐에 따라서 크게 JIT과 AOT로 나뉩니다. 이 두 방식은 안드로이드에 국한되는것이 아니라 다른 Language에서도 사용되는 일반적인 컴파일 방식입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;■ Dalvik&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;JIT (Just In Time) 컴파일 방식을 사용합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot;&gt;※ JIT의 주요 특징&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p&gt;앱이 실행되는 순간 자주 사용되는 바이트 코드를 컴파일하여 Machine Code로 변환 후 캐싱하여 RAM에 올립니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;화면 전환 또는 앱이 실행 될 때마다 필요한 코드를 실시간 컴파일 하기 때문에 그 시간만큼 사용성에 있어서 latency가 발생할 수 밖에 없습니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;컴파일이 빈번하게 발생되기 때문에 RAM 점유율, 배터리 소모량 증가 등의 이슈도 있습니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;장점으로는, AOT 대비 APP 설치 시간이 매우 빠릅니다. 설치 할때 컴파일을 하지 않기 때문입니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AOT 대비 앱 용량이 작습니다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;font-size: 1.12em;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;※ &lt;/span&gt;DVM에서의 실행 과정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷, 2019-10-09 20-56-56.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dt4byz/btqyUfxJxYf/f4cLNKAXB65R4Lcq16fO0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dt4byz/btqyUfxJxYf/f4cLNKAXB65R4Lcq16fO0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dt4byz/btqyUfxJxYf/f4cLNKAXB65R4Lcq16fO0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdt4byz%2FbtqyUfxJxYf%2Ff4cLNKAXB65R4Lcq16fO0K%2Fimg.png&quot; data-filename=&quot;스크린샷, 2019-10-09 20-56-56.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size20&quot;&gt;■ ART&lt;/p&gt;
&lt;p data-ke-size=&quot;size20&quot;&gt;AOT(Ahead Of Time) 컴파일 방식을 사용하고 Android Kitkat 버전에 도입된 새로운 앱 실행 환경입니다. JIT의 단점들을 보완하여 큰 성능 향상을 가져왔습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;※ AOT의 주요 특징&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p&gt;Android Kitkat 버전에 도입된 ART (Android Runtime) 에서 사용되는 컴파일 방식입니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;앱 설치 할때 모든 코드를 Machine Code로 변환 후 ROM에 저장합니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;앱 설치 속도가 JIT에 비하여 매우 느립니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;앱 실행시 컴파일을 하지 않아도 되기 때문에 컴파일로 인해 발생될수 있는 latency가 없어서 매우 빠릅니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;미리 컴파일 후에 ROM에 저장하기 때문에 용량이 큽니다. (JIT 대비 보통 1.5배 ~ 최대 2배)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;최적화 작업으로 인하여 JIT과 AOT가 각각 도입되었다가 Android N 버전부터는 둘다 사용되는 하이브리드 형태로 운용되고 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;※&lt;span&gt; ART&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;에서의 실행 과정&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷, 2019-10-09 20-57-11.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhdXno/btqyV5Bb4v2/MLZLFNupughn5iq6lEjB7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhdXno/btqyV5Bb4v2/MLZLFNupughn5iq6lEjB7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhdXno/btqyV5Bb4v2/MLZLFNupughn5iq6lEjB7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhdXno%2FbtqyV5Bb4v2%2FMLZLFNupughn5iq6lEjB7K%2Fimg.png&quot; data-filename=&quot;스크린샷, 2019-10-09 20-57-11.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Android Dev/dev</category>
      <category>DALVIK과 ART</category>
      <category>JIT과 AOT</category>
      <category>안드로이드</category>
      <category>안드로이드 런타임</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/52</guid>
      <comments>https://softwaree.tistory.com/52#entry52comment</comments>
      <pubDate>Wed, 9 Oct 2019 21:01:20 +0900</pubDate>
    </item>
    <item>
      <title>미국인들이 실제 자주 사용하는 &amp;quot;오랜만에&amp;quot;, &amp;quot;~한지 너무 오래 됐어요.&amp;quot;  자연스럽게 표현하기</title>
      <link>https://softwaree.tistory.com/51</link>
      <description>&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;오랜만에&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;ex) 오랜만에 친구들을 만났어요&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;-&amp;gt; &quot;오랜만에&quot;의 의미를 정확히 파악해야 함.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;■ 오랜만에 만나는 친구들&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;오랫동안 만나지 않았던 친구들을 만났어.&lt;/p&gt;
&lt;p&gt;I hung out with some &lt;span style=&quot;color: #006dd7;&quot;&gt;friends&lt;/span&gt; who I &lt;span style=&quot;color: #f89009;&quot;&gt;hadn't seen&lt;/span&gt; in a long time.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;■ 친구들을 만나는 것 자체가 오랜만인 것&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;I hung out with some &lt;span style=&quot;color: #006dd7;&quot;&gt;friends,&lt;/span&gt; which I &lt;span style=&quot;color: #f89009;&quot;&gt;hadn't done&lt;/span&gt; in a long time.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;handn't done : 친구를 만나는것을 하지 않았다 는 것을 의미.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;오랜만에 커피숍에 가서 책을 읽었어.&lt;/p&gt;
&lt;p&gt;I went to a coffee shop and read a book,&lt;span style=&quot;color: #f89009;&quot;&gt; which I hadn't done&lt;/span&gt; in a long time.&lt;/p&gt;
&lt;p&gt;= I went to a coffee shop and I read a book. &lt;span style=&quot;color: #f89009;&quot;&gt;I hadn't done&lt;/span&gt; that in a long time.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;저녁에는 오랜만에 외식을 했어.&lt;/p&gt;
&lt;p&gt;We ate out for dinner, &lt;span style=&quot;color: #f89009;&quot;&gt;which we hadn't done&lt;/span&gt; in a long time.&lt;/p&gt;
&lt;p&gt;= We ate out for dinner. &lt;span style=&quot;color: #f89009;&quot;&gt;we hadn't done&lt;/span&gt; that in a long time.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;오랜만에 쇼핑을 갈거야.&lt;/p&gt;
&lt;p&gt;We're going to go shopping, &lt;span style=&quot;color: #f89009;&quot;&gt;which we haven't done&lt;/span&gt; in a long time.&lt;/p&gt;
&lt;p&gt;= We're going to go shopping. &lt;span style=&quot;color: #f89009;&quot;&gt;we haven't done that&lt;/span&gt; in a long time.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;오랜만에 영화 보러 가고 싶다.&lt;/p&gt;
&lt;p&gt;I really want to go to the movies, I haven't done that in a while.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;야, 오랜만에 피자나 시킬까?&lt;/p&gt;
&lt;p&gt;Hey, do you want to order a pizza? We haven't done that in a while.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;~한지 오래 됐어요.&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;long time 보다 for a while을 더 많이 사용. long time 은 정말 오래 된거 같은 늬앙스.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;친구들을 만난지 너무 오래 됐어요.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;It has been a while since&lt;/b&gt; &lt;/span&gt;I hung out with my friends.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이번 주말에 오랜만에 친구들을 만나기로 했어요.&lt;/p&gt;
&lt;p&gt;I'm hanging out with my friends this weekend.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;I haven't seen them in a while / in such a long time.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;우리 오랜만에 어디어디 가볼까?&lt;/p&gt;
&lt;p&gt;&quot;Hey, do you want to go to that Chinese place? &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;(for the first time in a long time : NO!!!!)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;We haven't been there in a while&lt;/b&gt;&lt;/span&gt;.&quot;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=R0mUEbbD-QM&amp;amp;list=PLIsIUJcT0HIWJoR8MfbjD9qvGNIORmUJ3&amp;amp;index=9&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;출처 : 유투브 라이브 아카데미&lt;/a&gt;&lt;/p&gt;</description>
      <category>영어</category>
      <category>라이브아카데미</category>
      <category>영어회화</category>
      <category>오랜만에 영어로</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/51</guid>
      <comments>https://softwaree.tistory.com/51#entry51comment</comments>
      <pubDate>Tue, 8 Oct 2019 23:17:14 +0900</pubDate>
    </item>
    <item>
      <title>미국인들이 실제 자주 사용하는 표현 : ~하는 김에 / 어차피..이왕 ~하는거 / 부탁 좀 할게</title>
      <link>https://softwaree.tistory.com/50</link>
      <description>&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;■ &lt;/span&gt;&quot;나 지금 은행에 좀 다녀올게. 30분 정도 걸릴거야.&quot;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;Hey, I'm on my way to the bank. I'll be back in about half an hour.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;흐름을 자연스럽게..&amp;nbsp; &quot;It's going to take about half an hour&quot; 를 사용하면 연결성이 부족함.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;■ &lt;/span&gt;아, 너 나가는김에 코드 연장선 좀 사다줄래?&lt;/p&gt;
&lt;p&gt;Oh,&lt;span style=&quot;color: #f89009;&quot;&gt; while you're out,&lt;/span&gt; could you &lt;span style=&quot;color: #006dd7;&quot;&gt;pick up&lt;/span&gt; an extension cord for me?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- while you're out (나감 김에)&lt;/p&gt;
&lt;p&gt;- on your way out (나가는 길에)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;■ &lt;/span&gt;그래, 돌아오는 길에 슈퍼에 잠깐 들르지 뭐.&lt;/p&gt;
&lt;p&gt;Sure, I can &lt;span style=&quot;color: #f89009;&quot;&gt;stop by&lt;/span&gt; a supermarket on my way back.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;stop by = drop by = swing by&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;좀 더 자연스러운 표현&lt;/p&gt;
&lt;p&gt;Sure, &lt;span style=&quot;color: #006dd7;&quot;&gt;I guess I can&lt;/span&gt; &lt;span style=&quot;color: #f89009;&quot;&gt;stop by&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;a supermarket on my way back.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;■ 아, 그리고 너 그거 사러 간 김에 나 필요한게 몇 가지 사실 더 있는데, 부탁 좀 할게&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Oh and, &lt;span style=&quot;color: #f89009;&quot;&gt;while you're at it&lt;/span&gt;, I actually have a few more things I need&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt; + &lt;span style=&quot;color: #f89009;&quot;&gt;if you don't mind&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;좀 더 공손한 표현 : &lt;span style=&quot;color: #f89009;&quot;&gt;If it's not too much trouble&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;(~을) 하는 김에&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;while&lt;/span&gt; you're &lt;span style=&quot;color: #f89009;&quot;&gt;at it&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;거기 있는 동안에&lt;/p&gt;
&lt;p&gt;while you're there&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;■ &lt;span style=&quot;color: #f89009;&quot;&gt;어차피&lt;/span&gt;, 살거 좀 &lt;span style=&quot;color: #f89009;&quot;&gt;있으면&lt;/span&gt; 그냥 같이 가자.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;If you have some things to buy, you might as well + just + come with me.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;come with me = come along&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=qey-xlG0HZI&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;출처 : 라이브 아카데미 유튜브&lt;/a&gt;&lt;/p&gt;</description>
      <category>영어</category>
      <category>~하는 김에</category>
      <category>라이브아카데미</category>
      <category>영어회화</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/50</guid>
      <comments>https://softwaree.tistory.com/50#entry50comment</comments>
      <pubDate>Mon, 7 Oct 2019 22:59:46 +0900</pubDate>
    </item>
    <item>
      <title>미국인들이 실제 자주 사용하는 표현 : &amp;quot;저 요즘 드라마를 하나 보고 있어요&amp;quot;</title>
      <link>https://softwaree.tistory.com/49</link>
      <description>&lt;p&gt;&quot;저 요즘 드라마를 하나 보고 있어요.&quot;&lt;/p&gt;
&lt;p&gt;&amp;gt; &lt;span style=&quot;color: #f89009;&quot;&gt;Lately&lt;/span&gt;, I've been watching &lt;span style=&quot;color: #f89009;&quot;&gt;a tv show&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;■ These days 대신 Lately 사용.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;why? 보통 these days와는 단순 현재형 시제를 쓰는 경우가 많음)&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;These days, I'm ...ing&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;ex) I used to work with a small group but these days, I'm working with almost 20 other employees.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;■&lt;/span&gt;&amp;nbsp;drama 대신 a tv show 사용.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;드라마&quot; 키워드 사용은 조심해야 함. 티비나 영화도 하나의 장르로 드라마가 사용됨.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; 추천 키워드는 show.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;■&lt;/span&gt;&amp;nbsp;장르는 아래처럼 나뉨&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;- advertisement&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;- news&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;- sports game&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;- everything else ... : &quot;shows&quot;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;여기에 드라마, 코미디 등이 포함됨.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;■ 샘플&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; A : I've been watching Game Of Thrones, lately.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; B : Oh! I love that show!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=thiB7y1h5_k&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;출처 : Youtube 라이브 아카데미&lt;/a&gt;&lt;/p&gt;</description>
      <category>영어</category>
      <category>드라마</category>
      <category>라이브아카데미</category>
      <category>영어회화</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/49</guid>
      <comments>https://softwaree.tistory.com/49#entry49comment</comments>
      <pubDate>Mon, 7 Oct 2019 22:24:40 +0900</pubDate>
    </item>
    <item>
      <title>AndroidQ 다크테마 적용방법</title>
      <link>https://softwaree.tistory.com/48</link>
      <description>&lt;p&gt;안드로이드 Q의 새로운 피처인 다크테마 적용 방법에 대하여 알아보겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;시스템에서 다크테마 적용은 설정 - 디스플레이 메뉴에서 적용이 가능합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;앱에서는,&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1. style - theme의 parent를 Theme.AppCompat.DayNight 로 수정&lt;/p&gt;
&lt;pre id=&quot;code_1569509907604&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;style name=&quot;AppTheme&quot; parent=&quot;Theme.AppCompat.DayNight&quot;&amp;gt;
        &amp;lt;!-- Customize your theme here. --&amp;gt;
        &amp;lt;item name=&quot;colorPrimary&quot;&amp;gt;@color/colorPrimary&amp;lt;/item&amp;gt;
        &amp;lt;item name=&quot;colorPrimaryDark&quot;&amp;gt;@color/colorPrimaryDark&amp;lt;/item&amp;gt;
        &amp;lt;item name=&quot;colorAccent&quot;&amp;gt;@color/colorAccent&amp;lt;/item&amp;gt;
    &amp;lt;/style&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2. theme의 parent를 DayNight 로 설정하지 못하는 경우에는 android:forceDarkAllowed 속성 추가&lt;/p&gt;
&lt;pre id=&quot;code_1569510070382&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;style name=&quot;AppTheme&quot; parent=&quot;Theme.AppCompat.Light.DarkActionBar&quot;&amp;gt;
        &amp;lt;!-- Customize your theme here. --&amp;gt;
        &amp;lt;item name=&quot;colorPrimary&quot;&amp;gt;@color/colorPrimary&amp;lt;/item&amp;gt;
        &amp;lt;item name=&quot;colorPrimaryDark&quot;&amp;gt;@color/colorPrimaryDark&amp;lt;/item&amp;gt;
        &amp;lt;item name=&quot;colorAccent&quot;&amp;gt;@color/colorAccent&amp;lt;/item&amp;gt;
        &amp;lt;item name=&quot;android:forceDarkAllowed&quot;&amp;gt;true&amp;lt;/item&amp;gt;
    &amp;lt;/style&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3. 코드 레벨에서 강제로 ON/OFF&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1569510984241&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        findViewById&amp;lt;View&amp;gt;(R.id.change_mode_btn).setOnClickListener { toggleNightMode() }
        renderModeState()
    }

    fun renderModeState() {
        var output: TextView = findViewById(R.id.output_tv)
        val currentNightMode = resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
        if (currentNightMode == Configuration.UI_MODE_NIGHT_NO) {
            output.text = &quot;NIGHT_MODE_OFF&quot;
        } else if (currentNightMode == Configuration.UI_MODE_NIGHT_YES) {
            output.text = &quot;NIGHT_MODE_ON&quot;
        }
    }

    fun toggleNightMode() {
        val currentNightMode = resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
        if (currentNightMode == Configuration.UI_MODE_NIGHT_NO) {
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
        } else if (currentNightMode == Configuration.UI_MODE_NIGHT_YES) {
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;configuration에서 uiMode 값의 마스킹을 통해서 현재 앱이 night mode가 적용되어있는지 아닌지를 읽을 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;public static final int &lt;/span&gt;UI_MODE_NIGHT_NO = &lt;span&gt;16&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;public static final int &lt;/span&gt;UI_MODE_NIGHT_YES = &lt;span&gt;32&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이 값에 따라서 나이트 모드를 적용할 것인지는 AppCompatDelegate.setDefaultNightMode api를 사용하면 적용이 가능합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;b&gt;&amp;lt;나이트 모드 OFF&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;caret-color: transparent; letter-spacing: 0px;&quot; src=&quot;https://k.kakaocdn.net/dn/bQVRsm/btqyAcg6yKe/kvFPJa1kpWQZpktdKGuNfK/img.png&quot; width=&quot;400&quot; height=&quot;664&quot; data-image-src=&quot;https://k.kakaocdn.net/dn/bQVRsm/btqyAcg6yKe/kvFPJa1kpWQZpktdKGuNfK/img.png&quot; data-filename=&quot;스크린샷, 2019-09-27 00-19-22.png&quot; /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify; font-size: 1.25em;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;lt;나이트 모드 ON&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷, 2019-09-27 00-19-10.png&quot; width=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/whH8k/btqyAuV83rS/ncsafcua2jQbKYHzsfkqNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/whH8k/btqyAuV83rS/ncsafcua2jQbKYHzsfkqNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/whH8k/btqyAuV83rS/ncsafcua2jQbKYHzsfkqNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwhH8k%2FbtqyAuV83rS%2Fncsafcua2jQbKYHzsfkqNk%2Fimg.png&quot; data-filename=&quot;스크린샷, 2019-09-27 00-19-10.png&quot; width=&quot;400&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot;&gt;&lt;b&gt;전체 소스코드&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/allsoft777/AndroidQ-DarkTheme&quot;&gt;https://github.com/allsoft777/AndroidQ-DarkTheme&lt;/a&gt;&lt;/p&gt;</description>
      <category>Android Dev/dev</category>
      <category>androidQ</category>
      <category>안드로이드</category>
      <category>안드로이드 다크테마</category>
      <category>안드로이드Q 다크테마</category>
      <author>Owl Life</author>
      <guid isPermaLink="true">https://softwaree.tistory.com/48</guid>
      <comments>https://softwaree.tistory.com/48#entry48comment</comments>
      <pubDate>Fri, 27 Sep 2019 00:32:04 +0900</pubDate>
    </item>
  </channel>
</rss>