<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Technote</title>
    <link>https://bumjae.tistory.com/</link>
    <description>공부한 내용을 정리하는 블로그</description>
    <language>ko</language>
    <pubDate>Tue, 14 Apr 2026 19:19:32 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>bumjae</managingEditor>
    <image>
      <title>Technote</title>
      <url>https://tistory1.daumcdn.net/tistory/4326719/attach/88325ee5cfe849dea3afc033b83a2711</url>
      <link>https://bumjae.tistory.com</link>
    </image>
    <item>
      <title>동력전달장치 - 2D,3D</title>
      <link>https://bumjae.tistory.com/141</link>
      <description>&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;조립품 단면&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;동력전달장치_조립품단면.png&quot; data-origin-width=&quot;1057&quot; data-origin-height=&quot;835&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtc6cq/btsLMD5rgoI/RH3hvNBfTUyIgS1MMASmv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtc6cq/btsLMD5rgoI/RH3hvNBfTUyIgS1MMASmv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtc6cq/btsLMD5rgoI/RH3hvNBfTUyIgS1MMASmv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdtc6cq%2FbtsLMD5rgoI%2FRH3hvNBfTUyIgS1MMASmv1%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;1057&quot; height=&quot;835&quot; data-filename=&quot;동력전달장치_조립품단면.png&quot; data-origin-width=&quot;1057&quot; data-origin-height=&quot;835&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;3D 도면&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3D도면 PDF_page-0001 (1).jpg&quot; data-origin-width=&quot;3509&quot; data-origin-height=&quot;2481&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cspioj/btsLL4vAMND/BPDjFG5UCpAtUW76H0pPPK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cspioj/btsLL4vAMND/BPDjFG5UCpAtUW76H0pPPK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cspioj/btsLL4vAMND/BPDjFG5UCpAtUW76H0pPPK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcspioj%2FbtsLL4vAMND%2FBPDjFG5UCpAtUW76H0pPPK%2Fimg.jpg&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;3509&quot; height=&quot;2481&quot; data-filename=&quot;3D도면 PDF_page-0001 (1).jpg&quot; data-origin-width=&quot;3509&quot; data-origin-height=&quot;2481&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bbKGN6/btsLM065Qvi/1aVEhwBh9KE3EHRWGa10A0/3D%EB%8F%84%EB%A9%B4.idw?attach=1&amp;amp;knm=tfile.idw&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;3D도면.idw&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.76MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/c2uXfI/btsLLtWSZzc/K3tXr5FUcnnl2opRzkqJvk/%EB%B3%B8%EC%B2%B4.ipt?attach=1&amp;amp;knm=tfile.ipt&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;본체.ipt&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.55MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bYWmoK/btsLLDrMYY0/bKgZbilKVWhcZCoCKB2Bj0/%EB%B2%A8%ED%8A%B8%ED%92%80%EB%A6%AC.ipt?attach=1&amp;amp;knm=tfile.ipt&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;벨트풀리.ipt&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.27MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bmjwIf/btsLMHz0RP3/UR2Lxgu07eRooRo9tL1MPK/%EC%8A%A4%ED%8D%BC%EA%B8%B0%EC%96%B4%20%EC%B6%95.ipt?attach=1&amp;amp;knm=tfile.ipt&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;스퍼기어 축.ipt&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.38MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bgSiCL/btsLLtWSZOc/5gomLMKWGWxxZOnYLSeHgK/%ED%95%98%EC%9A%B0%EC%A7%95.ipt?attach=1&amp;amp;knm=tfile.ipt&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;하우징.ipt&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.18MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/pIGTN/btsLMJkhN3W/omNGyKlkGWfDr3PtS4yr0k/%EB%B2%A0%EC%96%B4%EB%A7%81%EC%BB%A4%EB%B2%84.ipt?attach=1&amp;amp;knm=tfile.ipt&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;베어링커버.ipt&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.21MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;조립품&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;조립품_page-0001.jpg&quot; data-origin-width=&quot;3509&quot; data-origin-height=&quot;2481&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J2aCU/btsLK6A0z8f/5x60gTkzHvlaQoBlXkNIQ1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J2aCU/btsLK6A0z8f/5x60gTkzHvlaQoBlXkNIQ1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J2aCU/btsLK6A0z8f/5x60gTkzHvlaQoBlXkNIQ1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ2aCU%2FbtsLK6A0z8f%2F5x60gTkzHvlaQoBlXkNIQ1%2Fimg.jpg&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;3509&quot; height=&quot;2481&quot; data-filename=&quot;조립품_page-0001.jpg&quot; data-origin-width=&quot;3509&quot; data-origin-height=&quot;2481&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/FcFGn/btsLKFjgEDF/PJLHAKn6dakKT07bMgPtIk/%EC%A1%B0%EB%A6%BD%ED%92%88.iam?attach=1&amp;amp;knm=tfile.iam&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;조립품.iam&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.59MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;분해도&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;분해_page-0001.jpg&quot; data-origin-width=&quot;3509&quot; data-origin-height=&quot;2481&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIb8Re/btsLK6ueSXD/JjUglw4Ei08L09xOlQOkY1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIb8Re/btsLK6ueSXD/JjUglw4Ei08L09xOlQOkY1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIb8Re/btsLK6ueSXD/JjUglw4Ei08L09xOlQOkY1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIb8Re%2FbtsLK6ueSXD%2FJjUglw4Ei08L09xOlQOkY1%2Fimg.jpg&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;3509&quot; height=&quot;2481&quot; data-filename=&quot;분해_page-0001.jpg&quot; data-origin-width=&quot;3509&quot; data-origin-height=&quot;2481&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/nZrEs/btsLK3KW6eE/FwBc3iYqJXIymeAellBWu1/%EB%B6%84%ED%95%B4%EC%A1%B0%EB%A6%BD%EB%8F%84.idw?attach=1&amp;amp;knm=tfile.idw&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;분해조립도.idw&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.97MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;별도 사용 부품&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/nt0ll/btsLM67bgb0/nTSj9NJfCBCIbtR0N085A1/%EA%B0%9C%EC%8A%A4%ED%82%B7.ipt?attach=1&amp;amp;knm=tfile.ipt&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;개스킷.ipt&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.11MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/peEr9/btsLK8MkLdH/OAP92m724sCTxAwaEKOsL0/%EC%B9%BC%EB%9D%BC1.ipt?attach=1&amp;amp;knm=tfile.ipt&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;칼라1.ipt&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.11MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/dG2ffb/btsLNxwFRjS/pd1Gl0w6grSwczLhAUyho0/%EC%B9%BC%EB%9D%BC2.ipt?attach=1&amp;amp;knm=tfile.ipt&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;칼라2.ipt&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.10MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&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;style5&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;2D 도면&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2D도면 PDF_page-0001.jpg&quot; data-origin-width=&quot;3509&quot; data-origin-height=&quot;2481&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lMlPb/btsLNtVkiAv/xMXlJn07XurhbmkIiK3EZ1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lMlPb/btsLNtVkiAv/xMXlJn07XurhbmkIiK3EZ1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lMlPb/btsLNtVkiAv/xMXlJn07XurhbmkIiK3EZ1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlMlPb%2FbtsLNtVkiAv%2FxMXlJn07XurhbmkIiK3EZ1%2Fimg.jpg&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;3509&quot; height=&quot;2481&quot; data-filename=&quot;2D도면 PDF_page-0001.jpg&quot; data-origin-width=&quot;3509&quot; data-origin-height=&quot;2481&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/dgZTNu/btsLK3jTBWS/XsJXjFR9SzFVCweHmkeK81/2D%EB%8F%84%EB%A9%B4.idw?attach=1&amp;amp;knm=tfile.idw&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;2D도면.idw&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;1.09MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Inventer</category>
      <author>bumjae</author>
      <guid isPermaLink="true">https://bumjae.tistory.com/141</guid>
      <comments>https://bumjae.tistory.com/141#entry141comment</comments>
      <pubDate>Mon, 13 Jan 2025 22:05:14 +0900</pubDate>
    </item>
    <item>
      <title>BCD / 홀 종류,표기법,깊이</title>
      <link>https://bumjae.tistory.com/140</link>
      <description>&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;BCD (Bolt Cricle Diameter)&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;832&quot; data-origin-height=&quot;572&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YSbwT/btsLAWwBwfK/Z2taKQeWUIXyOdAOnK87vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YSbwT/btsLAWwBwfK/Z2taKQeWUIXyOdAOnK87vk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YSbwT/btsLAWwBwfK/Z2taKQeWUIXyOdAOnK87vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYSbwT%2FbtsLAWwBwfK%2FZ2taKQeWUIXyOdAOnK87vk%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;400&quot; height=&quot;275&quot; data-origin-width=&quot;832&quot; data-origin-height=&quot;572&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;각 홀(위 그림 6개)의 센터를 연결했을 때 생기는 원의 지름&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;나사산이 있으면 BCD (Bolt)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;나사산이 없으면 PCD (Pitch)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&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;style3&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; 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;738&quot; data-origin-height=&quot;537&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cE9lBi/btsLyvf7xhS/zcGdcfqhCwqwE1gabf6Ys1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cE9lBi/btsLyvf7xhS/zcGdcfqhCwqwE1gabf6Ys1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cE9lBi/btsLyvf7xhS/zcGdcfqhCwqwE1gabf6Ys1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcE9lBi%2FbtsLyvf7xhS%2FzcGdcfqhCwqwE1gabf6Ys1%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;700&quot; height=&quot;509&quot; data-origin-width=&quot;738&quot; data-origin-height=&quot;537&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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;BCD가 기본치수니까 공차를 안 쓴 건 알겠는데 이건 +-공차로 치면 얼마나 되나요?&lt;/li&gt;
&lt;li&gt;위치도 공차가 3파이니까 파이30 +- 1.5라고 보면 되나요?&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;BCD에 공차가 없는 이유&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;553&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FLiwM/btsLzqSVy1y/fvEVJ9yuMFZ1TpbSVSi8V0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FLiwM/btsLzqSVy1y/fvEVJ9yuMFZ1TpbSVSi8V0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FLiwM/btsLzqSVy1y/fvEVJ9yuMFZ1TpbSVSi8V0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFLiwM%2FbtsLzqSVy1y%2FfvEVJ9yuMFZ1TpbSVSi8V0%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;400&quot; height=&quot;449&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;553&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;도면에 나온 BCD의 치수는 그 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;u&gt;원기둥 모양의 공차역이 놓일 위치를 알려주는데서 그 역할이 끝나는 것이기 때문&lt;/u&gt;&lt;/span&gt;에 현물의 BCD는 측정이 필요없기 때문에 공차가 없다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;BCD는 공차가 없다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;+- 공차로 바꿔서 말해줄 수도 없다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;실측 BCD를 알 필요가 없다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;덧붙여 설명하자면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;홀의 6개 다 작업해야 검사를 시작할 수 있는 것이 아니라 홀은 1개, 몇 개만 뚫어도&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;&lt;br /&gt;BCD가&amp;nbsp;하나의&amp;nbsp;숫자로&amp;nbsp;나타날&amp;nbsp;수&amp;nbsp;없다는&amp;nbsp;것&amp;nbsp;때문에&amp;nbsp;많은&amp;nbsp;사람들이&amp;nbsp;BCD에&amp;nbsp;+-공차로&amp;nbsp;바꿔서&amp;nbsp;말한다고&amp;nbsp;착각하기도&amp;nbsp;한다. &lt;br /&gt;&lt;br /&gt;하지만, 기본 치수랑 위치도의 조합으로 규정한 홀의 센터, 공차역은 각 홀마다 한 개씩 공차역이 생기는 거기 때문에 BCD 통째로 공차를 어떻게 두어야 한다. 이런 이야기가 빠져있어 BCD를 +-공차로 컨버팅 할 수 없다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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;1093&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMbp8Q/btsLx3YDptz/v0FpDK2nmXQChnGx2ER3FK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMbp8Q/btsLx3YDptz/v0FpDK2nmXQChnGx2ER3FK/img.png&quot; data-alt=&quot;위치공차를 사용하지 않으면 공차역은 어떤 모습일까?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMbp8Q/btsLx3YDptz/v0FpDK2nmXQChnGx2ER3FK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMbp8Q%2FbtsLx3YDptz%2Fv0FpDK2nmXQChnGx2ER3FK%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;1093&quot; height=&quot;650&quot; data-origin-width=&quot;1093&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위치공차를 사용하지 않으면 공차역은 어떤 모습일까?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;일단 그림상 BCD의 공차는 나와있지만, 아쉽게도 이렇게 나오면 해석이 불가능하다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&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;style5&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;홀의 종류&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;506&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZzdX0/btsLx4iRM8E/C72FyGpV9FqqMxYen6jEk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZzdX0/btsLx4iRM8E/C72FyGpV9FqqMxYen6jEk0/img.png&quot; data-alt=&quot;좌측에서부터 1 ~ 5&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZzdX0/btsLx4iRM8E/C72FyGpV9FqqMxYen6jEk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZzdX0%2FbtsLx4iRM8E%2FC72FyGpV9FqqMxYen6jEk0%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;600&quot; height=&quot;295&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;506&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;좌측에서부터 1 ~ 5&lt;/figcaption&gt;
&lt;/figure&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: 39.8837%; text-align: center;&quot;&gt;1,2&lt;/td&gt;
&lt;td style=&quot;width: 60.1163%;&quot;&gt;깊이만 빼고 같은 홀, &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;막힌 홀 = BLIND HOLE&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 39.8837%; text-align: center;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 60.1163%;&quot;&gt;관통된 홀 = THRU HOLE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 39.8837%; text-align: center;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 60.1163%;&quot;&gt;BLIND HOLE / Counterbored Hole (카운터 보링)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 39.8837%; text-align: center;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: 60.1163%;&quot;&gt;BLIND HOLE / Countersunk Hole (카운터 싱킹)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 39.8837%; text-align: center;&quot;&gt;4,5&lt;/td&gt;
&lt;td style=&quot;width: 60.1163%;&quot;&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;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;홀의 표기법&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;588&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLougt/btsLAZmBKUd/BkNBdFAntLaKTZ8u30hluK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLougt/btsLAZmBKUd/BkNBdFAntLaKTZ8u30hluK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLougt/btsLAZmBKUd/BkNBdFAntLaKTZ8u30hluK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLougt%2FbtsLAZmBKUd%2FBkNBdFAntLaKTZ8u30hluK%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;828&quot; height=&quot;588&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;588&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;깊이 정보가 확인되지 않는 경우에 홀 직경 뒤에 깊이정보 (기호+숫자)를 명시한다.&lt;/li&gt;
&lt;li&gt;관통형일 경우 THRU를 붙임&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;홀의 깊이값&lt;/h3&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;홀 깊이값은 &lt;span style=&quot;color: #ef5369;&quot;&gt;드릴 팁 부분을 포함하는 것이 아닌 원통형 부분&lt;/span&gt;만을 이야기 하는 것이다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;(&lt;span style=&quot;text-align: center;&quot;&gt;ASME Y14.5 2018 4.5.10 Round Holes&lt;/span&gt;)&lt;/span&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;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;모든 &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;홀깊이의 표기는 표면을 기준&lt;/span&gt;&lt;/b&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;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;1, 2번 홀의 경우 2번은 잘못된 도면 형상이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;그림1.png&quot; data-origin-width=&quot;3982&quot; data-origin-height=&quot;1186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Shmsw/btsLx3KY2Pm/GrfUBnIuaSFt79ZlhgbyUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Shmsw/btsLx3KY2Pm/GrfUBnIuaSFt79ZlhgbyUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Shmsw/btsLx3KY2Pm/GrfUBnIuaSFt79ZlhgbyUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FShmsw%2FbtsLx3KY2Pm%2FGrfUBnIuaSFt79ZlhgbyUk%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;800&quot; height=&quot;238&quot; data-filename=&quot;그림1.png&quot; data-origin-width=&quot;3982&quot; data-origin-height=&quot;1186&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;카운터보어, 카운터 싱킹 기호&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;그림2.png&quot; data-origin-width=&quot;4184&quot; data-origin-height=&quot;1492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfNDQb/btsLx0AMLFF/bYSN5Y9FEyRQMmaF6PDRr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfNDQb/btsLx0AMLFF/bYSN5Y9FEyRQMmaF6PDRr0/img.png&quot; data-alt=&quot;카운터 보어 / 카운터 싱킹 기호&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfNDQb/btsLx0AMLFF/bYSN5Y9FEyRQMmaF6PDRr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfNDQb%2FbtsLx0AMLFF%2FbYSN5Y9FEyRQMmaF6PDRr0%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;800&quot; height=&quot;285&quot; data-filename=&quot;그림2.png&quot; data-origin-width=&quot;4184&quot; data-origin-height=&quot;1492&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;카운터 보어 / 카운터 싱킹 기호&lt;/figcaption&gt;
&lt;/figure&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;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;카운터 보어 예시&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;977&quot; data-origin-height=&quot;341&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBTMz0/btsLx7fBwQF/vQs0XiCCIvaecgzBHGd46K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBTMz0/btsLx7fBwQF/vQs0XiCCIvaecgzBHGd46K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBTMz0/btsLx7fBwQF/vQs0XiCCIvaecgzBHGd46K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBTMz0%2FbtsLx7fBwQF%2FvQs0XiCCIvaecgzBHGd46K%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;800&quot; height=&quot;279&quot; data-origin-width=&quot;977&quot; data-origin-height=&quot;341&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;측면도를 가지는 도면을 측면도 없이 중간 도면처럼 명시할 수 있다.&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;카운터 싱킹 예시&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;724&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B3LiK/btsLAb13zdg/k6ryVGCn81rsvcecojQv71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B3LiK/btsLAb13zdg/k6ryVGCn81rsvcecojQv71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B3LiK/btsLAb13zdg/k6ryVGCn81rsvcecojQv71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB3LiK%2FbtsLAb13zdg%2Fk6ryVGCn81rsvcecojQv71%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;800&quot; height=&quot;597&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;724&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;&lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;P.S&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;깊이 기호 대신 &lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;DP, &lt;/span&gt;&lt;/b&gt;카운터 보어 기호 대신&lt;span style=&quot;color: #409d00;&quot;&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;CB, &lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;/span&gt;카운터 싱킹 기호 대신 &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;CS로 &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;표기되어 있는 경우도 있다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;(ASME Y14.5 규정에는 정의되어 있지 않은 표현)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;(표준에 없는 기호를 별도로 정의해서 써도 무방하다고 표준에는 나와있긴 하다.)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Youtube TeleV2 신입사원 도면강좌 36~37&lt;/blockquote&gt;</description>
      <category>CAD</category>
      <author>bumjae</author>
      <guid isPermaLink="true">https://bumjae.tistory.com/140</guid>
      <comments>https://bumjae.tistory.com/140#entry140comment</comments>
      <pubDate>Thu, 26 Dec 2024 21:53:42 +0900</pubDate>
    </item>
    <item>
      <title>모양공차(선/면 윤곽도), ○,◎, U 모디파이어</title>
      <link>https://bumjae.tistory.com/139</link>
      <description>&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;윤곽도&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;506&quot; data-origin-height=&quot;56&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x0uHd/btsLwchpJqK/wKK9k0B69QwbO5QK4dnHw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x0uHd/btsLwchpJqK/wKK9k0B69QwbO5QK4dnHw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x0uHd/btsLwchpJqK/wKK9k0B69QwbO5QK4dnHw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx0uHd%2FbtsLwchpJqK%2FwKK9k0B69QwbO5QK4dnHw1%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;506&quot; height=&quot;56&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;506&quot; data-origin-height=&quot;56&quot;/&gt;&lt;/span&gt;&lt;/figure&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;데이텀을 붙여도 되고 안붙여도 되는 특이한 기하공차 (물론 의미는 달라짐)&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;진원도 (2D)&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;원통도 (3D)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;원주 흔들림 (2D)&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;온 흔들림 (3D)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;진직도 (2D)&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;평면도 (3D)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;선 윤곽도 (2D)&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;면 윤곽도 (3D)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: center;&quot; 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&gt;선 윤곽도는 공차역이 깊이 값이 없는 &lt;span style=&quot;color: #ef5369;&quot;&gt;평면 형태&lt;/span&gt;(면적)로 생기고&lt;/li&gt;
&lt;li&gt;면 윤곽도는 공차역이 &lt;span style=&quot;color: #ef5369;&quot;&gt;부피 값을 가지는 형태&lt;/span&gt;(공간)로 생긴다.&lt;/li&gt;
&lt;li&gt;윤곽도에는 MMC/LMC 모디파이어 사용 불가 (데이텀 MMB/LMB는 가능)&lt;/li&gt;
&lt;li&gt;윤곽도는 외형선 따라서 만들어지는 기하공차이기 때문에 별, 하트 등 다양한 모양이 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;면 윤곽도&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;그림1.png&quot; data-origin-width=&quot;4434&quot; data-origin-height=&quot;1961&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vkqSX/btsLxk6M9OJ/GVAA2yNqSpTPpKco2RaYZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vkqSX/btsLxk6M9OJ/GVAA2yNqSpTPpKco2RaYZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vkqSX/btsLxk6M9OJ/GVAA2yNqSpTPpKco2RaYZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvkqSX%2FbtsLxk6M9OJ%2FGVAA2yNqSpTPpKco2RaYZk%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;4434&quot; height=&quot;1961&quot; data-filename=&quot;그림1.png&quot; data-origin-width=&quot;4434&quot; data-origin-height=&quot;1961&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;윤곽도의 적용을 받는 치수는 기본치수로
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;외형선 자체가 윤곽도 공차역의 기준으로 쓰이므로 기본치수로 쓰임&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;형상이 이 폭이 3mm인 공차역 부피 공간 안에 들어오면 합격&lt;/li&gt;
&lt;li&gt;현재, 데이텀 참조가 없으므로 공차역의 위치가 공간상 구속되어 있지 않기 때문에 공차역을 움직일 수 있음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;움직여서 공차역 공간안에 들어오는지를 판단 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;면 윤곽도는 &lt;span style=&quot;color: #ef5369;&quot;&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;선 윤곽도&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;선 윤곽도.png&quot; data-origin-width=&quot;3459&quot; data-origin-height=&quot;3613&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5Vt0U/btsLzr4yQid/H8FzjtsijKhu4MUlob32zk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5Vt0U/btsLzr4yQid/H8FzjtsijKhu4MUlob32zk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5Vt0U/btsLzr4yQid/H8FzjtsijKhu4MUlob32zk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5Vt0U%2FbtsLzr4yQid%2FH8FzjtsijKhu4MUlob32zk%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;500&quot; height=&quot;522&quot; data-filename=&quot;선 윤곽도.png&quot; data-origin-width=&quot;3459&quot; data-origin-height=&quot;3613&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;선 윤곽도의 공차역은 깊이가 없는 영역&lt;/li&gt;
&lt;li&gt;각 단면에서의 &lt;span style=&quot;color: #ef5369;&quot;&gt;공차역이 독립적&lt;/span&gt;이다 = &lt;span style=&quot;color: #ef5369;&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-filename=&quot;선 윤곽도.gif&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;687&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjKgPY/btsLyv7meQY/17T8q5IBld9JRemPaxw7uk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjKgPY/btsLyv7meQY/17T8q5IBld9JRemPaxw7uk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjKgPY/btsLyv7meQY/17T8q5IBld9JRemPaxw7uk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bjKgPY/btsLyv7meQY/17T8q5IBld9JRemPaxw7uk/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;600&quot; height=&quot;412&quot; data-filename=&quot;선 윤곽도.gif&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;687&quot;/&gt;&lt;/span&gt;&lt;/figure&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;이전 공차역이 이후 공차역(뒤 새로운 단면)을 검사할때 영향을 미치지 않는다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&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;style3&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;선 윤곽도, 면 윤곽도 차이&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;571&quot; data-origin-height=&quot;378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYg8Cq/btsLyCrR6tY/GZsTvdt9iHUPokwrILW1ik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYg8Cq/btsLyCrR6tY/GZsTvdt9iHUPokwrILW1ik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYg8Cq/btsLyCrR6tY/GZsTvdt9iHUPokwrILW1ik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYg8Cq%2FbtsLyCrR6tY%2FGZsTvdt9iHUPokwrILW1ik%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;400&quot; height=&quot;265&quot; data-origin-width=&quot;571&quot; data-origin-height=&quot;378&quot;/&gt;&lt;/span&gt;&lt;/figure&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;데이텀이 있는 경우 윤곽도&lt;/h3&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;387&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfw7I4/btsLwLDLQTc/k0CcDkiI5SGSkhInx9cP6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfw7I4/btsLwLDLQTc/k0CcDkiI5SGSkhInx9cP6k/img.png&quot; data-alt=&quot;(형상 높이 10)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfw7I4/btsLwLDLQTc/k0CcDkiI5SGSkhInx9cP6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbfw7I4%2FbtsLwLDLQTc%2Fk0CcDkiI5SGSkhInx9cP6k%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;700&quot; height=&quot;288&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;387&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(형상 높이 10)&lt;/figcaption&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;해석) 10.0, 4.3의 위치에서 가로 9.5, 세로 8.5, 높이 10 크기 형상의 폭이 3.0인 공차역(분홍선)을 가지는 홀 형상의 윤곽도&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;윤곽도 기호&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;○ (All Around)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;271&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJeVFB/btsLx94xHEF/tI1QXgxhJdURq49s0BdSM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJeVFB/btsLx94xHEF/tI1QXgxhJdURq49s0BdSM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJeVFB/btsLx94xHEF/tI1QXgxhJdURq49s0BdSM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJeVFB%2FbtsLx94xHEF%2FtI1QXgxhJdURq49s0BdSM0%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;300&quot; height=&quot;217&quot; data-origin-width=&quot;271&quot; data-origin-height=&quot;196&quot;/&gt;&lt;/span&gt;&lt;/figure&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;하나에 국한되는것이 아니라 전체 면에 다 적용된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;381&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biEpF5/btsLxZubsoD/WDmqrcThkj5voKH7ZvZTy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biEpF5/btsLxZubsoD/WDmqrcThkj5voKH7ZvZTy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biEpF5/btsLxZubsoD/WDmqrcThkj5voKH7ZvZTy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiEpF5%2FbtsLxZubsoD%2FWDmqrcThkj5voKH7ZvZTy0%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;700&quot; height=&quot;369&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;381&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;All around 적용시 아래와 같이 공차역이 생성된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2uMLQ/btsLwGialZ3/2t5TnSDJBbftjaCDLLrG11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2uMLQ/btsLwGialZ3/2t5TnSDJBbftjaCDLLrG11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2uMLQ/btsLwGialZ3/2t5TnSDJBbftjaCDLLrG11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2uMLQ%2FbtsLwGialZ3%2F2t5TnSDJBbftjaCDLLrG11%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;700&quot; height=&quot;201&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;206&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;◎ (All Over)&amp;nbsp;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;올오버.png&quot; data-origin-width=&quot;1141&quot; data-origin-height=&quot;782&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLwogH/btsLyah78Hb/yNQPMSUkJ2ekzBNN2loup0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLwogH/btsLyah78Hb/yNQPMSUkJ2ekzBNN2loup0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLwogH/btsLyah78Hb/yNQPMSUkJ2ekzBNN2loup0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLwogH%2FbtsLyah78Hb%2FyNQPMSUkJ2ekzBNN2loup0%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;300&quot; height=&quot;206&quot; data-filename=&quot;올오버.png&quot; data-origin-width=&quot;1141&quot; data-origin-height=&quot;782&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;All around의 기호에서 원하나가 더 있을시 모든 면 전체 형상(3D)으로 적용된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1049&quot; data-origin-height=&quot;806&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0hsbQ/btsLwoov2OO/IHpLeJz0hQyKUZ9JEiJRP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0hsbQ/btsLwoov2OO/IHpLeJz0hQyKUZ9JEiJRP1/img.png&quot; data-alt=&quot;All over 적용시 그림과 같이 공차역이 생성된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0hsbQ/btsLwoov2OO/IHpLeJz0hQyKUZ9JEiJRP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0hsbQ%2FbtsLwoov2OO%2FIHpLeJz0hQyKUZ9JEiJRP1%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;700&quot; height=&quot;538&quot; data-origin-width=&quot;1049&quot; data-origin-height=&quot;806&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;All over 적용시 그림과 같이 공차역이 생성된다.&lt;/figcaption&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://bumjae.tistory.com/139#%EB%A9%B4%20%EC%9C%A4%EA%B3%BD%EB%8F%84-1&quot;&gt;면 윤곽도 예시&lt;/a&gt;에 All over 적용시 높이 치수를 기본치수로 변경해야하고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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-filename=&quot;그림10.png&quot; data-origin-width=&quot;5392&quot; data-origin-height=&quot;2475&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baaJ82/btsLwHVD32o/dzoEsaiaq8w6bYBVZADI41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baaJ82/btsLwHVD32o/dzoEsaiaq8w6bYBVZADI41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baaJ82/btsLwHVD32o/dzoEsaiaq8w6bYBVZADI41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaaJ82%2FbtsLwHVD32o%2FdzoEsaiaq8w6bYBVZADI41%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;5392&quot; height=&quot;2475&quot; data-filename=&quot;그림10.png&quot; data-origin-width=&quot;5392&quot; data-origin-height=&quot;2475&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;All Around와 All Over 차이점&lt;/h3&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;All around는 사용한 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;u&gt;특정 면&lt;/u&gt;&lt;/span&gt;&amp;nbsp;기준에 대해 형상을 제어하고,&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;All over를 사용하면 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;u&gt;전체 면(정면, 배면, 평면, 저면, 좌측, 우측면)&lt;/u&gt;&lt;/span&gt;에 대해 형상을 제어한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;U 모디파이어&lt;/h3&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Unequally - disposed의 약자로 뜻은 불평등한 배치? 처리이다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;윤곽도 지정시 양측으로 &lt;span style=&quot;color: #ef5369;&quot;&gt;공차를 주는데 서로 다른 공차를 부여&lt;/span&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;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;ASME Y14.5 - 2018 11.3.1.2&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;재료가 추가되는 방향으로 공차역을 부여한다.&lt;/span&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;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;External Feature(밖으로 튀어나온 형상)의 경우 바깥으로 먼저 부여,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;Internal Feature(안으로 들어간 형상)의 경우 안으로 먼저 부여&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;1670&quot; data-origin-height=&quot;776&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Imk0R/btsLxs4HwtE/YUY690BpkiNddgl86RDvK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Imk0R/btsLxs4HwtE/YUY690BpkiNddgl86RDvK1/img.png&quot; data-alt=&quot;3.0 ⓤ 2.0&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Imk0R/btsLxs4HwtE/YUY690BpkiNddgl86RDvK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FImk0R%2FbtsLxs4HwtE%2FYUY690BpkiNddgl86RDvK1%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;600&quot; height=&quot;279&quot; data-origin-width=&quot;1670&quot; data-origin-height=&quot;776&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;3.0 ⓤ 2.0&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;3.0의 폭을 가진 공차역을 생성할때 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;u&gt;바깥(재료가 추가되는 방향)&lt;/u&gt;&lt;/span&gt;으로 2.0 &lt;u&gt;안으로&lt;/u&gt; 1.0의 공차역을 할당&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;style5&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;윤곽도와 다른 모양공차의 차이점&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;그림1.png&quot; data-origin-width=&quot;4933&quot; data-origin-height=&quot;1368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLcpfp/btsLx492VbT/5GlT2sVof4j26D533NyPAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLcpfp/btsLx492VbT/5GlT2sVof4j26D533NyPAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLcpfp/btsLx492VbT/5GlT2sVof4j26D533NyPAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLcpfp%2FbtsLx492VbT%2F5GlT2sVof4j26D533NyPAK%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;4933&quot; height=&quot;1368&quot; data-filename=&quot;그림1.png&quot; data-origin-width=&quot;4933&quot; data-origin-height=&quot;1368&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&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;span style=&quot;letter-spacing: 0px;&quot;&gt;진원도 / 원통도 = 공차역의 크기가 정해져있지 않음(내원과 외원 사이의 간격만 일정하면 그만이기 때문)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;윤곽도 = 공차역의 크기가 정해져있음&lt;/li&gt;
&lt;li&gt;그렇기 때문에 모양공차에서 진직/평면/진원/원통에 있는 공차역을 기본공차로&amp;nbsp;설정하고&amp;nbsp;싶다면&amp;nbsp;윤곽도&amp;nbsp;공차로&amp;nbsp;변경하면&amp;nbsp;된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Youtube TeleV2 신입사원 도면강좌 34~35&lt;/blockquote&gt;</description>
      <category>CAD</category>
      <author>bumjae</author>
      <guid isPermaLink="true">https://bumjae.tistory.com/139</guid>
      <comments>https://bumjae.tistory.com/139#entry139comment</comments>
      <pubDate>Wed, 25 Dec 2024 17:16:12 +0900</pubDate>
    </item>
    <item>
      <title>흔들림 공차(원 흔들림, 온 흔들림)</title>
      <link>https://bumjae.tistory.com/138</link>
      <description>&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;흔들림 공차&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; 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;594&quot; data-origin-height=&quot;51&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tmo4g/btsLyvsMXkl/cEo8FMgQHKp0LrXwaSUQD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tmo4g/btsLyvsMXkl/cEo8FMgQHKp0LrXwaSUQD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tmo4g/btsLyvsMXkl/cEo8FMgQHKp0LrXwaSUQD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftmo4g%2FbtsLyvsMXkl%2FcEo8FMgQHKp0LrXwaSUQD1%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;594&quot; height=&quot;51&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;51&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;진원도 + 1차원 = 원통도&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;진직도 + 1차원 = 원통도&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;원주 흔들림 + 1차원 = 온 흔들림&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;1163&quot; data-origin-height=&quot;613&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RN7in/btsLzqLlQLk/E7Im52zyvSnNbFWCrbbgKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RN7in/btsLzqLlQLk/E7Im52zyvSnNbFWCrbbgKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RN7in/btsLzqLlQLk/E7Im52zyvSnNbFWCrbbgKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRN7in%2FbtsLzqLlQLk%2FE7Im52zyvSnNbFWCrbbgKK%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;650&quot; height=&quot;343&quot; data-origin-width=&quot;1163&quot; data-origin-height=&quot;613&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;&lt;span style=&quot;color: #ef5369;&quot;&gt;파이 기호 쓰지 않음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;u&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;무조건 데이텀을 참조&lt;/span&gt;&lt;/u&gt;한다.&lt;/li&gt;
&lt;li&gt;사이즈는 치수에 따라 23~27&lt;/li&gt;
&lt;li&gt;공차역의 직경은 고정되지 않는다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;기본 치수 쓰지않음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ef5369;&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-filename=&quot;그림13.png&quot; data-origin-width=&quot;5619&quot; data-origin-height=&quot;2475&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XfNMU/btsLwHVEdvq/FmKobC2mkq7yM8mik7LKQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XfNMU/btsLwHVEdvq/FmKobC2mkq7yM8mik7LKQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XfNMU/btsLwHVEdvq/FmKobC2mkq7yM8mik7LKQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXfNMU%2FbtsLwHVEdvq%2FFmKobC2mkq7yM8mik7LKQk%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;600&quot; height=&quot;264&quot; data-filename=&quot;그림13.png&quot; data-origin-width=&quot;5619&quot; data-origin-height=&quot;2475&quot;/&gt;&lt;/span&gt;&lt;/figure&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;1씩 공차역이 옮겨가며 모두 만족하면 합격&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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;한다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;355&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yyXMK/btsLxOsNJ2R/IK8I7r9sNJ1wSHNUl6Y2V0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yyXMK/btsLxOsNJ2R/IK8I7r9sNJ1wSHNUl6Y2V0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yyXMK/btsLxOsNJ2R/IK8I7r9sNJ1wSHNUl6Y2V0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyyXMK%2FbtsLxOsNJ2R%2FIK8I7r9sNJ1wSHNUl6Y2V0%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;400&quot; height=&quot;283&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;355&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;온 흔들림은 &lt;u&gt;경사면&lt;/u&gt;이나 &lt;u&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;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;= &lt;span style=&quot;color: #ef5369;&quot;&gt;데이텀 참조 유무&lt;/span&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;554&quot; data-origin-height=&quot;541&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJRZrX/btsLze5nNjL/m5pPmOiKvxrxgoYgQXpXO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJRZrX/btsLze5nNjL/m5pPmOiKvxrxgoYgQXpXO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJRZrX/btsLze5nNjL/m5pPmOiKvxrxgoYgQXpXO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJRZrX%2FbtsLze5nNjL%2Fm5pPmOiKvxrxgoYgQXpXO1%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;350&quot; height=&quot;342&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;554&quot; data-origin-height=&quot;541&quot;/&gt;&lt;/span&gt;&lt;/figure&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;그리고 &lt;span style=&quot;color: #ef5369;&quot;&gt;치수 공차의 크기보다 큰 값 부여가 가능&lt;/span&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;그림14.png&quot; data-origin-width=&quot;5463&quot; data-origin-height=&quot;2475&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blpX9T/btsLwF4HgVE/CkYIEP3PamnCeiPKMgXyJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blpX9T/btsLwF4HgVE/CkYIEP3PamnCeiPKMgXyJK/img.png&quot; data-alt=&quot;수직면 공차 주입, 원주 흔들림 / 온 흔들림&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blpX9T/btsLwF4HgVE/CkYIEP3PamnCeiPKMgXyJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblpX9T%2FbtsLwF4HgVE%2FCkYIEP3PamnCeiPKMgXyJK%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;600&quot; height=&quot;272&quot; data-filename=&quot;그림14.png&quot; data-origin-width=&quot;5463&quot; data-origin-height=&quot;2475&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;수직면 공차 주입, 원주 흔들림 / 온 흔들림&lt;/figcaption&gt;
&lt;/figure&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;blockquote data-ke-style=&quot;style3&quot;&gt;Youtube TeleV2 신입사원 도면강좌 33&lt;/blockquote&gt;</description>
      <category>CAD</category>
      <author>bumjae</author>
      <guid isPermaLink="true">https://bumjae.tistory.com/138</guid>
      <comments>https://bumjae.tistory.com/138#entry138comment</comments>
      <pubDate>Wed, 25 Dec 2024 15:41:04 +0900</pubDate>
    </item>
    <item>
      <title>자세공차(평행도,직각도,경사도), 기본치수</title>
      <link>https://bumjae.tistory.com/137</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v2oYw/btsLttPkfAx/Ds3D3DcYydWqfLqdraqDo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v2oYw/btsLttPkfAx/Ds3D3DcYydWqfLqdraqDo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v2oYw/btsLttPkfAx/Ds3D3DcYydWqfLqdraqDo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv2oYw%2FbtsLttPkfAx%2FDs3D3DcYydWqfLqdraqDo1%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;592&quot; height=&quot;74&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;간단히 설명하면&lt;br /&gt;직각도(수직도) 공차는 90도에 대한 내용&lt;br /&gt;평행도는 0도에 대한 내용&lt;br /&gt;경사도는&amp;nbsp;모든&amp;nbsp;각도에&amp;nbsp;대한&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;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;자세공차의 특징&amp;nbsp;&lt;/h2&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: #0593d3;&quot;&gt; 축을&amp;nbsp;데이텀&lt;/span&gt;&amp;nbsp;삼아&amp;nbsp;다른&amp;nbsp;&lt;span style=&quot;color: #0593d3;&quot;&gt;축&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: center;&quot;&gt;과&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;면&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: center;&quot;&gt;을 관리, 반대로 &lt;span style=&quot;color: #ef5369;&quot;&gt;면을 데이텀&lt;/span&gt; 삼아 다른&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;축&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: center;&quot;&gt;과&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;면&lt;/span&gt;을 관리할 수 있다.&lt;/li&gt;
&lt;li&gt;자세공차를 안 쓰면 처음 제작의 어려움이 있을 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;u&gt;항상 기준이 되는 데이텀을 참조&lt;/u&gt;&lt;/span&gt;해야 한다. (데이텀이 없으면 틀린 도면)&lt;/li&gt;
&lt;li&gt;자세공차는 평면도의 역할을 동시에 하고 있으면서 방향을 추가한 것이다.&lt;/li&gt;
&lt;li&gt;공차역의 위치는 고정 되어있지 않다.&lt;/li&gt;
&lt;li&gt;공차역의 &lt;u&gt;방향만 구속&lt;/u&gt; 되어있다. (마음대로 공차역을 움직일 수는 있으나 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;u&gt;각도는 유지하며 움직임&lt;/u&gt;&lt;/span&gt;)&lt;/li&gt;
&lt;li&gt;&lt;u&gt;직각도(수직도)랑&amp;nbsp;평행도는&amp;nbsp;기본치수를&amp;nbsp;쓰지&amp;nbsp;않는다.&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;경사도는 &lt;u&gt;예외적으로 경사를 알려주는 각도치수&lt;/u&gt;가 쓰이기는 한다.&lt;/li&gt;
&lt;/ul&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: center;&quot; data-ke-size=&quot;size20&quot;&gt;예시&lt;/h4&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;644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAGzXu/btsLtaWHl3B/WYxamw11i6OKe6umamaKEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAGzXu/btsLtaWHl3B/WYxamw11i6OKe6umamaKEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAGzXu/btsLtaWHl3B/WYxamw11i6OKe6umamaKEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAGzXu%2FbtsLtaWHl3B%2FWYxamw11i6OKe6umamaKEk%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;1089&quot; height=&quot;644&quot; data-origin-width=&quot;1089&quot; data-origin-height=&quot;644&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;직각도(수직도)&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_수직도.png&quot; data-origin-width=&quot;2983&quot; data-origin-height=&quot;1561&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo7HDo/btsLtcfU2sA/KDaCEm82KuYcZihitohxfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo7HDo/btsLtcfU2sA/KDaCEm82KuYcZihitohxfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo7HDo/btsLtcfU2sA/KDaCEm82KuYcZihitohxfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo7HDo%2FbtsLtcfU2sA%2FKDaCEm82KuYcZihitohxfK%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;2983&quot; height=&quot;1561&quot; data-filename=&quot;edited_수직도.png&quot; data-origin-width=&quot;2983&quot; data-origin-height=&quot;1561&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;데이텀 A 면에 대해 수직인 상태의 직경과 폭 0.12의 공차역이 생기고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이 공차역 안에 홀 센터가 모두 들어와야 합격&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;평행도&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;평행도.png&quot; data-origin-width=&quot;2172&quot; data-origin-height=&quot;1063&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J4tdT/btsLtqyimjv/6vMusgHgD8PTRMvu43rG1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J4tdT/btsLtqyimjv/6vMusgHgD8PTRMvu43rG1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J4tdT/btsLtqyimjv/6vMusgHgD8PTRMvu43rG1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ4tdT%2FbtsLtqyimjv%2F6vMusgHgD8PTRMvu43rG1k%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;600&quot; height=&quot;294&quot; data-filename=&quot;평행도.png&quot; data-origin-width=&quot;2172&quot; data-origin-height=&quot;1063&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;데이텀 A 면에 평행한 폭이 0.12인 두평면 사이의 공차역이 생긴다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;경사도&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;경사도.png&quot; data-origin-width=&quot;2570&quot; data-origin-height=&quot;2145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceaGUZ/btsLttu2RRr/edOEFAxGGFIWXEVsxUuSmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceaGUZ/btsLttu2RRr/edOEFAxGGFIWXEVsxUuSmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceaGUZ/btsLttu2RRr/edOEFAxGGFIWXEVsxUuSmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceaGUZ%2FbtsLttu2RRr%2FedOEFAxGGFIWXEVsxUuSmK%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;600&quot; height=&quot;501&quot; data-filename=&quot;경사도.png&quot; data-origin-width=&quot;2570&quot; data-origin-height=&quot;2145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;데이텀 B면의 30도 만큼 키울어진 폭 0.12의 두평면 사이의 공차역이 생긴다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;경사도를 그냥 각도+공차로 관리하면 안될까?&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;579&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dI4CjI/btsLqXEvCke/87Iovk37UDykq2xA5kCuBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dI4CjI/btsLqXEvCke/87Iovk37UDykq2xA5kCuBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dI4CjI/btsLqXEvCke/87Iovk37UDykq2xA5kCuBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdI4CjI%2FbtsLqXEvCke%2F87Iovk37UDykq2xA5kCuBK%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;600&quot; height=&quot;299&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;579&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;위 처럼 공차를 적용할 경우 도합 0.4도의 부채꼴 형태의 공차역이 나올것이다.&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;제품이 엄청 불규칙해도 전부 0.4도 폭의 공차역에 들어와 통과될 것이다. (관리가 안된다.)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;기본치수&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;기본치수: 이론적으로 정확한 치수 (숫자에 네모로 채워진 형태)&lt;br /&gt;&amp;rarr; &lt;span style=&quot;color: #ef5369;&quot;&gt;중요!&lt;/span&gt; &lt;u&gt;형상의 위치와 방향을 알려주는 치수가 아니라 &lt;/u&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;u&gt;공차역의&amp;nbsp;위치와&amp;nbsp;방향&lt;/u&gt;을&amp;nbsp;알려주는(구속하는)&amp;nbsp;치수&lt;/span&gt;&lt;/b&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;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;기본치수 필요유무&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 187px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot; colspan=&quot;2&quot;&gt;공차종류&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;기본치수 필요유무&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 23.2558%; text-align: center;&quot; rowspan=&quot;2&quot;&gt;모양공차&lt;/td&gt;
&lt;td style=&quot;width: 26.7442%; height: 17px; text-align: center;&quot;&gt;진원도,원통도,진직도,평면도&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 26.7442%; text-align: center;&quot;&gt;선/면 윤곽도&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 23.2558%; text-align: center;&quot; rowspan=&quot;2&quot;&gt;자세공차&lt;/td&gt;
&lt;td style=&quot;width: 26.7442%; height: 17px; text-align: center;&quot;&gt;직각도,평행도&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 26.7442%; height: 17px; text-align: center;&quot;&gt;경사도&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;△ &lt;br /&gt;(방향을&amp;nbsp;나타내는&amp;nbsp;기본치수만&amp;nbsp;필요)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.2558%; text-align: center;&quot;&gt;흔들림 공차&lt;/td&gt;
&lt;td style=&quot;width: 26.7442%; text-align: center;&quot;&gt;원 흔들림, 온 흔들림&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 23.2558%; text-align: center;&quot; rowspan=&quot;2&quot;&gt;위치공차&lt;/td&gt;
&lt;td style=&quot;width: 26.7442%; height: 17px; text-align: center;&quot;&gt;위치도&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 26.7442%; height: 17px; text-align: center;&quot;&gt;동심도,대칭도&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;X&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;blockquote data-ke-style=&quot;style3&quot;&gt;Youtube TeleV2 신입사원 도면강좌 31~32&lt;/blockquote&gt;</description>
      <category>CAD</category>
      <author>bumjae</author>
      <guid isPermaLink="true">https://bumjae.tistory.com/137</guid>
      <comments>https://bumjae.tistory.com/137#entry137comment</comments>
      <pubDate>Mon, 23 Dec 2024 10:57:09 +0900</pubDate>
    </item>
    <item>
      <title>MMB</title>
      <link>https://bumjae.tistory.com/136</link>
      <description>&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;기존 RFS 개념&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;299&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8GOI0/btsLrC7FPfo/6JhdkrW32EAbJCczPpWxj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8GOI0/btsLrC7FPfo/6JhdkrW32EAbJCczPpWxj1/img.png&quot; data-alt=&quot;RFS (Regardless of Reature Size) / 형체치수무관계&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8GOI0/btsLrC7FPfo/6JhdkrW32EAbJCczPpWxj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8GOI0%2FbtsLrC7FPfo%2F6JhdkrW32EAbJCczPpWxj1%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;600&quot; height=&quot;350&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;299&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;RFS (Regardless of Reature Size) / 형체치수무관계&lt;/figcaption&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;꼬다리의 크기와 관계없이 공차역의 크기는 항상 0.4 파이이다.&lt;/li&gt;
&lt;li&gt;최대 축간 거리 = 두 축이 최대한 떨어질 수 있는 거리 (몸통 축과 꼬다리 축이 최대한 떨어질 수 있는 거리)&lt;/li&gt;
&lt;li&gt;최대 축간 거리 = 공차역의 절반&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;AT MMC 개념&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo21Nj/btsLt42F8Nn/kBRW5gLkC32KLLtJOdp4jk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo21Nj/btsLt42F8Nn/kBRW5gLkC32KLLtJOdp4jk/img.png&quot; data-alt=&quot;AT MMC&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo21Nj/btsLt42F8Nn/kBRW5gLkC32KLLtJOdp4jk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo21Nj%2FbtsLt42F8Nn%2FkBRW5gLkC32KLLtJOdp4jk%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;600&quot; height=&quot;342&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;464&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AT MMC&lt;/figcaption&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;꼬다리의 크기에 따라 공차역의 크기도 변경된다.&lt;/li&gt;
&lt;li&gt;최대 축간 거리 = 공차역의 절반&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;AT MMB&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kUOl8/btsLrhCEJZG/aSyBo1XKV7YelcFked1KA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kUOl8/btsLrhCEJZG/aSyBo1XKV7YelcFked1KA1/img.png&quot; data-alt=&quot;AT MMB&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kUOl8/btsLrhCEJZG/aSyBo1XKV7YelcFked1KA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkUOl8%2FbtsLrhCEJZG%2FaSyBo1XKV7YelcFked1KA1%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;600&quot; height=&quot;334&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;453&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AT MMB&lt;/figcaption&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;MMB는 기준(몸통의) 크기에 따라 바뀜&lt;/li&gt;
&lt;li&gt;몸통크기에서 증가 감소된 수치의 절반만큼 축간 거리가 증가함&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;공차역의 크기가 늘어나지 않는다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;공차역의 시프팅(Shifting : 이동하는 것)을 허용하기 때문에 축간 거리가 늘어남&lt;/li&gt;
&lt;/ul&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;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;MMC vs MMB 비교&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;771&quot; data-origin-height=&quot;365&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5Jx6q/btsLsi1YIeu/Yg5dNE7mVEZ8BRbtnhoHM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5Jx6q/btsLsi1YIeu/Yg5dNE7mVEZ8BRbtnhoHM1/img.png&quot; data-alt=&quot;좌측 MMC : 공차역의 크기가 커짐 / 우 MMB : 공차역의 크기가 일정함&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5Jx6q/btsLsi1YIeu/Yg5dNE7mVEZ8BRbtnhoHM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5Jx6q%2FbtsLsi1YIeu%2FYg5dNE7mVEZ8BRbtnhoHM1%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;600&quot; height=&quot;284&quot; data-origin-width=&quot;771&quot; data-origin-height=&quot;365&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;좌측 MMC : 공차역의 크기가 커짐 / 우 MMB : 공차역의 크기가 일정함&lt;/figcaption&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;아래 그림같은 경우 MMB이기 때문에 합격이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(최대 축간 거리 1.2까지 허용, 공차역의 크기 일정하며, 시프팅 가능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 몸통을 스캔해서 나온 축을 데이텀으로 삼는 것이 아니라 &lt;span style=&quot;color: #ef5369;&quot;&gt;실제하지 않는 MMB의 축을 데이텀으로 삼겠다는 것&lt;/span&gt;이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;그림1.png&quot; data-origin-width=&quot;3229&quot; data-origin-height=&quot;1443&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KbNOz/btsLrQknDyf/MPNrp3AtqppdQsdUVkRAEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KbNOz/btsLrQknDyf/MPNrp3AtqppdQsdUVkRAEk/img.png&quot; data-alt=&quot;MMB 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KbNOz/btsLrQknDyf/MPNrp3AtqppdQsdUVkRAEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKbNOz%2FbtsLrQknDyf%2FMPNrp3AtqppdQsdUVkRAEk%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;800&quot; height=&quot;358&quot; data-filename=&quot;그림1.png&quot; data-origin-width=&quot;3229&quot; data-origin-height=&quot;1443&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;MMB 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;즉, MMB의 사용 이유는 &lt;span style=&quot;color: #ef5369;&quot;&gt;제작자 입장에서 편함, 검사를 용이&lt;/span&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;AT MMC, AT MMB 동시 사용&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;709&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MCLOH/btsLrjHjmN6/KlYJczlsLZgdC4BEu3Ukz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MCLOH/btsLrjHjmN6/KlYJczlsLZgdC4BEu3Ukz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MCLOH/btsLrjHjmN6/KlYJczlsLZgdC4BEu3Ukz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMCLOH%2FbtsLrjHjmN6%2FKlYJczlsLZgdC4BEu3Ukz0%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;800&quot; height=&quot;394&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;709&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;꼬다리 크기에 따라 공차역 크기도 변경되고 몸통 크기에 따라 축간거리도 변경된다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;데이텀 시프팅이란?&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;MMB 바운더리의 중심축을 데이텀으로 삼아 MMB를 이동시켜도 공차역의 크기는 일정한 상태&lt;/span&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kUOl8/btsLrhCEJZG/aSyBo1XKV7YelcFked1KA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kUOl8/btsLrhCEJZG/aSyBo1XKV7YelcFked1KA1/img.png&quot; data-alt=&quot;AT MMB&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kUOl8/btsLrhCEJZG/aSyBo1XKV7YelcFked1KA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkUOl8%2FbtsLrhCEJZG%2FaSyBo1XKV7YelcFked1KA1%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;600&quot; height=&quot;334&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;453&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AT MMB&lt;/figcaption&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;MMB는 몸통의 크기에 따라 최대 축간 거리가 변경됨&lt;/li&gt;
&lt;li&gt;위 도면에서 몸통은 19~21까지 가능&lt;/li&gt;
&lt;li&gt;즉, MMB는 21파이의 사이즈를 가짐&lt;/li&gt;
&lt;li&gt;최대 축간 거리 = 0.2 + (MMB - 실제 몸통의 외경) / 2&lt;/li&gt;
&lt;li&gt;하지만 공차역의 크기는 변하지 않음&lt;/li&gt;
&lt;li&gt;왜냐하면&amp;nbsp;데이터&amp;nbsp;시프팅이&amp;nbsp;가능하기&amp;nbsp;때문&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;730&quot; data-origin-height=&quot;389&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pxObq/btsLrMoMlQ5/QuqbbJSLSbtpCFqPmuSyN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pxObq/btsLrMoMlQ5/QuqbbJSLSbtpCFqPmuSyN1/img.png&quot; data-alt=&quot;3D 형태&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pxObq/btsLrMoMlQ5/QuqbbJSLSbtpCFqPmuSyN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpxObq%2FbtsLrMoMlQ5%2FQuqbbJSLSbtpCFqPmuSyN1%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;600&quot; height=&quot;320&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;389&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;3D 형태&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;위 그림처럼 몸통의 중심축이 아닌 &lt;span style=&quot;color: #ef5369;&quot;&gt;MMB 바운더리의 중심축을 데이텀 A로 삼게 됨&lt;/span&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;그림2.png&quot; data-origin-width=&quot;5146&quot; data-origin-height=&quot;1409&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N0SOQ/btsLsqySUAU/vC7OTKkFcQ6rHITryUx5XK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N0SOQ/btsLsqySUAU/vC7OTKkFcQ6rHITryUx5XK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N0SOQ/btsLsqySUAU/vC7OTKkFcQ6rHITryUx5XK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN0SOQ%2FbtsLsqySUAU%2FvC7OTKkFcQ6rHITryUx5XK%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;860&quot; height=&quot;235&quot; data-filename=&quot;그림2.png&quot; data-origin-width=&quot;5146&quot; data-origin-height=&quot;1409&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;여기서 MMB는 21파이, 공차역이 0.4파이인데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;MMB를 어디로든 이동시켜도 공차역도 같이 움직이기 때문에 공차역의 크기는 일정함&lt;/span&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;p style=&quot;text-align: center;&quot; 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;MMC, LMC, MMB 모디파이어를 사용하는 이유는 &lt;u&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;blockquote data-ke-style=&quot;style3&quot;&gt;Youtube TeleV2 신입사원 도면강좌 27~30&lt;/blockquote&gt;</description>
      <category>CAD</category>
      <author>bumjae</author>
      <guid isPermaLink="true">https://bumjae.tistory.com/136</guid>
      <comments>https://bumjae.tistory.com/136#entry136comment</comments>
      <pubDate>Mon, 23 Dec 2024 09:19:37 +0900</pubDate>
    </item>
    <item>
      <title>모양공차 (진원도,원통도,진직도,평면도), 모양공차 오답 케이스</title>
      <link>https://bumjae.tistory.com/135</link>
      <description>&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;진원도, 원통도&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pxIZy/btsLttV0UcM/J1sYssk6nxHP5KgyU1uyrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pxIZy/btsLttV0UcM/J1sYssk6nxHP5KgyU1uyrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pxIZy/btsLttV0UcM/J1sYssk6nxHP5KgyU1uyrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpxIZy%2FbtsLttV0UcM%2FJ1sYssk6nxHP5KgyU1uyrk%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;500&quot; height=&quot;183&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;260&quot;/&gt;&lt;/span&gt;&lt;/figure&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;원형 단면이 얼마나 제대로 된 &quot;원&quot;인지 관리해 주는 게 진원도이다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&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;style2&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGdXS1/btsLtexVkbZ/bkCkdOGVPokrpT34CVupG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGdXS1/btsLtexVkbZ/bkCkdOGVPokrpT34CVupG0/img.png&quot; data-alt=&quot;진원도를 붙일수 있는 형상&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGdXS1/btsLtexVkbZ/bkCkdOGVPokrpT34CVupG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGdXS1%2FbtsLtexVkbZ%2FbkCkdOGVPokrpT34CVupG0%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;500&quot; height=&quot;150&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;314&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;진원도를 붙일수 있는 형상&lt;/figcaption&gt;
&lt;/figure&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;283&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5dCjd/btsLqRqLdkJ/i4juL4V3yrPerL9EWJcgGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5dCjd/btsLqRqLdkJ/i4juL4V3yrPerL9EWJcgGK/img.png&quot; data-alt=&quot;원통도를 붙일수 있는 형상&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5dCjd/btsLqRqLdkJ/i4juL4V3yrPerL9EWJcgGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5dCjd%2FbtsLqRqLdkJ%2Fi4juL4V3yrPerL9EWJcgGK%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;200&quot; height=&quot;222&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;283&quot; data-origin-height=&quot;314&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;원통도를 붙일수 있는 형상&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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;&lt;u&gt;데이텀이 필요 없는 기하공차&lt;/u&gt;&lt;/b&gt;이다.&lt;br /&gt;또한, 공차값 앞에 &amp;Oslash;(파이)를 붙이지 않는다.&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;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;진원도, 원통도 예시&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OLxfx/btsLqyLBFx3/B7i59plgxcCfwxEZ4CkSek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OLxfx/btsLqyLBFx3/B7i59plgxcCfwxEZ4CkSek/img.png&quot; data-alt=&quot;제작자를 편하게 해주고 싶어 공차를 60 +- 20으로 크게 줌&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OLxfx/btsLqyLBFx3/B7i59plgxcCfwxEZ4CkSek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOLxfx%2FbtsLqyLBFx3%2FB7i59plgxcCfwxEZ4CkSek%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;550&quot; height=&quot;336&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;586&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;제작자를 편하게 해주고 싶어 공차를 60 +- 20으로 크게 줌&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;579&quot; data-origin-height=&quot;329&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKTXt9/btsLtcfM7ln/KXZ8ilsvNjhkaxKeVkOtN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKTXt9/btsLtcfM7ln/KXZ8ilsvNjhkaxKeVkOtN0/img.png&quot; data-alt=&quot;실제로 이렇게 만들어온 경우&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKTXt9/btsLtcfM7ln/KXZ8ilsvNjhkaxKeVkOtN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKTXt9%2FbtsLtcfM7ln%2FKXZ8ilsvNjhkaxKeVkOtN0%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;550&quot; height=&quot;313&quot; data-origin-width=&quot;579&quot; data-origin-height=&quot;329&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실제로 이렇게 만들어온 경우&lt;/figcaption&gt;
&lt;/figure&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;p style=&quot;text-align: center;&quot; 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;854&quot; data-origin-height=&quot;508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GA1jE/btsLssDqcVc/5iAqIo3zVzulid6MDRmiV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GA1jE/btsLssDqcVc/5iAqIo3zVzulid6MDRmiV1/img.png&quot; data-alt=&quot;진원도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GA1jE/btsLssDqcVc/5iAqIo3zVzulid6MDRmiV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGA1jE%2FbtsLssDqcVc%2F5iAqIo3zVzulid6MDRmiV1%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;550&quot; height=&quot;327&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;508&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;진원도&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;주의 : 표면에 직접 찍어야 한다.&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;/span&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;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;진원도 1.0 : 두 동심원이 만든 폭 1.0짜리 띠 영역 (공차역)&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;824&quot; data-origin-height=&quot;318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b90uXa/btsLqQyAkiE/efH3YLHcCFswykEH2niNA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b90uXa/btsLqQyAkiE/efH3YLHcCFswykEH2niNA1/img.png&quot; data-alt=&quot;진원도 표시 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b90uXa/btsLqQyAkiE/efH3YLHcCFswykEH2niNA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb90uXa%2FbtsLqQyAkiE%2FefH3YLHcCFswykEH2niNA1%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;600&quot; height=&quot;232&quot; data-origin-width=&quot;824&quot; data-origin-height=&quot;318&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;진원도 표시 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;원 다운 원이 생성된다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;진원도에서 축이 틀어진 예시&lt;/h3&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;진원도의 경우&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;제품의 형상 자체에만 관심&lt;/span&gt;이 있기 때문에&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다른 것 대비&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&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-filename=&quot;1.png&quot; data-origin-width=&quot;3420&quot; data-origin-height=&quot;1378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bphEQK/btsLqPzHc2u/kUXT4ZJssNPGTLVQoKhDOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bphEQK/btsLqPzHc2u/kUXT4ZJssNPGTLVQoKhDOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bphEQK/btsLqPzHc2u/kUXT4ZJssNPGTLVQoKhDOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbphEQK%2FbtsLqPzHc2u%2FkUXT4ZJssNPGTLVQoKhDOK%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;800&quot; height=&quot;322&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;3420&quot; data-origin-height=&quot;1378&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;진원도&lt;/b&gt; : 각 단면마다 &lt;span style=&quot;color: #ef5369;&quot;&gt;매번 공차역이 새로 생김&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그렇기 때문에 &quot;모두가 일치해야 한다&quot; 싶을 때 원통도를 사용한다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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;&lt;b&gt;원통도&lt;/b&gt; : &lt;span style=&quot;color: #ef5369;&quot;&gt;한 번 생긴 공차역 안에 모든 것이 다 들어와야 만족&lt;/span&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;공차가 만약 60+-20이 아니라 60+-0.1이면 의미가 없다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;983&quot; data-origin-height=&quot;543&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q4utc/btsLqQFnpXc/KjhFI2ISWDFN4fFBiGzZWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q4utc/btsLqQFnpXc/KjhFI2ISWDFN4fFBiGzZWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q4utc/btsLqQFnpXc/KjhFI2ISWDFN4fFBiGzZWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq4utc%2FbtsLqQFnpXc%2FKjhFI2ISWDFN4fFBiGzZWk%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;500&quot; height=&quot;276&quot; data-origin-width=&quot;983&quot; data-origin-height=&quot;543&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그렇기 때문에 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;무조건 사이즈 공차보다 진원도 공차의 폭이 작아야 한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;진직도&lt;/h2&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;진직도를 한 차원 확장하면 평면도&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;간단히 하면 진직도, 평면도의 관계는 진원도, 원통도의 관계와 같다.&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;305&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l5fmk/btsLrXqdOBD/2n8rWFeynzjUA1RtCgBmUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l5fmk/btsLrXqdOBD/2n8rWFeynzjUA1RtCgBmUK/img.png&quot; data-alt=&quot;예시1) 표면에 직접 붙인 타입&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l5fmk/btsLrXqdOBD/2n8rWFeynzjUA1RtCgBmUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl5fmk%2FbtsLrXqdOBD%2F2n8rWFeynzjUA1RtCgBmUK%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;500&quot; height=&quot;172&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;305&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예시1) 표면에 직접 붙인 타입&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VuUSD/btsLtbVwRyR/srHieeMyQi1ZxaqCw5cFeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VuUSD/btsLtbVwRyR/srHieeMyQi1ZxaqCw5cFeK/img.png&quot; data-alt=&quot;예시2) 치수 밑에 붙인 타입&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VuUSD/btsLtbVwRyR/srHieeMyQi1ZxaqCw5cFeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVuUSD%2FbtsLtbVwRyR%2FsrHieeMyQi1ZxaqCw5cFeK%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;500&quot; height=&quot;139&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예시2) 치수 밑에 붙인 타입&lt;/figcaption&gt;
&lt;/figure&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;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;Oslash;기호 역시 사용하지 않는다. (예시 1 에만 해당)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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;진직도는 기하공차를 &lt;span style=&quot;color: #ef5369;&quot;&gt;표면에 바로 붙이냐&lt;/span&gt; / &lt;span style=&quot;color: #ef5369;&quot;&gt;관련 치수 밑에 붙이냐&lt;/span&gt;에 따라 의미가 크게 달라짐&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;예시 1 안에서도 뷰의 방향에 따라 규제의 방향이 달라짐&lt;/p&gt;
&lt;p style=&quot;text-align: center;&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;style5&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;진직도 Type1 - 표면 위 각 직선 성분의 편차를 관리&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBJSyu/btsLq9q2tDI/PgdmnTahtdkvsleJdUfTQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBJSyu/btsLq9q2tDI/PgdmnTahtdkvsleJdUfTQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBJSyu/btsLq9q2tDI/PgdmnTahtdkvsleJdUfTQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBJSyu%2FbtsLq9q2tDI%2FPgdmnTahtdkvsleJdUfTQK%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;450&quot; height=&quot;360&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;418&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;진직도 타입 1은 방향성이 있다.&lt;/span&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;p style=&quot;text-align: center;&quot; 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;1084&quot; data-origin-height=&quot;435&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bq5p27/btsLrA9TisN/O1pTHpTYkOkbl6xpaavyw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bq5p27/btsLrA9TisN/O1pTHpTYkOkbl6xpaavyw1/img.png&quot; data-alt=&quot;기울어진 예&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bq5p27/btsLrA9TisN/O1pTHpTYkOkbl6xpaavyw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbq5p27%2FbtsLrA9TisN%2FO1pTHpTYkOkbl6xpaavyw1%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;650&quot; height=&quot;261&quot; data-origin-width=&quot;1084&quot; data-origin-height=&quot;435&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기울어진 예&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;제품의 표면이 기울어져 있어도 폭이 0.1인 공차역에 가둘 수만 있다면 진직도로써 만족한다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&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;style3&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; 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;662&quot; data-origin-height=&quot;434&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwQAUr/btsLtVSfR9F/1X10PuUM2TBDgYAog7ZjVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwQAUr/btsLtVSfR9F/1X10PuUM2TBDgYAog7ZjVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwQAUr/btsLtVSfR9F/1X10PuUM2TBDgYAog7ZjVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwQAUr%2FbtsLtVSfR9F%2F1X10PuUM2TBDgYAog7ZjVk%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;400&quot; height=&quot;262&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;434&quot;/&gt;&lt;/span&gt;&lt;/figure&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;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;즉, 진직도는 제품을 제작하기 전에 한번 더 걸러주는 정제(Refinement)의 역할을 해준다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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;진직도 역시 진원도처럼 &lt;span style=&quot;color: #ef5369;&quot;&gt;무조건 사이즈 공차의 폭&lt;/span&gt;보다 &lt;span style=&quot;color: #ef5369;&quot;&gt;진직도 공차의 폭이 더 작아야 의미&lt;/span&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;진직도 Type1에서 가능한 최악의 케이스&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;211&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/euGNBC/btsLtrYbtBA/TYf5YAZqvg2Fsg2CqOiAYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/euGNBC/btsLtrYbtBA/TYf5YAZqvg2Fsg2CqOiAYK/img.png&quot; data-alt=&quot;원통형에 진직도를 명시할 경우&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/euGNBC/btsLtrYbtBA/TYf5YAZqvg2Fsg2CqOiAYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeuGNBC%2FbtsLtrYbtBA%2FTYf5YAZqvg2Fsg2CqOiAYK%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;500&quot; height=&quot;135&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;211&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;원통형에 진직도를 명시할 경우&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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-filename=&quot;타입1.png&quot; data-origin-width=&quot;1998&quot; data-origin-height=&quot;2763&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKZr40/btsLtTNGDwy/vFCq9EB2KP8TohleSGtdQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKZr40/btsLtTNGDwy/vFCq9EB2KP8TohleSGtdQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKZr40/btsLtTNGDwy/vFCq9EB2KP8TohleSGtdQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKZr40%2FbtsLtTNGDwy%2FvFCq9EB2KP8TohleSGtdQ0%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;400&quot; height=&quot;553&quot; data-filename=&quot;타입1.png&quot; data-origin-width=&quot;1998&quot; data-origin-height=&quot;2763&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;타입 1에서는 위처럼 어떠한 최악의 경우에도 MMC boundary를 넘어서지 못한다. (넘으면 불량)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(AME의 축을 사용)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;ASME 14.5 / 5.8.1 Rule #1&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;어떤 형상이든 그 형상이 FOS면 MMC 바운더리를 넘어설 수 없다.&lt;/span&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;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;하지만, 타입 2에서는 가능하다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;진직도 Type2 : FOS(Feature Of Size)의 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;u&gt;치수&lt;/u&gt;&lt;/span&gt;에 붙인 경우&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;361&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2woY1/btsLrAhD3bB/L1j98H37o32RCfuUkcDq51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2woY1/btsLrAhD3bB/L1j98H37o32RCfuUkcDq51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2woY1/btsLrAhD3bB/L1j98H37o32RCfuUkcDq51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2woY1%2FbtsLrAhD3bB%2FL1j98H37o32RCfuUkcDq51%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;600&quot; height=&quot;363&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;361&quot;/&gt;&lt;/span&gt;&lt;/figure&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;median line을 먼저 찾은 뒤 그걸 감쌀 수 있는 0.1 파이의 공차역을 찾는다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Median Line이 원통형 공차역 안에 들어오는지를 본다.&lt;/li&gt;
&lt;li&gt;타입 2는 원통형 공차역을 가지므로, &amp;Oslash;기호를 기입한다.&lt;/li&gt;
&lt;li&gt;타입 2는 제품의 형상이 MMC boundary 밖으로 나갈 수 있다.&lt;/li&gt;
&lt;li&gt;위 그림의 OB(17.1)가 MMC(17.0) 보다 큰데 상관없다.&lt;/li&gt;
&lt;li&gt;타입 2는 &lt;span style=&quot;color: #ef5369;&quot;&gt;사이즈 공차의 폭&lt;/span&gt;보다 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;span style=&quot;text-align: center;&quot;&gt;큰&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;진직도 공차값&lt;/span&gt;도 넣어줄 수 있다.&lt;/li&gt;
&lt;li&gt;MMC/LMC 모디파이어도 붙일 수 있다.&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;1092&quot; data-origin-height=&quot;298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8sGg2/btsLrHOyDFr/AafxKiSgCTAhKQxNl2YFC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8sGg2/btsLrHOyDFr/AafxKiSgCTAhKQxNl2YFC0/img.png&quot; data-alt=&quot;AT MMC&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8sGg2/btsLrHOyDFr/AafxKiSgCTAhKQxNl2YFC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8sGg2%2FbtsLrHOyDFr%2FAafxKiSgCTAhKQxNl2YFC0%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;600&quot; height=&quot;164&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;298&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AT MMC&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;708&quot; data-origin-height=&quot;537&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brV9AU/btsLqyY5JHu/wNyLKuKEkbNkbw65jE9e30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brV9AU/btsLqyY5JHu/wNyLKuKEkbNkbw65jE9e30/img.png&quot; data-alt=&quot;AT MMC / VC&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brV9AU/btsLqyY5JHu/wNyLKuKEkbNkbw65jE9e30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrV9AU%2FbtsLqyY5JHu%2FwNyLKuKEkbNkbw65jE9e30%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;600&quot; height=&quot;455&quot; data-origin-width=&quot;708&quot; data-origin-height=&quot;537&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AT MMC / VC&lt;/figcaption&gt;
&lt;/figure&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;직경&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;진직도 공차역&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&amp;Oslash;16.8&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&amp;Oslash;0.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&amp;Oslash;16.0&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&amp;Oslash;1.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&amp;Oslash;15.0&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&amp;Oslash;2.1&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;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;진직도는 &quot;단위길이당&quot; 컨트롤이 가능&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;995&quot; data-origin-height=&quot;284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccGJ9t/btsLs9wAklZ/e8X3JqqJPhdfZXx2a77d2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccGJ9t/btsLs9wAklZ/e8X3JqqJPhdfZXx2a77d2K/img.png&quot; data-alt=&quot;단위 길이당 컨트롤 / 임의의 25mm 당 0.1 (그냥 검사자 마음대로 아무데나 25mm 끊은 구간)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccGJ9t/btsLs9wAklZ/e8X3JqqJPhdfZXx2a77d2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccGJ9t%2FbtsLs9wAklZ%2Fe8X3JqqJPhdfZXx2a77d2K%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;600&quot; height=&quot;171&quot; data-origin-width=&quot;995&quot; data-origin-height=&quot;284&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;단위 길이당 컨트롤 / 임의의 25mm 당 0.1 (그냥 검사자 마음대로 아무데나 25mm 끊은 구간)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;327&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRq09l/btsLriPelt7/bpzQXkwz1FyGnPykE4gkQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRq09l/btsLriPelt7/bpzQXkwz1FyGnPykE4gkQK/img.png&quot; data-alt=&quot;너무 휘지 않았음 하는 경우&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRq09l/btsLriPelt7/bpzQXkwz1FyGnPykE4gkQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRq09l%2FbtsLriPelt7%2FbpzQXkwz1FyGnPykE4gkQK%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;600&quot; height=&quot;197&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;327&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;너무 휘지 않았음 하는 경우&lt;/figcaption&gt;
&lt;/figure&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;단위길이 규제 (아랫줄)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;평면도&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; 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;907&quot; data-origin-height=&quot;796&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xgnZO/btsLq9q2BAu/J6KTe6pJ2rvQYQJGAXz64K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xgnZO/btsLq9q2BAu/J6KTe6pJ2rvQYQJGAXz64K/img.png&quot; data-alt=&quot;예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xgnZO/btsLq9q2BAu/J6KTe6pJ2rvQYQJGAXz64K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxgnZO%2FbtsLq9q2BAu%2FJ6KTe6pJ2rvQYQJGAXz64K%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;500&quot; height=&quot;439&quot; data-origin-width=&quot;907&quot; data-origin-height=&quot;796&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예시&lt;/figcaption&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;데이텀 참조 불가&lt;/li&gt;
&lt;li&gt;&amp;Oslash; 사용 불가&lt;/li&gt;
&lt;li&gt;편차 0.5 이내일 것&lt;/li&gt;
&lt;/ul&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;해당 평면을 구성하는 모든 점들이 0.5의 갭을 가진 나란한 두 평면 사이의 공간에 전부 들어오게 해라&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;379&quot; data-origin-height=&quot;215&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WXAZ2/btsLslxCrMw/fhHQZ3kCsorcZ48M0yowXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WXAZ2/btsLslxCrMw/fhHQZ3kCsorcZ48M0yowXK/img.png&quot; data-alt=&quot;공차역&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WXAZ2/btsLslxCrMw/fhHQZ3kCsorcZ48M0yowXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWXAZ2%2FbtsLslxCrMw%2FfhHQZ3kCsorcZ48M0yowXK%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;379&quot; height=&quot;215&quot; data-origin-width=&quot;379&quot; data-origin-height=&quot;215&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;공차역&lt;/figcaption&gt;
&lt;/figure&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;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;데이텀을 참조하지 않아 공차역이 공간상 구속되어 있지 않기 때문&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1267&quot; data-origin-height=&quot;347&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUu2Rp/btsLrLwA6Yj/ZNi7LmagV5Uy45W3ipt4dK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUu2Rp/btsLrLwA6Yj/ZNi7LmagV5Uy45W3ipt4dK/img.png&quot; data-alt=&quot;기울어진 공차역&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUu2Rp/btsLrLwA6Yj/ZNi7LmagV5Uy45W3ipt4dK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUu2Rp%2FbtsLrLwA6Yj%2FZNi7LmagV5Uy45W3ipt4dK%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;700&quot; height=&quot;192&quot; data-origin-width=&quot;1267&quot; data-origin-height=&quot;347&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기울어진 공차역&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&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;평면도 공차역의 크기(0.5)는 치수공차역(+-1 = 2.0) 보다 작아야 한다. (0.5 &amp;lt; 2.0)&lt;/li&gt;
&lt;/ol&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;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;평면도 주의사항&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1685&quot; data-origin-height=&quot;659&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m9ogp/btsLrLXGtTQ/VJPFYkC1DGdOKnDTNyKOvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m9ogp/btsLrLXGtTQ/VJPFYkC1DGdOKnDTNyKOvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m9ogp/btsLrLXGtTQ/VJPFYkC1DGdOKnDTNyKOvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm9ogp%2FbtsLrLXGtTQ%2FVJPFYkC1DGdOKnDTNyKOvK%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;700&quot; height=&quot;274&quot; data-origin-width=&quot;1685&quot; data-origin-height=&quot;659&quot;/&gt;&lt;/span&gt;&lt;/figure&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;표면에 직접 붙이는 방식 (type1)&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;가리키고 있는 표면의 편차를 0.5 이내로 관리&lt;br /&gt;MMC 영역을 벗어날수 &lt;span style=&quot;color: #ef5369;&quot;&gt;없음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;치수 아래에 붙이는 방식 (type2)&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;중심평면의 편차를 0.5 이내로 관리&lt;br /&gt;MMC 영역을 벗어날 수 &lt;span style=&quot;color: #ef5369;&quot;&gt;있음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;833&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTibRe/btsLrXDF3HY/FkcdCVkScAHLD8JlMniWoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTibRe/btsLrXDF3HY/FkcdCVkScAHLD8JlMniWoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTibRe/btsLrXDF3HY/FkcdCVkScAHLD8JlMniWoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTibRe%2FbtsLrXDF3HY%2FFkcdCVkScAHLD8JlMniWoK%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;700&quot; height=&quot;454&quot; data-origin-width=&quot;1283&quot; data-origin-height=&quot;833&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;OB (Outer Boundary) : 21.5 (20+1+0.5)&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;치수 아래&lt;/span&gt;에 붙이는 방식은 &lt;span style=&quot;color: #ef5369;&quot;&gt;폭(Width) 치수에만 가능&lt;/span&gt;함&lt;/li&gt;
&lt;/ul&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;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;단위면적당 요건 부여 가능&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;7233&quot; data-origin-height=&quot;1310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xhhK2/btsLtfwQ9Nd/mgs9ZtDiozIAXCs1rcPTqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xhhK2/btsLtfwQ9Nd/mgs9ZtDiozIAXCs1rcPTqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xhhK2/btsLtfwQ9Nd/mgs9ZtDiozIAXCs1rcPTqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxhhK2%2FbtsLtfwQ9Nd%2Fmgs9ZtDiozIAXCs1rcPTqK%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;850&quot; height=&quot;154&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;7233&quot; data-origin-height=&quot;1310&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;전체면적 0.3 안에 들어와야 한다.&lt;/li&gt;
&lt;li&gt;25 X 25&amp;nbsp; 단위 면적당 0.05 안에 들어와야 한다.&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;1132&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/etAWs9/btsLtIr1ufJ/7SaiDN1UOkEZ3TtquGG5O0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/etAWs9/btsLtIr1ufJ/7SaiDN1UOkEZ3TtquGG5O0/img.png&quot; data-alt=&quot;전체규제 없이 단위면적당 요건만도 부여 가능&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/etAWs9/btsLtIr1ufJ/7SaiDN1UOkEZ3TtquGG5O0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FetAWs9%2FbtsLtIr1ufJ%2F7SaiDN1UOkEZ3TtquGG5O0%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;400&quot; height=&quot;122&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;344&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;전체규제 없이 단위면적당 요건만도 부여 가능&lt;/figcaption&gt;
&lt;/figure&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;style5&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;모양공차 오답 케이스&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;모양공차 사용 중 오답들을 하나씩 지우면서 진행&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;CASE 1 : 모양공차에 데이텀 사용 X&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1201&quot; data-origin-height=&quot;552&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ejdbpI/btsLqVs9hcB/mzkV6gGlZMc5rsVDnkSA51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ejdbpI/btsLqVs9hcB/mzkV6gGlZMc5rsVDnkSA51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ejdbpI/btsLqVs9hcB/mzkV6gGlZMc5rsVDnkSA51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FejdbpI%2FbtsLqVs9hcB%2FmzkV6gGlZMc5rsVDnkSA51%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;800&quot; height=&quot;368&quot; data-origin-width=&quot;1201&quot; data-origin-height=&quot;552&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;CASE 2 : 모양공차 &amp;Oslash; 사용 불가&amp;nbsp;&lt;br /&gt;(진직도 Type 2 예외)&lt;/h3&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;진직도 Type 2 / 대상이 아니라 공차역의 생김새가 원통형일 때 붙이는 것&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6yp6t/btsLqX5rkIN/8zjDyE0CmoZHUOnMgNoSE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6yp6t/btsLqX5rkIN/8zjDyE0CmoZHUOnMgNoSE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6yp6t/btsLqX5rkIN/8zjDyE0CmoZHUOnMgNoSE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6yp6t%2FbtsLqX5rkIN%2F8zjDyE0CmoZHUOnMgNoSE1%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;800&quot; height=&quot;351&quot; data-origin-width=&quot;1222&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;CASE 3 : 기본치수 사용 불가&lt;/h3&gt;
&lt;p style=&quot;text-align: center;&quot; 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;1203&quot; data-origin-height=&quot;520&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNunSq/btsLsy4zaij/OH1bVarEdEy06p2PZlSgQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNunSq/btsLsy4zaij/OH1bVarEdEy06p2PZlSgQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNunSq/btsLsy4zaij/OH1bVarEdEy06p2PZlSgQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNunSq%2FbtsLsy4zaij%2FOH1bVarEdEy06p2PZlSgQK%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;800&quot; height=&quot;346&quot; data-origin-width=&quot;1203&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;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;CASE 4 : 치수공차역 &amp;gt; 기하공차역 관계&lt;br /&gt;(진직도, 평면도 Type2 예외)&lt;/h3&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;모양공차에서&amp;nbsp;치수공차역&amp;nbsp;&amp;gt;&amp;nbsp;기하공차역&amp;nbsp;관계여야&amp;nbsp;한다. &lt;br /&gt;+-0.1인데&amp;nbsp;기하공차는&amp;nbsp;0.3이므로&amp;nbsp;0.1 미만의&amp;nbsp;값이어야만&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;1234&quot; data-origin-height=&quot;520&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RBDtd/btsLshB1pOn/HahUt3YBBkawPisnKcVxBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RBDtd/btsLshB1pOn/HahUt3YBBkawPisnKcVxBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RBDtd/btsLshB1pOn/HahUt3YBBkawPisnKcVxBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRBDtd%2FbtsLshB1pOn%2FHahUt3YBBkawPisnKcVxBK%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;800&quot; height=&quot;337&quot; data-origin-width=&quot;1234&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;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;전부 수정한 도면&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1224&quot; data-origin-height=&quot;521&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8EpgP/btsLs7ZS6bU/61b5mpchOBp5I0ubJf66O1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8EpgP/btsLs7ZS6bU/61b5mpchOBp5I0ubJf66O1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8EpgP/btsLs7ZS6bU/61b5mpchOBp5I0ubJf66O1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8EpgP%2FbtsLs7ZS6bU%2F61b5mpchOBp5I0ubJf66O1%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;800&quot; height=&quot;341&quot; data-origin-width=&quot;1224&quot; data-origin-height=&quot;521&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;style5&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;모양공차 간단 정리&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;데이텀 사용 X&lt;/li&gt;
&lt;li&gt;&amp;Oslash; 사용 X (진직도 Type 2 예외)&lt;/li&gt;
&lt;li&gt;기본치수 사용 X&lt;/li&gt;
&lt;li&gt;치수공차역 크기 &amp;gt; 기하공차역 크기 (진직도, 평면도 Type2 예외)&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;사용 이유&lt;/h3&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;제작자 입장에서는 공차가 작을수록 제작이 어렵다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_blob&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IQIL1/btsLsgwndpf/Uj9PYq2uOkkakWaGqzaM30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IQIL1/btsLsgwndpf/Uj9PYq2uOkkakWaGqzaM30/img.png&quot; data-alt=&quot;예시 1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IQIL1/btsLsgwndpf/Uj9PYq2uOkkakWaGqzaM30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIQIL1%2FbtsLsgwndpf%2FUj9PYq2uOkkakWaGqzaM30%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;500&quot; height=&quot;161&quot; data-filename=&quot;edited_blob&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;196&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예시 1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;예시 1의 치수공차의 15.99 ~ 16.01 직경 범위보다&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;모양공차를 넣어&amp;nbsp;예시 2처럼 치수공차를 0.5로 설정하고 기하공차를 0.02를 넣어&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;직경의 편차만 0.02로 설정해 달라 하면 제작자 입장에서 상대적으로 쉬워질 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drffmV/btsLtah1ISZ/uvDapoL5AZItKuLuykwGek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drffmV/btsLtah1ISZ/uvDapoL5AZItKuLuykwGek/img.png&quot; data-alt=&quot;예시 2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drffmV/btsLtah1ISZ/uvDapoL5AZItKuLuykwGek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdrffmV%2FbtsLtah1ISZ%2FuvDapoL5AZItKuLuykwGek%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;500&quot; height=&quot;182&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예시 2&lt;/figcaption&gt;
&lt;/figure&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: 38.9535%; text-align: center;&quot;&gt;예시 1&lt;/td&gt;
&lt;td style=&quot;width: 61.0465%;&quot;&gt;15.99 ~ 16.01 벗어나면 불량&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 38.9535%; text-align: center;&quot;&gt;예시 2&lt;/td&gt;
&lt;td style=&quot;width: 61.0465%;&quot;&gt;15.98 ~ 16.02 or 16.00 ~ 16.04 or 16.10 ~ 16.14 or... = 통과&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Youtube TeleV2 신입사원 도면강좌 23~26&lt;/blockquote&gt;</description>
      <category>CAD</category>
      <author>bumjae</author>
      <guid isPermaLink="true">https://bumjae.tistory.com/135</guid>
      <comments>https://bumjae.tistory.com/135#entry135comment</comments>
      <pubDate>Mon, 23 Dec 2024 01:19:32 +0900</pubDate>
    </item>
    <item>
      <title>위치공차 (위치도,동심도,대칭도)</title>
      <link>https://bumjae.tistory.com/134</link>
      <description>&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;기본치수 없이 쓰이는 위치도&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;CASE 1 : 형상에 수직 한 데이텀인 경우&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;1400&quot; data-origin-height=&quot;815&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5mDHB/btsLszhS1sv/y62UNwqnEVni9Tufv4azI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5mDHB/btsLszhS1sv/y62UNwqnEVni9Tufv4azI0/img.png&quot; data-alt=&quot;C 기본치수가 없는 경우&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5mDHB/btsLszhS1sv/y62UNwqnEVni9Tufv4azI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5mDHB%2FbtsLszhS1sv%2Fy62UNwqnEVni9Tufv4azI0%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;600&quot; height=&quot;349&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;815&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;C 기본치수가 없는 경우&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;바닥면(C)에 수직 한 상태를 유지하면서 공차역을 생성해라&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;CASE 2 : A 형상의 축에 B 형상의 축을 맞추는 경우&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;1488&quot; data-origin-height=&quot;605&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ba04Vn/btsLsfcVELo/A8uusNYiwp8QZKeEbmuFg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ba04Vn/btsLsfcVELo/A8uusNYiwp8QZKeEbmuFg1/img.png&quot; data-alt=&quot;A 기본치수가 없는 경우&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ba04Vn/btsLsfcVELo/A8uusNYiwp8QZKeEbmuFg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fba04Vn%2FbtsLsfcVELo%2FA8uusNYiwp8QZKeEbmuFg1%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;600&quot; height=&quot;244&quot; data-origin-width=&quot;1488&quot; data-origin-height=&quot;605&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;A 기본치수가 없는 경우&lt;/figcaption&gt;
&lt;/figure&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;&lt;span style=&quot;color: #ef5369;&quot;&gt;*&amp;nbsp;현실에서&amp;nbsp;두&amp;nbsp;축이&amp;nbsp;완벽히&amp;nbsp;일치할&amp;nbsp;수가&amp;nbsp;없음.&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;/span&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;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;&lt;span style=&quot;color: #ef5369;&quot;&gt;오른쪽 축을 검사&lt;/span&gt;했을 때 &lt;span style=&quot;color: #ef5369;&quot;&gt;왼쪽 축 중심을 참고&lt;/span&gt;하여&lt;span style=&quot;color: #ef5369;&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;1035&quot; data-origin-height=&quot;423&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/80Y45/btsLrPyFlHq/7qdKSKiGI2gIS5lnn3LVfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/80Y45/btsLrPyFlHq/7qdKSKiGI2gIS5lnn3LVfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/80Y45/btsLrPyFlHq/7qdKSKiGI2gIS5lnn3LVfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F80Y45%2FbtsLrPyFlHq%2F7qdKSKiGI2gIS5lnn3LVfK%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;600&quot; height=&quot;245&quot; data-origin-width=&quot;1035&quot; data-origin-height=&quot;423&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;style3&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;CASE 3 : A 형상의 중심평면에 B 형상의 중심평면을 맞추는 경우&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;1314&quot; data-origin-height=&quot;666&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4ySQn/btsLsPERI2Z/pNE01oiKSKUrcUKGT18U61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4ySQn/btsLsPERI2Z/pNE01oiKSKUrcUKGT18U61/img.png&quot; data-alt=&quot;A 기본 치수가 없는 경우&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4ySQn/btsLsPERI2Z/pNE01oiKSKUrcUKGT18U61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4ySQn%2FbtsLsPERI2Z%2FpNE01oiKSKUrcUKGT18U61%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;600&quot; height=&quot;304&quot; data-origin-width=&quot;1314&quot; data-origin-height=&quot;666&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;A 기본 치수가 없는 경우&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;데이텀 A, 마주 보는 두 면을 시뮬레이팅해서 찾아낸 &lt;span style=&quot;color: #ef5369;&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;896&quot; data-origin-height=&quot;423&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dyPFie/btsLtKC2TMn/2s4aen8W8tbpJ1zqlFJrr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dyPFie/btsLtKC2TMn/2s4aen8W8tbpJ1zqlFJrr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dyPFie/btsLtKC2TMn/2s4aen8W8tbpJ1zqlFJrr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdyPFie%2FbtsLtKC2TMn%2F2s4aen8W8tbpJ1zqlFJrr1%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;600&quot; height=&quot;283&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;423&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;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위치공차는 반드시 FOS에만 붙일 수 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;FOS (Feature Of Size) - ASME Y14.5 1994&lt;/b&gt;&lt;br /&gt;한 개의 원통형 표면, 구형 표면, 원형 형상, 두 개의 마주 보고 있는 평행한 라인이나 형상을 Feature Of Size라고 한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단히 얘기하면 홀 표면, 핀 표면, 슬롯의 마주 보고 있는 표면 등 그런 것들을 FOS라고 부른다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;위치공차가 이상하게 명시되어 있어 도면 해석이 안 되는 경우&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;CASE 1 : FOS가 아닌 경우&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;742&quot; data-origin-height=&quot;447&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpMCfS/btsLtdMgHQe/QNmOxCjf7VRk3hWz81kTp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpMCfS/btsLtdMgHQe/QNmOxCjf7VRk3hWz81kTp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpMCfS/btsLtdMgHQe/QNmOxCjf7VRk3hWz81kTp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpMCfS%2FbtsLtdMgHQe%2FQNmOxCjf7VRk3hWz81kTp0%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;600&quot; height=&quot;361&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;447&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;위 같은 경우 기하공차 부분이 FOS가 아니다.&lt;/li&gt;
&lt;li&gt;각 면 모두 오른쪽을 바라보는 형태이기 때문에 (마주 보고 있지 않는 형태) 공차역을 정의할 수 없기 때문에 해석이 안된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;CASE 2 : 기하공차의 위치가 잘못된 경우&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;563&quot; data-origin-height=&quot;479&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Xtybf/btsLrkzeVUx/Im2rQfR5kLJeTgjFQttg41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Xtybf/btsLrkzeVUx/Im2rQfR5kLJeTgjFQttg41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Xtybf/btsLrkzeVUx/Im2rQfR5kLJeTgjFQttg41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXtybf%2FbtsLrkzeVUx%2FIm2rQfR5kLJeTgjFQttg41%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;500&quot; height=&quot;425&quot; data-origin-width=&quot;563&quot; data-origin-height=&quot;479&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;FOS는 맞으나 컨트롤 하고자 하는 형상은 홀의 형상&lt;/li&gt;
&lt;li&gt;16X &amp;Oslash;5.0+-0.1 부분이기 때문에 해당 공차에 기하공차를 넣어야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;CASE 3 : FOS가 아닌 경우&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;573&quot; data-origin-height=&quot;699&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rH99S/btsLrBtPXLN/w73HkrkHg4OnGYp5Jul2Sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rH99S/btsLrBtPXLN/w73HkrkHg4OnGYp5Jul2Sk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rH99S/btsLrBtPXLN/w73HkrkHg4OnGYp5Jul2Sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrH99S%2FbtsLrBtPXLN%2Fw73HkrkHg4OnGYp5Jul2Sk%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;400&quot; height=&quot;488&quot; data-origin-width=&quot;573&quot; data-origin-height=&quot;699&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;FOS(마주 보는 형상)가 아니기 때문에 해석이 안 되는 케이스이다.&lt;/li&gt;
&lt;li&gt;위치공차를 쓰지 않고 그냥 아래 치수 공차로 (1.3 / 2= 0.65) 대체할 수 있다.&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;710&quot; data-origin-height=&quot;364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqovTu/btsLreS6wEh/hShtSfvjyfiCXvLnDtYM60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqovTu/btsLreS6wEh/hShtSfvjyfiCXvLnDtYM60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqovTu/btsLreS6wEh/hShtSfvjyfiCXvLnDtYM60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqovTu%2FbtsLreS6wEh%2FhShtSfvjyfiCXvLnDtYM60%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;400&quot; height=&quot;205&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;364&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;style3&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;CASE 4 : 데이텀의 위치가 잘못된 경우&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;1019&quot; data-origin-height=&quot;355&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dyzEqa/btsLrl5UFSy/kobX5LqiqBK7ZkRFGe678K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dyzEqa/btsLrl5UFSy/kobX5LqiqBK7ZkRFGe678K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dyzEqa/btsLrl5UFSy/kobX5LqiqBK7ZkRFGe678K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdyzEqa%2FbtsLrl5UFSy%2FkobX5LqiqBK7ZkRFGe678K%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;500&quot; height=&quot;174&quot; data-origin-width=&quot;1019&quot; data-origin-height=&quot;355&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;데이텀 A의 위치가 오른쪽에 있으면 안 된다.&lt;/li&gt;
&lt;li&gt;오른쪽 축을 검사했을 때 왼쪽 축 중심을 참고하여 생긴 공차역에 들어와야 합격해야 하므로 데이텀 A는 왼쪽 축에 위치하여야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;CASE 5 : 기본치수 오사용&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;1016&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/msi7z/btsLtfJ6bmT/WhQnZ6BrdBLiZXZUHvha9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/msi7z/btsLtfJ6bmT/WhQnZ6BrdBLiZXZUHvha9k/img.png&quot; data-alt=&quot;굳이 진위치(True Position) 표현하는 기본치수를 사용해서 틀린 케이스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/msi7z/btsLtfJ6bmT/WhQnZ6BrdBLiZXZUHvha9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmsi7z%2FbtsLtfJ6bmT%2FWhQnZ6BrdBLiZXZUHvha9k%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;500&quot; height=&quot;166&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;굳이 진위치(True Position) 표현하는 기본치수를 사용해서 틀린 케이스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1021&quot; data-origin-height=&quot;373&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgxURx/btsLscUKRjF/K99mPBJ7Eh7j43osbKA0eK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgxURx/btsLscUKRjF/K99mPBJ7Eh7j43osbKA0eK/img.png&quot; data-alt=&quot;제대로 그려진 케이스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgxURx/btsLscUKRjF/K99mPBJ7Eh7j43osbKA0eK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgxURx%2FbtsLscUKRjF%2FK99mPBJ7Eh7j43osbKA0eK%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;500&quot; height=&quot;183&quot; data-origin-width=&quot;1021&quot; data-origin-height=&quot;373&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;제대로 그려진 케이스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;동심도, 대칭도&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;(ASME 2018에서 동심도, 대칭도가 표준에서 제외됨)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;(ISO 에는 남아있다)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;축, 중심평면&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;동심도와 대칭도를 알아보기 전 이전에서 계속 언급된 &lt;u&gt;축이랑 중심평면이 무엇인지&lt;/u&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;/li&gt;
&lt;li&gt;축 = 곧다, 중심평면 = 평평하다, 두 전제는 깔려있어야 한다. (ASME 규정)&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;862&quot; data-origin-height=&quot;366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KivBB/btsLrDrF02z/zSOXzem12VV1x1mhzKGfC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KivBB/btsLrDrF02z/zSOXzem12VV1x1mhzKGfC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KivBB/btsLrDrF02z/zSOXzem12VV1x1mhzKGfC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKivBB%2FbtsLrDrF02z%2FzSOXzem12VV1x1mhzKGfC0%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;700&quot; height=&quot;297&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;366&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;822&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D94jy/btsLrJEZriL/RJAQYTsPyTCqsmaENvIKx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D94jy/btsLrJEZriL/RJAQYTsPyTCqsmaENvIKx0/img.png&quot; data-alt=&quot;보라색선 : AME&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D94jy/btsLrJEZriL/RJAQYTsPyTCqsmaENvIKx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD94jy%2FbtsLrJEZriL%2FRJAQYTsPyTCqsmaENvIKx0%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;700&quot; height=&quot;255&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;보라색선 : AME&lt;/figcaption&gt;
&lt;/figure&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;이것을 ASME에서 AME라 칭한다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;AME&amp;nbsp;(Actual&amp;nbsp;Mating&amp;nbsp;Envelop)&lt;/b&gt;&lt;/h3&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;letter-spacing: 0px;&quot;&gt;멀리 떨어진 두 평면이 거리를 좁히면서 제품의 각 면의 돌출 된 세 점에 닿는 외관면 (보라색 선)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;u style=&quot;letter-spacing: 0px;&quot;&gt;형상의 축이라는 것은 이 AME의 축&lt;/u&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;이라고 일컫는다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;위치도 과정에서 공차역을 구해 이 &lt;b&gt;AME의 축을 기준으로 합격, 불합격을 판명&lt;/b&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;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;즉, 위치도는 &quot;축 vs 축 / 중심평면 vs 중심평면&quot;을 본다.&lt;/b&gt;&lt;/span&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;그렇기 때문에 위치도는 언제나 축(Axis)과 중심평면(Center Plane)의 개념을 사용하여 해석한다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;동심도, 대칭도&lt;/b&gt;가 위치도와 다른 &lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;결정적인 차이점은 &lt;/span&gt;축, 중심평면 &lt;span style=&quot;color: #0593d3;&quot;&gt;대신 &lt;u&gt;중심(Median Point) 개념&lt;/u&gt;을 사용&lt;/span&gt;&lt;/b&gt;한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhnnOf/btsLqRjEBnZ/5sSee9oeLrv5muK0zXVoBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhnnOf/btsLqRjEBnZ/5sSee9oeLrv5muK0zXVoBk/img.png&quot; data-alt=&quot;하늘색 점들 : 미디언 포인트들이 많이 찍힌 모습 동심도 ❘ 대칭도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhnnOf/btsLqRjEBnZ/5sSee9oeLrv5muK0zXVoBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhnnOf%2FbtsLqRjEBnZ%2F5sSee9oeLrv5muK0zXVoBk%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;700&quot; height=&quot;301&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;369&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;하늘색 점들 : 미디언 포인트들이 많이 찍힌 모습 동심도 ❘ 대칭도&lt;/figcaption&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;모든 점의 모든 Median Point를 다 구해야 한다.&lt;/li&gt;
&lt;li&gt;한 점이라도 공차역 밖으로 나가면 불합격이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;동심도는 축 vs MP, 대칭도는 중심평면 vs MP를 본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1019&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UNobY/btsLsyXwXM4/hsmNEU1wUbyDjMIpcKcbQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UNobY/btsLsyXwXM4/hsmNEU1wUbyDjMIpcKcbQk/img.png&quot; data-alt=&quot;예시) 찌그러진 형상&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UNobY/btsLsyXwXM4/hsmNEU1wUbyDjMIpcKcbQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUNobY%2FbtsLsyXwXM4%2FhsmNEU1wUbyDjMIpcKcbQk%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;700&quot; height=&quot;317&quot; data-origin-width=&quot;1019&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예시) 찌그러진 형상&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;위 예시의 경우 위치도일 경우에는 AME에 영향을 못 미쳐 합격한다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;하지만 동심도일 경우에는 축 vs MP이기 때문에 불합격된다.&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;431&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwj8FH/btsLtsP4Dth/pPSKdQU7RIigymSWqkWZiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwj8FH/btsLtsP4Dth/pPSKdQU7RIigymSWqkWZiK/img.png&quot; data-alt=&quot;예시) 양쪽 평행하게 찌그러트림&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwj8FH/btsLtsP4Dth/pPSKdQU7RIigymSWqkWZiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbwj8FH%2FbtsLtsP4Dth%2FpPSKdQU7RIigymSWqkWZiK%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;400&quot; height=&quot;338&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;431&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예시) 양쪽 평행하게 찌그러트림&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;위 예시와 같이 찌그러짐도 평행하다면 MP가 중앙으로 잡혀 동심도 요건 만족 가능하다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;P.S&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;1. 동심도와 대칭도는 M L과 같은 모디파이어 사용이 불가능하다.&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;2. &lt;u&gt;ISO에서는 위치도 공차도 Median Point를 통해 검사&lt;/u&gt;한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;&lt;u&gt;AME를 사용해야 할 경우 Evelop 모디파이어&lt;/u&gt; 사용&lt;br /&gt;&lt;/b&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;1075&quot; data-origin-height=&quot;397&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O5eHJ/btsLrig4dN5/5enEvBHF5smiXYmG9PtKxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O5eHJ/btsLrig4dN5/5enEvBHF5smiXYmG9PtKxk/img.png&quot; data-alt=&quot;Envelop 모디파이어 기호&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O5eHJ/btsLrig4dN5/5enEvBHF5smiXYmG9PtKxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO5eHJ%2FbtsLrig4dN5%2F5enEvBHF5smiXYmG9PtKxk%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;500&quot; height=&quot;185&quot; data-origin-width=&quot;1075&quot; data-origin-height=&quot;397&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Envelop 모디파이어 기호&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;두줄 위치공차&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;1201&quot; data-origin-height=&quot;483&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XD4dx/btsLqREhx9d/tG3lXmZZlRV9Of9f0JIff1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XD4dx/btsLqREhx9d/tG3lXmZZlRV9Of9f0JIff1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XD4dx/btsLqREhx9d/tG3lXmZZlRV9Of9f0JIff1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXD4dx%2FbtsLqREhx9d%2FtG3lXmZZlRV9Of9f0JIff1%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;700&quot; height=&quot;282&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;1201&quot; data-origin-height=&quot;483&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;패턴의 로케이션을 스케일 할 때 사용 (패턴 : 형상이 반복적으로 일어나는 것)&lt;/li&gt;
&lt;li&gt;위쪽은 &lt;span style=&quot;color: #ef5369;&quot;&gt;상하좌우 모두 움직임&lt;/span&gt;이 가능하나 아래쪽은 &lt;span style=&quot;color: #ef5369;&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-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bM5CzD/btsLrke9atJ/CD1xkpkdCCvplKA9J4Tzdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bM5CzD/btsLrke9atJ/CD1xkpkdCCvplKA9J4Tzdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bM5CzD/btsLrke9atJ/CD1xkpkdCCvplKA9J4Tzdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbM5CzD%2FbtsLrke9atJ%2FCD1xkpkdCCvplKA9J4Tzdk%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;700&quot; height=&quot;259&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;212&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;윗줄은 전체적인 요건 (공차역이 큼)&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;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;예시&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;1029&quot; data-origin-height=&quot;1053&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vx0fk/btsLsNAz4cm/cjrSwLjWMfRjIdDvlnHq2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vx0fk/btsLsNAz4cm/cjrSwLjWMfRjIdDvlnHq2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vx0fk/btsLsNAz4cm/cjrSwLjWMfRjIdDvlnHq2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvx0fk%2FbtsLsNAz4cm%2FcjrSwLjWMfRjIdDvlnHq2K%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;700&quot; height=&quot;716&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;1029&quot; data-origin-height=&quot;1053&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패턴 : 5파이 홀 3개 (같은 형상 반복)&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;패턴 외부치수 : 76, 6.4&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패턴 내부치수 : 20 (패턴 요소 사이의 관계를 규정짓는 것)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;패턴해석&lt;/h4&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;공간 상에 고정되어 있는 공차역을 도출&lt;/li&gt;
&lt;li&gt;패턴 내부 및 외부 치수를 모두 사용하여 공차역을 도출&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;1260&quot; data-origin-height=&quot;486&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNYXRV/btsLsq6Hsob/t8mVt05wc8ONEVQDrfyTtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNYXRV/btsLsq6Hsob/t8mVt05wc8ONEVQDrfyTtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNYXRV/btsLsq6Hsob/t8mVt05wc8ONEVQDrfyTtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNYXRV%2FbtsLsq6Hsob%2Ft8mVt05wc8ONEVQDrfyTtk%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;850&quot; height=&quot;328&quot; data-origin-width=&quot;1260&quot; data-origin-height=&quot;486&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&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;공차역이 공간상에 고정되어있지 않다.&lt;/li&gt;
&lt;li&gt;패턴 내부 치수만 사용하여 공차역을 도출&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;935&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FQFDV/btsLsklcCoo/3bEYuOklHkkSRH6VezrnS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FQFDV/btsLsklcCoo/3bEYuOklHkkSRH6VezrnS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FQFDV/btsLsklcCoo/3bEYuOklHkkSRH6VezrnS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFQFDV%2FbtsLsklcCoo%2F3bEYuOklHkkSRH6VezrnS1%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;800&quot; height=&quot;119&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;139&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 data-ke-size=&quot;size16&quot;&gt;윗줄 공차역과 아랫줄 공차역의 교집합 안에 들어오면 합격, 아닐시 불합격&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아랫줄의 위치도가 데이텀 A를 참조하고 있으므로 공차역은 데이텀 A에 수직함을 유지하면서 도출&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;203&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rcGb2/btsLtbgTCXk/j03PvP0tyfELoOeYoZspBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rcGb2/btsLtbgTCXk/j03PvP0tyfELoOeYoZspBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rcGb2/btsLtbgTCXk/j03PvP0tyfELoOeYoZspBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrcGb2%2FbtsLtbgTCXk%2Fj03PvP0tyfELoOeYoZspBK%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;1074&quot; height=&quot;203&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;203&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;822&quot; data-origin-height=&quot;589&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqQFNB/btsLt2Rjhx7/tNFlan7bVUGHICtiyUuYKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqQFNB/btsLt2Rjhx7/tNFlan7bVUGHICtiyUuYKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqQFNB/btsLt2Rjhx7/tNFlan7bVUGHICtiyUuYKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqQFNB%2FbtsLt2Rjhx7%2FtNFlan7bVUGHICtiyUuYKk%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;400&quot; height=&quot;287&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;589&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;style3&quot;&gt;Youtube TeleV2 신입사원 도면강좌 20~22, 27 (두줄 위치공차)&lt;/blockquote&gt;</description>
      <category>CAD</category>
      <author>bumjae</author>
      <guid isPermaLink="true">https://bumjae.tistory.com/134</guid>
      <comments>https://bumjae.tistory.com/134#entry134comment</comments>
      <pubDate>Sat, 21 Dec 2024 13:53:34 +0900</pubDate>
    </item>
    <item>
      <title>데이텀, 데이텀 참조 순서 영향, 기호 X (ASME)</title>
      <link>https://bumjae.tistory.com/133</link>
      <description>&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;데이텀&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; 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;465&quot; data-origin-height=&quot;294&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcFqWZ/btsLqNBzdsu/YLezbiN4BjXzNdzv5afEm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcFqWZ/btsLqNBzdsu/YLezbiN4BjXzNdzv5afEm1/img.png&quot; data-alt=&quot;A로 지시된 도면 형상의 면이 데이텀?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcFqWZ/btsLqNBzdsu/YLezbiN4BjXzNdzv5afEm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcFqWZ%2FbtsLqNBzdsu%2FYLezbiN4BjXzNdzv5afEm1%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;400&quot; height=&quot;253&quot; data-origin-width=&quot;465&quot; data-origin-height=&quot;294&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;A로 지시된 도면 형상의 면이 데이텀?&lt;/figcaption&gt;
&lt;/figure&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;그러므로 이것은 &lt;u&gt;이 표면을 이용해 데이텀 A를 만들어 내라는 것&lt;/u&gt;이다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;즉, 데이텀 A를 만들어 내기 위한 &quot;재료&quot;로 쓰라는 것&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그 &quot;재료&quot;를 &lt;b&gt;Datum Feature&lt;/b&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;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이 데이텀을 만들어주는 데 사용하는 도구가&amp;nbsp;&lt;b&gt;Datum Simulator이다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;ex)&amp;nbsp;세팅&amp;nbsp;잘해놓은&amp;nbsp;정반,&amp;nbsp;잘&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 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;즉, Datum Feature (재료)에 Datum Simulator (도구)를 갖다 대어 Simulated Datum (결과물)을 도출한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;p.s 데이텀 피쳐를 명시할 때 사용되는 영문자를 Datum Feature Symbol이라 부른다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;데이텀 피처를 명시하는 방법&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;데이텀 피쳐 명시.png&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;565&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cynqha/btsLqRxb86v/pVc2eq5GnV1a1HWVJD4KQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cynqha/btsLqRxb86v/pVc2eq5GnV1a1HWVJD4KQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cynqha/btsLqRxb86v/pVc2eq5GnV1a1HWVJD4KQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcynqha%2FbtsLqRxb86v%2FpVc2eq5GnV1a1HWVJD4KQ0%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;500&quot; height=&quot;434&quot; data-filename=&quot;데이텀 피쳐 명시.png&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;565&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 130px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 42.093%; height: 20px; text-align: center;&quot;&gt;A, B&lt;/td&gt;
&lt;td style=&quot;width: 57.907%; height: 20px;&quot;&gt;표면&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 42.093%; height: 20px; text-align: center;&quot;&gt;C&lt;/td&gt;
&lt;td style=&quot;width: 57.907%; height: 20px;&quot;&gt;전체적인 표면을 가리킬때 형상 내부에&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 42.093%; height: 20px; text-align: center;&quot;&gt;D&lt;/td&gt;
&lt;td style=&quot;width: 57.907%; height: 20px;&quot;&gt;보이지 않는 뒷면&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 20px; text-align: center;&quot; colspan=&quot;2&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt; &lt;b&gt;주의 E, F / 치수선과 나란한 것과 그렇지 않은 것은 서로 다른 데이텀을 도출함.&lt;/b&gt; &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 42.093%; height: 20px; text-align: center;&quot;&gt;E&lt;/td&gt;
&lt;td style=&quot;width: 57.907%; height: 20px;&quot;&gt;치수보조선 (세모 안채워도 상관없음)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 10px;&quot;&gt;
&lt;td style=&quot;width: 42.093%; height: 10px; text-align: center;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;width: 57.907%; height: 10px;&quot;&gt;치수선과 나란히 있어서 반대편 면까지 잡아서 그 중심면을 찾아냄&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 42.093%; height: 20px; text-align: center;&quot;&gt;G&lt;/td&gt;
&lt;td style=&quot;width: 57.907%; height: 20px;&quot;&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;P.S&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;데이텀에서 I, O, Q는 사용하지 말 것 (ASME Y14.5 2009 3.3.2)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;혼동의 여지가 있는 문자이므로 제외한다.&lt;/b&gt;&lt;/span&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&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;979&quot; data-origin-height=&quot;421&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPwe1e/btsLtrcvBLr/rxGB43LfftYF6R4G1OzpBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPwe1e/btsLtrcvBLr/rxGB43LfftYF6R4G1OzpBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPwe1e/btsLtrcvBLr/rxGB43LfftYF6R4G1OzpBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPwe1e%2FbtsLtrcvBLr%2FrxGB43LfftYF6R4G1OzpBK%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;400&quot; height=&quot;172&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;421&quot;/&gt;&lt;/span&gt;&lt;/figure&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;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;u&gt;&lt;b&gt;물리적으로 존재하는 표면에다가 명시&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;해야 함&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;데이텀 도출 종류&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;종류.png&quot; data-origin-width=&quot;2323&quot; data-origin-height=&quot;3220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EJiGz/btsLp8lO3LZ/KJSKzmyOFkxIsoLkjGtxU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EJiGz/btsLp8lO3LZ/KJSKzmyOFkxIsoLkjGtxU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EJiGz/btsLp8lO3LZ/KJSKzmyOFkxIsoLkjGtxU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEJiGz%2FbtsLp8lO3LZ%2FKJSKzmyOFkxIsoLkjGtxU1%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;600&quot; height=&quot;832&quot; data-filename=&quot;종류.png&quot; data-origin-width=&quot;2323&quot; data-origin-height=&quot;3220&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 125px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;a&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;판 표면이 데이텀&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;b&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;(치수선과 나란히) 중심평면이 데이텀&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;c&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;구의 중심점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;d&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;실린더의 표면에 찍었을 때 축이 데이텀&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;e&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;축과 점 모두 데이텀&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;f&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;면의 윤곽도 / 축과 중심평면&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;g&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&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;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;데이텀 참조 순서에 따른 영향&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F9stf/btsLrmjnKhX/PMxfywHBrmcSwtMMvsfKzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F9stf/btsLrmjnKhX/PMxfywHBrmcSwtMMvsfKzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F9stf/btsLrmjnKhX/PMxfywHBrmcSwtMMvsfKzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF9stf%2FbtsLrmjnKhX%2FPMxfywHBrmcSwtMMvsfKzK%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;600&quot; height=&quot;335&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;522&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;A B : 먼저 A 참조, B 참조&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;B A : 먼저 B 참조, A 참조&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;데이텀의 우선순위 = 장비에 물리거나 갖다 대는 순서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;예시 1&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;865&quot; data-origin-height=&quot;475&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WTYgk/btsLtbVczV2/VmceQKhTAtvsVeeSBgBkOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WTYgk/btsLtbVczV2/VmceQKhTAtvsVeeSBgBkOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WTYgk/btsLtbVczV2/VmceQKhTAtvsVeeSBgBkOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWTYgk%2FbtsLtbVczV2%2FVmceQKhTAtvsVeeSBgBkOk%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;400&quot; height=&quot;475&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;865&quot; data-origin-height=&quot;475&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b947t5/btsLp4X4pVc/65Bvq6qElDSwWTNgcokwy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b947t5/btsLp4X4pVc/65Bvq6qElDSwWTNgcokwy1/img.png&quot; data-alt=&quot;A ❘ B&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b947t5/btsLp4X4pVc/65Bvq6qElDSwWTNgcokwy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb947t5%2FbtsLp4X4pVc%2F65Bvq6qElDSwWTNgcokwy1%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;400&quot; height=&quot;488&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;A ❘ B&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;1165&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6DSDf/btsLrW5ytWR/pxxZv222J4APkk1DTTO561/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6DSDf/btsLrW5ytWR/pxxZv222J4APkk1DTTO561/img.png&quot; data-alt=&quot;B ❘ A&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6DSDf/btsLrW5ytWR/pxxZv222J4APkk1DTTO561/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6DSDf%2FbtsLrW5ytWR%2FpxxZv222J4APkk1DTTO561%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;400&quot; height=&quot;598&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;1165&quot; data-origin-height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;B ❘ A&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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;현실에서 제품은 완벽한 모습이 아니다.&lt;/li&gt;
&lt;li&gt;데이텀 시뮬레이터가 서로 최대한 직각을 유지하면서 움직이기 때문이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예시 2&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIB9x7/btsLrg4rwnC/kIYmQ704rGxbWWVwSh0ejk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIB9x7/btsLrg4rwnC/kIYmQ704rGxbWWVwSh0ejk/img.png&quot; data-alt=&quot;A 16파이 돌출부의 축 / B 평면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIB9x7/btsLrg4rwnC/kIYmQ704rGxbWWVwSh0ejk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIB9x7%2FbtsLrg4rwnC%2FkIYmQ704rGxbWWVwSh0ejk%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;700&quot; height=&quot;330&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;346&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;A 16파이 돌출부의 축 / B 평면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;811&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6u6ZM/btsLsM2pISo/uqrpD5i97W3ohdZEJO3iy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6u6ZM/btsLsM2pISo/uqrpD5i97W3ohdZEJO3iy1/img.png&quot; data-alt=&quot;데이텀을 물리는 순서차이&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6u6ZM/btsLsM2pISo/uqrpD5i97W3ohdZEJO3iy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6u6ZM%2FbtsLsM2pISo%2FuqrpD5i97W3ohdZEJO3iy1%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;700&quot; height=&quot;400&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;811&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;데이텀을 물리는 순서차이&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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: 31.6279%; text-align: center;&quot;&gt;B&amp;nbsp;|&amp;nbsp;A&lt;/td&gt;
&lt;td style=&quot;width: 68.3721%;&quot;&gt;3.1파이&amp;nbsp;홀은&amp;nbsp;플렌지와는&amp;nbsp;수직하지만&amp;nbsp;16파이&amp;nbsp;돌출부와는&amp;nbsp;평행하지&amp;nbsp;않게&amp;nbsp;됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 31.6279%; text-align: center;&quot;&gt;A&amp;nbsp;|&amp;nbsp;B&lt;/td&gt;
&lt;td style=&quot;width: 68.3721%;&quot;&gt;3.1파이&amp;nbsp;홀은&amp;nbsp;16파이&amp;nbsp;돌출부와는&amp;nbsp;평행하지만&amp;nbsp;플렌지와는&amp;nbsp;수직함이&amp;nbsp;보장되지&amp;nbsp;않음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: left;&quot; 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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;기호 X의 사용 (ASME 한정)&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1009&quot; data-origin-height=&quot;926&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMTEst/btsLqcofzRc/muYdFcxPoBBwL7gw5cyCK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMTEst/btsLqcofzRc/muYdFcxPoBBwL7gw5cyCK0/img.png&quot; data-alt=&quot;예시 1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMTEst/btsLqcofzRc/muYdFcxPoBBwL7gw5cyCK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMTEst%2FbtsLqcofzRc%2FmuYdFcxPoBBwL7gw5cyCK0%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;400&quot; height=&quot;367&quot; data-origin-width=&quot;1009&quot; data-origin-height=&quot;926&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예시 1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLz7tr/btsLs9bZ0hw/ULE1JHl7glGNLhY4EBSkf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLz7tr/btsLs9bZ0hw/ULE1JHl7glGNLhY4EBSkf0/img.png&quot; data-alt=&quot;예시 2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLz7tr/btsLs9bZ0hw/ULE1JHl7glGNLhY4EBSkf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLz7tr%2FbtsLs9bZ0hw%2FULE1JHl7glGNLhY4EBSkf0%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;400&quot; height=&quot;217&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예시 2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&quot;X_&quot; : 반복된 형상이 있을 때 깔끔하게 표기해 주는 용도 (뒤에만 띄어쓰기)&lt;/li&gt;
&lt;li&gt;&quot;_X_&quot; : By의 역할, 가로 세로 (양옆 띄어쓰기)&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;792&quot; data-origin-height=&quot;900&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LPLnJ/btsLs0zsdVd/6G72lFZrExFdlTFNkk1kKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LPLnJ/btsLs0zsdVd/6G72lFZrExFdlTFNkk1kKK/img.png&quot; data-alt=&quot;모두 같은 의미&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LPLnJ/btsLs0zsdVd/6G72lFZrExFdlTFNkk1kKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLPLnJ%2FbtsLs0zsdVd%2F6G72lFZrExFdlTFNkk1kKK%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;400&quot; height=&quot;455&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;900&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;모두 같은 의미&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;이 X의 사용은 미국 ASME 기준이며 KS와 ISO에서는 딱히 규정해 놓은 것은 없다.&lt;/span&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;blockquote data-ke-style=&quot;style3&quot;&gt;Youtube TeleV2 신입사원 도면강좌 17~19&lt;/blockquote&gt;</description>
      <category>CAD</category>
      <author>bumjae</author>
      <guid isPermaLink="true">https://bumjae.tistory.com/133</guid>
      <comments>https://bumjae.tistory.com/133#entry133comment</comments>
      <pubDate>Sat, 21 Dec 2024 12:33:48 +0900</pubDate>
    </item>
    <item>
      <title>기하공차, VC(실효조건), M/L/S 모디파이어</title>
      <link>https://bumjae.tistory.com/132</link>
      <description>&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;기하공차&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&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;(모호함, 불명확함, 지저분함 해결)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;기하공차.png&quot; data-origin-width=&quot;737&quot; data-origin-height=&quot;537&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bETAcw/btsLpzWW1iC/iZXVdpqZrwRKTsKgnaxyX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bETAcw/btsLpzWW1iC/iZXVdpqZrwRKTsKgnaxyX1/img.png&quot; data-alt=&quot;예시) 노란별: 치수 공차 / 초록별 : 기하공차&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bETAcw/btsLpzWW1iC/iZXVdpqZrwRKTsKgnaxyX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbETAcw%2FbtsLpzWW1iC%2FiZXVdpqZrwRKTsKgnaxyX1%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;600&quot; height=&quot;437&quot; data-filename=&quot;기하공차.png&quot; data-origin-width=&quot;737&quot; data-origin-height=&quot;537&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예시) 노란별: 치수 공차 / 초록별 : 기하공차&lt;/figcaption&gt;
&lt;/figure&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;아닌 경우에는 빨간 별 부분처럼 직접 화살표로 찍어준다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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;12.png&quot; data-origin-width=&quot;1298&quot; data-origin-height=&quot;282&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blm5Vt/btsLoeFYssH/KPH5GCAmBnAAKPmrgXJkfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blm5Vt/btsLoeFYssH/KPH5GCAmBnAAKPmrgXJkfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blm5Vt/btsLoeFYssH/KPH5GCAmBnAAKPmrgXJkfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fblm5Vt%2FbtsLoeFYssH%2FKPH5GCAmBnAAKPmrgXJkfk%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;600&quot; height=&quot;130&quot; data-filename=&quot;12.png&quot; data-origin-width=&quot;1298&quot; data-origin-height=&quot;282&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;기하공차를 기입할 때는 기하공차의 종류, &lt;u&gt;공차역&lt;/u&gt;의 형태(&amp;empty;)와 크기, 데이텀 순으로 기입한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;기하공차의 종류&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;그림2.png&quot; data-origin-width=&quot;2080&quot; data-origin-height=&quot;1285&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGRuUN/btsLsuab6pH/IcUfZMC77Pynfk9Nl6vBk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGRuUN/btsLsuab6pH/IcUfZMC77Pynfk9Nl6vBk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGRuUN/btsLsuab6pH/IcUfZMC77Pynfk9Nl6vBk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGRuUN%2FbtsLsuab6pH%2FIcUfZMC77Pynfk9Nl6vBk1%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;600&quot; height=&quot;371&quot; data-filename=&quot;그림2.png&quot; data-origin-width=&quot;2080&quot; data-origin-height=&quot;1285&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;공차역 (Tolerance Zone)&lt;/b&gt;&lt;/h3&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;/b&gt;, 부피 또는 면적을 가진 영역&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;데이텀 (Datum)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기하공차를&amp;nbsp;지시하는&amp;nbsp;경우,&amp;nbsp;이들을&amp;nbsp;측정하기&amp;nbsp;위한&amp;nbsp;기하학적&amp;nbsp;&lt;b&gt;기준이&amp;nbsp;되는&amp;nbsp;선&amp;nbsp;혹은&amp;nbsp;면&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;위치도 공차&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&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;354&quot; data-origin-height=&quot;327&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RQ97u/btsLqSH2e3G/6qhab5FOaE3PL5BvljMtCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RQ97u/btsLqSH2e3G/6qhab5FOaE3PL5BvljMtCK/img.png&quot; data-alt=&quot;예시 / 위와 같은 판재가 있고 구멍을 뚫으려 한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RQ97u/btsLqSH2e3G/6qhab5FOaE3PL5BvljMtCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRQ97u%2FbtsLqSH2e3G%2F6qhab5FOaE3PL5BvljMtCK%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;300&quot; height=&quot;327&quot; data-origin-width=&quot;354&quot; data-origin-height=&quot;327&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예시 / 위와 같은 판재가 있고 구멍을 뚫으려 한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Q) 크기?&amp;nbsp; A) 홀 크기 10에 +- 1이면 될 거 같다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Q) 위치?&amp;nbsp;&amp;nbsp; A) 위치는 위에서 30, 왼쪽에서 50 위치&lt;/li&gt;
&lt;li&gt;Q) 위치공차? A) 위치공차는 위 위치를 중심으로 반경 0.5안에 들어와야 한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 120px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 100%; text-align: center; height: 20px;&quot; colspan=&quot;2&quot;&gt;홀 가공 정보&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;사이즈 정보&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;사이즈 공차&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;+-1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;위치 정보&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;위로부터 30, 좌로부터 50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 40px;&quot;&gt;위치 공차&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 40px;&quot;&gt;진위치로부터 반경 0.5 안&lt;br /&gt;[진위치(True Postion) : 의도한 실제 위치]&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;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;좌측은 위치공차를 사용하지 않은 형태&lt;/b&gt;&lt;/span&gt;, &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;우측은 위치공차를 사용한 공차 형태&lt;/b&gt;&lt;/span&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;1094&quot; data-origin-height=&quot;467&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c56xRd/btsLqQcoAyr/eWAtCeP6Kz9LHXlNmZEx1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c56xRd/btsLqQcoAyr/eWAtCeP6Kz9LHXlNmZEx1K/img.png&quot; data-alt=&quot;위치공차 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c56xRd/btsLqQcoAyr/eWAtCeP6Kz9LHXlNmZEx1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc56xRd%2FbtsLqQcoAyr%2FeWAtCeP6Kz9LHXlNmZEx1K%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;800&quot; height=&quot;341&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;467&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위치공차 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좌측&amp;nbsp; 형태의 경우 아래 그림처럼 &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;공차역이 네모 모양이 되고 이것은 공차가 의도한 0.5를 벗어날 수도 있다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;공차 오류.png&quot; data-origin-width=&quot;4165&quot; data-origin-height=&quot;1936&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btEspf/btsLpJd1qT5/vk60PLYklb8HqK3md2Ssdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btEspf/btsLpJd1qT5/vk60PLYklb8HqK3md2Ssdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btEspf/btsLpJd1qT5/vk60PLYklb8HqK3md2Ssdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtEspf%2FbtsLpJd1qT5%2Fvk60PLYklb8HqK3md2Ssdk%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;800&quot; height=&quot;372&quot; data-filename=&quot;공차 오류.png&quot; data-origin-width=&quot;4165&quot; data-origin-height=&quot;1936&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;474&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KaOj6/btsLpBm0nV6/QYhhlcI7XvLDXbxKHGXfb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KaOj6/btsLpBm0nV6/QYhhlcI7XvLDXbxKHGXfb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KaOj6/btsLpBm0nV6/QYhhlcI7XvLDXbxKHGXfb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKaOj6%2FbtsLpBm0nV6%2FQYhhlcI7XvLDXbxKHGXfb1%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;300&quot; height=&quot;275&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;474&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 위 위치공차 예시 그림의 &lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;우측 형태처럼 위치공차를 사용하여 원래 의도했던 공차역의 형태로 가공을 하여야 한다.&lt;/span&gt;&lt;/b&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;30,50에 네모칸을 친 이유&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본치수 (Basic Dimension) : 진위치를 표현하기 위해 사용하는 치수&lt;/li&gt;
&lt;li&gt;그러므로 위치공차 예시 그림의 우측처럼 치수공차는 지워지고 위치공차가 대신하게 된다.&lt;/li&gt;
&lt;li&gt;또한 A,B와 같은 데이텀을 추가한다. (중요도 순서로 작성)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요약 : 작업 결과물(홀)의 센터가 진위치 중심 반경 0.5안에 들어와야 합격영역&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr;반경 0.5 = 직경 1.0 = 공차역의 크기&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;style2&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;실효 조건 - Virtual Condition&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;명시된 크기와 기하 공차를 결합하여 &lt;u&gt;특정 &lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;기능의 허용 변동 범위를 정의&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;하는 개념&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;부품이 제대로 맞고 작동할 수 있도록 하기 위해, 해당 기능에 대한 최악의 상황&lt;/u&gt;&lt;/b&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;크기를 갖는 형체의 규정된 MMC나 LMC의 재료조건과&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;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;&lt;b&gt;&lt;u&gt;어떤 특정한 위치를 침범하지 않는다는 것&lt;/u&gt;&lt;/b&gt;&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;541&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjxyyO/btsLpDLUgzw/Kug6wlIpdkTWlvgKYMr5nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjxyyO/btsLpDLUgzw/Kug6wlIpdkTWlvgKYMr5nk/img.png&quot; data-alt=&quot;9~11 사이 원은 모두 합격&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjxyyO/btsLpDLUgzw/Kug6wlIpdkTWlvgKYMr5nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjxyyO%2FbtsLpDLUgzw%2FKug6wlIpdkTWlvgKYMr5nk%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;300&quot; height=&quot;275&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;541&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;9~11 사이 원은 모두 합격&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;홀을 뚫는다 (재료를 삭제한다)는 상황에서 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;빨간 원 경계 안 쪽은 무조건 재료가 삭제됨을 &lt;span style=&quot;color: #ef5369;&quot;&gt;보&lt;/span&gt;장한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 영역을 &lt;b&gt;실효 조건 (Virtual Condition)&lt;/b&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;홀의 직경이 가장 작은 상태 MMC에서 위치 공차 허용범위 내로 빼서 계산&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1005&quot; data-origin-height=&quot;679&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJmsUy/btsLoo3bnjK/fk0AGzucH3i5vNX3scpe21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJmsUy/btsLoo3bnjK/fk0AGzucH3i5vNX3scpe21/img.png&quot; data-alt=&quot;VC 예시 (보라색 선)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJmsUy/btsLoo3bnjK/fk0AGzucH3i5vNX3scpe21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJmsUy%2FbtsLoo3bnjK%2Ffk0AGzucH3i5vNX3scpe21%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;400&quot; height=&quot;270&quot; data-origin-width=&quot;1005&quot; data-origin-height=&quot;679&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;VC 예시 (보라색 선)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;즉, &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;VC = MMC - 위치공차값&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(홀의 경우 MMC (60-2) - 위치공차 1.0 = VC 57)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;214&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G1bst/btsLpEqukLj/8dtCWbldV7W2kqiEhEyzDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G1bst/btsLpEqukLj/8dtCWbldV7W2kqiEhEyzDK/img.png&quot; data-alt=&quot;홀의 경우 순서대로 VC 8 / 44.3 / 7.7&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G1bst/btsLpEqukLj/8dtCWbldV7W2kqiEhEyzDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG1bst%2FbtsLpEqukLj%2F8dtCWbldV7W2kqiEhEyzDK%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;600&quot; height=&quot;134&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;214&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;홀의 경우 순서대로 VC 8 / 44.3 / 7.7&lt;/figcaption&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;&lt;b&gt;P.S&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;사실, 위처럼 모디파이어가 없는 기본형에서는 VC라고 부르지 않는다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;s&gt;원래 기본형에서는 Maximum inner boundry Maximum outer boundry 이런 식으로 부름&lt;/s&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;일단은 이해를 하기 위해 VC라 칭했다고 한다.&lt;/span&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;/span&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;모디파이어 (Modifier)&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;동그라미 안에 M, L, S 등이 들어가 있는 기호를 모디파이어라고 부른다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bm35yx/btsLn8e6wrv/Q81E9R7BHKQE8gqWVoxUy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bm35yx/btsLn8e6wrv/Q81E9R7BHKQE8gqWVoxUy0/img.png&quot; data-alt=&quot;좌 RFS / 중간 MMC 모디파이어 / 우 LMC 모디파이어&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bm35yx/btsLn8e6wrv/Q81E9R7BHKQE8gqWVoxUy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbm35yx%2FbtsLn8e6wrv%2FQ81E9R7BHKQE8gqWVoxUy0%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;700&quot; height=&quot;282&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;298&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;좌 RFS / 중간 MMC 모디파이어 / 우 LMC 모디파이어&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 51px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;Ⓜ : AT MMC&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;MMC일때&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;Ⓛ : AT LMC&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;LMC일때&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;Ⓢ : RFS (Regardless Feature of Size)&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;형체치수무관계 (사이즈랑 위치랑 무관한 관계)&lt;br /&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;AT MMC, AT LMC를 붙이게 되면 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;홀&amp;nbsp;사이즈에&amp;nbsp;따라&amp;nbsp;위치공차&amp;nbsp;값이&amp;nbsp;가변적으로&amp;nbsp;적용됨&lt;/b&gt;&lt;/span&gt;&lt;br /&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;689&quot; data-origin-height=&quot;349&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mcSRJ/btsLpinFVJW/yfuMparq5wK2eK3yq28Zp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mcSRJ/btsLpinFVJW/yfuMparq5wK2eK3yq28Zp1/img.png&quot; data-alt=&quot;AT MMC 예시1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mcSRJ/btsLpinFVJW/yfuMparq5wK2eK3yq28Zp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmcSRJ%2FbtsLpinFVJW%2FyfuMparq5wK2eK3yq28Zp1%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;400&quot; height=&quot;203&quot; data-origin-width=&quot;689&quot; data-origin-height=&quot;349&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AT MMC 예시1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Q) 크기? A) 홀 크기 10에 +-1 이면 될 것 같다.&lt;/li&gt;
&lt;li&gt;Q) 위치? A) 위치는 위에서 30, 왼쪽에서 50위치&lt;/li&gt;
&lt;li&gt;Q) 위치공차? A) 위치공차는 모르겠고 VC 8만 지켜돌라&lt;/li&gt;
&lt;/ol&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 115px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 20px; text-align: center;&quot; colspan=&quot;2&quot;&gt;VC를 8로 맞춰돌라&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;&amp;Oslash;9&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;위치공차&amp;nbsp;1로&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;&amp;Oslash;9.1&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;위치공차&amp;nbsp;1.1로&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;&amp;Oslash;9.2&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;위치공차&amp;nbsp;1.2로&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: center;&quot;&gt;&amp;Oslash;10&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: center;&quot;&gt;위치공차&amp;nbsp;2로&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: center;&quot; 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;1221&quot; data-origin-height=&quot;927&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjRH7A/btsLqNNywuE/h1jnJk31KLbQVyR93kezR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjRH7A/btsLqNNywuE/h1jnJk31KLbQVyR93kezR1/img.png&quot; data-alt=&quot;AT MMC 예시2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjRH7A/btsLqNNywuE/h1jnJk31KLbQVyR93kezR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjRH7A%2FbtsLqNNywuE%2Fh1jnJk31KLbQVyR93kezR1%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;500&quot; height=&quot;380&quot; data-origin-width=&quot;1221&quot; data-origin-height=&quot;927&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AT MMC 예시2&lt;/figcaption&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;Q) 위치공차? A) 앞으로는 &quot;MMC일 때&quot;의 공차만 적어놓겠다. 나머지 계산 가능합니까?&lt;/li&gt;
&lt;li&gt;Q) 예를 들어 MMC니까 9일 때 위치공차 1 적용 맞습니까? VC 8 나오는 것 맞습니까?&lt;/li&gt;
&lt;li&gt;A) 맞습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;모디파이어 전체 요약&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o7uW3/btsLn8TKH5L/hTwBUXHNW4NRWQYYJp7fjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o7uW3/btsLn8TKH5L/hTwBUXHNW4NRWQYYJp7fjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o7uW3/btsLn8TKH5L/hTwBUXHNW4NRWQYYJp7fjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo7uW3%2FbtsLn8TKH5L%2FhTwBUXHNW4NRWQYYJp7fjK%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;800&quot; height=&quot;463&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 100px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 36.9767%; height: 20px;&quot;&gt;RFS&lt;/td&gt;
&lt;td style=&quot;width: 63.0233%; height: 20px;&quot;&gt;VC 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 36.9767%; height: 20px;&quot;&gt;홀 MMC&lt;/td&gt;
&lt;td style=&quot;width: 63.0233%; height: 20px;&quot;&gt;MMC - 위치오차값 = VC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 36.9767%; height: 20px;&quot;&gt;홀 LMC&lt;/td&gt;
&lt;td style=&quot;width: 63.0233%; height: 20px;&quot;&gt;LMC + 위치오차값 = VC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 36.9767%; height: 20px;&quot;&gt;핀 MMC&lt;/td&gt;
&lt;td style=&quot;width: 63.0233%; height: 20px;&quot;&gt;MMC + 위치오차값 = VC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 36.9767%; height: 20px;&quot;&gt;핀 LMC&lt;/td&gt;
&lt;td style=&quot;width: 63.0233%; height: 20px;&quot;&gt;LMC - 위치오차값 = VC&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;blockquote data-ke-style=&quot;style3&quot;&gt;Youtube TeleV2 신입사원 도면강좌 13~16&lt;/blockquote&gt;</description>
      <category>CAD</category>
      <author>bumjae</author>
      <guid isPermaLink="true">https://bumjae.tistory.com/132</guid>
      <comments>https://bumjae.tistory.com/132#entry132comment</comments>
      <pubDate>Fri, 20 Dec 2024 08:06:03 +0900</pubDate>
    </item>
    <item>
      <title>치수공차, MMC &amp;amp; LMC</title>
      <link>https://bumjae.tistory.com/131</link>
      <description>&lt;blockquote data-ke-type=&quot;image&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; 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;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;설계상(공정상) 허용하는 오차&lt;/b&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;/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;1058&quot; data-origin-height=&quot;358&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5W53K/btsLoyRDNid/wyEmKhnWVVGcGbZqRS7PGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5W53K/btsLoyRDNid/wyEmKhnWVVGcGbZqRS7PGk/img.png&quot; data-alt=&quot;공차에는 치수공차와 기하공차 두가지 종류가 있다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5W53K/btsLoyRDNid/wyEmKhnWVVGcGbZqRS7PGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5W53K%2FbtsLoyRDNid%2FwyEmKhnWVVGcGbZqRS7PGk%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;700&quot; height=&quot;237&quot; data-origin-width=&quot;1058&quot; data-origin-height=&quot;358&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;공차에는 치수공차와 기하공차 두가지 종류가 있다.&lt;/figcaption&gt;
&lt;/figure&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: center;&quot; data-ke-size=&quot;size26&quot;&gt;치수공차&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&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;1045&quot; data-origin-height=&quot;562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tac0M/btsLplR870I/SPgZIgZC7qk9SYlg8opIkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tac0M/btsLplR870I/SPgZIgZC7qk9SYlg8opIkK/img.png&quot; data-alt=&quot;플러스 마이너스 톨러렌싱, 공차값 전체 기입 (리미트 디멘져닝)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tac0M/btsLplR870I/SPgZIgZC7qk9SYlg8opIkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftac0M%2FbtsLplR870I%2FSPgZIgZC7qk9SYlg8opIkK%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;600&quot; height=&quot;323&quot; data-origin-width=&quot;1045&quot; data-origin-height=&quot;562&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;플러스 마이너스 톨러렌싱, 공차값 전체 기입 (리미트 디멘져닝)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;921&quot; data-origin-height=&quot;409&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckEG6I/btsLp94wnbF/EUnGI7BzcRZEFwTHP8wpAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckEG6I/btsLp94wnbF/EUnGI7BzcRZEFwTHP8wpAk/img.png&quot; data-alt=&quot;공차 하한 상한 무제한 MIN,MAX&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckEG6I/btsLp94wnbF/EUnGI7BzcRZEFwTHP8wpAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckEG6I%2FbtsLp94wnbF%2FEUnGI7BzcRZEFwTHP8wpAk%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;600&quot; height=&quot;266&quot; data-origin-width=&quot;921&quot; data-origin-height=&quot;409&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;공차 하한 상한 무제한 MIN,MAX&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;MIN과 MAX를 동시에 사용하는 것은 불가능&lt;/b&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;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;MMC &amp;amp; LMC&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 34px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 49.5348%; height: 17px;&quot;&gt;MMC (Maximum material condition)&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 50.4652%; height: 17px;&quot;&gt;재료를 최대한으로 투입해 제작된 상태&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 49.5348%; height: 17px;&quot;&gt;LMC (Least material condition)&lt;/td&gt;
&lt;td style=&quot;width: 50.4652%; height: 17px;&quot;&gt;재료를 최소한으로 투입해 제작된 상태&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;CASE 1 : 상한 = &lt;b&gt;MMC&lt;/b&gt;, 하한 = &lt;b&gt;LMC&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;CASE 2 : 하한 = &lt;b&gt;LMC&lt;/b&gt;, 상한 = &lt;b&gt;MMC&lt;/b&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;p style=&quot;text-align: center;&quot; 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;MMC &amp;amp; LMC 개념을 알기 위해 형상 종류를 알고가야 한다.&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%;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Internal Feature&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;안으로 들어간 형상 (대표적으로 Hole, Slot)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;External Feature&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;밖으로 튀어나온 형상 (대표적으로 Pin)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: center;&quot; 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;343&quot; data-origin-height=&quot;482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6FNXW/btsLpcVdYY1/Ke4pFYEQTbS0V4xf1JKOMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6FNXW/btsLpcVdYY1/Ke4pFYEQTbS0V4xf1JKOMK/img.png&quot; data-alt=&quot;CASE 1 : 상한 =&amp;amp;nbsp; MMC , 하한 =&amp;amp;nbsp; LMC&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6FNXW/btsLpcVdYY1/Ke4pFYEQTbS0V4xf1JKOMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6FNXW%2FbtsLpcVdYY1%2FKe4pFYEQTbS0V4xf1JKOMK%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;300&quot; height=&quot;422&quot; data-origin-width=&quot;343&quot; data-origin-height=&quot;482&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CASE 1 : 상한 =&amp;nbsp; MMC , 하한 =&amp;nbsp; LMC&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;위 Pin 형상에서 상한이 11이고, 하한이 9일 때&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;최대 재료 투입한 상태&amp;nbsp;&lt;b&gt;11이 MMC&lt;/b&gt;이다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;최소 재료 투입한 상태 &lt;b&gt;9가 LMC&lt;/b&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;407&quot; data-origin-height=&quot;531&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DuaLt/btsLqX3Cabp/K49Xk6pDOKKlveOMKFDqH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DuaLt/btsLqX3Cabp/K49Xk6pDOKKlveOMKFDqH1/img.png&quot; data-alt=&quot;CASE 2 : 하한 =&amp;amp;nbsp; LMC , 상한 =&amp;amp;nbsp; MMC&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DuaLt/btsLqX3Cabp/K49Xk6pDOKKlveOMKFDqH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDuaLt%2FbtsLqX3Cabp%2FK49Xk6pDOKKlveOMKFDqH1%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;300&quot; height=&quot;391&quot; data-origin-width=&quot;407&quot; data-origin-height=&quot;531&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CASE 2 : 하한 =&amp;nbsp; LMC , 상한 =&amp;nbsp; MMC&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;위 Hole 형상에서 상한이 11이고, 하한이 9일 때&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;최대 재료 투입한 상태&lt;b&gt; 9가&lt;b&gt;&amp;nbsp;&lt;/b&gt;MMC&lt;/b&gt;이다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;최소 재료 투입한 상태&lt;b&gt; 11이&amp;nbsp;LMC&lt;/b&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;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;정리하면 MMC는 Pin일 때 최대직경 / Hole일 때 최소 직경&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;치수에서 MMC나 LMC를 논 할 수 있는 경우는 FOS(Feature of Size)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;즉, 사이즈 치수인 경우에만 가능하다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Youtube TeleV2 신입사원 도면강좌 11~12&lt;/blockquote&gt;</description>
      <category>CAD</category>
      <author>bumjae</author>
      <guid isPermaLink="true">https://bumjae.tistory.com/131</guid>
      <comments>https://bumjae.tistory.com/131#entry131comment</comments>
      <pubDate>Fri, 20 Dec 2024 07:17:16 +0900</pubDate>
    </item>
    <item>
      <title>규격, 치수</title>
      <link>https://bumjae.tistory.com/130</link>
      <description>&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;규격&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;규격01.png&quot; data-origin-width=&quot;685&quot; data-origin-height=&quot;289&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfBhIw/btsLp7S85Ta/MRFu1FginjjOGGDc0btnfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfBhIw/btsLp7S85Ta/MRFu1FginjjOGGDc0btnfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfBhIw/btsLp7S85Ta/MRFu1FginjjOGGDc0btnfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfBhIw%2FbtsLp7S85Ta%2FMRFu1FginjjOGGDc0btnfk%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;685&quot; height=&quot;289&quot; data-filename=&quot;규격01.png&quot; data-origin-width=&quot;685&quot; data-origin-height=&quot;289&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;도면 규격은 나라마다 사용하는 표준이 다름&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 71px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&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;ASME (구 ANSI)&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;미국&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;ISO&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;유럽&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;JIS&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;일본&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;KS&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;한국&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: center;&quot; 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;ASME와 ISO는 출발이 같으며 JIS는 ISO를 기반하고, KS는 JIS와 흡사&lt;/p&gt;
&lt;p style=&quot;text-align: center;&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;style5&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;투상법&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;주로 3각법(Third Angle Projection)과 1각법(First Angle Projection) 사용&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;한국은 대부분 3각법 사용&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;170&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F68M4/btsLoaDUubg/L7V2NWH0XERtJfnT3UsR91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F68M4/btsLoaDUubg/L7V2NWH0XERtJfnT3UsR91/img.png&quot; data-alt=&quot;위 3각법, 아래 1각법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F68M4/btsLoaDUubg/L7V2NWH0XERtJfnT3UsR91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF68M4%2FbtsLoaDUubg%2FL7V2NWH0XERtJfnT3UsR91%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;170&quot; height=&quot;250&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;170&quot; data-origin-height=&quot;250&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위 3각법, 아래 1각법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;478&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFu4Rq/btsLod1G5PI/Nulf2SPYnWB63OZrJozpGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFu4Rq/btsLod1G5PI/Nulf2SPYnWB63OZrJozpGk/img.png&quot; data-alt=&quot;우측면도가 왼쪽이면 1각법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFu4Rq/btsLod1G5PI/Nulf2SPYnWB63OZrJozpGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFu4Rq%2FbtsLod1G5PI%2FNulf2SPYnWB63OZrJozpGk%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;478&quot; height=&quot;256&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;478&quot; data-origin-height=&quot;256&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;우측면도가 왼쪽이면 1각법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;치수 스타일&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;규격01.png&quot; data-origin-width=&quot;685&quot; data-origin-height=&quot;289&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfBhIw/btsLp7S85Ta/MRFu1FginjjOGGDc0btnfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfBhIw/btsLp7S85Ta/MRFu1FginjjOGGDc0btnfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfBhIw/btsLp7S85Ta/MRFu1FginjjOGGDc0btnfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfBhIw%2FbtsLp7S85Ta%2FMRFu1FginjjOGGDc0btnfk%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;600&quot; height=&quot;253&quot; data-filename=&quot;규격01.png&quot; data-origin-width=&quot;685&quot; data-origin-height=&quot;289&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;보통 한국은 ISO 스타일을 사용&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 100px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 31.279%; height: 40px;&quot;&gt;ASME&lt;/td&gt;
&lt;td style=&quot;width: 68.721%; height: 40px;&quot;&gt;- 치수선을 중간에 끊고 치수를 무조건 가로 방향 기입&lt;br /&gt;- 마침표 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 31.279%; height: 40px;&quot;&gt;ISO&lt;/td&gt;
&lt;td style=&quot;width: 68.721%; height: 40px;&quot;&gt;- 치수선을 끊지않고 치수선과 나란하게 치수 기입&lt;br /&gt;- 콤마 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 31.279%; height: 20px;&quot;&gt;공통&lt;/td&gt;
&lt;td style=&quot;width: 68.721%; height: 20px;&quot;&gt;- 치수선은 반드시 측정방향과 나란해야 한다&lt;br /&gt;- 치수가 기입되는 선이 치수선 (Dimension Line)&lt;br /&gt;- 형상으로 부터 치수선에 연장되는 선이 치수보조선 or 연장선 (Extension Line)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;치수 기입 팁&lt;/h3&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;치수선 or 보조선의 불필요한 겹침을 피한다.&lt;/li&gt;
&lt;li&gt;가장 가까운 치수는 10mm, 그다음부터는 6mm 간격으로 치수 그리기&lt;/li&gt;
&lt;li&gt;스태거링 (staggering)하면 가독성이 높아진다. (같은 위치일 때 지그재그로 치수 정렬)&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;color: #ef5369;&quot;&gt;&lt;b&gt;90도 치수는 생략해도 된다. (규정에 의거)&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&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: 21.2791%;&quot;&gt;ASME Y14.5 (i) (j)&lt;/td&gt;
&lt;td style=&quot;width: 78.7209%;&quot;&gt;그려놓기를&amp;nbsp;90도처럼&amp;nbsp;그려놓았는데&amp;nbsp;90도라고&amp;nbsp;명시하지&amp;nbsp;않은&amp;nbsp;형상은&amp;nbsp;알아서&amp;nbsp;90도라고&amp;nbsp;생각한다.&lt;br /&gt;(공차 (+-0.5도))&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 21.2791%;&quot;&gt;ISO 2768-1&lt;/td&gt;
&lt;td style=&quot;width: 78.7209%;&quot;&gt;90도처럼 보이는데 명시되지 않은 것은 90도라고 생각하고 생략해도 된다.&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;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Champer - 모따기, Fillet (Round) - 모깎기&lt;/span&gt;&lt;/h2&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;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;305&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDT9iX/btsLoHVyV7f/qsWqsozY6v2V0KmeG1cGJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDT9iX/btsLoHVyV7f/qsWqsozY6v2V0KmeG1cGJK/img.png&quot; data-alt=&quot;C / R / CR&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDT9iX/btsLoHVyV7f/qsWqsozY6v2V0KmeG1cGJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDT9iX%2FbtsLoHVyV7f%2FqsWqsozY6v2V0KmeG1cGJK%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;500&quot; height=&quot;175&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;305&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;C / R / CR&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1069&quot; data-origin-height=&quot;523&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMb7Lu/btsLpiA9MZM/X0CWoNK64baBCAkMeol8nK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMb7Lu/btsLpiA9MZM/X0CWoNK64baBCAkMeol8nK/img.png&quot; data-alt=&quot;R / SR&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMb7Lu/btsLpiA9MZM/X0CWoNK64baBCAkMeol8nK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMb7Lu%2FbtsLpiA9MZM%2FX0CWoNK64baBCAkMeol8nK%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;500&quot; height=&quot;245&quot; data-origin-width=&quot;1069&quot; data-origin-height=&quot;523&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;R / SR&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;638&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnBVUI/btsLp9XJNe2/ZII9GJVEc6LSMNNeRDr6L0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnBVUI/btsLp9XJNe2/ZII9GJVEc6LSMNNeRDr6L0/img.png&quot; data-alt=&quot;&amp;amp;Oslash; / S&amp;amp;Oslash;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnBVUI/btsLp9XJNe2/ZII9GJVEc6LSMNNeRDr6L0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnBVUI%2FbtsLp9XJNe2%2FZII9GJVEc6LSMNNeRDr6L0%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;500&quot; height=&quot;277&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;638&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;Oslash; / S&amp;Oslash;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기호&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Champer - 모따기 (C)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Fillet - 모깎기 (R)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; Spherical Radius - 구형 모따기 (SR)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; text-align: center;&quot;&gt;2차원 원형 지름 (&lt;span style=&quot;text-align: center;&quot;&gt;&amp;Oslash;&lt;/span&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;text-align: center; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;구형 원형 지름 (S&amp;Oslash;)&amp;nbsp; ex. 조이스틱&lt;/span&gt;&lt;span style=&quot;text-align: center; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;text-align: center; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Controlled Radius - 표면을 더욱 처리한 라운드 (CR)&lt;/span&gt;&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;1097&quot; data-origin-height=&quot;451&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QLd8i/btsLpzCCpnW/ChcXv91VMrR0CyX3nmYf6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QLd8i/btsLpzCCpnW/ChcXv91VMrR0CyX3nmYf6k/img.png&quot; data-alt=&quot;우측이 CR이며 안쪽으로 다시 꺾인 형태가 없어야 한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QLd8i/btsLpzCCpnW/ChcXv91VMrR0CyX3nmYf6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQLd8i%2FbtsLpzCCpnW%2FChcXv91VMrR0CyX3nmYf6k%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;600&quot; height=&quot;247&quot; data-origin-width=&quot;1097&quot; data-origin-height=&quot;451&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;우측이 CR이며 안쪽으로 다시 꺾인 형태가 없어야 한다.&lt;/figcaption&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;이 중에서 &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;u&gt;챔퍼 &quot;&lt;span style=&quot;color: #ef5369;&quot;&gt;C&quot;&lt;/span&gt;는 ASME, ISO 규정에서는 사용하지 않는다&lt;/u&gt;&lt;/span&gt;&lt;/b&gt;고 한다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그 이유는 &lt;u&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;두 챔퍼의 크기와 각도를 명시하는 방식으로 규정&lt;/b&gt;&lt;/span&gt;&lt;/u&gt;되어 있기 때문이다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;P.S&amp;nbsp; &lt;b&gt;&quot;CR&quot;은 ASME 도면에서만 사용 가능&lt;/b&gt;&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;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dixrUS/btsLqA8C6YQ/ppiZawFFEa2YC30l9zWoak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dixrUS/btsLqA8C6YQ/ppiZawFFEa2YC30l9zWoak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dixrUS/btsLqA8C6YQ/ppiZawFFEa2YC30l9zWoak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdixrUS%2FbtsLqA8C6YQ%2FppiZawFFEa2YC30l9zWoak%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;500&quot; height=&quot;282&quot; data-origin-width=&quot;621&quot; data-origin-height=&quot;350&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;413&quot; data-origin-height=&quot;187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buquXB/btsLoezg1bH/hyPhGni6kl5rjalpVYk3Gk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buquXB/btsLoezg1bH/hyPhGni6kl5rjalpVYk3Gk/img.png&quot; data-alt=&quot;챔퍼의 크기가 같아 줄여서 사용을 한다면 위와 같이 명시한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buquXB/btsLoezg1bH/hyPhGni6kl5rjalpVYk3Gk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuquXB%2FbtsLoezg1bH%2FhyPhGni6kl5rjalpVYk3Gk%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;500&quot; height=&quot;226&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;187&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;챔퍼의 크기가 같아 줄여서 사용을 한다면 위와 같이 명시한다.&lt;/figcaption&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;&lt;b&gt;&lt;u&gt;C와 CR를 사용하는 규정은 일본 JIS 규정&lt;/u&gt;&lt;/b&gt;으로 KS 규정은 JIS와 흡사하기 때문에 사용한다고 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;305&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDT9iX/btsLoHVyV7f/qsWqsozY6v2V0KmeG1cGJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDT9iX/btsLoHVyV7f/qsWqsozY6v2V0KmeG1cGJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDT9iX/btsLoHVyV7f/qsWqsozY6v2V0KmeG1cGJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDT9iX%2FbtsLoHVyV7f%2FqsWqsozY6v2V0KmeG1cGJK%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;600&quot; height=&quot;210&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;305&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;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;치수의 종류&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUe3W8/btsLoI7Xlq0/o986unt9loaKieIkimKZqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUe3W8/btsLoI7Xlq0/o986unt9loaKieIkimKZqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUe3W8/btsLoI7Xlq0/o986unt9loaKieIkimKZqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUe3W8%2FbtsLoI7Xlq0%2Fo986unt9loaKieIkimKZqK%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;600&quot; height=&quot;140&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 74px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 35.3488%; height: 40px;&quot;&gt;치수 (Dimension)&lt;/td&gt;
&lt;td style=&quot;width: 64.6512%; height: 40px;&quot;&gt;일반 치수&lt;br /&gt;제작에 참여하는 치수 = 공정에 가공되는 치수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 35.3488%; height: 17px;&quot;&gt;참조치수 (Reference Dimension)&lt;/td&gt;
&lt;td style=&quot;width: 64.6512%; height: 17px;&quot;&gt;모두 지워도 도면해석에 문제없는 치수 &lt;br /&gt;사용 이유&lt;br /&gt;- 이전 공정에서 이미 맞춰와서 이번에는 가공될 필요가 없을 때&lt;br /&gt;- 자동으로 도출되는 치수 (지우기 가능)&lt;br /&gt;- 참고용 치수 (남은 치수 계산에 용이하게)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 35.3488%; height: 17px;&quot;&gt;기본치수 (Basic Dimension)&lt;/td&gt;
&lt;td style=&quot;width: 64.6512%; height: 17px;&quot;&gt;'기하공차'를 해석할 때만 쓰는 치수&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;위 3개의 치수를 제외하고는 규정상 표준에 정의된 치수는 없다.&lt;/b&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;도면 해석 팁&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;color: #ef5369;&quot;&gt;&lt;b&gt;형상의 위치정보&lt;/b&gt;&lt;/span&gt;이거나 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;사이즈 정보&lt;/b&gt;&lt;/span&gt;이거나 둘 중 하나이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SNIi0/btsLodm51ye/k4e2EjtnNwzkWvZeKBXak1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SNIi0/btsLodm51ye/k4e2EjtnNwzkWvZeKBXak1/img.png&quot; data-alt=&quot;사이즈 정보, 위치 정보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SNIi0/btsLodm51ye/k4e2EjtnNwzkWvZeKBXak1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSNIi0%2FbtsLodm51ye%2Fk4e2EjtnNwzkWvZeKBXak1%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;680&quot; height=&quot;499&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;499&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사이즈 정보, 위치 정보&lt;/figcaption&gt;
&lt;/figure&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;&quot;원형 형태라든지 홀 혹은 실린더의 외벽 그 다음에 마주 보고 있는 두 평면 따놓은 슬롯이라든지 이런 것들은 확실하게 얘는 사이즈다&quot; 라고 말할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Youtube TeleV2 신입사원 도면강좌 1 ~ 10&lt;/blockquote&gt;</description>
      <category>CAD</category>
      <author>bumjae</author>
      <guid isPermaLink="true">https://bumjae.tistory.com/130</guid>
      <comments>https://bumjae.tistory.com/130#entry130comment</comments>
      <pubDate>Fri, 20 Dec 2024 06:21:24 +0900</pubDate>
    </item>
    <item>
      <title>object, companion object</title>
      <link>https://bumjae.tistory.com/125</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Object&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kotlin에서 object는 두가지 형태로 나뉜다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Object Declarations (객체 선언식)&lt;/li&gt;
&lt;li&gt;Object Expressions (객체 표현식)&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;b&gt; Object Declarations &lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kotlin에서는 Java와 다르게 Singleton Class를 사용하기 위에 Object Declarations(객체 선언)을 사용한다.&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;Java에서는 아래 코드처럼 보통 클래스의 constructor를 private으로 선언하고, statice 변수에 클래스 객체를 저장하는 방식으로 싱글턴 패턴을 구현한다.&lt;/p&gt;
&lt;pre id=&quot;code_1704139342704&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Manager {
    private static Singleton INSTANCE;

    private Manager() { }

    public static Singleton getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new Manager();
        }
        return INSTANCE;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kotlin에서는 객체 선언 (object) 기능을 통해 싱글턴을 언어 자체에서 기본지원 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1704139421852&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;object Manager{

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드를 Java로 Decompile 해보면 아래와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Singleton 형태로 변환 되어 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1704139744445&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public final class Manager {
   @NotNull
   public static final Manager INSTANCE;

   private Manager() {
   }

   static {
      Manager var0 = new Manager();
      INSTANCE = var0;
   }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1704140174479&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;object Manager: TestClass(), ApiInterface {
	
	private val name: String = &quot;Bumjae&quot;
	
	override fun TestClassTodo(){
		...
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;object 내에 class와 같이 멤버 변수 / 메서드를 가질 수 있으며, class 및 interface의 상속이 가능하다.&lt;br /&gt;따라서, object를 선언식으로 사용하게 되면 자바의 Singleton 패턴과 같이 객체를 생성하여 사용할 수 있다.&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;b&gt; Object Expressions&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;표현식 object는 선언식과 달리 Singleton의 형태로 사용하지 않는다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&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 data-ke-size=&quot;size16&quot;&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;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1704140526030&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fun main() {
    val user = object{
        val name = &quot;Bumjae&quot;
        val age = 28
    }
    println(user.name)
    println(user.age)
}&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;추상클래스, 인터페이스의 구현체를 익명 클래스의 객체로 구현하고자 하는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1704140570202&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface MyInterface{
    val name:String
    val age: Int
    fun greeting()
}

val myListener= object: MyInterface{
    override val name = &quot;Bumjae&quot;
    override val age = 28
   	override fun greeting(){
       	println(&quot;my name is ${name}&quot;)
       	println(&quot;and I'm ${age} years old!&quot;)
   	}
}

fun main() {
    myListener.greeting()
}&lt;/code&gt;&lt;/pre&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;b&gt;Java의 static&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java에는 static 키워드를 통해 클래스의 인스턴스를 생성하지 않고도 변수, 메서드를 사용할 수 있다.&lt;br /&gt;이러한 static 키워드를 통해 선언된 변수, 메서드를 각각 클래스 변수, 클래스 메서드라한다.&lt;/p&gt;
&lt;pre id=&quot;code_1704141011532&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public final class User {
  static public final String TAG = &quot;user_tag&quot;;  // 클래스 변수
  static public plusOne(int num):int {
  		return num + 1
  }
}

// 클래스의 인스턴스를 생성하지 않고 호출 가능
// User.TAG
// User.plusOne(10)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 Kotlin의 경우에는 static 키워드가 존재하지 않는다.&amp;nbsp;&lt;br /&gt;대신 Java의 static 키워드와 매우 유사하게 사용 할 수 있는 companion object (동반 객체)가 존재한다.&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;b&gt;Companion Object&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;companion object (동반 객체)는 이름 그대로 클래스 내부에 존재하며, 클래스가 메모리에 적재될 때 함께 생성된다.&lt;/p&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: #0593d3;&quot;&gt;&lt;b&gt;클래스당 하나의 companion object&lt;/b&gt;&lt;/span&gt;만을 둘 수 있다.&lt;/li&gt;
&lt;li&gt;object와 같이 클래스, 인터페이스를 상속 받을 수 있다.&lt;/li&gt;
&lt;li&gt;Outer class는 companion object에 접근 가능하나, companion object 내에서는 Outer class에 접근할 수 없다.&lt;/li&gt;
&lt;li&gt;별도 클래스의 인스턴스를 생성하지 않고 클래스명으로 접근하여 자바의 static 변수, 메소드처럼 사용할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;클래스명.Companion으로 접근하며, 변수에 할당 가능&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1704141431377&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class User {
    companion object {
        val TAG = &quot;user_tag&quot;

        fun printName(name: String) {
            println(&quot;$TAG user name : $name&quot;)
        }
    }
}

fun main(){
    println(User.TAG)
    User.printName(&quot;bumajae&quot;)

    val userObject = User.Companion
    println(userObject.TAG)
}&lt;/code&gt;&lt;/pre&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Java의 static과 동일한가?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에 강조한 부분으로 클래스명.Companion 으로 접근 할 수 있으며, 변수에 할당이 가능하다는 점인데 이 말은 &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;companion object는 static과 달리 객체로써 생성된다는 것이다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드를 Java로 Decompile 해보면 User class 내부에 Companion이라는 클래스가 있으며, 해당 Companion 객체를 생성한다.&lt;br /&gt;&lt;b&gt;Companion 클래스만 static으로 되어 있으며, Companion 클래스 내부의 변수, 메서드는 static 형태로 존재하지 않는다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1704141525030&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public final class User {
   @NotNull
   private static final String TAG = &quot;user_tag&quot;;
   @NotNull
   public static final Companion Companion = new Companion((DefaultConstructorMarker)null);

   public static final class Companion {
      @NotNull
      public final String getTAG() {
         return User.TAG;
      }

      public final void printName(@NotNull String name) {
         Intrinsics.checkNotNullParameter(name, &quot;name&quot;);
         String var2 = ((Companion)this).getTAG() + &quot; user name : &quot; + name;
         System.out.println(var2);
      }

      private Companion() {
      }

      // $FF: synthetic method
      public Companion(DefaultConstructorMarker $constructor_marker) {
         this();
      }
   }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 static이 되게 하고 싶으면 companion object 내 변수, 메서드에 각각 &lt;b&gt;@JvmField&lt;/b&gt;, &lt;b&gt;@JvmStatic&lt;/b&gt; 어노테이션을 붙이면 static 키워드가 붙으므로 Java의 static 변수, 메서드와 같이 사용 할 수 있다.&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;b&gt;Object vs Companion Object&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 51px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;Object declaration&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;companion object&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;Class 전체가 하나의 Singleton 으로 선언&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;Class 내 일부분이 Singleton으로 선언&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;해당 Class가 사용될 때 초기화&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;해당 Class가 로드 될 때 초기화&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;blockquote data-ke-style=&quot;style3&quot;&gt;Reference&lt;br /&gt;https://parade621.tistory.com/37&lt;br /&gt;https://medium.com/@lunay0ung/kotlin-object-declaration-그리고-companion-object-feat-static-d5c97c21168&lt;br /&gt;https://www.androidhuman.com/2016-07-10-kotlin_companion_object&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Kotlin/Basic</category>
      <category>Kotlin</category>
      <author>bumjae</author>
      <guid isPermaLink="true">https://bumjae.tistory.com/125</guid>
      <comments>https://bumjae.tistory.com/125#entry125comment</comments>
      <pubDate>Tue, 2 Jan 2024 04:56:50 +0900</pubDate>
    </item>
    <item>
      <title>Retrofit 과 Coroutine 사용시 enequeue 내부적 구현</title>
      <link>https://bumjae.tistory.com/124</link>
      <description>&lt;pre id=&quot;code_1704129598108&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;viewModelScope.launch{
    RetrofitService.naverService.getSearchNews(query = keyword, sort = &quot;sim&quot;).run{
    	if (isSuccessful){
        	...
        } else {
        	...
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Retrofit을 사용할 때 Coroutine과 사용하게 되면 enqueue()의 비동기 코드를 실행하는 코드가 없어도 스스로 값을 가져오게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 바로 Response&amp;lt;&amp;gt;를 사용해 요청 이후의 응답을 바로 받아 사용을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;이 동작에 대해 이해하려 한다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;enequeue의 내부적 구현&lt;/b&gt;&lt;/h2&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;figure id=&quot;og_1704127398036&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Retrofit 사용 API Interface 구현체 내부적 구현&quot; data-og-description=&quot;사용 개발자는 Interface에 추상적인 api 함수들을 Retrofit Annotaion과 함께 정의한다. interface NaverApi { @GET(RetrofitService.NEWS_END_POINT) suspend fun getSearchNews( @Header(&amp;quot;X-Naver-Client-Id&amp;quot;) clientId : String = BuildConfig.NAVE&quot; data-og-host=&quot;bumjae.tistory.com&quot; data-og-source-url=&quot;https://bumjae.tistory.com/123#HttpServiceMethod.parseAnnotations-1&quot; data-og-url=&quot;https://bumjae.tistory.com/123&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/3OZXy/hyUXTD46xe/35tOjEjdMCQn1tB1ih6bJ1/img.png?width=484&amp;amp;height=254&amp;amp;face=0_0_484_254,https://scrap.kakaocdn.net/dn/8oMWL/hyUXRzufu3/yknwiBFACCmoRzYU8gzsM1/img.png?width=484&amp;amp;height=254&amp;amp;face=0_0_484_254,https://scrap.kakaocdn.net/dn/U5aOr/hyUTx3Lyew/hy71mSbwadmAzOchkPMcH0/img.png?width=484&amp;amp;height=254&amp;amp;face=0_0_484_254&quot;&gt;&lt;a href=&quot;https://bumjae.tistory.com/123#HttpServiceMethod.parseAnnotations-1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bumjae.tistory.com/123#HttpServiceMethod.parseAnnotations-1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/3OZXy/hyUXTD46xe/35tOjEjdMCQn1tB1ih6bJ1/img.png?width=484&amp;amp;height=254&amp;amp;face=0_0_484_254,https://scrap.kakaocdn.net/dn/8oMWL/hyUXRzufu3/yknwiBFACCmoRzYU8gzsM1/img.png?width=484&amp;amp;height=254&amp;amp;face=0_0_484_254,https://scrap.kakaocdn.net/dn/U5aOr/hyUTx3Lyew/hy71mSbwadmAzOchkPMcH0/img.png?width=484&amp;amp;height=254&amp;amp;face=0_0_484_254');&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;Retrofit 사용 API Interface 구현체 내부적 구현&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;사용 개발자는 Interface에 추상적인 api 함수들을 Retrofit Annotaion과 함께 정의한다. interface NaverApi { @GET(RetrofitService.NEWS_END_POINT) suspend fun getSearchNews( @Header(&quot;X-Naver-Client-Id&quot;) clientId : String = BuildConfig.NAVE&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;bumjae.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 글에서 Interface의 내부적 구현에서 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;HttpServiceMethod.parseAnnotations()&lt;/b&gt;&lt;/span&gt;에서 아래 isKotlinSuspendFunction 변수를 사용해 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;SuspendForResponse&lt;/b&gt;&lt;/span&gt;와 &lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;SuspendForBody&lt;/span&gt;&lt;/b&gt;를 생성해 return 해준다고 하였다.&lt;/p&gt;
&lt;pre id=&quot;code_1704127612514&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;boolean isKotlinSuspendFunction = requestFactory.isKotlinSuspendFunction;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1704127709438&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (!isKotlinSuspendFunction) {
      return new CallAdapted&amp;lt;&amp;gt;(requestFactory, callFactory, responseConverter, callAdapter);
    } else if (continuationWantsResponse) {
      //noinspection unchecked Kotlin compiler guarantees ReturnT to be Object.
      return (HttpServiceMethod&amp;lt;ResponseT, ReturnT&amp;gt;)
          new SuspendForResponse&amp;lt;&amp;gt;(
              requestFactory,
              callFactory,
              responseConverter,
              (CallAdapter&amp;lt;ResponseT, Call&amp;lt;ResponseT&amp;gt;&amp;gt;) callAdapter);
    } else {
      //noinspection unchecked Kotlin compiler guarantees ReturnT to be Object.
      return (HttpServiceMethod&amp;lt;ResponseT, ReturnT&amp;gt;)
          new SuspendForBody&amp;lt;&amp;gt;(
              requestFactory,
              callFactory,
              responseConverter,
              (CallAdapter&amp;lt;ResponseT, Call&amp;lt;ResponseT&amp;gt;&amp;gt;) callAdapter,
              continuationBodyNullable);
    }&lt;/code&gt;&lt;/pre&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; loadServiceMethod &lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이 모든 정보들을 가지고 loadServiceMethod로 돌아가 result에 SuspendForResponse를 저장하고, method 정보와 함께 serviceMethodCache에 저장한다.&lt;/p&gt;
&lt;pre id=&quot;code_1704127658338&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ServiceMethod&amp;lt;?&amp;gt; loadServiceMethod(Method method) {
    ServiceMethod&amp;lt;?&amp;gt; result = serviceMethodCache.get(method);
    if (result != null) return result;

    synchronized (serviceMethodCache) {
      result = serviceMethodCache.get(method);
      if (result == null) {
        result = ServiceMethod.parseAnnotations(this, method);
        serviceMethodCache.put(method, result);
      }
    }
    return result;
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;serviceMethodCache에는 메서드 정보, 그리고 실행에 대한 함수에 대한 정보(SuspendForResponse, callAdapter, callFactory, requestFactory, responseConverter)를 가지고 있다.&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;b&gt;InvocationHandler&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 가진 정보로 create의 return 값의 Proxy 생성으로 돌아가서 invoke를 수행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1704127862703&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;new InvocationHandler() {
  private final Platform platform = Platform.get();
  private final Object[] emptyArgs = new Object[0];

  @Override
  public @Nullable Object invoke(Object proxy, Method method, @Nullable Object[] args)
      throws Throwable {
    // If the method is a method from Object then defer to normal invocation.
    if (method.getDeclaringClass() == Object.class) {
      return method.invoke(this, args);
    }
    args = args != null ? args : emptyArgs;
    return platform.isDefaultMethod(method)
        ? platform.invokeDefaultMethod(method, service, proxy, args)
        : loadServiceMethod(method).invoke(args);
  }
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;loadServiceMethod() 메서드의 결과로 SuspendForResponse객체를 가지고, invoke를 수행하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 SuspendForResponse 클래스는 HttpServiceMethod안에 있고,&lt;br /&gt;이때의 invoke는 HttpServiceMethod.java 안의 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;SuspendForResponse클래스 내부의 invoke() 메서드가 수행&lt;/b&gt;&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;b&gt;HttpServiceMethod.invoke&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 adapt(call, args)에서 call은 이전에 requestFactory에서 수행했던 Annotaion 파싱, 메서드 정보, callFactory, responseConverter&amp;nbsp; 등의 정보들을 가지고 수행하게 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1704128009730&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// HttpServiceMethod

@Override
  final @Nullable ReturnT invoke(Object[] args) {
    Call&amp;lt;ResponseT&amp;gt; call = new OkHttpCall&amp;lt;&amp;gt;(requestFactory, args, callFactory, responseConverter);
    return adapt(call, args);
  }&lt;/code&gt;&lt;/pre&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;b&gt;SuspendForResponse.adapt&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 adapt(call, args)를 통해 위의 adapt가 실행되는데, callAdapter의 adapt(call)을 실행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기 생성된 call 객체 안에 requestFactory 안에 &quot;GET&quot;이라는 정보, BASE_URL 등 중요 정보가 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1704128595060&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// HttpServiceMethod.java 내부의 class SuspendForBody 안의 adapt

protected Object adapt(Call&amp;lt;ResponseT&amp;gt; call, Object[] args) {
      call = callAdapter.adapt(call);

      //noinspection unchecked Checked by reflection inside RequestFactory.
      Continuation&amp;lt;Response&amp;lt;ResponseT&amp;gt;&amp;gt; continuation =
          (Continuation&amp;lt;Response&amp;lt;ResponseT&amp;gt;&amp;gt;) args[args.length - 1];

      // See SuspendForBody for explanation about this try/catch.
      try {
        return KotlinExtensions.awaitResponse(call, continuation);
      } catch (Exception e) {
        return KotlinExtensions.suspendAndThrow(e, continuation);
      }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 위의 awaitResponse()의 인자인 continuation에 Coroutine을 실행할 코드가 있다.&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;b&gt;Retrofit Call.awaitResponse&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분에서 &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;enqueue()를 이미 진행해주고 있기 때문에 &quot;실행&quot;코드 없이 결과 값&lt;/span&gt;&lt;/b&gt;을 받을 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1704128937797&quot; class=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;// KotlinExtensions.kt

suspend fun &amp;lt;T&amp;gt; Call&amp;lt;T&amp;gt;.awaitResponse(): Response&amp;lt;T&amp;gt; {
  return suspendCancellableCoroutine { continuation -&amp;gt;
    continuation.invokeOnCancellation {
      cancel()
    }
    enqueue(object : Callback&amp;lt;T&amp;gt; {
      override fun onResponse(call: Call&amp;lt;T&amp;gt;, response: Response&amp;lt;T&amp;gt;) {
        continuation.resume(response)
      }

      override fun onFailure(call: Call&amp;lt;T&amp;gt;, t: Throwable) {
        continuation.resumeWithException(t)
      }
    })
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;resumeWithException()&amp;nbsp;메서드를&amp;nbsp;통해&amp;nbsp;내부적으로&amp;nbsp;resumeWith()&amp;nbsp;메서드를&amp;nbsp;실행하고,&amp;nbsp;결과값을&amp;nbsp;받고&amp;nbsp;Result&amp;nbsp;클래스를&amp;nbsp;이용해&amp;nbsp;값을&amp;nbsp;전달&lt;/p&gt;
&lt;pre id=&quot;code_1704129206530&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@SinceKotlin(&quot;1.3&quot;)
@InlineOnly
public inline fun &amp;lt;T&amp;gt; Continuation&amp;lt;T&amp;gt;.resume(value: T): Unit =
    resumeWith(Result.success(value))

@SinceKotlin(&quot;1.3&quot;)
@InlineOnly
public inline fun &amp;lt;T&amp;gt; Continuation&amp;lt;T&amp;gt;.resumeWithException(exception: Throwable): Unit =
    resumeWith(Result.failure(exception))&lt;/code&gt;&lt;/pre&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;&lt;b&gt;Coroutine Dispatchers를 지정하지 않는 이유&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 코드처럼 Dispachers를 신경 쓰고 지정해 주는 사람도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이는 불필요한 작업이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Retrofit Call의 메서드로 자체적 비동기 호출을 하고, 결과에 따라 콜백을 처리해 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;즉, Dispatchers를 지정해 주어도 코루틴의 흐름을 타지 않고, 자바 스레드 풀에서 돌게 된다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1704129953523&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CoroutineScope(Dispatchers.IO).launch{
	RetrofitService.naverService.getSearchNews(query = keyword, sort = &quot;sim&quot;).run{
    	if (isSuccessful){
        	...
        } else {
        	...
        }
    }
    
    withContext(Dispatchers.Main){
    	//UI SET
    }
}&lt;/code&gt;&lt;/pre&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;b&gt;Retrofit.enqueue &lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;Retrofit의 enqueue는&lt;span&gt;&amp;nbsp;&lt;/span&gt;OkHttp의 enqueue를 실행&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OkHttp의 call 객체를 생성하여, 그 call 객체를 이용해 enqueue를 실행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1704130250017&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Retrofit.enqueue()

@Override
  public void enqueue(final Callback&amp;lt;T&amp;gt; callback) {
    Objects.requireNonNull(callback, &quot;callback == null&quot;);

    okhttp3.Call call;
    Throwable failure;

    synchronized (this) {
      if (executed) throw new IllegalStateException(&quot;Already executed.&quot;);
      executed = true;

      call = rawCall;
      failure = creationFailure;
      if (call == null &amp;amp;&amp;amp; failure == null) {
        try {
          call = rawCall = createRawCall();
        } catch (Throwable t) {
          throwIfFatal(t);
          failure = creationFailure = t;
        }
      }
    }

    if (failure != null) {
      callback.onFailure(this, failure);
      return;
    }

    if (canceled) {
      call.cancel();
    }

    call.enqueue(
        new okhttp3.Callback() {
          @Override
          public void onResponse(okhttp3.Call call, okhttp3.Response rawResponse) {
            Response&amp;lt;T&amp;gt; response;
            try {
              response = parseResponse(rawResponse);
            } catch (Throwable e) {
              throwIfFatal(e);
              callFailure(e);
              return;
            }

            try {
              callback.onResponse(OkHttpCall.this, response);
            } catch (Throwable t) {
              throwIfFatal(t);
              t.printStackTrace(); // TODO this is not great
            }
          }

          @Override
          public void onFailure(okhttp3.Call call, IOException e) {
            callFailure(e);
          }

          private void callFailure(Throwable e) {
            try {
              callback.onFailure(OkHttpCall.this, e);
            } catch (Throwable t) {
              throwIfFatal(t);
              t.printStackTrace(); // TODO this is not great
            }
          }
        });
  }&lt;/code&gt;&lt;/pre&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;b&gt;OkHttp.enqueue&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;client.dispatcher().enqueue()를&amp;nbsp;실행&lt;/p&gt;
&lt;pre id=&quot;code_1704130642729&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void enqueue(Callback responseCallback, boolean forWebSocket) {
  synchronized (this) {
    if (executed) throw new IllegalStateException(&quot;Already Executed&quot;);
    executed = true;
  }
  client.getDispatcher().enqueue(new AsyncCall(responseCallback, forWebSocket));
}&lt;/code&gt;&lt;/pre&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;OkHttp.Dispatcher.enqueue&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;synchronized 블록을 통해 AsyncCall을 처리&lt;/p&gt;
&lt;pre id=&quot;code_1704130797259&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void enqueue(AsyncCall call) {
    synchronized (this) {
      readyAsyncCalls.add(call);

      // Mutate the AsyncCall so that it shares the AtomicInteger of an existing running call to
      // the same host.
      if (!call.get().forWebSocket) {
        AsyncCall existingCall = findExistingCallWithHost(call.host());
        if (existingCall != null) call.reuseCallsPerHostFrom(existingCall);
      }
    }
    promoteAndExecute();
  }&lt;/code&gt;&lt;/pre&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;AsyncCall&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AsyncCall은 Runnable을 상속받아 비동기 실행을 돕는다.&lt;/p&gt;
&lt;pre id=&quot;code_1704131197619&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;final class AsyncCall extends NamedRunnable {
  private final Callback responseCallback;
  private final boolean forWebSocket;
  private AsyncCall(Callback responseCallback, boolean forWebSocket) {
    super(&quot;OkHttp %s&quot;, originalRequest.urlString());
    this.responseCallback = responseCallback;
    this.forWebSocket = forWebSocket;
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AsyncCall 클래스 내부에 promoteAndExecute 메서드는 readyAsyncCall을 runningAsyncCall로 승격시켜 주고 executeOn메서드를 통해 실행시켜 준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;582&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxmvVm/btsCQ2mMjrm/YO2rKG3VaON9q3op9QW0g1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxmvVm/btsCQ2mMjrm/YO2rKG3VaON9q3op9QW0g1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxmvVm/btsCQ2mMjrm/YO2rKG3VaON9q3op9QW0g1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdxmvVm%2FbtsCQ2mMjrm%2FYO2rKG3VaON9q3op9QW0g1%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;720&quot; height=&quot;532&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;582&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;executeOn() 메서드에서는 executorService를 통해 인자로 runnable로 받아 스레드를 이용해 실행시켜 준다.&lt;br /&gt;Executor 구현체는 전달받은 작업을 큐에 넣은 후, 사용할 수 있는 스레드가 존재하면, 해당 스레드에 작업을 실행한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;767&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLfqii/btsCP6iGbF6/KMi55tOa6l4Ao4qJe80ab0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLfqii/btsCP6iGbF6/KMi55tOa6l4Ao4qJe80ab0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLfqii/btsCP6iGbF6/KMi55tOa6l4Ao4qJe80ab0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLfqii%2FbtsCP6iGbF6%2FKMi55tOa6l4Ao4qJe80ab0%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;720&quot; height=&quot;353&quot; data-origin-width=&quot;767&quot; data-origin-height=&quot;376&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;그래서 Dispatchers를 바꿔주며 Coroutine을 사용해도 사실은 아무런 영향을 미치지 못한다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;안드로이드에서는 Lifecycle에 따라 코루틴을 자동으로 취소해 주는 lifecycleScope를 이용하거나 viewModelScope를 이용하면 된다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Interface&lt;br /&gt;https://rlaudals2374.medium.com/retrofit의-구현체는-어디에-있을까-e04b7952c408&lt;br /&gt;https://seokzoo.tistory.com/4?source=post_page-----964f4b5d0a5d--------------------------------&lt;br /&gt;&lt;br /&gt;Retrofit Dispatchers&lt;br /&gt;https://dalinaum.github.io/android/2021/01/28/retrofit-does-not-need-dispachers-io.html&lt;/blockquote&gt;</description>
      <category>Android/Debugging</category>
      <category>Android</category>
      <author>bumjae</author>
      <guid isPermaLink="true">https://bumjae.tistory.com/124</guid>
      <comments>https://bumjae.tistory.com/124#entry124comment</comments>
      <pubDate>Tue, 2 Jan 2024 01:25:35 +0900</pubDate>
    </item>
    <item>
      <title>Retrofit 사용 API Interface 구현체 내부적 구현</title>
      <link>https://bumjae.tistory.com/123</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;사용&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자는 Interface에 추상적인 api 함수들을 Retrofit Annotaion과 함께 정의한다.&lt;/p&gt;
&lt;pre id=&quot;code_1704048227145&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface NaverApi {
    @GET(RetrofitService.NEWS_END_POINT)
    suspend fun getSearchNews(
        @Header(&quot;X-Naver-Client-Id&quot;) clientId : String = BuildConfig.NAVER_CLIENT_ID,
        @Header(&quot;X-Naver-Client-Secret&quot;) clientPw : String = BuildConfig.NAVER_CLIENT_SECRET,
        @Query(&quot;query&quot;) query : String,
        @Query(&quot;sort&quot;) sort : String,
    ): Call&amp;lt;NewsResponse&amp;gt;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Retrofit Builder에 Url, Client, Convert 등 등을 설정해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1704055203581&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private val retrofit = Retrofit.Builder()
    .baseUrl(BASE_URL)
    .client(provideHttpClient())
    .addConverterFactory(createGsonConverterFactory())
    .build()
    
val naverService = retrofit.create(NaverApi::class.java)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 create 함수로 정의한 API Interface를 넘긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;개발자는 API Service의 구현체를 직접 만들지 않는다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Interface를 정의하기만 하고 사용할 때에는 Retrofit.create을 이용해서 Api Service의 구현체를 받아온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;이 받아오는 구현체의 내부 동작을 이해하려 한다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;113&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cs1K7U/btsCOFL4Awa/dJHlnRfPskvb0uREFCtGF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cs1K7U/btsCOFL4Awa/dJHlnRfPskvb0uREFCtGF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cs1K7U/btsCOFL4Awa/dJHlnRfPskvb0uREFCtGF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcs1K7U%2FbtsCOFL4Awa%2FdJHlnRfPskvb0uREFCtGF1%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;602&quot; height=&quot;113&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;113&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Retrofit.create 함수의 매개변수를 보면 Class&amp;lt;T!&amp;gt; 라는 Java Class를 받는다.&lt;br /&gt;여기에 리플렉션을 이용해 Interface::class.java로 java클래스로 바꾸어준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;리플렉션(::)은 런타임의 클래스를 참조하는 기술&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;KClass 참조하여 java Class로 변환해주는 확장 프로퍼티&lt;/b&gt;를 사용해 자바 클래스로 넘겨준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/java.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/java.html&lt;/a&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;b&gt;Retrofit.create&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;create 함수의 내부, API&amp;nbsp;endpoints를&amp;nbsp;정의한&amp;nbsp;service&amp;nbsp;interface의&amp;nbsp;구현체를&amp;nbsp;만들어준다&lt;/p&gt;
&lt;pre id=&quot;code_1704048824526&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public &amp;lt;T&amp;gt; T create(final Class&amp;lt;T&amp;gt; service) { // 넘겨준 NaverApi Interface의 java Class
  validateServiceInterface(service);
  return (T) // T (NaverApi)로 타입 변환 후 Proxy 반환
      Proxy.newProxyInstance( // Proxy 인스턴스 생성
          service.getClassLoader(), // NaverApi Class가 로드된 클래스로더 넘겨주기
          new Class&amp;lt;?&amp;gt;[] {service}, // NaverApi Class 넘겨주기
          new InvocationHandler() { // InvocationHandler 정의하여 넘겨주기
            ...
          });
}&lt;/code&gt;&lt;/pre&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;b&gt;validateServiceInterface(service)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전달 받은 인자가 Interface인지 확인하고, 아닐 시 IllegalArgumentException을 발생&lt;/p&gt;
&lt;pre id=&quot;code_1704119123036&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private void validateServiceInterface(Class&amp;lt;?&amp;gt; service) {
  if (!service.isInterface()) {
    throw new IllegalArgumentException(&quot;API declarations must be interfaces.&quot;);
  }
  Deque&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; check = new ArrayDeque&amp;lt;&amp;gt;(1);
  check.add(service);
  
  ...&lt;/code&gt;&lt;/pre&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.newProxyInstance를 사용하는데 일단 Proxy에 대해 알아본다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Proxy&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타겟이 되는 클래스의 기능을 확장하거나, 클래스에 대한 접근을 제어하기 위해 사용하는 클래스이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 Hello Interface가 있고, 이것을 구현한 HelloTarget 클래스가 있을때&lt;/p&gt;
&lt;pre id=&quot;code_1704122943700&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface Hello {
    fun sayHello(name: String): String
    fun sayHi(name: String): String
}

class HelloTarget : Hello {
    override fun sayHello(name: String): String {
        return &quot;Hello $name&quot;
    }

    override fun sayHi(name: String): String {
        return &quot;Hi $name&quot;
    }
}&lt;/code&gt;&lt;/pre&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를 이용하면 Hello Interface의 메서드를 변경하지 않고 부가 기능을 추가 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HellowUppercase라는 Hello의 구현체를 따로 만들고, HelloTarget의 객체를 선언해준다.&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;Hello의 메서드를 호출하면 HelloTarget이 위임받아 원래의 기능을 수행하고 uppercase() 메소드를 통해 대문자로 변환하는 기능을 추가한 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1704123097533&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class HelloUpperCase: Hello{
    private val helloTarget = HelloTarget()

    override fun sayHello(name: String): String {
        return helloTarget.sayHello(name).uppercase(Locale.getDefault())
    }

    override fun sayHi(name: String): String {
        return helloTarget.sayHi(name).uppercase(Locale.getDefault())
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;Proxy를 사용하면 타겟의 코드 수정 없이 기능을 확장하거나 부가 기능을 추가&lt;/b&gt;&lt;/span&gt; 할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Dynamin Proxy&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 위와 같은 Proxy는 Interface를 직접 구현해야하고, 중복이 발생하는 단점이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 함수 중 하나만 수정 하고 싶어도, 모든 메서드를 override해야하고, 중복된 코드가 많아진다.&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;Dynamic Proxy는 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;일일이 프록시를 생성하지 않고 런타임 시점에 Interface를 구현하는 클래스 또는 Instance를 만들어주는 것&lt;/b&gt;&lt;/span&gt;을 뜻한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그것을 수행하는게 Proxy의 newProxyInstance() 이다.&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;b&gt;Proxy.newProxyInstance&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java의 Refelction API에서 제공해주는 Dynamic Proxy 클래스를 만드는 함수&lt;/p&gt;
&lt;pre id=&quot;code_1704124013464&quot; class=&quot;aspectj&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;@CallerSensitive
public static Object newProxyInstance(ClassLoader loader,
                                      Class&amp;lt;?&amp;gt;[] interfaces,
                                      InvocationHandler h)
    throws IllegalArgumentException 
{
    Objects.requireNonNull(h);

    final Class&amp;lt;?&amp;gt;[] intfs = interfaces.clone();	// java class Type의 Interface를 클론
    
    Class&amp;lt;?&amp;gt; cl = getProxyClass0(loader, intfs);	// getProxyClass : Proxy 클래스 return 받음
    
    final Constructor&amp;lt;?&amp;gt; cons = cl.getConstructor(constructorParams);	// cl에 대한 생성자 받아오기
    
    final InvocationHandler ih = h; 전달 받은 InvocationHandler 할당
    
    // reflected 된 객체에 접근 가능하게 설정
    if (!Modifier.isPublic(cl.getModifiers())) {
        cons.setAccessible(true);
    }
    
    // 생성자로 위에 정의한 InvocationHandler를 가진 인스턴스 반환
    return cons.newInstance(new Object[]{h});
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;넘겨준 파라미터 loader, interfaces, InvocationHandler를 받아서 동적으로 인스턴스 생성&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ClassLoader loader : Proxy를 만들 클래스 로더&lt;/li&gt;
&lt;li&gt;Class&amp;lt;?&amp;gt;[] interfaces : 어떤 Interface의 Proxy를 만들 것인지 명시&lt;/li&gt;
&lt;li&gt;InvocationHandler h : &lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;InvocationHandler Interface의 구현체&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;return 값 : 동적으로 만든 Profxy 객체&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ClassLoader를 참조, 런타임에 해당하는 Interface의 구현체 (Proxy Instance)를 만든다.&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;b&gt;인자 InvocationHandler&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;invoke()라는 메소드 하나만 가지고 있는 인터페이스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동적으로 생성될 Proxy의 메소드가 호출되면 Invoke를 거치게 되고, 여기서 메소드의 기능을 확장할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;platform의 method가 defaultMethod라면 invokeDefaultMethod를 반환, 아니라면 loadServiceMethod.invoke를 반환&lt;/p&gt;
&lt;pre id=&quot;code_1704050879724&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;new InvocationHandler() {
  private final Platform platform = Platform.get();
  private final Object[] emptyArgs = new Object[0];

  @Override
  public @Nullable Object invoke(Object proxy, Method method, @Nullable Object[] args)
      throws Throwable {
    // If the method is a method from Object then defer to normal invocation.
    if (method.getDeclaringClass() == Object.class) {
      return method.invoke(this, args);
    }
    args = args != null ? args : emptyArgs;
    return platform.isDefaultMethod(method)
        ? platform.invokeDefaultMethod(method, service, proxy, args)
        : loadServiceMethod(method).invoke(args);
  }
});&lt;/code&gt;&lt;/pre&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;Platform&lt;/b&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;Android Platform 레벨에 접근하기 위한 클래스&lt;/p&gt;
&lt;pre id=&quot;code_1704051310367&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Platform {
  private static final Platform PLATFORM = findPlatform();

  static Platform get() {
    return PLATFORM;
  }

  private static Platform findPlatform() {
    return &quot;Dalvik&quot;.equals(System.getProperty(&quot;java.vm.name&quot;))
        ? new Android() //
        : new Platform(true);
  }&lt;/code&gt;&lt;/pre&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;Default Method&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바 8부터 지원한 public non-abstract한 instance 메소드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터페이스에 정의되어있는 body가 있는 non-static 메소드&lt;/p&gt;
&lt;pre id=&quot;code_1704051646134&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@IgnoreJRERequirement // Only called on API 24+.
boolean isDefaultMethod(Method method) {
  return hasJava8Types &amp;amp;&amp;amp; method.isDefault();
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1704051781778&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/**
 * Returns {@code true} if this method is a default
 * method; returns {@code false} otherwise.
 *
 * A default method is a public non-abstract instance method, that
 * is, a non-static method with a body, declared in an interface
 * type.
 *
 * @return true if and only if this method is a default
 * method as defined by the Java Language Specification.
 * @since 1.8
 */
public boolean isDefault() {
    // Android-changed: isDefault() implemented using Executable.
    return super.isDefaultMethodInternal();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 해서 위의 platform은 Android가 담기고, 개발자가 선언해준&amp;nbsp;인터페이스의&amp;nbsp;함수는&amp;nbsp;default가&amp;nbsp;아니기에platform.isDefaultMethod가&amp;nbsp;false가&amp;nbsp;나와&amp;nbsp;아래의&amp;nbsp;loadServiceMethod가&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;즉, Dynamic Proxy를 통해 Retrofit을 위해 선언해준 &lt;b&gt;interface에 대해서 동적으로 클래스를 생성해주는 역할을 하는 것이 Dynamic Proxy&lt;/b&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;&lt;b&gt;Retrofit.loadServiceMethod&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;serviceMethodCache는 Retrofit 클래스 최상단에 선언되어 있는 Map객체 프로퍼티이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Retrofit 객체는 map을 이용해 메소드들을 캐싱 처리하여 loadServiceMethod 호출 시 캐시에 해당 메서드가 있다면 이를 사용하고, 없으면 parseAnnotations로 메소드를 만들어 set해주고 있다.&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;실행시&amp;nbsp;비어있기&amp;nbsp;때문에&amp;nbsp;null을&amp;nbsp;반환하여&amp;nbsp;아래&amp;nbsp;synchronized&amp;nbsp;블록을&amp;nbsp;실행합니다. &lt;br /&gt;그&amp;nbsp;안에서&amp;nbsp;값이&amp;nbsp;저장되지&amp;nbsp;않은&amp;nbsp;채로&amp;nbsp;get을&amp;nbsp;하기때문에&amp;nbsp;result는&amp;nbsp;첫&amp;nbsp;값으로&amp;nbsp;null이며,&amp;nbsp;후에&amp;nbsp;if문을&amp;nbsp;실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt; 즉, 사용할 때 API 첫 번째 호출에는 새 메서드를 생성, 다음 호출부터는 캐싱된 메서드를 가져온다. &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1704052400944&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public final class Retrofit {
    private final Map&amp;lt;Method, ServiceMethod&amp;lt;?&amp;gt;&amp;gt; serviceMethodCache = new ConcurrentHashMap&amp;lt;&amp;gt;();

    ServiceMethod&amp;lt;?&amp;gt; loadServiceMethod(Method method) {
        ServiceMethod&amp;lt;?&amp;gt; result = serviceMethodCache.get(method);
        if (result != null) return result;

        synchronized (serviceMethodCache) {
            result = serviceMethodCache.get(method);
            if (result == null) {
                result = ServiceMethod.parseAnnotations(this, method);
            serviceMethodCache.put(method, result);
       }
    }
    return result;
}&lt;/code&gt;&lt;/pre&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;b&gt;ServiceMethod.parseAnnotations&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;requestFactory를 이용해 (PUT, POST, GET 등)어노테이션을 수집하고, 이를 HttpServiceMethod.parseAnnotations에 넘겨준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt; HttpServiceMethod.parseAnnotations&lt;/b&gt;&lt;/span&gt;에선 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;최종적으로 메서드의 Response, Return 타입들을 정의&lt;/b&gt;&lt;/span&gt;한다.&lt;/p&gt;
&lt;pre id=&quot;code_1704052888319&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;abstract class ServiceMethod&amp;lt;T&amp;gt; {
  static &amp;lt;T&amp;gt; ServiceMethod&amp;lt;T&amp;gt; parseAnnotations(Retrofit retrofit, Method method) {
    RequestFactory requestFactory = RequestFactory.parseAnnotations(retrofit, method);

    Type returnType = method.getGenericReturnType();
    if (Utils.hasUnresolvableType(returnType)) {
      throw methodError(
          method,
          &quot;Method return type must not include a type variable or wildcard: %s&quot;,
          returnType);
    }
    if (returnType == void.class) {
      throw methodError(method, &quot;Service methods cannot return void.&quot;);
    }

    return HttpServiceMethod.parseAnnotations(retrofit, method, requestFactory);
  }

  abstract @Nullable T invoke(Object[] args);
}&lt;/code&gt;&lt;/pre&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;b&gt;RequestFactory.parseAnnotations&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;실제로 지정해준 Annotation들을 파싱&lt;/b&gt;&lt;/span&gt;한다.&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;crystal&quot;&gt;&lt;code&gt;private void parseMethodAnnotation(Annotation annotation) {
  if (annotation instanceof DELETE) {
    parseHttpMethodAndPath(&quot;DELETE&quot;, ((DELETE) annotation).value(), false);
  } else if (annotation instanceof GET) {
    parseHttpMethodAndPath(&quot;GET&quot;, ((GET) annotation).value(), false);
  } else if (annotation instanceof HEAD) {
    parseHttpMethodAndPath(&quot;HEAD&quot;, ((HEAD) annotation).value(), false);
  } else if (annotation instanceof PATCH) {
    parseHttpMethodAndPath(&quot;PATCH&quot;, ((PATCH) annotation).value(), true);
  } else if (annotation instanceof POST) {
    parseHttpMethodAndPath(&quot;POST&quot;, ((POST) annotation).value(), true);
  } else if (annotation instanceof PUT) {
    parseHttpMethodAndPath(&quot;PUT&quot;, ((PUT) annotation).value(), true);
  } else if (annotation instanceof OPTIONS) {
    parseHttpMethodAndPath(&quot;OPTIONS&quot;, ((OPTIONS) annotation).value(), false);
  } else if (annotation instanceof HTTP) {
    HTTP http = (HTTP) annotation;
    parseHttpMethodAndPath(http.method(), http.path(), http.hasBody());
  } else if (annotation instanceof retrofit2.http.Headers) {
    String[] headersToParse = ((retrofit2.http.Headers) annotation).value();
    if (headersToParse.length == 0) {
      throw methodError(method, &quot;@Headers annotation is empty.&quot;);
    }
    headers = parseHeaders(headersToParse);
  } else if (annotation instanceof Multipart) {
    if (isFormEncoded) {
      throw methodError(method, &quot;Only one encoding annotation is allowed.&quot;);
    }
    isMultipart = true;
  } else if (annotation instanceof FormUrlEncoded) {
    if (isMultipart) {
      throw methodError(method, &quot;Only one encoding annotation is allowed.&quot;);
    }
    isFormEncoded = true;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&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;b&gt;HttpServiceMethod.parseAnnotations&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 변수 isKotlinSuspendFunction, 해당 함수가 suspend function 인지 확인하는 변수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 suspendFunction 관련 변수들과 처리는 다른 글에서 다룰 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1704124405031&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;static &amp;lt;ResponseT, ReturnT&amp;gt; HttpServiceMethod&amp;lt;ResponseT, ReturnT&amp;gt; parseAnnotations(
      Retrofit retrofit, Method method, RequestFactory requestFactory) {
    boolean isKotlinSuspendFunction = requestFactory.isKotlinSuspendFunction;
    boolean continuationWantsResponse = false;
    boolean continuationBodyNullable = false;
    ...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 코드 아래에 보면 suspend function이 아니라면 CallAdapted를 생성하여 리턴하고, Response 객체를 리턴값으로 가진다면 SuspendForResponse를, Body가 필요하다면 SuspendForBody를 생성하여 리턴한다.&lt;/p&gt;
&lt;pre id=&quot;code_1704124563513&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (!isKotlinSuspendFunction) {
      return new CallAdapted&amp;lt;&amp;gt;(requestFactory, callFactory, responseConverter, callAdapter);
    } else if (continuationWantsResponse) {
      //noinspection unchecked Kotlin compiler guarantees ReturnT to be Object.
      return (HttpServiceMethod&amp;lt;ResponseT, ReturnT&amp;gt;)
          new SuspendForResponse&amp;lt;&amp;gt;(
              requestFactory,
              callFactory,
              responseConverter,
              (CallAdapter&amp;lt;ResponseT, Call&amp;lt;ResponseT&amp;gt;&amp;gt;) callAdapter);
    } else {
      //noinspection unchecked Kotlin compiler guarantees ReturnT to be Object.
      return (HttpServiceMethod&amp;lt;ResponseT, ReturnT&amp;gt;)
          new SuspendForBody&amp;lt;&amp;gt;(
              requestFactory,
              callFactory,
              responseConverter,
              (CallAdapter&amp;lt;ResponseT, Call&amp;lt;ResponseT&amp;gt;&amp;gt;) callAdapter,
              continuationBodyNullable);
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 모든 정보들을 가지고 Retrofit.loadServiceMethod로 돌아가 result에 SuspendForResponse를 저장하고, method 정보와 함께 serviceMethodCache에 저장한다.&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 style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;즉, serviceMethodCache에는 메소드 정보, 그리고 실행에 대한 함수에 대한 정보&lt;/b&gt;&lt;/span&gt;(SuspendForResponse, callAdapter, callFactory, requestFactory, responseConverter)를 가지고 있다.&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;b&gt;내부 동작 정리&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Retrofit.create API 지정
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Proxy.newProxyInstance&amp;nbsp;로&amp;nbsp;동적&amp;nbsp;인스턴스&amp;nbsp;생성
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인자의 InvocationHandler 에서 메소드의 기능을 확장
&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;li&gt;default 메소드가 아니면 Retrofit.loadServiceMethod 호출&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Retrofit.loadServiceMethod 호출
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;map을 이용해 메소드들을 캐싱 처리 (첫 호출에만 새 메서드 생성)&lt;/li&gt;
&lt;li&gt;메서드&amp;nbsp;없을시&amp;nbsp;ServiceMethod.parseAnnotations&amp;nbsp;호출
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ServiceMethod.parseAnnotations
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RequestFactory.parseAnnotations
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제로&amp;nbsp;Annotion들을&amp;nbsp;파싱&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;HttpServiceMethod.parseAnnotations
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최종적으로 파싱한 RequestFactory와 메서드로 Response, Return 타입들을 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;코드에서 Dynamic Proxy 클래스를 생성하고 invocationHandler를 정의하는 모습을 볼 수 있었다. &lt;br /&gt;&lt;br /&gt;만약 클래식한 Proxy 패턴이라면 명시적으로 프록시 클래스를 정의해야 한다.&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 패턴을 사용한다면 각각의 API Interface마다 Proxy 클래스를 만들어야 하고, 구현체가 필요하기 때문에 Interface의 함수들을 일일이 정의해준 다음 Proxy 클래스에서 사용해야 한다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&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;API Interface에 정의하는 함수들은 웬만해선 모두 API Call을 위한 API Endpoints 함수들이고 각각의 Interface 구현체들을 구현할 필요 없다.&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;Annotation으로 각 함수들이 할 일을 알려주고 이를 런타임에 Reflection을 통해 얻어와서 비슷한(API 함수들) 함수들을 찍어낸다.&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;일종의 팩토리를 이용해 모든 API 함수에 대응하는 InvocationHandler의 invoke를 정의하면서, &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;Dynamic Proxy&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;이렇게 하여 개발자는 Interface의 구현체를 만들지 않고 지정만 해주어 사용할 수 있다.&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;이러한 솔루션이 들어간게 Retrofit.create() 함수이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Retrofit Interface&lt;br /&gt;https://rlaudals2374.medium.com/retrofit의-구현체는-어디에-있을까-e04b7952c408&lt;br /&gt;https://ongveloper.tistory.com/674?source=post_page-----964f4b5d0a5d--------------------------------&lt;br /&gt;&lt;br /&gt;Proxy&lt;br /&gt;https://live-everyday.tistory.com/216&lt;br /&gt;https://live-everyday.tistory.com/217&lt;/blockquote&gt;</description>
      <category>Android/Debugging</category>
      <category>Android</category>
      <author>bumjae</author>
      <guid isPermaLink="true">https://bumjae.tistory.com/123</guid>
      <comments>https://bumjae.tistory.com/123#entry123comment</comments>
      <pubDate>Fri, 22 Dec 2023 20:38:08 +0900</pubDate>
    </item>
    <item>
      <title>Service</title>
      <link>https://bumjae.tistory.com/121</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Service&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안드로이드 4대 컴포넌트 중 하나이며 사용자에게 인터페이스를 제공하지 않고 백그라운드에서 오래 실행되는 작업을 수행할 수 있는 애플리케이션 구성요소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 애플리케이션 구성 요소가 서비스를 시작할 수 있고, 다른 앱을 전환하더라도 백그라운드에서 계속 실행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 앱 구성요소와 서비스를 바인딩하여 서비스와 상호작용 할 수 있고, 프로세스 간 통신(IPC)도 실행할 수 있다.&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;&lt;b&gt;종류&lt;/b&gt;&lt;/h2&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;b&gt;Background Service&lt;/b&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;API 25 이상부터는 앱이 Foreground에 있지 않을 때 백그라운드 서비스를 강제로 종료시킨다.&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Foreground Service&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Foreground Service는 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;활성화된 액티비티와 동일한 우선순위를 가지므로 시스템에 메모리가 부족하더라도 강제 종료될 확률이 낮다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 사용자가 서비스의 동작을 인지할 수 있도록 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;반드시 알림(Notify)을 제공&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Bound Service&lt;/b&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;IBinder라는 인터페이스로 Client - Server 관계처럼 서비스와 상호작용하며 여러 프로세스에 걸쳐 프로세스 간 통신(IPC)을 수행할 수도 있다.&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;LifeCycle&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;521&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lHYq0/btsCf5Ef4Wo/9HYe7qRxVS0tJC6kMyOJNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lHYq0/btsCf5Ef4Wo/9HYe7qRxVS0tJC6kMyOJNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lHYq0/btsCf5Ef4Wo/9HYe7qRxVS0tJC6kMyOJNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlHYq0%2FbtsCf5Ef4Wo%2F9HYe7qRxVS0tJC6kMyOJNK%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;400&quot; height=&quot;482&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;521&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;onCreate&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스가 처음 생성되었을 경우 onStartCommand 혹은 onBind가 호출되기 전에 호출된다.&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;b&gt;onStartCommand&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;startService()로 실행되었을 경우 onCreate 이후 실행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 함수가 호출되면 백그라운드에서 무한히 실행되므로, 반드시 stopSelf() 혹은 stopService()로 서비스를 종료시켜야 한다. (바인딩만 할 경우 이 함수를 사용하지 않아도 된다.)&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;onStartCommand는 return 값이 존재하는데 아래와 같다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 51px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 30.814%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;START_NOT_STICKY&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 69.186%; height: 17px;&quot;&gt;서비스를 명시적으로 다시 시작할 때 까지 만들지 않는다. &lt;br /&gt;서비스가 불필요하게 여러개 생성되는 것을 막을수 있는 방법이다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 30.814%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;START_STICKY&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 69.186%; height: 17px;&quot;&gt;서비스를 다시 만들지만 마지막 Intent를 onStartCommand의 인자로 다시 전달하지 않는다. &lt;br /&gt;이는 일단 계속 살아있어야되지만 별다른 동작이 필요하지 않은 음악앱같은 서비스에 적절&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 30.814%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;START_REDELIVER_INTENT&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 69.186%; height: 17px;&quot;&gt;서비스를 다시 생성하고 마지막 Intent를 onStartCommand의 인자로 다시 전달한다. &lt;br /&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;onBind&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안드로이드의 구성요소가 서비스에 바인딩하고자 하는 경우에 호출 / bindService()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 함수의 구현체는 IBinder를 return 하여 클라이언트가 서비스와 통신을 주고받기 위해 사용할 인터페이스를 제공해야 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;항상 이 함수를 구현해야 하며 바인딩을 원하지 않을 시 null을 반환&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;&lt;b&gt;차이 확인&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1702980035424&quot; class=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;&amp;lt;application
    ...
    &amp;lt;service android:name=&quot;.MyBackgroundService&quot;/&amp;gt;
    &amp;lt;service android:name=&quot;.MyForegroundService&quot;/&amp;gt;
    &amp;lt;service android:name=&quot;.MyBoundService&quot;/&amp;gt;
&amp;lt;/application&amp;gt;&lt;/code&gt;&lt;/pre&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;b&gt;Background&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1702979313599&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class MyBackgroundService : Service() {

    private var job : Job? = null
    private var count = 0

    override fun onBind(p0: Intent?): IBinder? = null

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {

        job = CoroutineScope(Dispatchers.Default).launch {
            while (isActive){
                Log.e(&quot;Service Test&quot;, &quot;BackgroundService 실행중&quot;)
                Log.e(&quot;Service Test&quot;, &quot;$count&quot;)

                try {
                    delay(2000)
                    count++
                } catch (e: Exception){
                    e.printStackTrace()
                }
            }
        }

        return START_NOT_STICKY
    }

    override fun onDestroy() {
        super.onDestroy()
        job?.cancel()
        Log.e(&quot;Service Test&quot;, &quot;onDestroy : job cancel&quot;)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1702979371704&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val backgroundService = Intent(this@MainActivity, MyBackgroundService::class.java)
startService(backgroundService)

//stop
stopService(backgroundService)&lt;/code&gt;&lt;/pre&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;kakaotv&quot; data-video-url=&quot;https://tv.kakao.com/v/443300376&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/f9uqS/hyUL6SJSXp/TbkfcZBnhC7XM0TjckpdH1/img.jpg?width=736&amp;amp;height=760&amp;amp;face=0_0_736_760,https://scrap.kakaocdn.net/dn/YOo2r/hyUL0EWMGJ/qpGaVH5An7VYc74gX0Snj0/img.jpg?width=736&amp;amp;height=760&amp;amp;face=0_0_736_760&quot; data-video-width=&quot;550&quot; data-video-height=&quot;568&quot; data-video-origin-width=&quot;736&quot; data-video-origin-height=&quot;760&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-play-service=&quot;daum_tistory&quot; data-original-url=&quot;&quot; data-video-title=&quot;&quot;&gt;&lt;iframe src=&quot;https://play-tv.kakao.com/embed/player/cliplink/443300376?service=daum_tistory&quot; width=&quot;550&quot; height=&quot;568&quot; frameborder=&quot;0&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Foreground&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1702983452200&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;uses-permission android:name=&quot;android.permission.FOREGROUND_SERVICE&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1702980020212&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class MyForegroundService : Service() {
    private var job : Job? = null
    private var count = 0

    override fun onBind(p0: Intent?): IBinder? = null

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {

        job = CoroutineScope(Dispatchers.Default).launch {
            while (isActive){
                Log.e(&quot;Service Test&quot;, &quot;ForegroundService 실행중&quot;)
                Log.e(&quot;Service Test&quot;, &quot;$count&quot;)

                try {
                    delay(2000)
                    count++
                } catch (e: Exception){
                    e.printStackTrace()
                }
            }
        }
        initNotification()
        return START_NOT_STICKY
    }

    override fun onDestroy() {
        super.onDestroy()
        job?.cancel()
        Log.e(&quot;Service Test&quot;, &quot;onDestroy : job cancel&quot;)
    }

    private fun initNotification(){
        val channel = NotificationChannel(
            &quot;channel-one&quot;,
            &quot;Channel-One&quot;,
            NotificationManager.IMPORTANCE_LOW)
            .apply {
                setShowBadge(false)
            }

        getSystemService(NotificationManager::class.java).createNotificationChannel(channel)

        val builder = Notification.Builder(this@MyForegroundService, &quot;channel-one&quot;)
            .setContentTitle(&quot;ForegroundService&quot;)
            .setContentText(&quot;서비스 실행중&quot;)
            .setSmallIcon(R.drawable.ic_launcher_foreground)
            .setOngoing(true)

        startForeground(1, builder.build())
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1702980062220&quot; class=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;val foregroundService = Intent(this@MainActivity, MyForegroundService::class.java)
startService(foregroundService)

//stop
stopService(foregroundService)&lt;/code&gt;&lt;/pre&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;kakaotv&quot; data-video-url=&quot;https://tv.kakao.com/v/443300429&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bbQ0HF/hyUL0LJdZH/FGf086kF5PfwQdwwqYhdY0/img.jpg?width=736&amp;amp;height=760&amp;amp;face=0_0_736_760,https://scrap.kakaocdn.net/dn/lD8yj/hyULYAnCY6/wKwZErx4JGm9nzYPKoFV91/img.jpg?width=736&amp;amp;height=760&amp;amp;face=0_0_736_760&quot; data-video-width=&quot;550&quot; data-video-height=&quot;568&quot; data-video-origin-width=&quot;736&quot; data-video-origin-height=&quot;760&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-play-service=&quot;daum_tistory&quot; data-original-url=&quot;&quot; data-video-title=&quot;&quot;&gt;&lt;iframe src=&quot;https://play-tv.kakao.com/embed/player/cliplink/443300429?service=daum_tistory&quot; width=&quot;550&quot; height=&quot;568&quot; frameborder=&quot;0&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Bound&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1702985461302&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class MyBoundService : Service(){

    private val mBinder = MyBinder()

    private var count = 0
    private var job = CoroutineScope(Dispatchers.Default).launch {
        while (isActive){
            Log.e(&quot;Service Test&quot;, &quot;BoundService 실행중&quot;)
            Log.e(&quot;Service Test&quot;, &quot;$count&quot;)

            try {
                delay(2000)
                count++
            } catch (e: Exception){
                e.printStackTrace()
            }
        }
    }

    inner class MyBinder : Binder() {
        fun getService() : MyBoundService {
            return this@MyBoundService
        }
    }

    override fun onBind(p0: Intent?): IBinder = mBinder

    override fun onCreate() {
        job.start()
    }
    
    //연결한 안드로이드 컴포넌트에서 사용할 함수
    fun getCount() = count

    override fun onDestroy() {
        super.onDestroy()
        job.cancel()
        Log.e(&quot;Service Test&quot;, &quot;onDestroy : job cancel&quot;)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1702985734366&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private lateinit var mBoundService : MyBoundService
var isService = false

private val connection = object : ServiceConnection {
    override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
        val binder = service as MyBoundService.MyBinder
        mBoundService = binder.getService()
        isService = true
        Log.e(&quot;BoundService Test&quot;, &quot;Connected&quot;)
    }
    
    override fun onServiceDisconnected(name: ComponentName?) {
        isService = false
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Activity, Fragment 등등 안드로이드 요소와 서비스를 연결할 Connection 지정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bindService() 메서드를 통해 시스템에 전달하면 서비스와 연결할 수 있음&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; onServiceConnected&lt;/b&gt; : 서비스가&amp;nbsp;연결되면&amp;nbsp;호출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;onServiceDisconnected&lt;/b&gt; : 정상적 연결 해제되었을 때는 호출되지 않고, 비정상적으로 서비스가 종료되었을 때만 호출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수 &lt;b&gt;isService&lt;/b&gt; : onServiceDisconnected 구조 때문에 서비스 연결 상태를 확인하는 로직이 필요해 선언&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1702986091476&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bindService(intent, connection, Context.BIND_AUTO_CREATE)
//BIND_AUTO_CREATE : 서비스가 생성되어 있지 않으면 생성 후 바인딩을 하고 생성되어 있으면 바로 바인딩


//Unbind
if (isService){
    unbindService(connection)
    isService = false
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MyBoundService에 만든 함수 사용&lt;/p&gt;
&lt;pre id=&quot;code_1702986471057&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (isService){
    Toast.makeText(this@MainActivity, &quot;BoundService Count: ${mBoundService.getCount()}&quot;, Toast.LENGTH_SHORT).show()
} else {
    Toast.makeText(this@MainActivity, &quot;BoundService가 연결되지 않았습니다.&quot;, Toast.LENGTH_SHORT).show()
}&lt;/code&gt;&lt;/pre&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;kakaotv&quot; data-video-url=&quot;https://tv.kakao.com/v/443300442&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bboeqL/hyULZswnw3/XRki6YP8TZW3mFZHxRODG1/img.jpg?width=736&amp;amp;height=760&amp;amp;face=0_0_736_760,https://scrap.kakaocdn.net/dn/f0dgq/hyUPKUMuKU/L0HwaXAuBjMVcjKMl7kftK/img.jpg?width=736&amp;amp;height=760&amp;amp;face=0_0_736_760&quot; data-video-width=&quot;550&quot; data-video-height=&quot;568&quot; data-video-origin-width=&quot;736&quot; data-video-origin-height=&quot;760&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-play-service=&quot;daum_tistory&quot; data-original-url=&quot;&quot; data-video-title=&quot;&quot;&gt;&lt;iframe src=&quot;https://play-tv.kakao.com/embed/player/cliplink/443300442?service=daum_tistory&quot; width=&quot;550&quot; height=&quot;568&quot; frameborder=&quot;0&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;&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;blockquote data-ke-style=&quot;style3&quot;&gt;Service&lt;br /&gt;https://velog.io/@kingdo/Android-Service란&lt;br /&gt;https://parade621.tistory.com/52&lt;br /&gt;https://seosh817.tistory.com/115&lt;br /&gt;&lt;br /&gt;알림 없이 Foreground 이용 참고&lt;br /&gt;https://stickode.tistory.com/749&lt;br /&gt;&lt;br /&gt;ActivityManager getRunningServices Deprecated&lt;br /&gt;https://copyprogramming.com/howto/java-kotlin-check-if-service-is-running&lt;/blockquote&gt;</description>
      <category>Android/Reference</category>
      <category>Android</category>
      <author>bumjae</author>
      <guid isPermaLink="true">https://bumjae.tistory.com/121</guid>
      <comments>https://bumjae.tistory.com/121#entry121comment</comments>
      <pubDate>Thu, 14 Dec 2023 07:38:54 +0900</pubDate>
    </item>
    <item>
      <title>AlarmManager</title>
      <link>https://bumjae.tistory.com/120</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Backgorund 작업 구분&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Background 작업으로 AlarmManager나 WorkManager, Coroutine을 사용할 수 있는데 공식 문서를 보면 사용 구분에 따라 어떠한 기술을 사용해야 할지 가이드라인을 제공하고 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;540&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXoXf2/btsBUcD1knc/YLGgs3L7Vf2LXt2jmDd4R1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXoXf2/btsBUcD1knc/YLGgs3L7Vf2LXt2jmDd4R1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXoXf2/btsBUcD1knc/YLGgs3L7Vf2LXt2jmDd4R1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXoXf2%2FbtsBUcD1knc%2FYLGgs3L7Vf2LXt2jmDd4R1%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;740&quot; height=&quot;416&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;540&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;즉시 (Immediate)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자와 상호작용 요구&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;앱의 Scope 내부에서만 유요한: Coroutine, RxJava&lt;/li&gt;
&lt;li&gt;앱 외부 Scope에서도 유요한: WorkManager&lt;/li&gt;
&lt;li&gt;미디어나&amp;nbsp;스마트키&amp;nbsp;위젯에&amp;nbsp;유요한:&amp;nbsp;Foreground&amp;nbsp;Service&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;b&gt;정시 (Exact)&lt;/b&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AlarmManager&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;b&gt;지연 (Deferred)&lt;/b&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;WorkManager&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;size18&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;정확한 시간에 동작하며 사용자와 상호작용 않는 작업은 AlarmManager 사용을 고려&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;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;AlarmManager&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 알람 서비스에 대한 접근과 알람을 통해 미래 특정 시점에 앱이 실행되도록 예약할 수 있게 만들어주는 클래스&lt;br /&gt;알람이 울리면 등록된 Intent가 시스템에 의해 BroadCast 되고 앱이 시작된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;단, 등록된 알람은 디바이스를 종료하고 재부팅하면 지워진다고 명시되어 있다.&lt;br /&gt;(재부팅&amp;nbsp;시&amp;nbsp;지워지는&amp;nbsp;부분은&amp;nbsp;Manifest에&amp;nbsp;Boot&amp;nbsp;receiver를&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;이렇게 실행된 앱은 등록된 알람의 Receiver 메소드에서 CPU Wake Lock을 유지하고 지정해 둔 작업이 처리되기 전까지 Device를 켜둔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇듯 알람매니저는 해당 앱이 현재 실행되지 않더라도&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;특정 시간&lt;/b&gt;&lt;/span&gt;에 특정 작업(Notification, Sound 등등)을 실행하기 위해 사용한다.&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;b&gt;특징&lt;/b&gt;&lt;/h3&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: #ef5369;&quot;&gt;&lt;b&gt;시간&lt;/b&gt;&lt;/span&gt; 혹은 &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;간격&lt;/span&gt;&lt;/b&gt;으로 Intent를 실행&lt;/li&gt;
&lt;li&gt;Broadcast Receivcer와 조합해서 서비스를 시작하고 다른 작업을 시작 가능&lt;/li&gt;
&lt;li&gt;앱이&amp;nbsp;실행 중이&amp;nbsp;아니거나&amp;nbsp;기기가&amp;nbsp;대기&amp;nbsp;상태인&amp;nbsp;경우에도&amp;nbsp;이벤트나&amp;nbsp;작업을&amp;nbsp;트리거&lt;/li&gt;
&lt;li&gt;Timer 혹은 지속적으로 실행하는 백그라운드 서비스를 사용하지 않고 작업을 예약&lt;br /&gt;앱의 리소스 요구사항을 최소화하는데 도움&lt;/li&gt;
&lt;li&gt;앱이 실행되고 있는 경우에는 AlarmManager보다는 Timer나 Thread &amp;amp; Handler 클래스 사용하는 것이 시스템 리소스를 더 효과적으로 제어할 수 있음&lt;/li&gt;
&lt;li&gt;반복된 알람에 좋은 선택일 수 있지만 대상이 네트워크 작업이라면 배터리 소모가 커지고 서버에도 부담을 줄 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1702596322778&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager&lt;/code&gt;&lt;/pre&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;알람 유형&lt;/b&gt;&lt;/h3&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: 36.2791%; text-align: left;&quot;&gt;&lt;span&gt;ELAPSED_REALTIME&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 63.7209%; text-align: center;&quot;&gt;시스템 부팅 시간 이후 (SystemClock.elapsedRealtime) 기준&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 36.2791%; text-align: left;&quot;&gt;&lt;span&gt;ELAPSED_REALTIME_WAKEUP&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 63.7209%; text-align: center;&quot;&gt;+ 기기 절전 모드 해제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 36.2791%; text-align: left;&quot;&gt;&lt;span&gt;RTC&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 63.7209%; text-align: center;&quot;&gt;UTC&amp;nbsp;시계&amp;nbsp;시간&amp;nbsp;(System.currentTimeMillis)를&amp;nbsp;기준&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 36.2791%; text-align: left;&quot;&gt;&lt;span&gt;RTC_WAKEUP&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 63.7209%; text-align: center;&quot;&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;단일 알람 함수&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;set&lt;/b&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;span style=&quot;letter-spacing: 0px;&quot;&gt; API 19 이후, 정확하지 않게(inexact)&amp;nbsp; 동작&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;연기되고 시간이 지난 이후에 전달. OS에서 전체 시스템 알람을 &quot;batch&quot;하는 정책을 사용&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;디바이스가 Wake up 하는 것을 최소화하고 배터리 사용량을 최적화&lt;/li&gt;
&lt;li&gt;실제 알람의 순서도 불일치&lt;/li&gt;
&lt;li&gt;정확한 순서가 필요할 시, setWindow, setExact&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;size18&quot;&gt;&lt;b&gt;setExact&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;OS가 전달 시간 최적화하지 않음&lt;/li&gt;
&lt;li&gt;요청된&amp;nbsp;시간에서&amp;nbsp;가능한&amp;nbsp;한&amp;nbsp;가까운&amp;nbsp;시간 내에&amp;nbsp;전달&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;size18&quot;&gt;&lt;b&gt;setAndAllowWhileIdle&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Doze 모드일 때도 실행되는 set &amp;rarr; batch 정책 사용&lt;/li&gt;
&lt;li&gt;실제 Doze 모드일 때 실행 되어야 하는 알람의 경우에만 다뤄야 한다.&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) 일정이 되었다는 알림이 오는 캘린더&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Doze 모드일 때 동작해야 하므로, 과도한 사용을 막았다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&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;size18&quot;&gt;&lt;b&gt;setExactAndAllowWhileIdle&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;setExact&amp;nbsp;+&amp;nbsp;setAndAllowWhileIdle&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Version별 사용&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1702596615207&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;when {
    Build.VERSION.SDK_INT &amp;gt;= Build.VERSION_CODES.M -&amp;gt; 
        alarmManager.setExactAndAllowWhileIdle(
            AlarmManager.RTC_WAKEUP, AlarmManager.INTERVAL_FIFTEEN_MINUTES, pendingIntent
        )
    Build.VERSION.SDK_INT &amp;gt;= Build.VERSION_CODES.KITKAT -&amp;gt; 
        alarmManager.setExact(
            AlarmManager.RTC_WAKEUP, AlarmManager.INTERVAL_HOUR, pendingIntent
        )
    else -&amp;gt;
        alarmManager.set(
            AlarmManager.RTC_WAKEUP, AlarmManager.INTERVAL_DAY, pendingIntent
        )
}&lt;/code&gt;&lt;/pre&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;Doze 모드에서도 동작&lt;/b&gt;하려면 setAndAllowWhileIdle, setExactAndAllowWhileIdle를 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정확한 알람을 구현하려 할 때 Doze 모드에서도 발생할 수 있는 setExactAndAllowWhileIdle을 사용하는데 이상한 점이 있다. 문서에서도 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;정확한 알람과&amp;nbsp;&lt;span style=&quot;color: #ef5369;&quot;&gt;D&lt;/span&gt;oze 모드에서도 발생하게 하려면 이 메서드를 사용하라 나왔는데 확인을 해보면 몇 분씩 늦어 정확한 시간에 수행하지 않을 때&lt;/b&gt;&lt;/span&gt;가 있다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;setExactAndAllowWhileIdle&lt;/b&gt;은 오해의 소지가 있다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Android 문서에 따르면 이 메서드는 &quot;정확히 명시된 시간에 전달되도록&quot;이라 하고 나중에는 &quot;요청된 트리거 시간에 최대한 가깝게&quot;라고 설명하고 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;제한됨&lt;/b&gt;: 잠자기/대기 문서에 따르면 이 유형의 알람은 동일한 앱에서 9분당 두 번 이상 실행할 수 없다.&lt;br /&gt;&lt;b&gt;순서 미보장&lt;/b&gt;: OS는 동일한 앱에서도 다른 알람의 순서에 맞지 않게 이러한 종류의 알람이 트리거 되도록 일정을 변경할 수 있다.&lt;br /&gt;&lt;b&gt;유연성&lt;/b&gt;: Android는 이 방법을 사용하여 일반 알람보다 알람을 예약할 때 OS가 더 유연하도록 선택했다고 생각한다. 또한 &quot;장치가 유휴 상태일 때 배터리 수명을 최적화하기 위해 일정을 더 자유롭게 지정할 수 있다.&quot;라고 명시되어 있다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;OS 멋대로 실행해 주는 것이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알람&amp;nbsp;앱처럼&amp;nbsp;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;완벽하게&amp;nbsp;엄격한&amp;nbsp;알람이&amp;nbsp;필요한&amp;nbsp;경우는&amp;nbsp;setAlarmClock&lt;/b&gt;&lt;/span&gt;을&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;setAlarmClock&lt;/b&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;AlarmClockInfo로 표현되는 시간에 알람을 예약&lt;/li&gt;
&lt;li&gt;알람이 실행될 때, 디바이스를 깨우고, 사용자에게 알림을 주는 용도로 사용&lt;br /&gt;화면 키기, 소리를 재생, 진동 등등&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1702595095936&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val calendar = Calendar.getInstance().apply {
    timeInMillis = System.currentTimeMillis()
    add(Calendar.HOUR_OF_DAY, hour)
    add(Calendar.MINUTE, minute)
    add(Calendar.SECOND, second)
}
val alarmClock = AlarmManager.AlarmClockInfo(calendar.timeInMillis, pendingIntent)
alarmManager.setAlarmClock(alarmClock, pendingIntent)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AlarmClockInfo에 들어가는 PendingIntent는 setAlarmClock을 이용해 알람을 지정하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Notification으로 설정된 알람을 보여줄 때 알림 창에서 Notification을 탭 하면 실행되는 PendingIntent라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/34699662/how-does-alarmmanager-alarmclockinfos-pendingintent-work&quot;&gt;https://stackoverflow.com/questions/34699662/how-does-alarmmanager-alarmclockinfos-pendingintent-work&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_AlarmClockInfo.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;835&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnDcpV/btsBVAL1cOq/D1g231OAQxOglVowvefEoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnDcpV/btsBVAL1cOq/D1g231OAQxOglVowvefEoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnDcpV/btsBVAL1cOq/D1g231OAQxOglVowvefEoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnDcpV%2FbtsBVAL1cOq%2FD1g231OAQxOglVowvefEoK%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;300&quot; height=&quot;232&quot; data-filename=&quot;edited_AlarmClockInfo.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;835&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;반복 알람 함수&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; setIneactRepeating&lt;/b&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;/li&gt;
&lt;li&gt;시스템에서 batch&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;size18&quot;&gt;&lt;b&gt;setRepeating&lt;/b&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;/li&gt;
&lt;li&gt;알람 지연 시 가능한 한 빨리 스킵된 알람이 전달됨
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전달이 늦어져도 스케쥴은 정상 작동&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;한 시간마다 repeating, 7:45부터 8:45까지 폰이 자고 있다면 (8시 발생 알람 스킵)&lt;br /&gt;8시 45분에 폰을 킬 때, 8시 발생 알람이 울리고 다음 알람은 9시에 잡힌다. (9시 45분이 아님)&lt;br /&gt;&amp;rArr; 실제 발생 시간 기준 몇 시간 후 반복되는 알람을 하고 싶다면 일회성 알람을 사용해 자체 스케줄 할 것&lt;/li&gt;
&lt;li&gt;API 19 이후, 정확하지 않게 동작. 연기되고 시간이 지난 이후에 전달됨&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;알람 취소&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;cancel&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Intent.filterEquals에 해당하는 알람이 취소&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Pending&amp;nbsp;Intent&amp;nbsp;생성&amp;nbsp;시&amp;nbsp;등록한&amp;nbsp;RequestCode가&amp;nbsp;같아야&amp;nbsp;한다&lt;/li&gt;
&lt;li&gt;Extras를 제외 Action,&amp;nbsp;Categories,&amp;nbsp;Data,&amp;nbsp;Mimetype,&amp;nbsp;Package,&amp;nbsp;Component가&amp;nbsp;같아야&amp;nbsp;한다&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;&lt;b&gt;Doze 모드&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Android&amp;nbsp;6.0(API&amp;nbsp;레벨&amp;nbsp;23)부터&amp;nbsp;추가된&amp;nbsp;기능으로&amp;nbsp;&lt;b&gt;기기를&amp;nbsp;오랫동안&amp;nbsp;사용하지&amp;nbsp;않는&amp;nbsp;경우&amp;nbsp;앱의&amp;nbsp;백그라운드&amp;nbsp;CPU&amp;nbsp;및&amp;nbsp;네트워크&amp;nbsp;활동을&amp;nbsp;지연시켜&amp;nbsp;배터리&amp;nbsp;소모를&amp;nbsp;줄여주는&amp;nbsp;모드&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 전원을 충전하지 않고 화면이 꺼진 채로 기기를 일정 기간 정지 상태로 두면 기기는 Doze 모드를 시작&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기기를 움직이거나 화면 켜기, 충전기 연결 등을 하여 기기 절전 모드를 해제 시 시스템은 Doze 모드를 종료하고 모든 앱은 정상적인 활동으로 돌아간다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;알람 제약 사항&lt;/b&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1702511719179&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;잠자기 및 앱 대기 모드에 맞게 최적화 &amp;nbsp;|&amp;nbsp; App quality &amp;nbsp;|&amp;nbsp; Android Developers&quot; data-og-description=&quot;앱에서 Android 6.0의 절전 기능을 테스트하고 최적화합니다.&quot; data-og-host=&quot;developer.android.com&quot; data-og-source-url=&quot;https://developer.android.com/training/monitoring-device-state/doze-standby?hl=ko#restrictions&quot; data-og-url=&quot;https://developer.android.com/training/monitoring-device-state/doze-standby?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/neW8D/hyULSZXldB/lI3bRhW76p058iFgUSsu31/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676,https://scrap.kakaocdn.net/dn/jGFfT/hyUL3UJvpE/aKT78jnk2acfpPkcfdg7Qk/img.png?width=1839&amp;amp;height=740&amp;amp;face=0_0_1839_740&quot;&gt;&lt;a href=&quot;https://developer.android.com/training/monitoring-device-state/doze-standby?hl=ko#restrictions&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.android.com/training/monitoring-device-state/doze-standby?hl=ko#restrictions&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/neW8D/hyULSZXldB/lI3bRhW76p058iFgUSsu31/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676,https://scrap.kakaocdn.net/dn/jGFfT/hyUL3UJvpE/aKT78jnk2acfpPkcfdg7Qk/img.png?width=1839&amp;amp;height=740&amp;amp;face=0_0_1839_740');&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;잠자기 및 앱 대기 모드에 맞게 최적화 &amp;nbsp;|&amp;nbsp; App quality &amp;nbsp;|&amp;nbsp; Android Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;앱에서 Android 6.0의 절전 기능을 테스트하고 최적화합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.android.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;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;전체코드&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/wo9374/StudyProject/tree/main/AlarmManager&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/wo9374/StudyProject/tree/main/AlarmManager&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot_20231215_083540.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dby3S/btsBYaFZOJV/3cLxynBbqk6LGuMWV5e4R0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dby3S/btsBYaFZOJV/3cLxynBbqk6LGuMWV5e4R0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dby3S/btsBYaFZOJV/3cLxynBbqk6LGuMWV5e4R0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDby3S%2FbtsBYaFZOJV%2F3cLxynBbqk6LGuMWV5e4R0%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;300&quot; height=&quot;617&quot; data-filename=&quot;Screenshot_20231215_083540.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2220&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;style3&quot;&gt;AlarmManager&lt;br /&gt;https://yellowc-137.tistory.com/23&lt;br /&gt;https://greedy0110.tistory.com/69&lt;br /&gt;https://velog.io/@thevlakk/Android-AlarmManager-파헤치기-1&lt;br /&gt;https://velog.io/@thevlakk/Android-AlarmManager-등록-여부-확인-및-주의점-2-Feat.삽질&lt;br /&gt;https://velog.io/@thevlakk/Android-그간-있었던-AlarmManager-이슈들3&lt;br /&gt;&lt;br /&gt;AlarmClockInfo PendingIntent&lt;br /&gt;https://stackoverflow.com/questions/34699662/how-does-alarmmanager-alarmclockinfos-pendingintent-work&lt;br /&gt;&lt;br /&gt;Doze 모드&lt;br /&gt;https://kimch3617.tistory.com/entry/Doze-모드란-Doze-모드-최적화&lt;br /&gt;&lt;br /&gt;PendingIntent Flag&lt;br /&gt;https://developer88.tistory.com/187&lt;/blockquote&gt;</description>
      <category>Android/Reference</category>
      <category>Android</category>
      <author>bumjae</author>
      <guid isPermaLink="true">https://bumjae.tistory.com/120</guid>
      <comments>https://bumjae.tistory.com/120#entry120comment</comments>
      <pubDate>Tue, 12 Dec 2023 23:33:26 +0900</pubDate>
    </item>
    <item>
      <title>Notification</title>
      <link>https://bumjae.tistory.com/116</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;사용자에게 미리 알림을 주고 다른 사람과의 소통을 가능하게 하며 &lt;br /&gt;앱에서 보내는 기타 정보를 적시에 제공하기 위해 Android가 앱의 UI 외부에 표시하는 메시지&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-filename=&quot;notification-area_2x.png&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k25MC/btsBQqV7wFp/Ym6IJMId16X9bIZDv4URGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k25MC/btsBQqV7wFp/Ym6IJMId16X9bIZDv4URGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k25MC/btsBQqV7wFp/Ym6IJMId16X9bIZDv4URGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk25MC%2FbtsBQqV7wFp%2FYm6IJMId16X9bIZDv4URGk%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;400&quot; height=&quot;150&quot; data-filename=&quot;notification-area_2x.png&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;263&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;&lt;b&gt;Notification의 구성&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체적으로는 Notification 객체에 각종 정보를 담고 이 객체를 NotificationManager로 시스템에 등록하는 구조&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;SDK 33 이상부터는 Notification에 대한 권한 지정과 요청이 필요하다. (33 이상에서만 해당 권한 추가 가능)&lt;/p&gt;
&lt;pre id=&quot;code_1702399904728&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;manifest ...&amp;gt;
    &amp;lt;uses-permission android:name=&quot;android.permission.POST_NOTIFICATIONS&quot;/&amp;gt;
    
    ...
&amp;lt;/manifest&amp;gt;&lt;/code&gt;&lt;/pre&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;b&gt;Manager&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; NotificationManager : 알림을 시스템에 발생시키는 SystemService&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;getSystemService() 함수를 이용하여 NotificationManager를 얻어서 사용하거나 NotificationManagerCompat을&amp;nbsp;이용해&amp;nbsp;바로&amp;nbsp;이용해도&amp;nbsp;좋다&lt;/p&gt;
&lt;pre id=&quot;code_1702394305873&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// NotificationManager 객체 생성
val manager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager

// NotificationManagerCompat을 이용해 바로 이용해도 좋다
NotificationManagerCompat.from(context)&lt;/code&gt;&lt;/pre&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;b&gt;Builder&lt;/b&gt;&lt;/h3&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;NotificationCompat.Builder를 생성한 후 Builder에&amp;nbsp;각종&amp;nbsp;setter&amp;nbsp;함수를&amp;nbsp;사용하여&amp;nbsp;알림의&amp;nbsp;구성&amp;nbsp;정보를&amp;nbsp;명시한&amp;nbsp;후&amp;nbsp;Notification을&amp;nbsp;만들고&amp;nbsp;NotificationManager로&amp;nbsp;알림을&amp;nbsp;발생&lt;/p&gt;
&lt;pre id=&quot;code_1702392830962&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(Build.VERSION.SDK_INT &amp;gt;= Build.VERSION_CODES.O) {
    // Notification Channel 아이디, 이름, 설명, 중요도 설정
    val channelId = &quot;channel_one&quot;

    // 채널 생성 코드...

    // API 26 이상에서는 Builder 생성자에 NotificationChannel의 아이디값을 설정
    notificationBuilder = NotificationCompat.Builder(this, channelId)
} else {
    // 26 미만은 생성자에 context만 설정
    notificationBuilder = NotificationCompat.Builder(this)
}

notificationBuilder.apply {
    setSmallIcon(android.R.drawable.ic_notification_overlay)  // 작은 아이콘 설정
    setWhen(System.currentTimeMillis()) // 시간 설정
    setContentTitle(&quot;Content Title&quot;)    // 알림 메시지 설정
    setContentText(&quot;Content Message&quot;)   // 알림 내용 설정
    setDefaults(Notification.DEFAULT_VIBRATE)  // 알림과 동시에 진동 설정(권한 필요)
    setAutoCancel(true)  // 클릭 시 알림이 삭제되도록 설정
    setOngoing(true)     // 알림 제거 막기 (전체 지우기 등)
    
    // 알림 중요도 26버전 미만을 고려할 때 지정
    //setPriority(NotificationCompat.PRIORITY_DEFAULT) 
}&lt;/code&gt;&lt;/pre&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;b&gt;Channel&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NotificationChannel : SDK 26 (Android 8)부터 추가된 알림의 관리 단위&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱의&amp;nbsp;환경설정에서&amp;nbsp;Notification의&amp;nbsp;ON/OFF를&amp;nbsp;설정할&amp;nbsp;수&amp;nbsp;있는데,&amp;nbsp;이때&amp;nbsp;사용되는&amp;nbsp;개념이&amp;nbsp;바로&amp;nbsp;'채널'이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;channel.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/co8G6F/btsBR9l4BeV/a3T7oKDEBn8inISkI4KXMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/co8G6F/btsBR9l4BeV/a3T7oKDEBn8inISkI4KXMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/co8G6F/btsBR9l4BeV/a3T7oKDEBn8inISkI4KXMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fco8G6F%2FbtsBR9l4BeV%2Fa3T7oKDEBn8inISkI4KXMK%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;300&quot; height=&quot;617&quot; data-filename=&quot;channel.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2220&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;NotificationChannel(id: String!, name: CharSequence!, importance: Int)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성자로 Channel의 id, name, &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;importance&lt;/b&gt;&lt;/span&gt;를 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Channel에 대해 설명, 소리, 진동, 불빛 등의 옵션을 설정&lt;br /&gt;Manager의 &lt;b&gt;createNotificationChannel&lt;/b&gt; 함수를 사용하여 시스템에 NotificationChannel을 설정&lt;/p&gt;
&lt;pre id=&quot;code_1702394150185&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(Build.VERSION.SDK_INT &amp;gt;= Build.VERSION_CODES.O) {
    // Notification Channel 아이디, 이름, 설명, 중요도 설정
    val channelId = &quot;channel_one&quot;
    val channelName = &quot;첫 번째 채널&quot;
    val channelDescription = &quot;첫 번째 채널 설명&quot;
    val importance = NotificationManager.IMPORTANCE_DEFAULT

    // NotificationChannel 객체 생성
    val channel = NotificationChannel(channelId, channelName, importance).apply{
        // 설명 설정
        description = channelDescription
        
        // 채널에 대한 각종 설정(불빛, 진동, 소리 등)
        enableLights(true)
        lightColor = Color.RED
        enableVibration(true)
        vibrationPattern = longArrayOf(100L, 200L, 300L)
        
        val uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
        val audio = AudioAttributes.Builder()
                        .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                        .setUsage(AudioAttributes.USAGE_ALARM)
                        .build()
        setSound(uri, audio)
    }
    
    // 시스템에 channel 등록
    manager.createNotificationChannel(channel)
    
    or
    
    NotificationManagerCompat.from(this).createNotificationChannel(channel)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Importance (중요도)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Notification의 중요도에 따라 알림의 형태가 달라진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SDK 26 (Android 8.0) 이상은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;Notification Channel에 중요도&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;importance를 설정&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;하고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SDK 25 (Android 7.1) 이하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;Notification (Builder)에 중요도&lt;/span&gt;&lt;/b&gt;&amp;nbsp;priority 설정&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;버전 지원에 따라 importance 값과 priority 값 모두 가지게 될수 있는데 결과는 importance를 따라간다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 134px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 37px;&quot;&gt;
&lt;td style=&quot;width: 28.5659%; height: 37px; text-align: center;&quot;&gt;&lt;b&gt;중요도&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 38.1007%; height: 37px; text-align: center;&quot;&gt;&lt;b&gt;SDK 26 이상&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Channel Importance&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 37px; text-align: center;&quot;&gt;&lt;b&gt;SDK 25 이하&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Notification Priority&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 28.5659%; height: 40px;&quot;&gt;긴급&lt;br /&gt;알림음이 울리며 헤드업으로 표시&lt;/td&gt;
&lt;td style=&quot;width: 38.1007%; height: 40px; text-align: center;&quot;&gt;IMPORTANCE_HIGH&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 40px; text-align: center;&quot;&gt;PRIORITY_HIGH&lt;br /&gt;PRIORITY_MAX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 28.5659%; height: 20px;&quot;&gt;높은&lt;br /&gt;알림음이 울림&lt;/td&gt;
&lt;td style=&quot;width: 38.1007%; height: 20px; text-align: center;&quot;&gt;IMPORTANCE_DEFAULT&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px; text-align: center;&quot;&gt;PRIORITY_DEFAULT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 28.5659%; height: 20px;&quot;&gt;중간&lt;br /&gt;알림음이 울리지 않음&lt;/td&gt;
&lt;td style=&quot;width: 38.1007%; height: 20px; text-align: center;&quot;&gt;IMPORTANCE_LOW&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px; text-align: center;&quot;&gt;PRIORITY_LOW&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 28.5659%; height: 17px;&quot;&gt;낮음&lt;br /&gt;알림음이 없고 상태표시줄에 표시되지 않음&lt;/td&gt;
&lt;td style=&quot;width: 38.1007%; height: 17px; text-align: center;&quot;&gt;IMPORTANCE_MIN&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;PRIORITY_MIN&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;사용 및 취소&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Notificiation&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NotificationBuilder를 통해 알림 내용을 구성했다면 NotificationManager를 통해 알림을 상태바에 등록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;build() 함수를 사용하여 Notification 객체를 생성한 후 NotificationManager의 notify 함수를 통해 알림을 등록한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때, &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;식별자 값(Int)&lt;/b&gt;&lt;/span&gt;을 두는데 &lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;이 값은 알림을 업데이트하거나 지울 때 사용&lt;/span&gt;&lt;/b&gt;한다.&lt;/p&gt;
&lt;pre id=&quot;code_1702394925922&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Notification 객체 생성
val notification = notificationBuilder.build()
// Notification 식별자 값, Notification 객체
manager.notify(0, notification)

or

NotificationManagerCompat.from(this).notify(0, notificationBuilder.build())&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_default.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;983&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chxgYZ/btsBHQhjJHv/iKaX4bcCZkLPTnbykBhZu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chxgYZ/btsBHQhjJHv/iKaX4bcCZkLPTnbykBhZu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chxgYZ/btsBHQhjJHv/iKaX4bcCZkLPTnbykBhZu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchxgYZ%2FbtsBHQhjJHv%2FiKaX4bcCZkLPTnbykBhZu0%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;300&quot; height=&quot;273&quot; data-filename=&quot;edited_default.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;983&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 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Progress&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진행상황을 표시하기 위해서 Progress도 이용할 수 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;NotificationBuilder.setProgress(int max, int progress, boolean indeterminate)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무 생각없이 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;높은 중요도 채널 ID로 Progress를 했더니 테스트 기기의 사운드 진동 알림이 폭주&lt;/b&gt;&lt;/span&gt;를 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 의도에 따라 다르겠지만 Progress가 완료되었을 때만 소리진동 알림을 해주기 위해 만들어둔 다른 알림 중요도의 채널을 setChannelId()로 Switching을 해주었다.&lt;/p&gt;
&lt;pre id=&quot;code_1702404724472&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val notifyId = 0
val notificationBuilder = NotificationCompat
            .Builder(this, CHANNEL_ID_SILENT)	//낮은 importance로 설정해둔 소리 안나는 채널 ID
            .setSmallIcon(R.drawable.ic_launcher_foreground)
            .setWhen(System.currentTimeMillis())
            .setContentTitle(&quot;Progress&quot;)
            .setContentText(&quot;Progress Notification&quot;)
            .setProgress(100, 0, false)
            
lifecycleScope.launch {
    for (i in 1..100) {
        notificationBuilder.setProgress(100, i, false)
        
        NotificationManagerCompat.from(this).notify(notifyId, notificationBuilder.build())
            
        delay(100)
    }

    //Progress 완료시 사운드 진동 알림 (채널 switching)
    notificationBuilder.setChannelId(CHANNEL_ID_SOUND_VIBE) //높은 inportance로 설정해둔 소리진동 채널 ID
    NotificationManagerCompat.from(this).notify(notifyId, notificationBuilder.build())
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;progress (1).gif&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccJLFL/btsBUJApyHj/hoEtSU92pAlg15BMT2HEIk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccJLFL/btsBUJApyHj/hoEtSU92pAlg15BMT2HEIk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccJLFL/btsBUJApyHj/hoEtSU92pAlg15BMT2HEIk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/ccJLFL/btsBUJApyHj/hoEtSU92pAlg15BMT2HEIk/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;300&quot; height=&quot;324&quot; data-filename=&quot;progress (1).gif&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;380&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 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Cancel&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;식별자 값&lt;/b&gt;&lt;/span&gt;을 이용해 알림을 지운다.&lt;/p&gt;
&lt;pre id=&quot;code_1702398585908&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//사용한 Notification 식별자 값
val progressNotify = 0
val pictureNotify = 1

NotificationManagerCompat.from(this).cancel(progressNotify)
NotificationManagerCompat.from(this).cancelAll() //모두 삭제&lt;/code&gt;&lt;/pre&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;&lt;b&gt;사용자 Interaction&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;알림 Touch&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한&amp;nbsp;방식을&amp;nbsp;사용하기&amp;nbsp;위해서&amp;nbsp;&lt;b&gt;PendingIntent&amp;nbsp;객체가&amp;nbsp;사용&lt;/b&gt;되고&amp;nbsp;이를&amp;nbsp;&lt;b&gt;setContentIntent()의 인자로 대입&lt;/b&gt;한다.&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;PendingIntent는 알림에서만 사용되지 않으며 인텐트 발생을 누군가에게 의뢰해야 하는 여러 곳에서 사용&lt;/blockquote&gt;
&lt;pre id=&quot;code_1702400648407&quot; class=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;//알림 클릭시 띄울 Intent
val intent = Intent(
    this@MainActivity, MainActivity::class.java
).apply { flags = Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK }

//PendingIntent 생성 getActivity, getBroadcast, getService 등등
val pendingIntent = PendingIntent.getActivity(
    this@MainActivity, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT
)

notificationBuilder.apply {
    setSmallIcon(android.R.drawable.ic_notification_overlay)
    setWhen(System.currentTimeMillis())
    ...
    
    setContentIntent(pendingIntent)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Action&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Notification에&amp;nbsp;최대&amp;nbsp;3개까지의&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;ActionBuild를 만들고 NotificationBuilder의 addAction() 함수로 추가 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Action도 마찬가지로 pendingIntent를 사용&lt;/p&gt;
&lt;pre id=&quot;code_1702401463439&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val actionBuild= NotificationCompat
    .Action
    .Builder(R.drawable.ic_launcher_foreground, &quot;확인&quot;, pendingIntent)
    .build()

notificationBuilder.apply {
    ...
    
    addAction(actionBuild)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_action.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1090&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bX6qO5/btsBVFdrMA1/smeOqXG99BmAs0vVlGCEy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bX6qO5/btsBVFdrMA1/smeOqXG99BmAs0vVlGCEy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bX6qO5/btsBVFdrMA1/smeOqXG99BmAs0vVlGCEy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbX6qO5%2FbtsBVFdrMA1%2FsmeOqXG99BmAs0vVlGCEy0%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;300&quot; height=&quot;303&quot; data-filename=&quot;edited_action.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1090&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 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;RemoteInput&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SDK 24 (Android 7.0)부터는 사용자가 Activity를 열지 않고 Notification에서 바로 텍스트 입력창을 열어 답장이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;큰 별개의 기능은 아니고 Action에 RemoteInput.Builder를 추가하면 된다.&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;1.RemoteInput.Builder를&amp;nbsp;통해&amp;nbsp;노티피케이션에&amp;nbsp;텍스트&amp;nbsp;입력창을&amp;nbsp;추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 답장 작업 PendingIntent 생성 (임시 MainActivity 띄우는 pending 사용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. RemoteInput과 PendingIntent를 연결하는 Action을 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 만든 Action을 NotificationBuilder에 addAction을 통해 전달&lt;/p&gt;
&lt;pre id=&quot;code_1702413892473&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val keyTextReply = &quot;key_text_reply&quot;
val remoteInput = RemoteInput.Builder(keyTextReply)
    .setLabel(&quot;답장을 입력하세요.&quot;)
    .build()

val remoteInputAction= NotificationCompat
    .Action
    .Builder(R.drawable.ic_launcher_foreground, &quot;답장&quot;, remotePendingIntent) //답장 전송시 수행할 PendingIntent
    .addRemoteInput(remoteInput)
    .build()
    
notificationBuilder.apply {
    ...
    
    addAction(remoteInputAction)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_remoteinput.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1189&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nReHl/btsBRQUCGCT/mGoKydkE4cBuYJs258czt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nReHl/btsBRQUCGCT/mGoKydkE4cBuYJs258czt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nReHl/btsBRQUCGCT/mGoKydkE4cBuYJs258czt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnReHl%2FbtsBRQUCGCT%2FmGoKydkE4cBuYJs258czt0%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;300&quot; height=&quot;330&quot; data-filename=&quot;edited_remoteinput.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1189&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;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Notification Style&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NotificationBuilder의 setStyle()을 통해 여러 가지 모양의 Notification을 만들 수 있고 적용되는 스타일은 크게 확장형과 커스텀으로 나눌 수 있다.&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;b&gt;BigPicture&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Notification의 확장된 영역에 Image를 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식&amp;nbsp;문서는&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;사진&amp;nbsp;1mb&amp;nbsp;이하&amp;nbsp;사용&amp;nbsp;권장&lt;/span&gt;&lt;/b&gt;&amp;nbsp;(고용량&amp;nbsp;실험&amp;nbsp;결과&amp;nbsp;:&amp;nbsp;MainThread&amp;nbsp;부하,&amp;nbsp;성능&amp;nbsp;저하,&amp;nbsp;에뮬은&amp;nbsp;SystemUI&amp;nbsp;isn't&amp;nbsp;responding)&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;BigPictureStyle().bigPicture(image)&lt;/blockquote&gt;
&lt;pre id=&quot;code_1702402554325&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val picture = BitmapFactory.decodeResource(this.resources, R.drawable.ex_pic)
val style = NotificationCompat.BigPictureStyle().bigPicture(picture)

notificationBuilder.apply {
    ...
    setStyle(style)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_bigpicture.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jf8x7/btsBMVCbJrD/M3W4aCW4gdtMMja4wtLBZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jf8x7/btsBMVCbJrD/M3W4aCW4gdtMMja4wtLBZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jf8x7/btsBMVCbJrD/M3W4aCW4gdtMMja4wtLBZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJf8x7%2FbtsBMVCbJrD%2FM3W4aCW4gdtMMja4wtLBZ0%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;300&quot; height=&quot;457&quot; data-filename=&quot;edited_bigpicture.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1644&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 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;BigText&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Notification의 확장된 영역에 Text를 추가&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;BigTextStyle().bigText(text)&lt;/blockquote&gt;
&lt;pre id=&quot;code_1702403358988&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val style = NotificationCompat.BigTextStyle().bigText(getString(R.string.lorem_ipsum))

notificationBuilder.apply {
    ...
    setStyle(style)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_bigtext.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjXspm/btsBMRzJjZZ/thpMQNSknn3jYGkSaQfYFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjXspm/btsBMRzJjZZ/thpMQNSknn3jYGkSaQfYFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjXspm/btsBMRzJjZZ/thpMQNSknn3jYGkSaQfYFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjXspm%2FbtsBMRzJjZZ%2FthpMQNSknn3jYGkSaQfYFK%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;300&quot; height=&quot;363&quot; data-filename=&quot;edited_bigtext.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1306&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 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;InBox&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BigTextStyle()과&amp;nbsp;다르게&amp;nbsp;짧은&amp;nbsp;텍스트&amp;nbsp;여러&amp;nbsp;줄이&amp;nbsp;확장된 영역에 최대 6개 표시&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;InBoxStyle().addLine(text)&lt;/blockquote&gt;
&lt;pre id=&quot;code_1702403570934&quot; class=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;val style = NotificationCompat.InboxStyle()
                .addLine(&quot;inBox A&quot;)
                .addLine(&quot;inBox B&quot;)
                .addLine(&quot;inBox C&quot;)
                .addLine(&quot;inBox D&quot;)
                .addLine(&quot;inBox E&quot;)
                .addLine(&quot;inBox F&quot;)

notificationBuilder.apply {
    ...
    setStyle(style)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_inbox.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwXweJ/btsBRP9dzej/tyce5seKKsbXAUScM3TVl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwXweJ/btsBRP9dzej/tyce5seKKsbXAUScM3TVl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwXweJ/btsBRP9dzej/tyce5seKKsbXAUScM3TVl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwXweJ%2FbtsBRP9dzej%2Ftyce5seKKsbXAUScM3TVl0%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;300&quot; height=&quot;366&quot; data-filename=&quot;edited_inbox.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1317&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 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Messaging&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 사람 사이의 순차 메시지를 표시&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;MessagingStyle.addMessage(message)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메시지는 NotificationCompat.MessagingStyle.Message를 통해 텍스트, 시간, 보낸 사람을 표시하는 메시지 객체를 만들 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선택적으로 setConversationTitle()을 사용해 대화 위에 표시되는 제목을 추가 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 스타일은 SDK 24 (Android 7.0) 이상을 지원하는 기기에만 적용, 그 이하 버전에서는 NotificationCompat(호환성 라이브러리)를 통해 일반 확장형 Notification이 보인다.&lt;/p&gt;
&lt;pre id=&quot;code_1702404153587&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import androidx.core.app.Person

val person1 = Person.Builder().setName(&quot;Lee&quot;).build()
val person2 = Person.Builder().setName(&quot;Kim&quot;).build()

val msg1 = NotificationCompat
    .MessagingStyle
    .Message(&quot;Hi Kim&quot;, System.currentTimeMillis(), person1)

val msg2 = NotificationCompat
    .MessagingStyle
    .Message(&quot;Oh Hi&quot;, System.currentTimeMillis(), person2)

val style = NotificationCompat
    .MessagingStyle(person1)
    .setConversationTitle(&quot;Greeting&quot;)
    .addMessage(msg1)
    .addMessage(msg2)

notificationBuilder.apply {
    ...
    setStyle(style)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_message.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1113&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqPNxr/btsBQmlU3U3/y1Ky4MNMfOjOysFRNvslik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqPNxr/btsBQmlU3U3/y1Ky4MNMfOjOysFRNvslik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqPNxr/btsBQmlU3U3/y1Ky4MNMfOjOysFRNvslik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqPNxr%2FbtsBQmlU3U3%2Fy1Ky4MNMfOjOysFRNvslik%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;300&quot; height=&quot;309&quot; data-filename=&quot;edited_message.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1113&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 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;CustomView&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CustomView를 설정해 사용할 수 있지만 협소한 공간에 알림을 띄우는 것이기 때문에 복잡한 레이아웃 같은 Notification은 사용하기 힘들 수 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;NotificationCompat.DecoratedCustomViewStyle&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RemoteViews는 다른 프로세스에 표시할 수 있는 뷰를 나타낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Layout Resource 파일을 통해서 뷰의 계층 구조가 만들어진다.&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;하지만 RemoteView에 사용되는 View들은 한정적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.android.com/reference/android/widget/RemoteViews&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.android.com/reference/android/widget/RemoteViews&lt;/a&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1702410890053&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;notificationBuilder.apply {
    ...
    .setStyle(NotificationCompat.DecoratedCustomViewStyle())
    .setCustomContentView(
        RemoteViews(packageName, R.layout.custom_notiview).apply {
            setTextViewText(R.id.txt_1, &quot;커스텀 뷰&quot;)
            setTextViewText(R.id.txt_2, &quot;테스트&quot;)
        }
    )
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_custom.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1027&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chmwli/btsBT969o1q/nFVn0BQlGa654TGNHeAyP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chmwli/btsBT969o1q/nFVn0BQlGa654TGNHeAyP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chmwli/btsBT969o1q/nFVn0BQlGa654TGNHeAyP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fchmwli%2FbtsBT969o1q%2FnFVn0BQlGa654TGNHeAyP1%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;300&quot; height=&quot;285&quot; data-filename=&quot;edited_custom.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1027&quot;/&gt;&lt;/span&gt;&lt;/figure&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: 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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;알림 중요도 관련사항&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;설정한&amp;nbsp;importance&amp;nbsp;/&amp;nbsp;priority&amp;nbsp;값이&amp;nbsp;항상&amp;nbsp;알림의&amp;nbsp;동작을&amp;nbsp;결정한다고&amp;nbsp;보장할&amp;nbsp;수&amp;nbsp;없다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;importance / priority 값이 알림의 동작을 결정하는 것은 맞으나 다양한 상황에서 해당 값이 바뀔 수 있으므로 항상 설정해 준 값대로 알림이 동작할 것이라고 판단하지 말라고 한다.&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;실제로 importance 값을 High로 세팅한 Channel 이어도 해당 Channel 설정에서 importance 값을 변경할 경우 high 가 아닌 가장 최근에 변경한 값으로 적용됨을 확인할 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&lt;u&gt;(유저가 변경한 설정이 유지되는 게 자연스러운 로직이라고 한다.)&lt;/u&gt;&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;버전별 권한 관련&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타겟 sdk 32 이하의 앱이 Android 13 디바이스 설치 시 Notification Channel을 등록할 때 자동으로 Notification 권한 요청 팝업이 나옴&lt;/li&gt;
&lt;li&gt;32 이상 앱이 Android 13 디바이스 설치시 Notification 권한요청을 개발자가 원하는 타이밍에 노출 가능&lt;/li&gt;
&lt;li&gt;32 이상 앱이 Android 12 이하 디바이스에 설치시 기존과 동일하게 Notification 권한 요청 없이 사용 가능&lt;/li&gt;
&lt;li&gt;32 앱을 33으로 업데이트 시 기존 알림 권한 동의 상태라면 업데이트 이후 기본으로 허용이지만 예외 있음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기기에 따라 자동으로 허용되지 않고 다시 한번 권한을 얻어야 하는 경우가 있음&lt;/li&gt;
&lt;li&gt;때문에 Notification 권한이 허가되어 있는지 한 번 확인하는 작업을 넣기를 권장&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 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;권한 팝업 관련사항&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;sdk 32 이하 앱의 경우, 시스템이 자동으로 권한 팝업을 띄웠을 때, 사용자가 거부 버튼을 한번 누르면, 앱이 재시작해도 팝업이 발생하지 않는다.&lt;/li&gt;
&lt;li&gt;33 이상 앱의 경우, 앱이 권한 팝업을 띄웠을 때, 사용자가 거부 버튼을 두 번 누르기 전까지 퍼미션 팝업을 계속 띄울 수 있다.&lt;/li&gt;
&lt;li&gt;사용자가 거부 버튼을 눌러서 더 이상 팝업을 띄울 수 없다면 사용자가 직접 앱 설정에 들어가서 권한을 허가해줘야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1702415873581&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const val DENIED = &quot;denied&quot;
const val EXPLAINED = &quot;explained&quot;

// 권한 요청용 Activity Callback 객체
private val registerForActivityResult =
    registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions -&amp;gt;
        val deniedPermissionList = permissions.filter { !it.value }.map { it.key }
        when {
            deniedPermissionList.isNotEmpty() -&amp;gt; {
                val map = deniedPermissionList.groupBy { permission -&amp;gt;
                    if (shouldShowRequestPermissionRationale(permission)) DENIED else EXPLAINED
                }
                // 단순히 권한이 거부 되었을 때
                map[DENIED]?.let {
                
                }
                map[EXPLAINED]?.let {
                    // 권한 요청이 완전히 막혔을 때(주로 앱 상세 창 열기)
                }
            }

            else -&amp;gt; { // 모든 권한 허가

            }
        }
   }&lt;/code&gt;&lt;/pre&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;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;구현 코드&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/wo9374/StudyProject/tree/main/Notification&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/wo9374/StudyProject/tree/main/Notification&lt;/a&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Permission&lt;br /&gt;https://android-developer.tistory.com/entry/안드로이드13에서-Notification-허가-받기-방법-및-변경점&lt;br /&gt;https://salmonpack.tistory.com/32&lt;br /&gt;&lt;br /&gt;중요도&lt;br /&gt;https://rkdxowhd98.tistory.com/188&lt;br /&gt;https://vagabond95.me/posts/notification-with-oreo/&lt;br /&gt;&lt;br /&gt;Style&lt;br /&gt;https://hyejineee.github.io/blog/android-notification-implement&lt;/blockquote&gt;</description>
      <category>Android/Reference</category>
      <category>Android</category>
      <author>bumjae</author>
      <guid isPermaLink="true">https://bumjae.tistory.com/116</guid>
      <comments>https://bumjae.tistory.com/116#entry116comment</comments>
      <pubDate>Sat, 9 Dec 2023 00:24:51 +0900</pubDate>
    </item>
    <item>
      <title>Kotlin DSL, buildSrc 의존성 주입</title>
      <link>https://bumjae.tistory.com/114</link>
      <description>&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-size: 16px; letter-spacing: 0px; text-align: start;&quot;&gt;2023 4월 13일 &lt;/span&gt;구글이 Android의 새로운 빌드 언어로 Kotlin DSL을 채택&lt;br /&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;구글이 채택한 Kotlin DSL이 무엇인지, 어떤 장점이 있는지 알아본다.&lt;/span&gt;&lt;/blockquote&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;b&gt;Kotlin&amp;nbsp;DSL&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Kotlin으로 작성된 도메인 특화 언어(DSL)로 Gradle,&amp;nbsp;Android&amp;nbsp;등&amp;nbsp;여러&amp;nbsp;영역에서&amp;nbsp;사용되며&amp;nbsp;정적&amp;nbsp;타입&amp;nbsp;검사,&amp;nbsp;람다&amp;nbsp;함수,&amp;nbsp;확장&amp;nbsp;함수&amp;nbsp;등과&amp;nbsp;같은&amp;nbsp;Kotlin&amp;nbsp;언어의&amp;nbsp;장점을&amp;nbsp;살려&amp;nbsp;직관적인&amp;nbsp;DSL을&amp;nbsp;구축&amp;nbsp;가능하게&amp;nbsp;한다.&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;b&gt;Kotlin DSL 채택 이유&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;꼭&amp;nbsp;Kotlin&amp;nbsp;DSL을&amp;nbsp;사용해야&amp;nbsp;하는&amp;nbsp;것은&amp;nbsp;아니나&amp;nbsp;다른 DSL의 비해서 특정 도메인이나 작업에 대해 보다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;표현력이 뛰어나고 유연한 코드를 작성할 수 있도록 도&lt;/span&gt;와주는 도구로 채택된 것으로 본다&lt;/p&gt;
&lt;figure id=&quot;og_1702066257557&quot; style=&quot;color: #333333; text-align: start;&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cgqoOv/hyUIuekk6R/wfuo0i6h8YHZEu9O1K6qq1/img.png?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512,https://scrap.kakaocdn.net/dn/bm7rvk/hyUIwDb1lu/Xtk2Cc1zusyazBmhHTxlsk/img.png?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512,https://scrap.kakaocdn.net/dn/c7flfu/hyUIAMmU8K/QoX1OPLL7dnIPO2rvF2QC0/img.png?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512&quot; data-og-url=&quot;https://android-developers.googleblog.com/2023/04/kotlin-dsl-is-now-default-for-new-gradle-builds.html&quot; data-og-source-url=&quot;https://android-developers.googleblog.com/2023/04/kotlin-dsl-is-now-default-for-new-gradle-builds.html&quot; data-og-host=&quot;android-developers.googleblog.com&quot; data-og-description=&quot;Today we're excited to announce that we're switching the default language for build scripts to Kotlin! We've been working with the Gradle and JetBrain&quot; data-og-title=&quot;Kotlin DSL is Now the Default for New Gradle Builds&quot; data-og-type=&quot;article&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://android-developers.googleblog.com/2023/04/kotlin-dsl-is-now-default-for-new-gradle-builds.html&quot; data-source-url=&quot;https://android-developers.googleblog.com/2023/04/kotlin-dsl-is-now-default-for-new-gradle-builds.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cgqoOv/hyUIuekk6R/wfuo0i6h8YHZEu9O1K6qq1/img.png?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512,https://scrap.kakaocdn.net/dn/bm7rvk/hyUIwDb1lu/Xtk2Cc1zusyazBmhHTxlsk/img.png?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512,https://scrap.kakaocdn.net/dn/c7flfu/hyUIAMmU8K/QoX1OPLL7dnIPO2rvF2QC0/img.png?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;Kotlin DSL is Now the Default for New Gradle Builds&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;Today we're excited to announce that we're switching the default language for build scripts to Kotlin! We've been working with the Gradle and JetBrain&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;android-developers.googleblog.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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;Kotlin&amp;nbsp;DSL&amp;nbsp;장점&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;간결하고 가독성이 높은 코드&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;- Kotlin은 간결하고 표현력이 뛰어난 프로그래밍 언어, Kotlin의 장점을 살려 더욱 간결하고 가독성이 높은 코드를 작성할 수 있게 함&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 style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;타입 안전성&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;I&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;DE&amp;nbsp;지원&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;- 안드로이드 스튜디오를 비롯한 다양한 IDE 지원, IDE에서 DSL의 구문 강조 표시, 자동 완성, 코드 내비게이션 등의 기능을 활용할 수 있으며, 개발 생산성을 향상 가능&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 style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;유연성과 확장성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Kotlin은 객체 지향 프로그래밍과 함수형 프로그래밍을 모두 지원하므로, Kotlin DSL을 작성할 때 유연하고 확장 가능한 구조를 구성 가능&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 style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;Kotlin의 기능 활용&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;-&amp;nbsp; Kotlin은람다식, 확장 함수, Null 안전성 등 다양한 특징과 기능 제공, Kotlin DSL을 사용하면 이러한 기능을 활용하여 DSL를 보다 효율적으로 작성 가능&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;Kotlin&amp;nbsp;DSL&amp;nbsp;단점&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;학습&amp;nbsp;곡선&lt;/b&gt;&lt;/span&gt; &lt;br /&gt;- Kotlin DSL은 Kotlin 언어의 특성과 문법을 이해필요, Kotlin 언어에 익숙하지 않은 개발자들에게는 학습 곡선이 존재할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;생산성&amp;nbsp;저하&lt;/b&gt;&lt;/span&gt; &lt;br /&gt;- 표현력이 높고 강력한 기능을 제공하지만, 초기 구현 및 설정에는 추가적인 작업이 필요할 수 있다. 기존의 설정 방식이나 프레임워크에 익숙한 개발자들에게는 처음에는 생산성 저하가 있을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;제한된&amp;nbsp;확장성&lt;/b&gt;&lt;/span&gt; &lt;br /&gt;- Kotlin 언어의 기능과 제한적인 범위 내에서 확장이 가능하나 특정한 요구사항이나 도메인에 따라 확장의 어려움이 존재할 수 있다. 이는 Kotlin 언어의 한계이거나 DSL 설계의 한계로 인해 발생할 수 있다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Kotlin&amp;nbsp;DSL,&amp;nbsp;Groovy&amp;nbsp;DSL&amp;nbsp;차이&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 217px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 32.9845%; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 33.6821%; height: 17px; text-align: center;&quot;&gt;Kotlin&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;Groovy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 32.9845%; height: 20px; text-align: center;&quot;&gt;&lt;b&gt;언어&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.6821%; height: 20px; text-align: center;&quot;&gt;Kotlin&amp;nbsp;언어&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px; text-align: center;&quot;&gt;Groovy&amp;nbsp;언어&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 32.9845%; height: 40px; text-align: center;&quot;&gt;&lt;b&gt;문법&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.6821%; height: 40px; text-align: center;&quot;&gt;정적&amp;nbsp;타입,&amp;nbsp;람다식,&amp;nbsp;확장&amp;nbsp;함수&amp;nbsp;등의&amp;nbsp;&lt;br /&gt;Kotlin&amp;nbsp;문법&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 40px; text-align: center;&quot;&gt;동적&amp;nbsp;타입,&amp;nbsp;클로저,&amp;nbsp;메소드&amp;nbsp;체인&amp;nbsp;등의&amp;nbsp;&lt;br /&gt;Groovy&amp;nbsp;문법&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 32.9845%; height: 20px; text-align: center;&quot;&gt;&lt;b&gt;타입 안전성&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.6821%; height: 20px; text-align: center;&quot;&gt;정적&amp;nbsp;타입으로&amp;nbsp;타입&amp;nbsp;안전성&amp;nbsp;보장&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px; text-align: center;&quot;&gt;동적&amp;nbsp;타입으로&amp;nbsp;타입&amp;nbsp;안전성&amp;nbsp;제한적&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 32.9845%; height: 20px; text-align: center;&quot;&gt;&lt;b&gt;확장성&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.6821%; height: 20px; text-align: center;&quot;&gt;Kotlin 언어 기능을 활용한 확장성&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px; text-align: center;&quot;&gt;Groovy 언어 기능을 활용한 확장성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 32.9845%; height: 20px; text-align: center;&quot;&gt;&lt;b&gt;가독성&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.6821%; height: 20px; text-align: center;&quot;&gt;Kotlin&amp;nbsp;표현력을&amp;nbsp;활용한&amp;nbsp;가독성&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px; text-align: center;&quot;&gt;Groovy&amp;nbsp;표현력을&amp;nbsp;활용한&amp;nbsp;가독성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 32.9845%; height: 20px; text-align: center;&quot;&gt;&lt;b&gt;IDE 지원&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.6821%; height: 20px; text-align: center;&quot;&gt;안드로이드&amp;nbsp;스튜디오&amp;nbsp;등&amp;nbsp;Kotlin&amp;nbsp;IDE에서&amp;nbsp;지원&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px; text-align: center;&quot;&gt;IntelliJ&amp;nbsp;IDEA&amp;nbsp;등&amp;nbsp;Groovy&amp;nbsp;IDE에서&amp;nbsp;지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 32.9845%; height: 20px; text-align: center;&quot;&gt;&lt;b&gt;도구 및 라이브러리&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.6821%; height: 20px; text-align: center;&quot;&gt;Kotlin과&amp;nbsp;Gradle&amp;nbsp;통합&amp;nbsp;지원&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px; text-align: center;&quot;&gt;Groovy와&amp;nbsp;Gradle&amp;nbsp;통합&amp;nbsp;지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 32.9845%; height: 20px; text-align: center;&quot;&gt;&lt;b&gt;사용범위&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.6821%; height: 20px; text-align: center;&quot;&gt;주로&amp;nbsp;안드로이드&amp;nbsp;및&amp;nbsp;Kotlin&amp;nbsp;기반&amp;nbsp;프로젝트&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px; text-align: center;&quot;&gt;다양한 프로젝트 및 스크립트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 32.9845%; height: 20px; text-align: center;&quot;&gt;&lt;b&gt;학습 곡선&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.6821%; height: 20px; text-align: center;&quot;&gt;Kotlin&amp;nbsp;언어&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px; text-align: center;&quot;&gt;Groovy&amp;nbsp;언어&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이런 장∙단점을 가졌지만, 모든 프로젝트에 Kotlin DSL을 사용할 수는 없다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;어떤 DSL을 사용할지의 대한 여부는 프로젝트의 특정 상황과 요구 사항에 따라 결정해야 한다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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;구글에서 Kotlin DSL을 Android 앱용 Gradle 빌드 파일의 기본 스크립트로 사용하겠다고 밝힌 시점에서,&lt;br /&gt;변화가 빠른 Android 생태계를 따라가기 위해 지금부터는 적극적으로 Kotlin DSL을 활용할 것이다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;buildSrc&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의존성&amp;nbsp;관리와&amp;nbsp;IDE&amp;nbsp;자동완성&amp;nbsp;지원을&amp;nbsp;위해&amp;nbsp;kotlin&amp;nbsp;코드를&amp;nbsp;가지는&amp;nbsp;buildSrc&amp;nbsp;모듈을&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Gradle이 수행되면 buildSrc 디렉터리가 존재하는지 체크한다. &lt;br /&gt;이 경우 Gradle은 자동적으로 코드를 컴파일하고 테스트한 뒤 당신의 빌드 스크립트의 classpath에 넣는다.&lt;br /&gt;이 방법은 유지 보수, 리팩터링 및 코드 테스트가 더 쉽다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;빌드 로직을 포함할 수 있는 Gradle 프로젝트 루트 디렉터리&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;buildSrc와&amp;nbsp;Kotlin&amp;nbsp;DSL을&amp;nbsp;사용해서&amp;nbsp;매우&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;buildSrc를&amp;nbsp;변경하면&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #ef5369; text-align: start;&quot;&gt;전체 프로젝트의 빌드 캐시가 무효화되기 때문에 잦은 수정을 피해야 한다.&lt;/span&gt;&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Setting&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;rootDirectory에 buildSrc Directory 생성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;236&quot; data-origin-height=&quot;101&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DA1HM/btsBGjWFnIC/vWM3mwkJKK1rDs8nLisXXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DA1HM/btsBGjWFnIC/vWM3mwkJKK1rDs8nLisXXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DA1HM/btsBGjWFnIC/vWM3mwkJKK1rDs8nLisXXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDA1HM%2FbtsBGjWFnIC%2FvWM3mwkJKK1rDs8nLisXXK%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;236&quot; height=&quot;101&quot; data-origin-width=&quot;236&quot; data-origin-height=&quot;101&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: left;&quot; data-ke-size=&quot;size16&quot;&gt;buildSrc/build.gradle.kts 생성&lt;/p&gt;
&lt;pre id=&quot;code_1702046595025&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;plugins {
    `kotlin-dsl`
}
repositories {
    mavenCentral()
}&lt;/code&gt;&lt;/pre&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;buildSrc/src/main/kotlin/Dependency.kt&amp;nbsp;생성&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;사용할 의존성 작성 (임시로 라이브러리 dependency만)&lt;/p&gt;
&lt;pre id=&quot;code_1702046755781&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import Versions.hilt
import Versions.room

object Versions {
    const val hilt =&quot;2.49&quot;

    const val ksp = &quot;1.9.21-1.0.15&quot;

    const val room = &quot;2.6.1&quot;
}

object Lib {

    object Room{
        const val core = &quot;androidx.room:room-runtime:$room&quot;
        const val compiler = &quot;androidx.room:room-compiler:$room&quot;
        const val ktx = &quot;androidx.room:room-ktx:$room&quot;
    }

    object Activity{
        const val ktx = &quot;androidx.activity:activity-ktx:1.8.1&quot;
    }

    object Dagger{
        object Hilt{
            const val core = &quot;com.google.dagger:hilt-android:$hilt&quot;
            const val compiler = &quot;com.google.dagger:hilt-android-compiler:$hilt&quot;
        }
    }

    object Kotlin{
        const val coroutine = &quot;org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4&quot;
    }
}&lt;/code&gt;&lt;/pre&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;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;각 그래들 kts로 변경 / build.gradle -&amp;gt; build.gradle.kts 변경&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;작성한 dependency 사용 (사용이 안될 때 Sync 진행)&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;build.gradle.kts (:app)&lt;/p&gt;
&lt;pre id=&quot;code_1702071306993&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;plugins {
    id(&quot;com.android.application&quot;)
    id(&quot;org.jetbrains.kotlin.android&quot;)
    
    id(&quot;com.google.devtools.ksp&quot;)
    id(&quot;dagger.hilt.android.plugin&quot;)
}

android {
    namespace = &quot;com.ljb.example&quot;
    compileSdk = 34

    defaultConfig {
        applicationId = &quot;com.ljb.cleanarchitecture&quot;
        minSdk = 21
        targetSdk = 34
        versionCode = 1
        versionName = &quot;1.0&quot;

        testInstrumentationRunner = &quot;androidx.test.runner.AndroidJUnitRunner&quot;
    }

    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(
                getDefaultProguardFile(&quot;proguard-android-optimize.txt&quot;),
                &quot;proguard-rules.pro&quot;
            )
        }
    }
    ...
}

dependencies {
    ...
    
    implementation(Lib.Dagger.Hilt.core)
    ksp(Lib.Dagger.Hilt.compiler)
    
    implementation(Lib.Activity.ktx)
}&lt;/code&gt;&lt;/pre&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;build.gradle.kts (:project) &lt;b&gt;&lt;b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1702047515759&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;plugins {
    ...
    id(&quot;com.google.devtools.ksp&quot;) version Versions.ksp apply false
    id(&quot;com.google.dagger.hilt.android&quot;) version Versions.hilt apply false
}&lt;/code&gt;&lt;/pre&gt;
&lt;p 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;setting.gradle.kts&lt;/p&gt;
&lt;pre id=&quot;code_1702047661984&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pluginManagement {
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
}

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}

rootProject.name=&quot;Example&quot;
include (&quot;:app&quot;)&lt;/code&gt;&lt;/pre&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;blockquote data-ke-style=&quot;style3&quot;&gt;Kotlin DSL&lt;br /&gt;https://developer.android.com/studio/build/migrate-to-kts?hl=ko&lt;br /&gt;https://android-developers.googleblog.com/2023/04/kotlin-dsl-is-now-default-for-new-gradle-builds.html&lt;br /&gt;https://blog.imqa.io/kotlin-dsl/&lt;br /&gt;&lt;br /&gt;buildSrc&lt;br /&gt;https://seansation-blog.tistory.com/7&lt;/blockquote&gt;</description>
      <category>Kotlin/Basic</category>
      <category>Kotlin</category>
      <author>bumjae</author>
      <guid isPermaLink="true">https://bumjae.tistory.com/114</guid>
      <comments>https://bumjae.tistory.com/114#entry114comment</comments>
      <pubDate>Thu, 7 Dec 2023 23:21:54 +0900</pubDate>
    </item>
    <item>
      <title>DataStore / Preference, Proto</title>
      <link>https://bumjae.tistory.com/113</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안드로이드에서 단순한 데이터셋을 로컬에 저장하기 위해서 흔히 기본적으로 내장되어 있는 SharedPreferences를 사용한다.&lt;br /&gt;하지만&amp;nbsp;Primitive&amp;nbsp;data만&amp;nbsp;저장&amp;nbsp;가능했으며,&amp;nbsp;커스텀&amp;nbsp;데이터&amp;nbsp;타입&amp;nbsp;저장을&amp;nbsp;위해&amp;nbsp;GSON을&amp;nbsp;통해&amp;nbsp;Json&amp;nbsp;String으로&amp;nbsp;변환하여&amp;nbsp;저장하는&amp;nbsp;코드들이&amp;nbsp;생겨났다. &lt;br /&gt;&lt;br /&gt;그리고&amp;nbsp;미숙한&amp;nbsp;처리에&amp;nbsp;종종&amp;nbsp;Runtime&amp;nbsp;Error,&amp;nbsp;ANR이&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;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;SharedPreferences 단점&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #555555; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #666666;&quot;&gt;실제 XML 파일 I/O 작업을 하는 것으로&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;UI Thread&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;에서 작업할 경우&amp;nbsp;안전하지 않음&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #666666;&quot;&gt;&lt;b&gt;Runtime Exception&lt;/b&gt;으로부터&amp;nbsp;안전하지 않음&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #666666;&quot;&gt;XML 파일이기에 외부에서&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;쉽게&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;/span&gt;파일을 읽을 수 있음&amp;nbsp;(DataStore도 읽을 수는 있음)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #666666;&quot;&gt;비동기 API를 제공하지만 Listener를 통해서만 값을 Read 할 수 있음&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #666666;&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;Type-Safety 미제공&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래에서&amp;nbsp;설명할&amp;nbsp;DataStore는&amp;nbsp;SharedPreferences를&amp;nbsp;대체하기&amp;nbsp;위해&amp;nbsp;Jetpack에서&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;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;DataStore&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Kotlin coroutine과 Flow&lt;/b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;를 사용하여&amp;nbsp;&lt;/span&gt;&lt;b&gt;비동기적&lt;/b&gt;으로&lt;span style=&quot;text-align: start;&quot;&gt;,&amp;nbsp;&lt;/span&gt;&lt;b&gt;일관&lt;/b&gt;되게&lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;데이터를 저장이 가능&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 style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;Preferences DataStore &lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SharedPreferences 처럼 key-value 형태로 저장&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;b&gt; Type-Safety&lt;/b&gt;를 제공 X&lt;/span&gt;&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 style=&quot;color: #0593d3;&quot;&gt; &lt;b&gt;Proto DataStore&lt;/b&gt;&lt;/span&gt;&lt;/h3&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;text-align: start;&quot;&gt;을&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;u&gt;Protocol buffer&lt;/u&gt;&lt;/b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;를 통하여 저장&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;text-align: start;&quot;&gt;미리 정의된 schema를 통하여 &lt;b&gt;Type-Safety&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;p 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;&lt;b&gt;비교&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;아래 표는&amp;nbsp;&lt;span style=&quot;text-align: start;&quot;&gt;SharedPreferences와 DataSore의 비교표로 왜 &lt;span style=&quot;text-align: start;&quot;&gt;DataStore를 사용해야 하는지 알 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;SharedPreference vs DataStore&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;1048&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAtwuE/btsBxcdKYi2/QBTcF1L9UGE4QCiX6IdYY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAtwuE/btsBxcdKYi2/QBTcF1L9UGE4QCiX6IdYY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAtwuE/btsBxcdKYi2/QBTcF1L9UGE4QCiX6IdYY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAtwuE%2FbtsBxcdKYi2%2FQBTcF1L9UGE4QCiX6IdYY1%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;600&quot; height=&quot;516&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;1048&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;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;PreferencesDataStore 구현&lt;/b&gt;&lt;/h2&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;build.gradle (app)&lt;/p&gt;
&lt;pre id=&quot;code_1701961422905&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dependencies {
    implementation(&quot;androidx.datastore:datastore-preferences:&amp;lt;latest_version&amp;gt;&quot;)
    //Multi Module Ver.
    //implementation(&quot;androidx.datastore:datastore-preferences-core:&amp;lt;latest_version&amp;gt;&quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Data package나 쓰일 곳에 &lt;b&gt;User 파일&lt;/b&gt;을 만들고 DataStore를 생성하는 코드를 넣는다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;by&amp;nbsp;키워드를&amp;nbsp;써서&amp;nbsp;DataStore의&amp;nbsp;구현을&amp;nbsp;preferencesDataStore()에&amp;nbsp;맡기는&amp;nbsp;Context&amp;nbsp;확장&amp;nbsp;프로퍼티&lt;/p&gt;
&lt;pre id=&quot;code_1701962008246&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import android.content.Context
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.preferencesDataStore

val Context.dataStore: DataStore&amp;lt;Preferences&amp;gt; by preferencesDataStore(name = &quot;user_prefs&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만든 dataStore를 관리할 class 생성&lt;/p&gt;
&lt;pre id=&quot;code_1701962280102&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.*
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map

class UserManager(private val dataStore: DataStore&amp;lt;Preferences&amp;gt;) {
    companion object {
        val USER_AGE_KEY = intPreferencesKey(&quot;USER_AGE&quot;)
        val USER_NAME_KEY = stringPreferencesKey(&quot;USER_LAST_NAME&quot;)
        val USER_GENDER_KEY = booleanPreferencesKey(&quot;USER_GENDER&quot;)
    }

    suspend fun storeUser(age: Int, lastName: String, isMale: Boolean) {
        dataStore.edit {
            it[USER_AGE_KEY] = age
            it[USER_NAME_KEY] = lastName
            it[USER_GENDER_KEY] = isMale
        }
    }

    val userAgeFlow: Flow&amp;lt;Int?&amp;gt; = dataStore.data.map { it[USER_AGE_KEY] }
    val userNameFlow: Flow&amp;lt;String?&amp;gt; = dataStore.data.map { it[USER_NAME_KEY] }
    val userGenderFlow: Flow&amp;lt;Boolean?&amp;gt; = dataStore.data.map { it[USER_GENDER_KEY] }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부적으로&amp;nbsp;코루틴을&amp;nbsp;사용하기&amp;nbsp;때문에&amp;nbsp;데이터를&amp;nbsp;저장하는&amp;nbsp;storeUser()의&amp;nbsp;앞에&amp;nbsp;suspend&amp;nbsp;키워드를&amp;nbsp;붙임 &lt;br /&gt;intPreferencesKey(), stringPreferencesKey() 등의 함수가 보이는데 이것은 저장될 값들의 키를 정의하는 함수&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;맞는&amp;nbsp;함수를&amp;nbsp;쓰고&amp;nbsp;그&amp;nbsp;안에&amp;nbsp;키로&amp;nbsp;사용할&amp;nbsp;문자열을&amp;nbsp;넣어줌,&amp;nbsp;같은&amp;nbsp;이름의&amp;nbsp;키가&amp;nbsp;여러&amp;nbsp;개&amp;nbsp;있다면&amp;nbsp;ClassCastException&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;버튼을&amp;nbsp;누르면&amp;nbsp;입력된&amp;nbsp;값들을&amp;nbsp;DataStore에&amp;nbsp;저장하고,&amp;nbsp;저장된&amp;nbsp;값이&amp;nbsp;바뀌면&amp;nbsp;이를&amp;nbsp;관찰해서&amp;nbsp;View에&amp;nbsp;사용&lt;/p&gt;
&lt;pre id=&quot;code_1701962637981&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class PreferencesActivity : AppCompatActivity() {

    private lateinit var userManager: UserManager

    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        
        userManager = UserManager(dataStore)
        
        btnSave.setOnClickListener{
            CoroutineScope(Dispatchers.IO).launch { userManager.storeUser(임시나이, 이름, 성별) }
        }
        btnClear.setOnClickListener{
            CoroutineScope(Dispatchers.IO).launch { userManager.clearUser() }
        }

        observeData()
    }

    private fun observeData() = lifecycleScope.launch {
        launch {
            userManager.userAgeFlow.collectLatest { val age = it }
        }
        launch {
            userManager.userNameFlow.collectLatest { val name = it }
        }
        launch {
            userManager.userGenderFlow.collectLatest { val genderBool = it }
        }
    }
}&lt;/code&gt;&lt;/pre&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;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;ProtoDataStore 구현&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;ProtoDataStore를 구현할 때&amp;nbsp;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;Protocol Buffer도 구현&lt;/b&gt;&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;b&gt;&lt;span style=&quot;text-align: start;&quot;&gt; Protocol Buffer&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Google에서 개발한 이진 직렬화 포맷&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;플랫폼 및 언어에 독립적이며, 다양한 언어와 시스템에서 데이터를 효율적으로 전송하기 위해 사용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;주요 장점은 &lt;/span&gt;&lt;span style=&quot;color: #ef5369; text-align: start;&quot;&gt;&lt;b&gt;작은 메시지 크기&lt;/b&gt;, &lt;b&gt;빠른 직렬화/역직렬화 속도&lt;/b&gt; 및 &lt;b&gt;강력한 타입 안정성&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;text-align: start;&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;build.gradle (project)&amp;nbsp; / 작성자는 Kts 환경 (build.gradle.kts)&lt;/p&gt;
&lt;pre id=&quot;code_1701963605829&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;plugins {
    ...
    
    id(&quot;com.google.protobuf&quot;) version &quot;&amp;lt;latest_version&amp;gt;&quot; apply false
}&lt;/code&gt;&lt;/pre&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;build.gradle (app)&amp;nbsp; /&amp;nbsp; Protobuf 플러그인 및 라이브러리 의존성 추가&lt;/p&gt;
&lt;pre id=&quot;code_1702070655307&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;plugins {
    ...
    id(&quot;com.google.protobuf&quot;)
}

protobuf {
    protoc {
        artifact = &quot;com.google.protobuf:protoc:3.25.1&quot;
    }
    generateProtoTasks {
        all().forEach { task -&amp;gt;
            task.builtins{
                id(&quot;java&quot;){ option(&quot;lite&quot;) }
            }
        }
    }
}

dependencies {
    ...
    implementation(&quot;androidx.datastore:datastore:&amp;lt;latest_version&amp;gt;&quot;)
    //Multi Module Ver.
    //implementation(&quot;androidx.datastore:datastore-core:&amp;lt;latest_version&amp;gt;&quot;)
    
    implementation(&quot;com.google.protobuf:protobuf-javalite:&amp;lt;latest_version&amp;gt;&quot;)
}&lt;/code&gt;&lt;/pre&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;.proto 파일&lt;/b&gt;을 작성 ( 작성자는 &lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;src\main\proto&lt;/span&gt;&lt;/b&gt; 디렉토리 생성 후 Sample.proto 작성 )&lt;/p&gt;
&lt;pre id=&quot;code_1701964598202&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;syntax = &quot;proto3&quot;;

option java_package = &quot;com.ljb.datastore&quot;;
option java_multiple_files = true;

message Sample {
  int32 age = 1;
  string name = 2;
  
  enum Gender {
    MALE = 0;
    FEMALE = 1;
  }
  Gender gender = 3;
  bool initData = 4;
}&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;&lt;b&gt; syntax&lt;/b&gt; &lt;b&gt;:&lt;/b&gt; 사용할 Protobuf 버전을 지정하는 부분, protocol buffer 3 버전을 사용한다는 것을 명시&lt;/li&gt;
&lt;li&gt;&lt;b&gt;java_package&lt;/b&gt; &lt;b&gt;:&lt;/b&gt; 클래스가 생성될 package 명 명시 (ex:전체&amp;nbsp;패키지&amp;nbsp;이름)&lt;/li&gt;
&lt;li&gt;&lt;b&gt; java_multiple_files&lt;/b&gt; &lt;b&gt;:&lt;/b&gt; 최상위 수준인 클래스, enum에 해당하는 자바 클래스, enum 파일 등을 별도의 파일로 분리할지를 결정하는 항목, 자세한 건 &lt;a href=&quot;https://protobuf.dev/programming-guides/proto3/&quot;&gt;https://protobuf.dev/programming-guides/proto3/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt; message : &lt;/b&gt;데이터 구조 정의, 자료형을 선언, 그 안에 적절한 멤버 변수를 정의,&amp;nbsp; 각&amp;nbsp;멤버&amp;nbsp;변수에&amp;nbsp;붙은&amp;nbsp;1,&amp;nbsp;2,&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;p 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;작성 후 rebuild를 진행해주면 .proto 파일에서 정의한 자료형이 Java 클래스로 빌드되고, 이를&amp;nbsp;활용해&amp;nbsp;Android&amp;nbsp;Studio&amp;nbsp;내에서&amp;nbsp;DataStore를&amp;nbsp;구현할&amp;nbsp;수&amp;nbsp;있게&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;645&quot; data-origin-height=&quot;223&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s4oeB/btsBzxBgxzL/gMqo5i55i9U8aPzyLgYIv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s4oeB/btsBzxBgxzL/gMqo5i55i9U8aPzyLgYIv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s4oeB/btsBzxBgxzL/gMqo5i55i9U8aPzyLgYIv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs4oeB%2FbtsBzxBgxzL%2FgMqo5i55i9U8aPzyLgYIv0%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;645&quot; height=&quot;223&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;223&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 data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Serializer&amp;nbsp;작성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Proto는 JSON처럼 직렬화된 데이터를 사용, 이를 활용하려면 직렬화/역직렬화 과정이 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱 패키지 내 적절한 경로에 Serializer 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ViewModel을 싱글톤으로 쓰는 것과 유사한 이유로 DataStore도 단일 객체로 사용, Serializer도 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;object&lt;/b&gt;&lt;/span&gt;로 선언&lt;/p&gt;
&lt;pre id=&quot;code_1701965383579&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;object SampleSerializer: Serializer&amp;lt;Sample&amp;gt; {
    override val defaultValue: Sample
        get() = Sample.getDefaultInstance()

    override suspend fun readFrom(input: InputStream): Sample {
        try {
            return Sample.parseFrom(input)
        } catch (e: InvalidProtocolBufferException){
            throw CorruptionException(&quot;Cannot read proto.&quot;, e)
        }
    }

    override suspend fun writeTo(t: Sample, output: OutputStream) {
        t.writeTo(output)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Repository&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접적인 데이터 조작은 Repository에서 진행, ViewModel이 Repository에 딸린 Flow를 읽거나 메소드를 호출하는 식으로 간접적으로 데이터에 접근&lt;/p&gt;
&lt;pre id=&quot;code_1702072006209&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class SampleRepository(private val sampleProtoDataStore: DataStore&amp;lt;Sample&amp;gt;) {
    val flow : Flow&amp;lt;Sample&amp;gt; = sampleProtoDataStore.data

    suspend fun setUserData(name:String, age:Int, gender: Sample.Gender, initData: Boolean){
        sampleProtoDataStore.updateData { sample -&amp;gt;
            sample
                .toBuilder()
                .setName(name)
                .setAge(age)
                .setGender(gender)
                .setInitData(initData)
                .build()
        }
    }

    suspend fun clearUserData(){
        sampleProtoDataStore.updateData { sample -&amp;gt;
            sample
                .toBuilder()
                .clearName()
                .clearAge()
                .clearGender()
                .clearInitData()
                .build()
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성자&amp;nbsp;매개&amp;nbsp;변수&amp;nbsp;DataStore&amp;lt;T&amp;gt;&amp;nbsp;:&amp;nbsp;.proto에서&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;Proto는&amp;nbsp;.proto에서&amp;nbsp;지정한&amp;nbsp;멤버&amp;nbsp;변수별로&amp;nbsp;Getter와&amp;nbsp;Setter를&amp;nbsp;제공&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;ViewModel&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;susfed fun 함수 이므로 viewModelScope 사용&lt;/p&gt;
&lt;pre id=&quot;code_1701965917521&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class ProtoViewModel(private val repository: SampleRepository) : ViewModel() {
    val flow: Flow&amp;lt;Sample&amp;gt; = repository.flow

    fun setUserData(name:String, age:Int, gender: Sample.Gender, initData: Boolean){
        viewModelScope.launch { repository.setUserData(name, age, gender, initData) }
    }

    fun clearUserData(){
        viewModelScope.launch { repository.clearUserData() }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ViewModelFactory에도 Repository를 매개 변수로 넣어줌&lt;/p&gt;
&lt;pre id=&quot;code_1701966022435&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class ProtoViewModelFactory(private val repository: SampleRepository) : ViewModelProvider.Factory {
    override fun &amp;lt;T : ViewModel&amp;gt; create(modelClass: Class&amp;lt;T&amp;gt;): T {
        if (modelClass.isAssignableFrom(ProtoViewModel::class.java)){
            @Suppress(&quot;UNCHECKED_CAST&quot;)
            return ProtoViewModel(repository) as T
        }
        throw IllegalArgumentException(&quot;Unknown ViewModel class&quot;)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Activity&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최상단에 &lt;span style=&quot;text-align: start;&quot;&gt;Repository의 매개 변수&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;DataStore&amp;lt;T&amp;gt;에 들어갈 변수 생성, 만들어둔&amp;nbsp;SampleSerializer 지정 &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;fileName :&lt;/b&gt; 로컬에 저장될 Protobuf 파일의 이름&lt;/li&gt;
&lt;li&gt;&lt;b&gt;serializer :&lt;/b&gt; 말그대로 Serializer&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1701966100563&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private val Context.sampleDataStore: DataStore&amp;lt;Sample&amp;gt; by dataStore(
    fileName = &quot;sample.pb&quot;,
    serializer = SampleSerializer
)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1701966468997&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class ProtoActivity : AppCompatActivity() {

    private lateinit var viewModel: ProtoViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        
        viewModel = ViewModelProvider(this,
            ProtoViewModelFactory(SampleRepository(sampleDataStore))
        )[ProtoViewModel::class.java]

        setUi()
        observeData()
    }

    private fun setUi() {
        ...
        btnSave.setOnClickListener {
            CoroutineScope(Dispatchers.IO).launch { viewModel.setUserData(이름, 나이, 성별, 초기Init) }
        }
        btnClear.setOnClickListener {
            CoroutineScope(Dispatchers.IO).launch{ viewModel.clearUserData() }
        }
    }

    private fun observeData() = lifecycleScope.launch {
        //UI 처리
        viewModel.flow.collectLatest { sampleProto -&amp;gt;
            val age = sampleProto.age
            val name = sampleProto.name
            val initData = sampleProto.initData
            if (sampleProto.gender == Sample.Gender.MALE){
                
            }
        }
        
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; 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;전체코드&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/wo9374/StudyProject/tree/main/DataStore&quot;&gt;https://github.com/wo9374/StudyProject/tree/main/DataStore&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;DatsStore.gif&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bm1sjT/btsBC6o3huV/VJPNql30yKtG5uqgpBH5Y0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bm1sjT/btsBC6o3huV/VJPNql30yKtG5uqgpBH5Y0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bm1sjT/btsBC6o3huV/VJPNql30yKtG5uqgpBH5Y0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bm1sjT/btsBC6o3huV/VJPNql30yKtG5uqgpBH5Y0/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;200&quot; height=&quot;411&quot; data-filename=&quot;DatsStore.gif&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2220&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Preference, Proto 둘 다 동일 실행 화면&lt;/b&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;blockquote data-ke-style=&quot;style3&quot;&gt;PreferencesDataStore&amp;nbsp;&lt;br /&gt;https://developer.android.com/topic/libraries/architecture/datastore?hl=ko&lt;br /&gt;https://developer.android.com/codelabs/android-proto-datastore?hl=ko#0&lt;br /&gt;https://onlyfor-me-blog.tistory.com/519&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;ProtoDataStore&lt;br /&gt;https://velog.io/@i_meant_to_be/Proto-Datastore-Jetpack-Compose&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Protobuffer&lt;br /&gt;https://protobuf.dev/programming-guides/proto3/&lt;br /&gt;https://velog.io/@heetaeheo/Protobuf&lt;br /&gt;&lt;br /&gt;Kts build&lt;br /&gt;https://stackoverflow.com/questions/75025962/configuring-protocol-buffers-0-9-x-with-kotlin-dsl&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Android/Reference</category>
      <author>bumjae</author>
      <guid isPermaLink="true">https://bumjae.tistory.com/113</guid>
      <comments>https://bumjae.tistory.com/113#entry113comment</comments>
      <pubDate>Mon, 4 Dec 2023 19:19:08 +0900</pubDate>
    </item>
    <item>
      <title>Ktor</title>
      <link>https://bumjae.tistory.com/112</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;JetBrains에서&amp;nbsp;만들어진&amp;nbsp;Kotlin을&amp;nbsp;사용하여&amp;nbsp;연결된&amp;nbsp;시스템에서 &lt;br /&gt;비동기 서버 및 클라이언트를 구축하기 위한 오픈 소스 프레임 워크&lt;/span&gt;&lt;/blockquote&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 style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;설치, 사용이 간편하여 실행 파이프 라인에 단계를 추가하려는 경우 확장 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Coroutine의 비동기 속성으로 인해 여러 요청 수신이 가능하고 MultiPlatform이기도 하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;즉 서버뿐 아니라 Ktor Client를 써서 Android, iOS, JS에서 마이크로서비스를 사용할 수도 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Ktor Client를 쓰면 요청 생성, 응답 처리 및 인증, Json 직렬화 등과 같은 기능으로 기능을 확장할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1702073431624&quot; style=&quot;color: #333333; text-align: start;&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dcfPMn/hyUE32DNY7/zajEfXv3NFWHP9RpbUvvc0/img.png?width=1280&amp;amp;height=800&amp;amp;face=0_0_1280_800,https://scrap.kakaocdn.net/dn/cATNmD/hyUEZsorGF/DwqCTSdj4ki0Wk8lB4xbqK/img.png?width=1600&amp;amp;height=1318&amp;amp;face=0_0_1600_1318,https://scrap.kakaocdn.net/dn/uryk5/hyUFbGn0B1/ffOd6nJybBUOLlXVcFqdXk/img.png?width=1412&amp;amp;height=664&amp;amp;face=0_0_1412_664&quot; data-og-url=&quot;https://ktor.io/docs/2.3.6/getting-started-ktor-client.html&quot; data-og-source-url=&quot;https://ktor.io/docs/getting-started-ktor-client.html#create-client&quot; data-og-host=&quot;ktor.io&quot; data-og-description=&quot;&quot; data-og-title=&quot;Creating a client application | Ktor&quot; data-og-type=&quot;website&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://ktor.io/docs/getting-started-ktor-client.html#create-client&quot; data-source-url=&quot;https://ktor.io/docs/getting-started-ktor-client.html#create-client&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dcfPMn/hyUE32DNY7/zajEfXv3NFWHP9RpbUvvc0/img.png?width=1280&amp;amp;height=800&amp;amp;face=0_0_1280_800,https://scrap.kakaocdn.net/dn/cATNmD/hyUEZsorGF/DwqCTSdj4ki0Wk8lB4xbqK/img.png?width=1600&amp;amp;height=1318&amp;amp;face=0_0_1600_1318,https://scrap.kakaocdn.net/dn/uryk5/hyUFbGn0B1/ffOd6nJybBUOLlXVcFqdXk/img.png?width=1412&amp;amp;height=664&amp;amp;face=0_0_1412_664');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;Creating a client application | Ktor&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;ktor.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구현할 Android는 Client이기 때문에 Client만 알아보았다.&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;안드로이드에 Ktor 적용&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;build.gradle (project)&lt;/p&gt;
&lt;pre id=&quot;code_1701688355837&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;plugins {
    id(&quot;com.android.application&quot;) version &quot;8.1.4&quot; apply false
    id(&quot;org.jetbrains.kotlin.android&quot;) version &quot;1.9.0&quot; apply false

    kotlin(&quot;plugin.serialization&quot;) version &quot;1.9.21&quot; apply false
    //kotlin(&quot;jvm&quot;) version &quot;1.9.21&quot; // 멀티플랫폼이나 다른 플러그인에 serialization 사용할 때 지정
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;build.gradle (app)&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;dependencies {
    //Ktor
    implementation(&quot;io.ktor:ktor-client-android:&amp;lt;latest-version&amp;gt;&quot;)
    
    //JVM, Android 및 Native 플랫폼에서 사용할 수 있는 완전 비동기식 코루틴 기반 엔진
    implementation(&quot;io.ktor:ktor-client-cio:&amp;lt;latest-version&amp;gt;&quot;)
    
    //HTTP Request을 로깅하기 위해 사용
    implementation(&quot;io.ktor:ktor-client-logging-jvm:&amp;lt;latest-version&amp;gt;&quot;)
    
    //직렬화/역직렬화를 위한 ContentNegotiation
    implementation(&quot;io.ktor:ktor-client-content-negotiation:&amp;lt;latest-version&amp;gt;&quot;)
    
    //Serialization json
    implementation(&quot;io.ktor:ktor-serialization-kotlinx-json:&amp;lt;latest-version&amp;gt;&quot;)
    
    //Serialization XML
    //implementation(&quot;io.ktor:ktor-serialization-kotlinx-xml:&amp;lt;latest-version&amp;gt;&quot;)
    
    //Multi Platform Serialization
    //implementation(&quot;org.jetbrains.kotlinx:kotlinx-serialization-json:&amp;lt;latest-version&amp;gt;&quot;)  
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Manifast&lt;/p&gt;
&lt;pre id=&quot;code_1701688383214&quot; class=&quot;applescript&quot; style=&quot;color: #333333; text-align: left;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;&amp;lt;uses-permission android:name=&quot;android.permission.INTERNET&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&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;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Basic SetUp Client&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;기본 Client를 사용하는 방법&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Retrofit에서는&amp;nbsp;함수&amp;nbsp;형식으로&amp;nbsp;선언하여&amp;nbsp;팩토리&amp;nbsp;패턴으로&amp;nbsp;클라이언트를&amp;nbsp;생성하던&amp;nbsp;것을,&amp;nbsp;Ktor에서는&amp;nbsp;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;Scope를&amp;nbsp;할당하여&amp;nbsp;DSL&amp;nbsp;형식으로&amp;nbsp;작성함으로써&amp;nbsp;가독성&lt;/b&gt;&lt;/span&gt;을&amp;nbsp;높인&amp;nbsp;것&amp;nbsp;같음&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701688863527&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private const val BASE_URL = &quot;https://&quot;

val ktorClient = HttpClient(CIO){
    defaultRequest {
        url {
            protocol = URLProtocol.HTTPS
            host = BASE_URL
        }
    }
    install(ContentNegotiation) {
        json() // for json
    }
}

object Service {
    suspend fun getTodoData(): List&amp;lt;TodoData&amp;gt; {
        ktorClient
        .get&amp;lt;HttpResponse&amp;gt;(path = &quot;todo&quot;)
        .body&amp;lt;List&amp;lt;TodoData&amp;gt;&amp;gt;()
    }
    
    // Or Client에 defaultRequest 없이도 바로 사용 가능
    suspend fun getD() : List&amp;lt;TodoData&amp;gt; {
        client.get(&quot;url&quot;){
            url{ 
            	header(&quot;HEADER&quot;,&quot;HEADER.String&quot;)
            	header(&quot;HEADER&quot;,&quot;HEADER.String&quot;)
            }
        }
    }
    
}

//api 호출
val result = Service.getTodoData()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Json&amp;nbsp;형식의&amp;nbsp;Request&amp;nbsp;값을&amp;nbsp;데이터&amp;nbsp;객체로&amp;nbsp;변환하기&amp;nbsp;위해,&amp;nbsp;Retrofit은&amp;nbsp;ConverterFactory를&amp;nbsp;추가하지만 &lt;br /&gt;Ktor은&amp;nbsp;install&amp;nbsp;함수(플러그인&amp;nbsp;설치&amp;nbsp;기능)에&amp;nbsp;ContentNegotiation를&amp;nbsp;전달하여&amp;nbsp;Converter&amp;nbsp;추가&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; 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;span style=&quot;text-align: left; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;아래 코드는 네이버 검색 API를 호출하려고 만든 Client와 사용하는 코드이다.&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;object ApiInfo {
    //const val BASE_URL = &quot;https://openapi.naver.com/v1/search/news.json&quot;
    const val HOST = &quot;openapi.naver.com&quot;
    const val PATH = &quot;/v1/search/news.json&quot;

    const val HEADER_ID = &quot;X-Naver-Client-Id&quot;
    const val HEADER_SECRET = &quot;X-Naver-Client-Secret&quot;
}

val ktorClient = HttpClient(CIO) {
    expectSuccess = true          //응답 유효성 검사 true/false
    //followRedirects  = false    //리다이렉트 true/false
    
    //Http 요청에 대해 default value를 세팅하는 역할
    defaultRequest {
        url {
            protocol = URLProtocol.HTTPS
            host = HOST 	//URL Host
            path(PATH)		//요청 EndPoint
        }

        //요청 Header 추가 (localProperies 네이버 API id, key)
        headers {
            header(HEADER_ID, BuildConfig.NAVER_CLIENT_ID)
            header(HEADER_SECRET, BuildConfig.NAVER_CLIENT_SECRET)
        }
    }

    // install: client configuration block에 plugin을 가져옴
    install(ContentNegotiation) {
        json(
            Json {
                prettyPrint = true          // Json string을 읽기 편하게 만들어줌
                isLenient = true            // 따옴표 규칙 완화
                encodeDefaults = true       // null 또는 잘못된 값이 들어간 경우 default property value로 대체
                ignoreUnknownKeys = true    // Field 값이 없는 경우 무시할지 (모델에 없고, json에 있는 경우 해당 key 무시)
            }
        )
    }
    
    //Http 요청 로깅들을 만드는 로깅 역할
    install(Logging) {
        //logger = Logger.DEFAULT
        logger = object : Logger {
            override fun log(message: String) {
                Log.v(&quot;Ktor Logger&quot;, message)
            }
        }
        level = LogLevel.ALL
        //filter {  request -&amp;gt; request.url.host.contains(&quot;ktor.io&quot;) }
    }
    
    //응답의 상태를 기록하는 Observer
    install(ResponseObserver) {
        onResponse { response -&amp;gt; Log.d(&quot;HTTP status: &quot;, &quot;${response.status.value}&quot;) }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1701690251720&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class NewsApi(private val client: HttpClient){
    suspend fun getNews(query: String) : HttpResponse = client.get{
        parameter(&quot;query&quot;, query)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1701690659043&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class NewRepository{
    private val newsApi = NewsApi(ktorClient)

    suspend fun getSearchNews(query: String): Flow&amp;lt;List&amp;lt;NewsData&amp;gt;&amp;gt; = flow{
        try {
            newsApi.getNews(query).run {
                if (status.isSuccess()){
                    //Data Reponse 자동 역직렬화
                    val response = body&amp;lt;NewsResponse&amp;gt;() 
                    
                    emit(response.items)
                }else{
                    //Api Error 처리
                }
            }
        }catch (e: Exception){
            //Network Error 처리
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;NewRepository는 ViewModel이나 Presenter, Controller에서 getSearchNews()를 호출해 Data를 받아왔다.&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-filename=&quot;Log.png&quot; data-origin-width=&quot;1586&quot; data-origin-height=&quot;1773&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsUUIm/btsBoiKKUiW/0E2RwNVTdxaTnUe49Bmk6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsUUIm/btsBoiKKUiW/0E2RwNVTdxaTnUe49Bmk6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsUUIm/btsBoiKKUiW/0E2RwNVTdxaTnUe49Bmk6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsUUIm%2FbtsBoiKKUiW%2F0E2RwNVTdxaTnUe49Bmk6k%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;700&quot; height=&quot;783&quot; data-filename=&quot;Log.png&quot; data-origin-width=&quot;1586&quot; data-origin-height=&quot;1773&quot;/&gt;&lt;/span&gt;&lt;/figure&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;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;전체코드&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0070d1; text-align: center;&quot;&gt;&lt;a href=&quot;https://github.com/wo9374/StudyProject/tree/main/NetworkLibrary/Ktor&quot;&gt;https://github.com/wo9374/StudyProject/tree/main/NetworkLibrary/Ktor&lt;/a&gt;&lt;/span&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;blockquote data-ke-style=&quot;style3&quot;&gt;Ktor&lt;br /&gt;https://daryeou.tistory.com/345&lt;br /&gt;https://medium.com/@ans188/ktor란-무엇일까-750dcc9f77f5&lt;br /&gt;https://velog.io/@dldmswo1209/Compose-UI-Ktor-api-호출&lt;/blockquote&gt;</description>
      <category>Android/Library</category>
      <author>bumjae</author>
      <guid isPermaLink="true">https://bumjae.tistory.com/112</guid>
      <comments>https://bumjae.tistory.com/112#entry112comment</comments>
      <pubDate>Sun, 3 Dec 2023 17:33:55 +0900</pubDate>
    </item>
    <item>
      <title>Architecture Pattern MVC, MVP, MVVM, MVI</title>
      <link>https://bumjae.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;br /&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;이는 곧 리소스의 낭비이다.&lt;/span&gt;&lt;br /&gt;&lt;br /&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;곧 동료 작업자에 대한 배려이자 실력의 척도가 된다.&lt;/span&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Architecture&amp;nbsp;Pattern&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조를 만들고 같은 역할을 하는 class를 묶어, 이해하기 쉽게 적응할 수 있도록 하자는 유명 개발자들의 생각으로 소프트웨어 아키텍처는 공식화되었고, 해당&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;사전적 정의로 아키텍처 패턴은 공통적으로 자주 발생하는 문제를 해결하는 재사용 가능한 해결방법이다.&lt;br /&gt;실제로 아키텍처 패턴은 반복적으로 발견되고 재사용할 수 있는 잘 정의된 속성을 가진 아키텍처 클래스를 의미한다.&lt;br /&gt;&lt;br /&gt;모바일 앱 4대 Architecture에 대해 정리해 본다&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;h3 data-ke-size=&quot;size23&quot;&gt;MVC (Model-View-Controller)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mvc_1.png&quot; data-origin-width=&quot;6189&quot; data-origin-height=&quot;2330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cX1dm6/btsBjCh3Lxr/aT71O5MKsDny0u1WKHExI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cX1dm6/btsBjCh3Lxr/aT71O5MKsDny0u1WKHExI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cX1dm6/btsBjCh3Lxr/aT71O5MKsDny0u1WKHExI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcX1dm6%2FbtsBjCh3Lxr%2FaT71O5MKsDny0u1WKHExI0%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;740&quot; height=&quot;279&quot; data-filename=&quot;mvc_1.png&quot; data-origin-width=&quot;6189&quot; data-origin-height=&quot;2330&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Model&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;애플리케이션에&amp;nbsp;사용되는&amp;nbsp;데이터와&amp;nbsp;처리&amp;nbsp;로직이&amp;nbsp;담김&lt;/li&gt;
&lt;li&gt;View&amp;nbsp;또는&amp;nbsp;Controller와&amp;nbsp;묶이지&amp;nbsp;않기 때문에&amp;nbsp;재사용이&amp;nbsp;가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;View(UI)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자에게&amp;nbsp;보여주는&amp;nbsp;보이는&amp;nbsp;화면&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Controller&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자로부터 입력을 받고, 모델에 의해 View정의&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;Android에서는&amp;nbsp;View와&amp;nbsp;Controller가&amp;nbsp;Activity에&amp;nbsp;포함 &lt;br /&gt;이러한&amp;nbsp;문제점&amp;nbsp;때문에&amp;nbsp;Activity에&amp;nbsp;코드들이&amp;nbsp;몰리는&amp;nbsp;현상이&amp;nbsp;발생&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mvc_2.png&quot; data-origin-width=&quot;5893&quot; data-origin-height=&quot;3384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVwZGM/btsBiVhWIiM/3TJymVvcV4v0H7YUH8sMWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVwZGM/btsBiVhWIiM/3TJymVvcV4v0H7YUH8sMWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVwZGM/btsBiVhWIiM/3TJymVvcV4v0H7YUH8sMWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVwZGM%2FbtsBiVhWIiM%2F3TJymVvcV4v0H7YUH8sMWk%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;740&quot; height=&quot;425&quot; data-filename=&quot;mvc_2.png&quot; data-origin-width=&quot;5893&quot; data-origin-height=&quot;3384&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;장점&lt;/b&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;구현이&amp;nbsp;쉽고,&amp;nbsp;이해하기&amp;nbsp;쉬우며,&amp;nbsp;구현&amp;nbsp;속도도&amp;nbsp;가장&amp;nbsp;빠름&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;단점&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Controller와 View가 결합되어 있기 때문에 UnitTest에 어려움이 있음. UI&amp;nbsp;로직과&amp;nbsp;Controller에서&amp;nbsp;실행하는&amp;nbsp;로직들을&amp;nbsp;분리하기&amp;nbsp;어렵기&amp;nbsp;때문&lt;/li&gt;
&lt;li&gt;UI변경점이&amp;nbsp;있을&amp;nbsp;때,&amp;nbsp;Controller의&amp;nbsp;코드&amp;nbsp;변경&amp;nbsp;또한&amp;nbsp;불가피&lt;/li&gt;
&lt;li&gt;Model과&amp;nbsp;View의&amp;nbsp;의존성이&amp;nbsp;높기&amp;nbsp;때문에&amp;nbsp;앱이&amp;nbsp;커질수록&amp;nbsp;스파게티&amp;nbsp;코드가&amp;nbsp;될&amp;nbsp;위험이&amp;nbsp;높아짐&amp;nbsp;(MVP의&amp;nbsp;등장&amp;nbsp;배경)&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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;MVP (Model-View-Presenter)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MVP의 특징은 Activity가 View의 역할만 수행&lt;br /&gt;Android에&amp;nbsp;있어서&amp;nbsp;MVP는&amp;nbsp;컴포넌트&amp;nbsp;분리가&amp;nbsp;좀 더&amp;nbsp;명확하게&amp;nbsp;이루어&amp;nbsp;짐&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mvp_1.png&quot; data-origin-width=&quot;5892&quot; data-origin-height=&quot;3384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGu5ow/btsBmS5wLdu/skqpuF2AMqKLaz5bBee5H0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGu5ow/btsBmS5wLdu/skqpuF2AMqKLaz5bBee5H0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGu5ow/btsBmS5wLdu/skqpuF2AMqKLaz5bBee5H0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGu5ow%2FbtsBmS5wLdu%2FskqpuF2AMqKLaz5bBee5H0%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;740&quot; height=&quot;425&quot; data-filename=&quot;mvp_1.png&quot; data-origin-width=&quot;5892&quot; data-origin-height=&quot;3384&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Model&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MVC의 모델과 동일&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;View(UI)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Activity를 자연스럽게 View의 일부로 간주하게 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Presenter&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Controller와 같은 역할을 하나, Interface로 이루어져 UnitTest에 자유로움&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;i&gt;이제&amp;nbsp;Activity단에서&amp;nbsp;바로&amp;nbsp;Model을&amp;nbsp;호출하는&amp;nbsp;것이&amp;nbsp;아닌,&amp;nbsp;Presenter에서&amp;nbsp;View로&amp;nbsp;전달 &lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mvp_2.png&quot; data-origin-width=&quot;5892&quot; data-origin-height=&quot;3384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cv6Qpg/btsBofsIocK/Md0J7bjzLTqk2Y3qDxktW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cv6Qpg/btsBofsIocK/Md0J7bjzLTqk2Y3qDxktW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cv6Qpg/btsBofsIocK/Md0J7bjzLTqk2Y3qDxktW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcv6Qpg%2FbtsBofsIocK%2FMd0J7bjzLTqk2Y3qDxktW0%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;740&quot; height=&quot;425&quot; data-filename=&quot;mvp_2.png&quot; data-origin-width=&quot;5892&quot; data-origin-height=&quot;3384&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;장점&lt;/b&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;Model과&amp;nbsp;View의&amp;nbsp;의존성이&amp;nbsp;없어졌기&amp;nbsp;때문에&amp;nbsp;관련된&amp;nbsp;코드만&amp;nbsp;수정이&amp;nbsp;용이&lt;/li&gt;
&lt;li&gt;UI와&amp;nbsp;Data파트가&amp;nbsp;명확히&amp;nbsp;구분되어&amp;nbsp;간편하게&amp;nbsp;코딩&amp;nbsp;가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;단점&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;애플리케이션이&amp;nbsp;커질수록&amp;nbsp;View와&amp;nbsp;Presenter&amp;nbsp;사이의&amp;nbsp;의존성이&amp;nbsp;강해짐&lt;/li&gt;
&lt;li&gt;기능이&amp;nbsp;많아지면&amp;nbsp;Presenter의&amp;nbsp;비중이&amp;nbsp;커지기&amp;nbsp;때문에&amp;nbsp;분리하기가&amp;nbsp;어려움&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;MVC와&amp;nbsp;다르게&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;Presenter와&amp;nbsp;View가&amp;nbsp;1:1&amp;nbsp;관계를&amp;nbsp;갖고&amp;nbsp;있기&amp;nbsp;때문에&amp;nbsp;프로젝트가&amp;nbsp;커질수록&amp;nbsp;Presenter 또한&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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;MVVM (Model-View-ViewModel)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MVVM은&amp;nbsp;presenter에&amp;nbsp;의존하지&amp;nbsp;않고,&amp;nbsp;Observer&amp;nbsp;pattern을&amp;nbsp;이용해&amp;nbsp;객체의&amp;nbsp;변경이&amp;nbsp;일어날&amp;nbsp;때마다&amp;nbsp;UI를&amp;nbsp;갱신&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Observer Pattern&lt;br /&gt;상태 변화가 있을 때마다 메서드를 통하여 관찰 대상자가 직접&lt;br /&gt;옵저버들에게 통지하여 상태를 동기화할 수 있도록 하는 디자인 패턴을 의미&lt;br /&gt;즉, 객체에 변화가 일어날 때마다 콜백이 일어나게 됨&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mvvm_1.png&quot; data-origin-width=&quot;5892&quot; data-origin-height=&quot;3384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JT4oU/btsBmTDnbVi/k6x726qeFxYulkp2VnQ4a1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JT4oU/btsBmTDnbVi/k6x726qeFxYulkp2VnQ4a1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JT4oU/btsBmTDnbVi/k6x726qeFxYulkp2VnQ4a1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJT4oU%2FbtsBmTDnbVi%2Fk6x726qeFxYulkp2VnQ4a1%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;740&quot; height=&quot;425&quot; data-filename=&quot;mvvm_1.png&quot; data-origin-width=&quot;5892&quot; data-origin-height=&quot;3384&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Model&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MVC의 모델과 동일&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;View(UI)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ViewModel의 Data들을 구독하고 있다가 객체가 변할 때 UI를 업데이트&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ViewModel&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Model과 상호 작용하며, View에 종속되지 않고 1:N 구조를 가짐&lt;/li&gt;
&lt;li&gt;MVVM의 가장 큰 특징은 View가 어떤 종속성도 가지지 않는다는 것, 그래서 ViewModel을 다른 View에서도 활용이 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mvvm_2.png&quot; data-origin-width=&quot;5893&quot; data-origin-height=&quot;3385&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Sd4MD/btsBjojTA2n/kUhejQlJpeIPuNJG2qQbqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Sd4MD/btsBjojTA2n/kUhejQlJpeIPuNJG2qQbqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Sd4MD/btsBjojTA2n/kUhejQlJpeIPuNJG2qQbqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSd4MD%2FbtsBjojTA2n%2FkUhejQlJpeIPuNJG2qQbqK%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;740&quot; height=&quot;425&quot; data-filename=&quot;mvvm_2.png&quot; data-origin-width=&quot;5893&quot; data-origin-height=&quot;3385&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;장점&lt;/b&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;View와&amp;nbsp;Model이&amp;nbsp;독립&lt;/li&gt;
&lt;li&gt;바인딩하기 때문에 코드의 양이 감소&lt;/li&gt;
&lt;li&gt;ViewModel에서&amp;nbsp;View&amp;nbsp;코드가&amp;nbsp;없기&amp;nbsp;때문에&amp;nbsp;UnitTest를&amp;nbsp;쉽게&amp;nbsp;가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;단점&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터&amp;nbsp;바인딩이&amp;nbsp;필수적으로&amp;nbsp;요구&lt;/li&gt;
&lt;li&gt;간단한&amp;nbsp;UI에서&amp;nbsp;ViewModel을&amp;nbsp;설계해야&amp;nbsp;하고,&amp;nbsp;그만큼&amp;nbsp;과도한&amp;nbsp;엔지니어링이&amp;nbsp;일어날&amp;nbsp;수&amp;nbsp;있음&lt;/li&gt;
&lt;li&gt;다양한&amp;nbsp;곳에서&amp;nbsp;많은&amp;nbsp;데이터를&amp;nbsp;받기&amp;nbsp;때문에&amp;nbsp;관리를&amp;nbsp;제대로&amp;nbsp;못&amp;nbsp;할&amp;nbsp;경우&amp;nbsp;버그가&amp;nbsp;발생&lt;/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;size18&quot;&gt;&lt;b&gt;AAC ViewModel과의 차이&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;AndroidX에 있는 AAC ViewModel은 MVVM의 ViewModel과 다르다.&lt;br /&gt;Android에서의 ViewModel은 Fragment와 Activity의 데이터 전달, 화면 전환 시 잃어버리는 데이터를 저장하는 저장소인 셈&lt;br /&gt;&lt;br /&gt;LiveData와 StateFlow를 추가하여 MVVM Architecture를 구현한 것이기 때문에 결론은 AAC ViewModel을 쓴다고 해서 MVVM을 사용한다고 할 수 없음 &lt;br /&gt;&lt;br /&gt;마찬가지로 MVVM을 한다고 해서 AAC ViewModel을 사용할 필요는 없기에, 어떤 기업은 AAC ViewModel을 사용하지 않고도 MVVM을 구현한다고 함&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AAC ViewModel 설명&lt;/p&gt;
&lt;figure id=&quot;og_1701595744828&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Android AAC (Android Architecture Component)&quot; data-og-description=&quot;Android Architecture Component 테스트와 유지보수가 쉬운 앱을 디자인할 수 있도록 돕는 라이브러리의 모음 ViewModel 앱의 Lifecycle을 고려하여 UI 관련 데이터를 저장하고 관리하는 컴포넌트 UI Controller로&quot; data-og-host=&quot;bumjae.tistory.com&quot; data-og-source-url=&quot;https://bumjae.tistory.com/46&quot; data-og-url=&quot;https://bumjae.tistory.com/46&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/0glHE/hyUE3uAB82/WCrFkEYbEol35qwzvucdkK/img.png?width=800&amp;amp;height=419&amp;amp;face=0_0_800_419,https://scrap.kakaocdn.net/dn/b2Lz5l/hyUFdcWY26/JxAbbiy4pWOmB9rul4fkE0/img.png?width=800&amp;amp;height=419&amp;amp;face=0_0_800_419,https://scrap.kakaocdn.net/dn/1FOB2/hyUE6rlqpx/E9uJRT9HxS69gsYLaDBK61/img.png?width=960&amp;amp;height=720&amp;amp;face=0_0_960_720&quot;&gt;&lt;a href=&quot;https://bumjae.tistory.com/46&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bumjae.tistory.com/46&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/0glHE/hyUE3uAB82/WCrFkEYbEol35qwzvucdkK/img.png?width=800&amp;amp;height=419&amp;amp;face=0_0_800_419,https://scrap.kakaocdn.net/dn/b2Lz5l/hyUFdcWY26/JxAbbiy4pWOmB9rul4fkE0/img.png?width=800&amp;amp;height=419&amp;amp;face=0_0_800_419,https://scrap.kakaocdn.net/dn/1FOB2/hyUE6rlqpx/E9uJRT9HxS69gsYLaDBK61/img.png?width=960&amp;amp;height=720&amp;amp;face=0_0_960_720');&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;Android AAC (Android Architecture Component)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Android Architecture Component 테스트와 유지보수가 쉬운 앱을 디자인할 수 있도록 돕는 라이브러리의 모음 ViewModel 앱의 Lifecycle을 고려하여 UI 관련 데이터를 저장하고 관리하는 컴포넌트 UI Controller로&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;bumjae.tistory.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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;MVI (Model-View-Intent)&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MVVM에서&amp;nbsp;해결하지&amp;nbsp;못하는&amp;nbsp;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;상태&amp;nbsp;문제&lt;/b&gt;&lt;/span&gt;와&amp;nbsp;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;부수&amp;nbsp;효과&lt;/b&gt;&lt;/span&gt;&amp;nbsp;문제가&amp;nbsp;제기됨&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;상태 문제 &lt;br /&gt;프로그레스 바의 상태, 버튼 활성화 상태와 같이 화면에 나타나는 모든 정보를 상태라고 하는데, &lt;br /&gt;의도치 않은 방향으로 상태가 제어된다면 이것을 상태 문제라고 함 &lt;br /&gt;&lt;br /&gt;부수 효과(side effect) &lt;br /&gt;원래의 목적과 다른 효과 또는 부작용이 발생하는 상태를 의미 &lt;br /&gt;예를 들어 네트워크 통신 때 데이터를 가져오는 함수는 데이터를 못 가져올 수도 있다. &lt;br /&gt;function add(a, b){a+b+c}는 a와 b를 더한 값의 예상과 다르게 c 때문에 값이 변경될 수도 있다.&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mvi_0.gif&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;853&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m7XhW/btsBhX8u2ja/MXO2RKCnKsDk9Tj2ONuGT1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m7XhW/btsBhX8u2ja/MXO2RKCnKsDk9Tj2ONuGT1/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m7XhW/btsBhX8u2ja/MXO2RKCnKsDk9Tj2ONuGT1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/m7XhW/btsBhX8u2ja/MXO2RKCnKsDk9Tj2ONuGT1/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;240&quot; height=&quot;427&quot; data-filename=&quot;mvi_0.gif&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;853&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;데이터가&amp;nbsp;로딩되었음에도,&amp;nbsp;프로그레스&amp;nbsp;바가&amp;nbsp;돌고&amp;nbsp;있다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;MVVM으로&amp;nbsp;구현하면서&amp;nbsp;ViewModel에서&amp;nbsp;상태를&amp;nbsp;관리하게&amp;nbsp;되는데&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; 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;발생&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: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;데이터의&amp;nbsp;흐름을&amp;nbsp;제어하지&amp;nbsp;못하는&amp;nbsp;것&lt;/b&gt;&lt;/span&gt;이&amp;nbsp;문제였기&amp;nbsp;때문에&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;MVI&lt;/b&gt;는&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;단일&amp;nbsp;상태&amp;nbsp;관리와&amp;nbsp;단방향&amp;nbsp;데이터&amp;nbsp;흐름을&amp;nbsp;통해&amp;nbsp;MVVM의&amp;nbsp;문제점을&amp;nbsp;해결&lt;/span&gt;&lt;/b&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;mvi_1.png&quot; data-origin-width=&quot;5892&quot; data-origin-height=&quot;3385&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FJGcD/btsBohKQbmL/Vsq9YUnF006an79U5Yz9d1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FJGcD/btsBohKQbmL/Vsq9YUnF006an79U5Yz9d1/img.png&quot; data-alt=&quot;위 그림과 같이 단방향으로 흐르는 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FJGcD/btsBohKQbmL/Vsq9YUnF006an79U5Yz9d1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFJGcD%2FbtsBohKQbmL%2FVsq9YUnF006an79U5Yz9d1%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;740&quot; height=&quot;425&quot; data-filename=&quot;mvi_1.png&quot; data-origin-width=&quot;5892&quot; data-origin-height=&quot;3385&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위 그림과 같이 단방향으로 흐르는 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Model&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다른 Model과 다르게 상태(State)를 의미&lt;/li&gt;
&lt;li&gt;intent로&amp;nbsp;전달받은&amp;nbsp;객체에&amp;nbsp;맞추어&amp;nbsp;새로운&amp;nbsp;불변객체를&amp;nbsp;Model로&amp;nbsp;생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;View(UI)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Model의&amp;nbsp;결과물인&amp;nbsp;상태를&amp;nbsp;구독하고&amp;nbsp;있다가&amp;nbsp;변경&amp;nbsp;시&amp;nbsp;UI&amp;nbsp;업데이트를&amp;nbsp;진행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Intent&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;앱의&amp;nbsp;상태를&amp;nbsp;바꾸려는&amp;nbsp;의도를&amp;nbsp;의미&lt;/li&gt;
&lt;li&gt;Model에게&amp;nbsp;앱의&amp;nbsp;상태를&amp;nbsp;전달&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;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;MVI에 따르면, Model에서 호출되는 값은 불변하기에 예상이 가능해야 함 하지만&amp;nbsp;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;i&gt;&lt;b&gt;서버나&amp;nbsp;데이터베이스에서&amp;nbsp;값을&amp;nbsp;가져올&amp;nbsp;경우&amp;nbsp;이&amp;nbsp;값을&amp;nbsp;예측할&amp;nbsp;수&amp;nbsp;없음&lt;/b&gt;&lt;/i&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;MVI는&amp;nbsp;이러한&amp;nbsp;문제를&amp;nbsp;&lt;b&gt;SideEffect&lt;/b&gt;를&amp;nbsp;통해&amp;nbsp;제어&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;SideEffect &lt;br /&gt;백그라운드 작업, 액티비티 전환과 같은 부수적인 작업을 의미 &lt;br /&gt;Android 하단 알림 바 Toast 또한 SideEffect로 보는 경우가 많다&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mvi_2.png&quot; data-origin-width=&quot;5892&quot; data-origin-height=&quot;3384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YK0zz/btsBkmMFTY3/5gkTFtkIlCALMQinWJ6FGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YK0zz/btsBkmMFTY3/5gkTFtkIlCALMQinWJ6FGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YK0zz/btsBkmMFTY3/5gkTFtkIlCALMQinWJ6FGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYK0zz%2FbtsBkmMFTY3%2F5gkTFtkIlCALMQinWJ6FGK%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;740&quot; height=&quot;425&quot; data-filename=&quot;mvi_2.png&quot; data-origin-width=&quot;5892&quot; data-origin-height=&quot;3384&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;MVI는 &lt;u&gt;MVP, MVVM과 다르게 I가 실제 컴포넌트를 지칭하지 않음&lt;/u&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;어떤&amp;nbsp;구조로&amp;nbsp;만들자는&amp;nbsp;의미보다는&amp;nbsp;&lt;u&gt;&lt;b&gt;어떻게&amp;nbsp;데이터와&amp;nbsp;상태의&amp;nbsp;흐름을&amp;nbsp;어떻게&amp;nbsp;다룰&amp;nbsp;것이냐는&amp;nbsp;패러다임&lt;/b&gt;&lt;/u&gt;에&amp;nbsp;가까움&lt;/i&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;그래서 MVI의 많은 예제를 보면 MVVM, MVP 기반으로 작성된 코드를 많이 볼 수 있음 (MVVM 기반으로 연습함)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;장점&lt;/b&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;하나의&amp;nbsp;State객체만을&amp;nbsp;바라보기&amp;nbsp;때문에&amp;nbsp;상태&amp;nbsp;충돌이&amp;nbsp;일어나기&amp;nbsp;어려움&lt;/li&gt;
&lt;li&gt;쉬운&amp;nbsp;데이터의&amp;nbsp;흐름을&amp;nbsp;파악&lt;/li&gt;
&lt;li&gt;불변객체이기&amp;nbsp;때문에&amp;nbsp;스레드에&amp;nbsp;대해&amp;nbsp;안전&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;단점&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;러닝 커브가 높음 (기본적으로 MVP와 MVVM을 깔고 시작)&lt;/li&gt;
&lt;li&gt;Model&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;작은&amp;nbsp;변경에도&amp;nbsp;intent를&amp;nbsp;거쳐야&amp;nbsp;함&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;구현코드&lt;br /&gt;&lt;a href=&quot;https://github.com/wo9374/StudyProject/tree/main/DesignPattern&quot;&gt;https://github.com/wo9374/StudyProject/tree/main/DesignPattern&lt;/a&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Architecture Pattern&lt;br /&gt;https://daryeou.tistory.com/310&lt;br /&gt;https://meetup.nhncloud.com/posts/342&lt;/blockquote&gt;</description>
      <category>Develop</category>
      <author>bumjae</author>
      <guid isPermaLink="true">https://bumjae.tistory.com/111</guid>
      <comments>https://bumjae.tistory.com/111#entry111comment</comments>
      <pubDate>Sat, 2 Dec 2023 02:06:17 +0900</pubDate>
    </item>
    <item>
      <title>RoomDB warning: Schema export directory is not provided</title>
      <link>https://bumjae.tistory.com/110</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Room을 사용 중 빌드 창 warning 문구&lt;/b&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;blockquote data-ke-style=&quot;style3&quot;&gt;warning: Schema export directory is not provided to the annotation processor so we cannot export the schema. You can either provide `room.schemaLocation` annotation processor argument OR set exportSchema to false.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Room 라이브러리를 사용해서 Database 스키마를 생성할 때 exportSchema 설정에 의해 위의 경고가 뜬다.&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;exportSchema는 Boolean 타입으로 Database Schema를 폴더로 내보낼지 정할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;713&quot; data-origin-height=&quot;784&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n4mZ8/btsA9PgILrR/wC1KunzJeoklIHKTJTXiv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n4mZ8/btsA9PgILrR/wC1KunzJeoklIHKTJTXiv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n4mZ8/btsA9PgILrR/wC1KunzJeoklIHKTJTXiv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn4mZ8%2FbtsA9PgILrR%2FwC1KunzJeoklIHKTJTXiv0%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;600&quot; height=&quot;784&quot; data-origin-width=&quot;713&quot; data-origin-height=&quot;784&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;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;default 값이 true로 되어있어 경로를 지정해주지 않을 시 warning 경고를 띄운다.&lt;/span&gt;&lt;span style=&quot;text-align: center;&quot;&gt; &lt;span style=&quot;text-align: start;&quot;&gt;스키마 경로 지정이 필요 없어 false를 하면 경고는 바로 사라진다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1702076883266&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Database(entities = [NumberEntity::class], version = 1, exportSchema = false)
abstract class NumbersDatabase : RoomDatabase(){
    abstract fun dao(): NumbersDao
}&lt;/code&gt;&lt;/pre&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;경로를 지정 방법은 DB를 사용하는 모듈의 build.gradle에서 &lt;span style=&quot;text-align: start;&quot;&gt;defaultConfig 하위 섹션에 스키마 경로를 작성&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;Groovy version&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;
&lt;pre class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;android {
    // ... (compileSdkVersion, buildToolsVersion, etc)

    defaultConfig {
        // ... (applicationId, miSdkVersion, etc)
        
        javaCompileOptions {
            annotationProcessorOptions {
                arguments += [&quot;room.schemaLocation&quot;: &quot;$projectDir/schemas&quot;.toString()]
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: center;&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;Kapt version&lt;/p&gt;
&lt;pre id=&quot;code_1701178497775&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;defaultConfig {
    kapt {
        arguments {
            arg(&quot;room.schemaLocation&quot;, &quot;$projectDir/schemas&quot;)
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p 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;Ksp version&lt;/p&gt;
&lt;pre id=&quot;code_1701810793383&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;defaultConfig {
    ksp {
        arg(&quot;room.schemaLocation&quot;, &quot;$projectDir/schemas&quot;)
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Android/Debugging</category>
      <category>Android</category>
      <author>bumjae</author>
      <guid isPermaLink="true">https://bumjae.tistory.com/110</guid>
      <comments>https://bumjae.tistory.com/110#entry110comment</comments>
      <pubDate>Wed, 29 Nov 2023 11:07:38 +0900</pubDate>
    </item>
    <item>
      <title>Android Studio New LogCat</title>
      <link>https://bumjae.tistory.com/107</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt; &lt;b&gt;Android Studio Dolphin 버전에서 새로 나온 LogCat의 필터 쿼리&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1533&quot; data-origin-height=&quot;527&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P9oAE/btsBJiCCkVz/lt5zCk8L40y1BHgLlpEwi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P9oAE/btsBJiCCkVz/lt5zCk8L40y1BHgLlpEwi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P9oAE/btsBJiCCkVz/lt5zCk8L40y1BHgLlpEwi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP9oAE%2FbtsBJiCCkVz%2Flt5zCk8L40y1BHgLlpEwi1%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;740&quot; height=&quot;254&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1533&quot; data-origin-height=&quot;527&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 id=&quot;fee7&quot; data-selectable-paragraph=&quot;&quot;&gt;내 앱에서 발생하는 내용만 보기 (PIDs for the local app project)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;package:mine&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 id=&quot;89ae&quot; data-selectable-paragraph=&quot;&quot;&gt;내 앱에서 발생하는 내용에서 필터링 (ex) ViewModel 또는 UiState라는 문자가 포함된 내용만 필터링&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;package:mine ViewModel | UiState&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 id=&quot;0ae2&quot; data-selectable-paragraph=&quot;&quot;&gt;패키지, 태그, 레벨 조합&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;package:my-package-ID, tag:my-tag, level:ERROR&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 id=&quot;85e5&quot; data-selectable-paragraph=&quot;&quot;&gt;-를 붙여 특정 태그 제외&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;-tag:exclude-this-tag&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 id=&quot;88c0&quot; data-selectable-paragraph=&quot;&quot;&gt;정규 표현식 (~을 키값 뒤에 붙여준다)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;tag~:regex-tag&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; 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;style3&quot;&gt;Logcat&lt;br /&gt;https://brownsoo.medium.com/새로운-로그캣-필터-쿼리-a77da65f04f7&lt;br /&gt;https://m1nzi.tistory.com/9&lt;/blockquote&gt;</description>
      <category>Android/Debugging</category>
      <category>Android</category>
      <author>bumjae</author>
      <guid isPermaLink="true">https://bumjae.tistory.com/107</guid>
      <comments>https://bumjae.tistory.com/107#entry107comment</comments>
      <pubDate>Mon, 27 Feb 2023 09:13:17 +0900</pubDate>
    </item>
    <item>
      <title>Android 13에 따른 compileSdkVersion , targetSdkVersion 타겟 33 구글 정책 변경</title>
      <link>https://bumjae.tistory.com/106</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;SDK 버전을 높이기 위해 변경된 사항과 &lt;br /&gt;수정해야 할 사항들 중 중요하다 판단되는 것들을 알아보고 정리&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;Performance and battery&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Foreground Services (FGS) 작업 관리자&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Android 13(API 33)에서는 타겟 SDK 버전과 관계없이 사용자가 &quot;알림 창&quot;에서 &quot;포그라운드 서비스&quot;를 중지할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FGS 작업 관리자라고 하는 새로운 기능에는 현재 포그라운드 서비스를 실행 중인 앱 목록이 표시된다.&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;아래 그림은 Android 13을 실행하는 기기에서 FGS 작업 관리자 워크플로를 보여준다.&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;782&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwb3iV/btsBuwatT7v/KaKAZGMOYkkUnjWDL6tWL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwb3iV/btsBuwatT7v/KaKAZGMOYkkUnjWDL6tWL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwb3iV/btsBuwatT7v/KaKAZGMOYkkUnjWDL6tWL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcwb3iV%2FbtsBuwatT7v%2FKaKAZGMOYkkUnjWDL6tWL0%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;500&quot; height=&quot;479&quot; data-filename=&quot;img1.daumcdn.png&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;782&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 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;JobScheduler를 사용한 작업 미리 가져오기 처리 개선&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;JobScheduler는 앱이 JobInfo.Builder.setPrefetch()를 사용하여 특정 작업을 '미리 가져오기' 작업으로 표시할 방법을 제공한다.&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;미리 가져오기 작업은 사용자 환경을 개선하기 위해 다음번 앱이 실행되기 직전에 실행해야 하는 작업을 의미한다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;JobScheduler는 이제까지 이 신호만 사용하여 미리 가져오기 작업이 기회가 될 경우 사용 가능한 데이터나 여분의 데이터를 사용하도록 했다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Android 13에서는 시스템이 앱이 다음번에 실행될 시점을 판단하려고 시도하며, 이 추정을 바탕으로 미리 가져오기 작업을 실행한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;앱은 다음번 앱 실행에 앞서 실행할 모든 작업을 미리 가져오기 작업으로 처리하도록 시도 해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;배터리 리소스 사용률&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;배터리 리소스 사용률&quot; 도입 -&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;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;Restricted&lt;/b&gt;&lt;/span&gt;: &quot;앱 대기 버킷&quot;에 앱을 배치하는 경우에 적용되는 규칙 업데이트&lt;/li&gt;
&lt;li&gt;사용자가 앱의 &quot;백그라운드 배터리 사용&quot;을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;Restricted&lt;/b&gt;&lt;/span&gt;&amp;nbsp;상태로 설정한 경우 앱이 실행할 수 있는 작업에 관한 새로운 제한사항&lt;/li&gt;
&lt;li&gt;장기 실행 &quot;포그라운드 서비스&quot;에 관해 사용자에게 경고하는 새로운 시스템 알림&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;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;우선순위가&amp;nbsp;높은&amp;nbsp;Firebase&amp;nbsp;클라우드&amp;nbsp;메시징(FCM)&amp;nbsp;할당량&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Firebase 클라우드 메시징(FCM) 할당량을 업데이트하여 우선순위가 높은 FCM에 응답하여 알림을 표시하는 앱을 위해 우선순위가 높은 FCM 전송의 안정성을 개선한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Android 13(API 수준 33)에서 변경된 사항&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱 대기 버킷이 앱에서 사용할 수 있는 우선순위가 높은 FCM 수를 더 이상 결정하지 않는다.&lt;br /&gt;우선순위가 높은 FCM 할당량은 우선순위가 높은 FCM에 대한 응답으로 사용자에게 표시되는 알림 수에 비례하여 확장된다.&lt;br /&gt;이전 버전 Android에서와 같이 할당량을 초과하는 우선순위가 높은 FCM은 일반 우선순위로 다운그레이드된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FCM에 대한 응답으로 포그라운드 서비스(FGS)가 시작될 때 RemoveMessage.getPriority()의 결과를 확인하여 PRIORITY_HIGH인지 확인하고 잠재적인 &quot;ForegroundServiceStartNotAllowedException&quot; 예외를 처리하는 것이 좋다.&lt;b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;애플리케이션에서 우선순위가 높은 FCM에 대한 응답으로 알림을 항상 게시하지는 않는 경우 알림을 유발하는 메시지가 다운그레이드되지 않도록 이러한 FCM의 우선순위를 &lt;b&gt;Normal&lt;/b&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;개인&amp;nbsp;정보&amp;nbsp;보호&lt;/b&gt;&lt;/span&gt;&lt;/h2&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 style=&quot;color: #333333;&quot;&gt;&lt;b&gt;알림&amp;nbsp; 런타임 권한&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Android 13에서 새로운 런타임 알림 권한인 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;POST_NOTIFICATIONS&lt;/b&gt;&lt;/span&gt; 도입&lt;/p&gt;
&lt;pre id=&quot;code_1676508693091&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;uses-permission android:name=&quot;android.permission.POST_NOTIFICATIONS&quot;/&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 앱은 &lt;b&gt;포그라운드 서비스&lt;/b&gt;를 실행하기 위해 POST_NOTIFICATIONS 권한을 &lt;b&gt;요청할 필요가 없다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 그러나 &lt;b&gt;이전 버전의 Android&lt;/b&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;클립보드 민감 콘텐츠 숨기기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용자가 &lt;u&gt;&lt;b&gt;민감한 콘텐츠를 클립보드에 복사할 수 있도록 허용하는 앱&lt;/b&gt;&lt;/u&gt;은 플래그를 추가하여 클립보드 콘텐츠 &lt;span style=&quot;color: #ef5369;&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;- 앱에서 사용자가 민감한 콘텐츠(예: 비밀번호나 신용카드 정보)를 클립보드에 복사할 수 있도록 허용하는 경우 ClipboardManager#setPrimaryClip()을 호출하기 전에 &lt;b&gt;ClipData의 ClipDescription에 Flag를 추가&lt;/b&gt;해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이 Flag를 추가하면 민감한 콘텐츠가 콘텐츠 미리보기에 표시되지 않는다.&lt;/p&gt;
&lt;pre id=&quot;code_1676509194473&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// When your app targets API level 33 or higher
clipData.apply {
    description.extras = PersistableBundle().apply {
        putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true)
    }
}

// If your app targets a lower API level
clipData.apply {
    description.extras = PersistableBundle().apply {
        putBoolean(&quot;android.content.extra.IS_SENSITIVE&quot;, true)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 캡처 2023-12-06 002732.png&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ByiP0/btsBrgT035W/CfVOSj5tOJ8B4YJeRYsRj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ByiP0/btsBrgT035W/CfVOSj5tOJ8B4YJeRYsRj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ByiP0/btsBrgT035W/CfVOSj5tOJ8B4YJeRYsRj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FByiP0%2FbtsBrgT035W%2FCfVOSj5tOJ8B4YJeRYsRj0%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;740&quot; height=&quot;131&quot; data-filename=&quot;화면 캡처 2023-12-06 002732.png&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;156&quot;/&gt;&lt;/span&gt;&lt;/figure&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: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;보안&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&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 style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Intent Filter가 일치하지 않는 Intent 차단&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 앱이 Android 13 이상을 타겟팅하는 다른 앱의 내보낸 구성요소로 인텐트를 전송하면 이 인텐트는 수신 앱의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;&amp;lt;intent-filter&amp;gt;&amp;nbsp;요소와 일치하는 경우에만 전달&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;- 앱이 Android 13 이상으로 업그레이드되면 다른 앱에서 전송된 모든 인텐트가 앱에서 선언된&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;intent-filter&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;요소와&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;일치하는 경우에만 앱의 내보낸 구성요소로 전달&lt;/b&gt;&lt;/span&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;공유 사용자 ID Migration&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 앱이 지원 중단된 &lt;b&gt;android:sharedUserId&lt;/b&gt; 속성을 사용하고 이 속성의 기능에 더 이상 종속되지 않는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 다음 코드 스니펫과 &lt;b&gt;android:sharedUserMaxSdkVersion&lt;/b&gt; 속성을 32로 설정할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1702078490328&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;android:sharedUserId=&quot;SHARED_PACKAGE_NAME&quot;
android:sharedUserMaxSdkVersion=&quot;32&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202124;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;이 속성은 앱이 공유 사용자 ID를 더 이상 사용하지 않는다고 시스템에 알림 앱이&lt;/span&gt;&lt;b&gt;android:sharedUserMaxSdkVersion&lt;/b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;을 선언하고 Android&amp;nbsp;13 이상을 실행하는 기기에 새로 설치된 경우 앱은&amp;nbsp;&lt;/span&gt;&lt;b&gt;android:sharedUserId&lt;/b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;가 정의된 적이 없는 것처럼 작동. 업데이트된 앱은 여전히 기존 공유 사용자 ID를 사용&lt;span style=&quot;text-align: start;&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Targeting Android 13, Sdk 33 App&lt;/b&gt;&lt;/h2&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;b&gt;근처 Wi-Fi 기기의 새 런타임 권한&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp; Android 13 이상을 타겟팅하고 Wi-Fi Api를 사용하는 경우, &lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;ACCESS_FINE_LOCATION 대신 NEARBY_WIFI_DEVICES를 요청&lt;/span&gt; (앱이 Wi-Fi API에서 물리적 위치 정보를 얻는 것이 아니어야 함)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1676509747522&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;uses-permission android:name=&quot;android.permission.ACCESS_FINE_LOCATION&quot; 
				android:maxSdkVersion=&quot;32&quot; /&amp;gt;

&amp;lt;uses-permission android:name=&quot;android.permission.NEARBY_WIFI_DEVICES&quot; 
				android:usesPermissionFlags=&quot;neverForLocation&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&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;b&gt;새로운 Media 권한&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;READ_EXTERAL_STORAGE&amp;nbsp; deprecated&lt;/b&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%;&quot;&gt;미디어 유형&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;요청 권한&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;이미지 및 사진&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;READ_MEDIA_IMAGES&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;동영상&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;READ_MEDIA_VIDEO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;오디오 파일&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;READ_MEDIA_AUDIO&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;백그라운드에서 생체 신호 센서를 사용하려면 새로운 권한이 필요&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp; Android 13에서는 &lt;span&gt;심박수, 체온, 혈중 산소 농도 등과 같은 생체 신호 센서에 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;'사용 중인 동안'&lt;/b&gt;&lt;/span&gt; 액세스라는 개념이 도입&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 앱이 Android 13을 타겟팅하며 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;백그라운드에서 실행되는 동안 생체 신호 센서 정보에 액세스해야 하는 경우 &lt;/span&gt;&lt;/b&gt;기존 BODY_SENSORS 권한에 더해 새로운 &lt;b&gt;BODY_SENSORS_BACKGROUND 권한을 선언&lt;/b&gt;해야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1676510067068&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;uses-permission android:name=&quot;android.permission.BODY_SENSORS&quot; /&amp;gt;
&amp;lt;uses-permission android:name=&quot;android.permission.BODY_SENSORS_BACKGROUND&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Android 13&lt;br /&gt;https://developer.android.com/about/versions/13/behavior-changes-all?hl=ko&lt;br /&gt;https://developer.android.com/about/versions/13/behavior-changes-13?hl=ko&lt;/blockquote&gt;</description>
      <category>Android/Debugging</category>
      <category>Android</category>
      <author>bumjae</author>
      <guid isPermaLink="true">https://bumjae.tistory.com/106</guid>
      <comments>https://bumjae.tistory.com/106#entry106comment</comments>
      <pubDate>Fri, 23 Dec 2022 10:10:06 +0900</pubDate>
    </item>
  </channel>
</rss>