<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>로메오의 블로그</title>
    <link>https://romeoh.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 24 Jun 2026 10:21:10 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>romeoh</managingEditor>
    <image>
      <title>로메오의 블로그</title>
      <url>https://tistory1.daumcdn.net/tistory/2979840/attach/6e5d2d16ab6a49628dfe1f4c164e38a0</url>
      <link>https://romeoh.tistory.com</link>
    </image>
    <item>
      <title>Claude code 환경설정</title>
      <link>https://romeoh.tistory.com/512</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Claude code 설치&lt;/h2&gt;
&lt;pre id=&quot;code_1776640437218&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## claude code 설치
$ npm install -g @anthropic-ai/claude-code

## claude 로그인
$ claude&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오전 8.15.39.png&quot; data-origin-width=&quot;1017&quot; data-origin-height=&quot;906&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqpasG/dJMcabcN8Pw/Q3stKGabIYdD1D4WK6Tk8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqpasG/dJMcabcN8Pw/Q3stKGabIYdD1D4WK6Tk8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqpasG/dJMcabcN8Pw/Q3stKGabIYdD1D4WK6Tk8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqpasG%2FdJMcabcN8Pw%2FQ3stKGabIYdD1D4WK6Tk8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1017&quot; height=&quot;906&quot; data-filename=&quot;스크린샷 2026-04-20 오전 8.15.39.png&quot; data-origin-width=&quot;1017&quot; data-origin-height=&quot;906&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오전 8.16.50.png&quot; data-origin-width=&quot;1017&quot; data-origin-height=&quot;645&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DCL9Y/dJMcaciwfmA/LDOc2vbnWvvT90EP04oPdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DCL9Y/dJMcaciwfmA/LDOc2vbnWvvT90EP04oPdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DCL9Y/dJMcaciwfmA/LDOc2vbnWvvT90EP04oPdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDCL9Y%2FdJMcaciwfmA%2FLDOc2vbnWvvT90EP04oPdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1017&quot; height=&quot;645&quot; data-filename=&quot;스크린샷 2026-04-20 오전 8.16.50.png&quot; data-origin-width=&quot;1017&quot; data-origin-height=&quot;645&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오전 8.17.08.png&quot; data-origin-width=&quot;1318&quot; data-origin-height=&quot;1638&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/63EtU/dJMcadaAEcl/UhaKbIfBAXckpXOsXg3sKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/63EtU/dJMcadaAEcl/UhaKbIfBAXckpXOsXg3sKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/63EtU/dJMcadaAEcl/UhaKbIfBAXckpXOsXg3sKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F63EtU%2FdJMcadaAEcl%2FUhaKbIfBAXckpXOsXg3sKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1318&quot; height=&quot;1638&quot; data-filename=&quot;스크린샷 2026-04-20 오전 8.17.08.png&quot; data-origin-width=&quot;1318&quot; data-origin-height=&quot;1638&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오전 8.21.25.png&quot; data-origin-width=&quot;1012&quot; data-origin-height=&quot;378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWq1WE/dJMcab4X87Q/2VDezMpp4HBTIdBZRG0fv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWq1WE/dJMcab4X87Q/2VDezMpp4HBTIdBZRG0fv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWq1WE/dJMcab4X87Q/2VDezMpp4HBTIdBZRG0fv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWq1WE%2FdJMcab4X87Q%2F2VDezMpp4HBTIdBZRG0fv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1012&quot; height=&quot;378&quot; data-filename=&quot;스크린샷 2026-04-20 오전 8.21.25.png&quot; data-origin-width=&quot;1012&quot; data-origin-height=&quot;378&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정이 완료되면 해당 터미널은 닫고, 새로운 터미널에서 작업을 시작할수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;새로운 프로젝트&amp;nbsp;&lt;/h2&gt;
&lt;pre id=&quot;code_1776641213464&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ mkdir new-project
$ cd new-project
$ claude&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오전 8.26.08.png&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bs5RRq/dJMcaciwfDG/lHupRGxLApIKV10LtO1crK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bs5RRq/dJMcaciwfDG/lHupRGxLApIKV10LtO1crK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bs5RRq/dJMcaciwfDG/lHupRGxLApIKV10LtO1crK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbs5RRq%2FdJMcaciwfDG%2FlHupRGxLApIKV10LtO1crK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1006&quot; height=&quot;386&quot; data-filename=&quot;스크린샷 2026-04-20 오전 8.26.08.png&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;386&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오전 8.28.00.png&quot; data-origin-width=&quot;999&quot; data-origin-height=&quot;449&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwoxFC/dJMcadaAEqt/7gkFI7xmdN9AATPSBfKmcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwoxFC/dJMcadaAEqt/7gkFI7xmdN9AATPSBfKmcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwoxFC/dJMcadaAEqt/7gkFI7xmdN9AATPSBfKmcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwoxFC%2FdJMcadaAEqt%2F7gkFI7xmdN9AATPSBfKmcK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;999&quot; height=&quot;449&quot; data-filename=&quot;스크린샷 2026-04-20 오전 8.28.00.png&quot; data-origin-width=&quot;999&quot; data-origin-height=&quot;449&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;/init&lt;/h2&gt;
&lt;pre id=&quot;code_1776641569247&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; /init&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오전 8.33.17.png&quot; data-origin-width=&quot;995&quot; data-origin-height=&quot;493&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zc7L5/dJMcad2JTc7/jhAbaBB0XoOKkF5keo2i5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zc7L5/dJMcad2JTc7/jhAbaBB0XoOKkF5keo2i5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zc7L5/dJMcad2JTc7/jhAbaBB0XoOKkF5keo2i5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzc7L5%2FdJMcad2JTc7%2FjhAbaBB0XoOKkF5keo2i5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;995&quot; height=&quot;493&quot; data-filename=&quot;스크린샷 2026-04-20 오전 8.33.17.png&quot; data-origin-width=&quot;995&quot; data-origin-height=&quot;493&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폴더 권한을 항상 허용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오전 8.35.54.png&quot; data-origin-width=&quot;1005&quot; data-origin-height=&quot;355&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhaKiA/dJMcabcN9jS/TH6Oj2d3XIwxKnz3CF7huK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhaKiA/dJMcabcN9jS/TH6Oj2d3XIwxKnz3CF7huK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhaKiA/dJMcabcN9jS/TH6Oj2d3XIwxKnz3CF7huK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhaKiA%2FdJMcabcN9jS%2FTH6Oj2d3XIwxKnz3CF7huK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1005&quot; height=&quot;355&quot; data-filename=&quot;스크린샷 2026-04-20 오전 8.35.54.png&quot; data-origin-width=&quot;1005&quot; data-origin-height=&quot;355&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비어있는 폴더에 CLUDE.md를 만들기 위해서 1을 타이핑 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오전 8.37.56.png&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;501&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w8Ljn/dJMcaaZhXEB/CpsLkejtrCRli545MWx550/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w8Ljn/dJMcaaZhXEB/CpsLkejtrCRli545MWx550/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w8Ljn/dJMcaaZhXEB/CpsLkejtrCRli545MWx550/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw8Ljn%2FdJMcaaZhXEB%2FCpsLkejtrCRli545MWx550%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;984&quot; height=&quot;501&quot; data-filename=&quot;스크린샷 2026-04-20 오전 8.37.56.png&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;501&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CLAUDE.md를 생성할지 물으면 2번을 선택합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오전 8.39.13.png&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pR6mO/dJMcahxm37A/znInSYK49hNmYd2hK3B8sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pR6mO/dJMcahxm37A/znInSYK49hNmYd2hK3B8sk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pR6mO/dJMcahxm37A/znInSYK49hNmYd2hK3B8sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpR6mO%2FdJMcahxm37A%2FznInSYK49hNmYd2hK3B8sk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;883&quot; height=&quot;416&quot; data-filename=&quot;스크린샷 2026-04-20 오전 8.39.13.png&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성된 CLAUDE.md를 편집 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;/remote-control&lt;/h2&gt;
&lt;pre id=&quot;code_1776642652382&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; /remote-control&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오전 8.51.00.png&quot; data-origin-width=&quot;997&quot; data-origin-height=&quot;328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rjxFa/dJMcaartDhi/5a07fJ1alo1F9xm4kFUIvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rjxFa/dJMcaartDhi/5a07fJ1alo1F9xm4kFUIvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rjxFa/dJMcaartDhi/5a07fJ1alo1F9xm4kFUIvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrjxFa%2FdJMcaartDhi%2F5a07fJ1alo1F9xm4kFUIvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;997&quot; height=&quot;328&quot; data-filename=&quot;스크린샷 2026-04-20 오전 8.51.00.png&quot; data-origin-width=&quot;997&quot; data-origin-height=&quot;328&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번을 선택합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오전 8.51.47.png&quot; data-origin-width=&quot;999&quot; data-origin-height=&quot;265&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Wu7pQ/dJMcad2JTK8/XkmorDWFW5EJxZUzpqK9Mk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Wu7pQ/dJMcad2JTK8/XkmorDWFW5EJxZUzpqK9Mk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Wu7pQ/dJMcad2JTK8/XkmorDWFW5EJxZUzpqK9Mk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWu7pQ%2FdJMcad2JTK8%2FXkmorDWFW5EJxZUzpqK9Mk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;999&quot; height=&quot;265&quot; data-filename=&quot;스크린샷 2026-04-20 오전 8.51.47.png&quot; data-origin-width=&quot;999&quot; data-origin-height=&quot;265&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오전 8.52.07.png&quot; data-origin-width=&quot;3376&quot; data-origin-height=&quot;1248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b60dzI/dJMcafTQVQd/gE7BdQ6vPRWhYgoPpMhKi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b60dzI/dJMcafTQVQd/gE7BdQ6vPRWhYgoPpMhKi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b60dzI/dJMcafTQVQd/gE7BdQ6vPRWhYgoPpMhKi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb60dzI%2FdJMcafTQVQd%2FgE7BdQ6vPRWhYgoPpMhKi0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3376&quot; height=&quot;1248&quot; data-filename=&quot;스크린샷 2026-04-20 오전 8.52.07.png&quot; data-origin-width=&quot;3376&quot; data-origin-height=&quot;1248&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;url을 클릭해서 브라우저에서 작업 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_9473.PNG&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;2868&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3UyIR/dJMcafsLdkf/G0QuSB2IQ913YD6LN7Nnpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3UyIR/dJMcafsLdkf/G0QuSB2IQ913YD6LN7Nnpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3UyIR/dJMcafsLdkf/G0QuSB2IQ913YD6LN7Nnpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3UyIR%2FdJMcafsLdkf%2FG0QuSB2IQ913YD6LN7Nnpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;255&quot; height=&quot;554&quot; data-filename=&quot;IMG_9473.PNG&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;2868&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_9474.PNG&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;2868&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BTCz1/dJMcaaE1ClM/PLDoHtjgu9v0iK7XB4RbsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BTCz1/dJMcaaE1ClM/PLDoHtjgu9v0iK7XB4RbsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BTCz1/dJMcaaE1ClM/PLDoHtjgu9v0iK7XB4RbsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBTCz1%2FdJMcaaE1ClM%2FPLDoHtjgu9v0iK7XB4RbsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;277&quot; height=&quot;602&quot; data-filename=&quot;IMG_9474.PNG&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;2868&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 Claude app에서도 코딩이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;사용량 확인&amp;nbsp;&lt;/h2&gt;
&lt;pre id=&quot;code_1776643663828&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; /status&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-20 오전 9.07.50.png&quot; data-origin-width=&quot;985&quot; data-origin-height=&quot;631&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxkmBK/dJMcafl00GY/O01xtkeea5pslWK3f2WQUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxkmBK/dJMcafl00GY/O01xtkeea5pslWK3f2WQUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxkmBK/dJMcafl00GY/O01xtkeea5pslWK3f2WQUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxkmBK%2FdJMcafl00GY%2FO01xtkeea5pslWK3f2WQUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;985&quot; height=&quot;631&quot; data-filename=&quot;스크린샷 2026-04-20 오전 9.07.50.png&quot; data-origin-width=&quot;985&quot; data-origin-height=&quot;631&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AI &amp;amp; Stable Diffusion</category>
      <author>romeoh</author>
      <guid isPermaLink="true">https://romeoh.tistory.com/512</guid>
      <comments>https://romeoh.tistory.com/512#entry512comment</comments>
      <pubDate>Mon, 20 Apr 2026 08:57:52 +0900</pubDate>
    </item>
    <item>
      <title>OpenClaw 설정</title>
      <link>https://romeoh.tistory.com/510</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Ollama 설치&lt;/h2&gt;
&lt;pre id=&quot;code_1770805445087&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ brew install ollama&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Ollama 구동&lt;/h2&gt;
&lt;pre id=&quot;code_1770805638983&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ echo 'export OLLAMA_FLASH_ATTENTION=&quot;1&quot;' &amp;gt;&amp;gt; ~/.zshrc
$ echo 'export OLLAMA_KV_CACHE_TYPE=&quot;q8_0&quot;' &amp;gt;&amp;gt; ~/.zshrc
$ source ~/.zshrc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;M1 Max 성능 최적화를 위하여 환경설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1770805728156&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ brew services start ollama&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-02-11 오후 7.28.55.png&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;65&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5WuTk/dJMcajulXFC/YiCWwMiFHvC4Dj1locQMkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5WuTk/dJMcajulXFC/YiCWwMiFHvC4Dj1locQMkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5WuTk/dJMcajulXFC/YiCWwMiFHvC4Dj1locQMkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5WuTk%2FdJMcajulXFC%2FYiCWwMiFHvC4Dj1locQMkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;903&quot; height=&quot;65&quot; data-filename=&quot;스크린샷 2026-02-11 오후 7.28.55.png&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;65&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;모델 다운로드&lt;/h2&gt;
&lt;pre id=&quot;code_1770805953669&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ ollama pull llama32.
$ ollama pull qwen2.5-coder:14b&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-02-11 오후 7.36.02.png&quot; data-origin-width=&quot;1141&quot; data-origin-height=&quot;586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BbYq2/dJMcacB2b6Q/7d7miKc3z8DgmN03sr5swK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BbYq2/dJMcacB2b6Q/7d7miKc3z8DgmN03sr5swK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BbYq2/dJMcacB2b6Q/7d7miKc3z8DgmN03sr5swK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBbYq2%2FdJMcacB2b6Q%2F7d7miKc3z8DgmN03sr5swK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1141&quot; height=&quot;586&quot; data-filename=&quot;스크린샷 2026-02-11 오후 7.36.02.png&quot; data-origin-width=&quot;1141&quot; data-origin-height=&quot;586&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;Ollama 테스트&lt;/h2&gt;
&lt;pre id=&quot;code_1770969667966&quot; class=&quot;yaml&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;$ ollama run llama3.2 &quot;hello&quot;
pulling manifest
pulling dde5aa3fc5ff: 100% ▕███████████████████████████████████████████████████████████████▏ 2.0 GB
pulling 966de95ca8a6: 100% ▕███████████████████████████████████████████████████████████████▏ 1.4 KB
pulling fcc5a6bec9da: 100% ▕███████████████████████████████████████████████████████████████▏ 7.7 KB
pulling a70ff7e570d9: 100% ▕███████████████████████████████████████████████████████████████▏ 6.0 KB
pulling 56bb8bd477a5: 100% ▕███████████████████████████████████████████████████████████████▏   96 B
pulling 34bb5ab01051: 100% ▕███████████████████████████████████████████████████████████████▏  561 B
verifying sha256 digest
writing manifest
success
Hello! It's nice to meet you. Is there something I can help you with or would you like to chat?&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;OpenClaw 설치&lt;/h2&gt;
&lt;pre id=&quot;code_1770806238949&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ curl -fsSL https://openclaw.ai/install.sh | bash&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-02-11 오후 7.45.07.png&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;1019&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7gFZ6/dJMcagqS5ql/Fdcj9GgpEbbtvv12M5eOp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7gFZ6/dJMcagqS5ql/Fdcj9GgpEbbtvv12M5eOp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7gFZ6/dJMcagqS5ql/Fdcj9GgpEbbtvv12M5eOp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7gFZ6%2FdJMcagqS5ql%2FFdcj9GgpEbbtvv12M5eOp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;952&quot; height=&quot;1019&quot; data-filename=&quot;스크린샷 2026-02-11 오후 7.45.07.png&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;1019&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-02-11 오후 8.05.23.png&quot; data-origin-width=&quot;1075&quot; data-origin-height=&quot;996&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UgaAt/dJMcabb2tm7/taDnYvFzkCjMjgwhEv6oB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UgaAt/dJMcabb2tm7/taDnYvFzkCjMjgwhEv6oB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UgaAt/dJMcabb2tm7/taDnYvFzkCjMjgwhEv6oB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUgaAt%2FdJMcabb2tm7%2FtaDnYvFzkCjMjgwhEv6oB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1075&quot; height=&quot;996&quot; data-filename=&quot;스크린샷 2026-02-11 오후 8.05.23.png&quot; data-origin-width=&quot;1075&quot; data-origin-height=&quot;996&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-02-11 오후 8.05.45.png&quot; data-origin-width=&quot;981&quot; data-origin-height=&quot;1130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdsKtP/dJMcafrYF9i/BiSQdgDNKXSQlvjUBto8rk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdsKtP/dJMcafrYF9i/BiSQdgDNKXSQlvjUBto8rk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdsKtP/dJMcafrYF9i/BiSQdgDNKXSQlvjUBto8rk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdsKtP%2FdJMcafrYF9i%2FBiSQdgDNKXSQlvjUBto8rk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;981&quot; height=&quot;1130&quot; data-filename=&quot;스크린샷 2026-02-11 오후 8.05.45.png&quot; data-origin-width=&quot;981&quot; data-origin-height=&quot;1130&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-02-11 오후 8.07.20.png&quot; data-origin-width=&quot;1073&quot; data-origin-height=&quot;1042&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2dtAs/dJMcacvhQz8/SPA6sEjXiBJPs5Yiqm6v50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2dtAs/dJMcacvhQz8/SPA6sEjXiBJPs5Yiqm6v50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2dtAs/dJMcacvhQz8/SPA6sEjXiBJPs5Yiqm6v50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2dtAs%2FdJMcacvhQz8%2FSPA6sEjXiBJPs5Yiqm6v50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1073&quot; height=&quot;1042&quot; data-filename=&quot;스크린샷 2026-02-11 오후 8.07.20.png&quot; data-origin-width=&quot;1073&quot; data-origin-height=&quot;1042&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-02-11 오후 8.15.20.png&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;935&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UFEIC/dJMcachJIly/doekB2Sihxp2S5dcvpEhrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UFEIC/dJMcachJIly/doekB2Sihxp2S5dcvpEhrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UFEIC/dJMcachJIly/doekB2Sihxp2S5dcvpEhrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUFEIC%2FdJMcachJIly%2FdoekB2Sihxp2S5dcvpEhrK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;935&quot; height=&quot;935&quot; data-filename=&quot;스크린샷 2026-02-11 오후 8.15.20.png&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;935&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-02-11 오후 8.17.58.png&quot; data-origin-width=&quot;1060&quot; data-origin-height=&quot;1017&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUqJeL/dJMcaaxsm3k/KaG41cRgltnBZGik59vvG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUqJeL/dJMcaaxsm3k/KaG41cRgltnBZGik59vvG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUqJeL/dJMcaaxsm3k/KaG41cRgltnBZGik59vvG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUqJeL%2FdJMcaaxsm3k%2FKaG41cRgltnBZGik59vvG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1060&quot; height=&quot;1017&quot; data-filename=&quot;스크린샷 2026-02-11 오후 8.17.58.png&quot; data-origin-width=&quot;1060&quot; data-origin-height=&quot;1017&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-02-11 오후 8.24.07.png&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;844&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctymGo/dJMcaajVdtu/8HV5WMmJSiiwlEjqESpqW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctymGo/dJMcaajVdtu/8HV5WMmJSiiwlEjqESpqW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctymGo/dJMcaajVdtu/8HV5WMmJSiiwlEjqESpqW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctymGo%2FdJMcaajVdtu%2F8HV5WMmJSiiwlEjqESpqW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1020&quot; height=&quot;844&quot; data-filename=&quot;스크린샷 2026-02-11 오후 8.24.07.png&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;844&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-02-11 오후 8.20.23.png&quot; data-origin-width=&quot;1098&quot; data-origin-height=&quot;578&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/88ptD/dJMcac24mHH/B46Wb7gx0RfktyyadceqNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/88ptD/dJMcac24mHH/B46Wb7gx0RfktyyadceqNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/88ptD/dJMcac24mHH/B46Wb7gx0RfktyyadceqNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F88ptD%2FdJMcac24mHH%2FB46Wb7gx0RfktyyadceqNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1098&quot; height=&quot;578&quot; data-filename=&quot;스크린샷 2026-02-11 오후 8.20.23.png&quot; data-origin-width=&quot;1098&quot; data-origin-height=&quot;578&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Openclaw Web UI 접속&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-02-11 오후 8.25.53.png&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yPBVy/dJMcag5vS8L/6A3qz9yn7kXkpdODrS3cZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yPBVy/dJMcag5vS8L/6A3qz9yn7kXkpdODrS3cZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yPBVy/dJMcag5vS8L/6A3qz9yn7kXkpdODrS3cZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyPBVy%2FdJMcag5vS8L%2F6A3qz9yn7kXkpdODrS3cZk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1150&quot; height=&quot;992&quot; data-filename=&quot;스크린샷 2026-02-11 오후 8.25.53.png&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;992&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://127.0.0.1:18789/#token=efXXXXXXX13&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 사이트에 접속합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Telegram 연결하기&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-02-11 오후 8.27.57.png&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;377&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biNbQY/dJMcacWjstu/LO88coOF55w5s6NCqNKK4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biNbQY/dJMcacWjstu/LO88coOF55w5s6NCqNKK4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biNbQY/dJMcacWjstu/LO88coOF55w5s6NCqNKK4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiNbQY%2FdJMcacWjstu%2FLO88coOF55w5s6NCqNKK4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;497&quot; height=&quot;377&quot; data-filename=&quot;스크린샷 2026-02-11 오후 8.27.57.png&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;377&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본인의 bot을 검색합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-02-11 오후 8.32.29.png&quot; data-origin-width=&quot;496&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYzgEO/dJMcac9OuXd/VKYjJJaFStC8f2CFLtauoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYzgEO/dJMcac9OuXd/VKYjJJaFStC8f2CFLtauoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYzgEO/dJMcac9OuXd/VKYjJJaFStC8f2CFLtauoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYzgEO%2FdJMcac9OuXd%2FVKYjJJaFStC8f2CFLtauoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;496&quot; height=&quot;514&quot; data-filename=&quot;스크린샷 2026-02-11 오후 8.32.29.png&quot; data-origin-width=&quot;496&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/start를 누르고 pairing code를 확인 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1770809636858&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;openclaw pairing approve telegram TLXXXX5&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-02-11 오후 8.34.06.png&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uPtH0/dJMcahpOdwv/W69frKxDcHxUAD8ifvqLfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uPtH0/dJMcahpOdwv/W69frKxDcHxUAD8ifvqLfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uPtH0/dJMcahpOdwv/W69frKxDcHxUAD8ifvqLfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuPtH0%2FdJMcahpOdwv%2FW69frKxDcHxUAD8ifvqLfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;917&quot; height=&quot;183&quot; data-filename=&quot;스크린샷 2026-02-11 오후 8.34.06.png&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;183&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-02-11 오후 8.35.42.png&quot; data-origin-width=&quot;1272&quot; data-origin-height=&quot;831&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKdyB8/dJMcajnzd3J/3UvNUvoGg09G4Fxapq4FsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKdyB8/dJMcajnzd3J/3UvNUvoGg09G4Fxapq4FsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKdyB8/dJMcajnzd3J/3UvNUvoGg09G4Fxapq4FsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKdyB8%2FdJMcajnzd3J%2F3UvNUvoGg09G4Fxapq4FsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1272&quot; height=&quot;831&quot; data-filename=&quot;스크린샷 2026-02-11 오후 8.35.42.png&quot; data-origin-width=&quot;1272&quot; data-origin-height=&quot;831&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Node 설치&lt;/h2&gt;
&lt;pre id=&quot;code_1770946809057&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ openclaw node install
$ openclaw node restart&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-02-13 오전 10.41.15.png&quot; data-origin-width=&quot;2226&quot; data-origin-height=&quot;1712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cB54TZ/dJMb996okWB/vJUTtQa5asVgtLBxT49NTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cB54TZ/dJMb996okWB/vJUTtQa5asVgtLBxT49NTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cB54TZ/dJMb996okWB/vJUTtQa5asVgtLBxT49NTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcB54TZ%2FdJMb996okWB%2FvJUTtQa5asVgtLBxT49NTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2226&quot; height=&quot;1712&quot; data-filename=&quot;스크린샷 2026-02-13 오전 10.41.15.png&quot; data-origin-width=&quot;2226&quot; data-origin-height=&quot;1712&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;맥 권한 설정&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-02-13 오전 10.46.35.png&quot; data-origin-width=&quot;1670&quot; data-origin-height=&quot;1614&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bh0fE0/dJMcahpOQW6/COzrQYHXE7usKpzcN9DPDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bh0fE0/dJMcahpOQW6/COzrQYHXE7usKpzcN9DPDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bh0fE0/dJMcahpOQW6/COzrQYHXE7usKpzcN9DPDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbh0fE0%2FdJMcahpOQW6%2FCOzrQYHXE7usKpzcN9DPDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;654&quot; height=&quot;632&quot; data-filename=&quot;스크린샷 2026-02-13 오전 10.46.35.png&quot; data-origin-width=&quot;1670&quot; data-origin-height=&quot;1614&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인정보 보호 및 보안 &amp;gt; 손쉬운 사용에서 사용하는 터미널을 등록합니다. (마우스 키보드 제어)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-02-13 오전 10.50.57.png&quot; data-origin-width=&quot;1670&quot; data-origin-height=&quot;1614&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/urgIi/dJMcajumEYr/qSCmyOeDGtPY1PyM44klr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/urgIi/dJMcajumEYr/qSCmyOeDGtPY1PyM44klr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/urgIi/dJMcajumEYr/qSCmyOeDGtPY1PyM44klr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FurgIi%2FdJMcajumEYr%2FqSCmyOeDGtPY1PyM44klr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;705&quot; height=&quot;681&quot; data-filename=&quot;스크린샷 2026-02-13 오전 10.50.57.png&quot; data-origin-width=&quot;1670&quot; data-origin-height=&quot;1614&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인정보 보호 및 보안 &amp;gt; 화면 및 시스템 오디오 녹음에서 사용하는 터미널을 등록합니다. (화면기록)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-02-13 오전 10.57.50.png&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;1090&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k6CRw/dJMcaajVQiU/EgTrokY23A5DVExdPUcs00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k6CRw/dJMcaajVQiU/EgTrokY23A5DVExdPUcs00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k6CRw/dJMcaajVQiU/EgTrokY23A5DVExdPUcs00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk6CRw%2FdJMcaajVQiU%2FEgTrokY23A5DVExdPUcs00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;431&quot; height=&quot;477&quot; data-filename=&quot;스크린샷 2026-02-13 오전 10.57.50.png&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;1090&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-02-13 오전 11.13.06.png&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YBEWQ/dJMcacB2T3C/ADgWpIKKwFA1Qn0JE3haR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YBEWQ/dJMcacB2T3C/ADgWpIKKwFA1Qn0JE3haR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YBEWQ/dJMcacB2T3C/ADgWpIKKwFA1Qn0JE3haR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYBEWQ%2FdJMcacB2T3C%2FADgWpIKKwFA1Qn0JE3haR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;488&quot; height=&quot;519&quot; data-filename=&quot;스크린샷 2026-02-13 오전 11.13.06.png&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지는 gpt-4o 모델로 동작합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아주 잘 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Llama 3.2, Qwen 모델 연결&lt;/h2&gt;
&lt;pre id=&quot;code_1770810513263&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ openclaw configure

  OpenClaw 2026.2.12 (f9e444d)
   I'm the assistant your terminal demanded, not the one your sleep schedule requested.

▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
██░▄▄▄░██░▄▄░██░▄▄▄██░▀██░██░▄▄▀██░████░▄▄▀██░███░██
██░███░██░▀▀░██░▄▄▄██░█░█░██░█████░████░▀▀░██░█░█░██
██░▀▀▀░██░█████░▀▀▀██░██▄░██░▀▀▄██░▀▀░█░██░██▄▀▄▀▄██
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
                    OPENCLAW                      
 
┌  OpenClaw configure
│
◇  Existing config detected ─────────╮
│                                    │
│  workspace: ~/.openclaw/workspace  │
│  model: ollama/llama3.2:latest     │
│  gateway.mode: local               │
│  gateway.port: 18789               │
│  gateway.bind: loopback            │
│  skills.nodeManager: npm           │
│                                    │
├────────────────────────────────────╯
│
◇  Where will the Gateway run?
│  Local (this machine)
│
◇  Select sections to configure
│  Gateway
│
◇  Gateway port
│  18789
│
◇  Gateway bind mode
│  Loopback (Local only)
│
◇  Gateway auth
│  Token
│
◇  Tailscale exposure
│  Off
│
◇  Gateway token (blank to generate)
│  d180f619c7xxxxxxxxxc8d3edd45c3c0c
Updated ~/.openclaw/openclaw.json
│
◇  Select sections to configure
│  Model
│
◇  Model/auth provider
│  Custom Provider
│
◇  API Base URL
│  http://127.0.0.1:11434/v1
│
◇  API Key (leave blank if not required)
│  ollama
│
◇  Endpoint compatibility
│  OpenAI-compatible
│
◇  Model ID
│  llama3.2:latest
│
◇  Verification failed: This operation was aborted
│
◇  What would you like to change?
│  Change base URL
│
◇  API Base URL
│  http://localhost:11434/v1
│
◇  API Key (leave blank if not required)
│  ollama
│
◇  Verification successful.
│
◇  Endpoint ID
│  custom-localhost-11434
│
◇  Model alias (optional)
│  ollama
Configured custom provider: custom-localhost-11434/llama3.2:latest
Updated ~/.openclaw/openclaw.json
│
◇  Select sections to configure
│  Continue
│
◇  Control UI ───────────────────────────────────────────────────────────────────────────────╮
│                                                                                            │
│  Web UI: http://127.0.0.1:18789/                                                           │
│  Gateway WS: ws://127.0.0.1:18789                                                          │
│  Gateway: not detected (gateway closed (1006 abnormal closure (no close frame)): no close  │
│  reason)                                                                                   │
│  Docs: https://docs.openclaw.ai/web/control-ui                                             │
│                                                                                            │
├────────────────────────────────────────────────────────────────────────────────────────────╯
│
└  Configure complete.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1770960647883&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ openclaw gateway&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;환각증상??&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-02-13 오후 3.42.30.png&quot; data-origin-width=&quot;1110&quot; data-origin-height=&quot;1206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsJC2t/dJMcabJVsVb/izqh2HDS2dseUHZvwiHuAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsJC2t/dJMcabJVsVb/izqh2HDS2dseUHZvwiHuAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsJC2t/dJMcabJVsVb/izqh2HDS2dseUHZvwiHuAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsJC2t%2FdJMcabJVsVb%2Fizqh2HDS2dseUHZvwiHuAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;540&quot; height=&quot;587&quot; data-filename=&quot;스크린샷 2026-02-13 오후 3.42.30.png&quot; data-origin-width=&quot;1110&quot; data-origin-height=&quot;1206&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gpt-4o는 답변을 잘하지만 Llama나 qwen은 이렇게 답변을 하네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-02-13 오후 3.46.30.png&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;986&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dNdilo/dJMcac9Pd9w/Nb6cqHD3UtvME35X2doaz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dNdilo/dJMcac9Pd9w/Nb6cqHD3UtvME35X2doaz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dNdilo/dJMcac9Pd9w/Nb6cqHD3UtvME35X2doaz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdNdilo%2FdJMcac9Pd9w%2FNb6cqHD3UtvME35X2doaz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;553&quot; height=&quot;490&quot; data-filename=&quot;스크린샷 2026-02-13 오후 3.46.30.png&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;986&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/reset을 시켜서 세션을 초기화합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 정확한 날씨를 받아오지는 못합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-02-13 오후 3.57.17.png&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwAkSJ/dJMcahXEFSX/dTOhy0hfQD2DP5xl6xSdSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwAkSJ/dJMcahXEFSX/dTOhy0hfQD2DP5xl6xSdSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwAkSJ/dJMcahXEFSX/dTOhy0hfQD2DP5xl6xSdSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwAkSJ%2FdJMcahXEFSX%2FdTOhy0hfQD2DP5xl6xSdSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;524&quot; height=&quot;212&quot; data-filename=&quot;스크린샷 2026-02-13 오후 3.57.17.png&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;456&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;qwen2.5-coder:14b 응답 속도가 상당히 느리네요... 2분..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-02-13 오후 3.59.15.png&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;986&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vIVSG/dJMcadgDUD2/ecCYlC1zoi0V2A8wc0LdS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vIVSG/dJMcadgDUD2/ecCYlC1zoi0V2A8wc0LdS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vIVSG/dJMcadgDUD2/ecCYlC1zoi0V2A8wc0LdS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvIVSG%2FdJMcadgDUD2%2FecCYlC1zoi0V2A8wc0LdS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;438&quot; height=&quot;379&quot; data-filename=&quot;스크린샷 2026-02-13 오후 3.59.15.png&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;986&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Llama3.2는 qwen 보다는 조금 빠르고 똑똑한거 같지만.. 속도가...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;버전별 특징&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 256px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;버전&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;파라미터수&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;특징&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;필요VRAM (경량화)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;Llama 3.2&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;1B&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;모바일용&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;~ 1GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;Llama 3.2&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;3B&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;스마트폰&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;~ 2.5GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;Llama 3.1&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;8B&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;일반PC&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;~ 6.GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;Llama 3.2&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;11B&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;이미지 인식가능 Vision&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;~ 8GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;Llama 3.1&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;70B&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;고성능 추론&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;~ 40GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;Llama 3.2&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;90B&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;고성능 이미지&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;~ 54GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;Llama 3.1&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;405B&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;GPT-4o급&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;~ 230GB+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;Llama 3.3&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;70B&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;양자화&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 19px;&quot;&gt;~ 44GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;Qwen-2.5&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;3B&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;모바일용&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;~ 2.5GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;Qwen-2.5&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;7B&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;Llama 8B와 경쟁&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;~ 5.5GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;Qwen-2.5&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;14B&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;가성비&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;~ 10GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;Qwen-2.5&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;32B&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;코딩용&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;~ 20GB&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;Qwen-2.5&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;72B&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;Llama 70B와 경쟁&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;~ 43GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;Gemma 2&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;2.6B&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;모바일&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;~ 1.6GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;Gemma 2&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;9.2B&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;Llama 8B와 경쟁&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;~ 5.5GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;Gemma 2&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;27.2B&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;70B급&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;~ 16GB&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;대형모델로 변경하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;llama3.2와 qwen2.5-coder:14b를 제거하고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Qwen-2.5:32b를 설치합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1770968857521&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ ollama list
$ ollama rm llama3.2
$ ollama rm qwen2.5-coder:14b&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1770968876791&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ ollama pull qwen2.5:32b&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1771381496299&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;openclaw configure

  OpenClaw 2026.2.12 (f9e444d)
   Gateway online&amp;mdash;please keep hands, feet, and appendages inside the shell at all times.

▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
██░▄▄▄░██░▄▄░██░▄▄▄██░▀██░██░▄▄▀██░████░▄▄▀██░███░██
██░███░██░▀▀░██░▄▄▄██░█░█░██░█████░████░▀▀░██░█░█░██
██░▀▀▀░██░█████░▀▀▀██░██▄░██░▀▀▄██░▀▀░█░██░██▄▀▄▀▄██
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
                    OPENCLAW                      
 
┌  OpenClaw configure
│
◇  Existing config detected ─────────╮
│                                    │
│  workspace: ~/.openclaw/workspace  │
│  model: openrouter/auto            │
│  gateway.mode: local               │
│  gateway.port: 18789               │
│  gateway.bind: loopback            │
│  skills.nodeManager: npm           │
│                                    │
├────────────────────────────────────╯
│
◇  Where will the Gateway run?
│  Local (this machine)
│
◇  Select sections to configure
│  Model
│
◇  Model/auth provider
│  Custom Provider
│
◇  API Base URL
│  http://localhost:11434/v1
│
◇  API Key (leave blank if not required)
│  gemma
│
◇  Endpoint compatibility
│  OpenAI-compatible
│
◇  Model ID
│  gemma2:27b
│
◇  Verification successful.
│
◇  Endpoint ID
│  custom-localhost-11434
│
◇  Model alias (optional)
│  gamma&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;context 설정&lt;/h2&gt;
&lt;pre id=&quot;code_1771392248068&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;05:22:39 [agent/embedded] blocked model (context window too small): romeoh-ai/qwen2.5:32b ctx=4096 (min=16000) source=modelsConfig
05:22:39 [diagnostic] lane task error: lane=main durationMs=21 error=&quot;FailoverError: Model context window too small (4096 tokens). Minimum is 16000.&quot;
05:22:39 [diagnostic] lane task error: lane=session:agent:main:main durationMs=24 error=&quot;FailoverError: Model context window too small (4096 tokens). Minimum is 16000.&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-02-18 오후 2.24.32.png&quot; data-origin-width=&quot;2478&quot; data-origin-height=&quot;1794&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vB5zp/dJMcaca15lB/slSJ5yhkWaQAsKYOGR7vV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vB5zp/dJMcaca15lB/slSJ5yhkWaQAsKYOGR7vV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vB5zp/dJMcaca15lB/slSJ5yhkWaQAsKYOGR7vV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvB5zp%2FdJMcaca15lB%2FslSJ5yhkWaQAsKYOGR7vV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2478&quot; height=&quot;1794&quot; data-filename=&quot;스크린샷 2026-02-18 오후 2.24.32.png&quot; data-origin-width=&quot;2478&quot; data-origin-height=&quot;1794&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Openclaw 주요 명령어 (2026.2.9 버전 기준)&lt;/h2&gt;
&lt;pre id=&quot;code_1770946753250&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## openclaw 서비스 시작 종료
$ brew services start openclaw
$ brew services stop openclaw


## gateway 서버 구동
$ openclaw gateway
$ openclaw gateway stop

## 노드 설치
$ openclaw node install
$ openclaw node restart

## 설정 마법사
$ openclaw onboard

## 설정 수정
$ openclaw configure

## 상태 확인
$ openclaw doctor

## 버전 확인
$ openclaw --version

## 업그레이드
$ curl -fsSL https://openclaw.ai/install.sh | bash


## 구동 프로세스 확인
$ ps aux | grep openclaw
$ pkill -9 openclaw&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Ollama 주요 명령어&lt;/h2&gt;
&lt;pre id=&quot;code_1770956281711&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ brew services start ollama
$ brew services stop ollama

$ ollama list
$ ollama run llama3.2 &quot;hello&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AI &amp;amp; Stable Diffusion</category>
      <author>romeoh</author>
      <guid isPermaLink="true">https://romeoh.tistory.com/510</guid>
      <comments>https://romeoh.tistory.com/510#entry510comment</comments>
      <pubDate>Wed, 11 Feb 2026 21:59:58 +0900</pubDate>
    </item>
    <item>
      <title>Cursor AI에서 flutter앱 실시간 디버깅하기</title>
      <link>https://romeoh.tistory.com/509</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용가능한 device 확인&lt;/p&gt;
&lt;pre id=&quot;code_1767320115644&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ flutter devices
Found 4 connected devices:
  sdk gphone64 arm64 (mobile) &amp;bull; emulator-5554                        &amp;bull; android-arm64  &amp;bull; Android 16 (API 36) (emulator)
  iPhone 17 Pro Max (mobile)  &amp;bull; 8AE9D310-0FA4-4288-9A3C-51CB50D3A1A3 &amp;bull; ios            &amp;bull;
  com.apple.CoreSimulator.SimRuntime.iOS-26-2 (simulator)
  macOS (desktop)             &amp;bull; macos                                &amp;bull; darwin-arm64   &amp;bull; macOS 26.1 25B78 darwin-arm64
  Chrome (web)                &amp;bull; chrome                               &amp;bull; web-javascript &amp;bull; Google Chrome 143.0.7499.170&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.vscode &amp;gt; launch.json&lt;/p&gt;
&lt;pre id=&quot;code_1767320209297&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;version&quot;: &quot;0.2.0&quot;,
  &quot;configurations&quot;: [
    {
      &quot;name&quot;: &quot;Flutter: Android emulator&quot;,
      &quot;request&quot;: &quot;launch&quot;,
      &quot;type&quot;: &quot;dart&quot;,
      &quot;program&quot;: &quot;frontend/lib/main.dart&quot;,
      &quot;deviceId&quot;: &quot;emulator-5554&quot;
    },
    {
      &quot;name&quot;: &quot;Flutter: iOS simulator&quot;,
      &quot;request&quot;: &quot;launch&quot;,
      &quot;type&quot;: &quot;dart&quot;,
      &quot;program&quot;: &quot;frontend/lib/main.dart&quot;,
      &quot;deviceId&quot;: &quot;8AE9D310-0FA4-4288-9A3C-51CB50D3A1A3&quot;
    },
    {
      &quot;name&quot;: &quot;Flutter: Attach&quot;,
      &quot;request&quot;: &quot;attach&quot;,
      &quot;type&quot;: &quot;dart&quot;,
      &quot;program&quot;: &quot;frontend/lib/main.dart&quot;
    }
  ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-01-02 오전 11.19.39.png&quot; data-origin-width=&quot;1056&quot; data-origin-height=&quot;958&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bebAck/dJMcadUVlWg/jRmys0ArHEbPD3HiaFqsek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bebAck/dJMcadUVlWg/jRmys0ArHEbPD3HiaFqsek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bebAck/dJMcadUVlWg/jRmys0ArHEbPD3HiaFqsek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbebAck%2FdJMcadUVlWg%2FjRmys0ArHEbPD3HiaFqsek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1056&quot; height=&quot;958&quot; data-filename=&quot;스크린샷 2026-01-02 오전 11.19.39.png&quot; data-origin-width=&quot;1056&quot; data-origin-height=&quot;958&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;dart와 flutter 확장자를 설치합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-01-02 오전 11.17.48.png&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;994&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pAAlI/dJMcabv5Pnu/LmTFvkx51uEcSngvzXamQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pAAlI/dJMcabv5Pnu/LmTFvkx51uEcSngvzXamQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pAAlI/dJMcabv5Pnu/LmTFvkx51uEcSngvzXamQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpAAlI%2FdJMcabv5Pnu%2FLmTFvkx51uEcSngvzXamQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1044&quot; height=&quot;994&quot; data-filename=&quot;스크린샷 2026-01-02 오전 11.17.48.png&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;994&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-01-02 오전 11.21.58.png&quot; data-origin-width=&quot;2394&quot; data-origin-height=&quot;884&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brHpZL/dJMcag5fpOx/5roi83IUqcdf2SaxdHWml0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brHpZL/dJMcag5fpOx/5roi83IUqcdf2SaxdHWml0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brHpZL/dJMcag5fpOx/5roi83IUqcdf2SaxdHWml0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrHpZL%2FdJMcag5fpOx%2F5roi83IUqcdf2SaxdHWml0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2394&quot; height=&quot;884&quot; data-filename=&quot;스크린샷 2026-01-02 오전 11.21.58.png&quot; data-origin-width=&quot;2394&quot; data-origin-height=&quot;884&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>App &amp;amp; OS/Hybrid</category>
      <author>romeoh</author>
      <guid isPermaLink="true">https://romeoh.tistory.com/509</guid>
      <comments>https://romeoh.tistory.com/509#entry509comment</comments>
      <pubDate>Fri, 2 Jan 2026 11:22:55 +0900</pubDate>
    </item>
    <item>
      <title>유사사진 추천하기 Flask + MongoDB + OpenCLIP +FAISS</title>
      <link>https://romeoh.tistory.com/508</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;가상환경 설정&lt;/h2&gt;
&lt;pre id=&quot;code_1753572701535&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ mkdir flask-image-app
$ cd flask-image-app
$ code .
$ python3 -m venv venv
$ source venv/bin/activate&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;requirements.txt&lt;/h2&gt;
&lt;pre id=&quot;code_1753573437283&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Flask==3.1.1
pymongo==4.13.2
faiss-cpu==1.7.4
torch==2.1.0
torchvision==0.16.0
open-clip-torch==2.20.0
Pillow==9.5.0
numpy==1.26.4
python-dotenv==1.1.1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1753573462990&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ pip install -r requirements.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;indexing.py&lt;/h2&gt;
&lt;pre id=&quot;code_1753579480264&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os
import faiss
import open_clip
import torch
import numpy as np
from PIL import Image
from pymongo import MongoClient

# 모델 생성 및 전처리 함수 반환
# ViT-B-32 모델 사용
# laion2b_s34b_b79k 버전
model, _, preprocess = open_clip.create_model_and_transforms('ViT-B-32', pretrained='laion2b_s34b_b79k')
device = 'cpu'
model = model.to(device)

# MongoDB 연결
client = MongoClient(os.getenv(&quot;MONGO_URL&quot;, &quot;mongodb://localhost:27017/&quot;))
db = client[&quot;image_db&quot;]
collection = db[&quot;images&quot;]

image_dir = './static/images'
# 벡터 인덱스 생성
index = faiss.IndexFlatL2(512)
paths = []

for filename in os.listdir(image_dir):
    if not filename.lower().endswith(('.png', '.jpg', '.jpeg')):
        continue
    path = os.path.join(image_dir, filename)
    image = preprocess(Image.open(path)).unsqueeze(0).to(device)        # 이미지를 모델에 맞게 전처리하고 모델에 전달
    with torch.no_grad():                                               # 메모리 사용량 줄이기 위해 모델 연산 비활성화
        emb = model.encode_image(image).cpu().numpy().astype('float32') # 모델 연산 결과를 numpy 배열로 변환
        emb = emb.reshape(1, -1)                                        # 모델 출력 형태에 맞게 변환
    index.add(emb)                                                      # 벡터 인덱스에 추가
    collection.insert_one({
        &quot;filename&quot;: filename,
        &quot;path&quot;: path,
        &quot;vector&quot;: emb[0].tolist()
    })
    paths.append(path)

faiss.write_index(index, 'faiss_index.bin')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;app.py&lt;/h2&gt;
&lt;pre id=&quot;code_1753579510453&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from flask import Flask, render_template, request, jsonify
from pymongo import MongoClient
import faiss
import open_clip
import torch
import numpy as np
from PIL import Image
import os

app = Flask(__name__)
client = MongoClient(os.getenv(&quot;MONGO_URL&quot;, &quot;mongodb://localhost:27017/&quot;))
db = client[&quot;image_db&quot;]
collection = db[&quot;images&quot;]

# 모델과 인덱스 로드
model, _, preprocess = open_clip.create_model_and_transforms('ViT-B-32', pretrained='laion2b_s34b_b79k')
model.eval().to('cpu')
index = faiss.read_index('faiss_index.bin') # 벡터 인덱스 로드

@app.route('/')
def home():
    images = list(collection.find().limit(100))
    return render_template('index.html', images=images)

@app.route('/similar', methods=['POST'])
def similar():
    data = request.json
    filename = data['filename']
    image = Image.open(os.path.join('static/images', filename))
    
    # 이미지를 모델에 맞게 전처리하고 모델에 전달
    image_tensor = preprocess(image).unsqueeze(0)   
    with torch.no_grad():
        # 이미지를 모델에 맞게 전처리하고 모델에 전달
        vector = model.encode_image(image_tensor).cpu().numpy().astype('float32')   
    D, I = index.search(vector, 10)                     # 벡터 인덱스에서 가장 가까운 이미지 검색
    skip_index = int(I[0][1])                           # 자기 자신을 제외한 가장 가까운 이미지의 인덱스
    results = list(collection.find().skip(skip_index))  # 자기 자신을 제외한 가장 가까운 이미지의 인덱스
    return jsonify([r['filename'] for r in results])

if __name__ == '__main__':
    app.run(debug=True, port=7000, use_reloader=True)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;template/index.html&lt;/h2&gt;
&lt;pre id=&quot;code_1753579540985&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
  &amp;lt;title&amp;gt;Image Viewer&amp;lt;/title&amp;gt;
  &amp;lt;style&amp;gt;
    body {
      font-family: sans-serif;
    }
    #image-list img {
      cursor: pointer;
      margin: 5px;
      border: 2px solid transparent;
      transition: border 0.2s;
    }
    #image-list img:hover {
      border: 2px solid #007bff;
    }
    #popup-overlay {
      position: fixed;
      top: 0; left: 0;
      width: 100%; height: 100%;
      background: rgba(0, 0, 0, 0.7);
      display: none;
      justify-content: center;
      align-items: center;
      z-index: 9999;
    }
    #popup-content {
      background: white;
      padding: 20px;
      max-width: 90%;
      max-height: 90%;
      overflow: auto;
      border-radius: 8px;
      position: relative;
    }
    #popup-content h3 {
      margin-top: 0;
    }
    #popup-images {
      position: relative;
      display: flex;
      align-items: center;
      justify-content: center;
    }
    #popup-main-image {
      max-width: 80%;
      max-height: 70vh;
      object-fit: contain;
    }
    .nav-button {
      position: absolute;
      top: 50%;
      transform: translateY(-50%);
      background: rgba(0, 0, 0, 0.7);
      color: white;
      border: none;
      padding: 15px 10px;
      cursor: pointer;
      font-size: 18px;
      border-radius: 5px;
      transition: background 0.3s;
    }
    .nav-button:hover {
      background: rgba(0, 0, 0, 0.9);
    }
    .nav-button:disabled {
      background: rgba(0, 0, 0, 0.3);
      cursor: not-allowed;
    }
    #prev-button {
      left: 10px;
    }
    #next-button {
      right: 10px;
    }
    #close-button {
      position: absolute;
      top: 10px;
      right: 10px;
      background: rgba(0, 0, 0, 0.7);
      color: white;
      border: none;
      padding: 5px 10px;
      cursor: pointer;
      border-radius: 3px;
    }
    #image-counter {
      position: absolute;
      bottom: 10px;
      left: 50%;
      transform: translateX(-50%);
      background: rgba(0, 0, 0, 0.7);
      color: white;
      padding: 5px 10px;
      border-radius: 3px;
      font-size: 14px;
    }
  &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;h1&amp;gt;Image Gallery&amp;lt;/h1&amp;gt;
  &amp;lt;div id=&quot;image-list&quot;&amp;gt;
    {% for image in images %}
      &amp;lt;img src=&quot;/static/images/{{ image.filename }}&quot; width=&quot;100&quot; onclick=&quot;showSimilar('{{ image.filename }}')&quot;&amp;gt;
    {% endfor %}
  &amp;lt;/div&amp;gt;

  &amp;lt;!-- 팝업 오버레이 --&amp;gt;
  &amp;lt;div id=&quot;popup-overlay&quot; onclick=&quot;closePopup()&quot;&amp;gt;
    &amp;lt;div id=&quot;popup-content&quot; onclick=&quot;event.stopPropagation()&quot;&amp;gt;
      &amp;lt;button id=&quot;close-button&quot; onclick=&quot;closePopup()&quot;&amp;gt;&amp;times;&amp;lt;/button&amp;gt;
      &amp;lt;h3&amp;gt;Similar Images&amp;lt;/h3&amp;gt;
      &amp;lt;div id=&quot;popup-images&quot;&amp;gt;
        &amp;lt;button id=&quot;prev-button&quot; class=&quot;nav-button&quot; onclick=&quot;navigateImage(-1)&quot;&amp;gt;&amp;lsaquo;&amp;lt;/button&amp;gt;
        &amp;lt;img id=&quot;popup-main-image&quot; src=&quot;&quot;&amp;gt;
        &amp;lt;button id=&quot;next-button&quot; class=&quot;nav-button&quot; onclick=&quot;navigateImage(1)&quot;&amp;gt;&amp;rsaquo;&amp;lt;/button&amp;gt;
        &amp;lt;div id=&quot;image-counter&quot;&amp;gt;&amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;

  &amp;lt;script&amp;gt;
    let currentImages = [];
    let currentIndex = 0;

    async function showSimilar(filename) {
      const res = await fetch('/similar', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ filename })
      });

      if (!res.ok) {
        alert(&quot;서버 오류 발생&quot;);
        return;
      }

      const data = await res.json();
      currentImages = [filename, ...data];
      currentIndex = 0;
      
      updatePopupImage();
      document.getElementById('popup-overlay').style.display = 'flex';
    }

    function updatePopupImage() {
      const mainImage = document.getElementById('popup-main-image');
      const counter = document.getElementById('image-counter');
      const prevButton = document.getElementById('prev-button');
      const nextButton = document.getElementById('next-button');
      
      mainImage.src = `/static/images/${currentImages[currentIndex]}`;
      counter.textContent = `${currentIndex + 1} / ${currentImages.length}`;
      
      // 버튼 활성화/비활성화
      prevButton.disabled = currentIndex === 0;
      nextButton.disabled = currentIndex === currentImages.length - 1;
    }

    function navigateImage(direction) {
      const newIndex = currentIndex + direction;
      if (newIndex &amp;gt;= 0 &amp;amp;&amp;amp; newIndex &amp;lt; currentImages.length) {
        currentIndex = newIndex;
        updatePopupImage();
      }
    }

    function closePopup() {
      document.getElementById('popup-overlay').style.display = 'none';
      currentImages = [];
      currentIndex = 0;
    }

    // 키보드 네비게이션
    document.addEventListener('keydown', function(event) {
      if (document.getElementById('popup-overlay').style.display === 'flex') {
        if (event.key === 'ArrowLeft') {
          navigateImage(-1);
        } else if (event.key === 'ArrowRight') {
          navigateImage(1);
        } else if (event.key === 'Escape') {
          closePopup();
        }
      }
    });
  &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;mongodb 데이터 확인&lt;/h2&gt;
&lt;pre id=&quot;code_1753579701827&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ docker exec -it mongo bash
$ mongo -u romeoh -p 'GXXXXX$' --authenticationDatabase admin
$ show dbs
$ use image_db
$ show collections
$ db.image.find().pretty()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-07-27 오전 10.29.09.png&quot; data-origin-width=&quot;1260&quot; data-origin-height=&quot;1738&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GQCFg/btsPAiLhTGu/HhtENax69WIabudtAy6py1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GQCFg/btsPAiLhTGu/HhtENax69WIabudtAy6py1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GQCFg/btsPAiLhTGu/HhtENax69WIabudtAy6py1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGQCFg%2FbtsPAiLhTGu%2FHhtENax69WIabudtAy6py1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1260&quot; height=&quot;1738&quot; data-filename=&quot;스크린샷 2025-07-27 오전 10.29.09.png&quot; data-origin-width=&quot;1260&quot; data-origin-height=&quot;1738&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-07-27 오전 10.26.49.png&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/deKNpr/btsPAhMiW0V/v43rsuaJ4kfJXVb7TCKiek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/deKNpr/btsPAhMiW0V/v43rsuaJ4kfJXVb7TCKiek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/deKNpr/btsPAhMiW0V/v43rsuaJ4kfJXVb7TCKiek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdeKNpr%2FbtsPAhMiW0V%2Fv43rsuaJ4kfJXVb7TCKiek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;735&quot; height=&quot;439&quot; data-filename=&quot;스크린샷 2025-07-27 오전 10.26.49.png&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;439&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-07-27 오전 10.26.00.png&quot; data-origin-width=&quot;3166&quot; data-origin-height=&quot;1686&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yzVPM/btsPBpPQnuw/EJHy3kKWd07Ud3rQ1H7yc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yzVPM/btsPBpPQnuw/EJHy3kKWd07Ud3rQ1H7yc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yzVPM/btsPBpPQnuw/EJHy3kKWd07Ud3rQ1H7yc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyzVPM%2FbtsPBpPQnuw%2FEJHy3kKWd07Ud3rQ1H7yc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3166&quot; height=&quot;1686&quot; data-filename=&quot;스크린샷 2025-07-27 오전 10.26.00.png&quot; data-origin-width=&quot;3166&quot; data-origin-height=&quot;1686&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Backend/Python &amp;amp; Blockchain</category>
      <author>romeoh</author>
      <guid isPermaLink="true">https://romeoh.tistory.com/508</guid>
      <comments>https://romeoh.tistory.com/508#entry508comment</comments>
      <pubDate>Sun, 27 Jul 2025 10:31:07 +0900</pubDate>
    </item>
    <item>
      <title>python 가상환경 설정</title>
      <link>https://romeoh.tistory.com/507</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;virtualenv&lt;/h2&gt;
&lt;pre id=&quot;code_1753572571068&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ mkdir project_folder
$ cd project_folder
$ code .
$ python3 -m venv venv
$ source venv/bin/activate
$ (venv) python --version
Python 3.11.2

$ (venv) deactivate&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;poetry&lt;/h2&gt;
&lt;pre id=&quot;code_1753570957628&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# poetry 설치
$ curl -sSL https://install.python-poetry.org | python3 -

# poetry 환경설정
$ export PATH=&quot;$HOME/.local/bin:$PATH&quot;

$ poetry --version
Poetry (version 2.1.3)

$ mkdir insta-gura
$ cd insta-gura
$ code .

# poetry 초기화
$ poetry init

# 기본 파일 생성
$ touch README.md
$ mkdir insta_gura
$ cd insta_gura
$ touch __init__.py

# poetry 설치
$ poetry install

# 가상공간 설정
$ poetry env info --path
$ source $(poetry env info --path)/bin/activate 
(insta-gura-py3.11) python --version
Python 3.11.2

# 가상환경 종료
$ deactivate&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Backend/Python &amp;amp; Blockchain</category>
      <author>romeoh</author>
      <guid isPermaLink="true">https://romeoh.tistory.com/507</guid>
      <comments>https://romeoh.tistory.com/507#entry507comment</comments>
      <pubDate>Sun, 27 Jul 2025 08:30:18 +0900</pubDate>
    </item>
    <item>
      <title>TensorFlow 사진 분류기</title>
      <link>https://romeoh.tistory.com/506</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;시나리오&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Local 맥북프로 M1 Max 실리콘칩에서 '남자', '여자', '고양이', '자동차', '건물' 사진을 학습한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. NAS 콘테이너에 배포한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. NAS에서 특정 폴더에 사진을 넣고, 해당 사진을 추론해서 분류한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;icrawler&amp;nbsp;검색엔진에서&amp;nbsp;사진&amp;nbsp;크롤링해서&amp;nbsp;다운로드&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;icrawler 설치&lt;/h2&gt;
&lt;pre id=&quot;code_1753513819144&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ pip install icrawler&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;crawler.py&lt;/h2&gt;
&lt;pre id=&quot;code_1753514063729&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from icrawler.builtin import GoogleImageCrawler

# google
google_crawler = GoogleImageCrawler(
    storage={'root_dir': 'download/cats'},
)
google_crawler.crawl(
    keyword='cat',
    max_num=20,
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실행&lt;/h2&gt;
&lt;pre id=&quot;code_1753514098799&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ python crawler.py&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-07-26 오후 4.15.20.png&quot; data-origin-width=&quot;1217&quot; data-origin-height=&quot;1166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIg0OA/btsPAnZGHHz/70H54bBmTVhywU1MP0cW70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIg0OA/btsPAnZGHHz/70H54bBmTVhywU1MP0cW70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIg0OA/btsPAnZGHHz/70H54bBmTVhywU1MP0cW70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIg0OA%2FbtsPAnZGHHz%2F70H54bBmTVhywU1MP0cW70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1217&quot; height=&quot;1166&quot; data-filename=&quot;스크린샷 2025-07-26 오후 4.15.20.png&quot; data-origin-width=&quot;1217&quot; data-origin-height=&quot;1166&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-07-26 오후 4.51.27.png&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;1572&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcvFHV/btsPAfANz40/3z3YkPfCIUK2fPesimILC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcvFHV/btsPAfANz40/3z3YkPfCIUK2fPesimILC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcvFHV/btsPAfANz40/3z3YkPfCIUK2fPesimILC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcvFHV%2FbtsPAfANz40%2F3z3YkPfCIUK2fPesimILC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1468&quot; height=&quot;1572&quot; data-filename=&quot;스크린샷 2025-07-26 오후 4.51.27.png&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;1572&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;남자', '여자', '고양이', '자동차', '건물' 키워드의 사진을 각 200장씩 다운로드 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이미지 학습&lt;/h2&gt;
&lt;pre id=&quot;code_1753516860185&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ pip install tensorflow&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;train_model.py&lt;/h2&gt;
&lt;pre id=&quot;code_1753522797159&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.applications import MobileNetV2
from tensorflow.keras import layers, models
import os

# data 준비
data_dir = 'dataset'
image_size = (224, 224)
batch_size = 32             # 32장씩 배치로 처리, 1 epoch에 32장씩

# 데이터 증강 및 전처리
datagen = ImageDataGenerator(
    rescale=1./255,         # 픽셀 값을 0-1 사이로 정규화
    validation_split=0.2    # 20%를 검증 데이터로 분할
)

# 데이터 로드 및 증강 설정
train_data = datagen.flow_from_directory(
    data_dir,
    target_size=image_size,
    batch_size=batch_size,
    class_mode='categorical',   # 다중 클래스 분류를 위한 categorical
    subset='training',
    shuffle=True
)

val_data = datagen.flow_from_directory(
    data_dir,
    target_size=image_size,
    batch_size=batch_size,
    class_mode='categorical',
    subset='validation'
)

# 모델 정의 전이학습
base_model = MobileNetV2(
    input_shape=(224, 224, 3),  # 입력 이미지 크기
    include_top=False,          # 최상위 레이어 제외
    weights='imagenet'          # ImageNet 가중치로 초기화
)
base_model.trainable = False    # 전이학습을 위해 기본 모델의 가중치 동결

# 모델 구성
model = models.Sequential([
    base_model,
    layers.GlobalAveragePooling2D(),        # 전역 평균 풀링 레이어 (7,7,512) feaure로 변환
    layers.Dense(128, activation='relu'),   # 완전 연결 레이어
    layers.Dense(5, activation='softmax')   # 클래스 수에 맞춰 출력 레이어 (예: 5개 클래스 분류용)
])

# 모델 컴파일
model.compile(
    optimizer='adam',                   # Adam 옵티마이저 사용
    loss='categorical_crossentropy',    # 다중 클래스 분류를 위한 손실 함수
    metrics=['accuracy']                # 정확도 메트릭 사용
)

# 모델 학습
model.fit(
    train_data,                 # 학습 데이터
    validation_data=val_data,   # 검증 데이터
    epochs=10                   # 에폭 수 (10회 반복 학습)
)

# 모델 저장
model.save('modlel_image_classifier.h5')
print(&quot;모델 학습 완료 및 저장됨: model_image_classifier.h5&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1753522846236&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ python train_model.py

...
Epoch 2/10
13/13 ━━━━━━━━━━━━━━━━━━━━ 15s 1s/step - accuracy: 0.9617 - loss: 0.1076 - val_accuracy: 0.9588 - val_loss: 0.1543
Epoch 3/10
13/13 ━━━━━━━━━━━━━━━━━━━━ 15s 1s/step - accuracy: 0.9872 - loss: 0.0370 - val_accuracy: 0.9691 - val_loss: 0.1234
...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데이터 추론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app.py&lt;/p&gt;
&lt;pre id=&quot;code_1753524675999&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from flask import Flask, request, jsonify
import tensorflow as tf
from PIL import Image
import numpy as np
import os

app = Flask(__name__)
model = tf.keras.models.load_model('modlel_image_classifier.h5')
class_names = ['building', 'car', 'cats', 'female', 'male']

def predict_image(image_path):
    img = Image.open(image_path).resize((224, 224))
    arr = np.array(img) / 255.0             # 픽셀 값을 0-1 사이로 정규화 (크기: (224, 224, 3))
    arr = np.expand_dims(arr, axis=0)       # 배치 차원 추가 (1, 224, 224, 3)
    pred = model.predict(arr)               # 예측 수행 [0.02, 0.87, 0.11, ...]
    return class_names[np.argmax(pred)]     # 가장 높은 확률의 클래스 이름 반환

@app.route('/classify', methods=['POST'])
def classify():
    file = request.files['image']
    path = f'/tmp/{file.filename}'
    file.save(path)
    label = predict_image(path)
    os.remove(path)
    return jsonify({'label': label})

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=6000)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;폴더 실시간 감시&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;watch.py&lt;/p&gt;
&lt;pre id=&quot;code_1753526107516&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import time
import os
import shutil
import requests
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

WATCHED_FOLDER = './incoming'
SROTED_FOLDER = './sorted'
API_URL = 'http://localhost:6000/classify'

class ImageHandler(FileSystemEventHandler):
    def on_created(self, event):
        if event.is_directory:
            return

        if event.src_path.lower().endswith(('.png', '.jpg', '.jpeg')):
            time.sleep(0.5)
            fname = os.path.basename(event.src_path)
            print(f'[이미지 감지] 새 이미지: {fname}')
            
            try:
                with open(event.src_path, 'rb') as f:
                    res = requests.post(API_URL, files={'image': f})
                    label = res.json()['label']
            except Exception as e:
                print(f'[오류] {fname} 이미지 분류 실패: {e}')
                return 
            
            dst_dir = os.path.join(SROTED_FOLDER, label)
            os.makedirs(dst_dir, exist_ok=True)
            
            dst_path = os.path.join(dst_dir, fname)
            shutil.move(event.src_path, dst_path)
            print(f'[이미지 분류 완료] {fname} -&amp;gt; {label}/')

if __name__ == &quot;__main__&quot;:
    os.makedirs(WATCHED_FOLDER, exist_ok=True)
    os.makedirs(SROTED_FOLDER, exist_ok=True)

    event_handler = ImageHandler()
    observers = Observer()
    observers.schedule(event_handler, path=WATCHED_FOLDER, recursive=False)
    observers.start()

    print('[감시 시작] 이미지 폴더:', WATCHED_FOLDER)

    try: 
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observers.stop()
    observers.join()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1753526160717&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# flask 구동
$ python app.py

# watch 구동
$ python watch.py&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1753526184944&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[이미지 감지] 새 이미지: IMG_7203.jpeg
[이미지 분류 완료] IMG_7203.jpeg -&amp;gt; cats/
[이미지 감지] 새 이미지: 00008-1037234980.png
[이미지 분류 완료] 00008-1037234980.png -&amp;gt; female/&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Backend/Python &amp;amp; Blockchain</category>
      <author>romeoh</author>
      <guid isPermaLink="true">https://romeoh.tistory.com/506</guid>
      <comments>https://romeoh.tistory.com/506#entry506comment</comments>
      <pubDate>Sat, 26 Jul 2025 16:15:42 +0900</pubDate>
    </item>
    <item>
      <title>Synology NAS에 python flask 웹서버 구축</title>
      <link>https://romeoh.tistory.com/505</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;SSH활성화&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-07-18 오전 9.51.56.png&quot; data-origin-width=&quot;1162&quot; data-origin-height=&quot;664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dBY0uM/btsPm2uWaZe/X8CIa9HR4X1QkSOcJWoPn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dBY0uM/btsPm2uWaZe/X8CIa9HR4X1QkSOcJWoPn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dBY0uM/btsPm2uWaZe/X8CIa9HR4X1QkSOcJWoPn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdBY0uM%2FbtsPm2uWaZe%2FX8CIa9HR4X1QkSOcJWoPn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1162&quot; height=&quot;664&quot; data-filename=&quot;스크린샷 2025-07-18 오전 9.51.56.png&quot; data-origin-width=&quot;1162&quot; data-origin-height=&quot;664&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-07-18 오전 9.52.10.png&quot; data-origin-width=&quot;1148&quot; data-origin-height=&quot;656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zhJ6h/btsPmK2mjgx/pMdB5qX60zwiQXFEKSG6xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zhJ6h/btsPmK2mjgx/pMdB5qX60zwiQXFEKSG6xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zhJ6h/btsPmK2mjgx/pMdB5qX60zwiQXFEKSG6xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzhJ6h%2FbtsPmK2mjgx%2FpMdB5qX60zwiQXFEKSG6xk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1148&quot; height=&quot;656&quot; data-filename=&quot;스크린샷 2025-07-18 오전 9.52.10.png&quot; data-origin-width=&quot;1148&quot; data-origin-height=&quot;656&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ssh 접속&lt;/h2&gt;
&lt;pre id=&quot;code_1752800327776&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ ssh romeoh@192.168.0.XX&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-07-18 오전 10.01.51.png&quot; data-origin-width=&quot;2146&quot; data-origin-height=&quot;844&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dH7J5w/btsPmeCv7vm/FLGmKcMhBrSlaktZu0E4c0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dH7J5w/btsPmeCv7vm/FLGmKcMhBrSlaktZu0E4c0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dH7J5w/btsPmeCv7vm/FLGmKcMhBrSlaktZu0E4c0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdH7J5w%2FbtsPmeCv7vm%2FFLGmKcMhBrSlaktZu0E4c0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2146&quot; height=&quot;844&quot; data-filename=&quot;스크린샷 2025-07-18 오전 10.01.51.png&quot; data-origin-width=&quot;2146&quot; data-origin-height=&quot;844&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Docker 설치&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-07-18 오전 9.37.37.png&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;905&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SkyVn/btsPmhlH4oE/MKtAl34hPMPqmFfkc09qC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SkyVn/btsPmhlH4oE/MKtAl34hPMPqmFfkc09qC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SkyVn/btsPmhlH4oE/MKtAl34hPMPqmFfkc09qC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSkyVn%2FbtsPmhlH4oE%2FMKtAl34hPMPqmFfkc09qC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1386&quot; height=&quot;905&quot; data-filename=&quot;스크린샷 2025-07-18 오전 9.37.37.png&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;905&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-07-18 오전 9.38.59.png&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;757&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ANWck/btsPnEzZKx0/qvgZkIAINh1mKVGhgXuzm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ANWck/btsPnEzZKx0/qvgZkIAINh1mKVGhgXuzm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ANWck/btsPnEzZKx0/qvgZkIAINh1mKVGhgXuzm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FANWck%2FbtsPnEzZKx0%2FqvgZkIAINh1mKVGhgXuzm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;982&quot; height=&quot;757&quot; data-filename=&quot;스크린샷 2025-07-18 오전 9.38.59.png&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;757&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-07-18 오전 9.39.18.png&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUo3uH/btsPnfOj3QI/flSN3McoxwBUCrDvA4Qlz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUo3uH/btsPnfOj3QI/flSN3McoxwBUCrDvA4Qlz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUo3uH/btsPnfOj3QI/flSN3McoxwBUCrDvA4Qlz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUo3uH%2FbtsPnfOj3QI%2FflSN3McoxwBUCrDvA4Qlz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;714&quot; height=&quot;514&quot; data-filename=&quot;스크린샷 2025-07-18 오전 9.39.18.png&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-07-18 오전 9.43.02.png&quot; data-origin-width=&quot;1387&quot; data-origin-height=&quot;905&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FVwaC/btsPomyMmbY/CsY1c52XapMcA6TkLYFrz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FVwaC/btsPomyMmbY/CsY1c52XapMcA6TkLYFrz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FVwaC/btsPomyMmbY/CsY1c52XapMcA6TkLYFrz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFVwaC%2FbtsPomyMmbY%2FCsY1c52XapMcA6TkLYFrz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1387&quot; height=&quot;905&quot; data-filename=&quot;스크린샷 2025-07-18 오전 9.43.02.png&quot; data-origin-width=&quot;1387&quot; data-origin-height=&quot;905&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;로컬에 파일 생성&lt;/h2&gt;
&lt;pre id=&quot;code_1752800809328&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ mkdir flask-app
$ cd flask-app
$ touch app.py
$ touch requirements.txt
$ touch Dockerfile&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;app.py&lt;/h3&gt;
&lt;pre id=&quot;code_1752800829968&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return &quot;Hello NAS!&quot;

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;requirements.txt&lt;/p&gt;
&lt;pre id=&quot;code_1752800845070&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;flask&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dockerfile&lt;/p&gt;
&lt;pre id=&quot;code_1752800945554&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FROM python:3.10-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 5000

CMD [&quot;python&quot;, &quot;app.py&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-07-18 오전 11.10.38.png&quot; data-origin-width=&quot;1169&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VPJXQ/btsPmSsgQmP/qFdmpTQrbWfKgNsSZrfqq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VPJXQ/btsPmSsgQmP/qFdmpTQrbWfKgNsSZrfqq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VPJXQ/btsPmSsgQmP/qFdmpTQrbWfKgNsSZrfqq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVPJXQ%2FbtsPmSsgQmP%2FqFdmpTQrbWfKgNsSZrfqq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1169&quot; height=&quot;313&quot; data-filename=&quot;스크린샷 2025-07-18 오전 11.10.38.png&quot; data-origin-width=&quot;1169&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일을 Synology에 업로드 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Docker 실행&lt;/h2&gt;
&lt;pre id=&quot;code_1752804875351&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo docker build -t flask-app .
$ sudo docker run -d -p 8888:5000 --name flask-test flask-app

# static 폴더 제외하기
$ sudo docker run -d \
  --name flask-app \
  --link mongo \
  -v /volume3/docker/flask-app/static:/app/static \
  -p 8888:5001 \
  flask-app

# container 제거
$ sudo docker ps
$ sudo docker stop flask-test
$ sudo docker rm flask-test&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-07-18 오전 11.14.32.png&quot; data-origin-width=&quot;2296&quot; data-origin-height=&quot;1854&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lGGLP/btsPoJm3XYF/3NouuqYaXlneYW84SF7jnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lGGLP/btsPoJm3XYF/3NouuqYaXlneYW84SF7jnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lGGLP/btsPoJm3XYF/3NouuqYaXlneYW84SF7jnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlGGLP%2FbtsPoJm3XYF%2F3NouuqYaXlneYW84SF7jnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2296&quot; height=&quot;1854&quot; data-filename=&quot;스크린샷 2025-07-18 오전 11.14.32.png&quot; data-origin-width=&quot;2296&quot; data-origin-height=&quot;1854&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-07-18 오전 11.15.28.png&quot; data-origin-width=&quot;2496&quot; data-origin-height=&quot;156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QK97Q/btsPoXL6L0S/L7z2RIzV94WGEi4Tv0RUkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QK97Q/btsPoXL6L0S/L7z2RIzV94WGEi4Tv0RUkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QK97Q/btsPoXL6L0S/L7z2RIzV94WGEi4Tv0RUkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQK97Q%2FbtsPoXL6L0S%2FL7z2RIzV94WGEi4Tv0RUkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2496&quot; height=&quot;156&quot; data-filename=&quot;스크린샷 2025-07-18 오전 11.15.28.png&quot; data-origin-width=&quot;2496&quot; data-origin-height=&quot;156&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-07-18 오전 11.15.54.png&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;287&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/URyD4/btsPomZTeag/kNj4XC5NFLh1vmyfOKVllK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/URyD4/btsPomZTeag/kNj4XC5NFLh1vmyfOKVllK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/URyD4/btsPomZTeag/kNj4XC5NFLh1vmyfOKVllK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FURyD4%2FbtsPomZTeag%2FkNj4XC5NFLh1vmyfOKVllK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;994&quot; height=&quot;287&quot; data-filename=&quot;스크린샷 2025-07-18 오전 11.15.54.png&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;287&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://192.168.0.16:8888/&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;접속합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;git 서버 구축하기&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-07-18 오전 11.20.32.png&quot; data-origin-width=&quot;1119&quot; data-origin-height=&quot;645&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8vO1j/btsPnxnAtUH/V7XPbj8X7QwPMcqK4jsuDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8vO1j/btsPnxnAtUH/V7XPbj8X7QwPMcqK4jsuDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8vO1j/btsPnxnAtUH/V7XPbj8X7QwPMcqK4jsuDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8vO1j%2FbtsPnxnAtUH%2FV7XPbj8X7QwPMcqK4jsuDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1119&quot; height=&quot;645&quot; data-filename=&quot;스크린샷 2025-07-18 오전 11.20.32.png&quot; data-origin-width=&quot;1119&quot; data-origin-height=&quot;645&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;git 초기화&amp;nbsp;&lt;/h2&gt;
&lt;pre id=&quot;code_1752805447864&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git init&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-07-18 오전 11.24.18.png&quot; data-origin-width=&quot;1976&quot; data-origin-height=&quot;662&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HaUZ6/btsPn8gvNB7/dO1MqctihhFMNlN6lgsE4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HaUZ6/btsPn8gvNB7/dO1MqctihhFMNlN6lgsE4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HaUZ6/btsPn8gvNB7/dO1MqctihhFMNlN6lgsE4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHaUZ6%2FbtsPn8gvNB7%2FdO1MqctihhFMNlN6lgsE4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1976&quot; height=&quot;662&quot; data-filename=&quot;스크린샷 2025-07-18 오전 11.24.18.png&quot; data-origin-width=&quot;1976&quot; data-origin-height=&quot;662&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-07-18 오전 11.25.58.png&quot; data-origin-width=&quot;1036&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l2a9z/btsPmKH6Aah/7GfZ9obNkFPJWOg8f29Qik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l2a9z/btsPmKH6Aah/7GfZ9obNkFPJWOg8f29Qik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l2a9z/btsPmKH6Aah/7GfZ9obNkFPJWOg8f29Qik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl2a9z%2FbtsPmKH6Aah%2F7GfZ9obNkFPJWOg8f29Qik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1036&quot; height=&quot;370&quot; data-filename=&quot;스크린샷 2025-07-18 오전 11.25.58.png&quot; data-origin-width=&quot;1036&quot; data-origin-height=&quot;370&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;서버에서 커밋하기&lt;/h2&gt;
&lt;pre id=&quot;code_1752806030976&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 외부 push 허용
$ git config receive.denyCurrentBranch updateInstead

$ git config user.name &quot;romeoh&quot;
$ git config user.email &quot;romeoh@naver.com&quot;
$ git add .
$ git commit -m &quot;initial commit&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-07-18 오전 11.32.25.png&quot; data-origin-width=&quot;2102&quot; data-origin-height=&quot;530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ncEx2/btsPofzToR4/PG7KbMveR7fZLmm5IRLgK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ncEx2/btsPofzToR4/PG7KbMveR7fZLmm5IRLgK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ncEx2/btsPofzToR4/PG7KbMveR7fZLmm5IRLgK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FncEx2%2FbtsPofzToR4%2FPG7KbMveR7fZLmm5IRLgK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2102&quot; height=&quot;530&quot; data-filename=&quot;스크린샷 2025-07-18 오전 11.32.25.png&quot; data-origin-width=&quot;2102&quot; data-origin-height=&quot;530&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;git clone&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;local에 생성했던 flask-app 폴더는 삭제합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1752805719337&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ cd PROJECT_FOLDER
$ git clone ssh://romeoh@192.168.0.16:/volume3/docker/flask-app&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-07-18 오전 11.34.39.png&quot; data-origin-width=&quot;2234&quot; data-origin-height=&quot;604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b65oJR/btsPoR6oC5h/lvKUiU7cUVhH6b8ssKy2J0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b65oJR/btsPoR6oC5h/lvKUiU7cUVhH6b8ssKy2J0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b65oJR/btsPoR6oC5h/lvKUiU7cUVhH6b8ssKy2J0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb65oJR%2FbtsPoR6oC5h%2FlvKUiU7cUVhH6b8ssKy2J0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2234&quot; height=&quot;604&quot; data-filename=&quot;스크린샷 2025-07-18 오전 11.34.39.png&quot; data-origin-width=&quot;2234&quot; data-origin-height=&quot;604&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-07-18 오전 11.36.03.png&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crteUI/btsPneBNn7i/GRlZDdOkKnMiOwhZBneiRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crteUI/btsPneBNn7i/GRlZDdOkKnMiOwhZBneiRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crteUI/btsPneBNn7i/GRlZDdOkKnMiOwhZBneiRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrteUI%2FbtsPneBNn7i%2FGRlZDdOkKnMiOwhZBneiRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;992&quot; height=&quot;370&quot; data-filename=&quot;스크린샷 2025-07-18 오전 11.36.03.png&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;370&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;MongoDB설치&lt;/h2&gt;
&lt;pre id=&quot;code_1752815631639&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ cd docker
$ mkdir mongodb
$ cd mongodb
$ mkdir data
$ sudo chmod -R 777 /volume3/docker/mongodb/data

$ sudo docker run -d \
  --name mongo \
  -p 27017:27017 \
  -e MONGO_INITDB_ROOT_USERNAME=admin \
  -e MONGO_INITDB_ROOT_PASSWORD=secret123 \
  -v /volume3/docker/mongodb/data:/data/db \
  mongo:4.4
  
  $ sudo docker ps&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-07-18 오후 2.27.32.png&quot; data-origin-width=&quot;3092&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cStJTP/btsPnL1fVAS/jmpSvHjIertsxGs79ETwBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cStJTP/btsPnL1fVAS/jmpSvHjIertsxGs79ETwBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cStJTP/btsPnL1fVAS/jmpSvHjIertsxGs79ETwBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcStJTP%2FbtsPnL1fVAS%2FjmpSvHjIertsxGs79ETwBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3092&quot; height=&quot;262&quot; data-filename=&quot;스크린샷 2025-07-18 오후 2.27.32.png&quot; data-origin-width=&quot;3092&quot; data-origin-height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;docker 명령어&lt;/h2&gt;
&lt;pre id=&quot;code_1752815846909&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 현재 docker 컨테이너 확인
$ sudo docker ps -a

# 콘테이너 정지
$ sudo docker rm mongo

# 콘테이너 로그 확인
$ sudo docker logs mongo

# 콘테이너 내부 진입
$ docker exec -it mongo bash&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;local에서 flask 서버 구동&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;가상공간 만들기&lt;/h3&gt;
&lt;pre id=&quot;code_1752810996722&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ python3 --version
Python 3.11.2
$ python3 -m venv venv
$ source venv/bin/activate
(venv) romeoh@romeoh-MacBook-Pro flask-app %
(venv) $ pip install -r requirements.txt
(venv) $ python app.py&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-07-18 오후 12.59.50.png&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0ksKC/btsPn0DbNJF/yxyTkj06OtW0cGkyKkCHTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0ksKC/btsPn0DbNJF/yxyTkj06OtW0cGkyKkCHTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0ksKC/btsPn0DbNJF/yxyTkj06OtW0cGkyKkCHTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0ksKC%2FbtsPn0DbNJF%2FyxyTkj06OtW0cGkyKkCHTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;841&quot; height=&quot;346&quot; data-filename=&quot;스크린샷 2025-07-18 오후 12.59.50.png&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;346&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://127.0.0.1:5001/&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;local server 접속&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;flask에서 mongodb 접속&lt;/h2&gt;
&lt;pre id=&quot;code_1752817136605&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ pip install pymongo
$ pip freeze &amp;gt; requirements.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Backend/Python &amp;amp; Blockchain</category>
      <author>romeoh</author>
      <guid isPermaLink="true">https://romeoh.tistory.com/505</guid>
      <comments>https://romeoh.tistory.com/505#entry505comment</comments>
      <pubDate>Fri, 18 Jul 2025 13:00:41 +0900</pubDate>
    </item>
    <item>
      <title>FastAPI 서버 구축</title>
      <link>https://romeoh.tistory.com/504</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;버전확인&lt;/h2&gt;
&lt;pre id=&quot;code_1747613544625&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ python3 --version
Python 3.11.2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;가상환경구축&lt;/h2&gt;
&lt;pre id=&quot;code_1747615024130&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ python3 -m venv myproject
$ source myproject/bin/activate    ## 가상환경 진입
$ deactivate                       ## 가상환경 종료&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-05-19 오전 9.37.54.png&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;247&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceQ3oE/btsN2mN5in4/VonUiUYdK57d3nMoPuNK8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceQ3oE/btsN2mN5in4/VonUiUYdK57d3nMoPuNK8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceQ3oE/btsN2mN5in4/VonUiUYdK57d3nMoPuNK8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceQ3oE%2FbtsN2mN5in4%2FVonUiUYdK57d3nMoPuNK8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;489&quot; height=&quot;247&quot; data-filename=&quot;스크린샷 2025-05-19 오전 9.37.54.png&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;247&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;fastapi 설치&lt;/h2&gt;
&lt;pre id=&quot;code_1747615507774&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ pip install fastapi uvicorn&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Uvicorn: fastapi 실행도구&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드작성&lt;/h2&gt;
&lt;pre id=&quot;code_1747615785742&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ cd myproject
$ touch main.py&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;main.py&lt;/h2&gt;
&lt;pre id=&quot;code_1747615911360&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from fastapi import FastAPI

app = FastAPI()

@app.get(&quot;/&quot;)
def road_root():
  return {&quot;message&quot;: &quot;Hello, FastAPI!&quot;}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;서버실행&lt;/h2&gt;
&lt;pre id=&quot;code_1747616044932&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ uvicorn main:app --reload&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;브라우저 접속&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://localhost:8000/&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-05-19 오전 9.54.44.png&quot; data-origin-width=&quot;461&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2KEYz/btsN2e3RnGY/Z7hrOJ062dAXxEo7vJFkx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2KEYz/btsN2e3RnGY/Z7hrOJ062dAXxEo7vJFkx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2KEYz/btsN2e3RnGY/Z7hrOJ062dAXxEo7vJFkx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2KEYz%2FbtsN2e3RnGY%2FZ7hrOJ062dAXxEo7vJFkx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;461&quot; height=&quot;267&quot; data-filename=&quot;스크린샷 2025-05-19 오전 9.54.44.png&quot; data-origin-width=&quot;461&quot; data-origin-height=&quot;267&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Swagger 문서&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://localhost:8000/docs&quot;&gt;http://localhost:8000/docs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-05-19 오전 9.56.33.png&quot; data-origin-width=&quot;2054&quot; data-origin-height=&quot;887&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rZUYa/btsN2o6eV4e/VlcZbQbW3i9SyeJLAgztkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rZUYa/btsN2o6eV4e/VlcZbQbW3i9SyeJLAgztkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rZUYa/btsN2o6eV4e/VlcZbQbW3i9SyeJLAgztkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrZUYa%2FbtsN2o6eV4e%2FVlcZbQbW3i9SyeJLAgztkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2054&quot; height=&quot;887&quot; data-filename=&quot;스크린샷 2025-05-19 오전 9.56.33.png&quot; data-origin-width=&quot;2054&quot; data-origin-height=&quot;887&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;router 설정&lt;/h2&gt;
&lt;pre id=&quot;code_1747616573972&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ mkdir routers
$ touch routers/users.py&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;main.py&lt;/h2&gt;
&lt;pre id=&quot;code_1747617027202&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from fastapi import FastAPI
from routers import users

app = FastAPI()

app.include_router(users.router)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;users.py&lt;/h2&gt;
&lt;pre id=&quot;code_1747617048352&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from fastapi import APIRouter

router = APIRouter(
  prefix=&quot;/users&quot;,
  tags=[&quot;users&quot;],
)

@router.get(&quot;/&quot;)
def get_users():
  return [{&quot;id&quot;: 1, &quot;name&quot;: &quot;Alice&quot;}, {&quot;id&quot;: 2, &quot;name&quot;: &quot;Bob&quot;}]

@router.get(&quot;/{user_id}&quot;)
def get_user(user_id: int):
  return {&quot;id&quot;: user_id, &quot;name&quot;: f&quot;User{user_id}&quot;}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://localhost:8000/users/&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-05-19 오전 10.11.13.png&quot; data-origin-width=&quot;453&quot; data-origin-height=&quot;309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blW82r/btsN1zUWvPV/uLT54N7XelxdN0tikt1bN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blW82r/btsN1zUWvPV/uLT54N7XelxdN0tikt1bN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blW82r/btsN1zUWvPV/uLT54N7XelxdN0tikt1bN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblW82r%2FbtsN1zUWvPV%2FuLT54N7XelxdN0tikt1bN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;453&quot; height=&quot;309&quot; data-filename=&quot;스크린샷 2025-05-19 오전 10.11.13.png&quot; data-origin-width=&quot;453&quot; data-origin-height=&quot;309&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://localhost:8000/users/2&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-05-19 오전 10.11.41.png&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SVP6k/btsN2Gr2d0f/rXbaKv9E2rrPc4tSIF5v8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SVP6k/btsN2Gr2d0f/rXbaKv9E2rrPc4tSIF5v8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SVP6k/btsN2Gr2d0f/rXbaKv9E2rrPc4tSIF5v8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSVP6k%2FbtsN2Gr2d0f%2FrXbaKv9E2rrPc4tSIF5v8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;605&quot; height=&quot;267&quot; data-filename=&quot;스크린샷 2025-05-19 오전 10.11.41.png&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;267&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Swagger 문서&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;http://localhost:8000/docs&quot;&gt;http://localhost:8000/docs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-05-19 오전 10.13.26.png&quot; data-origin-width=&quot;2039&quot; data-origin-height=&quot;1287&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eigvDE/btsN1btt98V/YBDheXnYIPoXKsYkaH8Iok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eigvDE/btsN1btt98V/YBDheXnYIPoXKsYkaH8Iok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eigvDE/btsN1btt98V/YBDheXnYIPoXKsYkaH8Iok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeigvDE%2FbtsN1btt98V%2FYBDheXnYIPoXKsYkaH8Iok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2039&quot; height=&quot;1287&quot; data-filename=&quot;스크린샷 2025-05-19 오전 10.13.26.png&quot; data-origin-width=&quot;2039&quot; data-origin-height=&quot;1287&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Pydantic 설정&lt;/h2&gt;
&lt;pre id=&quot;code_1747617681915&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ mkdir schemas
$ touch schemas/user.py&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;schemas/user.py&lt;/h2&gt;
&lt;pre id=&quot;code_1747617906917&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# schemas/user.py
from pydantic import BaseModel

class User(BaseModel):
  id: int
  name: str&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;routers/users.py&lt;/h2&gt;
&lt;pre id=&quot;code_1747617934456&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from fastapi import APIRouter
from typing import List
from schemas.user import User

router = APIRouter(
  prefix=&quot;/users&quot;,
  tags=[&quot;users&quot;],
)

@router.get(&quot;/&quot;, response_model=List[User])
def get_users():
  return [
    {&quot;id&quot;: 1, &quot;name&quot;: &quot;Alice&quot;}, 
    {&quot;id&quot;: 2, &quot;name&quot;: &quot;Bob&quot;}
  ]

@router.get(&quot;/{user_id}&quot;, response_model=User)
def get_user(user_id: int):
  return {&quot;id&quot;: user_id, &quot;name&quot;: f&quot;User{user_id}&quot;}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Backend/Python &amp;amp; Blockchain</category>
      <category>fastapi</category>
      <category>pydantic</category>
      <category>PYTHON</category>
      <author>romeoh</author>
      <guid isPermaLink="true">https://romeoh.tistory.com/504</guid>
      <comments>https://romeoh.tistory.com/504#entry504comment</comments>
      <pubDate>Mon, 19 May 2025 10:30:51 +0900</pubDate>
    </item>
    <item>
      <title>iOS 앱스토어 배포하기</title>
      <link>https://romeoh.tistory.com/503</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-22 오후 4.19.55.png&quot; data-origin-width=&quot;2830&quot; data-origin-height=&quot;1672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4o4n0/btsKRF5evq2/YpsNHHMd4ljtItYKwxNNak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4o4n0/btsKRF5evq2/YpsNHHMd4ljtItYKwxNNak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4o4n0/btsKRF5evq2/YpsNHHMd4ljtItYKwxNNak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4o4n0%2FbtsKRF5evq2%2FYpsNHHMd4ljtItYKwxNNak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2830&quot; height=&quot;1672&quot; data-filename=&quot;스크린샷 2024-11-22 오후 4.19.55.png&quot; data-origin-width=&quot;2830&quot; data-origin-height=&quot;1672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iOS를 배포하기 위해 앱정보와 가격 등 필요한 모든 정보를 입력하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 빌드를 업로드 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Xcode로 빌드를 업로드하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-22 오후 4.22.36.png&quot; data-origin-width=&quot;2248&quot; data-origin-height=&quot;916&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/co34iW/btsKS6OFrgC/4TiBGbVZa1gh5acz2zaK10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/co34iW/btsKS6OFrgC/4TiBGbVZa1gh5acz2zaK10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/co34iW/btsKS6OFrgC/4TiBGbVZa1gh5acz2zaK10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fco34iW%2FbtsKS6OFrgC%2F4TiBGbVZa1gh5acz2zaK10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2248&quot; height=&quot;916&quot; data-filename=&quot;스크린샷 2024-11-22 오후 4.22.36.png&quot; data-origin-width=&quot;2248&quot; data-origin-height=&quot;916&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Xcode에서 Team과 Bundle Identifier를 확인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-22 오후 4.26.27.png&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPLlXb/btsKS95G1V0/CPnEUt6Nh5MELdrePgQUH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPLlXb/btsKS95G1V0/CPnEUt6Nh5MELdrePgQUH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPLlXb/btsKS95G1V0/CPnEUt6Nh5MELdrePgQUH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPLlXb%2FbtsKS95G1V0%2FCPnEUt6Nh5MELdrePgQUH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1254&quot; height=&quot;652&quot; data-filename=&quot;스크린샷 2024-11-22 오후 4.26.27.png&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;652&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Edit Scheme...를 선태합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-22 오후 4.27.28.png&quot; data-origin-width=&quot;1860&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rGRfS/btsKSu3I9aU/rBIq3eMokcdOjkgXRkaMtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rGRfS/btsKSu3I9aU/rBIq3eMokcdOjkgXRkaMtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rGRfS/btsKSu3I9aU/rBIq3eMokcdOjkgXRkaMtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrGRfS%2FbtsKSu3I9aU%2FrBIq3eMokcdOjkgXRkaMtK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1860&quot; height=&quot;1026&quot; data-filename=&quot;스크린샷 2024-11-22 오후 4.27.28.png&quot; data-origin-width=&quot;1860&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-22 오후 4.29.21.png&quot; data-origin-width=&quot;2264&quot; data-origin-height=&quot;1400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uvAWc/btsKS2TcPU0/T5QIfBoaXp9FWWphXppnu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uvAWc/btsKS2TcPU0/T5QIfBoaXp9FWWphXppnu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uvAWc/btsKS2TcPU0/T5QIfBoaXp9FWWphXppnu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuvAWc%2FbtsKS2TcPU0%2FT5QIfBoaXp9FWWphXppnu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2264&quot; height=&quot;1400&quot; data-filename=&quot;스크린샷 2024-11-22 오후 4.29.21.png&quot; data-origin-width=&quot;2264&quot; data-origin-height=&quot;1400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;version과 build를 설정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-22 오후 4.52.31.png&quot; data-origin-width=&quot;1418&quot; data-origin-height=&quot;808&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhmOdP/btsKSivLfQ3/Mx3mrkAi8aVkE82YqmxkxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhmOdP/btsKSivLfQ3/Mx3mrkAi8aVkE82YqmxkxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhmOdP/btsKSivLfQ3/Mx3mrkAi8aVkE82YqmxkxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhmOdP%2FbtsKSivLfQ3%2FMx3mrkAi8aVkE82YqmxkxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1418&quot; height=&quot;808&quot; data-filename=&quot;스크린샷 2024-11-22 오후 4.52.31.png&quot; data-origin-width=&quot;1418&quot; data-origin-height=&quot;808&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Product &amp;gt; Archive를 선택합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-22 오후 4.56.07.png&quot; data-origin-width=&quot;2046&quot; data-origin-height=&quot;1282&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ToNBs/btsKS3R9vfb/VxKBYBWD3p3yfxvSlVxSnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ToNBs/btsKS3R9vfb/VxKBYBWD3p3yfxvSlVxSnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ToNBs/btsKS3R9vfb/VxKBYBWD3p3yfxvSlVxSnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FToNBs%2FbtsKS3R9vfb%2FVxKBYBWD3p3yfxvSlVxSnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2046&quot; height=&quot;1282&quot; data-filename=&quot;스크린샷 2024-11-22 오후 4.56.07.png&quot; data-origin-width=&quot;2046&quot; data-origin-height=&quot;1282&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;version과 build를 선택하고 Distribute App을 누릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-22 오후 4.57.44.png&quot; data-origin-width=&quot;2034&quot; data-origin-height=&quot;1278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkoFK4/btsKStX5Mnk/N9qpsDLPKKvSdYXOk99W31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkoFK4/btsKStX5Mnk/N9qpsDLPKKvSdYXOk99W31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkoFK4/btsKStX5Mnk/N9qpsDLPKKvSdYXOk99W31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkoFK4%2FbtsKStX5Mnk%2FN9qpsDLPKKvSdYXOk99W31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2034&quot; height=&quot;1278&quot; data-filename=&quot;스크린샷 2024-11-22 오후 4.57.44.png&quot; data-origin-width=&quot;2034&quot; data-origin-height=&quot;1278&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;App Store Connect를 선택하고 Distribute 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-22 오후 9.40.41.png&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;496&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dYNF3A/btsKSFR4Ksm/0viG4dvTa8jgZOSX9YAvv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dYNF3A/btsKSFR4Ksm/0viG4dvTa8jgZOSX9YAvv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dYNF3A/btsKSFR4Ksm/0viG4dvTa8jgZOSX9YAvv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdYNF3A%2FbtsKSFR4Ksm%2F0viG4dvTa8jgZOSX9YAvv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;786&quot; height=&quot;496&quot; data-filename=&quot;스크린샷 2024-11-22 오후 9.40.41.png&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;496&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-22 오후 9.42.41.png&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qkdz5/btsKTEkjk4B/a4giSaXOsCpOOf9WwRhxL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qkdz5/btsKTEkjk4B/a4giSaXOsCpOOf9WwRhxL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qkdz5/btsKTEkjk4B/a4giSaXOsCpOOf9WwRhxL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqkdz5%2FbtsKTEkjk4B%2Fa4giSaXOsCpOOf9WwRhxL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;772&quot; height=&quot;485&quot; data-filename=&quot;스크린샷 2024-11-22 오후 9.42.41.png&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;485&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-22 오후 9.42.59.png&quot; data-origin-width=&quot;1017&quot; data-origin-height=&quot;643&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cq8YKq/btsKSPAa7VW/kUkD6vnZgc2LUJJXsArxI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cq8YKq/btsKSPAa7VW/kUkD6vnZgc2LUJJXsArxI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cq8YKq/btsKSPAa7VW/kUkD6vnZgc2LUJJXsArxI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcq8YKq%2FbtsKSPAa7VW%2FkUkD6vnZgc2LUJJXsArxI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1017&quot; height=&quot;643&quot; data-filename=&quot;스크린샷 2024-11-22 오후 9.42.59.png&quot; data-origin-width=&quot;1017&quot; data-origin-height=&quot;643&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업로드가 완성되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-22 오후 10.02.21.png&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVHeIz/btsKUfdsbgN/6KjF5Er72Jv0Q5bIkEkkWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVHeIz/btsKUfdsbgN/6KjF5Er72Jv0Q5bIkEkkWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVHeIz/btsKUfdsbgN/6KjF5Er72Jv0Q5bIkEkkWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVHeIz%2FbtsKUfdsbgN%2F6KjF5Er72Jv0Q5bIkEkkWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1100&quot; height=&quot;896&quot; data-filename=&quot;스크린샷 2024-11-22 오후 10.02.21.png&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;896&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-22 오후 10.03.55.png&quot; data-origin-width=&quot;1428&quot; data-origin-height=&quot;933&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjshY9/btsKVavLQLz/ULkVikwg9cJ05K6jt8Tb91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjshY9/btsKVavLQLz/ULkVikwg9cJ05K6jt8Tb91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjshY9/btsKVavLQLz/ULkVikwg9cJ05K6jt8Tb91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjshY9%2FbtsKVavLQLz%2FULkVikwg9cJ05K6jt8Tb91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1428&quot; height=&quot;933&quot; data-filename=&quot;스크린샷 2024-11-22 오후 10.03.55.png&quot; data-origin-width=&quot;1428&quot; data-origin-height=&quot;933&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-22 오후 10.06.10.png&quot; data-origin-width=&quot;1369&quot; data-origin-height=&quot;629&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQCVnp/btsKTpgFsDC/GHlzhk532nRLxh8oahAJC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQCVnp/btsKTpgFsDC/GHlzhk532nRLxh8oahAJC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQCVnp/btsKTpgFsDC/GHlzhk532nRLxh8oahAJC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQCVnp%2FbtsKTpgFsDC%2FGHlzhk532nRLxh8oahAJC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1369&quot; height=&quot;629&quot; data-filename=&quot;스크린샷 2024-11-22 오후 10.06.10.png&quot; data-origin-width=&quot;1369&quot; data-origin-height=&quot;629&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>App &amp;amp; OS/Swift</category>
      <author>romeoh</author>
      <guid isPermaLink="true">https://romeoh.tistory.com/503</guid>
      <comments>https://romeoh.tistory.com/503#entry503comment</comments>
      <pubDate>Fri, 22 Nov 2024 22:25:58 +0900</pubDate>
    </item>
    <item>
      <title>Flutter in app 결제 구현</title>
      <link>https://romeoh.tistory.com/502</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;iOS 상품 생성&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-11 오전 2.17.35.png&quot; data-origin-width=&quot;1204&quot; data-origin-height=&quot;583&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6vaya/btsKD52QgFT/cJliDDpvOKAATiJQuavP8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6vaya/btsKD52QgFT/cJliDDpvOKAATiJQuavP8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6vaya/btsKD52QgFT/cJliDDpvOKAATiJQuavP8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6vaya%2FbtsKD52QgFT%2FcJliDDpvOKAATiJQuavP8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1204&quot; height=&quot;583&quot; data-filename=&quot;스크린샷 2024-11-11 오전 2.17.35.png&quot; data-origin-width=&quot;1204&quot; data-origin-height=&quot;583&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://appstoreconnect.apple.com/apps&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://appstoreconnect.apple.com/apps&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱을 선택합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-11 오전 2.18.57.png&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFlzF4/btsKERQuMRE/oKqCMjqXUmgKImxxKY1j7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFlzF4/btsKERQuMRE/oKqCMjqXUmgKImxxKY1j7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFlzF4/btsKERQuMRE/oKqCMjqXUmgKImxxKY1j7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFlzF4%2FbtsKERQuMRE%2FoKqCMjqXUmgKImxxKY1j7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;653&quot; height=&quot;252&quot; data-filename=&quot;스크린샷 2024-11-11 오전 2.18.57.png&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;252&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신규 앱을 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-11 오전 2.20.30.png&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;747&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEzmJs/btsKDqmlOVu/sKaptQerks7dQ6KZcp61oK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEzmJs/btsKDqmlOVu/sKaptQerks7dQ6KZcp61oK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEzmJs/btsKDqmlOVu/sKaptQerks7dQ6KZcp61oK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEzmJs%2FbtsKDqmlOVu%2FsKaptQerks7dQ6KZcp61oK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;648&quot; height=&quot;747&quot; data-filename=&quot;스크린샷 2024-11-11 오전 2.20.30.png&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;747&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱을 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-11 오전 2.22.21.png&quot; data-origin-width=&quot;1420&quot; data-origin-height=&quot;833&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JyTUS/btsKDSJqzVe/YrhKVw2cf1WU7O7bZ8An2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JyTUS/btsKDSJqzVe/YrhKVw2cf1WU7O7bZ8An2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JyTUS/btsKDSJqzVe/YrhKVw2cf1WU7O7bZ8An2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJyTUS%2FbtsKDSJqzVe%2FYrhKVw2cf1WU7O7bZ8An2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1420&quot; height=&quot;833&quot; data-filename=&quot;스크린샷 2024-11-11 오전 2.22.21.png&quot; data-origin-width=&quot;1420&quot; data-origin-height=&quot;833&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-11 오전 2.26.18.png&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0pSil/btsKDBnxe5v/iRbc31REhWQQNpEAFz0M6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0pSil/btsKDBnxe5v/iRbc31REhWQQNpEAFz0M6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0pSil/btsKDBnxe5v/iRbc31REhWQQNpEAFz0M6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0pSil%2FbtsKDBnxe5v%2FiRbc31REhWQQNpEAFz0M6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1210&quot; height=&quot;768&quot; data-filename=&quot;스크린샷 2024-11-11 오전 2.26.18.png&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-11 오전 2.27.37.png&quot; data-origin-width=&quot;1356&quot; data-origin-height=&quot;1056&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QxQVU/btsKDy5p1q4/H1auRzChGHWkuPxoplLtm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QxQVU/btsKDy5p1q4/H1auRzChGHWkuPxoplLtm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QxQVU/btsKDy5p1q4/H1auRzChGHWkuPxoplLtm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQxQVU%2FbtsKDy5p1q4%2FH1auRzChGHWkuPxoplLtm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1356&quot; height=&quot;1056&quot; data-filename=&quot;스크린샷 2024-11-11 오전 2.27.37.png&quot; data-origin-width=&quot;1356&quot; data-origin-height=&quot;1056&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-11 오전 2.29.12.png&quot; data-origin-width=&quot;1304&quot; data-origin-height=&quot;779&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gzhfs/btsKC6IlHrI/Q1VW1rLFiWryjJYhpEY0z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gzhfs/btsKC6IlHrI/Q1VW1rLFiWryjJYhpEY0z1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gzhfs/btsKC6IlHrI/Q1VW1rLFiWryjJYhpEY0z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGzhfs%2FbtsKC6IlHrI%2FQ1VW1rLFiWryjJYhpEY0z1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1304&quot; height=&quot;779&quot; data-filename=&quot;스크린샷 2024-11-11 오전 2.29.12.png&quot; data-origin-width=&quot;1304&quot; data-origin-height=&quot;779&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;국가를 선택합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-11 오전 2.29.45.png&quot; data-origin-width=&quot;1338&quot; data-origin-height=&quot;992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3Eykq/btsKEbomiq3/BRlK1yCjNYzHJRtq6C6R90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3Eykq/btsKEbomiq3/BRlK1yCjNYzHJRtq6C6R90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3Eykq/btsKEbomiq3/BRlK1yCjNYzHJRtq6C6R90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3Eykq%2FbtsKEbomiq3%2FBRlK1yCjNYzHJRtq6C6R90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1338&quot; height=&quot;992&quot; data-filename=&quot;스크린샷 2024-11-11 오전 2.29.45.png&quot; data-origin-width=&quot;1338&quot; data-origin-height=&quot;992&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-11 오전 2.30.18.png&quot; data-origin-width=&quot;1284&quot; data-origin-height=&quot;924&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsk4u4/btsKEjNlNtQ/YxLqIJ4biGXtRNYt9dIpE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsk4u4/btsKEjNlNtQ/YxLqIJ4biGXtRNYt9dIpE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsk4u4/btsKEjNlNtQ/YxLqIJ4biGXtRNYt9dIpE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbsk4u4%2FbtsKEjNlNtQ%2FYxLqIJ4biGXtRNYt9dIpE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1284&quot; height=&quot;924&quot; data-filename=&quot;스크린샷 2024-11-11 오전 2.30.18.png&quot; data-origin-width=&quot;1284&quot; data-origin-height=&quot;924&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가격을 설정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-11 오전 2.34.29.png&quot; data-origin-width=&quot;1329&quot; data-origin-height=&quot;861&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rccJB/btsKDj1Foex/tjfwBoNl7xtFZZWymTb7GK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rccJB/btsKDj1Foex/tjfwBoNl7xtFZZWymTb7GK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rccJB/btsKDj1Foex/tjfwBoNl7xtFZZWymTb7GK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrccJB%2FbtsKDj1Foex%2FtjfwBoNl7xtFZZWymTb7GK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1329&quot; height=&quot;861&quot; data-filename=&quot;스크린샷 2024-11-11 오전 2.34.29.png&quot; data-origin-width=&quot;1329&quot; data-origin-height=&quot;861&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-11 오전 2.45.27.png&quot; data-origin-width=&quot;1350&quot; data-origin-height=&quot;1186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3VdnG/btsKCZoUAkO/2RVNdERG3QjusoxLTniK20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3VdnG/btsKCZoUAkO/2RVNdERG3QjusoxLTniK20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3VdnG/btsKCZoUAkO/2RVNdERG3QjusoxLTniK20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3VdnG%2FbtsKCZoUAkO%2F2RVNdERG3QjusoxLTniK20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1350&quot; height=&quot;1186&quot; data-filename=&quot;스크린샷 2024-11-11 오전 2.45.27.png&quot; data-origin-width=&quot;1350&quot; data-origin-height=&quot;1186&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현지화를 추가합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-11 오전 2.45.43.png&quot; data-origin-width=&quot;1311&quot; data-origin-height=&quot;928&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjRIXp/btsKCnKF6LF/xFCKrnrrGlYNsemoCv21DK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjRIXp/btsKCnKF6LF/xFCKrnrrGlYNsemoCv21DK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjRIXp/btsKCnKF6LF/xFCKrnrrGlYNsemoCv21DK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjRIXp%2FbtsKCnKF6LF%2FxFCKrnrrGlYNsemoCv21DK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1311&quot; height=&quot;928&quot; data-filename=&quot;스크린샷 2024-11-11 오전 2.45.43.png&quot; data-origin-width=&quot;1311&quot; data-origin-height=&quot;928&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;iOS Sandbox 계정생성&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-11 오후 8.46.34.png&quot; data-origin-width=&quot;1175&quot; data-origin-height=&quot;559&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVnUSv/btsKDSw2QTQ/e3kprYQd4dtppSeBP227Zk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVnUSv/btsKDSw2QTQ/e3kprYQd4dtppSeBP227Zk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVnUSv/btsKDSw2QTQ/e3kprYQd4dtppSeBP227Zk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVnUSv%2FbtsKDSw2QTQ%2Fe3kprYQd4dtppSeBP227Zk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1175&quot; height=&quot;559&quot; data-filename=&quot;스크린샷 2024-11-11 오후 8.46.34.png&quot; data-origin-width=&quot;1175&quot; data-origin-height=&quot;559&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-11 오후 8.51.20.png&quot; data-origin-width=&quot;1463&quot; data-origin-height=&quot;578&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TZBs8/btsKFGBHz4W/udVgoIMIliFYejMQnad8v0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TZBs8/btsKFGBHz4W/udVgoIMIliFYejMQnad8v0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TZBs8/btsKFGBHz4W/udVgoIMIliFYejMQnad8v0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTZBs8%2FbtsKFGBHz4W%2FudVgoIMIliFYejMQnad8v0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1463&quot; height=&quot;578&quot; data-filename=&quot;스크린샷 2024-11-11 오후 8.51.20.png&quot; data-origin-width=&quot;1463&quot; data-origin-height=&quot;578&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;iOS in app purchase 상품 불러오기&lt;/h2&gt;
&lt;pre id=&quot;code_1731259034899&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ flutter pub add in_app_purchase&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1731327669583&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'package:flutter/material.dart';
import 'package:in_app_purchase/in_app_purchase.dart';

class ProductListScreen extends StatefulWidget {
  @override
  _ProductListScreenState createState() =&amp;gt; _ProductListScreenState();
}

class _ProductListScreenState extends State&amp;lt;ProductListScreen&amp;gt; {
  final InAppPurchase _inAppPurchase = InAppPurchase.instance;
  bool _available = true;
  List&amp;lt;ProductDetails&amp;gt; _products = [];
  
  // 상품 ID 목록
  final Set&amp;lt;String&amp;gt; _productIds = {'product_id_1', 'product_id_2', 'product_id_3'};

  @override
  void initState() {
    super.initState();
    _initialize();
  }

  Future&amp;lt;void&amp;gt; _initialize() async {
    // 인앱 구매가 가능한지 확인
    final bool isAvailable = await _inAppPurchase.isAvailable();
    setState(() {
      _available = isAvailable;
    });
    if (isAvailable) {
      await _loadProducts();
    }
  }

  Future&amp;lt;void&amp;gt; _loadProducts() async {
    // 상품 정보를 요청
    final ProductDetailsResponse response = await _inAppPurchase.queryProductDetails(_productIds);

    // 요청한 상품 중 없는 상품이 있으면 처리
    if (response.notFoundIDs.isNotEmpty) {
      print(&quot;다음 상품 ID를 찾을 수 없습니다: ${response.notFoundIDs}&quot;);
      return;
    }
    
    // 요청 성공 시 상품 정보 저장
    setState(() {
      _products = response.productDetails;
    });
  }

  @override
  void dispose() {
    _inAppPurchase.purchaseStream.drain();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Available Products'),
      ),
      body: _available
          ? _products.isNotEmpty
              ? ListView.builder(
                  itemCount: _products.length,
                  itemBuilder: (context, index) {
                    final product = _products[index];
                    return ListTile(
                      title: Text(product.title),
                      subtitle: Text(product.description),
                      trailing: Text(product.price),
                    );
                  },
                )
              : Center(child: Text('상품을 불러오는 중...'))
          : Center(child: Text('인앱 구매를 사용할 수 없습니다.')),
    );
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 상태로 실행해보면 인앱 상품을 읽어오지 못합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-11 오후 9.22.28.png&quot; data-origin-width=&quot;1323&quot; data-origin-height=&quot;1178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bINGm2/btsKFkFPMoV/2nDZzIs3pxoMBg1eo0c690/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bINGm2/btsKFkFPMoV/2nDZzIs3pxoMBg1eo0c690/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bINGm2/btsKFkFPMoV/2nDZzIs3pxoMBg1eo0c690/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbINGm2%2FbtsKFkFPMoV%2F2nDZzIs3pxoMBg1eo0c690%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1323&quot; height=&quot;1178&quot; data-filename=&quot;스크린샷 2024-11-11 오후 9.22.28.png&quot; data-origin-width=&quot;1323&quot; data-origin-height=&quot;1178&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-11 오후 9.23.31.png&quot; data-origin-width=&quot;1339&quot; data-origin-height=&quot;1088&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxgqOo/btsKFABDRxO/z3fDQ22bT0sliPRS5Yiae1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxgqOo/btsKFABDRxO/z3fDQ22bT0sliPRS5Yiae1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxgqOo/btsKFABDRxO/z3fDQ22bT0sliPRS5Yiae1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxgqOo%2FbtsKFABDRxO%2Fz3fDQ22bT0sliPRS5Yiae1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1339&quot; height=&quot;1088&quot; data-filename=&quot;스크린샷 2024-11-11 오후 9.23.31.png&quot; data-origin-width=&quot;1339&quot; data-origin-height=&quot;1088&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인앱 상품을 불러오기 위해서는 인앱 상품을 심사 통과해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러기 위해서 이미지와 스크린샷을 찍고, 앱을 제출해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인앱 상품을 불러오지 못하는데, 어떻게 스크린샷을 찍냐?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 상품은 하드코딩해서 표시만 해서 스크린샷을 찍습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 심사용 추가정보에 심사를 위해 필요한(로그인 아이디/비번 등) 정보를 표기해서 제출합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;심사가 통과되면 첫번째 버전의 앱은 출시하지말고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인앱 상품을 불러와서 완성하여 차기 버전을 다시 제출하고 통과후 출시합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(GR 같습니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-22 오후 10.27.45.png&quot; data-origin-width=&quot;1417&quot; data-origin-height=&quot;1037&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7hVsf/btsKUjGGTUF/3oKAsAidZeDKW0rXJJjUZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7hVsf/btsKUjGGTUF/3oKAsAidZeDKW0rXJJjUZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7hVsf/btsKUjGGTUF/3oKAsAidZeDKW0rXJJjUZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7hVsf%2FbtsKUjGGTUF%2F3oKAsAidZeDKW0rXJJjUZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1417&quot; height=&quot;1037&quot; data-filename=&quot;스크린샷 2024-11-22 오후 10.27.45.png&quot; data-origin-width=&quot;1417&quot; data-origin-height=&quot;1037&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱 배포 준비가 되면 입 내 구입 또는 구독이 하기 버튼을 누릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-22 오후 10.29.24.png&quot; data-origin-width=&quot;1035&quot; data-origin-height=&quot;757&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YX3yc/btsKU9p5h50/XlKyIHodU6k9kkqfRzTzK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YX3yc/btsKU9p5h50/XlKyIHodU6k9kkqfRzTzK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YX3yc/btsKU9p5h50/XlKyIHodU6k9kkqfRzTzK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYX3yc%2FbtsKU9p5h50%2FXlKyIHodU6k9kkqfRzTzK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1035&quot; height=&quot;757&quot; data-filename=&quot;스크린샷 2024-11-22 오후 10.29.24.png&quot; data-origin-width=&quot;1035&quot; data-origin-height=&quot;757&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-22 오후 10.29.56.png&quot; data-origin-width=&quot;1407&quot; data-origin-height=&quot;974&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLxUWP/btsKT8enwzD/aWXibaAvBnlK2rTaXIPKf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLxUWP/btsKT8enwzD/aWXibaAvBnlK2rTaXIPKf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLxUWP/btsKT8enwzD/aWXibaAvBnlK2rTaXIPKf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLxUWP%2FbtsKT8enwzD%2FaWXibaAvBnlK2rTaXIPKf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1407&quot; height=&quot;974&quot; data-filename=&quot;스크린샷 2024-11-22 오후 10.29.56.png&quot; data-origin-width=&quot;1407&quot; data-origin-height=&quot;974&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-22 오후 10.30.30.png&quot; data-origin-width=&quot;1374&quot; data-origin-height=&quot;625&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nU2YW/btsKUfYXcQe/7MqefwU9F1KqIzJqDkvh6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nU2YW/btsKUfYXcQe/7MqefwU9F1KqIzJqDkvh6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nU2YW/btsKUfYXcQe/7MqefwU9F1KqIzJqDkvh6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnU2YW%2FbtsKUfYXcQe%2F7MqefwU9F1KqIzJqDkvh6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1374&quot; height=&quot;625&quot; data-filename=&quot;스크린샷 2024-11-22 오후 10.30.30.png&quot; data-origin-width=&quot;1374&quot; data-origin-height=&quot;625&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;심사에 제출하기로 마무리합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>App &amp;amp; OS/Hybrid</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>romeoh</author>
      <guid isPermaLink="true">https://romeoh.tistory.com/502</guid>
      <comments>https://romeoh.tistory.com/502#entry502comment</comments>
      <pubDate>Fri, 22 Nov 2024 16:17:15 +0900</pubDate>
    </item>
  </channel>
</rss>