<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>프로그래머(뉴비)</title>
    <link>https://jhpop.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 25 Aug 2026 23:06:44 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>날아갔나요</managingEditor>
    <image>
      <title>프로그래머(뉴비)</title>
      <url>https://tistory1.daumcdn.net/tistory/2807743/attach/d6aebd4a844141348a7f96205f789421</url>
      <link>https://jhpop.tistory.com</link>
    </image>
    <item>
      <title>PorterDuff</title>
      <link>https://jhpop.tistory.com/153</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EifpB/btqGSrJBRsa/t2doIBkabeEOgM7eMs1EL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EifpB/btqGSrJBRsa/t2doIBkabeEOgM7eMs1EL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EifpB/btqGSrJBRsa/t2doIBkabeEOgM7eMs1EL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEifpB%2FbtqGSrJBRsa%2Ft2doIBkabeEOgM7eMs1EL1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;알파채널 개념을 개발한 토마스 포터와 톰 더프의 이름을 따서 만들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;대상(렌더링 대상의 콘텐츠)을 사용하여&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;소스(렌더 할 그래픽 개체)의 합성 결과 색상을 계산하는 방법으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;12개의 합성 연산자로 구성되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;구현해보기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #e6dada; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #181818; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #e6dada; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;private&lt;/span&gt;&amp;nbsp;fun&amp;nbsp;drawPorterDuffSample(canvas:&amp;nbsp;Canvas)&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;val&amp;nbsp;sampleBitmap&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Bitmap.createBitmap(width,&amp;nbsp;height,&amp;nbsp;Bitmap.Config.ARGB_8888)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;val&amp;nbsp;sampleCanvas&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Canvas(sampleBitmap)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;sampleCanvas.drawBitmap(getCircleBitmap(),&amp;nbsp;0f,&amp;nbsp;0f,&amp;nbsp;Paint())&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;sampleCanvas.drawBitmap(getRectangleBitmap(),&amp;nbsp;0f,&amp;nbsp;0f,&amp;nbsp;Paint().apply&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;xfermode&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;PorterDuffXfermode(PorterDuff.Mode.SRC)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;})&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;canvas.drawBitmap(sampleBitmap,&amp;nbsp;0f,&amp;nbsp;0f,&amp;nbsp;Paint())&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&lt;a style=&quot;color: #4f4f4ftext-decoration:none;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;canvas의 drawRect, drawCircle과 같은 메소드에 적용하면 기대와 다른 결과가 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;SRC, DST 모두 Bitmap으로 사용해야 기대한 결과를 볼 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위 코드에서 rectangleBitmap이 SRC, circleBitmap이 DST가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;전체 코드&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #e6dada; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #181818; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #e6dada; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;class&lt;/span&gt;&amp;nbsp;Renderer&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;private&lt;/span&gt;&amp;nbsp;var&amp;nbsp;width:&amp;nbsp;Int&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;private&lt;/span&gt;&amp;nbsp;var&amp;nbsp;height:&amp;nbsp;Int&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;private&lt;/span&gt;&amp;nbsp;var&amp;nbsp;centerX:&amp;nbsp;Int&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;private&lt;/span&gt;&amp;nbsp;var&amp;nbsp;centerY:&amp;nbsp;Int&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fun&amp;nbsp;setWidthAndHeight(width:&amp;nbsp;Int,&amp;nbsp;height:&amp;nbsp;Int)&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;&lt;span style=&quot;color: #d55a06;&quot;&gt;this&lt;/span&gt;.width&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;width&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;&lt;span style=&quot;color: #d55a06;&quot;&gt;this&lt;/span&gt;.height&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;height&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;centerX&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;width&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;2&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;centerY&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;height&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;2&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fun&amp;nbsp;onDraw(canvas:&amp;nbsp;Canvas)&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;drawPorterDuffSample(canvas)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;private&lt;/span&gt;&amp;nbsp;fun&amp;nbsp;drawPorterDuffSample(canvas:&amp;nbsp;Canvas)&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;val&amp;nbsp;sampleBitmap&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Bitmap.createBitmap(width,&amp;nbsp;height,&amp;nbsp;Bitmap.Config.ARGB_8888)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;val&amp;nbsp;sampleCanvas&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Canvas(sampleBitmap)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;sampleCanvas.drawBitmap(getCircleBitmap(),&amp;nbsp;0f,&amp;nbsp;0f,&amp;nbsp;Paint())&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;sampleCanvas.drawBitmap(getRectangleBitmap(),&amp;nbsp;0f,&amp;nbsp;0f,&amp;nbsp;Paint().apply&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;xfermode&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;PorterDuffXfermode(PorterDuff.Mode.SRC)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;})&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;canvas.drawBitmap(sampleBitmap,&amp;nbsp;0f,&amp;nbsp;0f,&amp;nbsp;Paint())&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;private&lt;/span&gt;&amp;nbsp;fun&amp;nbsp;getCircleBitmap()&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Bitmap.createBitmap(width,&amp;nbsp;height,&amp;nbsp;Bitmap.Config.ARGB_8888).apply&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;val&amp;nbsp;canvas&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Canvas(&lt;span style=&quot;color: #d55a06;&quot;&gt;this&lt;/span&gt;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;val&amp;nbsp;paint&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Paint().apply&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;flags&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Paint.ANTI_ALIAS_FLAG&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;color&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Color.parseColor(&lt;span style=&quot;color: #1cae0c;&quot;&gt;&quot;#E9B639&quot;&lt;/span&gt;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;val&amp;nbsp;radius&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;width&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;3.&lt;/span&gt;5f&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;10&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;canvas.drawCircle(radius,&amp;nbsp;radius,&amp;nbsp;radius,&amp;nbsp;paint)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;private&lt;/span&gt;&amp;nbsp;fun&amp;nbsp;getRectangleBitmap()&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Bitmap.createBitmap(width,&amp;nbsp;height,&amp;nbsp;Bitmap.Config.ARGB_8888).apply&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;val&amp;nbsp;canvas&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Canvas(&lt;span style=&quot;color: #d55a06;&quot;&gt;this&lt;/span&gt;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;val&amp;nbsp;paint&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Paint().apply&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;flags&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Paint.ANTI_ALIAS_FLAG&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;color&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Color.parseColor(&lt;span style=&quot;color: #1cae0c;&quot;&gt;&quot;#4899C5&quot;&lt;/span&gt;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;val&amp;nbsp;startTop&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;width&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;10&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;val&amp;nbsp;endBottom&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;width&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;9&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;10&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;canvas.drawRect(&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;Rect(startTop,&amp;nbsp;startTop,&amp;nbsp;endBottom,&amp;nbsp;endBottom),&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;paint&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&lt;a style=&quot;color: #4f4f4ftext-decoration:none;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결과&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;700&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Bpxbq/btqGWS7Hzfo/WyTkgfQmj0lgAUs3oBSHMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Bpxbq/btqGWS7Hzfo/WyTkgfQmj0lgAUs3oBSHMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Bpxbq/btqGWS7Hzfo/WyTkgfQmj0lgAUs3oBSHMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBpxbq%2FbtqGWS7Hzfo%2FWyTkgfQmj0lgAUs3oBSHMk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;700&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위에 코드를 안드로이드 커스텀뷰에서 그린 결과이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;안드로이드 커스텀뷰 코드&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #e6dada; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #181818; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #e6dada; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;class&lt;/span&gt;&amp;nbsp;CustomView(context:&amp;nbsp;Context,&amp;nbsp;attrs:&amp;nbsp;AttributeSet?,&amp;nbsp;defStyle:&amp;nbsp;Int)&amp;nbsp;:&amp;nbsp;View(context,&amp;nbsp;attrs,&amp;nbsp;defStyle)&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;constructor(context:&amp;nbsp;Context)&amp;nbsp;:&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;this&lt;/span&gt;(context,&amp;nbsp;&lt;span style=&quot;color: #366fed;&quot;&gt;null&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;constructor(context:&amp;nbsp;Context,&amp;nbsp;attrs:&amp;nbsp;AttributeSet?)&amp;nbsp;:&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;this&lt;/span&gt;(context,&amp;nbsp;attrs,&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;private&lt;/span&gt;&amp;nbsp;val&amp;nbsp;renderer&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Renderer()&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;override&amp;nbsp;fun&amp;nbsp;onMeasure(widthMeasureSpec:&amp;nbsp;Int,&amp;nbsp;heightMeasureSpec:&amp;nbsp;Int)&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;super&lt;/span&gt;.onMeasure(widthMeasureSpec,&amp;nbsp;heightMeasureSpec)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;renderer.setWidthAndHeight(measuredWidth,&amp;nbsp;measuredHeight)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;override&amp;nbsp;fun&amp;nbsp;onDraw(canvas:&amp;nbsp;Canvas)&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;renderer.onDraw(canvas)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;class&lt;/span&gt;&amp;nbsp;Renderer&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;private&lt;/span&gt;&amp;nbsp;var&amp;nbsp;width:&amp;nbsp;Int&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;private&lt;/span&gt;&amp;nbsp;var&amp;nbsp;height:&amp;nbsp;Int&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;private&lt;/span&gt;&amp;nbsp;var&amp;nbsp;centerX:&amp;nbsp;Int&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;private&lt;/span&gt;&amp;nbsp;var&amp;nbsp;centerY:&amp;nbsp;Int&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fun&amp;nbsp;setWidthAndHeight(width:&amp;nbsp;Int,&amp;nbsp;height:&amp;nbsp;Int)&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;&lt;span style=&quot;color: #d55a06;&quot;&gt;this&lt;/span&gt;.width&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;width&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;&lt;span style=&quot;color: #d55a06;&quot;&gt;this&lt;/span&gt;.height&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;height&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;centerX&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;width&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;2&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;centerY&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;height&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;2&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fun&amp;nbsp;onDraw(canvas:&amp;nbsp;Canvas)&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;drawPorterDuffSample(canvas)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;private&lt;/span&gt;&amp;nbsp;fun&amp;nbsp;drawPorterDuffSample(canvas:&amp;nbsp;Canvas)&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;val&amp;nbsp;sampleBitmap&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Bitmap.createBitmap(width,&amp;nbsp;height,&amp;nbsp;Bitmap.Config.ARGB_8888)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;val&amp;nbsp;sampleCanvas&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Canvas(sampleBitmap)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;sampleCanvas.drawBitmap(getCircleBitmap(),&amp;nbsp;0f,&amp;nbsp;0f,&amp;nbsp;Paint())&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;sampleCanvas.drawBitmap(getRectangleBitmap(),&amp;nbsp;0f,&amp;nbsp;0f,&amp;nbsp;Paint().apply&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;xfermode&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;PorterDuffXfermode(PorterDuff.Mode.SCREEN)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;})&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;canvas.drawBitmap(sampleBitmap,&amp;nbsp;0f,&amp;nbsp;0f,&amp;nbsp;Paint())&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;private&lt;/span&gt;&amp;nbsp;fun&amp;nbsp;getCircleBitmap()&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Bitmap.createBitmap(width,&amp;nbsp;height,&amp;nbsp;Bitmap.Config.ARGB_8888).apply&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;val&amp;nbsp;canvas&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Canvas(&lt;span style=&quot;color: #d55a06;&quot;&gt;this&lt;/span&gt;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;val&amp;nbsp;paint&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Paint().apply&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;flags&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Paint.ANTI_ALIAS_FLAG&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;color&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Color.parseColor(&lt;span style=&quot;color: #1cae0c;&quot;&gt;&quot;#E9B639&quot;&lt;/span&gt;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;val&amp;nbsp;radius&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;width&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;3.&lt;/span&gt;5f&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;10&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;canvas.drawCircle(radius,&amp;nbsp;radius,&amp;nbsp;radius,&amp;nbsp;paint)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;private&lt;/span&gt;&amp;nbsp;fun&amp;nbsp;getRectangleBitmap()&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Bitmap.createBitmap(width,&amp;nbsp;height,&amp;nbsp;Bitmap.Config.ARGB_8888).apply&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;val&amp;nbsp;canvas&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Canvas(&lt;span style=&quot;color: #d55a06;&quot;&gt;this&lt;/span&gt;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;val&amp;nbsp;paint&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Paint().apply&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;flags&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Paint.ANTI_ALIAS_FLAG&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;color&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Color.parseColor(&lt;span style=&quot;color: #1cae0c;&quot;&gt;&quot;#4899C5&quot;&lt;/span&gt;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;val&amp;nbsp;startTop&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;width&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;10&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;val&amp;nbsp;endBottom&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;width&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;9&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #0099cc;&quot;&gt;10&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;canvas.drawRect(&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;Rect(startTop,&amp;nbsp;startTop,&amp;nbsp;endBottom,&amp;nbsp;endBottom),&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;paint&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;}&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&lt;a style=&quot;color: #4f4f4ftext-decoration:none;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/%EC%95%8C%ED%8C%8C_%EC%B1%84%EB%84%90&quot;&gt;https://ko.wikipedia.org/wiki/%EC%95%8C%ED%8C%8C_%EC%B1%84%EB%84%90&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1597758781996&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;알파 채널 - 위키백과, 우리 모두의 백과사전&quot; data-og-description=&quot;위키백과, 우리 모두의 백과사전.&quot; data-og-host=&quot;ko.wikipedia.org&quot; data-og-source-url=&quot;https://ko.wikipedia.org/wiki/%EC%95%8C%ED%8C%8C_%EC%B1%84%EB%84%90&quot; data-og-url=&quot;https://ko.wikipedia.org/wiki/%EC%95%8C%ED%8C%8C_%EC%B1%84%EB%84%90&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bN2dJV/hyHa4T0hYX/tFZhr1rNCK85aKDYz1LFz0/img.png?width=1200&amp;amp;height=1200&amp;amp;face=0_0_1200_1200&quot;&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/%EC%95%8C%ED%8C%8C_%EC%B1%84%EB%84%90&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ko.wikipedia.org/wiki/%EC%95%8C%ED%8C%8C_%EC%B1%84%EB%84%90&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bN2dJV/hyHa4T0hYX/tFZhr1rNCK85aKDYz1LFz0/img.png?width=1200&amp;amp;height=1200&amp;amp;face=0_0_1200_1200');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;알파 채널 - 위키백과, 우리 모두의 백과사전&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;위키백과, 우리 모두의 백과사전.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;ko.wikipedia.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://developer.android.com/reference/android/graphics/PorterDuff.Mode&quot;&gt;https://developer.android.com/reference/android/graphics/PorterDuff.Mode&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1597766933267&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;PorterDuff.Mode &amp;nbsp;|&amp;nbsp; Android 개발자 &amp;nbsp;|&amp;nbsp; Android Developers&quot; data-og-description=&quot;&quot; data-og-host=&quot;developer.android.com&quot; data-og-source-url=&quot;https://developer.android.com/reference/android/graphics/PorterDuff.Mode&quot; data-og-url=&quot;https://developer.android.com/reference/android/graphics/PorterDuff.Mode?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bXs9ie/hyHa9ODbyi/SIyTEI6L4KZxSDBh58AwIK/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676&quot;&gt;&lt;a href=&quot;https://developer.android.com/reference/android/graphics/PorterDuff.Mode&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.android.com/reference/android/graphics/PorterDuff.Mode&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bXs9ie/hyHa9ODbyi/SIyTEI6L4KZxSDBh58AwIK/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;PorterDuff.Mode &amp;nbsp;|&amp;nbsp; Android 개발자 &amp;nbsp;|&amp;nbsp; Android Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;developer.android.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Common</category>
      <author>날아갔나요</author>
      <guid isPermaLink="true">https://jhpop.tistory.com/153</guid>
      <comments>https://jhpop.tistory.com/153#entry153comment</comments>
      <pubDate>Tue, 18 Aug 2020 18:10:54 +0900</pubDate>
    </item>
    <item>
      <title>RecyclerView - StickyHeader</title>
      <link>https://jhpop.tistory.com/152</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;stickyHeader.gif&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;699&quot; width=&quot;250&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d0m5i2/btqGRRU6ira/F7r4HvNY4yqgbob9vpwVAk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d0m5i2/btqGRRU6ira/F7r4HvNY4yqgbob9vpwVAk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d0m5i2/btqGRRU6ira/F7r4HvNY4yqgbob9vpwVAk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/d0m5i2/btqGRRU6ira/F7r4HvNY4yqgbob9vpwVAk/img.gif&quot; data-filename=&quot;stickyHeader.gif&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;699&quot; width=&quot;250&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;RecyclerView.ItemDecoration을 이용한 StickyHeader 구현&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;외부 라이브러리없이 전체 코드로 구현한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;ItemDecoration&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;RecyclerView를 더 커스텀하여 사용할 수 있게 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;아이템 간의 구분선을 만들거나 여백을 조정할 수 있으며 해당 포스팅처럼 RecyclerView 자체에 그릴 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;ItemDecoration의 &lt;b&gt;onDrawOver 메소드&lt;/b&gt;를 오버라이딩하여 구현한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;RecyclerView가 draw할 때마다 콜백으로 호출되며 RecyclerView 위에 그려지게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;RecyclerView의 Header 아이템과 일반 아이템으로 구분이 되어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;ViewType은 따로 나누지 않아도 상관없으며 구분할 함수만 구현하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;ItemDecoration 코드와 사용 코드&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;HeaderItemDecoration.kt&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #e6dada; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #181818; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #e6dada; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;class&lt;/span&gt;&amp;nbsp;HeaderItemDecoration(&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;recyclerView:&amp;nbsp;RecyclerView,&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;private&lt;/span&gt;&amp;nbsp;val&amp;nbsp;isHeader:&amp;nbsp;(itemPosition:&amp;nbsp;Int)&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;Boolean,&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;onClickHeader:&amp;nbsp;((itemPosition:&amp;nbsp;Int)&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;Unit)?&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #366fed;&quot;&gt;null&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;)&amp;nbsp;:&amp;nbsp;RecyclerView.ItemDecoration()&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;private&lt;/span&gt;&amp;nbsp;var&amp;nbsp;currentHeaderToShow:&amp;nbsp;Pair&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;&amp;lt;&lt;/span&gt;Int,&amp;nbsp;RecyclerView.ViewHolder&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;&amp;gt;&lt;/span&gt;?&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #366fed;&quot;&gt;null&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;init&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;recyclerView.adapter?.registerAdapterDataObserver(object&amp;nbsp;:&amp;nbsp;RecyclerView.AdapterDataObserver()&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;override&amp;nbsp;fun&amp;nbsp;onChanged()&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;&lt;span style=&quot;color: #999999;&quot;&gt;//&amp;nbsp;clear&amp;nbsp;saved&amp;nbsp;header&amp;nbsp;as&amp;nbsp;it&amp;nbsp;can&amp;nbsp;be&amp;nbsp;outdated&amp;nbsp;now&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;currentHeaderToShow&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #366fed;&quot;&gt;null&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;recyclerView.addOnLayoutChangeListener&amp;nbsp;{&amp;nbsp;_,&amp;nbsp;_,&amp;nbsp;_,&amp;nbsp;_,&amp;nbsp;_,&amp;nbsp;_,&amp;nbsp;_,&amp;nbsp;_,&amp;nbsp;_&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;&lt;span style=&quot;color: #999999;&quot;&gt;//&amp;nbsp;clear&amp;nbsp;saved&amp;nbsp;layout&amp;nbsp;as&amp;nbsp;it&amp;nbsp;may&amp;nbsp;need&amp;nbsp;layout&amp;nbsp;update&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;currentHeaderToShow&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #366fed;&quot;&gt;null&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;//&amp;nbsp;handle&amp;nbsp;click&amp;nbsp;on&amp;nbsp;sticky&amp;nbsp;header&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;onClickHeader?.let&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;initHeaderClickListener(recyclerView,&amp;nbsp;it)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;override&amp;nbsp;fun&amp;nbsp;onDrawOver(c:&amp;nbsp;Canvas,&amp;nbsp;recyclerView:&amp;nbsp;RecyclerView,&amp;nbsp;state:&amp;nbsp;RecyclerView.State)&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;super&lt;/span&gt;.onDrawOver(c,&amp;nbsp;recyclerView,&amp;nbsp;state)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val&amp;nbsp;topChildView&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;getTopChildView(recyclerView)&amp;nbsp;?:&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;return&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val&amp;nbsp;topChildViewPosition&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;recyclerView.getChildAdapterPosition(topChildView)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;if&lt;/span&gt;&amp;nbsp;(topChildViewPosition&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;RecyclerView.NO_POSITION)&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;return&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val&amp;nbsp;headerView&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;getHeaderViewToShow(topChildViewPosition,&amp;nbsp;recyclerView)&amp;nbsp;?:&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;return&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val&amp;nbsp;contactedNewHeader&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;getContactedNewHeader(headerView,&amp;nbsp;recyclerView)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;if&lt;/span&gt;&amp;nbsp;(contactedNewHeader&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #366fed;&quot;&gt;null&lt;/span&gt;)&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;drawMovedHeader(c,&amp;nbsp;headerView,&amp;nbsp;contactedNewHeader,&amp;nbsp;recyclerView.paddingTop)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;else&lt;/span&gt;&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;drawHeader(c,&amp;nbsp;headerView,&amp;nbsp;recyclerView.paddingTop)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;private&lt;/span&gt;&amp;nbsp;fun&amp;nbsp;getTopChildView(recyclerView:&amp;nbsp;RecyclerView)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;recyclerView.findChildViewUnder(&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;recyclerView.paddingStart.toFloat(),&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;recyclerView.paddingTop.toFloat()&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;private&lt;/span&gt;&amp;nbsp;fun&amp;nbsp;getHeaderViewToShow(topChildItemPosition:&amp;nbsp;Int,&amp;nbsp;recyclerView:&amp;nbsp;RecyclerView):&amp;nbsp;View?&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;recyclerView.adapter&amp;nbsp;?:&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #366fed;&quot;&gt;null&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val&amp;nbsp;headerPositionToShow&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;getHeaderPositionToShow(topChildItemPosition)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;if&lt;/span&gt;&amp;nbsp;(headerPositionToShow&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;RecyclerView.NO_POSITION)&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #366fed;&quot;&gt;null&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;return&lt;/span&gt;&amp;nbsp;getHeaderView(headerPositionToShow,&amp;nbsp;recyclerView)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;private&lt;/span&gt;&amp;nbsp;fun&amp;nbsp;getHeaderView(headerPositionToShow:&amp;nbsp;Int,&amp;nbsp;recyclerView:&amp;nbsp;RecyclerView):&amp;nbsp;View?&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val&amp;nbsp;headerHolderType&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;recyclerView.adapter&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;!&lt;/span&gt;.getItemViewType(headerPositionToShow)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;if&lt;/span&gt;&amp;nbsp;(currentHeaderToShow?.first&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;headerPositionToShow&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;&amp;amp;&lt;/span&gt;&amp;nbsp;currentHeaderToShow?.second?.itemViewType&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;headerHolderType)&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;&lt;span style=&quot;color: #d55a06;&quot;&gt;return&lt;/span&gt;&amp;nbsp;currentHeaderToShow?.second?.itemView&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val&amp;nbsp;headerHolder&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;recyclerView.adapter&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;!&lt;/span&gt;.createViewHolder(recyclerView,&amp;nbsp;headerHolderType)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;recyclerView.adapter&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;!&lt;/span&gt;.onBindViewHolder(headerHolder,&amp;nbsp;headerPositionToShow)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fixLayoutSize(recyclerView,&amp;nbsp;headerHolder.itemView)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentHeaderToShow&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;headerPositionToShow&amp;nbsp;to&amp;nbsp;headerHolder&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;return&lt;/span&gt;&amp;nbsp;headerHolder.itemView&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;private&lt;/span&gt;&amp;nbsp;fun&amp;nbsp;getHeaderPositionToShow(topChildItemPosition:&amp;nbsp;Int):&amp;nbsp;Int&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;headerPosition&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;RecyclerView.NO_POSITION&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;currentPosition&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;topChildItemPosition&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;do&lt;/span&gt;&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;&lt;span style=&quot;color: #d55a06;&quot;&gt;if&lt;/span&gt;&amp;nbsp;(isHeader(currentPosition))&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;headerPosition&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;currentPosition&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;&lt;span style=&quot;color: #d55a06;&quot;&gt;break&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;currentPosition&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;1&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;while&lt;/span&gt;&amp;nbsp;(currentPosition&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;return&lt;/span&gt;&amp;nbsp;headerPosition&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;private&lt;/span&gt;&amp;nbsp;fun&amp;nbsp;fixLayoutSize(parent:&amp;nbsp;ViewGroup,&amp;nbsp;view:&amp;nbsp;View)&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;//&amp;nbsp;Specs&amp;nbsp;for&amp;nbsp;parent&amp;nbsp;(RecyclerView)&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val&amp;nbsp;widthSpec&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;View.MeasureSpec.makeMeasureSpec(parent.width,&amp;nbsp;View.MeasureSpec.EXACTLY)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val&amp;nbsp;heightSpec&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;View.MeasureSpec.makeMeasureSpec(parent.height,&amp;nbsp;View.MeasureSpec.UNSPECIFIED)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;//&amp;nbsp;Specs&amp;nbsp;for&amp;nbsp;children&amp;nbsp;(headers)&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val&amp;nbsp;childWidthSpec&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;ViewGroup.getChildMeasureSpec(&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;widthSpec,&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;parent.paddingStart&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;+&lt;/span&gt;&amp;nbsp;parent.paddingEnd,&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;view.layoutParams.width&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val&amp;nbsp;childHeightSpec&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;ViewGroup.getChildMeasureSpec(&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;heightSpec,&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;parent.paddingTop&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;+&lt;/span&gt;&amp;nbsp;parent.paddingBottom,&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;view.layoutParams.height&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;view.measure(childWidthSpec,&amp;nbsp;childHeightSpec)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;view.layout(&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;,&amp;nbsp;view.measuredWidth,&amp;nbsp;view.measuredHeight)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;private&lt;/span&gt;&amp;nbsp;fun&amp;nbsp;drawHeader(c:&amp;nbsp;Canvas,&amp;nbsp;header:&amp;nbsp;View,&amp;nbsp;paddingTop:&amp;nbsp;Int)&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c.save()&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c.translate(0f,&amp;nbsp;paddingTop.toFloat())&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;header.draw(c)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c.restore()&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;private&lt;/span&gt;&amp;nbsp;fun&amp;nbsp;getContactedNewHeader(headerView:&amp;nbsp;View,&amp;nbsp;recyclerView:&amp;nbsp;RecyclerView):&amp;nbsp;View?&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val&amp;nbsp;contactPoint&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;headerView.bottom&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;+&lt;/span&gt;&amp;nbsp;recyclerView.paddingTop&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val&amp;nbsp;contactedChildView&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;getContactedChildView(recyclerView,&amp;nbsp;contactPoint)&amp;nbsp;?:&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #366fed;&quot;&gt;null&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val&amp;nbsp;contactedChildViewPosition&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;recyclerView.getChildAdapterPosition(contactedChildView)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;if&lt;/span&gt;&amp;nbsp;(isHeader(contactedChildViewPosition))&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;contactedChildView&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;else&lt;/span&gt;&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;&lt;span style=&quot;color: #366fed;&quot;&gt;null&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;private&lt;/span&gt;&amp;nbsp;fun&amp;nbsp;getContactedChildView(recyclerView:&amp;nbsp;RecyclerView,&amp;nbsp;contactPoint:&amp;nbsp;Int):&amp;nbsp;View?&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;childInContact:&amp;nbsp;View?&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #366fed;&quot;&gt;null&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;for&lt;/span&gt;&amp;nbsp;(i&amp;nbsp;&lt;span style=&quot;color: #366fed;&quot;&gt;in&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;&amp;nbsp;until&amp;nbsp;recyclerView.childCount)&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;val&amp;nbsp;child&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;recyclerView.getChildAt(i)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;val&amp;nbsp;bounds&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;Rect()&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;recyclerView.getDecoratedBoundsWithMargins(child,&amp;nbsp;bounds)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;&lt;span style=&quot;color: #d55a06;&quot;&gt;if&lt;/span&gt;&amp;nbsp;(bounds.bottom&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;contactPoint)&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;&lt;span style=&quot;color: #d55a06;&quot;&gt;if&lt;/span&gt;&amp;nbsp;(bounds.top&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;contactPoint)&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;childInContact&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;child&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;break&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;return&lt;/span&gt;&amp;nbsp;childInContact&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;private&lt;/span&gt;&amp;nbsp;fun&amp;nbsp;drawMovedHeader(c:&amp;nbsp;Canvas,&amp;nbsp;contactedTopHeader:&amp;nbsp;View,&amp;nbsp;contactedBottomHeader:&amp;nbsp;View,&amp;nbsp;paddingTop:&amp;nbsp;Int)&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c.save()&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c.translate(0f,&amp;nbsp;(contactedBottomHeader.top&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;-&lt;/span&gt;&amp;nbsp;contactedTopHeader.height).toFloat())&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;contactedTopHeader.draw(c)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c.restore()&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;private&lt;/span&gt;&amp;nbsp;fun&amp;nbsp;initHeaderClickListener(recyclerView:&amp;nbsp;RecyclerView,&amp;nbsp;onClickHeader:&amp;nbsp;(Int)&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;Unit)&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;recyclerView.addOnItemTouchListener(object&amp;nbsp;:&amp;nbsp;RecyclerView.SimpleOnItemTouchListener()&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;override&amp;nbsp;fun&amp;nbsp;onInterceptTouchEvent(&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;recyclerView:&amp;nbsp;RecyclerView,&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;motionEvent:&amp;nbsp;MotionEvent&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;Boolean&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;&lt;span style=&quot;color: #d55a06;&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;if&lt;/span&gt;&amp;nbsp;(motionEvent.action&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;MotionEvent.ACTION_DOWN)&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val&amp;nbsp;hasClickedOnHeaderArea&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;motionEvent.y&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;currentHeaderToShow?.second?.itemView?.bottom&amp;nbsp;?:&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;if&lt;/span&gt;&amp;nbsp;(hasClickedOnHeaderArea)&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentHeaderToShow?.first?.let&amp;nbsp;{&amp;nbsp;position&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;onClickHeader.invoke(position)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;true&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;else&lt;/span&gt;&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;false&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;false&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;}&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&lt;a style=&quot;color: #4f4f4ftext-decoration:none;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;사용 코드&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #e6dada; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #181818; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #e6dada; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rv_main.addItemDecoration(&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;HeaderItemDecoration(&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;rv_main,&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;it%&lt;span style=&quot;color: #0099cc;&quot;&gt;4&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;&amp;nbsp;},&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;Toast.makeText(&lt;span style=&quot;color: #d55a06;&quot;&gt;this&lt;/span&gt;,&amp;nbsp;it.&lt;span style=&quot;color: #366fed;&quot;&gt;toString&lt;/span&gt;(),&amp;nbsp;Toast.LENGTH_SHORT).show()&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&lt;a style=&quot;color: #4f4f4ftext-decoration:none;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;HeaderItemDecoration 클래스에&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;recyclerView, header 판단 함수, header 클릭시 동작 함수를 입력해 사용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;onDrawOver&lt;/h2&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #e6dada; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #181818; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #e6dada; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;override&amp;nbsp;fun&amp;nbsp;onDrawOver(c:&amp;nbsp;Canvas,&amp;nbsp;recyclerView:&amp;nbsp;RecyclerView,&amp;nbsp;state:&amp;nbsp;RecyclerView.State)&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;super&lt;/span&gt;.onDrawOver(c,&amp;nbsp;recyclerView,&amp;nbsp;state)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val&amp;nbsp;topChildView&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;getTopChildView(recyclerView)&amp;nbsp;?:&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;return&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val&amp;nbsp;topChildViewPosition&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;recyclerView.getChildAdapterPosition(topChildView)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;if&lt;/span&gt;&amp;nbsp;(topChildViewPosition&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;RecyclerView.NO_POSITION)&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;return&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val&amp;nbsp;headerView&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;getHeaderViewToShow(topChildViewPosition,&amp;nbsp;recyclerView)&amp;nbsp;?:&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;return&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val&amp;nbsp;contactedNewHeader&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;getContactedNewHeader(headerView,&amp;nbsp;recyclerView)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;if&lt;/span&gt;&amp;nbsp;(contactedNewHeader&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #366fed;&quot;&gt;null&lt;/span&gt;)&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;drawMovedHeader(c,&amp;nbsp;headerView,&amp;nbsp;contactedNewHeader,&amp;nbsp;recyclerView.paddingTop)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;else&lt;/span&gt;&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;drawHeader(c,&amp;nbsp;headerView,&amp;nbsp;recyclerView.paddingTop)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&lt;a style=&quot;color: #4f4f4ftext-decoration:none;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;onDrawOver 함수에 모든 핵심 내용이 다 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. recyclerView에서 보이는 가장 최상단 아이템 포지션을 얻는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. 최상단 아이템 index 이하의 가장 가까운 header 아이템의 뷰를 얻는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. (기존의 그리고 있는 header) 아래로 (접촉이 있는 새로운 header)가 있는지 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;3-1. 있다면 새로운 header가 간섭한 만큼 위로 올려 그린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;3-2. 없다면 그대로 그린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;만약 헤더끼리 접촉했을 때 하단 헤더가 상단 헤더를 밀도록 구현하는게 아닌 아래로 들어가듯이 구현하고 싶다면 contactedNewHeaer를 구할 필요없이 drawHeader만 사용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;원본 코드 및 참고한 링크&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&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;p data-ke-size=&quot;size18&quot;&gt;원본코드에서 필요하다고 생각하는 코드로만 다시 정리했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://gist.github.com/filipkowicz/1a769001fae407b8813ab4387c42fcbd&quot;&gt;https://gist.github.com/filipkowicz/1a769001fae407b8813ab4387c42fcbd&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1597681063155&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Item Decorator for sticky headers in Kotlin&quot; data-og-description=&quot;Item Decorator for sticky headers in Kotlin. GitHub Gist: instantly share code, notes, and snippets.&quot; data-og-host=&quot;gist.github.com&quot; data-og-source-url=&quot;https://gist.github.com/filipkowicz/1a769001fae407b8813ab4387c42fcbd&quot; data-og-url=&quot;https://gist.github.com/filipkowicz/1a769001fae407b8813ab4387c42fcbd&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bgK3JW/hyG9Dpje0q/x6sZ6r36nAfEm3oeD33hTK/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640&quot;&gt;&lt;a href=&quot;https://gist.github.com/filipkowicz/1a769001fae407b8813ab4387c42fcbd&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://gist.github.com/filipkowicz/1a769001fae407b8813ab4387c42fcbd&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bgK3JW/hyG9Dpje0q/x6sZ6r36nAfEm3oeD33hTK/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Item Decorator for sticky headers in Kotlin&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Item Decorator for sticky headers in Kotlin. GitHub Gist: instantly share code, notes, and snippets.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;gist.github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&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;p data-ke-size=&quot;size18&quot;&gt;StickyHeader를 구현하는 여러 코드들이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://www.it-swarm.dev/ko/android/recyclerview%EC%97%90%EC%84%9C-%EB%81%88%EC%A0%81%ED%95%9C-%ED%97%A4%EB%8D%94%EB%A5%BC-%EB%A7%8C%EB%93%A4%EB%A0%A4%EB%A9%B4-%EC%96%B4%EB%96%BB%EA%B2%8C%ED%95%B4%EC%95%BC%ED%95%A9%EB%8B%88%EA%B9%8C-%EC%99%B8%EB%B6%80-lib%EC%97%86%EC%9D%B4/1055032283/&quot;&gt;https://www.it-swarm.dev/ko/android/recyclerview%EC%97%90%EC%84%9C-%EB%81%88%EC%A0%81%ED%95%9C-%ED%97%A4%EB%8D%94%EB%A5%BC-%EB%A7%8C%EB%93%A4%EB%A0%A4%EB%A9%B4-%EC%96%B4%EB%96%BB%EA%B2%8C%ED%95%B4%EC%95%BC%ED%95%A9%EB%8B%88%EA%B9%8C-%EC%99%B8%EB%B6%80-lib%EC%97%86%EC%9D%B4/1055032283/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1597681072453&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;android &amp;mdash; RecyclerView에서 끈적한 헤더를 만들려면 어떻게해야합니까? (외부 lib없이)&quot; data-og-description=&quot;에야디야, 이것은 스크린에서 벗어나기 시작할 때 한 종류의 홀더 스틱을 원한다면 (우리는 어떤 섹션도 신경 쓰지 않습니다) 당신이 그것을하는 방법입니다. 재활용 아이템의 내부 RecyclerView 로&quot; data-og-host=&quot;www.it-swarm.dev&quot; data-og-source-url=&quot;https://www.it-swarm.dev/ko/android/recyclerview%EC%97%90%EC%84%9C-%EB%81%88%EC%A0%81%ED%95%9C-%ED%97%A4%EB%8D%94%EB%A5%BC-%EB%A7%8C%EB%93%A4%EB%A0%A4%EB%A9%B4-%EC%96%B4%EB%96%BB%EA%B2%8C%ED%95%B4%EC%95%BC%ED%95%A9%EB%8B%88%EA%B9%8C-%EC%99%B8%EB%B6%80-lib%EC%97%86%EC%9D%B4/1055032283/&quot; data-og-url=&quot;https://www.it-swarm.dev/ko/android/recyclerview%EC%97%90%EC%84%9C-%EB%81%88%EC%A0%81%ED%95%9C-%ED%97%A4%EB%8D%94%EB%A5%BC-%EB%A7%8C%EB%93%A4%EB%A0%A4%EB%A9%B4-%EC%96%B4%EB%96%BB%EA%B2%8C%ED%95%B4%EC%95%BC%ED%95%A9%EB%8B%88%EA%B9%8C-%EC%99%B8%EB%B6%80-lib%EC%97%86%EC%9D%B4/1055032283/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.it-swarm.dev/ko/android/recyclerview%EC%97%90%EC%84%9C-%EB%81%88%EC%A0%81%ED%95%9C-%ED%97%A4%EB%8D%94%EB%A5%BC-%EB%A7%8C%EB%93%A4%EB%A0%A4%EB%A9%B4-%EC%96%B4%EB%96%BB%EA%B2%8C%ED%95%B4%EC%95%BC%ED%95%A9%EB%8B%88%EA%B9%8C-%EC%99%B8%EB%B6%80-lib%EC%97%86%EC%9D%B4/1055032283/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.it-swarm.dev/ko/android/recyclerview%EC%97%90%EC%84%9C-%EB%81%88%EC%A0%81%ED%95%9C-%ED%97%A4%EB%8D%94%EB%A5%BC-%EB%A7%8C%EB%93%A4%EB%A0%A4%EB%A9%B4-%EC%96%B4%EB%96%BB%EA%B2%8C%ED%95%B4%EC%95%BC%ED%95%A9%EB%8B%88%EA%B9%8C-%EC%99%B8%EB%B6%80-lib%EC%97%86%EC%9D%B4/1055032283/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;android &amp;mdash; RecyclerView에서 끈적한 헤더를 만들려면 어떻게해야합니까? (외부 lib없이)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;에야디야, 이것은 스크린에서 벗어나기 시작할 때 한 종류의 홀더 스틱을 원한다면 (우리는 어떤 섹션도 신경 쓰지 않습니다) 당신이 그것을하는 방법입니다. 재활용 아이템의 내부 RecyclerView 로&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.it-swarm.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Android/UI</category>
      <author>날아갔나요</author>
      <guid isPermaLink="true">https://jhpop.tistory.com/152</guid>
      <comments>https://jhpop.tistory.com/152#entry152comment</comments>
      <pubDate>Mon, 17 Aug 2020 23:00:26 +0900</pubDate>
    </item>
    <item>
      <title>BottomSheet</title>
      <link>https://jhpop.tistory.com/150</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;dependency&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size18&quot; data-ke-style=&quot;style3&quot;&gt;implementation 'com.google.android.material:material:1.3.0-alpha02'&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;BottomSheetDialog&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;bottomSheetDialog.gif&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;699&quot; width=&quot;250&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tk9Ug/btqGrBfbuvS/Ws6YNU53aAemLT0EZJkUNk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tk9Ug/btqGrBfbuvS/Ws6YNU53aAemLT0EZJkUNk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tk9Ug/btqGrBfbuvS/Ws6YNU53aAemLT0EZJkUNk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/tk9Ug/btqGrBfbuvS/Ws6YNU53aAemLT0EZJkUNk/img.gif&quot; data-filename=&quot;bottomSheetDialog.gif&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;699&quot; width=&quot;250&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;기존의 다이얼로그 사용법과 동일하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #e6dada; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #181818; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #e6dada; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BottomSheetDialog(&lt;span style=&quot;color: #d55a06;&quot;&gt;this&lt;/span&gt;).apply&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;val&amp;nbsp;view&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;layoutInflater.inflate(R.layout.view_bottom_sheet,&amp;nbsp;&lt;span style=&quot;color: #366fed;&quot;&gt;null&lt;/span&gt;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;view.btn_view_bottom_sheet.setOnClickListener&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;Toast.makeText(&lt;span style=&quot;color: #d55a06;&quot;&gt;this&lt;/span&gt;@MainActivity,&amp;nbsp;&lt;span style=&quot;color: #1cae0c;&quot;&gt;&quot;FIN&quot;&lt;/span&gt;,&amp;nbsp;Toast.LENGTH_SHORT).show()&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;dismiss()&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;setContentView(view)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}.show()&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&lt;a style=&quot;color: #4f4f4ftext-decoration:none;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;BottomSheet With Behavior&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;bottomSheet.gif&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;699&quot; width=&quot;250&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qtwd2/btqGuyPqKaq/ACHuoWE085P9nk98UchXeK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qtwd2/btqGuyPqKaq/ACHuoWE085P9nk98UchXeK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qtwd2/btqGuyPqKaq/ACHuoWE085P9nk98UchXeK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/qtwd2/btqGuyPqKaq/ACHuoWE085P9nk98UchXeK/img.gif&quot; data-filename=&quot;bottomSheet.gif&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;699&quot; width=&quot;250&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;activity_main.xml&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #e6dada; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #181818; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #e6dada; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066be0;&quot;&gt;?xml&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;version&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;1.0&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;encoding&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;utf-8&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066be0;&quot;&gt;androidx.coordinatorlayout.widget.CoordinatorLayout&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;xmlns:android&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;http://schemas.android.com/apk/res/android&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;xmlns:app&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;http://schemas.android.com/apk/res-auto&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;xmlns:tools&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;http://schemas.android.com/tools&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;android:layout_width&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;match_parent&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;android:layout_height&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;match_parent&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;tools:context&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;.MainActivity&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;&amp;lt;!--&amp;nbsp;&amp;nbsp;Content&amp;nbsp;&amp;nbsp;--&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066be0;&quot;&gt;androidx.constraintlayout.widget.ConstraintLayout&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;android:layout_width&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;match_parent&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;android:layout_height&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;match_parent&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;android:layout_marginBottom&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;50dp&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066be0;&quot;&gt;TextView&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;android:layout_width&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;wrap_content&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;android:layout_height&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;wrap_content&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;android:text&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;Hello,&amp;nbsp;World!&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;app:layout_constraintTop_toTopOf&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;parent&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;app:layout_constraintBottom_toBottomOf&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;parent&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;app:layout_constraintStart_toStartOf&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;parent&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;app:layout_constraintEnd_toEndOf&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;parent&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066be0;&quot;&gt;androidx.constraintlayout.widget.ConstraintLayout&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;&amp;lt;!--&amp;nbsp;&amp;nbsp;BottomSheet&amp;nbsp;&amp;nbsp;--&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066be0;&quot;&gt;LinearLayout&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;android:id&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;@+id/ll_main_bottom_sheet&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;android:layout_width&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;match_parent&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;android:layout_height&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;match_parent&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;android:orientation&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;vertical&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;android:background&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;#66A9EC&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;app:behavior_hideable&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;true&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;app:behavior_peekHeight&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;50dp&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;app:layout_behavior&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;com.google.android.material.bottomsheet.BottomSheetBehavior&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066be0;&quot;&gt;TextView&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;android:id&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;@+id/tv_main_bottom_sheet_title&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;android:layout_width&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;match_parent&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;android:layout_height&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;50dp&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;android:gravity&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;center&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;android:text&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;TODO&amp;nbsp;List&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;android:textSize&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;20dp&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;android:textColor&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;@android:color/black&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;android:textStyle&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;bold&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #066be0;&quot;&gt;androidx.recyclerview.widget.RecyclerView&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;android:id&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;@+id/rv_main_bottom_sheet&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;android:layout_width&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;match_parent&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;android:layout_height&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;wrap_content&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;android:layout_marginTop&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;20dp&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;android:paddingBottom&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;20dp&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;android:clipToPadding&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;false&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0a9989;&quot;&gt;app:layoutManager&lt;/span&gt;=&lt;span style=&quot;color: #e05200;&quot;&gt;&quot;androidx.recyclerview.widget.LinearLayoutManager&quot;&lt;/span&gt;&lt;span style=&quot;color: #0a9989;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066be0;&quot;&gt;LinearLayout&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #066be0;&quot;&gt;androidx.coordinatorlayout.widget.CoordinatorLayout&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&lt;a style=&quot;color: #4f4f4ftext-decoration:none;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;behavior_hideable &lt;/b&gt;: 완전하게 숨길 수 있을지 없을지를 정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;behavior_peekHeight&lt;/b&gt; : 최소 높이를 정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;layout_behavior&lt;/b&gt; : 행동을 정한다. 물론 BottomSheet을 만들기 위해서이기 때문이니&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; com.google.android.material.bottomsheet.BottomSheetBehavior로 값을 넣어준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;MainActivity.kt&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #e6dada; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #181818; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #e6dada; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;class&lt;/span&gt;&amp;nbsp;MainActivity&amp;nbsp;:&amp;nbsp;AppCompatActivity()&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;override&amp;nbsp;fun&amp;nbsp;onCreate(savedInstanceState:&amp;nbsp;Bundle?)&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;super&lt;/span&gt;.onCreate(savedInstanceState)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setContentView(R.layout.activity_main)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;initViews()&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;private&lt;/span&gt;&amp;nbsp;fun&amp;nbsp;initViews()&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rv_main_bottom_sheet.adapter&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;TodoRecyclerAdapter&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;Toast.makeText(&lt;span style=&quot;color: #d55a06;&quot;&gt;this&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #1cae0c;&quot;&gt;&quot;$it&amp;nbsp;clicked&quot;&lt;/span&gt;,&amp;nbsp;Toast.LENGTH_SHORT).show()&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;hideBottomSheet()&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}.apply&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;updateDataSet(sample)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tv_main_bottom_sheet_title.setOnClickListener&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;showBottomSheet()&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;private&lt;/span&gt;&amp;nbsp;fun&amp;nbsp;showBottomSheet()&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BottomSheetBehavior.from(ll_main_bottom_sheet).let&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;&lt;span style=&quot;color: #d55a06;&quot;&gt;if&lt;/span&gt;&amp;nbsp;(it.state&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;BottomSheetBehavior.STATE_EXPANDED)&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;it.state&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;BottomSheetBehavior.STATE_EXPANDED&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;private&lt;/span&gt;&amp;nbsp;fun&amp;nbsp;hideBottomSheet()&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BottomSheetBehavior.from(ll_main_bottom_sheet).let&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;&lt;span style=&quot;color: #d55a06;&quot;&gt;if&lt;/span&gt;&amp;nbsp;(it.state&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;BottomSheetBehavior.STATE_COLLAPSED)&amp;nbsp;{&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;it.state&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;BottomSheetBehavior.STATE_COLLAPSED&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&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;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #d55a06;&quot;&gt;private&lt;/span&gt;&amp;nbsp;val&amp;nbsp;sample&amp;nbsp;&lt;span style=&quot;color: #8a19df;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #d55a06;&quot;&gt;=&lt;/span&gt;&amp;nbsp;IntRange(&lt;span style=&quot;color: #0099cc;&quot;&gt;0&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #0099cc;&quot;&gt;20&lt;/span&gt;).map&amp;nbsp;{&amp;nbsp;&lt;span style=&quot;color: #1cae0c;&quot;&gt;&quot;Job&amp;nbsp;$it&quot;&lt;/span&gt;&amp;nbsp;}.toList()&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;}&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&lt;a style=&quot;color: #4f4f4ftext-decoration:none;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;기본적으로 드래그 액션을 통해서 BottomSheet을 제어할 수 있지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;코드를 통해서 특정상황에 확장하거나 줄일 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Android/UI</category>
      <author>날아갔나요</author>
      <guid isPermaLink="true">https://jhpop.tistory.com/150</guid>
      <comments>https://jhpop.tistory.com/150#entry150comment</comments>
      <pubDate>Mon, 10 Aug 2020 14:51:11 +0900</pubDate>
    </item>
    <item>
      <title>서버알못의 스프링부트 프로젝트 만들기</title>
      <link>https://jhpop.tistory.com/135</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;SpringBoot&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;스프링을 사용하기 위한 라이브러리 모음&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;IntelliJ Ultimate를 사용한다면 New Project로 바로 스프링부트 프로젝트를 만들 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;하지만 Ultimate는 1년에 149$의 사용료가 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;대학생의 경우 학교 이메일을 통해 무료로 제공하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;IntelliJ Community&lt;/b&gt;에서도 &lt;b&gt;스프링부트&lt;/b&gt;를 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다만 gradle설정이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;생각보다 간단하니 무리해서 Ultimate를 살필요가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdYcgk/btqE14DzLe9/JKKqnRGFAEYpsLmX7lnh6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdYcgk/btqE14DzLe9/JKKqnRGFAEYpsLmX7lnh6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdYcgk/btqE14DzLe9/JKKqnRGFAEYpsLmX7lnh6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdYcgk%2FbtqE14DzLe9%2FJKKqnRGFAEYpsLmX7lnh6K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;본 포스팅의 목표는 간단하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;InteilliJ Community에서 위 사진의 스프링을 보는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;EmptyProject를 만들자&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwj0ue/btqE14XVmBK/gShQy2BAH5KJ7cQiOnErcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwj0ue/btqE14XVmBK/gShQy2BAH5KJ7cQiOnErcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwj0ue/btqE14XVmBK/gShQy2BAH5KJ7cQiOnErcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdwj0ue%2FbtqE14XVmBK%2FgShQy2BAH5KJ7cQiOnErcK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;New Project에서 Empty Project를 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7G1Vh/btqE3ds4RbB/OQ3NIKh7QhMVitTTJMlmd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7G1Vh/btqE3ds4RbB/OQ3NIKh7QhMVitTTJMlmd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7G1Vh/btqE3ds4RbB/OQ3NIKh7QhMVitTTJMlmd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7G1Vh%2FbtqE3ds4RbB%2FOQ3NIKh7QhMVitTTJMlmd1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프로젝트 이름을 설정하고 완료한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;스프링부트 프로젝트를 위한 설정파일을 만들자&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;스프링 사이트에서 스프링부트 설정파일들을 만들 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://start.spring.io/&quot;&gt;https://start.spring.io/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqCILZ/btqE407ntav/oJGMDp7rY5s1tOCj9UaCl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqCILZ/btqE407ntav/oJGMDp7rY5s1tOCj9UaCl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqCILZ/btqE407ntav/oJGMDp7rY5s1tOCj9UaCl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqCILZ%2FbtqE407ntav%2FoJGMDp7rY5s1tOCj9UaCl0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. Maven을 사용할지 Gradle을 사용할지 고른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. 언어를 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. 버전을 선택하자. (버전에 대해서는 잘 몰른다. default가 stable한 버전일 것이라 생각해 그래로 두었다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4. Group에 패키지를 입력하고 Artifact에 프로젝트 이름을 쓴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;5. 자바 버전을 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;6. 사용할 라이브러리들을 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Lombok의 경우 플러그인을 설치해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;JUnit은 JUnit5로 설정되니 JUnit4을 사용하고 싶다면 depency를 따로 추가해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;EXPLORE를 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N9VoM/btqE1upc0y2/GlHdpUDZGcVCIy2dzAfts0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N9VoM/btqE1upc0y2/GlHdpUDZGcVCIy2dzAfts0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N9VoM/btqE1upc0y2/GlHdpUDZGcVCIy2dzAfts0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN9VoM%2FbtqE1upc0y2%2FGlHdpUDZGcVCIy2dzAfts0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그러면 위의 사진같이 패키지 구조를 어떻게 설정할지 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;DOWNLOAD해서 패키지를 다운받고 압축을 푼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;사실 여기서 중요한 것은 gradle 파일이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위에서 Empty Project 대신 gradle 프로젝트를 만들고 gradle을 설정해도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다만 gitignore나 SpringApplication을 따로 만들어야 하고 gradle 버전이 맞지 않으면 설정해야하는 등 다운받는게 더 간단한 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;스프링부트 구조를 프로젝트에 적용하자&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bL2YME/btqE1v9ujCc/sprvmxXAJxjCbzODHCPSb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bL2YME/btqE1v9ujCc/sprvmxXAJxjCbzODHCPSb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bL2YME/btqE1v9ujCc/sprvmxXAJxjCbzODHCPSb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbL2YME%2FbtqE1v9ujCc%2FsprvmxXAJxjCbzODHCPSb0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;New - Module from existing sources...&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다운받은 패키지를 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Q8EHO/btqE1C1GyBC/wlXkKyyIZRSvE2M9KF0uX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Q8EHO/btqE1C1GyBC/wlXkKyyIZRSvE2M9KF0uX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Q8EHO/btqE1C1GyBC/wlXkKyyIZRSvE2M9KF0uX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQ8EHO%2FbtqE1C1GyBC%2FwlXkKyyIZRSvE2M9KF0uX0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;해당하는 것을 선택하고 완료한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cv3cHy/btqE4DkiHus/iZCEsAwcb2dZW4ffNVmGC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cv3cHy/btqE4DkiHus/iZCEsAwcb2dZW4ffNVmGC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cv3cHy/btqE4DkiHus/iZCEsAwcb2dZW4ffNVmGC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcv3cHy%2FbtqE4DkiHus%2FiZCEsAwcb2dZW4ffNVmGC0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위에서 본 패키지 구조대로 설정된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vL6hw/btqE1D0ugpc/YfbeB8ejgx2Rx6Uewsu4Ak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vL6hw/btqE1D0ugpc/YfbeB8ejgx2Rx6Uewsu4Ak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vL6hw/btqE1D0ugpc/YfbeB8ejgx2Rx6Uewsu4Ak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvL6hw%2FbtqE1D0ugpc%2FYfbeB8ejgx2Rx6Uewsu4Ak%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프로젝트이름이 들어간 Application 파일에 main function을 실행시켜보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그럼 우리의 목표인 스프링을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;목표는 완료했지만 브라우저에서도 볼 수 있는 것을 만들어 보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dyMqwt/btqE4Dq7cxh/9WjWO0zVa3wRLKeIqO60O0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dyMqwt/btqE4Dq7cxh/9WjWO0zVa3wRLKeIqO60O0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dyMqwt/btqE4Dq7cxh/9WjWO0zVa3wRLKeIqO60O0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdyMqwt%2FbtqE4Dq7cxh%2F9WjWO0zVa3wRLKeIqO60O0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;아직 정확히 어떤 것이지 모르지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;GetMapping을 통해 RestAPI 같다는 느낌이 든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Annotation으로 GetMapping 외에서 PostMapping, PutMapping, DeleteMapping이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRXvab/btqE32dPtmF/Eq0nMKKtovJSmkeWekPry0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRXvab/btqE32dPtmF/Eq0nMKKtovJSmkeWekPry0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRXvab/btqE32dPtmF/Eq0nMKKtovJSmkeWekPry0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRXvab%2FbtqE32dPtmF%2FEq0nMKKtovJSmkeWekPry0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;브라우저에서 localhost:8080/hello로 접근하면 위와같은 결과화면을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Server</category>
      <author>날아갔나요</author>
      <guid isPermaLink="true">https://jhpop.tistory.com/135</guid>
      <comments>https://jhpop.tistory.com/135#entry135comment</comments>
      <pubDate>Mon, 22 Jun 2020 21:38:21 +0900</pubDate>
    </item>
    <item>
      <title>Android 11 beta</title>
      <link>https://jhpop.tistory.com/134</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqVh0T/btqE0QyW5Hw/P5KctuCbktsiuForCczkr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqVh0T/btqE0QyW5Hw/P5KctuCbktsiuForCczkr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqVh0T/btqE0QyW5Hw/P5KctuCbktsiuForCczkr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqVh0T%2FbtqE0QyW5Hw%2FP5KctuCbktsiuForCczkr0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프리뷰 홈&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://developer.android.com/preview&quot;&gt;https://developer.android.com/preview&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1592796704476&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Android 개발자 &amp;nbsp;|&amp;nbsp; Android Developers&quot; data-og-description=&quot;테스트, 개발 및 의견 제공을 위해 Android 차기 버전을 미리 살펴봅니다.&quot; data-og-host=&quot;developer.android.com&quot; data-og-source-url=&quot;https://developer.android.com/preview&quot; data-og-url=&quot;https://developer.android.com/preview?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ctLNY0/hyGvpYhOUA/m1Y2SuN01QEg4FRnVyCjh1/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676&quot;&gt;&lt;a href=&quot;https://developer.android.com/preview&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.android.com/preview&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ctLNY0/hyGvpYhOUA/m1Y2SuN01QEg4FRnVyCjh1/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Android 개발자 &amp;nbsp;|&amp;nbsp; Android Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;테스트, 개발 및 의견 제공을 위해 Android 차기 버전을 미리 살펴봅니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;developer.android.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/fnkFOhA7FC4&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;Component Changing&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Window Insets&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;IME Animation&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;IME를 에니메이션을 커스텀해 좀 더 뷰와 interaction한 UI를 만들 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Insets에서 IME에 대한 정보를 통해 동기화된 UI를 만들 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Conversations&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;기본적인 Notification이 아닌 Conversation을 통해 커뮤니케이션이 필요한 내용을 따로 관리하고 더 많은 정보를 보여줄 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Bubbles&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;커뮤니케이션을 하기위한 depth를 줄일 수 있는 컴포넌트&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;기존에는 개발자 모드에서 사용할 수 있는 기능이었지만 11부터는 모든 사용자가 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;Privacy&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Data Access Auditing&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;One-Time Permission&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;기존의 지속적인 권한허용이 아닌 1회용 권한허용 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Background Location&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;11에서는 더욱 제한적&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;우선 포그라운드에서 권한을 허용해야하고 백그라운드에서 사용하기 위해서는 한번 더 설정창(앱 내부가 아닌)에서 허용해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Package visibility restrictions&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;패키지에 접근하기 위해서는 메니페스트 설정이 필요한듯 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Scoped Storage&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;MedialStore API로 편집하는 기능이 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Auto-reset permissions&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;앱을 오랜기간 사용하지 않는다면 권한 설정이 초기화될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;Utility for Developer&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Wi-Fi Debugging&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;현재는 수동으로 설정해야 하지만 Canry에서는 도구를 이용해 접근이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Nullability Annotations&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;@RecentlyNullable, @RecentlyNonNull makes Warnings&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;@Nullable, @NonNull makes Errors&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Crash Reasons Reporting&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;앱에 문제가 생겼을 때 더 자세한 정보를 얻을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;GWP-ASan&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;HWASan in Andorid10&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;ADB Incremental&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;용량이 큰 앱을 위해 10배 더 빠른 설치가 가능하게 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;Graphics &amp;amp; Media&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;NDK Image Decoder&lt;/b&gt; 해독기를 직접 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Animated HEIF&lt;/b&gt; GIF보다 가벼운 HEIF를 디코딩하여 에니메이션이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;OpenSL ES&lt;/b&gt; deprecated -&amp;gt; Oboe&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Neural Networks API&lt;/b&gt; 머신러닝을 위한 API&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;5G&lt;/b&gt; 코드를 통해 네트워크가 5G를 지원하는 상황인지에 대한 결정할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Autofill/Keyboard Integration&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;Jetpack&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Hilt&lt;/b&gt; : Dagger에 설치된 의존성 라이브러리, DI 작업에 권장하는 새로운 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Paging&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;CameraX beta&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Compose pre-alpha version&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;Android Studio&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;4.0 : Stable&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Motion Editor&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;LayoutInspector&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;4.1 : Beta&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;DatabaseInspector(Room, SQLite) 기존의 다운로드 받아서 확인해야했던 방식에서 도구로 내장되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;4.2 : Canary&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Wireless debugging with Android11&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Jetpack Compose development&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;Google Play&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;New Play console beta&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://play.google.com/apps/&quot;&gt;https://play.google.com/apps/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1592804091463&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;로그인 - Google 계정&quot; data-og-description=&quot;하나의 계정으로 모든 Google 서비스를 Google 계정으로 로그인&quot; data-og-host=&quot;accounts.google.com&quot; data-og-source-url=&quot;https://play.google.com/apps/&quot; data-og-url=&quot;https://accounts.google.com/ServiceLogin?passive=1209600&amp;amp;continue=https://play.google.com/apps/&amp;amp;followup=https://play.google.com/apps/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://play.google.com/apps/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://play.google.com/apps/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;로그인 - Google 계정&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;하나의 계정으로 모든 Google 서비스를 Google 계정으로 로그인&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;accounts.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;AndroidDevelopers Youtube&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위의 기본 소개영상 외에 분야별 영상들도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://www.youtube.com/c/AndroidDevelopers/videos&quot;&gt;https://www.youtube.com/c/AndroidDevelopers/videos&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1592797021670&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;profile&quot; data-og-title=&quot;Android Developers&quot; data-og-description=&quot;Welcome to the official Android Developers YouTube channel. Get the latest Android news, best practices, live videos, demonstrations, tutorials, and more. Su...&quot; data-og-host=&quot;www.youtube.com&quot; data-og-source-url=&quot;https://www.youtube.com/c/AndroidDevelopers/videos&quot; data-og-url=&quot;https://www.youtube.com/channel/UCVHFbqXqoYvEWM1Ddxl0QDg&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Byoy6/hyGvqCRWAW/kUdBvw7qeO3Mi9G3pKp841/img.jpg?width=900&amp;amp;height=900&amp;amp;face=0_0_900_900,https://scrap.kakaocdn.net/dn/bthsr2/hyGvvqDKTA/jtkzKAxBbOq0AIrBVYUox0/img.jpg?width=900&amp;amp;height=900&amp;amp;face=0_0_900_900&quot;&gt;&lt;a href=&quot;https://www.youtube.com/c/AndroidDevelopers/videos&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.youtube.com/c/AndroidDevelopers/videos&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Byoy6/hyGvqCRWAW/kUdBvw7qeO3Mi9G3pKp841/img.jpg?width=900&amp;amp;height=900&amp;amp;face=0_0_900_900,https://scrap.kakaocdn.net/dn/bthsr2/hyGvvqDKTA/jtkzKAxBbOq0AIrBVYUox0/img.jpg?width=900&amp;amp;height=900&amp;amp;face=0_0_900_900');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Android Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Welcome to the official Android Developers YouTube channel. Get the latest Android news, best practices, live videos, demonstrations, tutorials, and more. Su...&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.youtube.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Android/Version</category>
      <author>날아갔나요</author>
      <guid isPermaLink="true">https://jhpop.tistory.com/134</guid>
      <comments>https://jhpop.tistory.com/134#entry134comment</comments>
      <pubDate>Mon, 22 Jun 2020 12:47:33 +0900</pubDate>
    </item>
    <item>
      <title>수명주기; Lifecycle</title>
      <link>https://jhpop.tistory.com/133</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이름 그대로 인스턴스가&lt;b&gt; 만들어진 순간&lt;/b&gt;부터 &lt;b&gt;소멸하는 순간&lt;/b&gt;까지의 루틴을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;중요하고 반복적으로 발생하는 상황&lt;/b&gt;에 대한 처리를 위해 만들어졌다고 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;수명주기는 보통 많은 리소스를 가지고 있는 컴포넌트들이 가지고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그렇기 때문에 컴포넌트의 상태에 따라 필요없어지는 리소스 해제를 통해 가용공간을 늘리거나 컴포넌트의 소멸시 리소스 해제를 통해 메모리 누수를 막을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;액티비티&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPq7Am/btqE2thDnq1/YMrW2P6ydeCxexZwez9Xy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPq7Am/btqE2thDnq1/YMrW2P6ydeCxexZwez9Xy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPq7Am/btqE2thDnq1/YMrW2P6ydeCxexZwez9Xy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPq7Am%2FbtqE2thDnq1%2FYMrW2P6ydeCxexZwez9Xy1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;onCreate / onDestroy : 액티비티가 생성되고 종료되는 순간에서의 처리&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;onStart / onStop : 액티비티가 조금이라도 화면에 보이는 순간과 보이지 않는 순간에서의 처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;onResume / onPause : 액티비티가 사용자와 상호작용을 할 수 있는 순간과 없는 순간에서의 처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;보통 위와 같이 짝으로 묶는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;할당과 해제, 시작과 종료가 필요한 조합이기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ko&quot;&gt;https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ko&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1592752849844&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Activity 수명 주기에 대한 이해 &amp;nbsp;|&amp;nbsp; Android 개발자 &amp;nbsp;|&amp;nbsp; Android Developers&quot; data-og-description=&quot;An Activity is an application component that provides a screen with which users can interact in order to do something, such as dial the phone, take a photo, send an email, or view a map. Each activity is given a window in which to draw its user interface��&quot; data-og-host=&quot;developer.android.com&quot; data-og-source-url=&quot;https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ko&quot; data-og-url=&quot;https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fktVW/hyGtV5bGbc/JYHczYSlkmdtCcOFDKGd4k/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676,https://scrap.kakaocdn.net/dn/bojnaj/hyGvtMKYaG/2U4lfPjM9KXXhJyEOHMNlK/img.png?width=513&amp;amp;height=663&amp;amp;face=0_0_513_663&quot;&gt;&lt;a href=&quot;https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fktVW/hyGtV5bGbc/JYHczYSlkmdtCcOFDKGd4k/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676,https://scrap.kakaocdn.net/dn/bojnaj/hyGvtMKYaG/2U4lfPjM9KXXhJyEOHMNlK/img.png?width=513&amp;amp;height=663&amp;amp;face=0_0_513_663');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Activity 수명 주기에 대한 이해 &amp;nbsp;|&amp;nbsp; Android 개발자 &amp;nbsp;|&amp;nbsp; Android Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;An Activity is an application component that provides a screen with which users can interact in order to do something, such as dial the phone, take a photo, send an email, or view a map. Each activity is given a window in which to draw its user interface��&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;developer.android.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;프래그먼트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bw5oJK/btqE2l5cXKb/SY3CRU26sxqcLgFZU8fMJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bw5oJK/btqE2l5cXKb/SY3CRU26sxqcLgFZU8fMJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bw5oJK/btqE2l5cXKb/SY3CRU26sxqcLgFZU8fMJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbw5oJK%2FbtqE2l5cXKb%2FSY3CRU26sxqcLgFZU8fMJ1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://developer.android.com/guide/components/fragments?hl=ko&quot;&gt;https://developer.android.com/guide/components/fragments?hl=ko&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1592752924374&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프래그먼트 &amp;nbsp;|&amp;nbsp; Android 개발자 &amp;nbsp;|&amp;nbsp; Android Developers&quot; data-og-description=&quot;A Fragment represents a behavior or a portion of user interface in an Activity. You can combine multiple fragments in a single activity to build a multi-pane UI and reuse a fragment in multiple activities. You can think of a fragment as a modular section��&quot; data-og-host=&quot;developer.android.com&quot; data-og-source-url=&quot;https://developer.android.com/guide/components/fragments?hl=ko&quot; data-og-url=&quot;https://developer.android.com/guide/components/fragments?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/sHu1q/hyGt0enCoB/BXr3GJV7f0hKVet3dSmO2k/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676,https://scrap.kakaocdn.net/dn/elh65K/hyGvu5YaCa/0l36LpKPn3eNUMcAgabr8K/img.png?width=317&amp;amp;height=847&amp;amp;face=0_0_317_847,https://scrap.kakaocdn.net/dn/dfBbrV/hyGvvRkU7Q/qdSn3aktjdjqmQz0t7rkX0/img.png?width=340&amp;amp;height=675&amp;amp;face=0_0_340_675&quot;&gt;&lt;a href=&quot;https://developer.android.com/guide/components/fragments?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.android.com/guide/components/fragments?hl=ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/sHu1q/hyGt0enCoB/BXr3GJV7f0hKVet3dSmO2k/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676,https://scrap.kakaocdn.net/dn/elh65K/hyGvu5YaCa/0l36LpKPn3eNUMcAgabr8K/img.png?width=317&amp;amp;height=847&amp;amp;face=0_0_317_847,https://scrap.kakaocdn.net/dn/dfBbrV/hyGvvRkU7Q/qdSn3aktjdjqmQz0t7rkX0/img.png?width=340&amp;amp;height=675&amp;amp;face=0_0_340_675');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;프래그먼트 &amp;nbsp;|&amp;nbsp; Android 개발자 &amp;nbsp;|&amp;nbsp; Android Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;A Fragment represents a behavior or a portion of user interface in an Activity. You can combine multiple fragments in a single activity to build a multi-pane UI and reuse a fragment in multiple activities. You can think of a fragment as a modular section��&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;developer.android.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;뷰&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;그림2.png&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;889&quot; width=&quot;500&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzkYfF/btqE2mpuFnJ/xbisrgvGZ043fp902P1kF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzkYfF/btqE2mpuFnJ/xbisrgvGZ043fp902P1kF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzkYfF/btqE2mpuFnJ/xbisrgvGZ043fp902P1kF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdzkYfF%2FbtqE2mpuFnJ%2FxbisrgvGZ043fp902P1kF0%2Fimg.png&quot; data-filename=&quot;그림2.png&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;889&quot; width=&quot;500&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://www.charlezz.com/?p=29013&quot;&gt;https://www.charlezz.com/?p=29013&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1592756102480&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Android에서 View의&amp;nbsp;생명주기 | 찰스의 안드로이드&quot; data-og-description=&quot;https://proandroiddev.com/the-life-cycle-of-a-view-in-android-6a2c4665b95e을 번역한 내용입니다. 안드로이드 앱을 실행할 때 우리가 가장 먼저 스크린에서 볼 수 있는 것이 View라고 말할 수 있다. View 클래스는 사�&quot; data-og-host=&quot;www.charlezz.com&quot; data-og-source-url=&quot;https://www.charlezz.com/?p=29013&quot; data-og-url=&quot;https://www.charlezz.com/?p=29013&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bYMkFB/hyGtPqpUHd/K8pLOXovKr3irBceLORDQk/img.png?width=1365&amp;amp;height=1179&amp;amp;face=0_0_1365_1179,https://scrap.kakaocdn.net/dn/ovjmU/hyGtYAQSy5/jnTWm8GdNrqM55dINAzdKk/img.png?width=516&amp;amp;height=716&amp;amp;face=0_0_516_716,https://scrap.kakaocdn.net/dn/byxtJj/hyGtXBV7Mh/YW9k14mKDxdO5iSvrJn4k0/img.png?width=1600&amp;amp;height=200&amp;amp;face=0_0_1600_200&quot;&gt;&lt;a href=&quot;https://www.charlezz.com/?p=29013&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.charlezz.com/?p=29013&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bYMkFB/hyGtPqpUHd/K8pLOXovKr3irBceLORDQk/img.png?width=1365&amp;amp;height=1179&amp;amp;face=0_0_1365_1179,https://scrap.kakaocdn.net/dn/ovjmU/hyGtYAQSy5/jnTWm8GdNrqM55dINAzdKk/img.png?width=516&amp;amp;height=716&amp;amp;face=0_0_516_716,https://scrap.kakaocdn.net/dn/byxtJj/hyGtXBV7Mh/YW9k14mKDxdO5iSvrJn4k0/img.png?width=1600&amp;amp;height=200&amp;amp;face=0_0_1600_200');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Android에서 View의&amp;nbsp;생명주기 | 찰스의 안드로이드&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;https://proandroiddev.com/the-life-cycle-of-a-view-in-android-6a2c4665b95e을 번역한 내용입니다. 안드로이드 앱을 실행할 때 우리가 가장 먼저 스크린에서 볼 수 있는 것이 View라고 말할 수 있다. View 클래스는 사�&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.charlezz.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://hyeonu1258.github.io/2018/03/26/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C%20%EB%A9%B4%EC%A0%91/&quot;&gt;https://hyeonu1258.github.io/2018/03/26/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C%20%EB%A9%B4%EC%A0%91/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1592756093750&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;안드로이드 면접 | 현우의 개발노트&quot; data-og-description=&quot;View가 그려지는 과정 뷰는 포커스를 얻으면 레이아웃을 그리도록 요청한다. 이때 레이아웃의 계층구조 중 루트 뷰를 제공해야한다. 따라서 그리기는 루트노드에서 시작되어 트리를 따라 전위 ��&quot; data-og-host=&quot;hyeonu1258.github.io&quot; data-og-source-url=&quot;https://hyeonu1258.github.io/2018/03/26/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C%20%EB%A9%B4%EC%A0%91/&quot; data-og-url=&quot;https://hyeonu1258.github.io/2018/03/26/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C%20%EB%A9%B4%EC%A0%91/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bv6Dki/hyGtVD7Y4I/R9wYbEfY1aksLgN9zNC9RK/img.png?width=692&amp;amp;height=611&amp;amp;face=0_0_692_611,https://scrap.kakaocdn.net/dn/btusPP/hyGvCJIzT3/yVrgHJ8M8dg6jR601MNK1K/img.png?width=700&amp;amp;height=260&amp;amp;face=0_0_700_260,https://scrap.kakaocdn.net/dn/i1ZdC/hyGvn6Rhb4/E6gVSyGLqjEIp2HscamTQ1/img.png?width=700&amp;amp;height=260&amp;amp;face=0_0_700_260&quot;&gt;&lt;a href=&quot;https://hyeonu1258.github.io/2018/03/26/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C%20%EB%A9%B4%EC%A0%91/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hyeonu1258.github.io/2018/03/26/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C%20%EB%A9%B4%EC%A0%91/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bv6Dki/hyGtVD7Y4I/R9wYbEfY1aksLgN9zNC9RK/img.png?width=692&amp;amp;height=611&amp;amp;face=0_0_692_611,https://scrap.kakaocdn.net/dn/btusPP/hyGvCJIzT3/yVrgHJ8M8dg6jR601MNK1K/img.png?width=700&amp;amp;height=260&amp;amp;face=0_0_700_260,https://scrap.kakaocdn.net/dn/i1ZdC/hyGvn6Rhb4/E6gVSyGLqjEIp2HscamTQ1/img.png?width=700&amp;amp;height=260&amp;amp;face=0_0_700_260');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;안드로이드 면접 | 현우의 개발노트&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;View가 그려지는 과정 뷰는 포커스를 얻으면 레이아웃을 그리도록 요청한다. 이때 레이아웃의 계층구조 중 루트 뷰를 제공해야한다. 따라서 그리기는 루트노드에서 시작되어 트리를 따라 전위 ��&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;hyeonu1258.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Android/Common</category>
      <author>날아갔나요</author>
      <guid isPermaLink="true">https://jhpop.tistory.com/133</guid>
      <comments>https://jhpop.tistory.com/133#entry133comment</comments>
      <pubDate>Mon, 22 Jun 2020 01:25:53 +0900</pubDate>
    </item>
    <item>
      <title>암호화와 해시</title>
      <link>https://jhpop.tistory.com/131</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qbTVf/btqE0xqyvc9/cyIpR0KkTIPLJwoAzrDr10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qbTVf/btqE0xqyvc9/cyIpR0KkTIPLJwoAzrDr10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qbTVf/btqE0xqyvc9/cyIpR0KkTIPLJwoAzrDr10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqbTVf%2FbtqE0xqyvc9%2FcyIpR0KkTIPLJwoAzrDr10%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;안드로이드를 하다보면 &lt;b&gt;MD5, SHA1, SHA-256&lt;/b&gt;과 같은 것들을 필연적으로 접하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;릴리즈 APK를 만들 때 &lt;b&gt;.jks&lt;/b&gt; 확장자인 키스토어가 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;AWS 서버를 만들면 확장자가 &lt;b&gt;pem&lt;/b&gt;인 파일을 받아야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;공인인증서는 &lt;b&gt;.der, .pfx&lt;/b&gt;와 같은 확장자로 쓰인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위에 것들을 무엇인지 알기 위해서는 &lt;b&gt;해시함수, 대칭키, 공개키, 인증서&lt;/b&gt; 등을 알아야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;간략하게 각각의 목적을 보자면&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;해시함수&lt;/b&gt;는 유일하게 식별할 수 있는 값을 만드는 함수이고&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;대칭키와 공개키&lt;/b&gt;는 데이터를 안전하게 전달하기 위해 암복호화를 위해 만들어졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;인증서&lt;/b&gt;는 자신을 증명하기 위해 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해시함수&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;대상을 식별할 수 있는 &lt;b&gt;해시값을 만드는 함수&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;해시값의 크기와 해시함수에 따라 충돌이 일어날 수도 있지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;사용하는 대부분의 알고리즘은 &lt;b&gt;유일하게 식별&lt;/b&gt;할 수 있게 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;해시의 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. HashMap과 같이 대상을 찾기 위한 &lt;b&gt;키값&lt;/b&gt;으로 사용&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. 원본 데이터를 보장하기 위한 &lt;b&gt;체크섬&lt;/b&gt;으로 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;MD5(Message-Digest algorithm 5)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;128비트 암호화 해시 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;주로 프로그램이나 파일이 원본 그대로인지를 확인하는 무결성 검사 등에 사용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;임의의 길이의 메시지를 입력받아, 128비트짜리 고정 길이의 출력값을 낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;현재는 결함으로 인해 보안관련 용도로 쓰이는 것을 권장하지 않음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;SHA(Secure Hash Alogorithm)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;암호화 해시 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;최초의 SHA 알고리즘을 SHA-0라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;SHA-1은 SHA-0의 변형으로&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;TLS, SSL, PGP, SSH 등 많은 보안 프로토콜과 프로그램에 사용&lt;/span&gt;된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;SHA-2 4종류의 변형(SHA-224, SHA-256, SHA-384, SHA-512) 통칭&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;암호화&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&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;p data-ke-size=&quot;size18&quot;&gt;암호화와 복호화에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;하나의 키&lt;/b&gt;를 사용하는 암호화 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;하나의 키를 사용하기 때문에 키 노출시 암호화가 무의미해진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;DES, 3DES, AES...&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;DES(Data Encryption Standard)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;블록 암호의 일종, 미국 NBS에서 국가 표준으로 정한 암호&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;56비트의 키를 사용&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3DES :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;DES를 세번 중첩해 만듬&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;AES(Andvanced Ecryption Standard)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;DES를 대체해서 사용 중이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;비대칭키(공개키)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;암호화는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;공개키&lt;/b&gt;를, 복호화는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;비밀키&lt;/b&gt;를 사용하는 암호화 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;누구나 암호화할 수 있지만 내용은 비밀키를 가지고 있는 사람만 볼 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;대칭키와 비교하면 매우 오래 걸린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;RSA...&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;RSA&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1024, 2048 비트의 키를 사용하며 소인수 분해를 이용한 암호화 알고리즘&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;기존의 알고있던 비대칭키와 반대로 비밀키로 암호화하고 공개키로 복호화가 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;비밀키를 암호화에 사용하면 나만 암호문을 만들 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그렇기 때문에 전자서명의 용도로 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;비밀키를 복호화에 사용하면 나만 상대의 암호문을 읽을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;서버에서 공개키를 공유하고 유저들이 암호화한 값을 복호화하여 서버만 데이터를 볼 수 있도록 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;암호화 사용법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;A와 B가 통신하고 싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;대칭키 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. 대칭키를 사용한다면 한쪽에서 우선 대칭키를 보내고&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. 서로 대칭키를 이용해 암호화 복호화하며 통신한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Problem. 대칭키를 보내는 과정에서 키가 노출될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;공개키 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. 공개키의 경우 서로 공개키만 전달한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. 서로의 공개키로 암호화해서 전달한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. 전달받은 데이터를 각자의 개인키로 복호화 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Problem. 공개키 방식은 대칭키에 비해 속도가 현저하게 느리다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;대칭키 + 공개키 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. 서로에게 공개키를 보낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. 한쪽에서 공개키로 대칭키를 암호화해서 전달한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. 다른 한쪽은 개인키로 복호화해 대칭키를 얻는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;대칭키를 암호화해서 보내기 때문에 대칭키가 노출되지 않고&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;대칭키를 통해 통신함으로 좋은 성능을 얻을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;SSL 암호화 방식&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;대칭키 + 공개키를 사용해 통신에 문제가 생겼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;공개키를 얻는 과정 중 외부의 악의적(해커) 행위로 인해 공개키를 신뢰할 수 없게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;기본적으로 위의 대칭키 + 공개키 방식을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;공개키를 전달하는 과정이 복잡해졌을 뿐이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;공개키를 인증기관에 전달해 공개키를 포함한 인증서를 만들어&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;전달하여 공개키에 대한 신뢰성을 높였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;500&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCq9Ck/btqE2uUTMRS/8cbLUTeswZuunfmIzoYfKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCq9Ck/btqE2uUTMRS/8cbLUTeswZuunfmIzoYfKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCq9Ck/btqE2uUTMRS/8cbLUTeswZuunfmIzoYfKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCq9Ck%2FbtqE2uUTMRS%2F8cbLUTeswZuunfmIzoYfKK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;500&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. 사이트는 &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;사이트의 공개키&lt;/b&gt;&lt;/span&gt;를 &lt;b&gt;CA(인증기관)&lt;/b&gt;에 등록한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;사이트의 공개키&lt;/b&gt;&lt;/span&gt;를 &lt;b&gt;해싱&lt;/b&gt;하고 &lt;b&gt;CA의 비밀키로 암호화&lt;/b&gt;한다. 이 암호화값을 &lt;b&gt;디지털 서명&lt;/b&gt;이라고 한다. 그리고 발급대상, 발급대상의 공개키, 발급자, 발급자의 서명(2번의 암호화한 값) 정보를 가지고 있는&amp;nbsp;&lt;b&gt;인증서&lt;/b&gt;를 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. 만들어진 인증서를 서버에 전달한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;400&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccYFDD/btqE0QywWil/mxKZ6WrWanD3l2Xg3gNVRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccYFDD/btqE0QywWil/mxKZ6WrWanD3l2Xg3gNVRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccYFDD/btqE0QywWil/mxKZ6WrWanD3l2Xg3gNVRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccYFDD%2FbtqE0QywWil%2FmxKZ6WrWanD3l2Xg3gNVRK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;400&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4. 유저는 CA에서 &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;CA의 공개키&lt;/b&gt;&lt;/span&gt;를 받아 브라우저에 보관하고 있는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;5. 서버에 접속을 요청한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;6. 서버에서 인증서를 받는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;7. ( 인증서의 발급자 서명을 CA 공개키로 복호화한 값 )과 &lt;span style=&quot;color: #333333;&quot;&gt;( 인증서에 포함된 공개키를 해싱한 값 )을 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;비교해 동일하다면 신뢰성이 있는 공개키라고 판단&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;500&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVmneb/btqE0OHszBI/lT9zdKyUrpth1qXekUEsRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVmneb/btqE0OHszBI/lT9zdKyUrpth1qXekUEsRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVmneb/btqE0OHszBI/lT9zdKyUrpth1qXekUEsRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVmneb%2FbtqE0OHszBI%2FlT9zdKyUrpth1qXekUEsRk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;500&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;8. 인증서의 공개키를 이용해 &lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;대칭키&lt;/b&gt;&lt;/span&gt;를 암호화하고 싸이트는 복호화하여 대칭키를 얻는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;9. 대칭키를 이용해 통신한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;인증기관에 의해서 암호화하는 것은 암호화 대상을 숨기려는 의도보다는&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;인증기관의 공개키를 통해 복호화됨을 확인하여 신뢰성을 얻는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;SSL(Secure Sockets Layer)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;종단간 전송된 데이터를 암호화하여 인터넷 연결 보안을 유지하는 표준 기술&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;SSL 인증서 파일 포멧 종류로 .pem, .crt, .cer, .csr, .der, .pfx, .p12, .key, .jks 등의 포멧이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;TLS(Transport Layer Security)와 함께 거론되는데 방식은 동일하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;넷스케이프에서 SSL1.0, SSL2.0, SSL3.0까지 개발했고 SSL3.0을 기초로 IETF에서 만든 것이 TLS이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;현재는 SSL은 결함으로 인해 사용이 중지되었음으로 우리가 사용하는 SSL은 TLS이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;TLS를 SSL이라고 부르는 것에 대해 약간의 논란?이 있는 것 같아 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;정확히 알지는 못하지만 우분투를 리눅스라 부를지 우분투라 부를지정도의 문제라고 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;HTTP + SSL -&amp;gt; HTTPS&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;FTP + SSL + SFTP&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;인증서&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;공개키 + 비밀키 소유자 정보&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;b.png&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;622&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEyTU8/btqE0Qemt96/Hjv1RBHSJ7MGlCu0DPXUpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEyTU8/btqE0Qemt96/Hjv1RBHSJ7MGlCu0DPXUpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEyTU8/btqE0Qemt96/Hjv1RBHSJ7MGlCu0DPXUpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEyTU8%2FbtqE0Qemt96%2FHjv1RBHSJ7MGlCu0DPXUpK%2Fimg.png&quot; data-filename=&quot;b.png&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;622&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;인증서에 들어가는 내용&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;- 일련번호&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;- 소유자&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;- 서명 알고리즘&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;- 발행자&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;- 유효기간(시작)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;- 유효기간(끝)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;- 키 사용 목적&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;- 공인 키&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;- 서명 알고리즘&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;- 서명&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이해에 도움이 된 포스팅들&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://rsec.kr/?p=426&quot;&gt;https://rsec.kr/?p=426&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1592552749813&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;RSA 인증서 (Certification) 와 전자서명 (Digital Sign)의 원리&quot; data-og-description=&quot;공개키 비밀키로 이루어지는 RSA 알고리즘을 이해. 인증서에 포함된 공개키의 무결성을 보증하는 인증서 체인 (Certificate Chain) 에 대한 설명무결성 보증시 사용되는 해쉬 (지문, Finger Print) 와 전자&quot; data-og-host=&quot;rsec.kr&quot; data-og-source-url=&quot;https://rsec.kr/?p=426&quot; data-og-url=&quot;https://rsec.kr/?p=426&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bseXLy/hyGsFHM6pu/ak9rK9a4b6TDrPSfNAMwS1/img.jpg?width=1300&amp;amp;height=876&amp;amp;face=0_0_1300_876,https://scrap.kakaocdn.net/dn/fud7t/hyGtQnolQ5/shf3e5oPgFUOHCg9SoVKl0/img.jpg?width=680&amp;amp;height=458&amp;amp;face=0_0_680_458,https://scrap.kakaocdn.net/dn/4zoib/hyGtQt9raf/SS8q6Er7c86Gkkleia50E1/img.jpg?width=1300&amp;amp;height=876&amp;amp;face=0_0_1300_876&quot;&gt;&lt;a href=&quot;https://rsec.kr/?p=426&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://rsec.kr/?p=426&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bseXLy/hyGsFHM6pu/ak9rK9a4b6TDrPSfNAMwS1/img.jpg?width=1300&amp;amp;height=876&amp;amp;face=0_0_1300_876,https://scrap.kakaocdn.net/dn/fud7t/hyGtQnolQ5/shf3e5oPgFUOHCg9SoVKl0/img.jpg?width=680&amp;amp;height=458&amp;amp;face=0_0_680_458,https://scrap.kakaocdn.net/dn/4zoib/hyGtQt9raf/SS8q6Er7c86Gkkleia50E1/img.jpg?width=1300&amp;amp;height=876&amp;amp;face=0_0_1300_876');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;RSA 인증서 (Certification) 와 전자서명 (Digital Sign)의 원리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;공개키 비밀키로 이루어지는 RSA 알고리즘을 이해. 인증서에 포함된 공개키의 무결성을 보증하는 인증서 체인 (Certificate Chain) 에 대한 설명무결성 보증시 사용되는 해쉬 (지문, Finger Print) 와 전자&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;rsec.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;a href=&quot;https://preamtree.tistory.com/38&quot;&gt;https://preamtree.tistory.com/38&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1592736239380&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[IT 기술면접 준비자료] 대칭키, 공개키 방식과 SSL(TLS)&quot; data-og-description=&quot;&amp;nbsp;정보보호 관련 수업을 들으면, 가장 먼저 배우게 되는 내용이 SSL이다. 암호화의 기원, DES, AES와 같은 개요에 해당하는 내용은 생략하고, 바로 본론으로 들어가도록 하겠다. &amp;nbsp;대칭키(Symmetric Key) &quot; data-og-host=&quot;preamtree.tistory.com&quot; data-og-source-url=&quot;https://preamtree.tistory.com/38&quot; data-og-url=&quot;https://preamtree.tistory.com/38&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b0sH7W/hyGtYgnN6S/E2uLMPXraqBGoBI7c3eErK/img.gif?width=521&amp;amp;height=229&amp;amp;face=0_0_521_229,https://scrap.kakaocdn.net/dn/Vt3mK/hyGvzzguoP/uduC2XYDzI4Ow4ezyQHImK/img.gif?width=521&amp;amp;height=229&amp;amp;face=0_0_521_229,https://scrap.kakaocdn.net/dn/bAp1V4/hyGvqh1JOC/j8IFfunJe4dTguAh2o3j8k/img.gif?width=521&amp;amp;height=229&amp;amp;face=0_0_521_229&quot;&gt;&lt;a href=&quot;https://preamtree.tistory.com/38&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://preamtree.tistory.com/38&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b0sH7W/hyGtYgnN6S/E2uLMPXraqBGoBI7c3eErK/img.gif?width=521&amp;amp;height=229&amp;amp;face=0_0_521_229,https://scrap.kakaocdn.net/dn/Vt3mK/hyGvzzguoP/uduC2XYDzI4Ow4ezyQHImK/img.gif?width=521&amp;amp;height=229&amp;amp;face=0_0_521_229,https://scrap.kakaocdn.net/dn/bAp1V4/hyGvqh1JOC/j8IFfunJe4dTguAh2o3j8k/img.gif?width=521&amp;amp;height=229&amp;amp;face=0_0_521_229');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;[IT 기술면접 준비자료] 대칭키, 공개키 방식과 SSL(TLS)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;&amp;nbsp;정보보호 관련 수업을 들으면, 가장 먼저 배우게 되는 내용이 SSL이다. 암호화의 기원, DES, AES와 같은 개요에 해당하는 내용은 생략하고, 바로 본론으로 들어가도록 하겠다. &amp;nbsp;대칭키(Symmetric Key)&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;preamtree.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Common</category>
      <author>날아갔나요</author>
      <guid isPermaLink="true">https://jhpop.tistory.com/131</guid>
      <comments>https://jhpop.tistory.com/131#entry131comment</comments>
      <pubDate>Fri, 19 Jun 2020 18:17:35 +0900</pubDate>
    </item>
    <item>
      <title>서버알못의 AWS 설정2 - RDS</title>
      <link>https://jhpop.tistory.com/130</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;서버가 실행될 공간, 공간에 접근할 수 있는 방법. 서버에 접근할 수 있는 고정 IP가&amp;nbsp;준비되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;남은 것은 서버에서 없어서는 안될 &lt;b&gt;데이터베이스&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;RDS(Relational Database Service)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;콘솔에서 RDS를 검색하고 RDS 페이지로 간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;1. RDS 생성 시작.png&quot; data-origin-width=&quot;1889&quot; data-origin-height=&quot;849&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7E5D9/btqEXKxlWEQ/0FrhPY1E85u25mdjGruaCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7E5D9/btqEXKxlWEQ/0FrhPY1E85u25mdjGruaCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7E5D9/btqEXKxlWEQ/0FrhPY1E85u25mdjGruaCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7E5D9%2FbtqEXKxlWEQ%2F0FrhPY1E85u25mdjGruaCK%2Fimg.png&quot; data-filename=&quot;1. RDS 생성 시작.png&quot; data-origin-width=&quot;1889&quot; data-origin-height=&quot;849&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;데이터베이스 생성 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2. 데이터베이스 엔진 선택.png&quot; data-origin-width=&quot;1069&quot; data-origin-height=&quot;839&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOYHx7/btqEUGpPkwV/Gpqiy7Q9om9avFxRxkYWAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOYHx7/btqEUGpPkwV/Gpqiy7Q9om9avFxRxkYWAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOYHx7/btqEUGpPkwV/Gpqiy7Q9om9avFxRxkYWAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOYHx7%2FbtqEUGpPkwV%2FGpqiy7Q9om9avFxRxkYWAK%2Fimg.png&quot; data-filename=&quot;2. 데이터베이스 엔진 선택.png&quot; data-origin-width=&quot;1069&quot; data-origin-height=&quot;839&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;사용할 데이터베이스를 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프리티어로 가능한 엔진은 MySQL, MariaDB, PostgreSQL, Microsoft SQL Server이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;가능 엔진 중 원하는 엔진을 선택하면 될 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;3. 설정.png&quot; data-origin-width=&quot;1065&quot; data-origin-height=&quot;855&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfrG8Q/btqEWtb5l8o/TE1lEkuvbFJ3k5PwkKvk41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfrG8Q/btqEWtb5l8o/TE1lEkuvbFJ3k5PwkKvk41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfrG8Q/btqEWtb5l8o/TE1lEkuvbFJ3k5PwkKvk41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfrG8Q%2FbtqEWtb5l8o%2FTE1lEkuvbFJ3k5PwkKvk41%2Fimg.png&quot; data-filename=&quot;3. 설정.png&quot; data-origin-width=&quot;1065&quot; data-origin-height=&quot;855&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프리티어가 가능한 엔진에 한해 프리티어를 선택할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;DB 인스턴스 식별자에는 말그대로 식별할 수 있는 이름을 넣어준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;DB에 접근할 아이디와 비밀번호를 설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;4. 인스턴스 크기 스토리지.png&quot; data-origin-width=&quot;1049&quot; data-origin-height=&quot;851&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSQL3F/btqEWsc7kEb/lTEVANng4DUfk6iXgibL20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSQL3F/btqEWsc7kEb/lTEVANng4DUfk6iXgibL20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSQL3F/btqEWsc7kEb/lTEVANng4DUfk6iXgibL20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSQL3F%2FbtqEWsc7kEb%2FlTEVANng4DUfk6iXgibL20%2Fimg.png&quot; data-filename=&quot;4. 인스턴스 크기 스토리지.png&quot; data-origin-width=&quot;1049&quot; data-origin-height=&quot;851&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프리티어로 가능한 20기가로 설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;5. 연결.png&quot; data-origin-width=&quot;1145&quot; data-origin-height=&quot;853&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bc5f1D/btqEYHGVqlw/JkS7LACFJRNARTpgZSy8q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bc5f1D/btqEYHGVqlw/JkS7LACFJRNARTpgZSy8q0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bc5f1D/btqEYHGVqlw/JkS7LACFJRNARTpgZSy8q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbc5f1D%2FbtqEYHGVqlw%2FJkS7LACFJRNARTpgZSy8q0%2Fimg.png&quot; data-filename=&quot;5. 연결.png&quot; data-origin-width=&quot;1145&quot; data-origin-height=&quot;853&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;퍼블릭 엑세스를 가능하도록 설정하고 보안그룹을 설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;차후에 변경할 것이니 EC2 인스턴스를 만들 때 만든 보안그룹으로 설정해두자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;모두 설정했으니 데이터베이스 생성을 누르자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;6. 사용가능.png&quot; data-origin-width=&quot;1899&quot; data-origin-height=&quot;843&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VI5OR/btqEWtb5XUD/qxfN2BWfRV0LEt7EJx2hY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VI5OR/btqEWtb5XUD/qxfN2BWfRV0LEt7EJx2hY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VI5OR/btqEWtb5XUD/qxfN2BWfRV0LEt7EJx2hY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVI5OR%2FbtqEWtb5XUD%2FqxfN2BWfRV0LEt7EJx2hY1%2Fimg.png&quot; data-filename=&quot;6. 사용가능.png&quot; data-origin-width=&quot;1899&quot; data-origin-height=&quot;843&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;기다리면 일정 시간 후 데이터베이스가 위와 같이 사용가능으로 표시된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;데이터베이스를 선택하면 상세정보에 보안그룹이 표시된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;보안그룹을 선택하던가 EC2페이지에서 보안그룹 페이지로 이동한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그리고 새 보안그룹을 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;7. rds 보안그룹.png&quot; data-origin-width=&quot;1893&quot; data-origin-height=&quot;853&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxL6it/btqEWtiNqP8/uAn1XxcDKQsTQCS1yGWcIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxL6it/btqEWtiNqP8/uAn1XxcDKQsTQCS1yGWcIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxL6it/btqEWtiNqP8/uAn1XxcDKQsTQCS1yGWcIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxL6it%2FbtqEWtiNqP8%2FuAn1XxcDKQsTQCS1yGWcIK%2Fimg.png&quot; data-filename=&quot;7. rds 보안그룹.png&quot; data-origin-width=&quot;1893&quot; data-origin-height=&quot;853&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;RDS의 보안그룹임을 나타낼수 있도록 이름을 만들고&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;인바운드 규칙을 위와 같이 만들자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;유형은 RDS가 속한 엔진을 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;EC2 인스턴스가 데이터베이스에 접근할 수 있도록 EC2 인스턴스의 보안그룹을 대상으로 인바운드 규칙을 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;또 유틸 프로그램을 통해 데이터베이스에 접근하도록 내가 작업할 PC에서의 IP를 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;보안그룹을 만들었으니 데이터베이스에 해당 보안그룹을 설정하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기까지 데이터베이스를 사용하기 위한 서비스 설정이 끝났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;해당 데이터베이스에 수정을 눌러 기존에 임시로 설정했던 보안그룹을 제거하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위에서 만든 RDS용 보안그룹으로 설정하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;DBeaver&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;데이터베이스 정보를 유틸 프로그램을 통해 확인해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;DBeaver 외에도 다른 유틸도 상관없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://dbeaver.io/&quot;&gt;https://dbeaver.io/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1592471325754&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;DBeaver Community | Free Universal Database Tool&quot; data-og-description=&quot;DBeaver Universal Database Tool Free multi-platform database tool for developers, database administrators, analysts and all people who need to work with databases. Supports all popular databases: MySQL, PostgreSQL, SQLite, Oracle, DB2, SQL Server, Sybase, &quot; data-og-host=&quot;dbeaver.io&quot; data-og-source-url=&quot;https://dbeaver.io/&quot; data-og-url=&quot;https://dbeaver.io/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/js4k1/hyGsF01cX0/1n88lWWXsuFRARm9jZl7J1/img.png?width=450&amp;amp;height=220&amp;amp;face=0_0_450_220,https://scrap.kakaocdn.net/dn/xhEQv/hyGsIjaUe7/VctVfUIEWw4umzwykMUmo0/img.png?width=450&amp;amp;height=220&amp;amp;face=0_0_450_220,https://scrap.kakaocdn.net/dn/mqvFF/hyGsvYp9ZF/69ICf4nqIA8gblWDsAyxwk/img.png?width=450&amp;amp;height=220&amp;amp;face=0_0_450_220&quot;&gt;&lt;a href=&quot;https://dbeaver.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dbeaver.io/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/js4k1/hyGsF01cX0/1n88lWWXsuFRARm9jZl7J1/img.png?width=450&amp;amp;height=220&amp;amp;face=0_0_450_220,https://scrap.kakaocdn.net/dn/xhEQv/hyGsIjaUe7/VctVfUIEWw4umzwykMUmo0/img.png?width=450&amp;amp;height=220&amp;amp;face=0_0_450_220,https://scrap.kakaocdn.net/dn/mqvFF/hyGsvYp9ZF/69ICf4nqIA8gblWDsAyxwk/img.png?width=450&amp;amp;height=220&amp;amp;face=0_0_450_220');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;DBeaver Community | Free Universal Database Tool&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;DBeaver Universal Database Tool Free multi-platform database tool for developers, database administrators, analysts and all people who need to work with databases. Supports all popular databases: MySQL, PostgreSQL, SQLite, Oracle, DB2, SQL Server, Sybase,&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;dbeaver.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;설치 후 실행하면 아래와 같은 프로그램이 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/egGU0b/btqEX9X09jI/Y59onbKST535kT7BHknz6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/egGU0b/btqEX9X09jI/Y59onbKST535kT7BHknz6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/egGU0b/btqEX9X09jI/Y59onbKST535kT7BHknz6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FegGU0b%2FbtqEX9X09jI%2FY59onbKST535kT7BHknz6K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;파일 아래 아이콘을 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;데이터베이스 종류가 뜨면 해당하는 데이터베이스를 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Bi5Fq/btqEW3RxFkg/Xr9WkUaxDpbnTnKSXCWQOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Bi5Fq/btqEW3RxFkg/Xr9WkUaxDpbnTnKSXCWQOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Bi5Fq/btqEW3RxFkg/Xr9WkUaxDpbnTnKSXCWQOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBi5Fq%2FbtqEW3RxFkg%2FXr9WkUaxDpbnTnKSXCWQOK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Authentication&lt;/b&gt;에는 RDS를 만들때 입력했던 아이디와 패스워드를 입력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Server Host&lt;/b&gt;에는 해당 데이터베이스를 선택하면 표시되는 &lt;b&gt;엔드포인트&lt;/b&gt; 값을 입력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yT4Kq/btqEXJFfEe7/GWI5pbfjRNZN3HA9dDnhFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yT4Kq/btqEXJFfEe7/GWI5pbfjRNZN3HA9dDnhFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yT4Kq/btqEXJFfEe7/GWI5pbfjRNZN3HA9dDnhFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyT4Kq%2FbtqEXJFfEe7%2FGWI5pbfjRNZN3HA9dDnhFK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;완료하면 왼쪽 리스트에 데이터베이스가 추가된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCwL2x/btqEW3DYTvv/Cx8GpfKk3eBhaY8MxlDCo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCwL2x/btqEW3DYTvv/Cx8GpfKk3eBhaY8MxlDCo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCwL2x/btqEW3DYTvv/Cx8GpfKk3eBhaY8MxlDCo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCwL2x%2FbtqEW3DYTvv%2FCx8GpfKk3eBhaY8MxlDCo0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;설정이 끝났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;해당 프로그램을 통해 데이터베이스 작업이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;파라미터 그룹&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;설정해야할 일이 하나 더 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위에 데이터베이스의 Default Charset은 utf8로 설정되어 있지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;기본 설정은 latin으로 되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;기본 설정값들은 RDS의 파라미터 그룹에서 관리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/booG85/btqEWBgDZ7u/2HAtIdkgR7u00EYEQ3gICK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/booG85/btqEWBgDZ7u/2HAtIdkgR7u00EYEQ3gICK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/booG85/btqEWBgDZ7u/2HAtIdkgR7u00EYEQ3gICK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbooG85%2FbtqEWBgDZ7u%2F2HAtIdkgR7u00EYEQ3gICK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;기본 파라미터 그룹은 변경이 불가능하다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;새로운 파라미터 그룹은 만들자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그룹 이름을 적당히 만들고 생성하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;새로 만든 파라미터 그룹을 선택하고 파라미터 그룹 작업에서 편집을 선택하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGJcaa/btqEW3cWxgG/7t2CLKkTdHFM31pfD2wCZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGJcaa/btqEW3cWxgG/7t2CLKkTdHFM31pfD2wCZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGJcaa/btqEW3cWxgG/7t2CLKkTdHFM31pfD2wCZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGJcaa%2FbtqEW3cWxgG%2F7t2CLKkTdHFM31pfD2wCZK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2페이지, 3페이지에 charset과 관련된 파라미터들이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;character_set_client, &lt;span&gt;character_set_connection, &lt;span&gt;character_set_database, &lt;span&gt;character_set_filesystem, &lt;span&gt;character_set_results, &lt;span&gt;character_set_server은 utf8로&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;collation_connection, &lt;span&gt;collation_server은 utf8_general_ci로 설정하자.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;해당 데이터베이스에 파라미터 그룹을 설정하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;수정을 누르면 데이터베이스 옵션에서 파라미터 그룹을 변경할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;변경 후 데이터베이스를 재부팅해야 적용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;작업 / 재부팅을 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;EC2 서버에서도 데이터베이스를 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size18&quot; data-ke-style=&quot;style3&quot;&gt;mysql 설치&lt;br /&gt;sudo yum install mysql&lt;br /&gt;&lt;br /&gt;mysql 접속&lt;br /&gt;mysql -u 계정 -p -h Host주소&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lLSdL/btqEY1ebFTR/IsapKVZKJnljMW6uIzoRk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lLSdL/btqEY1ebFTR/IsapKVZKJnljMW6uIzoRk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lLSdL/btqEY1ebFTR/IsapKVZKJnljMW6uIzoRk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlLSdL%2FbtqEY1ebFTR%2FIsapKVZKJnljMW6uIzoRk1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Server</category>
      <author>날아갔나요</author>
      <guid isPermaLink="true">https://jhpop.tistory.com/130</guid>
      <comments>https://jhpop.tistory.com/130#entry130comment</comments>
      <pubDate>Thu, 18 Jun 2020 16:00:07 +0900</pubDate>
    </item>
    <item>
      <title>서버알못의 AWS 설정1 - EC2 생성</title>
      <link>https://jhpop.tistory.com/129</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;윈도우&lt;/b&gt;에서 &lt;b&gt;AWS 클라우드 서버&lt;/b&gt;를 사용하려 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;윈도우 기반으로 작성하니 맥북 사용자는 아래 포스팅 링크를 참조하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;AWS에 가입하면 12개월 동안 서비스의 일정부분은 무료로 사용할 수 있는 프리티어를 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;일정 부분 무료라고 써놨지만 사실상 무료이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다만 보안설정없이 사용하는 경우 내 계정이 코인 체굴에 쓰이고 요금 폭탄을 맞는 경우도 있다고는 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;물론 고객센터에 영어로 잘 문의하면 선처해주는 분위기인듯 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;보안설정을 통해 나만 접근하게 설정한다면 위와 같은 문제는 없을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;AWS 프리 티어&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://aws.amazon.com/ko/free/?all-free-tier.sort-by=item.additionalFields.SortRank&amp;amp;all-free-tier.sort-order=asc&quot;&gt;https://aws.amazon.com/ko/free/?all-free-tier.sort-by=item.additionalFields.SortRank&amp;amp;all-free-tier.sort-order=asc&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1592380760150&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;company&quot; data-og-title=&quot;AWS 프리 티어&quot; data-og-description=&quot;프리 티어를 이용해 60가지가 넘는 제품을 체험하고 AWS에 구축할 수 있습니다. 사용하는 제품에 따라 세 가지 유형의 프리 티어 오퍼가 제공됩니다. 각 제품에 대한 자세한 내용은 아래를 참조하&quot; data-og-host=&quot;aws.amazon.com&quot; data-og-source-url=&quot;https://aws.amazon.com/ko/free/?all-free-tier.sort-by=item.additionalFields.SortRank&amp;amp;all-free-tier.sort-order=asc&quot; data-og-url=&quot;https://aws.amazon.com/ko/free/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bNQRgn/hyGrxJxVvr/9z0BPLfFvhINIoeP6fGhg1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/b3OBnN/hyGrt8biEf/Bnyj9rAkWjyp7VTRd9Zid0/img.png?width=179&amp;amp;height=109&amp;amp;face=0_0_179_109&quot;&gt;&lt;a href=&quot;https://aws.amazon.com/ko/free/?all-free-tier.sort-by=item.additionalFields.SortRank&amp;amp;all-free-tier.sort-order=asc&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://aws.amazon.com/ko/free/?all-free-tier.sort-by=item.additionalFields.SortRank&amp;amp;all-free-tier.sort-order=asc&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bNQRgn/hyGrxJxVvr/9z0BPLfFvhINIoeP6fGhg1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/b3OBnN/hyGrt8biEf/Bnyj9rAkWjyp7VTRd9Zid0/img.png?width=179&amp;amp;height=109&amp;amp;face=0_0_179_109');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;AWS 프리 티어&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;프리 티어를 이용해 60가지가 넘는 제품을 체험하고 AWS에 구축할 수 있습니다. 사용하는 제품에 따라 세 가지 유형의 프리 티어 오퍼가 제공됩니다. 각 제품에 대한 자세한 내용은 아래를 참조하&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;해당 포스팅 내용을 보고 다시 작성하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://jojoldu.tistory.com/259?category=635883&quot;&gt;https://jojoldu.tistory.com/259?category=635883&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1592396031599&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;4) 스프링부트로 웹 서비스 출시하기 - 4. AWS EC2 &amp;amp; RDS 구축하기&quot; data-og-description=&quot;이번 시간엔 SpringBoot를 운영할 AWS 환경을 구축하겠습니다. (모든 코드는 Github에 있습니다.) Tip) 운영 서버는 크게 클라우드 서비스(AWS, Azure 등) 과 호스팅 서비스(Cafe24, 코리아호스팅 등)을 이용��&quot; data-og-host=&quot;jojoldu.tistory.com&quot; data-og-source-url=&quot;https://jojoldu.tistory.com/259?category=635883&quot; data-og-url=&quot;https://jojoldu.tistory.com/259&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/vaW8F/hyGsFMT05R/QK3mPBDojbybO0IXebXkX1/img.png?width=800&amp;amp;height=33&amp;amp;face=0_0_800_33,https://scrap.kakaocdn.net/dn/YZFjW/hyGsHcSwAF/0z3k2Un8eBQ1idMZCkmWVk/img.png?width=800&amp;amp;height=33&amp;amp;face=0_0_800_33,https://scrap.kakaocdn.net/dn/bgecPj/hyGrwYl1xB/yfeZllsJH7TbEkbkXkXXf0/img.png?width=1271&amp;amp;height=693&amp;amp;face=0_0_1271_693&quot;&gt;&lt;a href=&quot;https://jojoldu.tistory.com/259?category=635883&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jojoldu.tistory.com/259?category=635883&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/vaW8F/hyGsFMT05R/QK3mPBDojbybO0IXebXkX1/img.png?width=800&amp;amp;height=33&amp;amp;face=0_0_800_33,https://scrap.kakaocdn.net/dn/YZFjW/hyGsHcSwAF/0z3k2Un8eBQ1idMZCkmWVk/img.png?width=800&amp;amp;height=33&amp;amp;face=0_0_800_33,https://scrap.kakaocdn.net/dn/bgecPj/hyGrwYl1xB/yfeZllsJH7TbEkbkXkXXf0/img.png?width=1271&amp;amp;height=693&amp;amp;face=0_0_1271_693');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;4) 스프링부트로 웹 서비스 출시하기 - 4. AWS EC2 &amp;amp; RDS 구축하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;이번 시간엔 SpringBoot를 운영할 AWS 환경을 구축하겠습니다. (모든 코드는 Github에 있습니다.) Tip) 운영 서버는 크게 클라우드 서비스(AWS, Azure 등) 과 호스팅 서비스(Cafe24, 코리아호스팅 등)을 이용��&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;jojoldu.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. AWS 가입&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. EC2 인스턴스 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. EIP 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4. putty 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;5. RDS 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;6. DBeaver 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;7. FileZilla 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;EC2&lt;/b&gt; 서버를 위한 공간&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;EIP&lt;/b&gt; 만들 웹 서비스에 접근하기 위한 고정 IP&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;putty&lt;/b&gt; 서버를 위한 공간에 접근하기 위한 프로그램&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;RDS&lt;/b&gt; 데이터베이스 서비스&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;DBeaver&lt;/b&gt; DB에 접근하기 위한 프로그램&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;해당 포스팅에서는 4번까지 진행하면서&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;서버를 위한 기본이 되는 공간을 만들고 접속해보려 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;AWS 가입&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;가입한 시점&lt;/b&gt;부터 프리티어 12개월이 진행됨으로 별다른 신청이 필요없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;가입하고 아래 콘솔화면을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;console.png&quot; data-origin-width=&quot;1871&quot; data-origin-height=&quot;889&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yFwc0/btqEVYWtt3E/L0nm0op14JEVTqGCXIMQa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yFwc0/btqEVYWtt3E/L0nm0op14JEVTqGCXIMQa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yFwc0/btqEVYWtt3E/L0nm0op14JEVTqGCXIMQa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyFwc0%2FbtqEVYWtt3E%2FL0nm0op14JEVTqGCXIMQa1%2Fimg.png&quot; data-filename=&quot;console.png&quot; data-origin-width=&quot;1871&quot; data-origin-height=&quot;889&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;오른쪽 위에 &lt;b&gt;리전&lt;/b&gt;을 선택하는 곳이 있는데 서울이 아니라면 &lt;b&gt;서울을 선택&lt;/b&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;EC2&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;1. EC2 인스턴스 시작.png&quot; data-origin-width=&quot;1885&quot; data-origin-height=&quot;897&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xwgfs/btqEVX4p32K/CtVtvu93aAhmHwamWXLz50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xwgfs/btqEVX4p32K/CtVtvu93aAhmHwamWXLz50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xwgfs/btqEVX4p32K/CtVtvu93aAhmHwamWXLz50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxwgfs%2FbtqEVX4p32K%2FCtVtvu93aAhmHwamWXLz50%2Fimg.png&quot; data-filename=&quot;1. EC2 인스턴스 시작.png&quot; data-origin-width=&quot;1885&quot; data-origin-height=&quot;897&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;EC2 페이지로 가면 위와 같은 화면을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;인스턴스 시작 선택&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2. 운영체제 선택.png&quot; data-origin-width=&quot;1907&quot; data-origin-height=&quot;899&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsEJEe/btqETYjkz2o/myXFGfeqXqSIbwt9WEvFf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsEJEe/btqETYjkz2o/myXFGfeqXqSIbwt9WEvFf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsEJEe/btqETYjkz2o/myXFGfeqXqSIbwt9WEvFf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsEJEe%2FbtqETYjkz2o%2FmyXFGfeqXqSIbwt9WEvFf1%2Fimg.png&quot; data-filename=&quot;2. 운영체제 선택.png&quot; data-origin-width=&quot;1907&quot; data-origin-height=&quot;899&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;운영체제를 &lt;b&gt;Amazon Linux AMI&lt;/b&gt;를 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;3. 인스턴스 유형 선택.png&quot; data-origin-width=&quot;1915&quot; data-origin-height=&quot;895&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xwVE0/btqEUqNjrHS/W0PzZ6Z0LlXB9OIK4GnYK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xwVE0/btqEUqNjrHS/W0PzZ6Z0LlXB9OIK4GnYK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xwVE0/btqEUqNjrHS/W0PzZ6Z0LlXB9OIK4GnYK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxwVE0%2FbtqEUqNjrHS%2FW0PzZ6Z0LlXB9OIK4GnYK0%2Fimg.png&quot; data-filename=&quot;3. 인스턴스 유형 선택.png&quot; data-origin-width=&quot;1915&quot; data-origin-height=&quot;895&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프리티어에서 가능한 &lt;b&gt;t2.micro&lt;/b&gt;를 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;4. 인스턴스 세부정보(기본값 사용).png&quot; data-origin-width=&quot;1915&quot; data-origin-height=&quot;893&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3NW26/btqET7f73wK/PiX2bnHIymGAeJkV3RxxWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3NW26/btqET7f73wK/PiX2bnHIymGAeJkV3RxxWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3NW26/btqET7f73wK/PiX2bnHIymGAeJkV3RxxWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3NW26%2FbtqET7f73wK%2FPiX2bnHIymGAeJkV3RxxWk%2Fimg.png&quot; data-filename=&quot;4. 인스턴스 세부정보(기본값 사용).png&quot; data-origin-width=&quot;1915&quot; data-origin-height=&quot;893&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;인스턴스 세부 정보 구성은 기본 설정을 따른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;5. 스토리지 추가.png&quot; data-origin-width=&quot;1917&quot; data-origin-height=&quot;903&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtkqqG/btqEWB0TVro/Egbxaq0aGLyqBMJpPNUqIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtkqqG/btqEWB0TVro/Egbxaq0aGLyqBMJpPNUqIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtkqqG/btqEWB0TVro/Egbxaq0aGLyqBMJpPNUqIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtkqqG%2FbtqEWB0TVro%2FEgbxaq0aGLyqBMJpPNUqIk%2Fimg.png&quot; data-filename=&quot;5. 스토리지 추가.png&quot; data-origin-width=&quot;1917&quot; data-origin-height=&quot;903&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프리티어에서 사용 가능한 최대 크기 &lt;b&gt;30기가&lt;/b&gt;로 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;6. 보안 그룹 구성.png&quot; data-origin-width=&quot;1909&quot; data-origin-height=&quot;897&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dHxBC9/btqEUpANtmL/X4rNkrVIRGeass9HT75hbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dHxBC9/btqEUpANtmL/X4rNkrVIRGeass9HT75hbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dHxBC9/btqEUpANtmL/X4rNkrVIRGeass9HT75hbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdHxBC9%2FbtqEUpANtmL%2FX4rNkrVIRGeass9HT75hbK%2Fimg.png&quot; data-filename=&quot;6. 보안 그룹 구성.png&quot; data-origin-width=&quot;1909&quot; data-origin-height=&quot;897&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;p data-ke-size=&quot;size18&quot;&gt;SSH 접근은 사용자만 접근할 수 있도록 &quot;내 IP&quot;만 선택하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;외부에서 웹서비스에 접근할 수 있도록 HTTP, HTTPS는 열어둔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;다른 장소에서 SSH에 접근하고 싶거나 FTP, DB에 필요한 포트가 필요하다면&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;후에 추가로 접근하고 싶은 서비스 혹은 IP를 설정하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;인스턴스에 대한 설정이 모두 끝났음으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;검토 및 시작에서 &lt;b&gt;시작하기&lt;/b&gt;를 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3yL60/btqEWBs4QRR/bTINz4snKKvafLxrU8msEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3yL60/btqEWBs4QRR/bTINz4snKKvafLxrU8msEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3yL60/btqEWBs4QRR/bTINz4snKKvafLxrU8msEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3yL60%2FbtqEWBs4QRR%2FbTINz4snKKvafLxrU8msEk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;새 키 페어 생성을 선택하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;키 페어 이름을 입력한 뒤 &lt;b&gt;키 페어를 다운로드&lt;/b&gt;하여 저장해둔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;7. FIN.png&quot; data-origin-width=&quot;1880&quot; data-origin-height=&quot;855&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGxZlw/btqEUGI5xRy/plAPtxSmjW6xGhTKQUrNdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGxZlw/btqEUGI5xRy/plAPtxSmjW6xGhTKQUrNdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGxZlw/btqEUGI5xRy/plAPtxSmjW6xGhTKQUrNdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGxZlw%2FbtqEUGI5xRy%2FplAPtxSmjW6xGhTKQUrNdK%2Fimg.png&quot; data-filename=&quot;7. FIN.png&quot; data-origin-width=&quot;1880&quot; data-origin-height=&quot;855&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;생성을 완료하고 나면 인스턴스가 돌아가는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;탄력적 IP(EIP) 설정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;서버를 만들기 위한 자원은 갖췄지만 &lt;b&gt;고정된 IP&lt;/b&gt;가 없다면 아무 의미가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;내 서버의 IP를 얻어보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;EC2 메뉴에서 네트워크 및 보안 / 탄력적 IP를 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;우상단의 &lt;b&gt;탄력적 IP 주소 할당&lt;/b&gt; 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;8. EIP 할당.png&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;577&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SmKT4/btqEW4Jofsi/9cKb2aDx5N43J5Z27zdkZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SmKT4/btqEW4Jofsi/9cKb2aDx5N43J5Z27zdkZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SmKT4/btqEW4Jofsi/9cKb2aDx5N43J5Z27zdkZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSmKT4%2FbtqEW4Jofsi%2F9cKb2aDx5N43J5Z27zdkZk%2Fimg.png&quot; data-filename=&quot;8. EIP 할당.png&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;577&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;할당하면 주소가 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;주소와 인스턴스가 각각 만들어졌을뿐 연결되어 있지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;우상단의 Actions의 &lt;b&gt;주소연결&lt;/b&gt;을 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;9. EIP 주소 연결.png&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;785&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dG3Vlp/btqEWtiAaiS/OB0l9nyGJFLUU7VppPypT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dG3Vlp/btqEWtiAaiS/OB0l9nyGJFLUU7VppPypT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dG3Vlp/btqEWtiAaiS/OB0l9nyGJFLUU7VppPypT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdG3Vlp%2FbtqEWtiAaiS%2FOB0l9nyGJFLUU7VppPypT0%2Fimg.png&quot; data-filename=&quot;9. EIP 주소 연결.png&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;785&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위에서 만든 &lt;b&gt;EC2 인스턴스&lt;/b&gt;를 선택하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프라이빗 IP 주소 EC2 인스턴스의 &lt;b&gt;프라이빗 IP&lt;/b&gt;를 입력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(누르면 자동으로 항목이 나온다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;연결 후 EC2 인스턴스를 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;a.png&quot; data-origin-width=&quot;1917&quot; data-origin-height=&quot;901&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mw3K3/btqEWA9F2ZP/KePbk1v43rrpqkncs9dvJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mw3K3/btqEWA9F2ZP/KePbk1v43rrpqkncs9dvJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mw3K3/btqEWA9F2ZP/KePbk1v43rrpqkncs9dvJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmw3K3%2FbtqEWA9F2ZP%2FKePbk1v43rrpqkncs9dvJ1%2Fimg.png&quot; data-filename=&quot;a.png&quot; data-origin-width=&quot;1917&quot; data-origin-height=&quot;901&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;탄력적 IP&lt;/b&gt;가 할당된 것이 보이면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Putty 사용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;서버를 위한 공간을 할당받았으니 접속해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Putty를 사용해 SSH로 서버 공간에 접근하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;SSH(Secure Shell)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;네트워크 상의 다른 컴퓨터에 로그인하거나 원격 시스템에서 명령을 실행하고 다른 시스템으로 파일을 복사할 수 있도록 해주는 응용프로그램 또는 프로토콜&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;우선 다운받아 설치해보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html&quot;&gt;https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1592465276329&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Download PuTTY: latest release (0.73)&quot; data-og-description=&quot;This page contains download links for the latest released version of PuTTY. Currently this is 0.73, released on 2019-09-29. When new releases come out, this page will update to contain the latest, so this is a good page to bookmark or link to. Alternativel&quot; data-og-host=&quot;www.chiark.greenend.org.uk&quot; data-og-source-url=&quot;https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html&quot; data-og-url=&quot;https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Download PuTTY: latest release (0.73)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;This page contains download links for the latest released version of PuTTY. Currently this is 0.73, released on 2019-09-29. When new releases come out, this page will update to contain the latest, so this is a good page to bookmark or link to. Alternativel&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.chiark.greenend.org.uk&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QhE2o/btqEX9wJYap/BEGiJjbP4hb6eiO4AbNCF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QhE2o/btqEX9wJYap/BEGiJjbP4hb6eiO4AbNCF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QhE2o/btqEX9wJYap/BEGiJjbP4hb6eiO4AbNCF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQhE2o%2FbtqEX9wJYap%2FBEGiJjbP4hb6eiO4AbNCF0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위 두개의 프로그램을 사용할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;우선 PuTTYgen을 이용해 private key를 만들 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pr7rT/btqEVX5k6aB/E6ssgWeFKXE2qpU5Kt8CC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pr7rT/btqEVX5k6aB/E6ssgWeFKXE2qpU5Kt8CC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pr7rT/btqEVX5k6aB/E6ssgWeFKXE2qpU5Kt8CC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpr7rT%2FbtqEVX5k6aB%2FE6ssgWeFKXE2qpU5Kt8CC1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;통해 EC2 인스턴스를 생성하면서 받은 pem을 &lt;b&gt;Load&lt;/b&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Save Private Key&lt;/b&gt;를 선택하여 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;passphrase가 없다고 경고가 뜨는데 무시한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;pem과 같은 이름으로 만들라고 블로그에서 봤는데 이유는 잘 모르겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그럼 이제 PuTTY를 이용해 서버에 접근해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d8p7tb/btqEXIGbLSC/BsFelyxUbU48pSiP5VRdkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d8p7tb/btqEXIGbLSC/BsFelyxUbU48pSiP5VRdkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d8p7tb/btqEXIGbLSC/BsFelyxUbU48pSiP5VRdkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd8p7tb%2FbtqEXIGbLSC%2FBsFelyxUbU48pSiP5VRdkK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;HostName : [user]@[IP]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;- user : EC2의 경우 ec2-user를 입력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;- IP : EC2 인스턴스 정보에 퍼블릭 DNS 또는 EIP를 입력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;- ex : ec2-user@12.345.670.891&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Port&lt;/b&gt; &lt;b&gt;: 22&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;- EC2를 만들 때 보안그룹에서 SSH, 22 포트를 내 IP 설정한 이유이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Private Key 설정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;- Connection / SSH / Auth&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;- Private key file for authentication에 위에서 생성한 .ppk 파일은 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Saved Sessions에 설정을 저장해두고 사용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Open을 누르면&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ehWoHL/btqEWAIDVOs/rlavllny0BSEAYRFoZ1HxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ehWoHL/btqEWAIDVOs/rlavllny0BSEAYRFoZ1HxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ehWoHL/btqEWAIDVOs/rlavllny0BSEAYRFoZ1HxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FehWoHL%2FbtqEWAIDVOs%2Frlavllny0BSEAYRFoZ1HxK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;정상적으로 접속된 것을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;처음 접속하면 업데이트가 필요하다는 메세지가 뜬다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;sudo yum update 명령어를 통해 업데이트하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;또 자바 버전은 1.7이 기본 설정인듯 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1.8이 필요한 경우 업데이트를 하자&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size18&quot; data-ke-style=&quot;style3&quot;&gt;설치 가능 버전 확인&lt;br /&gt;yum list java*jdk-devel&lt;br /&gt;&lt;br /&gt;설치&lt;br /&gt;sudo yum java-1.8.0-openjdk-devel.x86_64&lt;br /&gt;&lt;br /&gt;자바 버전 변경&lt;br /&gt;sudo alternatives --config java&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Server</category>
      <author>날아갔나요</author>
      <guid isPermaLink="true">https://jhpop.tistory.com/129</guid>
      <comments>https://jhpop.tistory.com/129#entry129comment</comments>
      <pubDate>Wed, 17 Jun 2020 23:18:20 +0900</pubDate>
    </item>
    <item>
      <title>Retrofit / OkHttp</title>
      <link>https://jhpop.tistory.com/128</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Github :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://github.com/junghun9102/AndroidTemplate&quot;&gt;https://github.com/junghun9102/AndroidTemplate&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Branch : library/retrofit&lt;/p&gt;
&lt;figure id=&quot;og_1590906555663&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;object&quot; data-og-title=&quot;junghun9102/AndroidTemplate&quot; data-og-description=&quot;Contribute to junghun9102/AndroidTemplate development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/junghun9102/AndroidTemplate&quot; data-og-url=&quot;https://github.com/junghun9102/AndroidTemplate&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Le4Sa/hyGeUY1XKi/aUZOFR8X4VxeiF9681AhO1/img.png?width=420&amp;amp;height=420&amp;amp;face=0_0_420_420&quot;&gt;&lt;a href=&quot;https://github.com/junghun9102/AndroidTemplate&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/junghun9102/AndroidTemplate&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Le4Sa/hyGeUY1XKi/aUZOFR8X4VxeiF9681AhO1/img.png?width=420&amp;amp;height=420&amp;amp;face=0_0_420_420');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;junghun9102/AndroidTemplate&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Contribute to junghun9102/AndroidTemplate development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Commit ea187676&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;기본 사용법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. Service&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. OkHttpClient&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. Retrofit을 이용한 Service 구현체&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1번과 3번만 구현하면 API통신이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2번은 선택적이지만 보통 구현한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;GoogleNews RSS를 사용해 Retrofit 기본 사용법을 정리하려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://news.google.com/rss?hl=ko&amp;amp;gl=KR&amp;amp;ceid=KR:ko&quot;&gt;https://news.google.com/rss?hl=ko&amp;amp;gl=KR&amp;amp;ceid=KR:ko&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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;size18&quot;&gt;&lt;a href=&quot;https://square.github.io/retrofit/&quot;&gt;https://square.github.io/retrofit/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1590742465373&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Retrofit&quot; data-og-description=&quot;A type-safe HTTP client for Android and Java&quot; data-og-host=&quot;square.github.io&quot; data-og-source-url=&quot;https://square.github.io/retrofit/&quot; data-og-url=&quot;https://square.github.io/retrofit/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://square.github.io/retrofit/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://square.github.io/retrofit/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Retrofit&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;A type-safe HTTP client for Android and Java&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;square.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;dependencies&lt;/p&gt;
&lt;pre id=&quot;code_1590742485442&quot; class=&quot;kotlin&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; cursor: default; z-index: 1;&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    implementation 'com.squareup.retrofit2:retrofit:2.5.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:3.11.0'
    implementation 'com.squareup.okhttp3:okhttp:3.12.0'
    implementation 'com.squareup.retrofit2:converter-simplexml:2.1.0'
//    implementation 'com.squareup.retrofit2:converter-gson:2.4.0'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. Service&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;HTTP Method(GET/POST/PUT/DELETE)로 API 요청을 위한 interface&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1590740184143&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface GoogleNewsService {

    @GET(&quot;/rss&quot;)
    fun getNews(
        @Query(&quot;hl&quot;) hl: String,
        @Query(&quot;gl&quot;) gl: String,
        @Query(&quot;ceid&quot;) ceid: String
    ): Call&amp;lt;RespNewsRss&amp;gt;

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;추가적인 사용 방법들은 아래 포스팅에 잘 설명되어 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://medium.com/@ggikko/retrofit-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EC%95%8C%EA%B3%A0-%EC%93%B0%EA%B8%B0-a6ce90cf7768&quot;&gt;https://medium.com/@ggikko/retrofit-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EC%95%8C%EA%B3%A0-%EC%93%B0%EA%B8%B0-a6ce90cf7768&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1590900898487&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Retrofit 홈페이지 한글로 긁어보기 RESTFUL SERVICE VERY EASY!!&quot; data-og-description=&quot;원래 Volley를 쓰다가 부분적으로 적용해서 사용해 보려했는데 하다보니 홈페이지에 있는 글을 다 읽고 말았다. 그래서 영어로 읽으면 시간이 오래걸려서 한글로 작성해보려한다.. 허접하게 번역&quot; data-og-host=&quot;medium.com&quot; data-og-source-url=&quot;https://medium.com/@ggikko/retrofit-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EC%95%8C%EA%B3%A0-%EC%93%B0%EA%B8%B0-a6ce90cf7768&quot; data-og-url=&quot;https://medium.com/@ggikko/retrofit-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EC%95%8C%EA%B3%A0-%EC%93%B0%EA%B8%B0-a6ce90cf7768&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://medium.com/@ggikko/retrofit-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EC%95%8C%EA%B3%A0-%EC%93%B0%EA%B8%B0-a6ce90cf7768&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://medium.com/@ggikko/retrofit-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EC%95%8C%EA%B3%A0-%EC%93%B0%EA%B8%B0-a6ce90cf7768&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Retrofit 홈페이지 한글로 긁어보기 RESTFUL SERVICE VERY EASY!!&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;원래 Volley를 쓰다가 부분적으로 적용해서 사용해 보려했는데 하다보니 홈페이지에 있는 글을 다 읽고 말았다. 그래서 영어로 읽으면 시간이 오래걸려서 한글로 작성해보려한다.. 허접하게 번역&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;medium.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. OkHttpClient&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;API 요청과 응답에 관한 설정을 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size18&quot;&gt;object GoogleNewsServiceFactory&lt;/p&gt;
&lt;pre id=&quot;code_1590740217351&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    private const val HTTP_TIMEOUT_READ = 10L
    private const val HTTP_TIMEOUT_CONNECT = 5L

    private fun makeOkHttpClient(httpLoggingInterceptor: HttpLoggingInterceptor, appendHeaderInterceptor: Interceptor) = OkHttpClient.Builder()
        .connectTimeout(HTTP_TIMEOUT_CONNECT, TimeUnit.MILLISECONDS)
        .readTimeout(HTTP_TIMEOUT_READ, TimeUnit.MILLISECONDS)
        .addInterceptor(httpLoggingInterceptor)
        .addInterceptor(appendHeaderInterceptor)
        .build()

    private fun makeLoggingInterceptor(debug: Boolean): HttpLoggingInterceptor {
        return HttpLoggingInterceptor().apply {
            level = if (debug) HttpLoggingInterceptor.Level.BODY else HttpLoggingInterceptor.Level.NONE
        }
    }

    private fun makeAppendHeaderInterceptor() = Interceptor { chain -&amp;gt;
            val newRequest = chain.request().newBuilder()
//            newRequest.addHeader(&quot;Version&quot;, &quot;v1.0&quot;)
            chain.proceed(newRequest.build())
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;connectTimeout / readTimeout / writeTimeout / callTimeout&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;타임아웃을 설정 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;HttpLoggingInterceptor&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;요청과 응답 로그를 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bg2MDy/btqExBf9qOM/dvqIwQyb17GWZYF75HmvVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bg2MDy/btqExBf9qOM/dvqIwQyb17GWZYF75HmvVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bg2MDy/btqExBf9qOM/dvqIwQyb17GWZYF75HmvVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbg2MDy%2FbtqExBf9qOM%2FdvqIwQyb17GWZYF75HmvVk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;makeAppendHeaderInterceptor&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1번의 Service에서도 각각의 요청마다 Header를 붙일 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;하지만 디폴트 헤더 데이터가 필요한 경우 interceptor를 만들어 요청마다 같은 헤더를 추가할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3. Retrofit을 이용한 Service 구현체&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;실제 사용하기 위한 구현체 생성&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;object GoogleNewsServiceFactory&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1590740264109&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    fun makeNewsService(debug: Boolean, baseUrl: String): GoogleNewsService {
        val okHttpClient = makeOkHttpClient(
            makeLoggingInterceptor(debug),
            makeAppendHeaderInterceptor()
        )
        return makeNewsService(
            baseUrl,
            okHttpClient
        )
    }

    private fun makeNewsService(baseUrl: String, okHttpClient: OkHttpClient): GoogleNewsService {
        val retrofit = Retrofit.Builder()
            .baseUrl(baseUrl)
            .client(okHttpClient)
            .addConverterFactory(SimpleXmlConverterFactory.create())
            .build()

        return retrofit.create(GoogleNewsService::class.java)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;baseUrl(baseUrl)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;기본 URL을 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;okHttpClient&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2번에서 만들었던 okHttpClient 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span&gt;addConverterFactory&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;SimpleXmlConverterFactory&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;응답 데이터를 파싱해 객체로 받기 위한 설정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;XML&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;dependecies&lt;/p&gt;
&lt;pre id=&quot;code_1590907899080&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;implementation 'com.squareup.retrofit2:converter-simplexml:2.1.0'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Retrofit Builder&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;addConverterFactory&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;SimpleXmlConverterFactory&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1590742145754&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;rss xmlns:media=&quot;http://search.yahoo.com/mrss/&quot; version=&quot;2.0&quot;&amp;gt;
  &amp;lt;channel&amp;gt;
  &amp;lt;generator&amp;gt;NFE/5.0&amp;lt;/generator&amp;gt;
  &amp;lt;title&amp;gt;주요 뉴스 - Google 뉴스&amp;lt;/title&amp;gt;
  &amp;lt;link&amp;gt;https://news.google.com/?hl=ko&amp;amp;gl=KR&amp;amp;ceid=KR:ko&amp;lt;/link&amp;gt;
  &amp;lt;language&amp;gt;ko&amp;lt;/language&amp;gt;
  &amp;lt;webMaster&amp;gt;news-webmaster@google.com&amp;lt;/webMaster&amp;gt;
  &amp;lt;copyright&amp;gt;2020 Google Inc.&amp;lt;/copyright&amp;gt;
  &amp;lt;lastBuildDate&amp;gt;Fri, 29 May 2020 03:09:37 GMT&amp;lt;/lastBuildDate&amp;gt;
  &amp;lt;description&amp;gt;Google 뉴스&amp;lt;/description&amp;gt;
  &amp;lt;item&amp;gt;
    &amp;lt;title&amp;gt;[속보] 코로나19 확진 58명 늘어&amp;hellip;신규 확진자 전원 수도권 - 한겨레&amp;lt;/title&amp;gt;
    &amp;lt;link&amp;gt;https://news.google.com/__i/rss/rd/articles/CBMiNWh0dHA6Ly93d3cuaGFuaS5jby5rci9hcnRpL3NvY2lldHkvaGVhbHRoLzk0NzA1Ny5odG1s0gEA?oc=5&amp;lt;/link&amp;gt;
    &amp;lt;guid isPermaLink=&quot;false&quot;&amp;gt;52782408608000&amp;lt;/guid&amp;gt;
    &amp;lt;pubDate&amp;gt;Fri, 29 May 2020 01:23:03 GMT&amp;lt;/pubDate&amp;gt;
    &amp;lt;description&amp;gt;&amp;lt;ol&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&quot;https://news.google.com/__i/rss/rd/articles/CBMiNWh0dHA6Ly93d3cuaGFuaS5jby5rci9hcnRpL3NvY2lldHkvaGVhbHRoLzk0NzA1Ny5odG1s0gEA?oc=5&quot; target=&quot;_blank&quot;&amp;gt;[속보] 코로나19 확진 58명 늘어&amp;hellip;신규 확진자 전원 수도권&amp;lt;/a&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;font color=&quot;#6f6f6f&quot;&amp;gt;한겨레&amp;lt;/font&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&quot;https://news.google.com/__i/rss/rd/articles/CBMiK2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9UEFEOE1UVXBoMmfSAQA?oc=5&quot; target=&quot;_blank&quot;&amp;gt;쿠팡발 감염 확산에 수도권 '비상'&amp;hellip;모자&amp;middot;신발서 코로나 나와&amp;lt;/a&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;font color=&quot;#6f6f6f&quot;&amp;gt;뉴스TVCHOSUN&amp;lt;/font&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&quot;https://news.google.com/__i/rss/rd/articles/CBMiMWh0dHBzOi8vd3d3Lnl0bi5jby5rci9fbG4vMDEwM18yMDIwMDUyOTEwNTI0NDc0NDbSAUNodHRwczovL20ueXRuLmNvLmtyL25ld3Nfdmlldy5hbXAucGhwP3BhcmFtPTAxMDNfMjAyMDA1MjkxMDUyNDQ3NDQ2?oc=5&quot; target=&quot;_blank&quot;&amp;gt;신규 발생 58명...지역 발생 55명 모두 수도권에 집중&amp;lt;/a&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;font color=&quot;#6f6f6f&quot;&amp;gt;YTN&amp;lt;/font&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&quot;https://news.google.com/__i/rss/rd/articles/CBMiJ2h0dHBzOi8vbmV3cy5qb2lucy5jb20vYXJ0aWNsZS8yMzc4ODg4MNIBK2h0dHBzOi8vbW5ld3Muam9pbnMuY29tL2FtcGFydGljbGUvMjM3ODg4ODA?oc=5&quot; target=&quot;_blank&quot;&amp;gt;코로나 신규환자 58명, 지역감염 55명&amp;middot;&amp;middot;&amp;middot;모두 수도권서 터졌다 - 중앙일보&amp;lt;/a&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;font color=&quot;#6f6f6f&quot;&amp;gt;중앙일보 모바일&amp;lt;/font&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&quot;https://news.google.com/__i/rss/rd/articles/CBMiK2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9cnVjU2VzMVB0R2_SAQA?oc=5&quot; target=&quot;_blank&quot;&amp;gt;수도권 덮친 '쿠팡 물류센터 집단감염'&amp;hellip;&quot;2주가 고비&quot; / JTBC 뉴스룸&amp;lt;/a&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;font color=&quot;#6f6f6f&quot;&amp;gt;JTBC News&amp;lt;/font&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;a href=&quot;https://news.google.com/stories/CAAqOQgKIjNDQklTSURvSmMzUnZjbmt0TXpZd1NoTUtFUWlBMHR6bGxZQU1FVmdIQWUwRXpZRzRLQUFQAQ?oc=5&quot; target=&quot;_blank&quot;&amp;gt;Google 뉴스에서 전체 콘텐츠 보기&amp;lt;/a&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&amp;lt;/description&amp;gt;
    &amp;lt;source url=&quot;http://www.hani.co.kr&quot;&amp;gt;한겨레&amp;lt;/source&amp;gt;
  &amp;lt;/item&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1590742294226&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Root(name = &quot;rss&quot;, strict = false)
data class RespNewsRss(
    @field:Element(name = &quot;channel&quot;) var channel: RespNewsRssChannel? = null
)

@Root(name = &quot;channel&quot;, strict = false)
class RespNewsRssChannel(
    @field:ElementList(entry = &quot;item&quot;, inline = true) var newsList: List&amp;lt;RespNews&amp;gt;? = null
)

@Element(name = &quot;item&quot;)
data class RespNews(
    @field:Element(name = &quot;title&quot;) var title: String? = null,
    @field:Element(name = &quot;link&quot;) var link: String? = null,
    @field:Element(name = &quot;guid&quot;) var guid: String? = null,
    @field:Element(name = &quot;pubDate&quot;) var pubDate: String? = null,
    @field:Element(name = &quot;description&quot;) var description: String? = null,
    @field:Element(name = &quot;source&quot;) var source: String? = null
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Json&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;depenencies&lt;/p&gt;
&lt;pre id=&quot;code_1590908027602&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;implementation 'com.squareup.retrofit2:converter-gson:2.4.0'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Retrofit Builder&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;addConverterFactory&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;GsonConverterFactory&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1590908597533&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;rss&quot; : {
    &quot;channel&quot; : {
    	&quot;items&quot; : [{
          &quot;title&quot; : &quot;인천시 &amp;ldquo;쿠팡물류센터 확진자 딸 등 2명 추가 확진&amp;rdquo; - 한겨레&quot;,
          &quot;link&quot; : &quot;https://news.google.com/__i/rss/rd/articles/CBMiM2h0dHA6Ly93d3cuaGFuaS5jby5rci9hcnRpL2FyZWEvY2FwaXRhbC85NDcyMjIuaHRtbNIBAA?oc=5&quot;,
          &quot;guid&quot; : &quot;52782408608000&quot;,
          &quot;pubDate&quot; : &quot;Sun, 31 May 2020 05:56:12 GMT&quot;,
          &quot;description&quot; : &quot;&amp;lt;ol&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&quot;https://news.google.com/__i/rss/rd/articles/CBMiM2h0dHA6Ly93d3cuaGFuaS5jby5rci9hcnRpL2FyZWEvY2FwaXRhbC85NDcyMjIuaHRtbNIBAA?oc=5&quot; target=&quot;_blank&quot;&amp;gt;인천시 &amp;ldquo;쿠팡물류센터 확진자 딸 등 2명 추가 확진&amp;rdquo;&amp;lt;/a&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;font color=&quot;#6f6f6f&quot;&amp;gt;한겨레&amp;lt;/font&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&quot;https://news.google.com/__i/rss/rd/articles/CBMiOGh0dHBzOi8vd3d3Lmhhbmtvb2tpbGJvLmNvbS9OZXdzL1JlYWQvMjAyMDA1MzAxNjc3MDQ3MzMy0gEA?oc=5&quot; target=&quot;_blank&quot;&amp;gt;이태원 클럽&amp;rarr;쿠팡 물류센터&amp;rarr;여의도 학원 전파?&amp;lt;/a&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;font color=&quot;#6f6f6f&quot;&amp;gt;한국일보&amp;lt;/font&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&quot;https://news.google.com/__i/rss/rd/articles/CBMiNWh0dHA6Ly93d3cuaGFuaS5jby5rci9hcnRpL3NvY2lldHkvaGVhbHRoLzk0NzE4OS5odG1s0gEA?oc=5&quot; target=&quot;_blank&quot;&amp;gt;부천 쿠팡물류센터 관련 코로나19 확진자 최소 109명&amp;lt;/a&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;font color=&quot;#6f6f6f&quot;&amp;gt;한겨레&amp;lt;/font&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&quot;https://news.google.com/__i/rss/rd/articles/CBMiJ2h0dHBzOi8vbmV3cy5qb2lucy5jb20vYXJ0aWNsZS8yMzc4OTYxONIBK2h0dHBzOi8vbW5ld3Muam9pbnMuY29tL2FtcGFydGljbGUvMjM3ODk2MTg?oc=5&quot; target=&quot;_blank&quot;&amp;gt;쿠팡 물류센터 총 108명 확진&amp;hellip;&quot;이태원클럽 학원강사발 추정&quot; - 중앙일보&amp;lt;/a&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;font color=&quot;#6f6f6f&quot;&amp;gt;중앙일보 모바일&amp;lt;/font&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&quot;https://news.google.com/__i/rss/rd/articles/CBMiK2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9R1RwQ3ZuQ2I2U1nSAQA?oc=5&quot; target=&quot;_blank&quot;&amp;gt;코로나19 신규 확진 39명&amp;hellip;수도권 이어 지역서도 산발 감염&amp;lt;/a&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;font color=&quot;#6f6f6f&quot;&amp;gt;뉴스TVCHOSUN&amp;lt;/font&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;a href=&quot;https://news.google.com/stories/CAAqOQgKIjNDQklTSURvSmMzUnZjbmt0TXpZd1NoTUtFUWlBMHR6bGxZQU1FV1BYSElmd2VCR2RLQUFQAQ?oc=5&quot; target=&quot;_blank&quot;&amp;gt;Google 뉴스에서 전체 콘텐츠 보기&amp;lt;/a&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&quot;,
          &quot;soruce&quot; : &quot;한겨레&quot;
        }]
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1590909244335&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;data class RespNewsRss(
    @field:SerializedName(&quot;channel&quot;) var channel: RespNewsRssChannel? = null
)

class RespNewsRssChannel(
    @field:SerializedName(&quot;items&quot;) var newsList: List&amp;lt;RespNews&amp;gt;? = null
)

data class RespNews(
    @field:SerializedName(&quot;title&quot;) var title: String? = null,
    @field:SerializedName(&quot;link&quot;) var link: String? = null,
    @field:SerializedName(&quot;guid&quot;) var guid: String? = null,
    @field:SerializedName(&quot;pubDate&quot;) var pubDate: String? = null,
    @field:SerializedName(&quot;description&quot;) var description: String? = null,
    @field:SerializedName(&quot;source&quot;) var source: String? = null
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;실제 사용&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;MainActivity&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1590740580119&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    private val newsService = GoogleNewsServiceFactory.makeNewsService(BuildConfig.DEBUG, &quot;https://news.google.com&quot;)

    private fun initViews() {
        btn_main.setOnClickListener {
            newsService.getNews(&quot;ko&quot;, &quot;KR&quot;, &quot;KR:ko&quot;)
                .enqueue(object : Callback&amp;lt;RespNewsRss&amp;gt; {
                    override fun onResponse(
                        call: Call&amp;lt;RespNewsRss&amp;gt;,
                        response: Response&amp;lt;RespNewsRss&amp;gt;
                    ) {
                        tv_main.text = response.body()?.channel?.newsList?.toString()
                    }

                    override fun onFailure(call: Call&amp;lt;RespNewsRss&amp;gt;, t: Throwable) {
                        Toast.makeText(this@MainActivity, t.message, Toast.LENGTH_SHORT).show()
                    }
                })
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;Commit ad3ddc26&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;+Rx&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. Service&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. OkHttpClient&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. Retrofit을 이용한 Service 구현체&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;dependecies 추가&lt;/p&gt;
&lt;pre id=&quot;code_1590907185734&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;implementation &quot;com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. Service&lt;/p&gt;
&lt;pre id=&quot;code_1590906983206&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface GoogleNewsService {

    @GET(&quot;/rss&quot;)
    fun getNews(
        @Query(&quot;hl&quot;) hl: String,
        @Query(&quot;gl&quot;) gl: String,
        @Query(&quot;ceid&quot;) ceid: String
    ): Single&amp;lt;RespNewsRss&amp;gt;

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;리턴 타입만 바꼈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. 동일함&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. Retrofit을 이용한 Service 구현체&lt;/p&gt;
&lt;pre id=&quot;code_1590907054202&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    private fun makeNewsService(baseUrl: String, okHttpClient: OkHttpClient): GoogleNewsService {
        val retrofit = Retrofit.Builder()
            .baseUrl(baseUrl)
            .client(okHttpClient)
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .addConverterFactory(SimpleXmlConverterFactory.create())
            .build()

        return retrofit.create(GoogleNewsService::class.java)
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;addCallAdapterFactory(RxJava2CallAdapterFactory.create())&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;기존의 리턴받던 Call에서 Rx객체로 변경하기 위한 한줄이 추가되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;실제사용&lt;/p&gt;
&lt;pre id=&quot;code_1590907235804&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    private val newsService = GoogleNewsServiceFactory.makeNewsService(BuildConfig.DEBUG, &quot;https://news.google.com&quot;)
    private val compositeDisposable = CompositeDisposable()

    private fun initViews() {
        btn_main.setOnClickListener {
            newsService.getNews(&quot;ko&quot;, &quot;KR&quot;, &quot;KR:ko&quot;)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe { resp -&amp;gt;
                    val newsList = resp.channel?.newsList
                    tv_main.text = newsList.toString()
                }.let {
                    compositeDisposable.add(it)
                }
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>창고</category>
      <author>날아갔나요</author>
      <guid isPermaLink="true">https://jhpop.tistory.com/128</guid>
      <comments>https://jhpop.tistory.com/128#entry128comment</comments>
      <pubDate>Fri, 29 May 2020 17:27:07 +0900</pubDate>
    </item>
  </channel>
</rss>