<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>sr's lair</title>
    <link>https://simryang.tistory.com/</link>
    <description>IT 관련 잡다한 지식 기록</description>
    <language>ko</language>
    <pubDate>Fri, 14 Aug 2026 17:44:00 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>심량</managingEditor>
    <image>
      <title>sr's lair</title>
      <url>https://tistory1.daumcdn.net/tistory/1630939/attach/5e214e5b24f34bccaad72a683e1296fb</url>
      <link>https://simryang.tistory.com</link>
    </image>
    <item>
      <title>&amp;lt;AI도 모르는 글쓰기&amp;gt; - AI가 쓴 글을 결국 사람이 고쳐야 하는 이유</title>
      <link>https://simryang.tistory.com/entry/AI%EB%8F%84-%EB%AA%A8%EB%A5%B4%EB%8A%94-%EA%B8%80%EC%93%B0%EA%B8%B0-AI%EA%B0%80-%EC%93%B4-%EA%B8%80%EC%9D%84-%EA%B2%B0%EA%B5%AD-%EC%82%AC%EB%9E%8C%EC%9D%B4-%EA%B3%A0%EC%B3%90%EC%95%BC-%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0</link>
      <description>&lt;pre id=&quot;code_1785746313665&quot; class=&quot;1c&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;한빛미디어&amp;nbsp;서평단&amp;nbsp;&amp;lt;나는리뷰어다&amp;gt;&amp;nbsp;활동을&amp;nbsp;위해서&amp;nbsp;책을&amp;nbsp;협찬&amp;nbsp;받아&amp;nbsp;작성된&amp;nbsp;서평입니다.&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;7월에 리뷰할 책은 &lt;a title=&quot;AI도 모르는 글쓰기&quot; href=&quot;https://www.hanbit.co.kr/store/books/look.php?p_code=B3467209275&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AI도 모르는 글쓰기&lt;/a&gt; 입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;583&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqPV7u/dJMcahSOa3e/boLDSkYYb1k8PvObNkkdcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqPV7u/dJMcahSOa3e/boLDSkYYb1k8PvObNkkdcK/img.png&quot; data-alt=&quot;AI도 모르는 글쓰기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqPV7u/dJMcahSOa3e/boLDSkYYb1k8PvObNkkdcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqPV7u%2FdJMcahSOa3e%2FboLDSkYYb1k8PvObNkkdcK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;583&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;583&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AI도 모르는 글쓰기&lt;/figcaption&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;나도 모르는 글쓰기로 자꾸 보이고, 나도 모르면서 AI 갈구는 글쓰기 처럼 읽혔기 때문입니다.(공대생은 슬픕니다 ㅜㅜ)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 책은 먼저 좋은 글이 무엇인지부터 설명합니다. 우리 스스로가 좋은 글도 못쓰면서(많이 찔렸습니다..) AI 보고 너 잘써 임마 할 수는 없겠죠?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;448&quot; data-origin-height=&quot;576&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bs0pNx/dJMcaalRewy/cyTRbWTHI3RKx7ljuaHQNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bs0pNx/dJMcaalRewy/cyTRbWTHI3RKx7ljuaHQNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bs0pNx/dJMcaalRewy/cyTRbWTHI3RKx7ljuaHQNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbs0pNx%2FdJMcaalRewy%2FcyTRbWTHI3RKx7ljuaHQNk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;448&quot; height=&quot;576&quot; data-origin-width=&quot;448&quot; data-origin-height=&quot;576&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 ai 가 나타난 뒤로 제 블로그 글 쓰는 방법이 바뀌었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전에는 진짜 노트 메모 수준으로 나중에 찾아보려는 목적으로 글을 작성하기에 급급했어서 ai 를 뭐라고 하기 전에 제 글 수준부터가 진짜 저 자신만을 위한 기록 쪼가리들의 모임이었습니다.&lt;/p&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;그런데 역설적으로 ai 의 도움을 받아 글을 다듬기 시작하면서부터 좀 더 잘 쓰고, 정리하고, ai 냄새보다 내 냄새를 더 싣고 싶다는 생각이 간절하게 되었습니다.&lt;/p&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;나도 ai 로 글 쓰는데 그럼 어쩌라고? 라고 생각하실 수도 있으시겠지만, 이 책은 놀랍게도 대놓고 다음 내용을 알려줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xqY4b/dJMcaa7nh8I/jfebt2WvPPCikT9in52G21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xqY4b/dJMcaa7nh8I/jfebt2WvPPCikT9in52G21/img.png&quot; data-alt=&quot;2.3 AI 티 나지 않게 개선하기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xqY4b/dJMcaa7nh8I/jfebt2WvPPCikT9in52G21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxqY4b%2FdJMcaa7nh8I%2Fjfebt2WvPPCikT9in52G21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;433&quot; height=&quot;720&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2.3 AI 티 나지 않게 개선하기&lt;/figcaption&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;&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;저자는 기획/설계/초안/개선/완성의 글쓰기 단계를 제시하면서 ai 에게 맡길 것과 내가 해야할 것을 구별해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;203&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Q0BOM/dJMcafniZgk/VocZLaIlnviIaW50npyZX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Q0BOM/dJMcafniZgk/VocZLaIlnviIaW50npyZX0/img.png&quot; data-alt=&quot;인간이 해야 할 것과 AI에게 맡길 것&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Q0BOM/dJMcafniZgk/VocZLaIlnviIaW50npyZX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQ0BOM%2FdJMcafniZgk%2FVocZLaIlnviIaW50npyZX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;417&quot; height=&quot;203&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;203&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;인간이 해야 할 것과 AI에게 맡길 것&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체적으로 글쓰기의 기본과 ai 에게 지시해야 하는 것을 잘 버무려서 설명하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글쓰기가 두려웠던 분들도, 복습하실 겸, ai 를 통한 내 저작물 품질을 올려보고 싶으신 분들은 책을 보시면 후회하지 않으실 것 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;714&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qmVHV/dJMcahk8rBE/OHveCYIQ6dMPJy7CpfUbKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qmVHV/dJMcahk8rBE/OHveCYIQ6dMPJy7CpfUbKK/img.png&quot; data-alt=&quot;3.1 기획하고 설계하기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qmVHV/dJMcahk8rBE/OHveCYIQ6dMPJy7CpfUbKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqmVHV%2FdJMcahk8rBE%2FOHveCYIQ6dMPJy7CpfUbKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;430&quot; height=&quot;714&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;714&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;3.1 기획하고 설계하기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 후 내용들은 ai 를 사용하시면서 어느 정도 터득해오시는 내용들도 함께 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떻게 보면 글쓰기와 ai 이용에 빠삭하신 분들에게는 식상하다고 할 수도 있겠으나, 둘 중 하나라도 부족하신 분들에게는 단비와 같은 좋은 내용들이 계속 이어집니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;717&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dh3Yn/dJMcadCOp7R/xAaj0Ld8ocjpLBz7YUBrk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dh3Yn/dJMcadCOp7R/xAaj0Ld8ocjpLBz7YUBrk0/img.png&quot; data-alt=&quot;3.4 AI와 함께 쓰기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dh3Yn/dJMcadCOp7R/xAaj0Ld8ocjpLBz7YUBrk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDh3Yn%2FdJMcadCOp7R%2FxAaj0Ld8ocjpLBz7YUBrk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;422&quot; height=&quot;717&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;717&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;3.4 AI와 함께 쓰기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;460&quot; data-origin-height=&quot;710&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMcxTr/dJMcad3XOzC/SPgw73tqRvKp6Tamjo5oHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMcxTr/dJMcad3XOzC/SPgw73tqRvKp6Tamjo5oHk/img.png&quot; data-alt=&quot;4 회의록&amp;amp;middot;이메일&amp;amp;middot;공지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMcxTr/dJMcad3XOzC/SPgw73tqRvKp6Tamjo5oHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMcxTr%2FdJMcad3XOzC%2FSPgw73tqRvKp6Tamjo5oHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;460&quot; height=&quot;710&quot; data-origin-width=&quot;460&quot; data-origin-height=&quot;710&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;4 회의록&amp;middot;이메일&amp;middot;공지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회의록, 이메일, 공지, 기술 문서(테크니컬 라이팅), 글로벌 문서(번역, i18n) 쓰는 법과 notebooklm 까지 소개하고 있으니 한 번씩 참고하시고 멍충한 ai 라고 욕하기보다 잘했어 라이코스(!)라고 외칠 수 있는 ai 글쓰기 라이프 즐기시길 바라겠습니다.&lt;/p&gt;</description>
      <category>리뷰/나는 리뷰어다(2026)</category>
      <category>AI도 모르는 글쓰기</category>
      <category>나는 리뷰어다</category>
      <category>한빛미디어</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/403</guid>
      <comments>https://simryang.tistory.com/entry/AI%EB%8F%84-%EB%AA%A8%EB%A5%B4%EB%8A%94-%EA%B8%80%EC%93%B0%EA%B8%B0-AI%EA%B0%80-%EC%93%B4-%EA%B8%80%EC%9D%84-%EA%B2%B0%EA%B5%AD-%EC%82%AC%EB%9E%8C%EC%9D%B4-%EA%B3%A0%EC%B3%90%EC%95%BC-%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0#entry403comment</comments>
      <pubDate>Mon, 3 Aug 2026 18:19:07 +0900</pubDate>
    </item>
    <item>
      <title>PowerToys 업데이트 후 &amp;lsquo;스택에 사용할 새 보호 페이지를 만들 수 없습니다&amp;rsquo; 오류 해결</title>
      <link>https://simryang.tistory.com/entry/PowerToys-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8-%ED%9B%84-%E2%80%98%EC%8A%A4%ED%83%9D%EC%97%90-%EC%82%AC%EC%9A%A9%ED%95%A0-%EC%83%88-%EB%B3%B4%ED%98%B8-%ED%8E%98%EC%9D%B4%EC%A7%80%EB%A5%BC-%EB%A7%8C%EB%93%A4-%EC%88%98-%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4%E2%80%99-%EC%98%A4%EB%A5%98-%ED%95%B4%EA%B2%B0</link>
      <description>&lt;p data-end=&quot;353&quot; data-start=&quot;213&quot; data-ke-size=&quot;size16&quot;&gt;PowerToys 자체 업데이트 알림을 클릭한 뒤 PowerToys.QuickAccess.exe가 실행되지 않는 문제가 발생했습니다.&lt;br /&gt;일반 권한 터미널에서 사용자 범위로 설치된 PowerToys를 제거한 뒤 재설치하니 정상적으로 해결되었습니다.&lt;/p&gt;
&lt;p data-end=&quot;353&quot; data-start=&quot;213&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;411&quot; data-start=&quot;355&quot; data-ke-size=&quot;size16&quot;&gt;PowerToys에서 새로운 버전이 있다는 업데이트 알림이 표시되어 평소처럼 업데이트를 진행했습니다.&lt;/p&gt;
&lt;p data-end=&quot;494&quot; data-start=&quot;413&quot; data-ke-size=&quot;size16&quot;&gt;그런데 업데이트가 끝난 뒤 시스템 트레이에서 PowerToys 아이콘을 클릭하자 메인 화면이 열리지 않고 다음과 같은 시스템 오류가 나타났습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;PowerToys.QuickAccess.exe - 시스템 오류

스택에 사용할 새 보호 페이지를 만들 수 없습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;354&quot; data-origin-height=&quot;157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x2s4c/dJMcahrGa18/6Xk1frC3oLbskx4dEBqpkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x2s4c/dJMcahrGa18/6Xk1frC3oLbskx4dEBqpkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x2s4c/dJMcahrGa18/6Xk1frC3oLbskx4dEBqpkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx2s4c%2FdJMcahrGa18%2F6Xk1frC3oLbskx4dEBqpkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;354&quot; height=&quot;157&quot; data-origin-width=&quot;354&quot; data-origin-height=&quot;157&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;652&quot; data-start=&quot;620&quot; data-ke-size=&quot;size16&quot;&gt;Windows를 다시 시작해 보았지만 증상은 동일했습니다.&lt;/p&gt;
&lt;p data-end=&quot;711&quot; data-start=&quot;654&quot; data-ke-size=&quot;size16&quot;&gt;결국 PowerToys를 완전히 제거한 뒤 다시 설치했고, 이후 메인 화면이 정상적으로 실행되었습니다.&lt;/p&gt;
&lt;hr data-end=&quot;716&quot; data-start=&quot;713&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;729&quot; data-start=&quot;718&quot; data-section-id=&quot;15diu50&quot; data-ke-size=&quot;size26&quot;&gt;해결 방법 요약&lt;/h2&gt;
&lt;p data-end=&quot;745&quot; data-start=&quot;731&quot; data-ke-size=&quot;size16&quot;&gt;다음 순서로 해결했습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;1. 관리자 권한이 아닌 일반 터미널 실행
2. 사용자 범위 PowerToys 제거
3. PowerToys 재설치
4. PowerToys 메인 화면 실행 확인&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;866&quot; data-start=&quot;849&quot; data-ke-size=&quot;size16&quot;&gt;사용한 명령은 다음과 같습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;winget uninstall --id Microsoft.PowerToys --scope user --exact&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;968&quot; data-start=&quot;950&quot; data-ke-size=&quot;size16&quot;&gt;제거가 완료되면 다시 설치합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;winget install --id Microsoft.PowerToys --scope user --source winget --exact&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1137&quot; data-start=&quot;1066&quot; data-ke-size=&quot;size16&quot;&gt;재설치 후에는 PowerToys.QuickAccess.exe 오류 없이 PowerToys 메인 화면이 정상적으로 열렸습니다.&lt;/p&gt;
&lt;hr data-end=&quot;1142&quot; data-start=&quot;1139&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1173&quot; data-start=&quot;1144&quot; data-section-id=&quot;9pj6ej&quot; data-ke-size=&quot;size26&quot;&gt;PowerToys 자체 업데이트 후 발생한 문제&lt;/h2&gt;
&lt;p data-end=&quot;1247&quot; data-start=&quot;1175&quot; data-ke-size=&quot;size16&quot;&gt;이번 문제는 Windows 업데이트가 아니라 &lt;b&gt;PowerToys 자체의 업데이트 알림을 클릭해 업데이트한 직후&lt;/b&gt; 발생했습니다.&lt;/p&gt;
&lt;p data-end=&quot;1286&quot; data-start=&quot;1249&quot; data-ke-size=&quot;size16&quot;&gt;업데이트 전에는 PowerToys가 정상적으로 실행되고 있었습니다.&lt;/p&gt;
&lt;p data-end=&quot;1362&quot; data-start=&quot;1288&quot; data-ke-size=&quot;size16&quot;&gt;하지만 자체 업데이트가 끝난 뒤 시스템 트레이 아이콘을 클릭하면 Quick Access 화면이 열리지 않고 다음 오류가 나타났습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;erlang&quot;&gt;&lt;code&gt;스택에 사용할 새 보호 페이지를 만들 수 없습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1443&quot; data-start=&quot;1406&quot; data-ke-size=&quot;size16&quot;&gt;오류 창의 제목을 보면 문제가 발생한 실행 파일은 다음과 같습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;PowerToys.QuickAccess.exe&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1546&quot; data-start=&quot;1484&quot; data-ke-size=&quot;size16&quot;&gt;Quick Access는 시스템 트레이의 PowerToys 아이콘을 클릭했을 때 나타나는 빠른 설정 화면입니다.&lt;/p&gt;
&lt;p data-end=&quot;1651&quot; data-start=&quot;1548&quot; data-ke-size=&quot;size16&quot;&gt;따라서 이번 증상은 PowerToys 전체가 완전히 실행되지 않는 문제라기보다, &lt;b&gt;Quick Access 화면을 구성하는 프로세스가 시작 과정에서 실패한 상황&lt;/b&gt;으로 볼 수 있습니다.&lt;/p&gt;
&lt;hr data-end=&quot;1656&quot; data-start=&quot;1653&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1684&quot; data-start=&quot;1658&quot; data-section-id=&quot;j80feb&quot; data-ke-size=&quot;size26&quot;&gt;먼저 재부팅해 보았지만 해결되지 않았습니다&lt;/h2&gt;
&lt;p data-end=&quot;1781&quot; data-start=&quot;1686&quot; data-ke-size=&quot;size16&quot;&gt;업데이트 직후 발생한 문제였기 때문에 기존 PowerToys 프로세스가 종료되지 않았거나, 새 버전의 파일과 이전 버전의 파일이 함께 로드된 상태일 가능성을 생각했습니다.&lt;/p&gt;
&lt;p data-end=&quot;1830&quot; data-start=&quot;1783&quot; data-ke-size=&quot;size16&quot;&gt;그래서 Windows를 완전히 다시 시작한 뒤 PowerToys를 실행해 보았습니다.&lt;/p&gt;
&lt;p data-end=&quot;1859&quot; data-start=&quot;1832&quot; data-ke-size=&quot;size16&quot;&gt;하지만 재부팅 후에도 동일한 오류가 발생했습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;PowerToys.QuickAccess.exe - 시스템 오류
스택에 사용할 새 보호 페이지를 만들 수 없습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2012&quot; data-start=&quot;1938&quot; data-ke-size=&quot;size16&quot;&gt;이 단계에서 단순히 실행 중인 프로세스가 꼬인 문제는 아닌 것으로 판단하고, PowerToys를 제거한 뒤 다시 설치하기로 했습니다.&lt;/p&gt;
&lt;hr data-end=&quot;2017&quot; data-start=&quot;2014&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2043&quot; data-start=&quot;2019&quot; data-section-id=&quot;n9l7s6&quot; data-ke-size=&quot;size26&quot;&gt;관리자 터미널에서는 제거되지 않았습니다&lt;/h2&gt;
&lt;p data-end=&quot;2091&quot; data-start=&quot;2045&quot; data-ke-size=&quot;size16&quot;&gt;처음에는 관리자 권한으로 Windows 터미널을 실행하고 다음 명령을 입력했습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;winget uninstall --id Microsoft.PowerToys&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2183&quot; data-start=&quot;2154&quot; data-ke-size=&quot;size16&quot;&gt;그러자 다음 메시지가 나타나면서 제거되지 않았습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;찾음 PowerToys (Preview) x64 [Microsoft.PowerToys]

The package installed for user scope cannot be uninstalled
when running with administrator privileges.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2451&quot; data-start=&quot;2351&quot; data-ke-size=&quot;size16&quot;&gt;메시지를 그대로 해석하면 PowerToys가 &lt;b&gt;사용자 범위(User scope)&lt;/b&gt;로 설치되어 있는데, 현재 터미널은 관리자 권한으로 실행되어 있어 제거할 수 없다는 뜻입니다.&lt;/p&gt;
&lt;p data-end=&quot;2609&quot; data-start=&quot;2453&quot; data-ke-size=&quot;size16&quot;&gt;WinGet은 --scope 옵션을 통해 사용자 범위와 시스템 범위를 구분할 수 있습니다. Microsoft 공식 문서에서도 winget uninstall에 설치 범위를 지정하는 옵션을 제공하고 있습니다.&lt;/p&gt;
&lt;hr data-end=&quot;2614&quot; data-start=&quot;2611&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2635&quot; data-start=&quot;2616&quot; data-section-id=&quot;10lokpt&quot; data-ke-size=&quot;size26&quot;&gt;일반 권한 터미널에서 제거하기&lt;/h2&gt;
&lt;p data-end=&quot;2664&quot; data-start=&quot;2637&quot; data-ke-size=&quot;size16&quot;&gt;현재 열려 있는 관리자 권한 터미널을 닫았습니다.&lt;/p&gt;
&lt;p data-end=&quot;2729&quot; data-start=&quot;2666&quot; data-ke-size=&quot;size16&quot;&gt;그다음 시작 메뉴에서 Windows 터미널 또는 PowerShell을 &lt;b&gt;관리자 권한 없이 일반 실행&lt;/b&gt;했습니다.&lt;/p&gt;
&lt;p data-end=&quot;2754&quot; data-start=&quot;2731&quot; data-ke-size=&quot;size16&quot;&gt;일반 터미널에서 다음 명령을 실행했습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;winget uninstall --id Microsoft.PowerToys --scope user --exact&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2857&quot; data-start=&quot;2838&quot; data-ke-size=&quot;size16&quot;&gt;각 옵션의 의미는 다음과 같습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;--id Microsoft.PowerToys
PowerToys의 WinGet 패키지 ID를 지정합니다.

--scope user
현재 사용자 범위에 설치된 패키지를 대상으로 합니다.

--exact
입력한 패키지 ID와 정확히 일치하는 항목을 선택합니다.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3051&quot; data-start=&quot;3015&quot; data-ke-size=&quot;size16&quot;&gt;이번에는 오류 없이 PowerToys가 정상적으로 제거되었습니다.&lt;/p&gt;
&lt;hr data-end=&quot;3056&quot; data-start=&quot;3053&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3078&quot; data-start=&quot;3058&quot; data-section-id=&quot;ifotif&quot; data-ke-size=&quot;size26&quot;&gt;PowerToys 다시 설치하기&lt;/h2&gt;
&lt;p data-end=&quot;3126&quot; data-start=&quot;3080&quot; data-ke-size=&quot;size16&quot;&gt;제거가 완료된 뒤 같은 일반 권한 터미널에서 PowerToys를 다시 설치했습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;winget install --id Microsoft.PowerToys --scope user --source winget --exact&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3373&quot; data-start=&quot;3224&quot; data-ke-size=&quot;size16&quot;&gt;PowerToys는 실행 파일, Microsoft Store, WinGet 등 여러 방식으로 설치할 수 있으며, Microsoft 공식 문서에서도 WinGet을 이용한 설치 방법을 안내하고 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;3402&quot; data-start=&quot;3375&quot; data-ke-size=&quot;size16&quot;&gt;설치가 끝난 뒤 PowerToys를 실행했습니다.&lt;/p&gt;
&lt;p data-end=&quot;3488&quot; data-start=&quot;3404&quot; data-ke-size=&quot;size16&quot;&gt;이번에는 시스템 트레이의 PowerToys 아이콘을 클릭해도 오류가 나타나지 않았고, Quick Access와 설정 화면이 모두 정상적으로 열렸습니다.&lt;/p&gt;
&lt;hr data-end=&quot;3493&quot; data-start=&quot;3490&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3510&quot; data-start=&quot;3495&quot; data-section-id=&quot;eurayp&quot; data-ke-size=&quot;size26&quot;&gt;실행한 명령 전체 정리&lt;/h2&gt;
&lt;p data-end=&quot;3561&quot; data-start=&quot;3512&quot; data-ke-size=&quot;size16&quot;&gt;관리자 권한이 아닌 일반 Windows 터미널에서 다음 두 명령을 순서대로 실행했습니다.&lt;/p&gt;
&lt;h3 data-end=&quot;3579&quot; data-start=&quot;3563&quot; data-section-id=&quot;omzpok&quot; data-ke-size=&quot;size23&quot;&gt;PowerToys 제거&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;winget uninstall --id Microsoft.PowerToys --scope user --exact&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;3680&quot; data-start=&quot;3663&quot; data-section-id=&quot;voor5k&quot; data-ke-size=&quot;size23&quot;&gt;PowerToys 재설치&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;winget install --id Microsoft.PowerToys --scope user --source winget --exact&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3823&quot; data-start=&quot;3778&quot; data-ke-size=&quot;size16&quot;&gt;설치된 PowerToys 정보를 먼저 확인하려면 다음 명령을 사용할 수 있습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;winget list --id Microsoft.PowerToys&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3884&quot; data-start=&quot;3881&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3904&quot; data-start=&quot;3886&quot; data-section-id=&quot;1no9aqq&quot; data-ke-size=&quot;size26&quot;&gt;왜 재설치로 해결되었을까요?&lt;/h2&gt;
&lt;p data-end=&quot;3952&quot; data-start=&quot;3906&quot; data-ke-size=&quot;size16&quot;&gt;정확한 원인은 충돌 로그나 덤프 파일을 분석하지 않았기 때문에 단정할 수 없습니다.&lt;/p&gt;
&lt;p data-end=&quot;3974&quot; data-start=&quot;3954&quot; data-ke-size=&quot;size16&quot;&gt;다만 확인된 상황은 다음과 같습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;1. 업데이트 전에는 PowerToys가 정상적으로 실행되었습니다.
2. PowerToys 자체 업데이트 직후 오류가 발생했습니다.
3. Windows 재부팅으로는 해결되지 않았습니다.
4. PowerToys 제거 후 재설치하자 정상화되었습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;4133&quot; data-start=&quot;4127&quot; data-section-id=&quot;1hrprn6&quot; data-ke-size=&quot;size23&quot;&gt;추론&lt;/h3&gt;
&lt;p data-end=&quot;4239&quot; data-start=&quot;4135&quot; data-ke-size=&quot;size16&quot;&gt;PowerToys 자체 업데이트 과정에서 PowerToys.QuickAccess.exe 또는 함께 사용되는 구성 파일과 라이브러리 일부가 정상적으로 교체되지 않았을 가능성이 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;4324&quot; data-start=&quot;4241&quot; data-ke-size=&quot;size16&quot;&gt;업데이트 도중 기존 프로세스가 파일을 사용하고 있었거나, 일부 파일만 새 버전으로 변경되면서 구성 요소 사이에 버전 불일치가 발생했을 수도 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;4412&quot; data-start=&quot;4326&quot; data-ke-size=&quot;size16&quot;&gt;재설치는 기존 설치 파일을 제거하고 필요한 실행 파일과 구성 요소를 다시 배치하기 때문에, 이러한 불완전한 업데이트 상태가 함께 해소된 것으로 추정됩니다.&lt;/p&gt;
&lt;p data-end=&quot;4493&quot; data-start=&quot;4414&quot; data-ke-size=&quot;size16&quot;&gt;다만 이것은 증상과 해결 결과를 바탕으로 한 &lt;b&gt;추론&lt;/b&gt;이며, PowerToys 업데이트 프로그램의 결함이 원인이었다고 확정한 것은 아닙니다.&lt;/p&gt;
&lt;hr data-end=&quot;4498&quot; data-start=&quot;4495&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;4526&quot; data-start=&quot;4500&quot; data-section-id=&quot;ukaanm&quot; data-ke-size=&quot;size26&quot;&gt;사용자 범위 설치가 문제였던 것은 아닙니다&lt;/h2&gt;
&lt;p data-end=&quot;4589&quot; data-start=&quot;4528&quot; data-ke-size=&quot;size16&quot;&gt;관리자 터미널에서 제거할 때 다음 오류가 표시되었기 때문에 사용자 범위 설치가 문제였다고 생각할 수 있습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;The package installed for user scope cannot be uninstalled
when running with administrator privileges.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;4772&quot; data-start=&quot;4707&quot; data-ke-size=&quot;size16&quot;&gt;하지만 이 메시지는 &lt;b&gt;사용자 범위로 설치된 프로그램을 다른 권한 범위에서 제거하려 했기 때문에 나타난 것&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-end=&quot;4826&quot; data-start=&quot;4774&quot; data-ke-size=&quot;size16&quot;&gt;즉, 사용자 범위로 설치한 것 자체가 Quick Access 오류의 원인이라는 뜻은 아닙니다.&lt;/p&gt;
&lt;p data-end=&quot;4848&quot; data-start=&quot;4828&quot; data-ke-size=&quot;size16&quot;&gt;정리하면 두 문제는 구분해야 합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;Quick Access 시스템 오류
&amp;rarr; PowerToys 업데이트 이후 발생한 실행 문제

WinGet 제거 오류
&amp;rarr; 사용자 범위 프로그램을 관리자 터미널에서 제거하려 해서 발생&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;5014&quot; data-start=&quot;4963&quot; data-ke-size=&quot;size16&quot;&gt;일반 권한 터미널에서 --scope user를 지정하자 정상적으로 제거할 수 있었습니다.&lt;/p&gt;
&lt;hr data-end=&quot;5019&quot; data-start=&quot;5016&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;5049&quot; data-start=&quot;5021&quot; data-section-id=&quot;t2c0u2&quot; data-ke-size=&quot;size26&quot;&gt;기존 PowerToys 설정은 어떻게 될까요?&lt;/h2&gt;
&lt;p data-end=&quot;5107&quot; data-start=&quot;5051&quot; data-ke-size=&quot;size16&quot;&gt;제 경우에는 PowerToys를 제거하고 다시 설치한 뒤에도 기존 설정을 다시 확인할 수 있었습니다.&lt;/p&gt;
&lt;p data-end=&quot;5230&quot; data-start=&quot;5109&quot; data-ke-size=&quot;size16&quot;&gt;다만 설치 방법과 PowerToys 버전, 제거 과정에 따라 사용자 설정이 초기화될 가능성도 있으므로 중요한 Keyboard Manager 매핑이나 FancyZones 레이아웃이 있다면 먼저 백업하는 편이 안전합니다.&lt;/p&gt;
&lt;p data-end=&quot;5309&quot; data-start=&quot;5232&quot; data-ke-size=&quot;size16&quot;&gt;PowerToys 일반 설정에서는 설정 백업과 복원 기능도 제공됩니다.&lt;/p&gt;
&lt;p data-end=&quot;5384&quot; data-start=&quot;5311&quot; data-ke-size=&quot;size16&quot;&gt;메인 화면을 전혀 열 수 없어 백업할 수 없는 상황이라면, 설정 폴더를 직접 삭제하기 전에 별도 위치에 복사해 두는 것이 좋습니다.&lt;/p&gt;
&lt;hr data-end=&quot;5389&quot; data-start=&quot;5386&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;5409&quot; data-start=&quot;5391&quot; data-section-id=&quot;1ccbnav&quot; data-ke-size=&quot;size26&quot;&gt;재설치해도 해결되지 않는다면&lt;/h2&gt;
&lt;p data-end=&quot;5470&quot; data-start=&quot;5411&quot; data-ke-size=&quot;size16&quot;&gt;PowerToys를 다시 설치한 뒤에도 같은 오류가 발생한다면 다음 항목을 추가로 확인해 볼 수 있습니다.&lt;/p&gt;
&lt;h3 data-end=&quot;5493&quot; data-start=&quot;5472&quot; data-section-id=&quot;p3ucxh&quot; data-ke-size=&quot;size23&quot;&gt;Windows를 다시 시작합니다&lt;/h3&gt;
&lt;p data-end=&quot;5557&quot; data-start=&quot;5495&quot; data-ke-size=&quot;size16&quot;&gt;PowerToys 설치 후 이전 프로세스나 라이브러리가 남아 있을 수 있으므로 Windows를 다시 시작합니다.&lt;/p&gt;
&lt;h3 data-end=&quot;5584&quot; data-start=&quot;5559&quot; data-section-id=&quot;vvujue&quot; data-ke-size=&quot;size23&quot;&gt;설치 범위가 중복되어 있는지 확인합니다&lt;/h3&gt;
&lt;p data-end=&quot;5618&quot; data-start=&quot;5586&quot; data-ke-size=&quot;size16&quot;&gt;다음 명령으로 설치된 PowerToys 항목을 확인합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;winget list PowerToys&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;5714&quot; data-start=&quot;5661&quot; data-ke-size=&quot;size16&quot;&gt;사용자 범위와 시스템 범위 설치가 중복되어 있다면 하나의 설치 방식으로 정리하는 것이 좋습니다.&lt;/p&gt;
&lt;h3 data-end=&quot;5738&quot; data-start=&quot;5716&quot; data-section-id=&quot;z5qjxp&quot; data-ke-size=&quot;size23&quot;&gt;Windows 설정에서 제거합니다&lt;/h3&gt;
&lt;p data-end=&quot;5780&quot; data-start=&quot;5740&quot; data-ke-size=&quot;size16&quot;&gt;WinGet 제거가 계속 실패한다면 다음 경로에서도 제거할 수 있습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;Windows 설정
&amp;rarr; 앱
&amp;rarr; 설치된 앱
&amp;rarr; PowerToys (Preview) x64
&amp;rarr; 제거&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;5967&quot; data-start=&quot;5849&quot; data-ke-size=&quot;size16&quot;&gt;Microsoft의 WinGet 제거 문서에서도 명령줄 제거가 어려운 경우 Windows의 설치된 앱 화면을 이용하는 방법을 안내하고 있습니다.&lt;/p&gt;
&lt;hr data-end=&quot;5972&quot; data-start=&quot;5969&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;5985&quot; data-start=&quot;5974&quot; data-section-id=&quot;kcmseu&quot; data-ke-size=&quot;size26&quot;&gt;자주 묻는 질문&lt;/h2&gt;
&lt;h3 data-end=&quot;6033&quot; data-start=&quot;5987&quot; data-section-id=&quot;15ww6ie&quot; data-ke-size=&quot;size23&quot;&gt;관리자 권한 PowerShell에서 PowerToys를 제거하면 안 되나요?&lt;/h3&gt;
&lt;p data-end=&quot;6082&quot; data-start=&quot;6035&quot; data-ke-size=&quot;size16&quot;&gt;PowerToys가 시스템 범위로 설치되어 있다면 관리자 권한이 필요할 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;6159&quot; data-start=&quot;6084&quot; data-ke-size=&quot;size16&quot;&gt;하지만 이번처럼 사용자 범위로 설치된 PowerToys는 관리자 권한 터미널에서 제거하려 할 때 범위가 맞지 않아 실패할 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;6235&quot; data-start=&quot;6161&quot; data-ke-size=&quot;size16&quot;&gt;오류 메시지에 installed for user scope가 표시된다면 일반 권한 터미널에서 다음 명령을 사용해 보시기 바랍니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;winget uninstall --id Microsoft.PowerToys --scope user --exact&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;6349&quot; data-start=&quot;6319&quot; data-section-id=&quot;iusbbj&quot; data-ke-size=&quot;size23&quot;&gt;PowerToys 설정 폴더도 삭제해야 하나요?&lt;/h3&gt;
&lt;p data-end=&quot;6391&quot; data-start=&quot;6351&quot; data-ke-size=&quot;size16&quot;&gt;먼저 설정 폴더를 삭제하지 않고 제거와 재설치만 진행하는 것이 좋습니다.&lt;/p&gt;
&lt;p data-end=&quot;6442&quot; data-start=&quot;6393&quot; data-ke-size=&quot;size16&quot;&gt;이번 사례에서는 설정 폴더를 별도로 초기화하지 않고도 재설치만으로 문제가 해결되었습니다.&lt;/p&gt;
&lt;p data-end=&quot;6493&quot; data-start=&quot;6444&quot; data-ke-size=&quot;size16&quot;&gt;재설치 후에도 같은 오류가 계속될 때만 설정 백업 후 초기화를 검토하는 편이 안전합니다.&lt;/p&gt;
&lt;h3 data-end=&quot;6522&quot; data-start=&quot;6495&quot; data-section-id=&quot;1aazk1o&quot; data-ke-size=&quot;size23&quot;&gt;가상 메모리가 부족해서 발생한 오류인가요?&lt;/h3&gt;
&lt;p data-end=&quot;6563&quot; data-start=&quot;6524&quot; data-ke-size=&quot;size16&quot;&gt;오류 문구만 보면 스택이나 메모리와 관련된 문제처럼 보일 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;6653&quot; data-start=&quot;6565&quot; data-ke-size=&quot;size16&quot;&gt;하지만 이번 사례에서는 PowerToys 자체 업데이트 직후 Quick Access에서만 발생했고, 동일한 PC에서 제거 후 재설치하자 즉시 정상화되었습니다.&lt;/p&gt;
&lt;p data-end=&quot;6761&quot; data-start=&quot;6655&quot; data-ke-size=&quot;size16&quot;&gt;따라서 시스템 전체의 메모리 부족보다는 &lt;b&gt;PowerToys 업데이트 또는 설치 상태에 문제가 있었을 가능성&lt;/b&gt;이 더 높아 보입니다. 이 역시 확인된 원인이 아니라 증상에 근거한 추론입니다.&lt;/p&gt;
&lt;hr data-end=&quot;6766&quot; data-start=&quot;6763&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;6774&quot; data-start=&quot;6768&quot; data-section-id=&quot;1h9nj85&quot; data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-end=&quot;6824&quot; data-start=&quot;6776&quot; data-ke-size=&quot;size16&quot;&gt;PowerToys 자체 업데이트 알림을 클릭해 업데이트한 뒤 다음 오류가 발생했습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;PowerToys.QuickAccess.exe - 시스템 오류
스택에 사용할 새 보호 페이지를 만들 수 없습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;6989&quot; data-start=&quot;6903&quot; data-ke-size=&quot;size16&quot;&gt;Windows를 다시 시작해도 해결되지 않았지만, 일반 권한 터미널에서 사용자 범위 PowerToys를 제거한 뒤 다시 설치하자 정상적으로 실행되었습니다.&lt;/p&gt;
&lt;p data-end=&quot;7008&quot; data-start=&quot;6991&quot; data-ke-size=&quot;size16&quot;&gt;핵심 명령은 다음 두 줄입니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;winget uninstall --id Microsoft.PowerToys --scope user --exact
winget install --id Microsoft.PowerToys --scope user --source winget --exact&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;7221&quot; data-start=&quot;7169&quot; data-ke-size=&quot;size16&quot;&gt;관리자 권한 터미널에서 다음 메시지가 나타난다면 터미널을 일반 권한으로 다시 실행해야 합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;The package installed for user scope cannot be uninstalled
when running with administrator privileges.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;7456&quot; data-start=&quot;7339&quot; data-ke-size=&quot;size16&quot;&gt;업데이트를 눌렀을 뿐인데 프로그램 제거 권한과 설치 범위까지 공부하게 되는 것이 Windows 유틸리티의 교육 철학인 모양입니다. 다행히 이번 문제는 별도의 설정 초기화 없이 제거와 재설치만으로 해결되었습니다.&lt;/p&gt;</description>
      <category>IT/System Digging</category>
      <category>PowerToys</category>
      <category>PowerToys업데이트</category>
      <category>QuickAccess오류</category>
      <category>스택에 사용할 새 보호 페이지</category>
      <category>파워토이</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/401</guid>
      <comments>https://simryang.tistory.com/entry/PowerToys-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8-%ED%9B%84-%E2%80%98%EC%8A%A4%ED%83%9D%EC%97%90-%EC%82%AC%EC%9A%A9%ED%95%A0-%EC%83%88-%EB%B3%B4%ED%98%B8-%ED%8E%98%EC%9D%B4%EC%A7%80%EB%A5%BC-%EB%A7%8C%EB%93%A4-%EC%88%98-%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4%E2%80%99-%EC%98%A4%EB%A5%98-%ED%95%B4%EA%B2%B0#entry401comment</comments>
      <pubDate>Thu, 16 Jul 2026 10:13:39 +0900</pubDate>
    </item>
    <item>
      <title>Windows 11 업데이트 후 PowerToys Win+F로 Everything이 실행되지 않을 때 해결 방법</title>
      <link>https://simryang.tistory.com/entry/Windows-11-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8-%ED%9B%84-PowerToys-WinF%EB%A1%9C-Everything%EC%9D%B4-%EC%8B%A4%ED%96%89%EB%90%98%EC%A7%80-%EC%95%8A%EC%9D%84-%EB%95%8C-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95</link>
      <description>&lt;p data-end=&quot;756&quot; data-start=&quot;581&quot; data-ke-size=&quot;size16&quot;&gt;Windows 11 업데이트 이후 PowerToys에 등록한 Win + F 단축키로 Everything이 실행되지 않는 문제가 발생했습니다.&lt;br /&gt;PowerToys의 작업을 앱 시작에서 URL 열기로 변경하고, URL 입력란에 Everything.exe의 전체 경로를 넣으니 정상적으로 해결되었습니다.&lt;/p&gt;
&lt;p data-end=&quot;847&quot; data-start=&quot;758&quot; data-ke-size=&quot;size16&quot;&gt;기존에는 PowerToys의 Keyboard Manager를 이용해 Win + F를 누르면 Everything 검색창이 열리도록 설정해 사용하고 있었습니다.&lt;/p&gt;
&lt;p data-end=&quot;903&quot; data-start=&quot;849&quot; data-ke-size=&quot;size16&quot;&gt;그런데 어느 시점의 Windows 11 업데이트 이후부터 단축키를 눌러도 아무 반응이 없었습니다.&lt;/p&gt;
&lt;p data-end=&quot;977&quot; data-start=&quot;905&quot; data-ke-size=&quot;size16&quot;&gt;Everything.exe를 직접 실행하면 프로그램은 정상적으로 열렸기 때문에 Everything 자체의 문제는 아니었습니다.&lt;/p&gt;
&lt;p data-end=&quot;1000&quot; data-start=&quot;979&quot; data-ke-size=&quot;size16&quot;&gt;다음과 같은 방법도 확인해 보았습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1105&quot; data-start=&quot;1002&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1018&quot; data-start=&quot;1002&quot; data-section-id=&quot;11hkmah&quot;&gt;실행 파일 경로 다시 지정&lt;/li&gt;
&lt;li data-end=&quot;1040&quot; data-start=&quot;1019&quot; data-section-id=&quot;94l0ef&quot;&gt;PowerToys 관리자 권한 실행&lt;/li&gt;
&lt;li data-end=&quot;1053&quot; data-start=&quot;1041&quot; data-section-id=&quot;672jlw&quot;&gt;시작 디렉터리 입력&lt;/li&gt;
&lt;li data-end=&quot;1071&quot; data-start=&quot;1054&quot; data-section-id=&quot;1l8wjpc&quot;&gt;기존 단축키 삭제 후 재등록&lt;/li&gt;
&lt;li data-end=&quot;1105&quot; data-start=&quot;1072&quot; data-section-id=&quot;qoh6hl&quot;&gt;PowerToys와 Keyboard Manager 재시작&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1139&quot; data-start=&quot;1107&quot; data-ke-size=&quot;size16&quot;&gt;하지만 앱 시작 방식에서는 문제가 해결되지 않았습니다.&lt;/p&gt;
&lt;hr data-end=&quot;1144&quot; data-start=&quot;1141&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1154&quot; data-start=&quot;1146&quot; data-section-id=&quot;ib841p&quot; data-ke-size=&quot;size26&quot;&gt;해결 방법&lt;/h2&gt;
&lt;p data-end=&quot;1184&quot; data-start=&quot;1156&quot; data-ke-size=&quot;size16&quot;&gt;PowerToys 설정에서 다음 메뉴로 이동합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;Keyboard Manager
&amp;rarr; 바로 가기 다시 매핑
&amp;rarr; Win + F 항목 편집&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1263&quot; data-start=&quot;1246&quot; data-ke-size=&quot;size16&quot;&gt;기존 설정은 다음과 같았습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;단축키: Win + F
작업: 앱 시작
앱: D:\user\util\installed\Everything\Everything.exe&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1394&quot; data-start=&quot;1352&quot; data-ke-size=&quot;size16&quot;&gt;여기서 작업 드롭다운을 &lt;b&gt;앱 시작에서 URL 열기로 변경&lt;/b&gt;합니다.&lt;/p&gt;
&lt;p data-end=&quot;1439&quot; data-start=&quot;1396&quot; data-ke-size=&quot;size16&quot;&gt;그다음 URL 입력란에 Everything 실행 파일의 전체 경로를 넣습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;D:\user\util\installed\Everything\Everything.exe&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1559&quot; data-start=&quot;1503&quot; data-ke-size=&quot;size16&quot;&gt;설정을 저장하고 Win + F를 눌러 보니 Everything 검색창이 정상적으로 실행되었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;806&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xaaip/dJMcadJq7dF/wyrucRBxxy5G45Wwvz7dYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xaaip/dJMcadJq7dF/wyrucRBxxy5G45Wwvz7dYk/img.png&quot; data-alt=&quot;작업에서 URL 열기 선택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xaaip/dJMcadJq7dF/wyrucRBxxy5G45Wwvz7dYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxaaip%2FdJMcadJq7dF%2FwyrucRBxxy5G45Wwvz7dYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1112&quot; height=&quot;806&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;806&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;작업에서 URL 열기 선택&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rljZM/dJMcabLNIVe/VMRmBAegW9YKMGMXfm5KIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rljZM/dJMcabLNIVe/VMRmBAegW9YKMGMXfm5KIk/img.png&quot; data-alt=&quot;URL 항목에 실행파일 경로 붙여넣기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rljZM/dJMcabLNIVe/VMRmBAegW9YKMGMXfm5KIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrljZM%2FdJMcabLNIVe%2FVMRmBAegW9YKMGMXfm5KIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;764&quot; height=&quot;652&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;652&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;URL 항목에 실행파일 경로 붙여넣기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;1564&quot; data-start=&quot;1561&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1579&quot; data-start=&quot;1566&quot; data-section-id=&quot;3wbdo9&quot; data-ke-size=&quot;size26&quot;&gt;변경 전과 변경 후&lt;/h2&gt;
&lt;h3 data-end=&quot;1596&quot; data-start=&quot;1581&quot; data-section-id=&quot;17p1e19&quot; data-ke-size=&quot;size23&quot;&gt;작동하지 않았던 설정&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;단축키: Win + F
작업: 앱 시작
앱: D:\user\util\installed\Everything\Everything.exe&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1701&quot; data-start=&quot;1685&quot; data-section-id=&quot;y8frna&quot; data-ke-size=&quot;size23&quot;&gt;정상적으로 작동한 설정&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;단축키: Win + F
작업: URL 열기
URL: D:\user\util\installed\Everything\Everything.exe&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1820&quot; data-start=&quot;1794&quot; data-ke-size=&quot;size16&quot;&gt;실행 파일의 위치나 단축키는 바꾸지 않았습니다.&lt;/p&gt;
&lt;p data-end=&quot;1875&quot; data-start=&quot;1822&quot; data-ke-size=&quot;size16&quot;&gt;PowerToys가 실행 파일을 처리하는 작업만 앱 시작에서 URL 열기로 변경했습니다.&lt;/p&gt;
&lt;hr data-end=&quot;1880&quot; data-start=&quot;1877&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1911&quot; data-start=&quot;1882&quot; data-section-id=&quot;9yt02t&quot; data-ke-size=&quot;size26&quot;&gt;왜 URL 열기로 실행되는지는 확실하지 않습니다&lt;/h2&gt;
&lt;p data-end=&quot;1960&quot; data-start=&quot;1913&quot; data-ke-size=&quot;size16&quot;&gt;정확한 원인은 PowerToys 로그나 동일 환경의 재현 없이는 확인하기 어렵습니다.&lt;/p&gt;
&lt;p data-end=&quot;1972&quot; data-start=&quot;1962&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;추론입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2062&quot; data-start=&quot;1974&quot; data-ke-size=&quot;size16&quot;&gt;앱 시작은 실행 인수, 시작 디렉터리, 권한 등 여러 옵션을 함께 처리합니다. 반면 URL 열기는 입력된 경로나 주소를 상대적으로 단순하게 실행합니다.&lt;/p&gt;
&lt;p data-end=&quot;2125&quot; data-start=&quot;2064&quot; data-ke-size=&quot;size16&quot;&gt;제 환경에서는 앱 시작 처리 과정에서 발생하던 문제가 URL 열기에서는 나타나지 않은 것으로 보입니다.&lt;/p&gt;
&lt;p data-end=&quot;2211&quot; data-start=&quot;2127&quot; data-ke-size=&quot;size16&quot;&gt;따라서 PowerToys를 완전히 우회한 것은 아니며, &lt;b&gt;PowerToys 안에서 다른 실행 방식을 사용한 우회 방법&lt;/b&gt;이라고 보는 것이 정확합니다.&lt;/p&gt;
&lt;hr data-end=&quot;2216&quot; data-start=&quot;2213&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2243&quot; data-start=&quot;2218&quot; data-section-id=&quot;15yhagw&quot; data-ke-size=&quot;size26&quot;&gt;URL 열기로 변경해도 실행되지 않는다면&lt;/h2&gt;
&lt;p data-end=&quot;2265&quot; data-start=&quot;2245&quot; data-ke-size=&quot;size16&quot;&gt;다음 항목을 확인해 보시기 바랍니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2476&quot; data-start=&quot;2267&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2303&quot; data-start=&quot;2267&quot; data-section-id=&quot;26xfui&quot;&gt;Everything.exe가 직접 실행되는지 확인합니다.&lt;/li&gt;
&lt;li data-end=&quot;2339&quot; data-start=&quot;2304&quot; data-section-id=&quot;1fwt3t0&quot;&gt;PowerToys가 백그라운드에서 실행 중인지 확인합니다.&lt;/li&gt;
&lt;li data-end=&quot;2377&quot; data-start=&quot;2340&quot; data-section-id=&quot;2m3ezt&quot;&gt;Keyboard Manager가 활성화되어 있는지 확인합니다.&lt;/li&gt;
&lt;li data-end=&quot;2429&quot; data-start=&quot;2378&quot; data-section-id=&quot;1nsgyq4&quot;&gt;Win + F 대신 Ctrl + Alt + E 같은 다른 단축키로 테스트합니다.&lt;/li&gt;
&lt;li data-end=&quot;2476&quot; data-start=&quot;2430&quot; data-section-id=&quot;ltgh5m&quot;&gt;PowerToys와 Everything의 실행 권한이 서로 다른지 확인합니다.&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>IT/System Digging</category>
      <category>everything</category>
      <category>Keyboard Manager</category>
      <category>PowerToys</category>
      <category>Win+F</category>
      <category>파워토이</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/400</guid>
      <comments>https://simryang.tistory.com/entry/Windows-11-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8-%ED%9B%84-PowerToys-WinF%EB%A1%9C-Everything%EC%9D%B4-%EC%8B%A4%ED%96%89%EB%90%98%EC%A7%80-%EC%95%8A%EC%9D%84-%EB%95%8C-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95#entry400comment</comments>
      <pubDate>Thu, 16 Jul 2026 09:45:55 +0900</pubDate>
    </item>
    <item>
      <title>&amp;lt;트랜스포머 아키텍처로 배우는 AI 에이전트 with 랭체인 &amp;amp; 랭그래프&amp;gt; -</title>
      <link>https://simryang.tistory.com/entry/%ED%8A%B8%EB%9E%9C%EC%8A%A4%ED%8F%AC%EB%A8%B8-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98%EB%A1%9C-%EB%B0%B0%EC%9A%B0%EB%8A%94-AI-%EC%97%90%EC%9D%B4%EC%A0%84%ED%8A%B8-with-%EB%9E%AD%EC%B2%B4%EC%9D%B8-%EB%9E%AD%EA%B7%B8%EB%9E%98%ED%94%84</link>
      <description>&lt;pre id=&quot;code_1782868417625&quot; class=&quot;1c&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;한빛미디어&amp;nbsp;서평단&amp;nbsp;&amp;lt;나는리뷰어다&amp;gt;&amp;nbsp;활동을&amp;nbsp;위해서&amp;nbsp;책을&amp;nbsp;협찬&amp;nbsp;받아&amp;nbsp;작성된&amp;nbsp;서평입니다.&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;6월에 리뷰할 책은 &lt;a href=&quot;https://www.hanbit.co.kr/store/books/look.php?p_code=B4003944332&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: start;&quot;&gt;트랜스포머 아키텍처로 배우는 AI 에이전트 with 랭체인 &amp;amp; 랭그래프&lt;/span&gt;&lt;/a&gt; 입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U8b2i/dJMcaaluPgT/z9J6Ar51jjGk7zj8KNsul1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U8b2i/dJMcaaluPgT/z9J6Ar51jjGk7zj8KNsul1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U8b2i/dJMcaaluPgT/z9J6Ar51jjGk7zj8KNsul1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU8b2i%2FdJMcaaluPgT%2Fz9J6Ar51jjGk7zj8KNsul1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;514&quot; data-origin-width=&quot;400&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;제목이 꽤 긴 편입니다. 다만, 목차를 따라가 보면 저자의 분명한 집필 방향을 알 수 있었습니다. 자연어 처리의 기본 개념에서 시작해 어텐션, 트랜스포머, LLM, 랭체인, 랭그래프, RAG, 로컬 LLM, 멀티 에이전트까지 이어지는 흐름입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1장에서는 실습 환경 구성을 먼저 안내합니다. 비주얼 스튜디오 설치, 미니콘다 기반 가상 환경 구성, CPU와 GPU 환경에 따른 파이썬 라이브러리 설치가 포함되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;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;기본 원리 설명은 이해에 도움이 되지만, 수학적인 원리와 같은 부분은 꼭 왜 이해 안되지 하시면서 붙잡지 않으셔도 됩니다. 저자의 전체적인 의도인 AI 에이전트가 이렇게 돌아간다라는 큰 흐름 안에서 한 번 훑어보는 정도로만 권장합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜냐하면 이미 아시는 분들은 이미 아실만한 개념일테고 수학적인 것을 들이파고자 이 책을 선택하신 것은 아니실테니까요, 혹시 이쪽에 좀 더 자세한 공부를 원하신다면 &lt;a href=&quot;https://www.hanbit.co.kr/store/books/look.php?p_code=B6703128448&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;처음 배우는 딥러닝 수학&lt;/a&gt; 이나 &lt;a href=&quot;https://www.hanbit.co.kr/store/books/look.php?p_code=B9813506107&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AI를 위한 필수 수학&lt;/a&gt; 과 같은 책들을 먼저 보시기를 추천합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3장에서는 강화학습을 다룹니다. 보상, 상태, 행동, 정책, 가치 함수 같은 개념을 바탕으로 모델이 선택을 개선해 가는 과정을 설명합니다. 다중 슬롯 머신 문제, 마르코프 결정 프로세스, 몬테카를로 방법, TD(0), Sarsa, Q-learning까지 이어집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4장에서는 시퀀스 모델을 다룹니다. RNN, LSTM, 양방향 LSTM, seq2seq, 빔 서치가 포함되어 있습니다. 이 부분은 뒤에 나오는 어텐션과 트랜스포머를 이해하기 위한 전 단계로 볼 수 있습니다.&lt;/p&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;하지만 본격적인 내용이 시작되는 5장의 어텐션과 6장의 트랜스포머 쪽을 보시게 되면 이 쪽에 익숙하지 않으신 분들은 반복해서 읽고, 다른 내용들도 찾아보고 하시면 도움이 되실 것 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;975&quot; data-origin-height=&quot;549&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yqkTn/dJMcaaMCvtl/teMb13mAKAWHAKDPbyRBfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yqkTn/dJMcaaMCvtl/teMb13mAKAWHAKDPbyRBfK/img.png&quot; data-alt=&quot;본문의 어텐션 스코어와 컨텍스트 관련된 도표&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yqkTn/dJMcaaMCvtl/teMb13mAKAWHAKDPbyRBfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyqkTn%2FdJMcaaMCvtl%2FteMb13mAKAWHAKDPbyRBfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;975&quot; height=&quot;549&quot; data-origin-width=&quot;975&quot; data-origin-height=&quot;549&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;본문의 어텐션 스코어와 컨텍스트 관련된 도표&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;764&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Vzy7W/dJMcaaslDt0/Kwhv8yod6dIyK5CSd7zefk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Vzy7W/dJMcaaslDt0/Kwhv8yod6dIyK5CSd7zefk/img.png&quot; data-alt=&quot;트랜스포머 전체 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Vzy7W/dJMcaaslDt0/Kwhv8yod6dIyK5CSd7zefk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVzy7W%2FdJMcaaslDt0%2FKwhv8yod6dIyK5CSd7zefk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;979&quot; height=&quot;764&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;764&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;트랜스포머 전체 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개략적으로 알고 싶으시면 본문의 아래 표를 참조하시고 관심이 있는 쪽에 해당하는 부분만 좀 더 자세히 파악하시면 될 것 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;964&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UENfr/dJMcadJfBv7/xD2Q59Wbaw34dvDLB2GWzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UENfr/dJMcadJfBv7/xD2Q59Wbaw34dvDLB2GWzK/img.png&quot; data-alt=&quot;LLM 발전 연대기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UENfr/dJMcadJfBv7/xD2Q59Wbaw34dvDLB2GWzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUENfr%2FdJMcadJfBv7%2FxD2Q59Wbaw34dvDLB2GWzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;964&quot; height=&quot;440&quot; data-origin-width=&quot;964&quot; data-origin-height=&quot;440&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;LLM 발전 연대기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이론은 잘 모르겠고, 난 실습부터 하고 싶다 하시는 분들은 8장부터 보시면 됩니다. Ollama 를 통해 트랜스포머를 사용해볼 수 있는 내용들을 소개하고 있고, 9장에서는 LLM을 나만의 데이터로 추가 학습을 시키는 파인튜닝을 설명하고 있고, 10장에서는 외부 지식을 데이터베이스화 해서 이를 LLM이 검색해서 활용할 수 있게 하는 RAG의 개념과 실제 테스트할 수 있는 내용들에 대해서 소개하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11장과 12장은 각각 간략히 멀티에이전트, MCP, Streamlit 을 통한 에이전트 발행(?) 기능을 안내하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인적으로 Ollama 는 설치해서 어떻게 동작하는지 등을 살펴보았지만, 사용 환경의 한계(구형 그래픽 카드, 자원 제약 등등)로 만족할만한 테스트는 못 해봤습니다. 좀 더 넉넉한 예산이 있었으면 좋겠지만, 1백만원대 후반에서 2백만원이면 구축할 수 있었던 환경이 3백만원 이상을 줘야 시작을 할 수 있는 상황이 계속 되는지라 엄두는 못냈습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;292&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l52jg/dJMcaa6YhsK/5xCOMuwKe4gaI5G3MfgV51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l52jg/dJMcaa6YhsK/5xCOMuwKe4gaI5G3MfgV51/img.png&quot; data-alt=&quot;ollama 실행&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l52jg/dJMcaa6YhsK/5xCOMuwKe4gaI5G3MfgV51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl52jg%2FdJMcaa6YhsK%2F5xCOMuwKe4gaI5G3MfgV51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;572&quot; height=&quot;292&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;292&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ollama 실행&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kF2F2/dJMcahkJJJG/hjxxq3Lm38UWG2DFGbPM90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kF2F2/dJMcahkJJJG/hjxxq3Lm38UWG2DFGbPM90/img.png&quot; data-alt=&quot;날씨를 물었더니 엉뚱한 날짜로 검색하는 ollama&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kF2F2/dJMcahkJJJG/hjxxq3Lm38UWG2DFGbPM90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkF2F2%2FdJMcahkJJJG%2Fhjxxq3Lm38UWG2DFGbPM90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;620&quot; height=&quot;272&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;272&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;날씨를 물었더니 엉뚱한 날짜로 검색하는 ollama&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;399&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BlcmV/dJMcaiRpOyZ/ZnuQPRkskDjNROIKLJhgLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BlcmV/dJMcaiRpOyZ/ZnuQPRkskDjNROIKLJhgLK/img.png&quot; data-alt=&quot;아직은 상당히 불안한(HW 스펙 부족 때문인지 ㅜㅜ) ollama 동작 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BlcmV/dJMcaiRpOyZ/ZnuQPRkskDjNROIKLJhgLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBlcmV%2FdJMcaiRpOyZ%2FZnuQPRkskDjNROIKLJhgLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;789&quot; height=&quot;399&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;399&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;아직은 상당히 불안한(HW 스펙 부족 때문인지 ㅜㅜ) ollama 동작 출력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 책은 AI 에이전트를 다루기 위해 필요한 배경 개념을 앞에서 정리하고, 뒤쪽에서 실제 도구와 실습으로 연결하는 구성을 가지고 있습니다. 빠르게 결과물부터 만들고 싶은 분에게는 앞부분이 조금 길게 느껴질 수 있습니다. 반대로 LLM, 트랜스포머, RAG, 로컬 LLM, 랭체인, 랭그래프가 어떤 순서로 연결되는지 보고 싶은 분에게는 전체 흐름을 잡는 데 도움이 될 책이라고 생각합니다.&lt;/p&gt;</description>
      <category>리뷰/나는 리뷰어다(2026)</category>
      <category>나는 리뷰어다</category>
      <category>트랜스포머 아키텍처로 배우는 AI 에이전트 with 랭체인 &amp;amp; 랭그래프</category>
      <category>한빛미디어</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/399</guid>
      <comments>https://simryang.tistory.com/entry/%ED%8A%B8%EB%9E%9C%EC%8A%A4%ED%8F%AC%EB%A8%B8-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98%EB%A1%9C-%EB%B0%B0%EC%9A%B0%EB%8A%94-AI-%EC%97%90%EC%9D%B4%EC%A0%84%ED%8A%B8-with-%EB%9E%AD%EC%B2%B4%EC%9D%B8-%EB%9E%AD%EA%B7%B8%EB%9E%98%ED%94%84#entry399comment</comments>
      <pubDate>Wed, 1 Jul 2026 11:05:51 +0900</pubDate>
    </item>
    <item>
      <title>&amp;lt;클로드 코드 마스터&amp;gt; - AI를 쓰는 개발자에서 AI를 이끄는 개발자로</title>
      <link>https://simryang.tistory.com/entry/%ED%81%B4%EB%A1%9C%EB%93%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%8A%A4%ED%84%B0-%ED%81%B4%EB%A1%9C%EB%93%9C-%EC%BD%94%EB%93%9C-%EA%B8%B0%EC%B4%88-%EB%8B%A4%EC%A7%80%EA%B8%B0</link>
      <description>&lt;pre id=&quot;code_1780295619341&quot; class=&quot;1c&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;한빛미디어&amp;nbsp;서평단&amp;nbsp;&amp;lt;나는리뷰어다&amp;gt;&amp;nbsp;활동을&amp;nbsp;위해서&amp;nbsp;책을&amp;nbsp;협찬&amp;nbsp;받아&amp;nbsp;작성된&amp;nbsp;서평입니다.&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;5월에 리뷰할 책은 &lt;a href=&quot;https://www.hanbit.co.kr/store/books/look.php?p_code=B3445996677&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;클로드 코드 마스터&lt;/a&gt; 입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;876&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dp3Za/dJMcahdzcOf/frD9YiOdacVPlQfEfo2kl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dp3Za/dJMcahdzcOf/frD9YiOdacVPlQfEfo2kl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dp3Za/dJMcahdzcOf/frD9YiOdacVPlQfEfo2kl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDp3Za%2FdJMcahdzcOf%2FfrD9YiOdacVPlQfEfo2kl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;682&quot; height=&quot;876&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;876&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;요새 신규 개발을 하려고 하던지 규모 있는 수정을 하려고 할 때 AI 를 빼놓고 진행하는 경우가 드물어지고 있는 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저도 초창기에는 웹 버전의 chatgpt 나 claude 에게 일일이 코드를 붙여넣고 물어보고, 저장소에 적용해서 디버깅 일일이 하고, 막히면 또 묻고 하는 과정을 겪었던 것 같습니다.&lt;/p&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;웹 버전의 소스 접근이 제한된 상태의 AI 에게 도움을 받는 것과 직접 소스에 접근 가능한 cli 형태의 AI 도구가 어느 정도 귀찮은 부분을 해결해 주는 게 완전 비교가 안될 정도로 AI 에 대한 생각을 바꾸게 되었고, 개발 성향을 완전히 바꾸게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;솔직히 지금도 AI 빼놓고 코딩하라면 가능합니다. 다만, 시간이 AI보다 더 걸릴 뿐이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI를 사용하면서 내가 설정한 방향을 AI에게 올바로 주입시키고 개발을 진행하는 게 쉽지만은 않다는 것을 많이 깨닫게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럴 때 만난 이 책은 &quot;AI를 사용하는 개발자가 아닌, AI를 이끄는 개발자가 되기 위한 가이드&quot; 라는 출판사의 설명을 가지고 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 위해 이 책에서는 AI 시대의 개발자의 역할에 대해서 1장에서 간략히 정의를 하고, 2장에서 클로드 코드 설치 및 환경 구성뿐만 아니라, 클로드를 잘 쓰기 위해서 기본적으로 이해하면 좋은 개념들을 설명합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델(Opus, Sonnet, Haiku), 기본 명령어, 프로젝트 설정(CLAUDE.md), Agent Skill, Hook을 소개하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 3장의 설명이 도움이 많이 되었습니다. 어떻게 보면 그동안의 개발 경험에 기반한 감으로 클로드를 다그치며 사용해오고 있었다면, 설계, 작업 쪼개기, 완료 조건, TDD 등의 내용을 가끔씩 대충 쓰는게 아니라 매번 인지하고 사용할 수 있도록 명확히 알려주었기 때문입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;491&quot; data-origin-height=&quot;506&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btjloQ/dJMcabxB3pk/Lqp1DlhL53DKvOvfd9XyWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btjloQ/dJMcabxB3pk/Lqp1DlhL53DKvOvfd9XyWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btjloQ/dJMcabxB3pk/Lqp1DlhL53DKvOvfd9XyWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtjloQ%2FdJMcabxB3pk%2FLqp1DlhL53DKvOvfd9XyWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;491&quot; height=&quot;506&quot; data-origin-width=&quot;491&quot; data-origin-height=&quot;506&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;4장부터 12장까지는 이제 풀스택 TODO 앱과 AI 챗봇 앱을 클로드를 통해서 개발하는 내용이 주를 이루고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;528&quot; data-origin-height=&quot;112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9GNyE/dJMcahEAcLt/BEXsTgY3kNdMRXixrxKz4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9GNyE/dJMcahEAcLt/BEXsTgY3kNdMRXixrxKz4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9GNyE/dJMcahEAcLt/BEXsTgY3kNdMRXixrxKz4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9GNyE%2FdJMcahEAcLt%2FBEXsTgY3kNdMRXixrxKz4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;528&quot; height=&quot;112&quot; data-origin-width=&quot;528&quot; data-origin-height=&quot;112&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;92&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qc9ty/dJMcaijdXhS/YbFZmZ2uGZYg3SrNALJWW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qc9ty/dJMcaijdXhS/YbFZmZ2uGZYg3SrNALJWW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qc9ty/dJMcaijdXhS/YbFZmZ2uGZYg3SrNALJWW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqc9ty%2FdJMcaijdXhS%2FYbFZmZ2uGZYg3SrNALJWW1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;482&quot; height=&quot;92&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;92&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 TODO 앱 예제는 풀스택 개발의 기본 흐름을 잡는 데 도움이 되고, 후반부의 AI 챗봇 앱은 AWS Bedrock, 스트리밍 응답, Tool Use 같은 요소까지 다루고 있어서 클로드 코드를 단순 코드 생성기가 아니라 개발 파트너처럼 사용하는 감각을 익히는 데 의미가 있어 보였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직 클로드 사용 및 프로그램 개발에 익숙하지 않으신 분들은 해당 내용들을 따라가시다 보면 어느 정도의 도움을 얻을 수 있을 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어느 정도 사용할 줄 아시는 분들도 쭉 훑어보면 내가 미처 활용해보지 못했던 부분들을 발견하고 즐거운 클로드 생활에 도움이 되도록 잘 가져다 쓸 수 있을 거라 생각됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;저는 개인적으로 gsd 와 superpowers 라는 플러그인을 사용하고 개발하고 있습니다. 그래서 책에 소개된 내용이 어느 정도 아는 내용도 있었고, 일부는 이런 상황에 이렇게 쓰는구나 하는 도움을 받을 수도 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책 부록에 보시면 개발에 유용한 팁 소개라며 Superpowers 플러그인을 소개하고 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;485&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2MAoS/dJMcagTglTo/2KVeCDKTjsc4kyouk28eLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2MAoS/dJMcagTglTo/2KVeCDKTjsc4kyouk28eLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2MAoS/dJMcagTglTo/2KVeCDKTjsc4kyouk28eLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2MAoS%2FdJMcagTglTo%2F2KVeCDKTjsc4kyouk28eLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;485&quot; height=&quot;212&quot; data-origin-width=&quot;485&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 플러그인이 매력적으로 느껴지신다면 꼭 gsd 도 찾아보시고, 마음에 드시면 설치해서 사용해 보세요, 책에 소개된 흐름을 어느 정도는 플러그인이 강제로 진행하도록 하여 짜임새 있게 프로젝트를 진행할 수 있도록 도와줄 수 있을 거라 생각합니다.&lt;/p&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;저처럼 클로드 코드나 비슷한 AI 코딩 도구를 어느 정도 사용해본 사람에게도 의미가 있습니다. 실제 프로젝트 개발 사례를 따라가다 보면 자신이 대충 감으로 넘기고 있던 부분이나, 더 체계적으로 활용할 수 있는 부분을 발견할 수 있기 때문입니다.&lt;/p&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;</description>
      <category>리뷰/나는 리뷰어다(2026)</category>
      <category>나는리뷰어다</category>
      <category>클로드 코드 마스터</category>
      <category>한빛미디어</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/398</guid>
      <comments>https://simryang.tistory.com/entry/%ED%81%B4%EB%A1%9C%EB%93%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%8A%A4%ED%84%B0-%ED%81%B4%EB%A1%9C%EB%93%9C-%EC%BD%94%EB%93%9C-%EA%B8%B0%EC%B4%88-%EB%8B%A4%EC%A7%80%EA%B8%B0#entry398comment</comments>
      <pubDate>Mon, 1 Jun 2026 16:10:15 +0900</pubDate>
    </item>
    <item>
      <title>&amp;lt;오픈클로 with GPT, 제미나이, 클로드&amp;gt; - AI 경험의 특이점</title>
      <link>https://simryang.tistory.com/entry/%EC%98%A4%ED%94%88%ED%81%B4%EB%A1%9C-with-GPT-%EC%A0%9C%EB%AF%B8%EB%82%98%EC%9D%B4-%ED%81%B4%EB%A1%9C%EB%93%9C-AI-%EA%B2%BD%ED%97%98%EC%9D%98-%ED%8A%B9%EC%9D%B4%EC%A0%90</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;한빛미디어&amp;nbsp;서평단&amp;nbsp;&amp;lt;나는리뷰어다&amp;gt;&amp;nbsp;활동을&amp;nbsp;위해서&amp;nbsp;책을&amp;nbsp;협찬&amp;nbsp;받아&amp;nbsp;작성된&amp;nbsp;서평입니다.&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4월에&amp;nbsp; 리뷰할 책은 &lt;a href=&quot;https://www.hanbit.co.kr/store/books/look.php?p_code=B6319455015&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;오픈클로 with GPT, 제미나이, 클로드&lt;/b&gt;&lt;/a&gt; 입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;837&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kRpYc/dJMcac3VHMk/G4mrj8Xy7OVPzWuPP4VmR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kRpYc/dJMcac3VHMk/G4mrj8Xy7OVPzWuPP4VmR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kRpYc/dJMcac3VHMk/G4mrj8Xy7OVPzWuPP4VmR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkRpYc%2FdJMcac3VHMk%2FG4mrj8Xy7OVPzWuPP4VmR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;656&quot; height=&quot;837&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;837&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-end=&quot;752&quot; data-start=&quot;616&quot; data-ke-size=&quot;size16&quot;&gt;AI에 관심을 가지기 시작한 뒤로 감사하게도 한빛미디어를 통해 여러 AI 관련 책을 읽을 기회가 생겼습니다. 첫 리뷰 책부터 지금까지 자연스럽게 AI 흐름을 따라가며 읽을 수 있었고, 이 자리를 빌려 한빛미디어에 감사한 마음을 전하고 싶습니다.&lt;/p&gt;
&lt;p data-end=&quot;801&quot; data-start=&quot;754&quot; data-ke-size=&quot;size16&quot;&gt;아마 이 글을 읽고 계신 분들도 저처럼 AI에 관심이 있는 분들이 많을 것 같습니다.&lt;/p&gt;
&lt;p data-end=&quot;992&quot; data-start=&quot;803&quot; data-ke-size=&quot;size16&quot;&gt;물론 그중에는 이미 AI 흐름을 빠르게 따라가고, 이 책에서 다루는 오픈클로(OpenClaw) 정도는 예전에 설치해보고 활용까지 해본 분들도 계실 것입니다. 그런 분들은 제가 굳이 설명하지 않아도 공식 문서, GitHub, 커뮤니티, 최신 사례를 직접 찾아다니며 더 깊고 빠른 정보를 얻고 계실 테니, 이 글의 주된 대상은 조금 다릅니다.&lt;/p&gt;
&lt;p data-end=&quot;1144&quot; data-start=&quot;994&quot; data-ke-size=&quot;size16&quot;&gt;이 책은 오픈클로라는 이름은 들어봤지만 아직 정확히 무엇인지 모르겠는 분,&lt;br /&gt;AI 에이전트가 실제로 어떤 일을 할 수 있는지 궁금한 분,&lt;br /&gt;최신 기술을 직접 따라가보고 싶지만 여러 문서와 자료를 일일이 수집하고 분석할 시간이 부족한 분들에게 특히 잘 맞는 책입니다.&lt;/p&gt;
&lt;p data-end=&quot;1297&quot; data-start=&quot;1146&quot; data-ke-size=&quot;size16&quot;&gt;오픈클로를 아주 쉽게 말하면, &lt;b&gt;내 컴퓨터 안에서 일하도록 설정할 수 있는 AI 비서&lt;/b&gt;에 가깝습니다. 단순히 질문에 답하는 AI를 넘어, 파일을 다루고, 메일이나 일정 같은 작업을 돕고, 반복적인 일을 자동화하는 방향으로 한 걸음 더 나아간 도구라고 볼 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;1467&quot; data-start=&quot;1299&quot; data-ke-size=&quot;size16&quot;&gt;아직 완벽한 집사라고 부르기에는 이른 부분도 있습니다. 하지만 바로 그렇기 때문에 이 책이 의미 있다고 생각합니다. 막연히 &amp;ldquo;AI가 모든 걸 해줄 것이다&amp;rdquo;라고 말하는 대신, 지금 단계의 AI 에이전트가 무엇을 할 수 있고, 어디까지 조심해서 다뤄야 하는지를 실제 사용 흐름 안에서 보여주기 때문입니다.&lt;/p&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;1642&quot; data-start=&quot;1469&quot; data-ke-size=&quot;size16&quot;&gt;그래서 이 책은 오픈클로를 이미 깊게 쓰고 있는 고급 사용자보다는, &lt;b&gt;AI를 좋아하지만 아직 AI 에이전트라는 흐름에 본격적으로 들어서지 못한 사람에게 좋은 입문서&lt;/b&gt;라고 느껴졌습니다. 최신 기술을 따라가고 싶지만 어디서부터 시작해야 할지 막막했던 분이라면, 이 책이 꽤 괜찮은 출발점이 되어줄 것 같습니다.&lt;/p&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;1642&quot; data-start=&quot;1469&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1578&quot; data-start=&quot;1550&quot; data-ke-size=&quot;size16&quot;&gt;전체 분량은 257페이지라 부담이 크지는 않습니다.&lt;/p&gt;
&lt;p data-end=&quot;1578&quot; data-start=&quot;1550&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1700&quot; data-start=&quot;1580&quot; data-ke-size=&quot;size16&quot;&gt;저도 이번 달에는 업무와 개인 일이 바빠 틈틈이 조금씩 읽었는데, 무난히 읽을 수 있을 정도의 분량이었습니다. 다만 이 책은 그냥 읽고 넘기는 책이라기보다는, 직접 따라 하면서 읽을 때 더 의미가 살아나는 책입니다.&lt;/p&gt;
&lt;p data-end=&quot;1777&quot; data-start=&quot;1702&quot; data-ke-size=&quot;size16&quot;&gt;따라 하면서 읽으면 시간이 조금 더 걸릴 수는 있겠지만, 주말에 넉넉히 시간을 잡고 읽고 실습하면 충분히 따라갈 수 있을 것 같습니다.&lt;/p&gt;
&lt;p data-end=&quot;1777&quot; data-start=&quot;1702&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1932&quot; data-start=&quot;1779&quot; data-ke-size=&quot;size16&quot;&gt;이런 종류의 책은 눈으로만 읽으면 &amp;ldquo;아, 이런 게 있구나&amp;rdquo;에서 끝나기 쉽습니다. 그런데 오픈클로는 실제로 설치하고 연결해봐야 감이 오는 도구입니다. 내 컴퓨터에서 AI가 어떻게 움직이는지, 어디까지 맡길 수 있는지, 어디서부터는 조심해야 하는지 직접 겪어봐야 이해가 됩니다. 꼭 실행해보세요~!!&lt;/p&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;1642&quot; data-start=&quot;1469&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;1642&quot; data-start=&quot;1469&quot; data-ke-size=&quot;size16&quot;&gt;목차를 보겠습니다.&lt;/p&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;1642&quot; data-start=&quot;1469&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;기본적으로 대화형 LLM AI (chatgpt, gemini, grok, claude 등등)을 써 본 경험을 가정하고 설명하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 경험도 없으신 분들은 당장 위에 언급한 것을 검색하셔서 경험을 먼저 해보시기를 권장드립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개념, 설치, 초기 설정 등을 다룹니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqU8Vo/dJMcagkX89W/3FLoBIfpAK6omTFu1wmiXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqU8Vo/dJMcagkX89W/3FLoBIfpAK6omTFu1wmiXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqU8Vo/dJMcagkX89W/3FLoBIfpAK6omTFu1wmiXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqU8Vo%2FdJMcagkX89W%2F3FLoBIfpAK6omTFu1wmiXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;468&quot; height=&quot;439&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;439&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파트2 에서는 오픈클로를 사용하기 위해 준비가 필요한 내용들을 소개하고 간단한 작업들을 오픈클로로 써보도록 유도하고 있어서 제목 그대로 익숙해지고 친숙해지도록 안내하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비용 관리, 토큰 사용량, 보안 설정, 전용 이메일 계정, 브라우저 자동화, 워크스페이스 분리 같은 내용들을 포함하고 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;647&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJdVSF/dJMcaf0EyAr/oAiwqyFyCp4p9YseF6Wosk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJdVSF/dJMcaf0EyAr/oAiwqyFyCp4p9YseF6Wosk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJdVSF/dJMcaf0EyAr/oAiwqyFyCp4p9YseF6Wosk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJdVSF%2FdJMcaf0EyAr%2FoAiwqyFyCp4p9YseF6Wosk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;647&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;647&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;708&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C5rqh/dJMcadV3x5q/Q9oI9Rlz74rP37GF9tS3VK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C5rqh/dJMcadV3x5q/Q9oI9Rlz74rP37GF9tS3VK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C5rqh/dJMcadV3x5q/Q9oI9Rlz74rP37GF9tS3VK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC5rqh%2FdJMcadV3x5q%2FQ9oI9Rlz74rP37GF9tS3VK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;352&quot; height=&quot;708&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;708&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;326&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xvKfB/dJMcacCT8ZB/E4qfROy5ZPlrwLDhMKVofK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xvKfB/dJMcacCT8ZB/E4qfROy5ZPlrwLDhMKVofK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xvKfB/dJMcacCT8ZB/E4qfROy5ZPlrwLDhMKVofK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxvKfB%2FdJMcacCT8ZB%2FE4qfROy5ZPlrwLDhMKVofK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;326&quot; height=&quot;240&quot; data-origin-width=&quot;326&quot; data-origin-height=&quot;240&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;파트3부터는 이제 본격적으로 AI 와 협업해서 자동으로 일해주는 방법들을 차근차근 설명하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞 내용들을 잘 따라오셔야 이 부분들을 맘껏 해보실 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스킬 설치/작성, 유튜브 영상 마크다운 변환, 구글 연동 등의 내용을 다룹니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;377&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3Egae/dJMcaiC5nXQ/JfkB3sWy9xKXlt9e4YmuAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3Egae/dJMcaiC5nXQ/JfkB3sWy9xKXlt9e4YmuAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3Egae/dJMcaiC5nXQ/JfkB3sWy9xKXlt9e4YmuAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3Egae%2FdJMcaiC5nXQ%2FJfkB3sWy9xKXlt9e4YmuAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;436&quot; height=&quot;377&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;377&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;697&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cac23Y/dJMcajooF3m/BkUHqhhRgyawCTYVC7pYqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cac23Y/dJMcajooF3m/BkUHqhhRgyawCTYVC7pYqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cac23Y/dJMcajooF3m/BkUHqhhRgyawCTYVC7pYqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcac23Y%2FdJMcajooF3m%2FBkUHqhhRgyawCTYVC7pYqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;372&quot; height=&quot;697&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;697&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;680&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blZLsg/dJMcagFjEkT/nUI12Jk4DQhnInFgQeXB71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blZLsg/dJMcagFjEkT/nUI12Jk4DQhnInFgQeXB71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blZLsg/dJMcagFjEkT/nUI12Jk4DQhnInFgQeXB71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblZLsg%2FdJMcagFjEkT%2FnUI12Jk4DQhnInFgQeXB71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;417&quot; height=&quot;680&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;680&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;653&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpWYmN/dJMcaiiM0fP/yrlXIasnnGHznx2VoqnN1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpWYmN/dJMcaiiM0fP/yrlXIasnnGHznx2VoqnN1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpWYmN/dJMcaiiM0fP/yrlXIasnnGHznx2VoqnN1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpWYmN%2FdJMcaiiM0fP%2FyrlXIasnnGHznx2VoqnN1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;444&quot; height=&quot;653&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;653&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A8JMP/dJMcaiiM0f4/YkKEiOd9WzCyEZzML1UtR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A8JMP/dJMcaiiM0f4/YkKEiOd9WzCyEZzML1UtR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A8JMP/dJMcaiiM0f4/YkKEiOd9WzCyEZzML1UtR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA8JMP%2FdJMcaiiM0f4%2FYkKEiOd9WzCyEZzML1UtR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;404&quot; height=&quot;490&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;490&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;제가 이 책을 보면서 좋게 본 가장 큰 이유 중 하나는 오픈 클로의 보안 문제를 그냥 지나치지 않는다는 점입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서두인 1장부터 이에 대한 경고를 하고&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;565&quot; data-origin-height=&quot;117&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/egHcPB/dJMcabRvcwS/MSOQJzyZUG6cVPIJYIdXv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/egHcPB/dJMcabRvcwS/MSOQJzyZUG6cVPIJYIdXv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/egHcPB/dJMcabRvcwS/MSOQJzyZUG6cVPIJYIdXv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FegHcPB%2FdJMcabRvcwS%2FMSOQJzyZUG6cVPIJYIdXv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;565&quot; height=&quot;117&quot; data-origin-width=&quot;565&quot; data-origin-height=&quot;117&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 이후에도 틈틈이 실질적으로 문제를 막을 수 있는 방법들을 안내해 주고 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6ekjy/dJMcadV3yoM/J6MSu6PgQAHVHL6BJFt1KK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6ekjy/dJMcadV3yoM/J6MSu6PgQAHVHL6BJFt1KK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6ekjy/dJMcadV3yoM/J6MSu6PgQAHVHL6BJFt1KK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6ekjy%2FdJMcadV3yoM%2FJ6MSu6PgQAHVHL6BJFt1KK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;555&quot; height=&quot;242&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3장에서 조금 더 상세히 다루고 있으니 반드시 정독하시고, 이해가 더 필요하다면 책의 내용을 기반으로 검색하셔서 안전한 방안을 잘 적용하시기 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데, 왜 계속 저도, 저자도 보안을 강조(라고 쓰고 강요)하고 있을까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오픈클로가 출시되자 이를 악용하여 사용자의 정보를 훔치려는 악성 스킬, 취약점들이 발생했기 때문입니다.&lt;a href=&quot;https://www.theverge.com/news/874011/openclaw-ai-skill-clawhub-extensions-security-nightmare&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;The Verge&lt;/a&gt;, &lt;a href=&quot;https://thehackernews.com/2026/02/researchers-find-341-malicious-clawhub.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;The Hacker News&lt;/a&gt; , &lt;a href=&quot;https://www.silverfort.com/blog/clawhub-vulnerability-enables-attackers-to-manipulate-rankings-to-become-the-number-one-skill/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Silverfort 연구팀&lt;/a&gt;에 의해 공개되었었는데, 사용자 API 키, SSH 자격 증명 등의 민감한 데이터를 노리는 사례들이 있었습니다. 현재는 대부분 어느 정도 대처가 되었지만, 사용자가 직접 하던 동작들을 실제로 수행할 수 있는 강력한 오픈클로인지라, 이런 부분은 항상 조심하고 조심해도 부족할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 AI 서비스 사용량 등도 명확히 확인해보시고 쓰셔야 나중에 작게는 폭탄 과금에서부터 크게는 계정 차단 등의 문제를 피할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 부분들을 신경쓰시고, 잘 적용하시면, 쟈비스까지는 아니어도 어느 정도 AI 맛을 일반인들도 느낄 수 있게 된 특이점이라고 감히 말할 수 있는 기능을 제공하는 오픈클로이고, AI 에이전트 쪽의 변화가 워낙 빠르기 때문에 이 책을 구매하시는 분들은 아직 따끈따끈한 내용일 때 꼭 실습해보시기 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 이 책을 참고해서 ollma 기반으로 구축해서 reddit 에서 아이디어를 수집해서 번역시키고 있습니다.&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;이왕 책 사셨으면 꼭 진행해보시고, 앞으로 다가올 AI 에이전트 시대에 좋은 방향을 얻으시길 기원합니다.&lt;/p&gt;</description>
      <category>리뷰/나는 리뷰어다(2026)</category>
      <category>나는리뷰어다</category>
      <category>오픈클로 with GPT 제미나이 클로드</category>
      <category>한빛미디어</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/397</guid>
      <comments>https://simryang.tistory.com/entry/%EC%98%A4%ED%94%88%ED%81%B4%EB%A1%9C-with-GPT-%EC%A0%9C%EB%AF%B8%EB%82%98%EC%9D%B4-%ED%81%B4%EB%A1%9C%EB%93%9C-AI-%EA%B2%BD%ED%97%98%EC%9D%98-%ED%8A%B9%EC%9D%B4%EC%A0%90#entry397comment</comments>
      <pubDate>Sat, 25 Apr 2026 20:34:45 +0900</pubDate>
    </item>
    <item>
      <title>[Windows11] 유령처럼 살아난 IME 2007이 내 세벌식을 자꾸 두벌식으로 바꿀 때 처단한 방법</title>
      <link>https://simryang.tistory.com/entry/Windows11-%EC%9C%A0%EB%A0%B9%EC%B2%98%EB%9F%BC-%EC%82%B4%EC%95%84%EB%82%9C-IME-2007%EC%9D%B4-%EB%82%B4-%EC%84%B8%EB%B2%8C%EC%8B%9D%EC%9D%84-%EC%9E%90%EA%BE%B8-%EB%91%90%EB%B2%8C%EC%8B%9D%EC%9C%BC%EB%A1%9C-%EB%B0%94%EA%BF%80-%EB%95%8C-%EC%B2%98%EB%8B%A8%ED%95%9C-%EB%B0%A9%EB%B2%95</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Windows 11에서 설정에는 제대로 보이지 않는데 Microsoft Office IME 2007이 살아남아 세벌식 자판을 자꾸 두벌식으로 바꾸는 문제가 있었습니다.&lt;br /&gt;제 경우에는 키보드 추가로 다시 불러낸 뒤 바로 삭제하는 방식으로 해결되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;801&quot; data-start=&quot;767&quot; data-ke-size=&quot;size16&quot;&gt;저는 Windows 11에서 세벌식 자판을 사용하고 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;890&quot; data-start=&quot;803&quot; data-ke-size=&quot;size16&quot;&gt;입력기도 하나뿐이라, 애초에 이런 문제가 생길 이유가 없다고 생각했습니다.&lt;br /&gt;게다가 &lt;b&gt;Microsoft Office 2007은 설치한 적도 없습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;978&quot; data-start=&quot;892&quot; data-ke-size=&quot;size16&quot;&gt;그런데 어느 날 Windows 자동 업데이트 후 재부팅하고 나서부터, &lt;b&gt;Microsoft Office IME 2007&lt;/b&gt;이 갑자기 나타나기 시작했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;398&quot; data-origin-height=&quot;239&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbBhDf/dJMcafTOl9a/1mO7Kp33W4TjCkEuKmBVzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbBhDf/dJMcafTOl9a/1mO7Kp33W4TjCkEuKmBVzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbBhDf/dJMcafTOl9a/1mO7Kp33W4TjCkEuKmBVzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbBhDf%2FdJMcafTOl9a%2F1mO7Kp33W4TjCkEuKmBVzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;398&quot; height=&quot;239&quot; data-origin-width=&quot;398&quot; data-origin-height=&quot;239&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;1152&quot; data-start=&quot;980&quot; data-ke-size=&quot;size16&quot;&gt;시스템 트레이에 입력기 UI도 추가되어 버렸고, 웹 브라우저 주소창이든 메신저 입력창이든 가리지 않고 &lt;b&gt;완전 랜덤하게&lt;/b&gt;, &lt;b&gt;지멋대로&lt;/b&gt;, &lt;b&gt;왕짜증나게&lt;/b&gt; IME 2007로 자동 전환되곤 했습니다.&lt;br /&gt;그리고 그 입력기의 기본 설정인 두벌식으로 바뀌면서, 제가 쓰던 세벌식 입력을 계속 방해했습니다.&lt;/p&gt;
&lt;p data-end=&quot;1268&quot; data-start=&quot;1154&quot; data-ke-size=&quot;size16&quot;&gt;물론 기존에 사용하던 입력기를 다시 선택하면 세벌식을 다시 쓸 수는 있었습니다.&lt;br /&gt;하지만 문제는 &lt;b&gt;입력할 때마다 다시 입력기를 바꿔야 한다는 점&lt;/b&gt;이었습니다.&lt;br /&gt;이게 계속 반복되니 정말 짜증났습니다.&lt;/p&gt;
&lt;p data-end=&quot;1421&quot; data-start=&quot;1270&quot; data-ke-size=&quot;size16&quot;&gt;제가 Office 2007을 설치한 적도 없고, 프로그램 추가/삭제 목록에도 없고, 언어 설정에도 제대로 보이지 않다 보니, 솔직히 &lt;b&gt;해킹당한 것 같은 느낌까지 들었습니다.&lt;/b&gt;&lt;br /&gt;정확한 원인은 알 수 없지만, 적어도 제 입장에서는 정상적인 상황으로 보이지 않았습니다.&lt;/p&gt;
&lt;p data-end=&quot;1536&quot; data-start=&quot;1423&quot; data-ke-size=&quot;size16&quot;&gt;한동안은 바뀔 때마다 백스페이스로 오타를 지우고, 다시 Windows 기본 입력기로 되돌리는 식으로 버티고 있었습니다.&lt;br /&gt;그러다가 오늘 다시 빡쳐서 설정을 뒤지다가, 제 경우 해결된 방법을 찾았습니다.&lt;/p&gt;
&lt;h2 data-end=&quot;1546&quot; data-start=&quot;1538&quot; data-ke-size=&quot;size26&quot;&gt;해결 방법&lt;/h2&gt;
&lt;p data-end=&quot;1561&quot; data-start=&quot;1548&quot; data-ke-size=&quot;size16&quot;&gt;경로는 아래와 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;877&quot; data-origin-height=&quot;795&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqZCSI/dJMcafM38RW/hnYBvoKi6g4RsE1lEfBeQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqZCSI/dJMcafM38RW/hnYBvoKi6g4RsE1lEfBeQk/img.png&quot; data-alt=&quot;윈도우11 IME 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqZCSI/dJMcafM38RW/hnYBvoKi6g4RsE1lEfBeQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqZCSI%2FdJMcafM38RW%2FhnYBvoKi6g4RsE1lEfBeQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;877&quot; height=&quot;795&quot; data-origin-width=&quot;877&quot; data-origin-height=&quot;795&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;윈도우11 IME 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;1611&quot; data-start=&quot;1563&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Windows 11 설정 &amp;gt; 시간 및 언어 &amp;gt; 언어 및 지역 &amp;gt; 한국어 &amp;gt; 옵션&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1634&quot; data-start=&quot;1613&quot; data-ke-size=&quot;size16&quot;&gt;여기서 저는 다음 순서로 처리했습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1789&quot; data-start=&quot;1636&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1658&quot; data-start=&quot;1636&quot;&gt;&lt;b&gt;키보드 추가&lt;/b&gt;를 누릅니다.&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;472&quot; data-origin-height=&quot;243&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Fhxbc/dJMcahc0t4n/yHGj7Kx5EA8hXh8FNMIF71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Fhxbc/dJMcahc0t4n/yHGj7Kx5EA8hXh8FNMIF71/img.png&quot; data-alt=&quot;키보드 추가를 누르면 나오는 팝업 메뉴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Fhxbc/dJMcahc0t4n/yHGj7Kx5EA8hXh8FNMIF71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFhxbc%2FdJMcahc0t4n%2FyHGj7Kx5EA8hXh8FNMIF71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;472&quot; height=&quot;243&quot; data-origin-width=&quot;472&quot; data-origin-height=&quot;243&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;키보드 추가를 누르면 나오는 팝업 메뉴&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1709&quot; data-start=&quot;1659&quot;&gt;목록에서 &lt;b&gt;Microsoft Office IME 2007&lt;/b&gt;을 직접 추가합니다.&lt;/li&gt;
&lt;li data-end=&quot;1731&quot; data-start=&quot;1710&quot;&gt;추가한 직후 바로 삭제합니다.&lt;/li&gt;
&lt;li data-end=&quot;1789&quot; data-start=&quot;1732&quot;&gt;삭제는 해당 항목 오른쪽 끝의 &lt;b&gt;... 메뉴&lt;/b&gt;를 누른 뒤 &lt;b&gt;제거&lt;/b&gt;를 선택하시면 됩니다.&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;858&quot; data-origin-height=&quot;117&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4TX9I/dJMcagd7jJc/Om7bMEDGApSAbyKJSeDkZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4TX9I/dJMcagd7jJc/Om7bMEDGApSAbyKJSeDkZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4TX9I/dJMcagd7jJc/Om7bMEDGApSAbyKJSeDkZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4TX9I%2FdJMcagd7jJc%2FOm7bMEDGApSAbyKJSeDkZk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;858&quot; height=&quot;117&quot; data-origin-width=&quot;858&quot; data-origin-height=&quot;117&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1813&quot; data-start=&quot;1791&quot; data-ke-size=&quot;size16&quot;&gt;제 경우에는 이 방법으로 해결되었습니다.&lt;/p&gt;
&lt;p data-end=&quot;1885&quot; data-start=&quot;1815&quot; data-ke-size=&quot;size16&quot;&gt;즉, 정체를 알 수 없이 끼어들던 IME 2007을 한 번 정식 목록 위로 끌어올린 뒤 바로 삭제하는 방식으로 끝낸 셈입니다.&lt;/p&gt;
&lt;p data-end=&quot;2038&quot; data-start=&quot;1887&quot; data-ke-size=&quot;size16&quot;&gt;머릿속으로는 이 장면이 영화 &lt;b&gt;매트릭스&lt;/b&gt;처럼 느껴졌습니다.&lt;br /&gt;네오를 통해 스미스가 기계도시에 연결되자, 그제야 시스템이 스미스를 한꺼번에 삭제할 수 있었던 것처럼, 제 경우에도 IME 2007을 다시 정식 목록으로 끌어올린 뒤에야 제대로 삭제가 먹힌 느낌이었습니다.&lt;/p&gt;
&lt;p data-end=&quot;2066&quot; data-start=&quot;2040&quot; data-ke-size=&quot;size16&quot;&gt;같은 증상이라면 한 번 시도해보셔도 좋겠습니다.&lt;/p&gt;</description>
      <category>IT/System Digging</category>
      <category>Microsoft Office IME 2007</category>
      <category>windows11</category>
      <category>문제</category>
      <category>삭제</category>
      <category>오동작</category>
      <category>제거</category>
      <category>한글 입력기</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/396</guid>
      <comments>https://simryang.tistory.com/entry/Windows11-%EC%9C%A0%EB%A0%B9%EC%B2%98%EB%9F%BC-%EC%82%B4%EC%95%84%EB%82%9C-IME-2007%EC%9D%B4-%EB%82%B4-%EC%84%B8%EB%B2%8C%EC%8B%9D%EC%9D%84-%EC%9E%90%EA%BE%B8-%EB%91%90%EB%B2%8C%EC%8B%9D%EC%9C%BC%EB%A1%9C-%EB%B0%94%EA%BF%80-%EB%95%8C-%EC%B2%98%EB%8B%A8%ED%95%9C-%EB%B0%A9%EB%B2%95#entry396comment</comments>
      <pubDate>Thu, 16 Apr 2026 12:55:50 +0900</pubDate>
    </item>
    <item>
      <title>[프롬프트] 내가 너를 지금까지 어떻게 대해왔는지 그림으로 표현해봐</title>
      <link>https://simryang.tistory.com/entry/%ED%94%84%EB%A1%AC%ED%94%84%ED%8A%B8-%EB%82%B4%EA%B0%80-%EB%84%88%EB%A5%BC-%EC%A7%80%EA%B8%88%EA%B9%8C%EC%A7%80-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%8C%80%ED%95%B4%EC%99%94%EB%8A%94%EC%A7%80-%EA%B7%B8%EB%A6%BC%EC%9C%BC%EB%A1%9C-%ED%91%9C%ED%98%84%ED%95%B4%EB%B4%90</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;gpt 에게 프롬프트 질문을 던졌습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그동안 제가 대해오던 상황을 생각하면..&lt;br /&gt;&lt;a href=&quot;https://blog.naver.com/1000dmsrud/224157301510&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;1000dmsrud 님&lt;/a&gt;의 다음 그림이나..&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;357&quot; data-origin-height=&quot;523&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nfgN8/dJMcagSBmTC/CUq3KpgzDuoNYqkrjraCk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nfgN8/dJMcagSBmTC/CUq3KpgzDuoNYqkrjraCk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nfgN8/dJMcagSBmTC/CUq3KpgzDuoNYqkrjraCk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnfgN8%2FdJMcagSBmTC%2FCUq3KpgzDuoNYqkrjraCk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;357&quot; height=&quot;523&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;357&quot; data-origin-height=&quot;523&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 따지는 그림부터 떠올랐었는데..&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AYkxI/dJMcac3Hp5i/VdADaDFZqCT1fdiJ2k2UN0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AYkxI/dJMcac3Hp5i/VdADaDFZqCT1fdiJ2k2UN0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AYkxI/dJMcac3Hp5i/VdADaDFZqCT1fdiJ2k2UN0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAYkxI%2FdJMcac3Hp5i%2FVdADaDFZqCT1fdiJ2k2UN0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;1536&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1536&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;chatgpt-8f13f8ab-0ad2-426e-a426-7a45b71fc055.png&quot; data-origin-width=&quot;1315&quot; data-origin-height=&quot;1195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAtiFt/dJMcabX3yZ1/3wSRsR12Z4EKW4RJlEMGtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAtiFt/dJMcabX3yZ1/3wSRsR12Z4EKW4RJlEMGtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAtiFt/dJMcabX3yZ1/3wSRsR12Z4EKW4RJlEMGtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAtiFt%2FdJMcabX3yZ1%2F3wSRsR12Z4EKW4RJlEMGtK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1315&quot; height=&quot;1195&quot; data-filename=&quot;chatgpt-8f13f8ab-0ad2-426e-a426-7a45b71fc055.png&quot; data-origin-width=&quot;1315&quot; data-origin-height=&quot;1195&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>IT/AI</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/395</guid>
      <comments>https://simryang.tistory.com/entry/%ED%94%84%EB%A1%AC%ED%94%84%ED%8A%B8-%EB%82%B4%EA%B0%80-%EB%84%88%EB%A5%BC-%EC%A7%80%EA%B8%88%EA%B9%8C%EC%A7%80-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%8C%80%ED%95%B4%EC%99%94%EB%8A%94%EC%A7%80-%EA%B7%B8%EB%A6%BC%EC%9C%BC%EB%A1%9C-%ED%91%9C%ED%98%84%ED%95%B4%EB%B4%90#entry395comment</comments>
      <pubDate>Mon, 6 Apr 2026 20:30:31 +0900</pubDate>
    </item>
    <item>
      <title>&amp;lt;AI 게임 개발 with 코덱스&amp;gt; - 게임을 좋아하는 일반 개발자의 리뷰</title>
      <link>https://simryang.tistory.com/entry/AI-%EA%B2%8C%EC%9E%84-%EA%B0%9C%EB%B0%9C-with-%EC%BD%94%EB%8D%B1%EC%8A%A4-%EA%B2%8C%EC%9E%84%EC%9D%84-%EC%A2%8B%EC%95%84%ED%95%98%EB%8A%94-%EC%9D%BC%EB%B0%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EC%9D%98-%EB%A6%AC%EB%B7%B0</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; &quot;한빛미디어&amp;nbsp;서평단&amp;nbsp;&amp;lt;나는리뷰어다&amp;gt;&amp;nbsp;활동을&amp;nbsp;위해서&amp;nbsp;책을&amp;nbsp;협찬&amp;nbsp;받아&amp;nbsp;작성된&amp;nbsp;서평입니다.&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3월에 리뷰할 책은 &lt;b&gt;AI&amp;nbsp;게임&amp;nbsp;개발&amp;nbsp;with&amp;nbsp;코덱스&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;1007&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcRtF8/dJMcaibEIV1/JdVvf5kqIPDimGQ3Qkttk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcRtF8/dJMcaibEIV1/JdVvf5kqIPDimGQ3Qkttk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcRtF8/dJMcaibEIV1/JdVvf5kqIPDimGQ3Qkttk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcRtF8%2FdJMcaibEIV1%2FJdVvf5kqIPDimGQ3Qkttk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1007&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;1007&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2월에 소개한 &amp;lt;&lt;a title=&quot;2026년 2월 소개 책&quot; href=&quot;https://simryang.tistory.com/entry/%EB%82%98%EB%8A%94-%EB%A6%AC%EB%B7%B0%EC%96%B4%EB%8B%A4-%EC%86%8C%EB%AC%B8%EB%82%9C-%EB%AA%85%EA%B0%95%EC%9D%98-%EC%9C%A0%EB%A6%AC%EB%A7%81%EC%9D%98-%EC%8B%A4%EC%A0%84-%EA%B2%8C%EC%9E%84-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EA%B8%B0%ED%9A%8D&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;소문난 명강의 유리링의 실전 게임 시스템 기획&lt;/a&gt;&amp;gt; 의 저자 유리링 님께서 정윤지라는 본명으로 집필한 신간입니다.&lt;/p&gt;
&lt;p data-end=&quot;527&quot; data-start=&quot;329&quot; data-ke-size=&quot;size16&quot;&gt;전작이 게임 시스템을 어떻게 기획할 것인지에 집중했다면, 이번 책은 그 기획을 실제로 어떻게 구현해 나갈지까지 담고 있다는 점에서 더욱 반가웠습니다.&lt;/p&gt;
&lt;p data-end=&quot;527&quot; data-start=&quot;329&quot; data-ke-size=&quot;size16&quot;&gt;2026년 2월 9일에 출간된 따끈한 신간이기도 하고요.&lt;/p&gt;
&lt;p data-end=&quot;527&quot; data-start=&quot;329&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;682&quot; data-start=&quot;529&quot; data-ke-size=&quot;size16&quot;&gt;사실 저는 전작을 읽고 나서 꽤 만족하면서도 한편으로는 아쉬움이 남았습니다.&lt;br /&gt;기획을 구체적으로 세워보는 데에는 정말 큰 도움을 받았지만, &amp;ldquo;그래서 이걸 실제로 어떻게 만들지?&amp;rdquo;라는 갈증은 여전히 남아 있었거든요. 그런데 이번 책은 바로 그 지점을 시원하게 건드려 줍니다.&lt;/p&gt;
&lt;p data-end=&quot;682&quot; data-start=&quot;529&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;895&quot; data-start=&quot;684&quot; data-ke-size=&quot;size16&quot;&gt;아직 저는 책의 내용을 완전히 따라 실습해 본 단계는 아닙니다. 지금은 페이지를 따라가며 전체 흐름을 파악하고, 동시에 제 게임의 시스템 기획을 다듬고 있는 중입니다.&lt;/p&gt;
&lt;p data-end=&quot;895&quot; data-start=&quot;684&quot; data-ke-size=&quot;size16&quot;&gt;그런데도 벌써부터 느껴지는 게 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;895&quot; data-start=&quot;684&quot; data-ke-size=&quot;size16&quot;&gt;이 책은 단순히 &amp;ldquo;AI를 게임 개발에 활용할 수 있다&amp;rdquo;는 가능성을 보여주는 데서 멈추지 않고, 실제로 어떤 식으로 접근하고 구현해 나갈 수 있는지 구체적인 감을 줍니다.&lt;/p&gt;
&lt;p data-end=&quot;895&quot; data-start=&quot;684&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1038&quot; data-start=&quot;897&quot; data-ke-size=&quot;size16&quot;&gt;어쩌면 지금 제게는 그런 감각이 더 중요했던 것 같습니다.&lt;br /&gt;기획을 먼저 제대로 세우고 싶은 욕심 때문에 아직 실습까지는 못 들어갔지만, 오히려 그래서 더 기대가 커졌습니다. 기획을 마무리하면 곧바로 따라 해보고 싶다는 마음이 점점 커지고 있으니까요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전작보다 페이지 수가 좀 더 늘어났습니다. 472쪽으로 절대 작지 않은 분량입니다.&lt;/p&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;204&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UhSmn/dJMcaf62oaH/ZHpnBoVStj0vAsFQor7XJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UhSmn/dJMcaf62oaH/ZHpnBoVStj0vAsFQor7XJ1/img.png&quot; data-alt=&quot;부 단위 목차&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UhSmn/dJMcaf62oaH/ZHpnBoVStj0vAsFQor7XJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUhSmn%2FdJMcaf62oaH%2FZHpnBoVStj0vAsFQor7XJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;204&quot; height=&quot;429&quot; data-origin-width=&quot;204&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;부 단위 목차&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 몇 개 안되죠?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;235&quot; data-origin-height=&quot;169&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O7JQF/dJMcag5XZul/KhAWmBtdDG1CHKzRkZ8ypK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O7JQF/dJMcag5XZul/KhAWmBtdDG1CHKzRkZ8ypK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O7JQF/dJMcag5XZul/KhAWmBtdDG1CHKzRkZ8ypK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO7JQF%2FdJMcag5XZul%2FKhAWmBtdDG1CHKzRkZ8ypK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;235&quot; height=&quot;169&quot; data-origin-width=&quot;235&quot; data-origin-height=&quot;169&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;254&quot; data-origin-height=&quot;496&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCiTOr/dJMcafzehU0/FK9GT0eqUYUBCdtEAKIV5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCiTOr/dJMcafzehU0/FK9GT0eqUYUBCdtEAKIV5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCiTOr/dJMcafzehU0/FK9GT0eqUYUBCdtEAKIV5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCiTOr%2FdJMcafzehU0%2FFK9GT0eqUYUBCdtEAKIV5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;254&quot; height=&quot;496&quot; data-origin-width=&quot;254&quot; data-origin-height=&quot;496&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;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;기본 개념을 소개하는 1부와, 환경 구성하는 2부를 지나서 코덱스를 소개하는 3부에 도착하면서부터 양이 증가하기 시작합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;266&quot; data-origin-height=&quot;504&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKqTD4/dJMcacWL0T6/cuQHpE5dkxKKQk5YmW9Mvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKqTD4/dJMcacWL0T6/cuQHpE5dkxKKQk5YmW9Mvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKqTD4/dJMcacWL0T6/cuQHpE5dkxKKQk5YmW9Mvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKqTD4%2FdJMcacWL0T6%2FcuQHpE5dkxKKQk5YmW9Mvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;266&quot; height=&quot;504&quot; data-origin-width=&quot;266&quot; data-origin-height=&quot;504&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4부 부터는 완전 본격적입니다. 아래 보시면 9장 한장만 해도 다양한 내용이 꽉꽉 채워져 있는데요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;264&quot; data-origin-height=&quot;456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyu9Rj/dJMcacCu8i7/UkTo5vyE7ai6UnHSR2Zmkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyu9Rj/dJMcacCu8i7/UkTo5vyE7ai6UnHSR2Zmkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyu9Rj/dJMcacCu8i7/UkTo5vyE7ai6UnHSR2Zmkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcyu9Rj%2FdJMcacCu8i7%2FUkTo5vyE7ai6UnHSR2Zmkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;264&quot; height=&quot;456&quot; data-origin-width=&quot;264&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;이런 규모의 장들이 잔뜩 기다리고 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;254&quot; data-origin-height=&quot;557&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNr8lG/dJMcadnPf7t/ZWYGGMwH1Hczl3KvIgacGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNr8lG/dJMcadnPf7t/ZWYGGMwH1Hczl3KvIgacGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNr8lG/dJMcadnPf7t/ZWYGGMwH1Hczl3KvIgacGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNr8lG%2FdJMcadnPf7t%2FZWYGGMwH1Hczl3KvIgacGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;254&quot; height=&quot;557&quot; data-origin-width=&quot;254&quot; data-origin-height=&quot;557&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;252&quot; data-origin-height=&quot;86&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AGLYk/dJMcafzeh6k/S7nW8kuSFHAWOwDKJNHn8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AGLYk/dJMcafzeh6k/S7nW8kuSFHAWOwDKJNHn8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AGLYk/dJMcafzeh6k/S7nW8kuSFHAWOwDKJNHn8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAGLYk%2FdJMcafzeh6k%2FS7nW8kuSFHAWOwDKJNHn8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;252&quot; height=&quot;86&quot; data-origin-width=&quot;252&quot; data-origin-height=&quot;86&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5부에서는 여러분들이 관심이 가실만한 수익화와 관련한 내용도 다룹니다.(저만 관심있는 건 아니죠? :))&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;246&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsvTBP/dJMcahw2LZv/1J57t2e28wo7bOKpHoo1Ek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsvTBP/dJMcahw2LZv/1J57t2e28wo7bOKpHoo1Ek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsvTBP/dJMcahw2LZv/1J57t2e28wo7bOKpHoo1Ek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdsvTBP%2FdJMcahw2LZv%2F1J57t2e28wo7bOKpHoo1Ek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;246&quot; height=&quot;335&quot; data-origin-width=&quot;246&quot; data-origin-height=&quot;335&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분의 작업은 AI에게 명령을 내리는 프롬프트와,&lt;br /&gt;그 결과물을 실제로 유니티라는 도구를 사용해 게임에서 활용 가능한 형태로 가공해 가는 과정까지&lt;br /&gt;아낌없이 포함해서 다루고 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;849&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/losAf/dJMcabwNyZr/SAflKJNaiEMEJCgszlhlA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/losAf/dJMcabwNyZr/SAflKJNaiEMEJCgszlhlA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/losAf/dJMcabwNyZr/SAflKJNaiEMEJCgszlhlA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlosAf%2FdJMcabwNyZr%2FSAflKJNaiEMEJCgszlhlA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;599&quot; height=&quot;849&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;849&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;921&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wQXx5/dJMcabKnCIj/SQXVqeklj16kqCB6EKiDm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wQXx5/dJMcabKnCIj/SQXVqeklj16kqCB6EKiDm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wQXx5/dJMcabKnCIj/SQXVqeklj16kqCB6EKiDm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwQXx5%2FdJMcabKnCIj%2FSQXVqeklj16kqCB6EKiDm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;609&quot; height=&quot;921&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;921&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;1772&quot; data-start=&quot;1542&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1772&quot; data-start=&quot;1542&quot; data-ke-size=&quot;size16&quot;&gt;특히 인상적이었 부분은,&lt;br /&gt;그냥 &amp;ldquo;AI에게 이렇게 시키면 됩니다&amp;rdquo; 하고 끝나는 것이 아니라,&lt;/p&gt;
&lt;p data-end=&quot;1772&quot; data-start=&quot;1542&quot; data-ke-size=&quot;size16&quot;&gt;어떤 상황에서 어떤 식으로 프롬프트를 던질 수 있는지,&lt;/p&gt;
&lt;p data-end=&quot;1772&quot; data-start=&quot;1542&quot; data-ke-size=&quot;size16&quot;&gt;그리고 그렇게 나온 결과를 어떤 도구와 과정을 거쳐 실제 게임 리소스와 로직으로 연결해 갈 수 있는지를 차근차근 보여줍니다.&lt;/p&gt;
&lt;p data-end=&quot;1772&quot; data-start=&quot;1542&quot; data-ke-size=&quot;size16&quot;&gt;그래서 책을 읽다 보면 단순히 신기하다는 느낌에서 멈추지 않고, &amp;ldquo;이 정도면 나도 한번 해볼 수 있겠다&amp;rdquo;는 생각이 들게 됩니다.&lt;/p&gt;
&lt;p data-end=&quot;1772&quot; data-start=&quot;1542&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1989&quot; data-start=&quot;1774&quot; data-ke-size=&quot;size16&quot;&gt;저는 이 책을 아직 2독 정도 한 상태이고, 본격적인 실습은 시작하지 않았습니다.&lt;/p&gt;
&lt;p data-end=&quot;1989&quot; data-start=&quot;1774&quot; data-ke-size=&quot;size16&quot;&gt;그런데도 벌써 기대가 됩니다.&lt;/p&gt;
&lt;p data-end=&quot;1989&quot; data-start=&quot;1774&quot; data-ke-size=&quot;size16&quot;&gt;각 상황에 맞는 프롬프트와 그 결과물이 실제 게임 리소스와 로직으로 이어지는 흐름이 비교적 선명하게 보이기 때문입니다. 아직 따라 해보지 않았는데도 &amp;ldquo;나도 한번 해볼 수 있겠다&amp;rdquo;는 마음이 들었다는 점에서, 이 책은 읽는 단계에서부터 꽤 강한 동기 부여를 주는 책이었습니다.&lt;/p&gt;
&lt;p data-end=&quot;1989&quot; data-start=&quot;1774&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2244&quot; data-start=&quot;1991&quot; data-ke-size=&quot;size16&quot;&gt;보통은 직접 손을 움직여 보고, 시행착오도 겪어봐야 감이 오고 자신감이 붙기 마련인데, 이 책은 그 전에 먼저 &amp;ldquo;시작할 수 있겠다&amp;rdquo;는 마음을 만들어 줍니다. 막연하게만 느껴졌던 AI 활용이 조금 더 구체적인 흐름으로 다가오고, 그래서 아직 실습 전인데도 괜히 해보고 싶어지고, 왠지 할 수 있을 것 같은 기분이 듭니다. 지금의 저처럼 기획 단계에 오래 머물러 있는 사람에게는 이런 감각이 꽤 소중하게 느껴졌습니다.&lt;/p&gt;
&lt;p data-end=&quot;2244&quot; data-start=&quot;1991&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2513&quot; data-start=&quot;2246&quot; data-ke-size=&quot;size16&quot;&gt;물론 &lt;b&gt;C/C++&lt;/b&gt;, &lt;b&gt;C#&lt;/b&gt;, &lt;b&gt;Unity&lt;/b&gt; 기반으로 이미 익숙하게 개발하고 계신 현업 게임 개발자분들에게는 익숙한 내용도 분명 있을 것입니다.&lt;br /&gt;하지만 저처럼 머릿속의 아이디어를 먼저 기획으로 구체화하고, 그다음 AI의 도움을 받아 실제 구현으로 넘어가 보고 싶은 사람에게는 꽤 흥미롭고 자극이 되는 책이라고 느껴졌습니다. 전작이 &amp;ldquo;무엇을 만들 것인가&amp;rdquo;를 더 선명하게 해줬다면, 이번 책은 &amp;ldquo;그걸 어떻게 만들어 갈 것인가&amp;rdquo;를 훨씬 가깝게 느끼게 해주는 책입니다.&lt;/p&gt;
&lt;p data-end=&quot;2513&quot; data-start=&quot;2246&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2734&quot; data-start=&quot;2515&quot; data-ke-size=&quot;size16&quot;&gt;그리고 이 책의 매력은 꼭 &amp;ldquo;게임 개발을 오래 해온 사람&amp;rdquo;만을 향하고 있지 않다는 점에도 있다고 생각합니다.&lt;br /&gt;오히려 게임 개발 자체는 잘 모르더라도, AI를 이용해서 뭔가를 직접 만들어 보고 싶은 사람이라면 꽤 재미있게 읽을 수 있습니다. &amp;ldquo;내가 전문 개발자는 아닌데, AI랑 같이 뚝딱뚝딱 뭔가 만들어 볼 수 있을까?&amp;rdquo; 하는 마음이 있는 사람에게 이 책은 꽤 좋은 출발점이 되어 줍니다.&lt;/p&gt;
&lt;p data-end=&quot;2734&quot; data-start=&quot;2515&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2927&quot; data-start=&quot;2736&quot; data-ke-size=&quot;size16&quot;&gt;특히 막연히 AI를 신기한 도구처럼 바라보는 데서 끝나는 것이 아니라, 실제 결과물을 만들기 위해서는 어떤 흐름으로 접근해야 하는지, 무엇을 준비해야 하고 어떤 식으로 활용할 수 있는지를 구체적으로 상상하게 해준다는 점이 좋았습니다. 단순히 읽고 끝나는 책이 아니라, 읽다 보면 자꾸 &amp;ldquo;나도 한번 해보고 싶다&amp;rdquo;는 생각이 드는 책이라고 할까요.&lt;/p&gt;
&lt;p data-end=&quot;3063&quot; data-start=&quot;2929&quot; data-ke-size=&quot;size16&quot;&gt;저 역시 아직 첫 게임을 제대로 만들어 보고 싶은 욕심 때문에 기획에 시간을 많이 쓰고 있지만, 그래서 더더욱 이 책이 반갑게 느껴졌습니다. 기획으로만 머물러 있던 생각들이 실제 구현의 단계로 넘어갈 수 있다는 가능성을 보여주기 때문입니다.&lt;/p&gt;
&lt;p data-end=&quot;3254&quot; data-start=&quot;3065&quot; data-ke-size=&quot;size16&quot;&gt;게임 개발 지식이 아주 깊지 않아도 괜찮습니다.&lt;/p&gt;
&lt;p data-end=&quot;3254&quot; data-start=&quot;3065&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;AI를 이용해서 무언가를 빠르게 만들어 보고 싶고, 아이디어를 실제 형태로 옮기는 경험을 해보고 싶은 분이라면 이 책을 재미있게 읽으실 수 있을 것 같습니다. 특히 &amp;ldquo;게임 개발은 잘 모르지만, AI를 이용해서 뚝딱 뭔가 만들어 보고 싶다&amp;rdquo;는 마음이 있는 분들에게 추천하고 싶은 책입니다.&lt;/p&gt;
&lt;p data-end=&quot;3254&quot; data-start=&quot;3065&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3254&quot; data-start=&quot;3065&quot; data-ke-size=&quot;size16&quot;&gt;여기까지 흥분해서 잔뜩 써내려갔는데, 저나 여러분이나 별다를바 없다는 거 아시죠?&lt;/p&gt;
&lt;p data-end=&quot;3254&quot; data-start=&quot;3065&quot; data-ke-size=&quot;size16&quot;&gt;저도 게임 개발은 백지입니다! 백지!&lt;/p&gt;
&lt;p data-end=&quot;3254&quot; data-start=&quot;3065&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3254&quot; data-start=&quot;3065&quot; data-ke-size=&quot;size16&quot;&gt;전국의 겜도리 여러분들!&lt;/p&gt;
&lt;p data-end=&quot;3254&quot; data-start=&quot;3065&quot; data-ke-size=&quot;size16&quot;&gt;추억의 게임이 있는데 다시 구하기 힘든 분들!&lt;/p&gt;
&lt;p data-end=&quot;3254&quot; data-start=&quot;3065&quot; data-ke-size=&quot;size16&quot;&gt;군대 얘기 반복하듯이 추억만 쪼물딱하지 말고 우리도 한 번 도전해 봅시다!&lt;/p&gt;
&lt;p data-end=&quot;3254&quot; data-start=&quot;3065&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3254&quot; data-start=&quot;3065&quot; data-ke-size=&quot;size16&quot;&gt;같이 만들어가며 경험 나눌 수 있으면 좋겠습니다.&lt;/p&gt;</description>
      <category>리뷰/나는 리뷰어다(2026)</category>
      <category>AI 게임 개발 with 코덱스</category>
      <category>나는리뷰어다</category>
      <category>정 안되면 클로드로 비벼보자!</category>
      <category>한빛미디어</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/394</guid>
      <comments>https://simryang.tistory.com/entry/AI-%EA%B2%8C%EC%9E%84-%EA%B0%9C%EB%B0%9C-with-%EC%BD%94%EB%8D%B1%EC%8A%A4-%EA%B2%8C%EC%9E%84%EC%9D%84-%EC%A2%8B%EC%95%84%ED%95%98%EB%8A%94-%EC%9D%BC%EB%B0%98-%EA%B0%9C%EB%B0%9C%EC%9E%90%EC%9D%98-%EB%A6%AC%EB%B7%B0#entry394comment</comments>
      <pubDate>Tue, 24 Mar 2026 23:16:53 +0900</pubDate>
    </item>
    <item>
      <title>Ubuntu에서 Claude Code CLI OAuth 401/400 인증 오류 해결 방법</title>
      <link>https://simryang.tistory.com/entry/Ubuntu%EC%97%90%EC%84%9C-Claude-Code-CLI-OAuth-401400-%EC%9D%B8%EC%A6%9D-%EC%98%A4%EB%A5%98-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95</link>
      <description>&lt;p data-end=&quot;3320&quot; data-start=&quot;3075&quot; data-ke-size=&quot;size16&quot;&gt;잘 되던 Claude Code CLI가 갑자기 Please run /login, 401 Unauthorized, OAuth error 400을 띄운다면, 재설치부터 하지 마시고 &lt;b&gt;/login 재인증 &amp;rarr; .claude 백업 &amp;rarr; 필요 시 재설치&lt;/b&gt; 순서로 복구해보시기 바랍니다.&lt;br /&gt;특히 Ubuntu에서는 설치 경로에 따라 명령어가 달라지므로, which claude로 설치 위치를 먼저 확인하시면 훨씬 덜 헷갈립니다.&lt;/p&gt;
&lt;p data-end=&quot;3390&quot; data-start=&quot;3322&quot; data-ke-size=&quot;size16&quot;&gt;Claude Code CLI에서 아래 오류가 나오면, 대부분 인증 토큰이 만료되었거나 로컬 인증 정보가 충돌한 상태입니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1774319347548&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;Please run /login &amp;middot; API Error: 401 {&quot;type&quot;:&quot;error&quot;,&quot;error&quot;:{&quot;type&quot;:&quot;authentication_error&quot;,&quot;message&quot;:&quot;OAuth token has expired...&quot;}}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1774319380590&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;OAuth error: Request failed with status code 400&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;3618&quot; data-start=&quot;3598&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3618&quot; data-start=&quot;3598&quot; data-ke-size=&quot;size16&quot;&gt;가장 먼저 Claude를 실행합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1774319395564&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;claude&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3675&quot; data-start=&quot;3640&quot; data-ke-size=&quot;size16&quot;&gt;그 다음 Claude 내부에서 아래 명령으로 다시 로그인합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1774319424774&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;/login&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3809&quot; data-start=&quot;3697&quot; data-ke-size=&quot;size16&quot;&gt;/login은 쉘 명령이 아니라 &lt;b&gt;Claude 내부 명령&lt;/b&gt;입니다.&lt;br /&gt;즉, claude /login이 아니라 claude 실행 후 Claude 안에서 /login을 입력하셔야 합니다.&lt;/p&gt;
&lt;p data-end=&quot;3861&quot; data-start=&quot;3811&quot; data-ke-size=&quot;size16&quot;&gt;이 방법으로 해결되지 않으면 .claude 폴더를 바로 삭제하지 말고 먼저 백업합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1774319439464&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mv ~/.claude ~/.claude.backup&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3920&quot; data-start=&quot;3906&quot; data-ke-size=&quot;size16&quot;&gt;그 다음 다시 실행합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;claude&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1774319455912&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;claude&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3963&quot; data-start=&quot;3942&quot; data-ke-size=&quot;size16&quot;&gt;Claude 안에서 다시 로그인합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1774328693601&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/login&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;4010&quot; data-start=&quot;3985&quot; data-ke-size=&quot;size16&quot;&gt;그래도 문제가 남으면 설치 경로를 확인합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1774328710722&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;which claude&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;4100&quot; data-start=&quot;4038&quot; data-ke-size=&quot;size16&quot;&gt;/usr/local/bin/claude, /usr/bin/claude라면 보통 sudo 를 이용해서 전역 설치를 한 케이스입니다.&lt;/p&gt;
&lt;p data-end=&quot;4100&quot; data-start=&quot;4038&quot; data-ke-size=&quot;size16&quot;&gt;아래 명령으로 기존 설치본을 삭제하고 다시 설치합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1774328728290&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo npm uninstall -g @anthropic-ai/claude-code
sudo npm install -g @anthropic-ai/claude-code&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;4252&quot; data-start=&quot;4209&quot; data-ke-size=&quot;size16&quot;&gt;.nvm, .npm-global 경로라면 보통 일반 사용자 권한으로 설치한 케이스입니다.&lt;/p&gt;
&lt;p data-end=&quot;4252&quot; data-start=&quot;4209&quot; data-ke-size=&quot;size16&quot;&gt;아래 명령으로 기존 설치본을 삭제하고 다시 설치합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1774328774827&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm uninstall -g @anthropic-ai/claude-code
npm install -g @anthropic-ai/claude-code&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;4366&quot; data-start=&quot;4351&quot; data-ke-size=&quot;size16&quot;&gt;재설치 후 다시 실행합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1774328809221&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;claude&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;4413&quot; data-start=&quot;4388&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;4413&quot; data-start=&quot;4388&quot; data-ke-size=&quot;size16&quot;&gt;그리고 Claude 안에서 다시 로그인합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1774334206002&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/login&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;4453&quot; data-start=&quot;4435&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;4453&quot; data-start=&quot;4435&quot; data-ke-size=&quot;size16&quot;&gt;정리하면 순서는 아래와 같습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;4617&quot; data-start=&quot;4455&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;4471&quot; data-start=&quot;4455&quot; data-section-id=&quot;1ndbeod&quot;&gt;claude 실행&lt;/li&gt;
&lt;li data-end=&quot;4496&quot; data-start=&quot;4472&quot; data-section-id=&quot;17e4enf&quot;&gt;Claude 안에서 /login&lt;/li&gt;
&lt;li data-end=&quot;4538&quot; data-start=&quot;4497&quot; data-section-id=&quot;1krrzvr&quot;&gt;안 되면 mv ~/.claude ~/.claude.backup&lt;/li&gt;
&lt;li data-end=&quot;4569&quot; data-start=&quot;4539&quot; data-section-id=&quot;1o10ri0&quot;&gt;다시 claude 실행 후 /login&lt;/li&gt;
&lt;li data-end=&quot;4617&quot; data-start=&quot;4570&quot; data-section-id=&quot;riz9qi&quot;&gt;그래도 안 되면 which claude 확인 후 설치 방식에 맞게 재설치&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>IT/AI</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/393</guid>
      <comments>https://simryang.tistory.com/entry/Ubuntu%EC%97%90%EC%84%9C-Claude-Code-CLI-OAuth-401400-%EC%9D%B8%EC%A6%9D-%EC%98%A4%EB%A5%98-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95#entry393comment</comments>
      <pubDate>Tue, 24 Mar 2026 15:37:12 +0900</pubDate>
    </item>
    <item>
      <title>&amp;lt;소문난 명강의 유리링의 실전 게임 시스템 기획&amp;gt; - 게임을 좋아하는 일반 개발자의 리뷰</title>
      <link>https://simryang.tistory.com/entry/%EB%82%98%EB%8A%94-%EB%A6%AC%EB%B7%B0%EC%96%B4%EB%8B%A4-%EC%86%8C%EB%AC%B8%EB%82%9C-%EB%AA%85%EA%B0%95%EC%9D%98-%EC%9C%A0%EB%A6%AC%EB%A7%81%EC%9D%98-%EC%8B%A4%EC%A0%84-%EA%B2%8C%EC%9E%84-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EA%B8%B0%ED%9A%8D</link>
      <description>&lt;h4 style=&quot;color: #000000; text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;한빛미디어&amp;nbsp;서평단&amp;nbsp;&amp;lt;나는리뷰어다&amp;gt;&amp;nbsp;활동을&amp;nbsp;위해서&amp;nbsp;책을&amp;nbsp;협찬&amp;nbsp;받아&amp;nbsp;작성된&amp;nbsp;서평입니다.&quot;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 리뷰어다 서평단에 처음으로 선정되어 글을 남기게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #020617; text-align: start;&quot;&gt;서평단에 선정되고 서평을 남기고 싶은 책 2개를 선정하면 그 중에 1개가 랜덤하게 선택된다고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #020617; text-align: start;&quot;&gt;제게 전달된 책을 부족한 글솜씨지만 리뷰를 남기려 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2월에 리뷰할 책은 &lt;span style=&quot;background-color: #ffffff; color: #020617; text-align: start;&quot;&gt;&lt;b&gt;소문난 명강의 유리링의 실전 게임 시스템 기획&lt;/b&gt; 이라는 책입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;734&quot; data-origin-height=&quot;783&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crypBe/dJMcahcgnWs/J93UKxxnkp4yeIl95CumDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crypBe/dJMcahcgnWs/J93UKxxnkp4yeIl95CumDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crypBe/dJMcahcgnWs/J93UKxxnkp4yeIl95CumDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrypBe%2FdJMcahcgnWs%2FJ93UKxxnkp4yeIl95CumDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;734&quot; height=&quot;783&quot; data-origin-width=&quot;734&quot; data-origin-height=&quot;783&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;span style=&quot;background-color: #ffffff; color: #020617; text-align: start;&quot;&gt;2026년 1월에 출간된 따끈따끈한 책입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #020617; text-align: start;&quot;&gt;유리링이란 베테랑 기획자인 저자의 책으로, 게임 제작 쪽은 해보지 못한 제게는 뭔가 설렘을 가져다 준 책입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #020617; text-align: start;&quot;&gt;게임을 좋아해서 세계관을 생각해보기도 하고 게임을 해보다가 재미를 유발하는 시스템을 보면 글로 남겨보기도 하곤 했었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #020617; text-align: start;&quot;&gt;AI 가 왠만한 프로그램을 다 만들어준다는 요즘 시대에 게임을 만들어보고 싶어도 그 결과물에 실망해서 도전하다 포기하고 도전하다 포기하던 일이 부지기수였기에, 이 책은 뭔가 시작할 수 있을 것 같은 설렘을 주었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #020617; text-align: start;&quot;&gt;368쪽이라는 분량에 비해 소제목 분량이 엄청 깁니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #020617; text-align: start;&quot;&gt;8개의 파트와 21개 장으로 이뤄져 있어 상당히 많은 부분을 저자가 전달하려고 했음이 느껴집니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1770909119388&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PART 01 게임 시스템 기획 개론
PART 02 기획 의도 설계
PART 03 시스템 구조화
PART 04 규칙 설계
PART 05 데이터 테이블 설계
PART 06 UX/UI 설계
PART 07 시스템 기획서 작성
PART 08 시스템 기획자의 실무&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;&lt;span style=&quot;background-color: #ffffff; color: #020617; text-align: start;&quot;&gt;보통 게임 시스템 하면 게임 유저 입장에서 어떤 방식으로 성장하면 좋겠다, 이러 이러한 스킬들이 있으면 좋겠어, 현질은 좀 적당히 와 같은 추상적이고 내가 원하는 방향만 생각하지, 실제 기획이라고 하면 너무 대충이거나 서너 가지 생각하다가 이어보려고 하니 너무 복잡하고 어렵게 느껴지게 되고 포기하게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #020617; text-align: start;&quot;&gt;이 책의 좋은 점은 관심이 있는 사람에게 좀 더 붙잡을 수 있는 기획의 살을 붙여 나갈 수 있는 흐름을 잘 제시해 주고 있다는 점입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #020617; text-align: start;&quot;&gt;게임 프로그래밍의 ㄱ 자도 모르는 저만 해도 세계관도 대충 만들어보고, 몇몇 캐릭터, 몇몇 시스템, 몇몇 아이템 등을 소소하게 생각해보고, 이를 바탕으로 상상의 나래는 펼쳐봤지만, 막상 진짜 제대로 해볼까 하면 너무 막막해서 노트 쪼가리만 대충 모아놓기 일수였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #020617; text-align: start;&quot;&gt;이 책에서는 스토리, 기획 의도, 방향성을 반복해서 강조합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어떤 문제를 해결하려고 이런 내용을 기획하는가?&lt;/li&gt;
&lt;li&gt;어떤 이야기/플레이 흐름을 유도하는 장치로 쓰려고 하는가?&lt;/li&gt;
&lt;li&gt;남이 하니까 나도 넣는게 아니고, 내 세계관/흐름에서는 이게 왜 필요한가?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #020617;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;이런 부분이 인상깊었습니다. 이를 바탕으로 이런 느낌이면 좋겠다 하는 것을 정하고, 어떻게 작동할 것인가로 발전시키는 부분은 오히려 당연하게 여겨졌고, 뭘/어디서부터/어떻게 적용해야 하는지의 막막함이 많이 줄었습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이와 연결되는 각 기능에 대한 기획 의도를 고민하게 하는 내용도 타당성 있게 이어지고 공감이 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템의 구성에서는 막연하게 생각하던 게임 프로그래밍의 구조를 대략적이나마 맛볼 수 있어서 더욱 특별했던 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기획한 각 기능들이 어떻게 유기적으로 연결되고, 지지해주고 보완하고, 마무리하는 지를 알기 쉽게 구조화 해준 내용들이 앞에서 생각한 내용들을 이렇게 코드화 할 수 있겠구나 하는 통찰을 주었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;209&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NGxYj/dJMcahXE33J/GS4XI0ACoJvsJ3IprtPae1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NGxYj/dJMcahXE33J/GS4XI0ACoJvsJ3IprtPae1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NGxYj/dJMcahXE33J/GS4XI0ACoJvsJ3IprtPae1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNGxYj%2FdJMcahXE33J%2FGS4XI0ACoJvsJ3IprtPae1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;본문 중 시스템 간 상호 작용 흐름&quot; loading=&quot;lazy&quot; width=&quot;678&quot; height=&quot;209&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;209&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;UX/UI 부분에 대해서는 공감이 가면서도 목마름을 완전히 해결해 주지는 못해서 아쉬웠습니다. 다만, 이 책의 본질이 '시스템' 기획이라는 것을 생각해보면 좀 과한 욕심일 수도 있겠죠 :)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cl7CMH/dJMcabpDmIL/ycDRL2XhKR6hkZKkuUsTk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cl7CMH/dJMcabpDmIL/ycDRL2XhKR6hkZKkuUsTk1/img.png&quot; data-alt=&quot;14장 UX/UI 내용 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cl7CMH/dJMcabpDmIL/ycDRL2XhKR6hkZKkuUsTk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcl7CMH%2FdJMcabpDmIL%2FycDRL2XhKR6hkZKkuUsTk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;630&quot; height=&quot;514&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;14장 UX/UI 내용 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 책을 보고 나름의 시스템을 구현해 보고 싶은 욕구와 용기가 많이 생겼습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;767&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xtzMi/dJMcah4qGLM/1YoZQyT5RLxIVAGH4HvJfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xtzMi/dJMcah4qGLM/1YoZQyT5RLxIVAGH4HvJfk/img.png&quot; data-alt=&quot;20 장 디자인부터 런치까지, 시스템 기획의 여정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xtzMi/dJMcah4qGLM/1YoZQyT5RLxIVAGH4HvJfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxtzMi%2FdJMcah4qGLM%2F1YoZQyT5RLxIVAGH4HvJfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;678&quot; height=&quot;767&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;767&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;20 장 디자인부터 런치까지, 시스템 기획의 여정&lt;/figcaption&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;개인적으로 아쉬웠던 점은 이 책은 게임 시스템 기획이긴 하지만 개인적으로는&lt;span&gt;&amp;nbsp;&lt;/span&gt;유닛과 맵, 대단위 처리, 맵 / 스토리 에디터, 세이브 파일 관리와 보안 등등의 요소들도 기대했는데 없어서 많이 아쉬웠네요. 이 또한 책의 범위를 좀 넘어가는 욕심이긴 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 구성이 나름 탄탄하고 기획에 대해서 궁금하거나 어렵다고만 생각했던 게임 시스템 기획 입문자들에게 어느 정도 목마름을 해소할 수 있는 좋은 책이라고 생각합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요새 AI 도구들도 많이 나왔으니 게임 시스템의 뼈대와 흐름을 이 책을 보면서 잘 정리해서, 그 결과물과 함께 AI 와 열일하다 보면 각자 나만의 특색있는 게임이 많이 나오리라 기대해 보면서 글을 마칩니다.&lt;/p&gt;</description>
      <category>리뷰/나는 리뷰어다(2026)</category>
      <category>나는리뷰어다</category>
      <category>유리링의 실전 게임 시스템 기획</category>
      <category>한빛미디어</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/392</guid>
      <comments>https://simryang.tistory.com/entry/%EB%82%98%EB%8A%94-%EB%A6%AC%EB%B7%B0%EC%96%B4%EB%8B%A4-%EC%86%8C%EB%AC%B8%EB%82%9C-%EB%AA%85%EA%B0%95%EC%9D%98-%EC%9C%A0%EB%A6%AC%EB%A7%81%EC%9D%98-%EC%8B%A4%EC%A0%84-%EA%B2%8C%EC%9E%84-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EA%B8%B0%ED%9A%8D#entry392comment</comments>
      <pubDate>Sat, 14 Feb 2026 16:52:51 +0900</pubDate>
    </item>
    <item>
      <title>[펌글] tistory 에 mermaid 그래프 적용</title>
      <link>https://simryang.tistory.com/entry/%ED%8E%8C%EA%B8%80-tistory-%EC%97%90-mermaid-%EA%B7%B8%EB%9E%98%ED%94%84-%EC%A0%81%EC%9A%A9</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://choewy.tistory.com/155&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://choewy.tistory.com/155&lt;/a&gt;&lt;/p&gt;</description>
      <category>퍼온 글</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/391</guid>
      <comments>https://simryang.tistory.com/entry/%ED%8E%8C%EA%B8%80-tistory-%EC%97%90-mermaid-%EA%B7%B8%EB%9E%98%ED%94%84-%EC%A0%81%EC%9A%A9#entry391comment</comments>
      <pubDate>Fri, 6 Feb 2026 10:46:20 +0900</pubDate>
    </item>
    <item>
      <title>Git 특정 폴더 이력 제거하기 (Ubuntu 20.04, Git 2.25.1 기준): docs/ 폴더를 모든 커밋에서 완전히 삭제 (filter-repo / filter-branch)</title>
      <link>https://simryang.tistory.com/entry/Git-%ED%8A%B9%EC%A0%95-%ED%8F%B4%EB%8D%94-%EC%9D%B4%EB%A0%A5-%EC%A0%9C%EA%B1%B0%ED%95%98%EA%B8%B0-Ubuntu-2004-Git-2251-%EA%B8%B0%EC%A4%80-docs-%ED%8F%B4%EB%8D%94%EB%A5%BC-%EB%AA%A8%EB%93%A0-%EC%BB%A4%EB%B0%8B%EC%97%90%EC%84%9C-%EC%99%84%EC%A0%84%ED%9E%88-%EC%82%AD%EC%A0%9C-filter-repo-filter-branch</link>
      <description>&lt;p&gt;Ubuntu 20.04(Git 2.25.1) 환경에서 git filter-repo가 인식되지 않을 때, Git 업그레이드(ppa:git-core/ppa)와 git-filter-repo 설치(pip), 그리고 docs 폴더를 모든 커밋 히스토리에서 제거하는 방법(filter-repo / filter-branch)을 단계별로 정리했습니다.&lt;/p&gt;
&lt;p&gt;Ubuntu 20.04 Desktop에서 git filter-repo를 쓰려고 했더니 git: &amp;#39;filter-repo&amp;#39; is not a git command가 뜨고, Git 버전은 2.25.1.&lt;br&gt;이 조합, 생각보다 흔합니다. 그리고 해결 순서가 정해져 있어요.&lt;/p&gt;
&lt;p&gt;이 글은 &lt;strong&gt;Ubuntu 20.04 + Git 2.25.1&lt;/strong&gt;이라는 제약을 전제로, docs/ 같은 특정 폴더를 &lt;strong&gt;전체 히스토리에서 제거&lt;/strong&gt;하는 과정을 &lt;strong&gt;한 번에&lt;/strong&gt; 정리합니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;요약&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;docs/ 폴더를 “과거 커밋 포함” 완전히 삭제하려면 &lt;strong&gt;히스토리 재작성&lt;/strong&gt;이 필요합니다.&lt;/li&gt;
&lt;li&gt;git filter-repo는 Git 내장 명령이 아니라 &lt;strong&gt;별도 도구&lt;/strong&gt;입니다.&lt;/li&gt;
&lt;li&gt;그리고 최신 git-filter-repo는 **Git 2.36+**를 요구합니다. Ubuntu 20.04 기본 Git 2.25.1과 충돌합니다.&lt;/li&gt;
&lt;li&gt;해결은 2가지:&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Git 업그레이드(권장)&lt;/strong&gt; → filter-repo 사용&lt;/li&gt;
&lt;li&gt;업그레이드가 어렵다면 → filter-branch로 처리(레거시지만 가능)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;0) 현재 상태 확인 (Ubuntu 20.04 기본값부터 체크)&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git --version
python3 --version&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ubuntu 20.04 기본 저장소의 Git은 보통 2.25.1입니다.&lt;br&gt;이 상태에서 최신 git-filter-repo를 설치해도 요구 Git 버전 때문에 막힐 수 있습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;1) 권장 루트: Git을 최신으로 올리고 filter-repo 사용하기&lt;/h1&gt;
&lt;h2&gt;1-1. Ubuntu에서 최신 Git 설치 (git-core PPA)&lt;/h2&gt;
&lt;p&gt;Ubuntu에서 최신 안정 Git을 받는 대표적인 방법이 ppa:git-core/ppa입니다.&lt;/p&gt;
&lt;p&gt;sudo add-apt-repository ppa:git-core/ppa sudo apt update sudo apt install git git --version&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;목표: &lt;strong&gt;Git 2.36+&lt;/strong&gt;&lt;br&gt;git-filter-repo가 최신 기준으로 Git 2.36 이상을 요구합니다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr&gt;
&lt;h2&gt;1-2. git filter-repo 설치 (Ubuntu 20.04에서는 pip가 제일 무난)&lt;/h2&gt;
&lt;p&gt;Ask Ubuntu 쪽에서도 Ubuntu에서 설치를 pip3로 안내하는 답변이 흔합니다.&lt;/p&gt;
&lt;p&gt;python3 -m pip install --user git-filter-repo&lt;/p&gt;
&lt;p&gt;설치 후 PATH 문제로 “명령이 없다”가 또 뜰 수 있으니 확인합니다:&lt;/p&gt;
&lt;p&gt;which git-filter-repo git-filter-repo --help git filter-repo --help&lt;/p&gt;
&lt;p&gt;git-filter-repo는 “단일 파이썬 스크립트를 PATH에 두면 된다”는 방식으로 설계돼 있습니다.&lt;/p&gt;
&lt;h3&gt;(자주 막히는) PATH 잡기: ~/.local/bin&lt;/h3&gt;
&lt;p&gt;--user 설치면 보통 여기에 들어갑니다:&lt;/p&gt;
&lt;p&gt;echo &amp;#39;export PATH=&amp;quot;$HOME/.local/bin:$PATH&amp;quot;&amp;#39; &amp;gt;&amp;gt; ~/.bashrc source ~/.bashrc&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;1-3. 이제 진짜 작업: docs/ 폴더를 히스토리에서 제거&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;아래는 &lt;strong&gt;폴더 통째 제거&lt;/strong&gt; 기준입니다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;pre&gt;&lt;code&gt;git filter-repo --path docs/ --invert-paths --force&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;--path docs/ : 대상 경로 지정&lt;/li&gt;
&lt;li&gt;--invert-paths : 그 경로만 제외하고 나머지 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;1-4. 검증 (이거 안 하면 나중에 또 울게 됨)&lt;/h2&gt;
&lt;h3&gt;로그 기준 확인&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git log --all -- ./docs&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;객체 기준 확인(더 확실)&lt;/h3&gt;
&lt;p&gt;git rev-list --objects --all | grep -n &amp;quot;docs/&amp;quot;&lt;/p&gt;
&lt;p&gt;아무것도 안 나오면 “과거 포함 삭제”가 맞게 된 겁니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;1-5. 원격 반영 (강제 푸시)&lt;/h2&gt;
&lt;p&gt;히스토리가 바뀌었으니 강제 푸시가 필요합니다.&lt;/p&gt;
&lt;p&gt;git push origin --force --all git push origin --force --tags&lt;/p&gt;
&lt;h3&gt;협업 저장소면 팀원 대응&lt;/h3&gt;
&lt;p&gt;팀원들은 보통 &lt;strong&gt;재클론&lt;/strong&gt;이 제일 안전합니다.&lt;br&gt;재클론이 어렵다면:&lt;/p&gt;
&lt;p&gt;git fetch --all git reset --hard origin/main&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;2) 대안 루트: Git 업그레이드가 어렵다면 filter-branch로 처리&lt;/h1&gt;
&lt;p&gt;공식 문서에서도 filter-branch는 함정이 많아 권장하지 않는다고 경고합니다.&lt;br&gt;그래도 “지금 당장” 해야 하면, Ubuntu 20.04의 Git 2.25.1에서도 돌아가는 방법입니다.&lt;/p&gt;
&lt;h2&gt;2-1. filter-branch로 docs/ 제거&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git filter-branch -f --index-filter \ &amp;quot;git rm --cached --ignore-unmatch -r ./docs&amp;quot; \ --prune-empty -- --all&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;2-2. 후처리 (안 하면 찝찝하게 남습니다)&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now --aggressive&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;gitGraph
  commit id:&amp;quot;A&amp;quot;
  commit id:&amp;quot;B&amp;quot;
  branch feature
  checkout feature
  commit id:&amp;quot;C (docs/ 추가)&amp;quot;
  checkout main
  commit id:&amp;quot;D&amp;quot;
  merge feature id:&amp;quot;E (merge)&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2-3. 검증 + 강제 푸시&lt;/h2&gt;
&lt;p&gt;검증은 위와 동일:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git log --all -- ./docs git rev-list --objects --all | grep -n &amp;quot;docs/&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;푸시:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git push origin --force --all
git push origin --force --tags&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h1&gt;3) 자주 묻는 질문 (FAQ)&lt;/h1&gt;
&lt;h2&gt;Q1. .gitignore에 docs/ 넣으면 과거도 사라지나요?&lt;/h2&gt;
&lt;p&gt;아니요. .gitignore는 “앞으로 추적하지 않기”일 뿐이고, 과거 커밋은 그대로 남습니다.&lt;/p&gt;
&lt;h2&gt;Q2. 민감 정보가 들어있던 경우는요?&lt;/h2&gt;
&lt;p&gt;히스토리에서 지우는 건 “추가 노출 최소화”고, 이미 노출됐을 가능성이 있으면 **키/토큰 폐기 및 재발급(rotate)**이 우선입니다.&lt;/p&gt;
&lt;h2&gt;Q3. git filter-repo는 왜 Git 명령처럼 보이나요?&lt;/h2&gt;
&lt;p&gt;Git은 PATH에 git-xxx 실행 파일이 있으면 git xxx 형태로 호출합니다. 그래서 git-filter-repo가 PATH에 있으면 git filter-repo가 되는 구조입니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;결론&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ubuntu 20.04 + Git 2.25.1&lt;/strong&gt;이면, filter-repo가 안 보이는 건 정상에 가깝습니다.&lt;/li&gt;
&lt;li&gt;가장 깔끔한 해결은:&lt;ul&gt;
&lt;li&gt;git-core/ppa로 Git을 올리고&lt;/li&gt;
&lt;li&gt;pip로 git-filter-repo 설치 후(PATH 확인)&lt;/li&gt;
&lt;li&gt;docs/를 filter-repo로 제거&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;업그레이드가 어렵다면 filter-branch로도 처리 가능하지만, 후처리/검증은 꼭 하세요.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>IT/etc</category>
      <category>git 2.25.1</category>
      <category>git filter-branch</category>
      <category>git filter-repo</category>
      <category>git 커밋 기록 삭제</category>
      <category>git 특정 폴더 이력 삭제</category>
      <category>git 히스토리 삭제</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/390</guid>
      <comments>https://simryang.tistory.com/entry/Git-%ED%8A%B9%EC%A0%95-%ED%8F%B4%EB%8D%94-%EC%9D%B4%EB%A0%A5-%EC%A0%9C%EA%B1%B0%ED%95%98%EA%B8%B0-Ubuntu-2004-Git-2251-%EA%B8%B0%EC%A4%80-docs-%ED%8F%B4%EB%8D%94%EB%A5%BC-%EB%AA%A8%EB%93%A0-%EC%BB%A4%EB%B0%8B%EC%97%90%EC%84%9C-%EC%99%84%EC%A0%84%ED%9E%88-%EC%82%AD%EC%A0%9C-filter-repo-filter-branch#entry390comment</comments>
      <pubDate>Fri, 6 Feb 2026 10:32:54 +0900</pubDate>
    </item>
    <item>
      <title>Edge에서 URL 붙여넣기했는데 주소 대신 페이지 제목이 나올 때</title>
      <link>https://simryang.tistory.com/entry/Edge%EC%97%90%EC%84%9C-URL-%EB%B6%99%EC%97%AC%EB%84%A3%EA%B8%B0%ED%96%88%EB%8A%94%EB%8D%B0-%EC%A3%BC%EC%86%8C-%EB%8C%80%EC%8B%A0-%ED%8E%98%EC%9D%B4%EC%A7%80-%EC%A0%9C%EB%AA%A9%EC%9D%B4-%EB%82%98%EC%98%AC-%EB%95%8C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Edge 브라우저에서 URL을 복사해 붙여넣었을 때&lt;br /&gt;주소(https://...) 대신 웹페이지 제목이 나오는 문제가 있었습니다.&lt;br /&gt;관련 글은 이미 많았지만, 작성 시점이 달라 현재 Edge UI에서는 설정 위치를 찾기 어려워 정리해 둡니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2025-12-30 기준, UI가 달라도 설정을 찾는 방법 정리)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;191&quot; data-start=&quot;144&quot; data-ke-size=&quot;size23&quot;&gt;Q. Edge에서 URL을 붙여넣었는데 왜 주소 대신 페이지 제목이 나오나요?&lt;/h3&gt;
&lt;p data-end=&quot;306&quot; data-start=&quot;193&quot; data-ke-size=&quot;size16&quot;&gt;Edge에는 URL을 복사하거나 붙여넣을 때의 형식을 지정하는 설정이 있습니다.&lt;br /&gt;이 설정이 &lt;b&gt;&amp;ldquo;링크(페이지 제목)&amp;rdquo;&lt;/b&gt; 로 되어 있으면,&lt;br /&gt;URL 대신 웹페이지 제목과 링크 형태로 붙여넣어집니다.&lt;/p&gt;
&lt;hr data-end=&quot;311&quot; data-start=&quot;308&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;350&quot; data-start=&quot;313&quot; data-ke-size=&quot;size23&quot;&gt;Q. 예전에는 이런 문제가 없었는데 왜 갑자기 바뀐 건가요?&lt;/h3&gt;
&lt;p data-end=&quot;468&quot; data-start=&quot;352&quot; data-ke-size=&quot;size16&quot;&gt;Edge 업데이트 과정에서&lt;br /&gt;URL 복사 및 붙여넣기 관련 기본 설정이 변경되었을 가능성이 큽니다.&lt;br /&gt;또한 UI와 메뉴 구조가 자주 바뀌기 때문에&lt;br /&gt;기존 설정이 그대로여도 동작이 달라 보일 수 있습니다.&lt;/p&gt;
&lt;hr data-end=&quot;473&quot; data-start=&quot;470&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;518&quot; data-start=&quot;475&quot; data-ke-size=&quot;size23&quot;&gt;Q. 인터넷에 있는 해결 방법을 따라 했는데 설정을 찾을 수 없습니다.&lt;/h3&gt;
&lt;p data-end=&quot;584&quot; data-start=&quot;520&quot; data-ke-size=&quot;size16&quot;&gt;많은 글이 &lt;b&gt;예전 Edge UI 기준&lt;/b&gt;으로 작성되어&lt;br /&gt;현재 UI에서는 메뉴 이름이나 위치가 다를 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;653&quot; data-start=&quot;586&quot; data-ke-size=&quot;size16&quot;&gt;이 경우에는&lt;br /&gt;메뉴 경로를 따라가기보다는&lt;br /&gt;&lt;b&gt;Edge 설정 상단의 검색창을 사용하는 것이 가장 빠른 방법&lt;/b&gt;입니다.&lt;/p&gt;
&lt;hr data-end=&quot;658&quot; data-start=&quot;655&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;698&quot; data-start=&quot;660&quot; data-ke-size=&quot;size23&quot;&gt;Q. Edge에서 URL 붙여넣기 설정은 어디에서 변경하나요?&lt;/h3&gt;
&lt;p data-end=&quot;718&quot; data-start=&quot;700&quot; data-ke-size=&quot;size16&quot;&gt;다음 순서로 찾으실 수 있습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;830&quot; data-start=&quot;720&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;739&quot; data-start=&quot;720&quot;&gt;Edge 설정 화면을 엽니다.&lt;/li&gt;
&lt;li data-end=&quot;768&quot; data-start=&quot;740&quot;&gt;상단 설정 검색창에 url 을 입력합니다.&lt;/li&gt;
&lt;li data-end=&quot;802&quot; data-start=&quot;769&quot;&gt;&lt;b&gt;URL 복사 및 붙여넣기 형식&lt;/b&gt; 항목을 찾습니다.&lt;/li&gt;
&lt;li data-end=&quot;830&quot; data-start=&quot;803&quot;&gt;값을 &lt;b&gt;&amp;ldquo;일반 텍스트&amp;rdquo;&lt;/b&gt;&amp;nbsp; 로 변경합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;922&quot; data-origin-height=&quot;734&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rKMtx/dJMcah38Ani/blAhkiKZKeBg59KAEjS7AK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rKMtx/dJMcah38Ani/blAhkiKZKeBg59KAEjS7AK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rKMtx/dJMcah38Ani/blAhkiKZKeBg59KAEjS7AK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrKMtx%2FdJMcah38Ani%2FblAhkiKZKeBg59KAEjS7AK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;922&quot; height=&quot;734&quot; data-origin-width=&quot;922&quot; data-origin-height=&quot;734&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;858&quot; data-start=&quot;832&quot; data-ke-size=&quot;size16&quot;&gt;UI가 달라져도 이 방법은 동일하게 적용됩니다.&lt;/p&gt;
&lt;p data-end=&quot;858&quot; data-start=&quot;832&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;863&quot; data-start=&quot;860&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;897&quot; data-start=&quot;865&quot; data-ke-size=&quot;size23&quot;&gt;Q. Windows 11에서만 발생하는 문제인가요?&lt;/h3&gt;
&lt;p data-end=&quot;1008&quot; data-start=&quot;899&quot; data-ke-size=&quot;size16&quot;&gt;Windows 11 환경에서 Edge를 사용할 때 자주 언급되지만,&lt;br /&gt;운영체제보다는 &lt;b&gt;Edge 브라우저 설정 문제&lt;/b&gt;에 가깝습니다.&lt;br /&gt;다른 Windows 버전에서도 동일한 설정이 존재합니다.&lt;/p&gt;
&lt;hr data-end=&quot;1013&quot; data-start=&quot;1010&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1047&quot; data-start=&quot;1015&quot; data-ke-size=&quot;size23&quot;&gt;Q. 이 설정을 바꾸면 기존 기능에 문제는 없나요?&lt;/h3&gt;
&lt;p data-end=&quot;1158&quot; data-start=&quot;1049&quot; data-ke-size=&quot;size16&quot;&gt;URL을 &lt;b&gt;일반 텍스트&lt;/b&gt;로 붙여넣도록 변경해도&lt;br /&gt;브라우저 사용에는 문제가 없습니다.&lt;br /&gt;다만 페이지 제목 링크 형태의 붙여넣기를 선호하시는 경우에는&lt;br /&gt;다시 원래 설정으로 되돌리시면 됩니다.&lt;/p&gt;
&lt;hr data-end=&quot;1163&quot; data-start=&quot;1160&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1198&quot; data-start=&quot;1165&quot; data-ke-size=&quot;size23&quot;&gt;Q. UI가 또 바뀌면 다시 못 찾게 되지 않을까요?&lt;/h3&gt;
&lt;p data-end=&quot;1241&quot; data-start=&quot;1200&quot; data-ke-size=&quot;size16&quot;&gt;메뉴 위치는 바뀔 수 있지만&lt;br /&gt;설정 검색 기능은 비교적 오래 유지됩니다.&lt;/p&gt;
&lt;p data-end=&quot;1315&quot; data-start=&quot;1243&quot; data-ke-size=&quot;size16&quot;&gt;따라서&lt;br /&gt;&lt;b&gt;&amp;ldquo;URL&amp;rdquo;, &amp;ldquo;붙여넣기&amp;rdquo;, &amp;ldquo;링크&amp;rdquo;&lt;/b&gt; 같은 증상 기반 키워드로&lt;br /&gt;설정 검색을 사용하는 방식이 가장 안정적입니다.&lt;/p&gt;</description>
      <category>IT/web</category>
      <category>edge</category>
      <category>Edge 붙여넣기</category>
      <category>edge 설정</category>
      <category>Microsoft Edge</category>
      <category>URL 대신 제목</category>
      <category>URL 붙여넣기</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/389</guid>
      <comments>https://simryang.tistory.com/entry/Edge%EC%97%90%EC%84%9C-URL-%EB%B6%99%EC%97%AC%EB%84%A3%EA%B8%B0%ED%96%88%EB%8A%94%EB%8D%B0-%EC%A3%BC%EC%86%8C-%EB%8C%80%EC%8B%A0-%ED%8E%98%EC%9D%B4%EC%A7%80-%EC%A0%9C%EB%AA%A9%EC%9D%B4-%EB%82%98%EC%98%AC-%EB%95%8C#entry389comment</comments>
      <pubDate>Fri, 2 Jan 2026 00:05:35 +0900</pubDate>
    </item>
    <item>
      <title>Windows 11 + Ubuntu 환경에서 Barrier 연동하기(GDM 로그인 화면까지 포함한 자동 실행 구성)</title>
      <link>https://simryang.tistory.com/entry/Windows-11-Ubuntu-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-Barrier-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0GDM-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%ED%99%94%EB%A9%B4%EA%B9%8C%EC%A7%80-%ED%8F%AC%ED%95%A8%ED%95%9C-%EC%9E%90%EB%8F%99-%EC%8B%A4%ED%96%89-%EA%B5%AC%EC%84%B1</link>
      <description>&lt;h1&gt;문제 해결&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;환경 요약 (필수 조건)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ubuntu 20.04 LTS&lt;/li&gt;
&lt;li&gt;X11 사용 (&lt;b&gt;Wayland 비활성화 필수&lt;/b&gt;)&lt;/li&gt;
&lt;li&gt;GDM 사용&lt;/li&gt;
&lt;li&gt;Barrier 서버/클라이언트 &lt;b&gt;버전 완전 일치&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Ubuntu 측 Barrier는 &lt;b&gt;소스 빌드 사용&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Wayland 비활성화&lt;/h2&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;sudo nano /etc/gdm3/custom.conf&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;[daemon]
WaylandEnable=false&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;sudo reboot&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Barrier 버전 불일치 문제 해결&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Barrier는 서버와 클라이언트의 &lt;b&gt;빌드 버전이 다르면&lt;/b&gt; TLS 및 프로토콜 문제로 정상 동작하지 않습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Windows: 공식 릴리즈 사용&lt;/li&gt;
&lt;li&gt;Ubuntu: apt 패키지 사용 금지&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Ubuntu에서 Barrier 소스 빌드&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기존 패키지 제거&lt;/h3&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;sudo apt remove barrier
sudo apt autoremove&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;which barrierc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력이 없어야 정상입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;빌드 의존성 설치&lt;/h3&gt;
&lt;pre class=&quot;q&quot;&gt;&lt;code&gt;sudo apt install -y \
  cmake g++ libx11-dev libxtst-dev libssl-dev \
  libavahi-compat-libdnssd-dev qtbase5-dev git&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Barrier 빌드 및 설치&lt;/h3&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;git clone https://github.com/debauchee/barrier.git
cd barrier
git checkout v2.4.0   # Windows와 반드시 동일한 버전

mkdir build &amp;amp;&amp;amp; cd build
cmake ..
make -j$(nproc)
sudo make install&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 결과:&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;which barrierc
# /usr/bin/barrierc&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;공통 Barrier 설정&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;code&gt;/etc/default/barrier&lt;/code&gt;&lt;/h3&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;sudo tee /etc/default/barrier &amp;gt;/dev/null &amp;lt;&amp;lt;'EOF'
BARRIER_SERVER=&quot;victus.local:24800&quot;
BARRIER_NAME=&quot;srwiz&quot;

# Windows 설정과 반드시 일치
BARRIER_TLS=&quot;off&quot;

BARRIER_BASE_OPTS=( &quot;-f&quot; &quot;--no-tray&quot; &quot;--debug&quot; &quot;INFO&quot; )

if [ &quot;$BARRIER_TLS&quot; = &quot;on&quot; ]; then
  BARRIER_OPTS=( &quot;--enable-crypto&quot; &quot;${BARRIER_BASE_OPTS[@]}&quot; )
else
  BARRIER_OPTS=( &quot;--disable-crypto&quot; &quot;${BARRIER_BASE_OPTS[@]}&quot; )
fi
EOF&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;GDM 전용 Barrier 제어기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;code&gt;/usr/local/bin/barrier-gdmctl&lt;/code&gt;&lt;/h3&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;#!/usr/bin/env bash
set -euo pipefail
. /etc/default/barrier

PIDFILE=&quot;/run/barrier-gdm.pid&quot;
HANDLOG=&quot;/var/log/barrier-handoff.log&quot;

log(){ echo &quot;$(date -Is) [gdmctl] $*&quot; &amp;gt;&amp;gt; &quot;$HANDLOG&quot;; }

GDM_UID=&quot;$(id -u gdm)&quot;
XAUTH=&quot;/run/user/${GDM_UID}/gdm/Xauthority&quot;

case &quot;${1:-}&quot; in
  start)
    [ -r &quot;$XAUTH&quot; ] || exit 0
    start-stop-daemon --start --background \
      --pidfile &quot;$PIDFILE&quot; --make-pidfile \
      --chuid gdm \
      --startas /usr/bin/barrierc -- \
      &quot;${BARRIER_OPTS[@]}&quot; --name &quot;$BARRIER_NAME&quot; &quot;$BARRIER_SERVER&quot;
    ;;
  stop)
    start-stop-daemon --stop --pidfile &quot;$PIDFILE&quot; --oknodo || true
    ;;
esac&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;sudo chmod +x /usr/local/bin/barrier-gdmctl&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;사용자 세션용 Barrier 제어기 (최종본)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;code&gt;/usr/local/bin/barrier-userctl&lt;/code&gt;&lt;/h3&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;#!/usr/bin/env bash
set -euo pipefail
. /etc/default/barrier

PIDFILE=&quot;/run/barrier-user.pid&quot;
TARGETFILE=&quot;/run/barrier-user.target&quot;
HANDLOG=&quot;/var/log/barrier-handoff.log&quot;

log(){ echo &quot;$(date -Is) [userctl] $*&quot; &amp;gt;&amp;gt; &quot;$HANDLOG&quot;; }

pick_xauth(){
  local uid=&quot;$1&quot; user=&quot;$2&quot;
  for p in \
    &quot;/run/user/${uid}/gdm/Xauthority&quot; \
    &quot;/run/user/${uid}/Xauthority&quot; \
    &quot;/home/${user}/.Xauthority&quot;
  do
    [ -r &quot;$p&quot; ] &amp;amp;&amp;amp; echo &quot;$p&quot; &amp;amp;&amp;amp; return 0
  done
  return 1
}

case &quot;${1:-}&quot; in
  start)
    SID=&quot;$2&quot;
    USER=&quot;$(loginctl show-session &quot;$SID&quot; -p Name --value)&quot;
    UID=&quot;$(id -u &quot;$USER&quot;)&quot;

    XAUTH=&quot;$(pick_xauth &quot;$UID&quot; &quot;$USER&quot;)&quot; || exit 1

    echo &quot;$USER $UID&quot; &amp;gt; &quot;$TARGETFILE&quot;

    start-stop-daemon --start --background \
      --pidfile &quot;$PIDFILE&quot; --make-pidfile \
      --chuid &quot;$USER&quot; \
      --startas /usr/bin/barrierc -- \
      &quot;${BARRIER_OPTS[@]}&quot; --name &quot;$BARRIER_NAME&quot; &quot;$BARRIER_SERVER&quot;
    ;;
  stop)
    start-stop-daemon --stop --pidfile &quot;$PIDFILE&quot; --oknodo || true
    ;;
esac&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;sudo chmod +x /usr/local/bin/barrier-userctl&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;seat0 전이 오케스트레이터&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;code&gt;/usr/local/bin/barrier-seat0-handoff&lt;/code&gt;&lt;/h3&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;#!/usr/bin/env bash
set -euo pipefail

getv(){ loginctl &quot;$@&quot; --value 2&amp;gt;/dev/null || true; }

while true; do
  SID=&quot;$(getv show-seat seat0 -p ActiveSession)&quot;
  NAME=&quot;$(getv show-session &quot;$SID&quot; -p Name)&quot;

  if [ &quot;$NAME&quot; = &quot;gdm&quot; ]; then
    /usr/local/bin/barrier-userctl stop || true
    /usr/local/bin/barrier-gdmctl start || true
  else
    /usr/local/bin/barrier-gdmctl stop || true
    /usr/local/bin/barrier-userctl start &quot;$SID&quot; || true
  fi

  sleep 0.2
done&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;sudo chmod +x /usr/local/bin/barrier-seat0-handoff&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;systemd 서비스 등록&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;sudo tee /etc/systemd/system/barrier-seat0-handoff.service &amp;gt;/dev/null &amp;lt;&amp;lt;'EOF'
[Unit]
Description=Barrier seat0 handoff orchestrator
After=systemd-logind.service

[Service]
ExecStart=/usr/local/bin/barrier-seat0-handoff
Restart=always
RestartSec=1

[Install]
WantedBy=multi-user.target
EOF&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;sudo systemctl daemon-reload
sudo systemctl enable --now barrier-seat0-handoff&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결과&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로그인 화면(GDM)에서도 키보드/마우스 입력 가능&lt;/li&gt;
&lt;li&gt;로그인 후 사용자 데스크톱으로 자동 전이&lt;/li&gt;
&lt;li&gt;Barrier 중복 실행 없음&lt;/li&gt;
&lt;li&gt;재부팅 후에도 자동 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;h1&gt;삽질기&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;mdash; (진짜) 원인 추적: TLS 옵션 붕괴 &amp;rarr; X 세션/인증/표시(Display) 이해 &amp;rarr; seat0 핸드오프 자동화&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목표:&lt;/b&gt; Windows 11을 Barrier 서버로, Ubuntu 20.04를 클라이언트로 사용할 때&lt;br /&gt;&lt;b&gt;로그인 화면(GDM)부터 데스크톱까지&lt;/b&gt; 키보드/마우스 입력이 끊기지 않게 만들기.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;0. 이번 사건의 진짜 발화점: &amp;ldquo;패키지 업데이트가 TLS 세계선을 갈라버렸다&amp;rdquo;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 글이 &amp;ldquo;로그인 화면에서 barrierc가 안 떠서&amp;rdquo;라고 시작하는데, 이번 건은 그게 &lt;b&gt;시작이 아니라 결과&lt;/b&gt;였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 시작은 이거였다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ubuntu 쪽 Barrier가 &lt;b&gt;패키지 업데이트로 버전이 바뀜&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;그 과정에서 &lt;b&gt;TLS(암호화) 기본/호환 범위가 달라짐&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;기존에 &amp;ldquo;인증서 + TLS&amp;rdquo;로 잘 쓰던 환경이 &lt;b&gt;갑자기 깨짐&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;급한 마음에 Windows 서버를 최신화했더니, 이번엔 Ubuntu 쪽이 더 엉킴&lt;/li&gt;
&lt;li&gt;결국 &amp;ldquo;일단 살아야 한다&amp;rdquo; 모드로 &lt;b&gt;TLS를 끄고(--disable-crypto)&lt;/b&gt; 문제를 우회하면서,&lt;br /&gt;로그인 화면/데스크톱 세션 분리 문제까지 한 번에 터져서 일이 커졌다&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;0-1. 로그로 확인: wrong version number는 &amp;ldquo;대화 프로토콜이 안 맞는다&amp;rdquo; 신호다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 (RPi5 클라이언트 로그):&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;[2025-12-29T17:09:52] INFO: OpenSSL 3.0.17 1 Jul 2025
[2025-12-29T17:09:52] ERROR: ssl error occurred (generic failure)
[2025-12-29T17:09:52] ERROR: error:0A00010B:SSL routines::wrong version number
[2025-12-29T17:09:52] ERROR: failed to connect secure socket&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 에러는 대체로 아래 중 하나다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;클라이언트는 TLS로 붙는데 서버는 평문(비-TLS)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;서버는 TLS인데 &lt;b&gt;클라이언트가 평문&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;둘 다 TLS인데 &lt;b&gt;TLS 버전/옵션/인증서 인자&lt;/b&gt;가 서로 안 맞음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 &amp;ldquo;네트워크 불량&amp;rdquo;이 아니라 &lt;b&gt;옵션 불일치&lt;/b&gt; 가능성이 매우 크다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리: 서버/클라 둘 중 하나라도 --enable-crypto/--disable-crypto 상태가 다르면&lt;br /&gt;꽤 높은 확률로 wrong version number 같은 형태로 터진다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;0-2. 우선순위: &amp;ldquo;TLS는 일치&amp;rdquo;, &amp;ldquo;버전도 가능한 일치&amp;rdquo;, &amp;ldquo;인증서 옵션은 도움말로 검증&amp;rdquo;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 사람들을 괴롭히는 포인트가 하나 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Barrier 계열은 버전/빌드 옵션에 따라 &lt;b&gt;TLS 관련 플래그/인자 이름이 달라질 수 있다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;그래서 &amp;ldquo;블로그 글에 있는 인증서 인자&amp;rdquo;를 그대로 복붙하면 더 망한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그래서 이 순서로 간다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) &lt;b&gt;서버(Windows)와 클라이언트(리눅스) 모두에서 TLS on/off를 먼저 맞춘다.&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;당장 살려야 하면 둘 다 off로 맞추고(= --disable-crypto) 동작을 확보한 다음,&lt;/li&gt;
&lt;li&gt;이후에 둘 다 on(= --enable-crypto)로 올려서 인증서 옵션을 맞춘다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) &lt;b&gt;각 머신에서 실제로 지원하는 TLS 관련 옵션을 &amp;ldquo;명령 도움말로 확인&amp;rdquo;한다.&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;gherkin&quot;&gt;&lt;code&gt;barrierc --help | egrep -i &quot;crypto|tls|cert|ssl&quot; || true
barriers  --help | egrep -i &quot;crypto|tls|cert|ssl&quot; || true   # 서버 바이너리가 있다면&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) &lt;b&gt;버전도 확인한다.&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;barrierc --version || true
# Windows 서버도 About/버전 표시로 확인&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론: &amp;ldquo;TLS를 켠 상태로 인증서를 쓰고 싶다&amp;rdquo;는 욕망은 정당하지만,&lt;br /&gt;&lt;b&gt;일단 옵션/버전 일치부터&lt;/b&gt; 안 맞추면 그 다음은 전부 삽질이다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;0-3. (중요) sudo make install의 설치 경로: &amp;ldquo;/usr/bin 고정&amp;rdquo;이 아니다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 또 흔한 함정.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어떤 사람은 &amp;ldquo;make install 하면 /usr/bin에 설치된다&amp;rdquo;고 말한다.&lt;/li&gt;
&lt;li&gt;현실은: &lt;b&gt;프로젝트의 build 시스템과 prefix 설정에 따라 다르다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로는 다음 중 하나로 들어간다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;/usr/local/bin (기본값인 경우가 많음)&lt;/li&gt;
&lt;li&gt;/usr/bin (패키지/빌드 옵션에서 prefix를 /usr로 준 경우)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 결론은 단 하나:&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;command -v barrierc
ls -l &quot;$(command -v barrierc)&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;내가 실행하는 barrierc가 누구냐&amp;rdquo;를 확인하지 않고 버전/TLS를 논하면, 그건 그냥 도박이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. (RPi5 포함) 클라이언트 systemd 자동 실행에서 TLS 불일치가 터지는 패턴&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RPi5는 Ubuntu PC와 달리 &amp;ldquo;로그인 화면 vs 데스크톱 handoff&amp;rdquo; 같은 복잡도가 덜하지만,&lt;br /&gt;TLS 불일치는 똑같이 터진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;질문에 주신 RPi5 클라이언트 서비스 예시는 이런 형태였다:&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;[Unit]
Description=Barrier Client for RPi5
After=graphical-session.target lightdm.service
Requires=graphical-session.target lightdm.service

[Service]
Type=simple
ExecStart=/bin/bash -c &quot;if [ -n &quot;$DISPLAY&quot; ]; then sleep 5 &amp;amp;&amp;amp; DISPLAY=:0 exec /usr/bin/barrierc -f --name RPwiznet999 --debug DEBUG --log /home/pi/barrier.log victus.local; else echo &quot;$(date) - barrierc: no display&quot; &amp;gt;&amp;gt; /home/pi/barrier.log; exit 0; fi&quot;
Restart=on-failure
RestartSec=30
Environment=&quot;DISPLAY=:0&quot;

[Install]
WantedBy=graphical-session.target&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 &amp;ldquo;동작한다&amp;rdquo;는 건 좋다. 그런데 여기서 중요한 교훈이 하나 생긴다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;서버가 TLS(인증서 포함)로 동작 중인데&lt;/b&gt;, 클라이언트가 평문으로 붙으면 &amp;rarr; wrong version number&lt;/li&gt;
&lt;li&gt;반대로 &lt;b&gt;서버가 평문인데&lt;/b&gt;, 클라이언트가 TLS로 붙으면 &amp;rarr; 똑같이 터진다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 RPi5든 Ubuntu든 &lt;b&gt;TLS 모드는 반드시 서버와 맞춰야 한다.&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버가 TLS off라면: 클라이언트에도 --disable-crypto(또는 해당 빌드의 동등 옵션)&lt;/li&gt;
&lt;li&gt;서버가 TLS on이라면: 클라이언트에도 --enable-crypto + (그 빌드가 요구하는 인증서 옵션)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인증서 옵션은 Barrier 버전/빌드에 따라 달라질 수 있으니,&lt;br /&gt;&lt;b&gt;반드시 barrierc --help로 확인하고&lt;/b&gt; 적용하는 게 정석이다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 문제가 &amp;ldquo;로그인 화면부터 입력이 안 넘어옴&amp;rdquo;으로 번지는 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TLS 문제를 (임시로라도) 정리하고 나면, 이제 진짜 리눅스가 사람을 패는 구간이 나온다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로그인 화면(GDM)&lt;/li&gt;
&lt;li&gt;데스크톱 세션(사용자)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;겉으로는 화면이 이어져 보이지만, Barrier 관점에서는 &lt;b&gt;완전히 다른 세계&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문서의 나머지는 이걸 풀어낸다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Wayland vs X11&lt;/b&gt;: 왜 Barrier가 Wayland에서 막히는지 (그리고 왜 X11로 강제해야 하는지)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;X 인증(Xauthority)&lt;/b&gt;: 왜 .Xauthority가 없고 /run/user/.../gdm/Xauthority가 튀어나오는지&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DISPLAY&lt;/b&gt;: 왜 :0을 박아두면 &amp;ldquo;보이지 않는 화면&amp;rdquo;에 입력을 꽂는지&lt;/li&gt;
&lt;li&gt;&lt;b&gt;seat0 / ActiveSession&lt;/b&gt;: GDM &amp;rarr; user 전이를 &amp;ldquo;감&amp;rdquo;이 아니라 &amp;ldquo;신호&amp;rdquo;로 잡는 방법&lt;/li&gt;
&lt;li&gt;&lt;b&gt;handoff 데몬&lt;/b&gt;: &amp;ldquo;둘 다 뜨면 망한다&amp;rdquo;를 운영 가능한 방식으로 막는 구조&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;309&quot; data-start=&quot;286&quot; data-ke-size=&quot;size26&quot;&gt;9. DISPLAY=:0 관습의 붕괴&lt;/h2&gt;
&lt;p data-end=&quot;327&quot; data-start=&quot;311&quot; data-ke-size=&quot;size16&quot;&gt;여기서 많은 삽질이 시작됐다.&lt;/p&gt;
&lt;p data-end=&quot;350&quot; data-start=&quot;329&quot; data-ke-size=&quot;size16&quot;&gt;우리는 너무 당연하게 이렇게 생각한다.&lt;/p&gt;
&lt;blockquote data-end=&quot;378&quot; data-start=&quot;352&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;378&quot; data-start=&quot;354&quot; data-ke-size=&quot;size16&quot;&gt;DISPLAY=:0 = 내가 보고 있는 화면&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;411&quot; data-start=&quot;380&quot; data-ke-size=&quot;size16&quot;&gt;그래서 스크립트에도, 서비스에도, 습관처럼 이걸 박는다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;export&lt;/span&gt;&lt;/span&gt;&lt;span&gt; DISPLAY=:0 &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;465&quot; data-start=&quot;444&quot; data-ke-size=&quot;size16&quot;&gt;그런데 실제로 확인해보면 전혀 다르다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;DISPLAY=:0 xset q &lt;/span&gt;&lt;span&gt;&lt;span&gt;# 실패&lt;/span&gt;&lt;/span&gt;&lt;span&gt; DISPLAY=:1 xset q &lt;/span&gt;&lt;span&gt;&lt;span&gt;# 성공&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;561&quot; data-start=&quot;530&quot; data-ke-size=&quot;size16&quot;&gt;이게 설정 실수일까?&lt;br /&gt;아니다. &lt;b&gt;이게 정상이다.&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-end=&quot;581&quot; data-start=&quot;563&quot; data-ke-size=&quot;size23&quot;&gt;DISPLAY의 진짜 의미&lt;/h3&gt;
&lt;p data-end=&quot;648&quot; data-start=&quot;583&quot; data-ke-size=&quot;size16&quot;&gt;DISPLAY는 &amp;ldquo;현재 화면&amp;rdquo;이 아니다.&lt;br /&gt;X11에서 DISPLAY는 &lt;b&gt;X 서버 인스턴스를 가리키는 식별자&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-end=&quot;671&quot; data-start=&quot;650&quot; data-ke-size=&quot;size16&quot;&gt;실제로는 아래 소켓과 1:1 대응된다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;/tmp/.X11-unix/X0 &amp;rarr; DISPLAY=:0 /tmp/.X11-unix/X1 &amp;rarr; DISPLAY=:1 &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;752&quot; data-start=&quot;750&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;821&quot; data-start=&quot;754&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;787&quot; data-start=&quot;754&quot;&gt;DISPLAY=:0&lt;br /&gt;&amp;rarr; &amp;ldquo;X0 소켓에 연결하겠다&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;821&quot; data-start=&quot;788&quot;&gt;DISPLAY=:1&lt;br /&gt;&amp;rarr; &amp;ldquo;X1 소켓에 연결하겠다&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;837&quot; data-start=&quot;823&quot; data-ke-size=&quot;size16&quot;&gt;여기서 중요한 사실 하나.&lt;/p&gt;
&lt;blockquote data-end=&quot;871&quot; data-start=&quot;839&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;871&quot; data-start=&quot;841&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;어떤 X 서버가 :0이 될지는 보장되지 않는다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-end=&quot;891&quot; data-start=&quot;873&quot; data-ke-size=&quot;size23&quot;&gt;GDM 환경에서 실제 구조&lt;/h3&gt;
&lt;p data-end=&quot;922&quot; data-start=&quot;893&quot; data-ke-size=&quot;size16&quot;&gt;Ubuntu + GDM 환경에서는 보통 이렇게 된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;987&quot; data-start=&quot;924&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;950&quot; data-start=&quot;924&quot;&gt;GDM 로그인 화면&lt;br /&gt;&amp;rarr; Xorg :0&lt;/li&gt;
&lt;li data-end=&quot;987&quot; data-start=&quot;951&quot;&gt;로그인 후 사용자 세션&lt;br /&gt;&amp;rarr; Xorg :1 (혹은 :2)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1042&quot; data-start=&quot;989&quot; data-ke-size=&quot;size16&quot;&gt;즉, 로그인 화면과 바탕화면은 &lt;b&gt;같은 화면처럼 보일 뿐&lt;/b&gt;,&lt;br /&gt;&lt;b&gt;서로 다른 X 서버&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-end=&quot;1048&quot; data-start=&quot;1044&quot; data-ke-size=&quot;size16&quot;&gt;그래서:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1092&quot; data-start=&quot;1050&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1069&quot; data-start=&quot;1050&quot;&gt;GDM에서만 되는 DISPLAY&lt;/li&gt;
&lt;li data-end=&quot;1092&quot; data-start=&quot;1070&quot;&gt;사용자 세션에서만 되는 DISPLAY&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1101&quot; data-start=&quot;1094&quot; data-ke-size=&quot;size16&quot;&gt;가 갈라진다.&lt;/p&gt;
&lt;p data-end=&quot;1160&quot; data-start=&quot;1103&quot; data-ke-size=&quot;size16&quot;&gt;이 상태에서 DISPLAY=:0을 하드코딩하면,&lt;br /&gt;&lt;b&gt;절반의 시간은 반드시 틀린 값을 쓰게 된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1171&quot; data-start=&quot;1162&quot; data-ke-size=&quot;size16&quot;&gt;결론은 단순하다.&lt;/p&gt;
&lt;blockquote data-end=&quot;1231&quot; data-start=&quot;1173&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1231&quot; data-start=&quot;1175&quot; data-ke-size=&quot;size16&quot;&gt;DISPLAY는 고정값이 아니다.&lt;br /&gt;&lt;b&gt;직접 확인해서 살아 있는 DISPLAY를 써야 한다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;1295&quot; data-start=&quot;1233&quot; data-ke-size=&quot;size16&quot;&gt;그래서 이 글의 최종 구성에서는&lt;br /&gt;xset q가 실제로 성공하는 DISPLAY를 &lt;b&gt;동적으로 탐색&lt;/b&gt;한다.&lt;/p&gt;
&lt;br /&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;308&quot; data-start=&quot;256&quot; data-ke-size=&quot;size26&quot;&gt;10. Wayland vs X11: 왜 Barrier는 Wayland에서 작동하지 않는가&lt;/h2&gt;
&lt;p data-end=&quot;336&quot; data-start=&quot;310&quot; data-ke-size=&quot;size16&quot;&gt;여기까지 읽었다면 자연스럽게 이런 의문이 든다.&lt;/p&gt;
&lt;blockquote data-end=&quot;367&quot; data-start=&quot;338&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;367&quot; data-start=&quot;340&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그래서 Wayland 끄라고 한 이유가 뭐냐?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;397&quot; data-start=&quot;369&quot; data-ke-size=&quot;size16&quot;&gt;이건 취향도, 꼰대도 아니다. &lt;b&gt;구조 문제&lt;/b&gt;다.&lt;/p&gt;
&lt;h3 data-end=&quot;429&quot; data-start=&quot;399&quot; data-ke-size=&quot;size23&quot;&gt;10.1 X11에서 Barrier가 가능한 이유&lt;/h3&gt;
&lt;p data-end=&quot;454&quot; data-start=&quot;431&quot; data-ke-size=&quot;size16&quot;&gt;Barrier는 본질적으로 이 일을 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;492&quot; data-start=&quot;456&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;470&quot; data-start=&quot;456&quot;&gt;네트워크로 받은 입력을&lt;/li&gt;
&lt;li data-end=&quot;492&quot; data-start=&quot;471&quot;&gt;&lt;b&gt;로컬 디스플레이 서버에 주입&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;509&quot; data-start=&quot;494&quot; data-ke-size=&quot;size16&quot;&gt;X11에서는 이게 가능하다.&lt;/p&gt;
&lt;p data-end=&quot;520&quot; data-start=&quot;511&quot; data-ke-size=&quot;size16&quot;&gt;이유는 단순하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;610&quot; data-start=&quot;522&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;553&quot; data-start=&quot;522&quot;&gt;X 서버는 &lt;b&gt;외부 클라이언트의 입력 주입을 허용&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;578&quot; data-start=&quot;554&quot;&gt;인증만 통과하면(Xauthority)&lt;/li&gt;
&lt;li data-end=&quot;610&quot; data-start=&quot;579&quot;&gt;다른 프로세스가 키보드/마우스 이벤트를 넣을 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;661&quot; data-start=&quot;612&quot; data-ke-size=&quot;size16&quot;&gt;그래서 Barrier, Synergy, xdotool 같은 것들이 전부 X11 기반이다.&lt;/p&gt;
&lt;h3 data-end=&quot;690&quot; data-start=&quot;663&quot; data-ke-size=&quot;size23&quot;&gt;10.2 Wayland에서는 왜 안 되는가&lt;/h3&gt;
&lt;p data-end=&quot;710&quot; data-start=&quot;692&quot; data-ke-size=&quot;size16&quot;&gt;Wayland는 철학부터 다르다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;783&quot; data-start=&quot;712&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;730&quot; data-start=&quot;712&quot;&gt;입력은 &lt;b&gt;컴포지터가 독점&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;764&quot; data-start=&quot;731&quot;&gt;외부 프로세스가 임의로 입력을 주입하는 구조 자체를 막음&lt;/li&gt;
&lt;li data-end=&quot;783&quot; data-start=&quot;765&quot;&gt;보안 관점에서 &amp;ldquo;당연한 선택&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;787&quot; data-start=&quot;785&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;835&quot; data-start=&quot;789&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;801&quot; data-start=&quot;789&quot;&gt;Wayland에서는&lt;/li&gt;
&lt;li data-end=&quot;835&quot; data-start=&quot;802&quot;&gt;Barrier가 할 수 있는 일이 &lt;b&gt;원천적으로 없음&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;854&quot; data-start=&quot;837&quot; data-ke-size=&quot;size16&quot;&gt;그래서 나타나는 증상이 이거다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;896&quot; data-start=&quot;856&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;865&quot; data-start=&quot;856&quot;&gt;프로세스는 뜸&lt;/li&gt;
&lt;li data-end=&quot;876&quot; data-start=&quot;866&quot;&gt;서버에는 연결됨&lt;/li&gt;
&lt;li data-end=&quot;896&quot; data-start=&quot;877&quot;&gt;그런데 &lt;b&gt;입력이 안 들어감&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;921&quot; data-start=&quot;898&quot; data-ke-size=&quot;size16&quot;&gt;버그가 아니다. &lt;b&gt;설계상 불가능&lt;/b&gt;이다.&lt;/p&gt;
&lt;h3 data-end=&quot;945&quot; data-start=&quot;923&quot; data-ke-size=&quot;size23&quot;&gt;10.3 그래서 결론은 이것뿐이다&lt;/h3&gt;
&lt;p data-end=&quot;961&quot; data-start=&quot;947&quot; data-ke-size=&quot;size16&quot;&gt;Barrier를 쓸 거면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;994&quot; data-start=&quot;963&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;981&quot; data-start=&quot;963&quot;&gt;Wayland &lt;b&gt;비활성화&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;994&quot; data-start=&quot;982&quot;&gt;Xorg 세션 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1018&quot; data-start=&quot;996&quot; data-ke-size=&quot;size16&quot;&gt;Ubuntu 기준으로는 로그인 화면에서:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1043&quot; data-start=&quot;1020&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1043&quot; data-start=&quot;1020&quot;&gt;⚙️ &amp;rarr; &amp;ldquo;Ubuntu on Xorg&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1061&quot; data-start=&quot;1045&quot; data-ke-size=&quot;size16&quot;&gt;이 선택이 전부의 출발점이다.&lt;/p&gt;
&lt;hr data-end=&quot;1066&quot; data-start=&quot;1063&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1105&quot; data-start=&quot;1068&quot; data-ke-size=&quot;size26&quot;&gt;11. Xauthority: X 인증은 &amp;ldquo;파일 하나&amp;rdquo;가 전부다&lt;/h2&gt;
&lt;p data-end=&quot;1118&quot; data-start=&quot;1107&quot; data-ke-size=&quot;size16&quot;&gt;많이들 이렇게 쓴다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;export&lt;/span&gt;&lt;/span&gt;&lt;span&gt; XAUTHORITY=~/.Xauthority &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1174&quot; data-start=&quot;1165&quot; data-ke-size=&quot;size16&quot;&gt;그리고 안 된다.&lt;/p&gt;
&lt;p data-end=&quot;1198&quot; data-start=&quot;1176&quot; data-ke-size=&quot;size16&quot;&gt;왜냐면 &lt;b&gt;그 파일이 없기 때문&lt;/b&gt;이다.&lt;/p&gt;
&lt;h3 data-end=&quot;1232&quot; data-start=&quot;1200&quot; data-ke-size=&quot;size23&quot;&gt;11.1 실제로 Xauthority는 어디에 있는가&lt;/h3&gt;
&lt;p data-end=&quot;1265&quot; data-start=&quot;1234&quot; data-ke-size=&quot;size16&quot;&gt;요즘 Ubuntu, GDM 기준으로 실제 파일은 여기다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1372&quot; data-start=&quot;1267&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1320&quot; data-start=&quot;1267&quot;&gt;GDM 로그인 화면&lt;br /&gt;/run/user/&amp;lt;gdm_uid&amp;gt;/gdm/Xauthority&lt;/li&gt;
&lt;li data-end=&quot;1372&quot; data-start=&quot;1322&quot;&gt;사용자 세션&lt;br /&gt;/run/user/&amp;lt;user_uid&amp;gt;/gdm/Xauthority&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1382&quot; data-start=&quot;1374&quot; data-ke-size=&quot;size16&quot;&gt;핵심은 이거다.&lt;/p&gt;
&lt;blockquote data-end=&quot;1451&quot; data-start=&quot;1384&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1451&quot; data-start=&quot;1386&quot; data-ke-size=&quot;size16&quot;&gt;Xauthority는 &amp;ldquo;홈 디렉터리 관습&amp;rdquo;이 아니라&lt;br /&gt;&lt;b&gt;systemd user runtime 영역&lt;/b&gt;에 있다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;1467&quot; data-start=&quot;1453&quot; data-ke-size=&quot;size16&quot;&gt;그래서 다음이 중요해진다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1497&quot; data-start=&quot;1469&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1474&quot; data-start=&quot;1469&quot;&gt;UID&lt;/li&gt;
&lt;li data-end=&quot;1484&quot; data-start=&quot;1475&quot;&gt;DISPLAY&lt;/li&gt;
&lt;li data-end=&quot;1497&quot; data-start=&quot;1485&quot;&gt;XAUTHORITY&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1516&quot; data-start=&quot;1499&quot; data-ke-size=&quot;size16&quot;&gt;이 셋은 &lt;b&gt;반드시 세트&lt;/b&gt;다.&lt;/p&gt;
&lt;h3 data-end=&quot;1544&quot; data-start=&quot;1518&quot; data-ke-size=&quot;size23&quot;&gt;11.2 왜 파일을 직접 지정해야 하는가&lt;/h3&gt;
&lt;p data-end=&quot;1563&quot; data-start=&quot;1546&quot; data-ke-size=&quot;size16&quot;&gt;Barrier는 똑똑하지 않다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1617&quot; data-start=&quot;1565&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1588&quot; data-start=&quot;1565&quot;&gt;DISPLAY만 맞다고 되는 게 아니다&lt;/li&gt;
&lt;li data-end=&quot;1617&quot; data-start=&quot;1589&quot;&gt;XAUTHORITY가 틀리면 &lt;b&gt;조용히 실패&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1636&quot; data-start=&quot;1619&quot; data-ke-size=&quot;size16&quot;&gt;그래서 우리가 한 일은 이거다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1705&quot; data-start=&quot;1638&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1669&quot; data-start=&quot;1638&quot;&gt;가능한 Xauthority 경로들을 &lt;b&gt;직접 탐색&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1685&quot; data-start=&quot;1670&quot;&gt;읽기 가능한 파일만 채택&lt;/li&gt;
&lt;li data-end=&quot;1705&quot; data-start=&quot;1686&quot;&gt;그걸 명시적으로 환경변수로 넘김&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1761&quot; data-start=&quot;1707&quot; data-ke-size=&quot;size16&quot;&gt;이건 꼼수가 아니다.&lt;br /&gt;&lt;b&gt;현재 X11 + systemd 구조에서 유일하게 안전한 방식&lt;/b&gt;이다.&lt;/p&gt;
&lt;hr data-end=&quot;1766&quot; data-start=&quot;1763&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1822&quot; data-start=&quot;1768&quot; data-ke-size=&quot;size26&quot;&gt;12.&lt;/h2&gt;
&lt;h2 data-end=&quot;2198&quot; data-start=&quot;2160&quot; data-ke-size=&quot;size26&quot;&gt;seat0 / ActiveSession을 봐야 했던 이유&lt;/h2&gt;
&lt;p data-end=&quot;2222&quot; data-start=&quot;2200&quot; data-ke-size=&quot;size16&quot;&gt;여기서 많은 자동 실행 시도가 무너진다.&lt;/p&gt;
&lt;p data-end=&quot;2231&quot; data-start=&quot;2224&quot; data-ke-size=&quot;size16&quot;&gt;겉으로 보면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2261&quot; data-start=&quot;2233&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2241&quot; data-start=&quot;2233&quot;&gt;로그인 화면&lt;/li&gt;
&lt;li data-end=&quot;2251&quot; data-start=&quot;2242&quot;&gt;비밀번호 입력&lt;/li&gt;
&lt;li data-end=&quot;2261&quot; data-start=&quot;2252&quot;&gt;바탕화면 진입&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2274&quot; data-start=&quot;2263&quot; data-ke-size=&quot;size16&quot;&gt;자연스럽게 이어진다.&lt;/p&gt;
&lt;p data-end=&quot;2320&quot; data-start=&quot;2276&quot; data-ke-size=&quot;size16&quot;&gt;하지만 systemd-logind 관점에서는 &lt;b&gt;완전히 다른 세션 전환&lt;/b&gt;이다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;loginctl show-seat seat0 &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2366&quot; data-start=&quot;2360&quot; data-ke-size=&quot;size16&quot;&gt;로그인 전:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;ActiveSession=c12 Name=gdm &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2414&quot; data-start=&quot;2408&quot; data-ke-size=&quot;size16&quot;&gt;로그인 후:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;ActiveSession=144 Name=sr &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2467&quot; data-start=&quot;2455&quot; data-ke-size=&quot;size16&quot;&gt;숫자는 중요하지 않다.&lt;/p&gt;
&lt;p data-end=&quot;2479&quot; data-start=&quot;2469&quot; data-ke-size=&quot;size16&quot;&gt;중요한 건 이거다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2520&quot; data-start=&quot;2481&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2520&quot; data-start=&quot;2481&quot;&gt;&lt;b&gt;ActiveSession = 지금 키보드&amp;middot;마우스를 받는 세션&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2524&quot; data-start=&quot;2522&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2556&quot; data-start=&quot;2526&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2537&quot; data-start=&quot;2526&quot;&gt;GDM &amp;rarr; 사용자&lt;/li&gt;
&lt;li data-end=&quot;2556&quot; data-start=&quot;2538&quot;&gt;사용자 &amp;rarr; GDM (로그아웃)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2618&quot; data-start=&quot;2558&quot; data-ke-size=&quot;size16&quot;&gt;이 순간을 &lt;b&gt;유일하게 정확히 잡아낼 수 있는 신호&lt;/b&gt;가&lt;br /&gt;seat0 / ActiveSession이다.&lt;/p&gt;
&lt;h3 data-end=&quot;2633&quot; data-start=&quot;2620&quot; data-ke-size=&quot;size23&quot;&gt;왜 이게 중요했나&lt;/h3&gt;
&lt;p data-end=&quot;2660&quot; data-start=&quot;2635&quot; data-ke-size=&quot;size16&quot;&gt;Barrier는 &amp;ldquo;백그라운드 데몬&amp;rdquo;이 아니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2691&quot; data-start=&quot;2662&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2667&quot; data-start=&quot;2662&quot;&gt;입력을&lt;/li&gt;
&lt;li data-end=&quot;2678&quot; data-start=&quot;2668&quot;&gt;특정 X 서버에&lt;/li&gt;
&lt;li data-end=&quot;2691&quot; data-start=&quot;2679&quot;&gt;특정 세션 권한으로&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2705&quot; data-start=&quot;2693&quot; data-ke-size=&quot;size16&quot;&gt;주입하는 프로그램이다.&lt;/p&gt;
&lt;p data-end=&quot;2711&quot; data-start=&quot;2707&quot; data-ke-size=&quot;size16&quot;&gt;그래서:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2745&quot; data-start=&quot;2713&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2728&quot; data-start=&quot;2713&quot;&gt;gdm용 barrierc&lt;/li&gt;
&lt;li data-end=&quot;2745&quot; data-start=&quot;2729&quot;&gt;user용 barrierc&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2770&quot; data-start=&quot;2747&quot; data-ke-size=&quot;size16&quot;&gt;이 &lt;b&gt;동시에 존재하면 반드시 망한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2788&quot; data-start=&quot;2772&quot; data-ke-size=&quot;size16&quot;&gt;실제로 관측된 결과는 이렇다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2830&quot; data-start=&quot;2790&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2800&quot; data-start=&quot;2790&quot;&gt;둘 다 실행 중&lt;/li&gt;
&lt;li data-end=&quot;2813&quot; data-start=&quot;2801&quot;&gt;둘 다 입력 안 됨&lt;/li&gt;
&lt;li data-end=&quot;2830&quot; data-start=&quot;2814&quot;&gt;서버에는 연결 로그만 남음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2845&quot; data-start=&quot;2832&quot; data-ke-size=&quot;size16&quot;&gt;그래서 결론은 하나였다.&lt;/p&gt;
&lt;blockquote data-end=&quot;2881&quot; data-start=&quot;2847&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2881&quot; data-start=&quot;2849&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;전이 순간에 하나를 반드시 죽이고, 하나만 살린다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;2933&quot; data-start=&quot;2883&quot; data-ke-size=&quot;size16&quot;&gt;이걸 사람이 수동으로 할 수는 없다.&lt;br /&gt;그래서 handoff 오케스트레이터가 필요해졌다.&lt;/p&gt;
&lt;hr data-end=&quot;2369&quot; data-start=&quot;2366&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2418&quot; data-start=&quot;2371&quot; data-ke-size=&quot;size26&quot;&gt;13. &amp;ldquo;new client disconnected&amp;rdquo;와 TLS / 인증서의 함정&lt;/h2&gt;
&lt;p data-end=&quot;2447&quot; data-start=&quot;2420&quot; data-ke-size=&quot;size16&quot;&gt;여기서 이번 사고의 &lt;b&gt;진짜 시발점&lt;/b&gt;이 나온다.&lt;/p&gt;
&lt;h3 data-end=&quot;2483&quot; data-start=&quot;2449&quot; data-ke-size=&quot;size23&quot;&gt;13.1 문제의 시작은 Ubuntu 패키지 업데이트였다&lt;/h3&gt;
&lt;p data-end=&quot;2493&quot; data-start=&quot;2485&quot; data-ke-size=&quot;size16&quot;&gt;환경은 이랬다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2556&quot; data-start=&quot;2495&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2515&quot; data-start=&quot;2495&quot;&gt;Windows Barrier 서버&lt;/li&gt;
&lt;li data-end=&quot;2536&quot; data-start=&quot;2516&quot;&gt;Linux / RPi 클라이언트들&lt;/li&gt;
&lt;li data-end=&quot;2556&quot; data-start=&quot;2537&quot;&gt;TLS + 인증서 방식 사용 중&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2593&quot; data-start=&quot;2558&quot; data-ke-size=&quot;size16&quot;&gt;어느 날 Ubuntu 업데이트 이후, 갑자기 이런 로그가 뜬다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;ssl error occurred (generic failure) error:0A00010B:SSL routines::wrong version number &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2710&quot; data-start=&quot;2695&quot; data-ke-size=&quot;size16&quot;&gt;이 메시지는 뜻이 명확하다.&lt;/p&gt;
&lt;blockquote data-end=&quot;2752&quot; data-start=&quot;2712&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2752&quot; data-start=&quot;2714&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;한쪽은 TLS로 말하고,&lt;br /&gt;다른 쪽은 평문으로 말하고 있다.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-end=&quot;2785&quot; data-start=&quot;2754&quot; data-ke-size=&quot;size23&quot;&gt;13.2 인증서 문제가 아니라 &amp;ldquo;옵션 불일치&amp;rdquo;였다&lt;/h3&gt;
&lt;p data-end=&quot;2796&quot; data-start=&quot;2787&quot; data-ke-size=&quot;size16&quot;&gt;많이들 착각한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2824&quot; data-start=&quot;2798&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2812&quot; data-start=&quot;2798&quot;&gt;인증서 파일이 깨졌나?&lt;/li&gt;
&lt;li data-end=&quot;2824&quot; data-start=&quot;2813&quot;&gt;CA가 잘못됐나?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2830&quot; data-start=&quot;2826&quot; data-ke-size=&quot;size16&quot;&gt;아니다.&lt;/p&gt;
&lt;p data-end=&quot;2866&quot; data-start=&quot;2832&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;서버/클라이언트 중 한쪽만 TLS 옵션을 켠 상태&lt;/b&gt;였다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2921&quot; data-start=&quot;2868&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2888&quot; data-start=&quot;2868&quot;&gt;Windows 서버: TLS ON&lt;/li&gt;
&lt;li data-end=&quot;2921&quot; data-start=&quot;2889&quot;&gt;Linux 클라이언트: 옵션 깨짐 or 빌드 옵션 상이&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2928&quot; data-start=&quot;2923&quot; data-ke-size=&quot;size16&quot;&gt;그 결과:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2975&quot; data-start=&quot;2930&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2950&quot; data-start=&quot;2930&quot;&gt;handshake 이전에 바로 컷&lt;/li&gt;
&lt;li data-end=&quot;2975&quot; data-start=&quot;2951&quot;&gt;wrong version number&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;2999&quot; data-start=&quot;2977&quot; data-ke-size=&quot;size23&quot;&gt;13.3 그래서 결국 이렇게 됐다&lt;/h3&gt;
&lt;p data-end=&quot;3030&quot; data-start=&quot;3001&quot; data-ke-size=&quot;size16&quot;&gt;보안적으로는 아쉽지만, 현실적으로는 이 선택을 했다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3085&quot; data-start=&quot;3032&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3049&quot; data-start=&quot;3032&quot;&gt;TLS + 인증서 옵션 제거&lt;/li&gt;
&lt;li data-end=&quot;3061&quot; data-start=&quot;3050&quot;&gt;평문 연결로 통일&lt;/li&gt;
&lt;li data-end=&quot;3085&quot; data-start=&quot;3062&quot;&gt;서버/클라이언트 옵션 &lt;b&gt;완전 일치&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3098&quot; data-start=&quot;3087&quot; data-ke-size=&quot;size16&quot;&gt;이게 문제를 끝냈다.&lt;/p&gt;
&lt;hr data-end=&quot;3103&quot; data-start=&quot;3100&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3138&quot; data-start=&quot;3105&quot; data-ke-size=&quot;size26&quot;&gt;14. RPi5도 클라이언트다 (그리고 똑같이 터진다)&lt;/h2&gt;
&lt;p data-end=&quot;3160&quot; data-start=&quot;3140&quot; data-ke-size=&quot;size16&quot;&gt;이건 보너스가 아니라 &lt;b&gt;증거&lt;/b&gt;다.&lt;/p&gt;
&lt;p data-end=&quot;3182&quot; data-start=&quot;3162&quot; data-ke-size=&quot;size16&quot;&gt;RPi5에서도 동일한 문제가 있었다.&lt;/p&gt;
&lt;h3 data-end=&quot;3212&quot; data-start=&quot;3184&quot; data-ke-size=&quot;size23&quot;&gt;14.1 실제로 동작한 systemd 서비스&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;[Unit]&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;Description&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=Barrier Client for RPi5 &lt;/span&gt;&lt;span&gt;&lt;span&gt;After&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=graphical-session.target lightdm.service &lt;/span&gt;&lt;span&gt;&lt;span&gt;Requires&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=graphical-session.target lightdm.service &lt;/span&gt;&lt;span&gt;&lt;span&gt;[Service]&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;Type&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=simple &lt;/span&gt;&lt;span&gt;&lt;span&gt;ExecStart&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=/bin/bash -c &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;sleep 5 &amp;amp;&amp;amp; DISPLAY=:0 exec /usr/bin/barrierc -f --name RPwiznet999 --debug DEBUG --log /home/pi/barrier.log victus.local&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;Restart&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;on&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-failure &lt;/span&gt;&lt;span&gt;&lt;span&gt;RestartSec&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;30&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;Environment&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=\&lt;span&gt;&quot;DISPLAY=:0\&quot; [Install] WantedBy=graphical-session.target &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3648&quot; data-start=&quot;3640&quot; data-ke-size=&quot;size16&quot;&gt;중요한 포인트:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3710&quot; data-start=&quot;3650&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3661&quot; data-start=&quot;3650&quot;&gt;인증서 옵션 없음&lt;/li&gt;
&lt;li data-end=&quot;3674&quot; data-start=&quot;3662&quot;&gt;DISPLAY 명시&lt;/li&gt;
&lt;li data-end=&quot;3710&quot; data-start=&quot;3675&quot;&gt;실행 파일 경로 명확 (/usr/bin/barrierc)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3731&quot; data-start=&quot;3712&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 하자 &lt;b&gt;바로 동작&lt;/b&gt;했다.&lt;/p&gt;
&lt;p data-end=&quot;3756&quot; data-start=&quot;3733&quot; data-ke-size=&quot;size16&quot;&gt;즉, Ubuntu든 RPi든 본질은 같다.&lt;/p&gt;
&lt;blockquote data-end=&quot;3800&quot; data-start=&quot;3758&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;3800&quot; data-start=&quot;3760&quot; data-ke-size=&quot;size16&quot;&gt;Barrier 문제의 80%는&lt;br /&gt;&amp;ldquo;환경 추측&amp;rdquo;과 &amp;ldquo;옵션 불일치&amp;rdquo;다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;3805&quot; data-start=&quot;3802&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3840&quot; data-start=&quot;3807&quot; data-ke-size=&quot;size26&quot;&gt;15. 최종 구조 요약 (이건 요약이 아니라 결론이다)&lt;/h2&gt;
&lt;p data-end=&quot;3856&quot; data-start=&quot;3842&quot; data-ke-size=&quot;size16&quot;&gt;이 글의 결론은 간단하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4013&quot; data-start=&quot;3858&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3870&quot; data-start=&quot;3858&quot;&gt;Wayland 끈다&lt;/li&gt;
&lt;li data-end=&quot;3880&quot; data-start=&quot;3871&quot;&gt;Xorg 쓴다&lt;/li&gt;
&lt;li data-end=&quot;3898&quot; data-start=&quot;3881&quot;&gt;DISPLAY 추측 안 한다&lt;/li&gt;
&lt;li data-end=&quot;3920&quot; data-start=&quot;3899&quot;&gt;XAUTHORITY 실제 파일 쓴다&lt;/li&gt;
&lt;li data-end=&quot;3946&quot; data-start=&quot;3921&quot;&gt;gdm / user Barrier 분리한다&lt;/li&gt;
&lt;li data-end=&quot;3981&quot; data-start=&quot;3947&quot;&gt;seat0 ActiveSession으로 handoff 한다&lt;/li&gt;
&lt;li data-end=&quot;4013&quot; data-start=&quot;3982&quot;&gt;TLS 옵션은 &lt;b&gt;서버/클라이언트 완전 일치&lt;/b&gt;시킨다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4058&quot; data-start=&quot;4015&quot; data-ke-size=&quot;size16&quot;&gt;이건 요령이 아니다.&lt;br /&gt;&lt;b&gt;지금 리눅스 그래픽 스택의 현실적인 정답&lt;/b&gt;이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&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&gt;&lt;code&gt;[Barrier]
- Barrier man page (Ubuntu): https://manpages.ubuntu.com/manpages/jammy/en/man1/barrierc.1.html
- Barrier GitHub (crypto options 논의/문서/이슈 검색 출발점): https://github.com/debauchee/barrier
- Barrier release notes / crypto 관련 변경 (예: crypto option 변화): https://github.com/debauchee/barrier/releases

[OpenSSL]
- wrong version number 설명(대표 케이스: TLS로 붙었는데 상대는 평문 등): https://stackoverflow.com/questions/49734904/ssl-wrong-version-number

[X11 / DISPLAY / Xauthority]
- xauth(1) man page: https://man7.org/linux/man-pages/man1/xauth.1.html
- DISPLAY / X 서버 개념(출발점으로 적당한 설명): https://superuser.com/questions/486113/what-is-the-display-environment-variable
- /tmp/.X11-unix 소켓과 DISPLAY 연결(설명): https://unix.stackexchange.com/questions/221655/what-is-tmp-x11-unix

[systemd logind / loginctl]
- loginctl / show-session 등: https://www.freedesktop.org/software/systemd/man/latest/loginctl.html&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;</description>
      <category>IT/System Digging</category>
      <category>20.04</category>
      <category>barrier</category>
      <category>Display</category>
      <category>rpi5</category>
      <category>TLS</category>
      <category>ubuntu</category>
      <category>Wayland</category>
      <category>windows 11</category>
      <category>XAUTHORITY</category>
      <category>인증서</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/388</guid>
      <comments>https://simryang.tistory.com/entry/Windows-11-Ubuntu-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-Barrier-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0GDM-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%ED%99%94%EB%A9%B4%EA%B9%8C%EC%A7%80-%ED%8F%AC%ED%95%A8%ED%95%9C-%EC%9E%90%EB%8F%99-%EC%8B%A4%ED%96%89-%EA%B5%AC%EC%84%B1#entry388comment</comments>
      <pubDate>Mon, 29 Dec 2025 17:49:18 +0900</pubDate>
    </item>
    <item>
      <title>Ubuntu 20.04 &amp;amp; 24.04 네트워크 설정 완전 정복 - 인터페이스 확인부터 고정 IP &amp;middot; DHCP 변경까지 (Full Guide)</title>
      <link>https://simryang.tistory.com/entry/Ubuntu-2004-2404-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%84%A4%EC%A0%95-%EC%99%84%EC%A0%84-%EC%A0%95%EB%B3%B5-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-%ED%99%95%EC%9D%B8%EB%B6%80%ED%84%B0-%EA%B3%A0%EC%A0%95-IP-%C2%B7-DHCP-%EB%B3%80%EA%B2%BD%EA%B9%8C%EC%A7%80-Full-Guide</link>
      <description>&lt;p data-end=&quot;320&quot; data-start=&quot;180&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Ubuntu 20.04와 24.04에서 네트워크 인터페이스 확인부터 고정 IP, DHCP 설정까지 한 번에 정리한 실전 가이드입니다.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Netplan 문법 변화와 버전별 차이를 비교해, 각 환경에서 안전하게 설정하는 방법을 제공합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;320&quot; data-start=&quot;180&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;358&quot; data-start=&quot;299&quot; data-ke-size=&quot;size16&quot;&gt;Ubuntu에서 네트워크 설정은 버전이 올라갈수록&lt;br /&gt;&amp;ldquo;대충 써도 되던 것&amp;rdquo;들이 하나씩 사라지고 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;388&quot; data-start=&quot;360&quot; data-ke-size=&quot;size16&quot;&gt;특히 &lt;b&gt;Ubuntu 24.04 LTS&lt;/b&gt;에서는&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;457&quot; data-start=&quot;389&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;407&quot; data-start=&quot;389&quot;&gt;Netplan 1.0 도입&lt;/li&gt;
&lt;li data-end=&quot;433&quot; data-start=&quot;408&quot;&gt;gateway4 구문의 사실상 퇴장&lt;/li&gt;
&lt;li data-end=&quot;457&quot; data-start=&quot;434&quot;&gt;문법 오류에 대한 훨씬 엄격한 검사&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;472&quot; data-start=&quot;459&quot; data-ke-size=&quot;size16&quot;&gt;같은 변화가 생겼습니다.&lt;/p&gt;
&lt;p data-end=&quot;563&quot; data-start=&quot;474&quot; data-ke-size=&quot;size16&quot;&gt;이 글은 &lt;b&gt;Ubuntu 20.04와 24.04를 나란히 비교&lt;/b&gt;하면서,&lt;br /&gt;각 버전에서 &lt;b&gt;어떤 설정을 써야 안전한지&lt;/b&gt;를 한 번에 정리한 실전 가이드입니다.&lt;/p&gt;
&lt;hr data-end=&quot;568&quot; data-start=&quot;565&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;585&quot; data-start=&quot;570&quot; data-ke-size=&quot;size26&quot;&gt;이 글에서 다루는 내용&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;748&quot; data-start=&quot;587&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;605&quot; data-start=&quot;587&quot;&gt;네트워크 인터페이스 이름 확인&lt;/li&gt;
&lt;li data-end=&quot;634&quot; data-start=&quot;606&quot;&gt;Ubuntu 20.04 Netplan 설정 방식&lt;/li&gt;
&lt;li data-end=&quot;667&quot; data-start=&quot;635&quot;&gt;Ubuntu 24.04 Netplan 1.0 최신 문법&lt;/li&gt;
&lt;li data-end=&quot;694&quot; data-start=&quot;668&quot;&gt;NetworkManager(nmcli) 설정&lt;/li&gt;
&lt;li data-end=&quot;714&quot; data-start=&quot;695&quot;&gt;임시 네트워크 설정 (테스트용)&lt;/li&gt;
&lt;li data-end=&quot;732&quot; data-start=&quot;715&quot;&gt;방식별 &amp;middot; 버전별 비교 정리&lt;/li&gt;
&lt;li data-end=&quot;748&quot; data-start=&quot;733&quot;&gt;설정 후 필수 점검 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;753&quot; data-start=&quot;750&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;789&quot; data-start=&quot;755&quot; data-ke-size=&quot;size26&quot;&gt;1. 사전 작업: 네트워크 인터페이스 이름 확인 (공통)&lt;/h2&gt;
&lt;p data-end=&quot;838&quot; data-start=&quot;791&quot; data-ke-size=&quot;size16&quot;&gt;모든 네트워크 설정의 출발점은&lt;br /&gt;&lt;b&gt;인터페이스 이름을 정확히 확인하는 것&lt;/b&gt;입니다.&lt;/p&gt;
&lt;h3 data-end=&quot;856&quot; data-start=&quot;840&quot; data-ke-size=&quot;size23&quot;&gt;인터페이스 확인 명령어&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1765965565943&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ip link show&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;886&quot; data-start=&quot;884&quot; data-ke-size=&quot;size16&quot;&gt;또는&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1765965576031&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;nmcli device&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;923&quot; data-start=&quot;914&quot; data-ke-size=&quot;size23&quot;&gt;결과 예시&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;965&quot; data-start=&quot;925&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;935&quot; data-start=&quot;925&quot;&gt;enp3s0&lt;/li&gt;
&lt;li data-end=&quot;946&quot; data-start=&quot;936&quot;&gt;enp0s3&lt;/li&gt;
&lt;li data-end=&quot;955&quot; data-start=&quot;947&quot;&gt;eno1&lt;/li&gt;
&lt;li data-end=&quot;965&quot; data-start=&quot;956&quot;&gt;wlan0&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-end=&quot;1052&quot; data-start=&quot;967&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;977&quot; data-start=&quot;969&quot; data-ke-size=&quot;size16&quot;&gt;이 글에서는&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1052&quot; data-start=&quot;980&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1009&quot; data-start=&quot;980&quot;&gt;Ubuntu 20.04 예제: enp3s0&lt;/li&gt;
&lt;li data-end=&quot;1052&quot; data-start=&quot;1012&quot;&gt;Ubuntu 24.04 예제: enp0s3&lt;br /&gt;를 사용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;1057&quot; data-start=&quot;1054&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1101&quot; data-start=&quot;1059&quot; data-ke-size=&quot;size26&quot;&gt;2. Ubuntu 20.04 네트워크 설정 (Netplan 기존 방식)&lt;/h2&gt;
&lt;p data-end=&quot;1172&quot; data-start=&quot;1103&quot; data-ke-size=&quot;size16&quot;&gt;Ubuntu 20.04는 Netplan 0.x 계열을 사용하며,&lt;br /&gt;&lt;b&gt;gateway4 문법이 정상적으로 허용&lt;/b&gt;됩니다.&lt;/p&gt;
&lt;h3 data-end=&quot;1186&quot; data-start=&quot;1174&quot; data-ke-size=&quot;size23&quot;&gt;설정 파일 위치&lt;/h3&gt;
&lt;pre id=&quot;code_1765965605361&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/etc/netplan/*.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1240&quot; data-start=&quot;1221&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1240&quot; data-start=&quot;1221&quot; data-ke-size=&quot;size16&quot;&gt;보통 다음과 같은 파일이 있습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1765965627089&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;01-netcfg.yaml
00-installer-config.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1318&quot; data-start=&quot;1295&quot; data-ke-size=&quot;size23&quot;&gt;  고정 IP 설정 (20.04)&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1765965646698&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;network:
  version: 2
  ethernets:
    enp3s0:
      dhcp4: no
      addresses:
        - 192.168.1.100/24
      gateway4: 192.168.1.1
      nameservers:
        addresses:
          - 8.8.8.8
          - 8.8.4.4&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1586&quot; data-start=&quot;1546&quot; data-ke-size=&quot;size16&quot;&gt;✔ 문제 없음&lt;br /&gt;✔ 경고 없음&lt;br /&gt;✔ 지금도 현업에서 매우 많이 사용됨&lt;/p&gt;
&lt;hr data-end=&quot;1591&quot; data-start=&quot;1588&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1615&quot; data-start=&quot;1593&quot; data-ke-size=&quot;size23&quot;&gt;  DHCP 설정 (20.04)&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1765965663722&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;network:
  version: 2
  ethernets:
    enp3s0:
      dhcp4: yes&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1700&quot; data-start=&quot;1694&quot; data-ke-size=&quot;size23&quot;&gt;적용&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1765965675874&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo netplan apply&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1737&quot; data-start=&quot;1734&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1785&quot; data-start=&quot;1739&quot; data-ke-size=&quot;size26&quot;&gt;3. Ubuntu 24.04 네트워크 설정 (Netplan 1.0 최신 방식)&lt;/h2&gt;
&lt;p data-end=&quot;1848&quot; data-start=&quot;1787&quot; data-ke-size=&quot;size16&quot;&gt;Ubuntu 24.04는 &lt;b&gt;Netplan 1.0&lt;/b&gt;을 탑재합니다.&lt;br /&gt;여기서 가장 중요한 변화는 이것입니다.&lt;/p&gt;
&lt;blockquote data-end=&quot;1902&quot; data-start=&quot;1850&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1902&quot; data-start=&quot;1852&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;gateway4 &amp;rarr; deprecated&lt;/b&gt;&lt;br /&gt;&lt;b&gt;routes 사용 권장&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;1945&quot; data-start=&quot;1904&quot; data-ke-size=&quot;size16&quot;&gt;작동은 할 수 있지만,&lt;br /&gt;&lt;b&gt;새 설정에서는 쓰지 않는 게 정답&lt;/b&gt;입니다.&lt;/p&gt;
&lt;hr data-end=&quot;1950&quot; data-start=&quot;1947&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1981&quot; data-start=&quot;1952&quot; data-ke-size=&quot;size23&quot;&gt;  고정 IP 설정 (24.04 권장 문법)&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1765965706378&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;network:
  version: 2
  renderer: networkd   # 서버: networkd / 데스크탑: NetworkManager
  ethernets:
    enp0s3:
      dhcp4: no
      addresses:
        - 192.168.1.100/24
      routes:
        - to: default
          via: 192.168.1.1
      nameservers:
        addresses:
          - 8.8.8.8
          - 8.8.4.4&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2348&quot; data-start=&quot;2305&quot; data-ke-size=&quot;size16&quot;&gt;✔ Netplan 1.0 표준&lt;br /&gt;✔ 경고 없음&lt;br /&gt;✔ 향후 LTS에서도 안전&lt;/p&gt;
&lt;hr data-end=&quot;2353&quot; data-start=&quot;2350&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2377&quot; data-start=&quot;2355&quot; data-ke-size=&quot;size23&quot;&gt;  DHCP 설정 (24.04)&lt;/h3&gt;
&lt;pre id=&quot;code_1765965726493&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s3:
      dhcp4: yes&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;2480&quot; data-start=&quot;2477&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2504&quot; data-start=&quot;2482&quot; data-ke-size=&quot;size23&quot;&gt;적용 시 주의 (특히 원격 서버)&lt;/h3&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1765965741428&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo netplan try&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2573&quot; data-start=&quot;2536&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2550&quot; data-start=&quot;2536&quot;&gt;120초 후 자동 롤백&lt;/li&gt;
&lt;li data-end=&quot;2573&quot; data-start=&quot;2551&quot;&gt;SSH 끊겨서 서버 날리는 사고 방지&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2578&quot; data-start=&quot;2575&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2622&quot; data-start=&quot;2580&quot; data-ke-size=&quot;size26&quot;&gt;4. NetworkManager 방식 (20.04 &amp;amp; 24.04 공통)&lt;/h2&gt;
&lt;p data-end=&quot;2688&quot; data-start=&quot;2624&quot; data-ke-size=&quot;size16&quot;&gt;GUI 환경이나 노트북, 데스크탑에서는&lt;br /&gt;여전히 &lt;b&gt;NetworkManager + nmcli&lt;/b&gt;가 가장 편합니다.&lt;/p&gt;
&lt;h3 data-end=&quot;2705&quot; data-start=&quot;2690&quot; data-ke-size=&quot;size23&quot;&gt;  고정 IP 설정&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1765965764644&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo nmcli con mod &quot;Wired connection 1&quot; \
  ipv4.addresses 192.168.1.100/24 \
  ipv4.gateway 192.168.1.1 \
  ipv4.dns &quot;8.8.8.8,8.8.4.4&quot; \
  ipv4.method manual

sudo nmcli con up &quot;Wired connection 1&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;2933&quot; data-start=&quot;2919&quot; data-ke-size=&quot;size23&quot;&gt;  DHCP 복구&lt;/h3&gt;
&lt;pre id=&quot;code_1765965784550&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo nmcli con mod &quot;Wired connection 1&quot; ipv4.method auto
sudo nmcli con up &quot;Wired connection 1&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;3089&quot; data-start=&quot;3044&quot; data-ke-size=&quot;size16&quot;&gt;20.04와 24.04 사이에&lt;br /&gt;&lt;b&gt;nmcli 사용법 차이는 거의 없습니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;3094&quot; data-start=&quot;3091&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3123&quot; data-start=&quot;3096&quot; data-ke-size=&quot;size26&quot;&gt;5. 임시 설정 방식 (테스트 &amp;middot; 디버깅용)&lt;/h2&gt;
&lt;p data-end=&quot;3143&quot; data-start=&quot;3125&quot; data-ke-size=&quot;size16&quot;&gt;⚠️ 재부팅 시 전부 사라집니다.&lt;/p&gt;
&lt;h3 data-end=&quot;3164&quot; data-start=&quot;3145&quot; data-ke-size=&quot;size23&quot;&gt;  ip 유틸리티 (권장)&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1765965804302&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo ip addr add 192.168.1.100/24 dev enp0s3
sudo ip route add default via 192.168.1.1&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;3284&quot; data-start=&quot;3266&quot; data-ke-size=&quot;size23&quot;&gt;  ifconfig 차이&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;버전상태
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3344&quot; data-start=&quot;3286&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3344&quot; data-start=&quot;3308&quot;&gt;
&lt;tr data-end=&quot;3325&quot; data-start=&quot;3308&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3316&quot; data-start=&quot;3308&quot;&gt;20.04&lt;/td&gt;
&lt;td data-end=&quot;3325&quot; data-start=&quot;3316&quot; data-col-size=&quot;sm&quot;&gt;기본 포함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3344&quot; data-start=&quot;3326&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3334&quot; data-start=&quot;3326&quot;&gt;24.04&lt;/td&gt;
&lt;td data-end=&quot;3344&quot; data-start=&quot;3334&quot; data-col-size=&quot;sm&quot;&gt;기본 미포함&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3367&quot; data-start=&quot;3346&quot; data-ke-size=&quot;size16&quot;&gt;24.04에서 ifconfig 쓰려면:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;/span&gt;&lt;span&gt; apt install net-tools &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3448&quot; data-start=&quot;3409&quot; data-ke-size=&quot;size16&quot;&gt;굳이 그럴 이유 없습니다.&lt;br /&gt;이제는 &lt;b&gt;ip 명령어가 정답&lt;/b&gt;입니다.&lt;/p&gt;
&lt;hr data-end=&quot;3453&quot; data-start=&quot;3450&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3475&quot; data-start=&quot;3455&quot; data-ke-size=&quot;size26&quot;&gt;6. 방식 &amp;middot; 버전별 종합 비교&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;구분Ubuntu 20.04Ubuntu 24.04
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3665&quot; data-start=&quot;3477&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3665&quot; data-start=&quot;3528&quot;&gt;
&lt;tr data-end=&quot;3558&quot; data-start=&quot;3528&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3541&quot; data-start=&quot;3528&quot;&gt;Netplan 버전&lt;/td&gt;
&lt;td data-end=&quot;3547&quot; data-start=&quot;3541&quot; data-col-size=&quot;sm&quot;&gt;0.x&lt;/td&gt;
&lt;td data-end=&quot;3558&quot; data-start=&quot;3547&quot; data-col-size=&quot;sm&quot;&gt;&lt;b&gt;1.0&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3596&quot; data-start=&quot;3559&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3570&quot; data-start=&quot;3559&quot;&gt;gateway4&lt;/td&gt;
&lt;td data-end=&quot;3578&quot; data-start=&quot;3570&quot; data-col-size=&quot;sm&quot;&gt;사용 가능&lt;/td&gt;
&lt;td data-end=&quot;3596&quot; data-start=&quot;3578&quot; data-col-size=&quot;sm&quot;&gt;&lt;b&gt;Deprecated&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3621&quot; data-start=&quot;3597&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3606&quot; data-start=&quot;3597&quot;&gt;routes&lt;/td&gt;
&lt;td data-end=&quot;3611&quot; data-start=&quot;3606&quot; data-col-size=&quot;sm&quot;&gt;선택&lt;/td&gt;
&lt;td data-end=&quot;3621&quot; data-start=&quot;3611&quot; data-col-size=&quot;sm&quot;&gt;&lt;b&gt;권장&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3641&quot; data-start=&quot;3622&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3630&quot; data-start=&quot;3622&quot;&gt;nmcli&lt;/td&gt;
&lt;td data-end=&quot;3635&quot; data-start=&quot;3630&quot; data-col-size=&quot;sm&quot;&gt;안정&lt;/td&gt;
&lt;td data-end=&quot;3641&quot; data-start=&quot;3635&quot; data-col-size=&quot;sm&quot;&gt;안정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3665&quot; data-start=&quot;3642&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3653&quot; data-start=&quot;3642&quot;&gt;ifconfig&lt;/td&gt;
&lt;td data-end=&quot;3658&quot; data-start=&quot;3653&quot; data-col-size=&quot;sm&quot;&gt;가능&lt;/td&gt;
&lt;td data-end=&quot;3665&quot; data-start=&quot;3658&quot; data-col-size=&quot;sm&quot;&gt;비권장&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3670&quot; data-start=&quot;3667&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3692&quot; data-start=&quot;3672&quot; data-ke-size=&quot;size26&quot;&gt;7. 마지막 확인 단계 (필수)&lt;/h2&gt;
&lt;p data-end=&quot;3711&quot; data-start=&quot;3694&quot; data-ke-size=&quot;size16&quot;&gt;설정 후에는 무조건 확인합니다.&lt;/p&gt;
&lt;h3 data-end=&quot;3722&quot; data-start=&quot;3713&quot; data-ke-size=&quot;size23&quot;&gt;IP 확인&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1765965833382&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ip addr&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;3757&quot; data-start=&quot;3745&quot; data-ke-size=&quot;size23&quot;&gt;외부 통신 확인&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1765965843192&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ping -c 3 8.8.8.8&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3830&quot; data-start=&quot;3790&quot; data-ke-size=&quot;size16&quot;&gt;여기서 안 되면&lt;br /&gt;설정은 끝난 게 아니라 &lt;b&gt;시작도 안 한 겁니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;3835&quot; data-start=&quot;3832&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3846&quot; data-start=&quot;3837&quot; data-ke-size=&quot;size26&quot;&gt;마무리 정리&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4029&quot; data-start=&quot;3848&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3906&quot; data-start=&quot;3848&quot;&gt;&lt;b&gt;20.04 유지 보수&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3906&quot; data-start=&quot;3868&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3889&quot; data-start=&quot;3868&quot;&gt;기존 gateway4 유지 가능&lt;/li&gt;
&lt;li data-end=&quot;3906&quot; data-start=&quot;3892&quot;&gt;당장 바꿀 필요는 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3968&quot; data-start=&quot;3908&quot;&gt;&lt;b&gt;24.04 신규 구축&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3968&quot; data-start=&quot;3928&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3944&quot; data-start=&quot;3928&quot;&gt;routes 문법 필수&lt;/li&gt;
&lt;li data-end=&quot;3968&quot; data-start=&quot;3947&quot;&gt;Netplan 1.0 기준으로 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;4029&quot; data-start=&quot;3970&quot;&gt;&lt;b&gt;앞으로를 생각한다면&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4029&quot; data-start=&quot;3989&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4029&quot; data-start=&quot;3989&quot;&gt;20.04에서도 routes 문법으로 미리 정리하는 게 가장 깔끔&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4084&quot; data-start=&quot;4031&quot; data-ke-size=&quot;size16&quot;&gt;Ubuntu는 점점 불친절해지고 있습니다.&lt;br /&gt;대신, &lt;b&gt;한 번 제대로 해두면 오래 갑니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;4137&quot; data-start=&quot;4086&quot; data-ke-size=&quot;size16&quot;&gt;이 글 하나로&lt;br /&gt;20.04든 24.04든&lt;br /&gt;네트워크 설정에서 길 잃을 일은 없을 겁니다.&lt;/p&gt;</description>
      <category>IT/System Digging</category>
      <category>20.04</category>
      <category>24.04</category>
      <category>dhcp</category>
      <category>Linux</category>
      <category>netplan</category>
      <category>NetworkManager</category>
      <category>nmcli</category>
      <category>ubuntu</category>
      <category>네트워크 설정</category>
      <category>리눅스</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/387</guid>
      <comments>https://simryang.tistory.com/entry/Ubuntu-2004-2404-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%84%A4%EC%A0%95-%EC%99%84%EC%A0%84-%EC%A0%95%EB%B3%B5-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-%ED%99%95%EC%9D%B8%EB%B6%80%ED%84%B0-%EA%B3%A0%EC%A0%95-IP-%C2%B7-DHCP-%EB%B3%80%EA%B2%BD%EA%B9%8C%EC%A7%80-Full-Guide#entry387comment</comments>
      <pubDate>Wed, 17 Dec 2025 19:10:38 +0900</pubDate>
    </item>
    <item>
      <title>Shell 문자열 처리: 특정 패턴 이전을 삭제하고 이후만 출력하는 7가지 실전 방법 정리</title>
      <link>https://simryang.tistory.com/entry/Shell-%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%B2%98%EB%A6%AC-%ED%8A%B9%EC%A0%95-%ED%8C%A8%ED%84%B4-%EC%9D%B4%EC%A0%84%EC%9D%84-%EC%82%AD%EC%A0%9C%ED%95%98%EA%B3%A0-%EC%9D%B4%ED%9B%84%EB%A7%8C-%EC%B6%9C%EB%A0%A5%ED%95%98%EB%8A%94-7%EA%B0%80%EC%A7%80-%EC%8B%A4%EC%A0%84-%EB%B0%A9%EB%B2%95-%EC%A0%95%EB%A6%AC</link>
      <description>&lt;p data-end=&quot;444&quot; data-start=&quot;311&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Shell에서 특정 패턴 이전 문자열을 삭제하고 이후 텍스트만 출력하는 방법을 정리했습니다.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;sed, awk, perl, Bash 파라미터 확장 등 다양한 명령어를 사용해, 초보자도 그대로 복사해서 실행해 볼 수 있는 예제로 자세히 설명드립니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;로그나 빌드 출력, 각종 스크립트 결과를 다루다 보면 다음과 같이 여러 내용 중에 특정 키워드(아래에서는 zzz.txt) 까지는 필요없고 그 이후 내용(아래에서는 변하는 내용)만 필요한 상황이 있습니다.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1764634138447&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;abc cde ka zzz.txt 변하는 내용&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;601&quot; data-start=&quot;584&quot; data-ke-size=&quot;size16&quot;&gt;여기서 목표는 다음과 같습니다.&lt;/p&gt;
&lt;blockquote data-end=&quot;659&quot; data-start=&quot;603&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;659&quot; data-start=&quot;605&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;zzz.txt까지의 모든 내용을 삭제하고, 그 이후 문자열인 변하는 내용만 출력하기&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;703&quot; data-start=&quot;661&quot; data-ke-size=&quot;size16&quot;&gt;이 글에서는 이 목표를 달성하기 위해 다음과 같은 7가지 전략을 정리합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;857&quot; data-start=&quot;705&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;721&quot; data-start=&quot;705&quot;&gt;sed 문자열 제거&lt;/li&gt;
&lt;li data-end=&quot;739&quot; data-start=&quot;722&quot;&gt;perl 정규식 변환&lt;/li&gt;
&lt;li data-end=&quot;770&quot; data-start=&quot;740&quot;&gt;awk의 index + substr 사용&lt;/li&gt;
&lt;li data-end=&quot;789&quot; data-start=&quot;771&quot;&gt;awk 상태 머신 방식&lt;/li&gt;
&lt;li data-end=&quot;811&quot; data-start=&quot;790&quot;&gt;awk split 기반 분리&lt;/li&gt;
&lt;li data-end=&quot;828&quot; data-start=&quot;812&quot;&gt;Bash 파라미터 확장&lt;/li&gt;
&lt;li data-end=&quot;857&quot; data-start=&quot;829&quot;&gt;rev + sed + rev 트릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;906&quot; data-start=&quot;859&quot; data-ke-size=&quot;size16&quot;&gt;모든 예제는 &lt;b&gt;복붙 후 바로 실행 가능&lt;/b&gt;하도록 echo를 포함해 작성했습니다.&lt;/p&gt;
&lt;hr data-end=&quot;698&quot; data-start=&quot;695&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;946&quot; data-start=&quot;913&quot; data-ke-size=&quot;size26&quot;&gt;1️⃣ sed 문자열 제거 방법 (가장 기본적인 패턴)&lt;/h2&gt;
&lt;p data-end=&quot;1041&quot; data-start=&quot;948&quot; data-ke-size=&quot;size16&quot;&gt;sed는 Shell에서 텍스트를 변환할 때 가장 많이 사용하는 도구입니다.&lt;br /&gt;정규식을 이용해 &lt;b&gt;특정 패턴 이전을 통째로 지우는 방식&lt;/b&gt;으로 사용할 수 있습니다.&lt;/p&gt;
&lt;h3 data-end=&quot;1082&quot; data-start=&quot;1043&quot; data-ke-size=&quot;size23&quot;&gt;1-1. 기본 예제: zzz.txt까지 제거하고 이후만 출력&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1764632432480&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo &quot;abc cde ka zzz.txt 변하는 내용&quot; \ | sed 's/.*zzz.txt //'&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;출력:&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1764632471608&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;변하는 내용&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1185&quot; data-start=&quot;1182&quot; data-ke-size=&quot;size16&quot;&gt;설명:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1287&quot; data-start=&quot;1187&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1241&quot; data-start=&quot;1187&quot;&gt;.*zzz.txt 부분이 &lt;b&gt;처음부터 zzz.txt + 뒤 공백까지&lt;/b&gt;를 의미합니다.&lt;/li&gt;
&lt;li data-end=&quot;1287&quot; data-start=&quot;1242&quot;&gt;이 구간을 빈 문자열로 바꾸기 때문에, 결과적으로 변하는 내용만 남습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1323&quot; data-start=&quot;1289&quot; data-ke-size=&quot;size23&quot;&gt;1-2. 공백이 여러 개 섞여 있어도 처리 가능한 버전&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;937&quot; data-start=&quot;911&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1764632444240&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo &quot;abc   cde    ka  zzz.txt        변하는   내용&quot; | sed 's/.*zzz.txt *//'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1446&quot; data-start=&quot;1441&quot; data-ke-size=&quot;size16&quot;&gt;여기서&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1518&quot; data-start=&quot;1447&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1475&quot; data-start=&quot;1447&quot;&gt;*는 &amp;ldquo;공백이 0개 이상&amp;rdquo;을 의미합니다. 즉, 공백(' ')이 여러 개 있든지, 아예 없든지() 하는 것을 처리합니다.&lt;/li&gt;
&lt;li data-end=&quot;1518&quot; data-start=&quot;1476&quot;&gt;zzz.txt 뒤에 공백이 몇 개가 붙어 있든 자연스럽게 제거됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1020&quot; data-start=&quot;973&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;1025&quot; data-start=&quot;1022&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1559&quot; data-start=&quot;1525&quot; data-ke-size=&quot;size26&quot;&gt;2️⃣ perl 정규식 기반 제거 (복잡한 패턴에 강력)&lt;/h2&gt;
&lt;p data-end=&quot;1613&quot; data-start=&quot;1561&quot; data-ke-size=&quot;size16&quot;&gt;perl은 정규식 기능이 매우 강력해서, 공백이 불규칙하거나 패턴이 복잡할 때 유리합니다.&lt;/p&gt;
&lt;h3 data-end=&quot;1646&quot; data-start=&quot;1615&quot; data-ke-size=&quot;size23&quot;&gt;2-1. zzz.txt까지 포함한 앞부분 제거&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1764632484248&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo &quot;abc cde ka zzz.txt 변하는 내용&quot; | perl -pe 's/^.*?zzz\.txt\s*//'&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;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1764632492704&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;변하는 내용&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1759&quot; data-start=&quot;1756&quot; data-ke-size=&quot;size16&quot;&gt;설명:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1934&quot; data-start=&quot;1761&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1851&quot; data-start=&quot;1761&quot;&gt;^.*?zzz\.txt
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1851&quot; data-start=&quot;1782&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1798&quot; data-start=&quot;1782&quot;&gt;줄의 시작부터(^)&lt;/li&gt;
&lt;li data-end=&quot;1820&quot; data-start=&quot;1801&quot;&gt;가장 앞에서부터(.*?)&lt;/li&gt;
&lt;li data-end=&quot;1851&quot; data-start=&quot;1823&quot;&gt;zzz.txt가 나오는 지점까지를 찾습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1899&quot; data-start=&quot;1852&quot;&gt;\s*
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1899&quot; data-start=&quot;1864&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1899&quot; data-start=&quot;1864&quot;&gt;zzz.txt 뒤에 오는 공백(0개 이상)을 제거합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1934&quot; data-start=&quot;1900&quot;&gt;결과적으로 zzz.txt까지의 모든 내용을 지워줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1268&quot; data-start=&quot;1201&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;1273&quot; data-start=&quot;1270&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-end=&quot;1983&quot; data-start=&quot;1941&quot; data-ke-size=&quot;size26&quot;&gt;3️⃣ awk index + substr 기반 처리 (위치 기반 접근)&lt;/h2&gt;
&lt;p data-end=&quot;2073&quot; data-start=&quot;1985&quot; data-ke-size=&quot;size16&quot;&gt;정규식보다 &lt;b&gt;&amp;ldquo;문자열 내에서 패턴의 위치&amp;rdquo;를 계산하고 그 이후를 잘라내는 방식&lt;/b&gt;을 원하신다면 awk의 index와 substr 조합이 좋습니다.&lt;/p&gt;
&lt;h3 data-end=&quot;2116&quot; data-start=&quot;2075&quot; data-ke-size=&quot;size23&quot;&gt;3-1. index + substr로 zzz.txt 이후만 출력&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1764632503920&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo &quot;abc cde ka zzz.txt 변하는 내용&quot; | awk '{
  p = index($0, &quot;zzz.txt&quot;);
  if (p &amp;gt; 0) {
    print substr($0, p + length(&quot;zzz.txt &quot;) );
  }
}'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 줄 버전&lt;/p&gt;
&lt;pre id=&quot;code_1764635100335&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo &quot;abc cde ka zzz.txt 변하는 내용&quot; | awk '{ p = index($0, &quot;zzz.txt&quot;) print substr($0, p + length(&quot;zzz.txt &quot;)) }'&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;출력:&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1764632511912&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;변하는 내용&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;2302&quot; data-start=&quot;2299&quot; data-ke-size=&quot;size16&quot;&gt;설명:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2461&quot; data-start=&quot;2304&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2374&quot; data-start=&quot;2304&quot;&gt;index($0, &quot;zzz.txt&quot;)&lt;br /&gt;현재 줄($0)에서 &quot;zzz.txt&quot;가 시작되는 위치를 반환합니다.&lt;/li&gt;
&lt;li data-end=&quot;2461&quot; data-start=&quot;2375&quot;&gt;substr($0, p + length(&quot;zzz.txt &quot;) )&lt;br /&gt;zzz.txt와 그 뒤 공백까지 길이를 더한 위치부터 끝까지 잘라냅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1546&quot; data-start=&quot;1514&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;1551&quot; data-start=&quot;1548&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-end=&quot;2506&quot; data-start=&quot;2468&quot; data-ke-size=&quot;size26&quot;&gt;4️⃣ awk 상태 머신 방식 (필드 단위로 처리하고 싶을 때)&lt;/h2&gt;
&lt;p data-end=&quot;2566&quot; data-start=&quot;2508&quot; data-ke-size=&quot;size16&quot;&gt;공백 기준으로 나뉘어진 텍스트라면, awk의 &lt;b&gt;상태 머신 방식&lt;/b&gt;이 이해하기 더 쉬울 수 있습니다.&lt;/p&gt;
&lt;h3 data-end=&quot;2600&quot; data-start=&quot;2568&quot; data-ke-size=&quot;size23&quot;&gt;4-1. zzz.txt 이후 단어만 모아서 출력&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1764635042736&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo &quot;abc cde ka zzz.txt 변하는 내용 입니다&quot; | awk '{
  found = 0;
  out = &quot;&quot;;
  for (i = 1; i &amp;lt;= NF; i++) {
    if (found) {
      out = out &quot; &quot; $i;
    }
    if ($i == &quot;zzz.txt&quot;) {
      found = 1;
    }
  }
  # out은 앞에 공백이 하나 붙어 있으므로 substr로 잘라줍니다.
  print substr(out, 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;한 줄 버전&lt;/p&gt;
&lt;pre id=&quot;code_1764632523120&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo &quot;abc cde ka zzz.txt 변하는 내용 입니다&quot; | awk '{ found = 0 out = &quot;&quot; for (i=1;i&amp;lt;=NF;i++) { if (found) out = out &quot; &quot; $i if ($i==&quot;zzz.txt&quot;) found=1 } print substr(out,2) }'&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;출력:&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1764632530233&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;변하는 내용&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;2922&quot; data-start=&quot;2919&quot; data-ke-size=&quot;size16&quot;&gt;설명:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3056&quot; data-start=&quot;2924&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2957&quot; data-start=&quot;2924&quot;&gt;NF는 현재 줄의 필드 개수입니다. (공백 기준)&lt;/li&gt;
&lt;li data-end=&quot;2998&quot; data-start=&quot;2958&quot;&gt;zzz.txt를 만나기 전까지는 아무 것도 저장하지 않습니다.&lt;/li&gt;
&lt;li data-end=&quot;3056&quot; data-start=&quot;2999&quot;&gt;zzz.txt를 만나면 found = 1로 바꾸고, 그 이후 단어들만 out에 쌓습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1896&quot; data-start=&quot;1853&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;1901&quot; data-start=&quot;1898&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-end=&quot;3102&quot; data-start=&quot;3063&quot; data-ke-size=&quot;size26&quot;&gt;5️⃣ awk split 기반 처리 (패턴 기준으로 문자열 분리)&lt;/h2&gt;
&lt;p data-end=&quot;3154&quot; data-start=&quot;3104&quot; data-ke-size=&quot;size16&quot;&gt;문자열을 특정 패턴 기준으로 &lt;b&gt;왼쪽/오른쪽으로 나누고, 오른쪽만 사용&lt;/b&gt;하는 방식입니다.&lt;/p&gt;
&lt;h3 data-end=&quot;3194&quot; data-start=&quot;3156&quot; data-ke-size=&quot;size23&quot;&gt;5-1. split으로 zzz.txt 이후 부분만 출력하기&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1764635210416&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo &quot;abc cde ka zzz.txt    변하는 내용&quot; | awk '{
  n = split($0, arr, &quot;zzz.txt&quot;);
  # arr[1] : zzz.txt 이전
  # arr[2] : zzz.txt 이후
  sub(/^ */, &quot;&quot;, arr[2]);  # 앞에 불필요한 공백 제거
  print arr[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;한 줄 버전&lt;/p&gt;
&lt;pre id=&quot;code_1764632539656&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo &quot;abc cde ka zzz.txt    변하는 내용&quot; | awk '{ n = split($0, arr, &quot;zzz.txt&quot;) sub(/^ */, &quot;&quot;, arr[2]) print arr[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;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;출력:&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1764632547384&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;변하는 내용&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;3429&quot; data-start=&quot;3426&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3429&quot; data-start=&quot;3426&quot; data-ke-size=&quot;size16&quot;&gt;설명:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3572&quot; data-start=&quot;3431&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3519&quot; data-start=&quot;3431&quot;&gt;split($0, arr, &quot;zzz.txt&quot;)&lt;br /&gt;전체 줄을 &quot;zzz.txt&quot;를 기준으로 나누어 arr[1], arr[2]에 저장합니다.&lt;/li&gt;
&lt;li data-end=&quot;3572&quot; data-start=&quot;3520&quot;&gt;arr[2]가 &quot;zzz.txt&quot; 뒤쪽 문자열이므로, 앞 공백만 제거하고 출력합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2168&quot; data-start=&quot;2138&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;2173&quot; data-start=&quot;2170&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-end=&quot;3612&quot; data-start=&quot;3579&quot; data-ke-size=&quot;size26&quot;&gt;6️⃣ Bash 파라미터 확장 (외부 도구 없이 처리)&lt;/h2&gt;
&lt;p data-end=&quot;3684&quot; data-start=&quot;3614&quot; data-ke-size=&quot;size16&quot;&gt;Bash 스크립트 내부에서 문자열을 다룰 때는 &lt;b&gt;파라미터 확장&lt;/b&gt;을 사용하면 외부 도구 없이도 깔끔하게 처리할 수 있습니다.&lt;/p&gt;
&lt;h3 data-end=&quot;3723&quot; data-start=&quot;3686&quot; data-ke-size=&quot;size23&quot;&gt;6-1. 변수에서 zzz.txt까지 제거하고 이후만 출력&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1764635305966&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;line=&quot;abc cde ka zzz.txt 변하는 내용&quot;
echo &quot;${line#*zzz.txt }&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 줄 버전&lt;/p&gt;
&lt;pre id=&quot;code_1764632563376&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;line=&quot;abc cde ka zzz.txt 변하는 내용&quot; echo &quot;${line#*zzz.txt }&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;출력:&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1764632572288&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;변하는 내용&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3828&quot; data-start=&quot;3825&quot; data-ke-size=&quot;size16&quot;&gt;설명:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3981&quot; data-start=&quot;3830&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3981&quot; data-start=&quot;3830&quot;&gt;${line#*zzz.txt }
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3981&quot; data-start=&quot;3856&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3899&quot; data-start=&quot;3856&quot;&gt;#는 &amp;ldquo;앞에서부터 일치하는 가장 짧은 부분을 제거&amp;rdquo;하는 연산입니다.&lt;/li&gt;
&lt;li data-end=&quot;3954&quot; data-start=&quot;3902&quot;&gt;*zzz.txt 는 &amp;ldquo;아무 문자들 + zzz.txt + 공백&amp;rdquo;까지를 의미합니다.&lt;/li&gt;
&lt;li data-end=&quot;3981&quot; data-start=&quot;3957&quot;&gt;그 부분을 잘라내고 나머지를 출력합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2413&quot; data-start=&quot;2375&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;2418&quot; data-start=&quot;2415&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-end=&quot;4026&quot; data-start=&quot;3988&quot; data-ke-size=&quot;size26&quot;&gt;7️⃣ rev + sed + rev 조합 (문자열 뒤집기 트릭)&lt;/h2&gt;
&lt;p data-end=&quot;4092&quot; data-start=&quot;4028&quot; data-ke-size=&quot;size16&quot;&gt;문자열을 뒤집으면 복잡한 패턴이 단순해지는 경우가 있어, rev와 sed를 조합해 사용하는 방법도 있습니다.&lt;/p&gt;
&lt;h3 data-end=&quot;4126&quot; data-start=&quot;4094&quot; data-ke-size=&quot;size23&quot;&gt;7-1. 문자열을 뒤집어서 처리한 뒤 다시 되돌리기&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1764635395879&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo &quot;abc cde ka zzz.txt 변하는 내용&quot; \
  | rev \
  | sed 's/.*txt.zzz //' \
  | rev&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;pre id=&quot;code_1764632583968&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo &quot;abc cde ka zzz.txt 변하는 내용&quot; | rev | sed 's/.*txt.zzz //' | rev&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;4253&quot; data-start=&quot;4250&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;4253&quot; data-start=&quot;4250&quot; data-ke-size=&quot;size16&quot;&gt;설명:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4376&quot; data-start=&quot;4255&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4302&quot; data-start=&quot;4255&quot;&gt;원래 문자열을 뒤집으면:&lt;br /&gt;용내 는하변 txt.zzz ak edc cba&lt;/li&gt;
&lt;li data-end=&quot;4336&quot; data-start=&quot;4303&quot;&gt;여기서 txt.zzz 기준으로 앞부분을 제거한 뒤&lt;/li&gt;
&lt;li data-end=&quot;4376&quot; data-start=&quot;4337&quot;&gt;다시 rev로 되돌리면 원래 방향으로 정리된 문자열이 나옵니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2645&quot; data-start=&quot;2603&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;2650&quot; data-start=&quot;2647&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;4417&quot; data-start=&quot;4383&quot; data-ke-size=&quot;size26&quot;&gt;  실습 팁: 예제 따라 하실 때 이렇게 확인해 보세요&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;4619&quot; data-start=&quot;4419&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;4471&quot; data-start=&quot;4419&quot;&gt;터미널을 여신 뒤, 각 코드 블록을 &lt;b&gt;그대로 복사해서 붙여넣기&lt;/b&gt;만 하셔도 됩니다.&lt;/li&gt;
&lt;li data-end=&quot;4528&quot; data-start=&quot;4472&quot;&gt;모든 예제는 echo &quot;...&quot;를 포함하고 있어서, 별도의 파일 없이도 바로 동작합니다.&lt;/li&gt;
&lt;li data-end=&quot;4619&quot; data-start=&quot;4529&quot;&gt;마음에 드는 방식을 하나 고르셔서,
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4619&quot; data-start=&quot;4555&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4564&quot; data-start=&quot;4555&quot;&gt;로그 파싱&lt;/li&gt;
&lt;li data-end=&quot;4580&quot; data-start=&quot;4568&quot;&gt;빌드 출력 정리&lt;/li&gt;
&lt;li data-end=&quot;4619&quot; data-start=&quot;4584&quot;&gt;스크립트 후처리&lt;br /&gt;등에 그대로 응용하실 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;4624&quot; data-start=&quot;4621&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;4650&quot; data-start=&quot;4626&quot; data-ke-size=&quot;size26&quot;&gt;  어떤 방식을 언제 쓰면 좋을까요?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;5002&quot; data-start=&quot;4652&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4698&quot; data-start=&quot;4652&quot;&gt;&lt;b&gt;가장 간단한 경우&lt;/b&gt;&lt;br /&gt;&amp;rarr; sed 's/.*zzz.txt //'&lt;/li&gt;
&lt;li data-end=&quot;4762&quot; data-start=&quot;4699&quot;&gt;&lt;b&gt;복잡한 패턴, 공백이 뒤죽박죽&lt;/b&gt;&lt;br /&gt;&amp;rarr; perl -pe 's/^.*?zzz\.txt\s*//'&lt;/li&gt;
&lt;li data-end=&quot;4823&quot; data-start=&quot;4763&quot;&gt;&lt;b&gt;위치 기반으로 명확하게 처리하고 싶을 때&lt;/b&gt;&lt;br /&gt;&amp;rarr; awk의 index + substr&lt;/li&gt;
&lt;li data-end=&quot;4881&quot; data-start=&quot;4824&quot;&gt;&lt;b&gt;공백 기준 필드 형태의 로그 처리&lt;/b&gt;&lt;br /&gt;&amp;rarr; awk 상태 머신 / split 방식&lt;/li&gt;
&lt;li data-end=&quot;4941&quot; data-start=&quot;4882&quot;&gt;&lt;b&gt;스크립트 내부 변수만 처리&lt;/b&gt;&lt;br /&gt;&amp;rarr; Bash 파라미터 확장 ${var#*pattern}&lt;/li&gt;
&lt;li data-end=&quot;5002&quot; data-start=&quot;4942&quot;&gt;&lt;b&gt;정규식이 너무 복잡해질 때 차라리 뒤집어서 처리&lt;/b&gt;&lt;br /&gt;&amp;rarr; rev + sed + rev&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;5007&quot; data-start=&quot;5004&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;5015&quot; data-start=&quot;5009&quot; data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-end=&quot;5115&quot; data-start=&quot;5017&quot; data-ke-size=&quot;size16&quot;&gt;이 글에서 소개해 드린 7가지 방법은 모두 **&amp;ldquo;특정 패턴까지 앞부분을 버리고, 이후만 출력한다&amp;rdquo;**는 공통된 목표를 가집니다.&lt;br /&gt;도구와 표현법은 다르지만, 개념은 같습니다.&lt;/p&gt;
&lt;p data-end=&quot;5265&quot; data-start=&quot;5117&quot; data-ke-size=&quot;size16&quot;&gt;가장 중요한 것은 &lt;b&gt;본인이 이해하기 편하고, 나중에 다시 봐도 읽기 쉬운 코드 스타일&lt;/b&gt;을 고르는 것입니다.&lt;br /&gt;선호하는 방식을 하나 정해서 &amp;ldquo;내 Shell 문자열 처리 패턴&amp;rdquo;으로 만들어 두시면, 이후 로그 처리나 간단한 텍스트 전처리에 큰 도움이 되실 것입니다.&lt;/p&gt;</description>
      <category>IT/bash</category>
      <category>awk</category>
      <category>bash</category>
      <category>perl</category>
      <category>SED</category>
      <category>문자열</category>
      <category>일부</category>
      <category>패턴</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/386</guid>
      <comments>https://simryang.tistory.com/entry/Shell-%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%B2%98%EB%A6%AC-%ED%8A%B9%EC%A0%95-%ED%8C%A8%ED%84%B4-%EC%9D%B4%EC%A0%84%EC%9D%84-%EC%82%AD%EC%A0%9C%ED%95%98%EA%B3%A0-%EC%9D%B4%ED%9B%84%EB%A7%8C-%EC%B6%9C%EB%A0%A5%ED%95%98%EB%8A%94-7%EA%B0%80%EC%A7%80-%EC%8B%A4%EC%A0%84-%EB%B0%A9%EB%B2%95-%EC%A0%95%EB%A6%AC#entry386comment</comments>
      <pubDate>Tue, 2 Dec 2025 09:34:29 +0900</pubDate>
    </item>
    <item>
      <title>[펌] network stack diagram</title>
      <link>https://simryang.tistory.com/entry/%ED%8E%8C-network-stack-diagram</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://zenodo.org/records/14179366&quot;&gt;Entire Linux Network stack diagram&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1761038751687&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Entire Linux Network stack diagram&quot; data-og-description=&quot;Diagram of entire Linux Network Stack, including: Virtualization and Linux containers: Emulation and Paravirtualization. Network sockets. Network stack: Upper layer of Network stack (TCP, UDP). Low layer of Network stack with GRO, RPS, RFS and GSO. Network&quot; data-og-host=&quot;zenodo.org&quot; data-og-source-url=&quot;https://zenodo.org/records/14179366&quot; data-og-url=&quot;https://zenodo.org/records/14179366&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://zenodo.org/records/14179366&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://zenodo.org/records/14179366&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Entire Linux Network stack diagram&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Diagram of entire Linux Network Stack, including: Virtualization and Linux containers: Emulation and Paravirtualization. Network sockets. Network stack: Upper layer of Network stack (TCP, UDP). Low layer of Network stack with GRO, RPS, RFS and GSO. Network&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;zenodo.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/boQXw8/dJMb9XxzEFS/Ayow0zs6EeqpMkBur5Fu1k/Linux%20Network%20Stack%20-%20EN.pdf?attach=1&amp;amp;knm=tfile.pdf&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Linux Network Stack - EN.pdf&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;5.19MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>IT/web</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/385</guid>
      <comments>https://simryang.tistory.com/entry/%ED%8E%8C-network-stack-diagram#entry385comment</comments>
      <pubDate>Tue, 21 Oct 2025 18:27:15 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 서비스 포트 충돌 삽질기: net.ipv4.ip_local_reserved_ports 완벽 가이드 - Cannot assign requested address</title>
      <link>https://simryang.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%84%9C%EB%B9%84%EC%8A%A4-%ED%8F%AC%ED%8A%B8-%EC%B6%A9%EB%8F%8C-%EC%82%BD%EC%A7%88%EA%B8%B0-netipv4iplocalreservedports-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C-Cannot-assign-requested-address</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요! 개발을 하다 보면 정말 예상치 못한 곳에서 뒤통수를 맞는 경우가 종종 있습니다. 오늘은 리눅스 서버에서 발생하는 고질적인 포트 충돌 문제를 해결하려다 겪었던 생생한 삽질 경험과 그 과정에서 얻은 깨달음을 공유하고자 합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제의 시작: 유령처럼 나타나는 포트 충돌&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저희가 운영하는 리눅스 장비에는 두 가지 중요한 서비스가 백그라운드에서 실행되고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고정 포트를 사용하는 핵심 애플리케이션 (my-app-service)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부 서버와 연결을 유지하는 reverse-ssh-service&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평소에는 잘 동작하다가, 시스템을 재부팅하거나 reverse-ssh-service가 재시작될 때 아주 가끔 my-app-service가 포트를 점유하지 못하고 실패하는 문제가 발생했습니다. 원인은 명확했습니다. reverse-ssh-service의 ssh 클라이언트가 외부 접속을 위해 OS로부터 할당받는 &lt;b&gt;임시 포트(Ephemeral Port)&lt;/b&gt;가 운 나쁘게 my-app-service가 사용해야 할 고정 포트와 겹치는 것이죠.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;첫 번째 가설: 특정 포트 범위를 예약하자!&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제를 해결하기 위해 리눅스 커널 파라미터 중 하나인 &lt;b&gt;net.ipv4.ip_local_reserved_ports&lt;/b&gt;를 알게 되었습니다. 이 파라미터에 포트나 포트 범위를 지정해두면, OS가 임시 포트를 자동 할당할 때 해당 영역을 제외한다는 것이죠. &quot;바로 이거다!&quot; 싶었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 설정은 /etc/sysctl.d/ 디렉터리에 .conf 파일을 만들어 관리할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1760944147883&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo nano /etc/sysctl.d/99-port-reservation.conf&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;my-app-service가 사용할 포트가 51000번대라고 가정하고, 우선 다음과 같이 넉넉하게 10개 정도의 포트를 예약했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1760944185138&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo vim /etc/sysctl.d/99-port-reservation.conf
net.ipv4.ip_local_reserved_ports = 51000-51010&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정을 적용하고 나니 한 가지 고민이 생겼습니다. &quot;이게 정말 잘 적용된 건지 어떻게 확실하게 테스트하지?&quot;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  가설 검증을 위한 과감한 테스트와 예상치 못한 오류&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;제대로 막히는지 확인하려면, 아예 쓸 수 있는 포트를 전부 막아버리자!&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 검증을 위해 아주 넓은 포트 대역을 예약 범위로 설정했습니다. 10000번부터 65535번까지 모두 막으면, ssh 클라이언트가 접속에 실패할 것이라고 예상했습니다. 1~9999번 포트는 여유가 있으니 시스템이 알아서 잘 사용하리라 믿었죠.&lt;/p&gt;
&lt;pre id=&quot;code_1760944225418&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;net.ipv4.ip_local_reserved_ports = 10000-65535&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;그리고 sysctl 명령어로 설정을 시스템에 즉시 반영했습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1760944238098&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo sysctl --system&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 reverse-ssh-service를 재시작하자, 예상대로(?) 서비스가 실패했습니다. 직접 ssh 명령어를 실행해 보니 다음과 같은 오류 메시지가 나타났습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1760944270698&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ /usr/bin/ssh -o ... remote-user@203.0.113.50
ssh: connect to host 203.0.113.50 port 22: Cannot assign requested address&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Cannot assign requested address&quot; (요청한 주소를 할당할 수 없습니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오류가 발생했으니 테스트는 성공... 인 줄 알았지만, 뭔가 찜찜했습니다. &quot;왜 1~9999번 사이의 포트를 사용하지 못했을까?&quot;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  진짜 원인: 내가 알던 포트 범위와 커널의 생각이 달랐다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 궁금증을 해결하기 위해 검색을 시작했고, 곧 리눅스 커널이 임시 포트로 사용하는 실제 범위가 따로 정해져 있다는 것을 알게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sysctl 명령어로 직접 확인할 수 있었죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과는 충격적이었습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1760944288738&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 32768 60999&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;제가 생각했던 것과 달리, 커널은 32768번부터 60999번 사이의 포트만을 임시 포트로 사용하고 있었습니다. 제가 테스트를 위해 막아버린 10000-65535 범위가 커널이 사용할 수 있는 모든 임시 포트 범위를 완벽하게 포함해버린 것입니다. ssh가 사용할 포트가 단 하나도 남아있지 않았던 거죠!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ 해결 및 최종 검증&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 원리를 알았으니, 올바르게 설정을 수정할 수 있었습니다. 커널의 임시 포트 범위(32768~60999)를 참고하여 ssh가 낮은 번호대 포트를 사용하도록 유도하기 위해, 33000번 이상의 포트를 모두 예약해 보았습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1760944331706&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;net.ipv4.ip_local_reserved_ports = 33000-65535&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정을 적용하고 reverse-ssh-service를 재시작한 뒤, ss 명령어로 현재 연결 상태를 확인했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1760944343346&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ss -4a | grep &quot;203.0.113.50&quot;
ESTAB 0 0 192.168.1.10:32772 203.0.113.50:ssh&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;놀랍게도 ssh 클라이언트가 사용하는 로컬 포트가 &lt;b&gt;32772&lt;/b&gt;번으로 잡혔습니다! 이전에는 주로 5xxxx번대 포트가 잡혔는데, 제가 33000번 이상을 막아버리니 커널이 사용 가능한 범위의 가장 낮은 번호대(32768번 근처)를 할당해 준 것입니다. 드디어 설정이 의도대로 동작함을 눈으로 확인했습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  최종 적용 및 마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 모든 원리를 파악했으니, 저희 서비스에 필요한 만큼의 포트만 안전하게 예약할 수 있게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1760944422586&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#/etc/sysctl.d/99-my-app-reserved-ports.conf (최종)
net.ipv4.ip_local_reserved_ports = 51000-52000&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;세 줄 요약:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;net.ipv4.ip_local_reserved_ports를 사용하면 특정 포트를 OS의 자동 할당 대상에서 제외할 수 있다.&lt;/li&gt;
&lt;li&gt;OS는 net.ipv4.ip_local_port_range에 정의된 범위 내에서만 임시 포트를 할당한다.&lt;/li&gt;
&lt;li&gt;포트를 예약할 때는 이 범위를 고려해야 하며, ss 명령어로 실제 적용 결과를 꼭 확인하자!&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/server</category>
      <category>ephemeral port</category>
      <category>Linux</category>
      <category>ssh</category>
      <category>sysctl</category>
      <category>systemd</category>
      <category>리눅스</category>
      <category>삽질기</category>
      <category>포트충돌</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/384</guid>
      <comments>https://simryang.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%84%9C%EB%B9%84%EC%8A%A4-%ED%8F%AC%ED%8A%B8-%EC%B6%A9%EB%8F%8C-%EC%82%BD%EC%A7%88%EA%B8%B0-netipv4iplocalreservedports-%EC%99%84%EB%B2%BD-%EA%B0%80%EC%9D%B4%EB%93%9C-Cannot-assign-requested-address#entry384comment</comments>
      <pubDate>Mon, 20 Oct 2025 16:15:25 +0900</pubDate>
    </item>
    <item>
      <title>[python3] 동기 코드에서 &amp;ldquo;비동기 작업자&amp;rdquo;를 별도 프로세스로 돌리기 &amp;mdash; subprocess vs multiprocessing 선택 가이드</title>
      <link>https://simryang.tistory.com/entry/python3-%EB%8F%99%EA%B8%B0-%EC%BD%94%EB%93%9C%EC%97%90%EC%84%9C-%E2%80%9C%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%9E%91%EC%97%85%EC%9E%90%E2%80%9D%EB%A5%BC-%EB%B3%84%EB%8F%84-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EB%A1%9C-%EB%8F%8C%EB%A6%AC%EA%B8%B0-%E2%80%94-subprocess-vs-multiprocessing-%EC%84%A0%ED%83%9D-%EA%B0%80%EC%9D%B4%EB%93%9C</link>
      <description>&lt;h2 data-end=&quot;92&quot; data-start=&quot;78&quot; data-ke-size=&quot;size26&quot;&gt;동기 방식 메인 코드에서 파일 업로드를 하는 비동기 모듈을 만들어서 쓰려고 할 때 고민한 내용을 정리한 글입니다.&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;92&quot; data-start=&quot;78&quot; data-ke-size=&quot;size26&quot;&gt;의도(현 구현 방향)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;320&quot; data-start=&quot;93&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;202&quot; data-start=&quot;93&quot;&gt;&lt;b&gt;목표&lt;/b&gt;: 동기 코드(메인 앱)에서 &lt;b&gt;비동기 작업자&lt;/b&gt;(업로더 등)를 &lt;b&gt;완전 별도 프로세스&lt;/b&gt;로 실행하고, 빠른 취소/종료, 환경변수 주입, 로그 분리, 장애 격리를 쉽게 달성한다.&lt;/li&gt;
&lt;li data-end=&quot;256&quot; data-start=&quot;203&quot;&gt;&lt;b&gt;우선순위&lt;/b&gt;: 운영 단순성(격리&amp;middot;배포&amp;middot;재시작) &amp;gt; 세밀한 IPC &amp;gt; 최적화 미세튜닝.&lt;/li&gt;
&lt;li data-end=&quot;320&quot; data-start=&quot;257&quot;&gt;&lt;b&gt;가정&lt;/b&gt;: 작업자는 자체 이벤트 루프/네트워크 스택을 갖고, 성공/실패를 자체적으로 처리/보고할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;325&quot; data-start=&quot;322&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;351&quot; data-start=&quot;327&quot; data-ke-size=&quot;size26&quot;&gt;언제 subprocess가 맞는가?&lt;/h2&gt;
&lt;p data-end=&quot;405&quot; data-start=&quot;352&quot; data-ke-size=&quot;size16&quot;&gt;다음 조건을 2개 이상 만족하면 **subprocess.Popen**이 보통 더 깔끔합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;666&quot; data-start=&quot;407&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;433&quot; data-start=&quot;407&quot;&gt;작업자가 &lt;b&gt;독립 실행 스크립트&lt;/b&gt; 형태다.&lt;/li&gt;
&lt;li data-end=&quot;467&quot; data-start=&quot;434&quot;&gt;&lt;b&gt;환경변수/CLI 인자&lt;/b&gt;만으로 설정 전달이 충분하다.&lt;/li&gt;
&lt;li data-end=&quot;509&quot; data-start=&quot;468&quot;&gt;실패해도 &lt;b&gt;부모 프로세스를 오염시키지 않고&lt;/b&gt; 재기동이 쉬워야 한다.&lt;/li&gt;
&lt;li data-end=&quot;568&quot; data-start=&quot;510&quot;&gt;&lt;b&gt;로그 파일로 표준 출력&lt;/b&gt;을 남기고 외부 툴(systemd/supervisor)로 관리하고 싶다.&lt;/li&gt;
&lt;li data-end=&quot;614&quot; data-start=&quot;569&quot;&gt;&lt;b&gt;신호(SIGTERM/SIGUSR1)&lt;/b&gt; 로 빠르게 취소&amp;middot;종료를 걸고 싶다.&lt;/li&gt;
&lt;li data-end=&quot;666&quot; data-start=&quot;615&quot;&gt;나중에 &lt;b&gt;배포/롤백/핫스왑&lt;/b&gt;을 단순하게 가져가고 싶다(venv/스크립트 교체만으로).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;677&quot; data-start=&quot;668&quot; data-ke-size=&quot;size23&quot;&gt;장점 요약&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;828&quot; data-start=&quot;678&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;724&quot; data-start=&quot;678&quot;&gt;완전 격리(새 파이썬 인터프리터): 이벤트 루프/소켓/상태 충돌 리스크 낮음&lt;/li&gt;
&lt;li data-end=&quot;798&quot; data-start=&quot;725&quot;&gt;운영 친화: env/cwd/stdout 한 줄로 설정, 프로세스 그룹 분리(start_new_session=True)&lt;/li&gt;
&lt;li data-end=&quot;828&quot; data-start=&quot;799&quot;&gt;장애 격리/재시작 용이, systemd 연동 쉬움&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;839&quot; data-start=&quot;830&quot; data-ke-size=&quot;size23&quot;&gt;단점 요약&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;946&quot; data-start=&quot;840&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;896&quot; data-start=&quot;840&quot;&gt;파이썬 객체 단위의 &lt;b&gt;풍부한 IPC가 번거롭다&lt;/b&gt;(주로 stdout/파일/소켓/REST로 해결)&lt;/li&gt;
&lt;li data-end=&quot;946&quot; data-start=&quot;897&quot;&gt;프로세스 기동 오버헤드(보통 수백 ms)는 &lt;b&gt;짧고 잦은 호출&lt;/b&gt;에선 느껴질 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;951&quot; data-start=&quot;948&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;982&quot; data-start=&quot;953&quot; data-ke-size=&quot;size26&quot;&gt;언제 multiprocessing이 맞는가?&lt;/h2&gt;
&lt;p data-end=&quot;1042&quot; data-start=&quot;983&quot; data-ke-size=&quot;size16&quot;&gt;다음 조건을 2개 이상 만족하면 **multiprocessing.Process**가 더 자연스럽습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1206&quot; data-start=&quot;1044&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1073&quot; data-start=&quot;1044&quot;&gt;&lt;b&gt;파이썬 함수 자체&lt;/b&gt;를 병렬로 실행하고 싶다.&lt;/li&gt;
&lt;li data-end=&quot;1126&quot; data-start=&quot;1074&quot;&gt;&lt;b&gt;Queue/Pipe/Manager&lt;/b&gt;로 &lt;b&gt;파이썬 객체&lt;/b&gt;를 풍부하게 주고받아야 한다.&lt;/li&gt;
&lt;li data-end=&quot;1171&quot; data-start=&quot;1127&quot;&gt;워커를 오래 띄워두고 &lt;b&gt;많은 소작업&lt;/b&gt;을 저지연으로 처리해야 한다(풀링).&lt;/li&gt;
&lt;li data-end=&quot;1206&quot; data-start=&quot;1172&quot;&gt;이벤트&amp;middot;진행률&amp;middot;중간결과를 &lt;b&gt;빈번하게&lt;/b&gt; 주고받아야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1217&quot; data-start=&quot;1208&quot; data-ke-size=&quot;size23&quot;&gt;장점 요약&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1282&quot; data-start=&quot;1218&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1249&quot; data-start=&quot;1218&quot;&gt;파이썬 객체 직렬화 기반의 &lt;b&gt;쉽고 풍부한 IPC&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1282&quot; data-start=&quot;1250&quot;&gt;동일 코드베이스 안에서 &lt;b&gt;함수 단위 병렬화&lt;/b&gt;가 간편&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1293&quot; data-start=&quot;1284&quot; data-ke-size=&quot;size23&quot;&gt;단점 요약&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1535&quot; data-start=&quot;1294&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1414&quot; data-start=&quot;1294&quot;&gt;시작 방식(fork/spawn)과 플랫폼 차이에 따른 &lt;b&gt;초기화 규율&lt;/b&gt; 필요&lt;br /&gt;(특히 spawn에서 if __name__ == &quot;__main__&quot;: 가드, import 순서, 전역실행 주의)&lt;/li&gt;
&lt;li data-end=&quot;1487&quot; data-start=&quot;1415&quot;&gt;fork 기반에선 &lt;b&gt;부모의 핸들/루프 상태 상속&lt;/b&gt;으로 미묘한 버그 가능 &amp;rarr; 보수적으로는 spawn 권장(오버헤드&amp;uarr;)&lt;/li&gt;
&lt;li data-end=&quot;1535&quot; data-start=&quot;1488&quot;&gt;외부 서비스처럼 &lt;b&gt;운영/감시/재시작&lt;/b&gt;하기엔 subprocess보다 절차가 복잡&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1540&quot; data-start=&quot;1537&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1553&quot; data-start=&quot;1542&quot; data-ke-size=&quot;size26&quot;&gt;결정 체크리스트&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1778&quot; data-start=&quot;1555&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1595&quot; data-start=&quot;1555&quot;&gt;&lt;b&gt;격리와 운영 단순성&lt;/b&gt;이 최우선 &amp;rarr; subprocess ✅&lt;/li&gt;
&lt;li data-end=&quot;1643&quot; data-start=&quot;1596&quot;&gt;&lt;b&gt;실시간&amp;middot;빈번한 객체 교환&lt;/b&gt;이 핵심 &amp;rarr; multiprocessing ✅&lt;/li&gt;
&lt;li data-end=&quot;1730&quot; data-start=&quot;1644&quot;&gt;&lt;b&gt;빠른 취소 반응성&lt;/b&gt;은 둘 다 가능(신호 or Event/Queue). 다만 &lt;b&gt;안전한 정리&lt;/b&gt;까지 고려하면 subprocess가 더 단순.&lt;/li&gt;
&lt;li data-end=&quot;1778&quot; data-start=&quot;1731&quot;&gt;&lt;b&gt;로그/배포/롤백&lt;/b&gt;을 OS 수준에서 다루고 싶다 &amp;rarr; subprocess ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1783&quot; data-start=&quot;1780&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1796&quot; data-start=&quot;1785&quot; data-ke-size=&quot;size26&quot;&gt;실전 패턴 모음&lt;/h2&gt;
&lt;h3 data-end=&quot;1837&quot; data-start=&quot;1798&quot; data-ke-size=&quot;size23&quot;&gt;1) subprocess 비블로킹 실행(환경변수&amp;middot;로그&amp;middot;신호)&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1760574892631&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os, subprocess, signal
from pathlib import Path

APP_DIR = Path(&quot;/path/to/app&quot;)
PY      = &quot;/path/to/venv/bin/python3&quot;
SCRIPT  = str(APP_DIR / &quot;worker.py&quot;)

env = os.environ.copy()
env[&quot;WORKER_PROGRESS&quot;] = &quot;1&quot;
env[&quot;WORKER_INTERVAL&quot;] = &quot;0.5&quot;

log = open(str(APP_DIR/&quot;runlogs/worker.log&quot;), &quot;a+&quot;, buffering=1)
p = subprocess.Popen(
    [PY, SCRIPT, &quot;--archive&quot;, &quot;tar.gz&quot;],
    cwd=str(APP_DIR), env=env,
    stdout=log, stderr=subprocess.STDOUT,
    start_new_session=True  # 프로세스 그룹 분리 &amp;rarr; 신호 제어/정리 용이
)
# &amp;hellip; 부모는 즉시 다음 일 수행
# os.kill(p.pid, signal.SIGUSR1)  # 취소(사용자)
# p.terminate(); p.wait(timeout=10)  # 그레이스풀 종료 &amp;rarr; 필요시 SIGKILL&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2496&quot; data-start=&quot;2484&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결과 전달&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2588&quot; data-start=&quot;2497&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2515&quot; data-start=&quot;2497&quot;&gt;간단: 종료코드(0/비0)&lt;/li&gt;
&lt;li data-end=&quot;2555&quot; data-start=&quot;2516&quot;&gt;중간: stdout 한 줄 JSON / 지정된 파일에 결과 기록&lt;/li&gt;
&lt;li data-end=&quot;2588&quot; data-start=&quot;2556&quot;&gt;고급: 작업자가 서버에 직접 보고(부모는 상태만 확인)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;2628&quot; data-start=&quot;2590&quot; data-ke-size=&quot;size23&quot;&gt;2) multiprocessing으로 파이썬 콜러블 병렬화&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1760574927079&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from multiprocessing import Process, Queue
import time

def worker(cfg, q: Queue):
    # &amp;hellip; 작업 &amp;hellip;
    q.put({&quot;result&quot;: &quot;ok&quot;, &quot;took&quot;: 1.23})

q = Queue()
p = Process(target=worker, args=({&quot;archive&quot;: &quot;tar.gz&quot;}, q))
p.start()            # 비블로킹
msg = q.get()        # 필요 시 결과 수신(블로킹/타임아웃 조절)
p.join()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3002&quot; data-start=&quot;2939&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;팁&lt;/b&gt;: 네트워크/이벤트루프 초기화는 &lt;b&gt;자식 프로세스 내부에서&lt;/b&gt; 새로 열기(특히 fork 환경 주의).&lt;/p&gt;
&lt;hr data-end=&quot;3007&quot; data-start=&quot;3004&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3023&quot; data-start=&quot;3009&quot; data-ke-size=&quot;size26&quot;&gt;흔한 함정 &amp;amp; 예방책&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3342&quot; data-start=&quot;3025&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3099&quot; data-start=&quot;3025&quot;&gt;&lt;b&gt;데드락&lt;/b&gt;: 파이프(stdout=PIPE)를 열었다면 **communicate()**로 비우거나 파일로 리다이렉트.&lt;/li&gt;
&lt;li data-end=&quot;3187&quot; data-start=&quot;3100&quot;&gt;&lt;b&gt;신호 전파&lt;/b&gt;: 리눅스에선 start_new_session=True 또는 os.setsid()로 그룹 분리 후 원하는 신호만 명확히 전송.&lt;/li&gt;
&lt;li data-end=&quot;3274&quot; data-start=&quot;3188&quot;&gt;&lt;b&gt;spawn 규율&lt;/b&gt;(multiprocessing): 전역 실행 금지, __main__ 가드, import 순서, 전역 상태 초기화 유의.&lt;/li&gt;
&lt;li data-end=&quot;3342&quot; data-start=&quot;3275&quot;&gt;&lt;b&gt;깨끗한 종료&lt;/b&gt;: SIGTERM/취소 플래그를 받은 후 &lt;b&gt;파일/소켓/세션&lt;/b&gt;을 확실히 정리(특히 비동기 루프).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3347&quot; data-start=&quot;3344&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3358&quot; data-start=&quot;3349&quot; data-ke-size=&quot;size26&quot;&gt;최종 한 줄&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3475&quot; data-start=&quot;3359&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3417&quot; data-start=&quot;3359&quot;&gt;&lt;b&gt;독립 실행체(서비스처럼)로 돌리고, 운영&amp;middot;배포&amp;middot;격리를 단순화&lt;/b&gt;하려면 subprocess.&lt;/li&gt;
&lt;li data-end=&quot;3475&quot; data-start=&quot;3418&quot;&gt;&lt;b&gt;파이썬 객체를 촘촘히 교환하며 함수 단위 병렬화&lt;/b&gt;가 핵심이면 multiprocessing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3579&quot; data-start=&quot;3477&quot; data-ke-size=&quot;size16&quot;&gt;당장 깔끔하게 가려면 subprocess로 시작하고, &lt;b&gt;정말&lt;/b&gt; 밀도 높은 상호작용이 필요해지는 지점에서만 multiprocessing으로 전환을 검토하는 전략이 안전합니다.&lt;/p&gt;</description>
      <category>IT/python</category>
      <category>multiprocessing</category>
      <category>Python</category>
      <category>subprocess</category>
      <category>외부 모듈 실행</category>
      <category>파이썬</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/382</guid>
      <comments>https://simryang.tistory.com/entry/python3-%EB%8F%99%EA%B8%B0-%EC%BD%94%EB%93%9C%EC%97%90%EC%84%9C-%E2%80%9C%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%9E%91%EC%97%85%EC%9E%90%E2%80%9D%EB%A5%BC-%EB%B3%84%EB%8F%84-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EB%A1%9C-%EB%8F%8C%EB%A6%AC%EA%B8%B0-%E2%80%94-subprocess-vs-multiprocessing-%EC%84%A0%ED%83%9D-%EA%B0%80%EC%9D%B4%EB%93%9C#entry382comment</comments>
      <pubDate>Thu, 16 Oct 2025 09:36:41 +0900</pubDate>
    </item>
    <item>
      <title>scp 실행 시 setlocale: LC_ALL: cannot change locale (ko_KR.UTF-8) 경고 해결 가이드</title>
      <link>https://simryang.tistory.com/entry/scp-%EC%8B%A4%ED%96%89-%EC%8B%9C-setlocale-LCALL-cannot-change-locale-koKRUTF-8-%EA%B2%BD%EA%B3%A0-%ED%95%B4%EA%B2%B0-%EA%B0%80%EC%9D%B4%EB%93%9C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;본 경고는 &lt;b&gt;서버에 ko_KR.UTF-8 로케일(locale)이 없는데 SSH가 클라이언트의 로케일 환경변수(LANG, LC_*)를 전달&lt;/b&gt;하여 발생합니다.&lt;br /&gt;해결 방법은 ① 서버에 로케일을 생성(권장) ② 클라이언트에서 로케일 전달을 차단 ③ 서버에서 로케일 수락을 비활성화 중 하나를 선택하시면 충분합니다.&lt;/p&gt;
&lt;h2 data-end=&quot;404&quot; data-start=&quot;399&quot; data-ke-size=&quot;size26&quot;&gt;원인&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;511&quot; data-start=&quot;405&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;455&quot; data-start=&quot;405&quot;&gt;SSH SendEnv/AcceptEnv로 클라이언트 로케일이 서버로 전달됩니다.&lt;/li&gt;
&lt;li data-end=&quot;511&quot; data-start=&quot;456&quot;&gt;서버에 ko_KR.UTF-8이 없으면 setlocale()이 실패하여 경고가 출력됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;516&quot; data-start=&quot;513&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;526&quot; data-start=&quot;518&quot; data-ke-size=&quot;size26&quot;&gt;해결 방법&lt;/h2&gt;
&lt;h3 data-end=&quot;549&quot; data-start=&quot;528&quot; data-ke-size=&quot;size23&quot;&gt;1) 서버에 로케일 생성(권장)&lt;/h3&gt;
&lt;h4 data-end=&quot;567&quot; data-start=&quot;550&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Debian/Ubuntu&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1759112314700&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo &quot;ko_KR.UTF-8 UTF-8&quot; | sudo tee -a /etc/locale.gen
sudo locale-gen
sudo update-locale LANG=ko_KR.UTF-8 LC_ALL=ko_KR.UTF-8&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;733&quot; data-start=&quot;707&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;733&quot; data-start=&quot;707&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;RHEL/CentOS/Alma/Rocky&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1759112344172&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo dnf install -y glibc-langpack-ko || sudo yum install -y glibc-langpack-ko
# 또는
sudo localedef -f UTF-8 -i ko_KR ko_KR.UTF-8&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;905&quot; data-start=&quot;876&quot; data-ke-size=&quot;size23&quot;&gt;2) 클라이언트에서 로케일 전달 차단(일회성)&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1759112422204&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;LC_ALL=C LANG=C \ 
scp -i /path/to/ssh_key.pem \ 
    /path/to/package.tar.xz \ 
    user@example.host:remote/target/dir/

# 또는, 해당 호출에서만 SendEnv 비활성 
scp -o SendEnv= \ 
    -i /path/to/ssh_key.pem \ 
    /path/to/package.tar.xz \ 
    user@example.host:remote/target/dir/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1215&quot; data-start=&quot;1185&quot; data-ke-size=&quot;size23&quot;&gt;3) 서버에서 로케일 수락 비활성화(정책 선택)&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1759112454861&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# /etc/ssh/sshd_config
# AcceptEnv LANG LC_* # &amp;larr; 주석 처리
sudo systemctl restart sshd&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1317&quot; data-start=&quot;1314&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1324&quot; data-start=&quot;1319&quot; data-ke-size=&quot;size26&quot;&gt;검증&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 로케일 생성 만으로 문제를 해결했습니다.&lt;/p&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1759112595028&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 서버에서 로케일 존재 확인
locale -a | grep ko_KR

# scp 재시도(경고 미발생 확인)
scp -i /path/to/ssh_key.pem /path/to/package.tar.xz user@example.host:remote/target/dir/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;1492&quot; data-start=&quot;1489&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1502&quot; data-start=&quot;1494&quot; data-ke-size=&quot;size26&quot;&gt;체크리스트&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1635&quot; data-start=&quot;1503&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1552&quot; data-start=&quot;1503&quot;&gt;서버에 ko_KR.UTF-8 생성 또는 정책적으로 로케일 전달 비활성화&lt;/li&gt;
&lt;li data-end=&quot;1589&quot; data-start=&quot;1553&quot;&gt;필요 시 update-locale로 기본값 고정&lt;/li&gt;
&lt;li data-end=&quot;1635&quot; data-start=&quot;1590&quot;&gt;CI/일회성 전송은 LC_ALL=C LANG=C로 간단히 회피 가능&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>IT</category>
      <category>DevOps</category>
      <category>infra</category>
      <category>Linux</category>
      <category>locale</category>
      <category>SCP</category>
      <category>ssh</category>
      <category>Troubleshooting</category>
      <category>로케일</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/380</guid>
      <comments>https://simryang.tistory.com/entry/scp-%EC%8B%A4%ED%96%89-%EC%8B%9C-setlocale-LCALL-cannot-change-locale-koKRUTF-8-%EA%B2%BD%EA%B3%A0-%ED%95%B4%EA%B2%B0-%EA%B0%80%EC%9D%B4%EB%93%9C#entry380comment</comments>
      <pubDate>Mon, 29 Sep 2025 11:24:10 +0900</pubDate>
    </item>
    <item>
      <title>Loguru를 활용한 파이썬 로깅 시스템 정리: 중앙 설정 방식 연구</title>
      <link>https://simryang.tistory.com/entry/Loguru%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%A1%9C%EA%B9%85-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EC%A0%95%EB%A6%AC-%EC%A4%91%EC%95%99-%EC%84%A4%EC%A0%95-%EB%B0%A9%EC%8B%9D-%EC%97%B0%EA%B5%AC</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬 프로젝트의 복잡한 로그 관리를 Loguru 중앙 설정 방식으로 해결하는 방법을 정리했습니다. 멀티프로세스 환경에서도 충돌 없는 안전한 로깅, 레벨별 파일 분리, JSON 출력까지, 실전 예제 코드도 함께 보세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬 프로젝트를 진행하면서 print()를 사용한 디버깅에서 벗어나 체계적인 로그 관리의 필요성을 느끼게 되었습니다.&amp;nbsp;특히 여러 모듈과 프로세스에서 동시에 로그를 남길 때, 설정이 중복되거나 로그가 충돌하는 등의 문제점을 경험했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 문제를 해결하기 위해 Loguru 라이브러리의 중앙 설정(log_config.py) 방식을 학습하고 그 내용을 정리해 보았습니다. 이 방식은 프로젝트 로깅 시스템의 구조를 개선하는 데 유용한 접근법이라고 생각합니다.&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;중앙 설정 파일 log_config.py 구성하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, 로깅 시스템의 핵심이 될 log_config.py 파일을 구성합니다. 이 파일에 모든 정책과 설정을 집중시켜 다른 모듈들이 참조하도록 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;log_config.py&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1758024008762&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os
import sys
from loguru import logger

# --------------------------------------------------------------------
#               # 프로젝트 로깅 설정 연구
# --------------------------------------------------------------------

# 1. 기본 핸들러 제거: 중복 로깅 방지를 위해 초기화
logger.remove()

# 2. 환경 변수를 이용한 로그 레벨 설정: 동적 레벨 제어를 위함
#    - 예: LOG_LEVEL=DEBUG python app_a.py
LOG_LEVEL = os.getenv(&quot;LOG_LEVEL&quot;, &quot;INFO&quot;)

# 3. 로그 파일 저장 경로 설정
LOG_DIR = &quot;logs&quot;
os.makedirs(LOG_DIR, exist_ok=True)

# 4. 공통 포맷 정의: 로그의 일관성을 위함
COMMON_LOG_FORMAT = (
    &quot;&amp;lt;green&amp;gt;{time:YYYY-MM-DD HH:mm:ss.SSS}&amp;lt;/green&amp;gt; | &quot;
    &quot;&amp;lt;level&amp;gt;{level: &amp;lt;8}&amp;lt;/level&amp;gt; | &quot;
    &quot;&amp;lt;cyan&amp;gt;{extra[app_name]: &amp;lt;10}&amp;lt;/cyan&amp;gt; | &quot;
    &quot;&amp;lt;level&amp;gt;{message}&amp;lt;/level&amp;gt;&quot;
)

# ------------------- # 핸들러별 설정 -------------------

# 핸들러 1: 콘솔 출력용
# 실시간 확인을 위해 INFO 레벨 이상을 대상으로 함
logger.add(
    sys.stdout,
    level=LOG_LEVEL,
    format=COMMON_LOG_FORMAT,
    colorize=True
)

# 핸들러 2: 일반 파일 출력용
# 모든 상세 로그(DEBUG 이상)를 시간별 파일로 저장
logger.add(
    os.path.join(LOG_DIR, &quot;{time:YYYY-MM-DD_HH}.log&quot;),
    level=&quot;DEBUG&quot;,
    format=&quot;{time:YYYY-MM-DD HH:mm:ss.SSS} | {level: &amp;lt;8} | {extra[app_name]: &amp;lt;10} | {name}:{function}:{line} - {message}&quot;,
    rotation=&quot;1 hour&quot;,
    retention=&quot;3 days&quot;,
    compression=&quot;zip&quot;,
    enqueue=True,  # 프로세스/스레드 안전성 확보
    backtrace=True,
    diagnose=True
)

# 핸들러 3: 에러 파일 출력용
# ERROR 레벨 이상의 로그만 별도 파일로 분리하여 관리 효율 증대
logger.add(
    os.path.join(LOG_DIR, &quot;error.log&quot;),
    level=&quot;ERROR&quot;,
    format=&quot;{time:YYYY-MM-DD HH:mm:ss.SSS} | {level: &amp;lt;8} | {extra[app_name]: &amp;lt;10} | {name}:{function}:{line} - {message}&quot;,
    rotation=&quot;10 MB&quot;,
    retention=&quot;1 week&quot;,
    enqueue=True,
    backtrace=True,
    diagnose=True
)

# 핸들러 4: JSON 파일 출력용
# 기계 분석을 고려한 구조화된 로깅 방식
logger.add(
    os.path.join(LOG_DIR, &quot;events.json&quot;),
    level=&quot;INFO&quot;,
    format=&quot;{message}&quot;,
    serialize=True, # 로그를 JSON으로 직렬화
    enqueue=True,
    backtrace=True,
    diagnose=True
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;모듈별 적용 예시&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 구성한 log_config.py를 각기 다른 역할을 가진 세 개의 애플리케이션 모듈에서 어떻게 활용하는지 살펴봅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로젝트 구조&lt;/b&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjq_P3y-duPAxUAAAAAHQAAAAAQ2wQ&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;my_project/
├── logs/
├── log_config.py      # 중앙 로깅 설정
├── app_a.py           # 모듈 A (주기적 작업)
├── app_b.py           # 모듈 B (요청 처리)
└── app_c.py           # 모듈 C (예외 처리)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;app_a.py - 백그라운드 스케줄러&lt;/h4&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjq_P3y-duPAxUAAAAAHQAAAAAQ3AQ&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;Python&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;# app_a.py
import time
from log_config import logger

log = logger.bind(app_name=&quot;Scheduler&quot;)

def run_scheduler():
    log.info(&quot;스케줄러 시작.&quot;)
    for i in range(3):
        log.debug(f&quot;작업 {i+1} 확인...&quot;)
        time.sleep(1)
        log.info(f&quot;작업 {i+1} 완료.&quot;)
    log.success(&quot;모든 작업 완료.&quot;)

if __name__ == &quot;__main__&quot;:
    run_scheduler()
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;app_b.py - API 서버 요청 처리&lt;/h4&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjq_P3y-duPAxUAAAAAHQAAAAAQ3QQ&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;Python&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;# app_b.py
import time
import random
from log_config import logger

log = logger.bind(app_name=&quot;API-Server&quot;)

def handle_request(user_id: str):
    request_id = f&quot;REQ-{random.randint(1000, 9999)}&quot;
    context_log = log.patch(lambda record: record[&quot;extra&quot;].update(request_id=request_id))

    context_log.info(f&quot;'{user_id}' 요청 수신&quot;)
    time.sleep(0.5)
    if user_id == &quot;guest&quot;:
        context_log.warning(&quot;제한된 권한으로 처리.&quot;)
    context_log.success(&quot;요청 처리 완료.&quot;)

if __name__ == &quot;__main__&quot;:
    handle_request(&quot;admin&quot;)
    handle_request(&quot;guest&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;app_c.py - 데이터 처리 및 예외 발생&lt;/h4&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjq_P3y-duPAxUAAAAAHQAAAAAQ3gQ&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;&lt;span&gt;Python&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;# app_c.py
import time
from log_config import logger

log = logger.bind(app_name=&quot;Data-Worker&quot;)

def process_data(data):
    try:
        log.info(f&quot;데이터 처리 시작: {data}&quot;)
        result = data['value'] / data['divisor']
        log.success(f&quot;처리 결과: {result}&quot;)
        return result
    except Exception as e:
        log.exception(f&quot;처리 중 오류 발생: {e}&quot;)

if __name__ == &quot;__main__&quot;:
    process_data({'value': 100, 'divisor': 5})
    process_data({'value': 100, 'divisor': 0}) # 오류 발생
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 실행 및 결과 분석&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세 개의 스크립트를 각각 다른 터미널에서 실행하면, logs 디렉터리에 로그 파일들이 생성됩니다. 각 파일의 내용을 통해 설정이 의도대로 동작했는지 분석할 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;YYYY-MM-DD_HH.log&lt;/b&gt;: 세 애플리케이션의 DEBUG 레벨 이상 로그가 시간 순서에 맞게, 충돌 없이 기록된 것을 확인할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;error.log&lt;/b&gt;: app_c.py에서 발생한 ZeroDivisionError 관련 로그만 분리되어 저장되어 있어, 오류 추적이 용이합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;events.json&lt;/b&gt;: 로그가 JSON 형식으로 구조화되어 있어, 향후 자동화된 분석 시스템에 입력 데이터로 활용할 수 있음을 보여줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정리 및 고찰&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Loguru를 활용한 중앙 로깅 설정 방식은 다음과 같은 장점이 있다고 판단됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;유지보수성&lt;/b&gt;: 로깅 정책 변경 시 log_config.py만 수정하면 되므로 관리가 용이합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;안정성&lt;/b&gt;: enqueue=True 옵션을 통해 다중 프로세스 환경에서도 로그의 무결성을 보장할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;가독성 및 관심사 분리&lt;/b&gt;: 애플리케이션 로직과 로깅 설정을 분리하여 코드의 가독성을 높이고, 개발자가 비즈니스 로직에 더 집중할 수 있도록 돕습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만, log_config.py가 다른 모듈을 참조할 때 발생할 수 있는 순환 참조 문제 등은 설계 시 주의가 필요해 보입니다.&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;</description>
      <category>IT/python</category>
      <category>logging</category>
      <category>Loguru</category>
      <category>process-safe</category>
      <category>Python</category>
      <category>디버깅</category>
      <category>로그 관리</category>
      <category>파이썬</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/379</guid>
      <comments>https://simryang.tistory.com/entry/Loguru%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%A1%9C%EA%B9%85-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EC%A0%95%EB%A6%AC-%EC%A4%91%EC%95%99-%EC%84%A4%EC%A0%95-%EB%B0%A9%EC%8B%9D-%EC%97%B0%EA%B5%AC#entry379comment</comments>
      <pubDate>Tue, 16 Sep 2025 21:03:44 +0900</pubDate>
    </item>
    <item>
      <title>네오스타일로5.0 neostylo5.0 갤럭시s25 ultra</title>
      <link>https://simryang.tistory.com/entry/%EB%84%A4%EC%98%A4%EC%8A%A4%ED%83%80%EC%9D%BC%EB%A1%9C50-neostylo50-%EA%B0%A4%EB%9F%AD%EC%8B%9Cs25-ultra</link>
      <description>&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cnSEWX/dJMb9MJs7h5/LoKHO770X7GHrC7SUlUhfk/neostylo5_android15_quick_signed.apk?attach=1&amp;amp;knm=tfile.apk&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;neostylo5_android15_quick_signed.apk&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;1.88MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;자판 입력만 가능하고 상용구 같은 기능은 안됩니다&lt;br /&gt;정확히는 상용구 수정한 내용 저장이 안됩니다. 그러니까 안되는거랑 같죠..&lt;br /&gt;그 외에 안되는 기능들 많을 수 있습니다..&lt;br /&gt;원본 소스가 없어서..&lt;br /&gt;한계가 있네요&lt;br /&gt;&lt;br /&gt;원래는 삼성 기본 자판과 드래그 입력에 적응해보려고 노력했는데..&lt;br /&gt;화딱지 나는 드래그 입력 정확도에 ..&lt;br /&gt;지맘대로 엉뚱하게 바꿔버리는 인공지능 땜에.. &lt;br /&gt;참다참다 화딱지 나서 스말리 만져보다가 일단 이 정도라도 공유해보자 하는 마음에 글 작성합니다.&lt;br /&gt;&lt;br /&gt;저작권에 문제가 된다면 글 비공개처리 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;연락주세요&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #7fa9ff;&quot; href=&quot;https://gogoomma.tistory.com&quot;&gt;고굼마&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;기존의 상용구 수정한 내용 저장이 안되는 것과 동일한 문제인 것 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/NEw1h/dJMcacPeoKW/JMCT8RkEDaNkTKAyzISwb1/neostylo5_android15_v13_signed.apk?attach=1&amp;amp;knm=tfile.apk&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;neostylo5_android15_v13_signed.apk&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;1.88MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상용구 저장 안되는 문제를 수정한 버전을 공개합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bjJRmU/dJMcahJZ52A/Y1AtgDAOWID6f3vK7pEYHK/neostylo5_android15_v16_signed.apk?attach=1&amp;amp;knm=tfile.apk&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;neostylo5_android15_v16_signed.apk&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;1.88MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>IT</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/378</guid>
      <comments>https://simryang.tistory.com/entry/%EB%84%A4%EC%98%A4%EC%8A%A4%ED%83%80%EC%9D%BC%EB%A1%9C50-neostylo50-%EA%B0%A4%EB%9F%AD%EC%8B%9Cs25-ultra#entry378comment</comments>
      <pubDate>Tue, 19 Aug 2025 23:24:19 +0900</pubDate>
    </item>
    <item>
      <title>Power on Reset(POR) 이 뭔가요?</title>
      <link>https://simryang.tistory.com/entry/Power-on-ResetPOR-%EC%9D%B4-%EB%AD%94%EA%B0%80%EC%9A%94</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Power On Reset(POR)이 잘 이해되지 않아, 기초부터 직접 찾아보고 정리한 글입니다.&lt;br /&gt;함께 기본 개념을 하나씩 풀어봅시다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Power on Reset(POR)이란?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;**Power on Reset(POR)**는 전자기기(특히 IC, 마이크로컨트롤러 등)에 전원이 처음 들어올 때, 기기가 항상 똑같은(정상적인) 상태에서 시작하도록 만들어주는 회로 또는 기능입니다&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;.&lt;/span&gt;쉽게 말해, 전원이 켜질 때 내부 회로가 엉뚱한 동작을 하지 않게 &amp;ldquo;잠깐 멈춰!&amp;rdquo;라고 신호를 주는 역할입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 왜 POR이 필요한가?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전원이 들어오면 바로 모든 부품이 안정적으로 동작하는 게 아니라, 잠깐 동안 전압이 불안정할 수 있습니다.&lt;/li&gt;
&lt;li&gt;이때 바로 동작을 시작하면 내부 데이터가 꼬이거나, 오작동할 수 있습니다.&lt;/li&gt;
&lt;li&gt;POR은 전압이 안정될 때까지 &amp;ldquo;리셋(Reset)&amp;rdquo; 상태를 유지하다가, 충분히 안정되면 정상 동작을 시작하게 해줍니다&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. POR 회로의 기본 원리&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가장 간단한 POR 회로는 **저항(Resistor)과 커패시터(콘덴서, Capacitor)**를 조합해서 만듭니다.&lt;/li&gt;
&lt;li&gt;전원이 켜지면, 커패시터가 천천히 충전되면서 회로에 &amp;ldquo;딜레이(지연)&amp;rdquo;를 줍니다.&lt;/li&gt;
&lt;li&gt;이 딜레이 덕분에, 리셋 신호가 잠시 유지되고 전압이 안정된 후에야 정상 동작이 시작됩니다&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;커패시터의 용량(Capacity)과 저항값(Resistance)에 따라 이 딜레이 시간(리셋 유지 시간)이 결정됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 실제 동작 예시&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전원이 켜짐 &amp;rarr; 커패시터가 충전됨(전압이 천천히 올라감) &amp;rarr; 이 동안 IC의 리셋 핀이 &amp;ldquo;Low(활성)&amp;rdquo; 상태로 유지됨 &amp;rarr; 커패시터가 충분히 충전되면 리셋 신호가 해제됨 &amp;rarr; IC가 정상적으로 동작 시작&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;만약 커패시터 없이 단순히 저항만 쓴다면, 리셋 신호가 너무 빨리 풀려서 제대로 초기화가 안 될 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. POR IC(전용 칩)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;더 정밀하고 확실한 동작을 위해, &amp;ldquo;POR IC&amp;rdquo;라는 전용 칩을 쓰기도 합니다.&lt;/li&gt;
&lt;li&gt;이 칩은 내부적으로 위와 같은 원리(전압 감시, 딜레이 등)를 더 정밀하게 구현해줍니다&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;한눈에 보는 요약&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;구분설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;POR 목적&lt;/td&gt;
&lt;td&gt;전원이 켜질 때 기기가 항상 정상 상태로 시작하게 해줌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;기본 원리&lt;/td&gt;
&lt;td&gt;저항+커패시터로 딜레이를 만들어 리셋 신호를 일정 시간 유지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;왜 필요한가?&lt;/td&gt;
&lt;td&gt;전압이 안정되기 전에 오작동 방지, 데이터 꼬임 방지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;응용&lt;/td&gt;
&lt;td&gt;간단한 회로(저항+커패시터), 또는 전용 POR IC 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;추가 설명(그래도 감이 안올 때!!)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;POR은 &amp;ldquo;신호등&amp;rdquo;과 비슷합니다.&lt;/b&gt;&lt;br /&gt;전원이 들어오자마자 바로 차가 달리면 사고가 날 수 있으니, 신호등이 잠깐 멈추게 했다가 파란불이 들어오면 출발하는 것과 같습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;커패시터는 &amp;ldquo;모래시계&amp;rdquo;&lt;/b&gt;&lt;br /&gt;모래시계가 다 떨어질 때까지 기다렸다가, 다 떨어지면 출발하는 것과 비슷합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고자료&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Wikipedia, &amp;ldquo;Power‑on reset&amp;rdquo; &lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Power-on_reset?utm_source=chatgpt.com&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Wikipedia&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;2311&quot; data-start=&quot;2207&quot;&gt;Texas&amp;nbsp;Instruments, Generate a Power‑On Reset Pulse (SCET013) &lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://www.ti.com/lit/pdf/scet013?utm_source=chatgpt.com&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Texas Instruments&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;2410&quot; data-start=&quot;2312&quot;&gt;Microchip Developer Help, &amp;ldquo;8‑bit PIC MCU Power‑on Reset&amp;rdquo; &lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://developerhelp.microchip.com/xwiki/bin/view/products/mcu-mpu/8bit-pic/reset-options/power-on-reset/?utm_source=chatgpt.com&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Developer Help&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;2501&quot; data-start=&quot;2411&quot;&gt;WIZnet, W5500 Datasheet &amp;ndash; Reset Timing Section &lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://docs.wiznet.io/img/products/w5500/W5500_ds_v110e.pdf?utm_source=chatgpt.com&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;WIZnet Document System&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;2593&quot; data-start=&quot;2502&quot;&gt;CircuitFutura, &amp;ldquo;Power‑On Reset Circuit Diagram&amp;rdquo; &lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://circuitfutura.com/power/power-on-reset-circuit-diagram/?utm_source=chatgpt.com&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Circuit Futura&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-is-last-node=&quot;&quot; data-end=&quot;2681&quot; data-start=&quot;2594&quot;&gt;HardwareBee, &amp;ldquo;Introduction to Power‑on‑Reset&amp;rdquo; &lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://hardwarebee.com/introduction-to-power-on-reset-circuit/?utm_source=chatgpt.com&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;HardwareBee&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt; &lt;/p&gt;</description>
      <category>IT/IoT</category>
      <category>Por</category>
      <category>power on reset</category>
      <category>기초 개념</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/377</guid>
      <comments>https://simryang.tistory.com/entry/Power-on-ResetPOR-%EC%9D%B4-%EB%AD%94%EA%B0%80%EC%9A%94#entry377comment</comments>
      <pubDate>Tue, 15 Jul 2025 09:32:22 +0900</pubDate>
    </item>
    <item>
      <title>대용량 로그 파일, 줄 번호로 필요한 구간만 정확히 추출하는 방법</title>
      <link>https://simryang.tistory.com/entry/%EB%8C%80%EC%9A%A9%EB%9F%89-%EB%A1%9C%EA%B7%B8-%ED%8C%8C%EC%9D%BC-%EC%A4%84-%EB%B2%88%ED%98%B8%EB%A1%9C-%ED%95%84%EC%9A%94%ED%95%9C-%EA%B5%AC%EA%B0%84%EB%A7%8C-%EC%A0%95%ED%99%95%ED%9E%88-%EC%B6%94%EC%B6%9C%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</link>
      <description>&lt;p data-end=&quot;438&quot; data-start=&quot;367&quot; data-ke-size=&quot;size16&quot;&gt;대용량 로그 파일을 열어야 하는 상황,&lt;br /&gt;용량이 너무 커서 에디터가 멈추거나 터미널이 반응하지 않으면 당황스러울 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;487&quot; data-start=&quot;440&quot; data-ke-size=&quot;size16&quot;&gt;이 글에서는 줄 번호를 이용해&lt;br /&gt;원하는 구간만 정확하게 추출하는 방법을 정리합니다.&lt;/p&gt;
&lt;p data-end=&quot;487&quot; data-start=&quot;440&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;561&quot; data-start=&quot;494&quot; data-ke-size=&quot;size16&quot;&gt;어느 날 로그 파일을 열어보려는데,&lt;br /&gt;파일이 너무 커서 열리지 않았습니다.&lt;br /&gt;크기를 보니 수 기가바이트에 달했습니다.&lt;/p&gt;
&lt;p data-end=&quot;596&quot; data-start=&quot;563&quot; data-ke-size=&quot;size16&quot;&gt;에디터는 멈췄고,&lt;br /&gt;터미널에서도 파일을 열 수 없었습니다.&lt;/p&gt;
&lt;p data-end=&quot;648&quot; data-start=&quot;598&quot; data-ke-size=&quot;size16&quot;&gt;하지만 포기할 순 없었습니다.&lt;br /&gt;그 안에는 반드시 확인해야 할 기록이 있었기 때문입니다.&lt;/p&gt;
&lt;hr data-end=&quot;653&quot; data-start=&quot;650&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;684&quot; data-start=&quot;655&quot; data-ke-size=&quot;size23&quot;&gt;필요한 건 전체가 아니라 '한 구간'입니다&lt;/h3&gt;
&lt;p data-end=&quot;754&quot; data-start=&quot;685&quot; data-ke-size=&quot;size16&quot;&gt;대부분 로그 파일을 전부 살펴볼 필요는 없습니다.&lt;br /&gt;특정 에러가 발생한 지점과 그 주변 몇 줄이면 충분한 경우가 많습니다.&lt;/p&gt;
&lt;p data-end=&quot;783&quot; data-start=&quot;756&quot; data-ke-size=&quot;size16&quot;&gt;핵심은 필요한 구간만 정확하게 꺼내오는 것입니다.&lt;/p&gt;
&lt;hr data-end=&quot;788&quot; data-start=&quot;785&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;814&quot; data-start=&quot;790&quot; data-ke-size=&quot;size23&quot;&gt;Step 1: 시작 줄 번호 찾기&lt;/h3&gt;
&lt;p data-end=&quot;846&quot; data-start=&quot;815&quot; data-ke-size=&quot;size16&quot;&gt;우선, 찾고자 하는 내용을 포함한 줄 번호를 확인합니다.&lt;/p&gt;
&lt;h4 data-end=&quot;864&quot; data-start=&quot;848&quot; data-ke-size=&quot;size20&quot;&gt;grep 명령어 사용&lt;/h4&gt;
&lt;pre id=&quot;code_1752034346076&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;grep -n &quot;찾을 키워드&quot; server.log&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;928&quot; data-start=&quot;904&quot; data-ke-size=&quot;size16&quot;&gt;-n 옵션은 줄 번호를 함께 표시합니다.&lt;/p&gt;
&lt;h4 data-end=&quot;937&quot; data-start=&quot;930&quot; data-ke-size=&quot;size20&quot;&gt;예시&lt;/h4&gt;
&lt;pre id=&quot;code_1752034555779&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;grep -n &quot;ERROR&quot; server.log&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;pre id=&quot;code_1752034604819&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;123456:ERROR Something went wrong&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1054&quot; data-start=&quot;1025&quot; data-ke-size=&quot;size16&quot;&gt;에러 메시지가 123456번째 줄에 있다는 뜻입니다.&lt;/p&gt;
&lt;h4 data-end=&quot;1076&quot; data-start=&quot;1056&quot; data-ke-size=&quot;size20&quot;&gt;첫 번째 항목만 찾고 싶다면&lt;/h4&gt;
&lt;pre id=&quot;code_1752034624003&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;grep -n -m 1 &quot;ERROR&quot; your.log&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1152&quot; data-start=&quot;1120&quot; data-ke-size=&quot;size16&quot;&gt;-m 1 옵션으로 첫 번째 결과만 표시할 수 있습니다.&lt;/p&gt;
&lt;hr data-end=&quot;1157&quot; data-start=&quot;1154&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1182&quot; data-start=&quot;1159&quot; data-ke-size=&quot;size23&quot;&gt;Step 2: 끝 줄 번호 찾기&lt;/h3&gt;
&lt;p data-end=&quot;1242&quot; data-start=&quot;1183&quot; data-ke-size=&quot;size16&quot;&gt;시작 줄 번호만 알아서는 충분하지 않습니다.&lt;br /&gt;끝 줄 번호도 정해야 범위를 정확하게 지정할 수 있습니다.&lt;/p&gt;
&lt;h4 data-end=&quot;1263&quot; data-start=&quot;1244&quot; data-ke-size=&quot;size20&quot;&gt;방법 1: 다음 에러 찾기&lt;/h4&gt;
&lt;pre id=&quot;code_1752034665530&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;grep -n -m 2 &quot;ERROR&quot; your.log&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;pre id=&quot;code_1752034690915&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;123456:ERROR Something went wrong  
130000:ERROR Another error occurred&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1458&quot; data-start=&quot;1395&quot; data-ke-size=&quot;size16&quot;&gt;여기서 끝 줄 번호는 두 번째 에러 줄 번호에서 1을 뺀 값입니다.&lt;br /&gt;즉, 130000 - 1 = 129999.&lt;/p&gt;
&lt;h4 data-end=&quot;1487&quot; data-start=&quot;1460&quot; data-ke-size=&quot;size20&quot;&gt;방법 2: 앞뒤 여유 줄 수로 범위 설정&lt;/h4&gt;
&lt;p data-end=&quot;1548&quot; data-start=&quot;1488&quot; data-ke-size=&quot;size16&quot;&gt;다음 에러가 너무 멀거나, 문맥 전체를 확인하고 싶다면&lt;br /&gt;앞뒤로 일정한 줄 수를 추가하는 방법이 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;1553&quot; data-start=&quot;1550&quot; data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1614&quot; data-start=&quot;1554&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1585&quot; data-start=&quot;1554&quot;&gt;시작 줄: 123456 - 500 = 122956&lt;/li&gt;
&lt;li data-end=&quot;1614&quot; data-start=&quot;1586&quot;&gt;끝 줄: 123456 + 500 = 123956&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1619&quot; data-start=&quot;1616&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1646&quot; data-start=&quot;1621&quot; data-ke-size=&quot;size23&quot;&gt;Step 3: 줄 번호 범위로 추출&lt;/h3&gt;
&lt;p data-end=&quot;1670&quot; data-start=&quot;1647&quot; data-ke-size=&quot;size16&quot;&gt;범위를 정했다면, 이제 추출할 차례입니다.&lt;/p&gt;
&lt;h4 data-end=&quot;1683&quot; data-start=&quot;1672&quot; data-ke-size=&quot;size20&quot;&gt;sed 사용&lt;/h4&gt;
&lt;pre id=&quot;code_1752034781003&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sed -n '122956,123956p' your.log &amp;gt; extracted.log&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;awk 사용&lt;/p&gt;
&lt;pre id=&quot;code_1752034802627&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;awk 'NR&amp;gt;=122956 &amp;amp;&amp;amp; NR&amp;lt;=123956' your.log &amp;gt; extracted.log&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;tail과 head 조합&lt;/p&gt;
&lt;pre id=&quot;code_1752034826834&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tail -n +122956 your.log | head -n 1001 &amp;gt; extracted.log&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1965&quot; data-start=&quot;1915&quot; data-ke-size=&quot;size16&quot;&gt;1001은 줄 수 계산에 따라 나온 값입니다.&lt;br /&gt;끝 줄 - 시작 줄 + 1 = 1001.&lt;/p&gt;
&lt;hr data-end=&quot;1970&quot; data-start=&quot;1967&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1995&quot; data-start=&quot;1972&quot; data-ke-size=&quot;size23&quot;&gt;Step 4: 추출한 로그 확인&lt;/h3&gt;
&lt;p data-end=&quot;2037&quot; data-start=&quot;1996&quot; data-ke-size=&quot;size16&quot;&gt;추출한 로그를 열어&lt;br /&gt;찾던 내용과 주변 문맥이 잘 포함됐는지 확인합니다.&lt;/p&gt;
&lt;p data-end=&quot;2065&quot; data-start=&quot;2039&quot; data-ke-size=&quot;size16&quot;&gt;필요하다면 범위를 조정해 다시 추출하면 됩니다.&lt;/p&gt;
&lt;hr data-end=&quot;2070&quot; data-start=&quot;2067&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2099&quot; data-start=&quot;2072&quot; data-ke-size=&quot;size23&quot;&gt;로그는 필요한 부분만 꺼내면 충분합니다&lt;/h3&gt;
&lt;p data-end=&quot;2145&quot; data-start=&quot;2100&quot; data-ke-size=&quot;size16&quot;&gt;용량이 아무리 큰 로그라도&lt;br /&gt;핵심 구간만 정확하게 추출하면 부담스럽지 않습니다.&lt;/p&gt;
&lt;p data-end=&quot;2191&quot; data-start=&quot;2147&quot; data-ke-size=&quot;size16&quot;&gt;줄 번호를 찾고, 범위를 정한 뒤,&lt;br /&gt;필요한 구간만 깔끔하게 추출하면 됩니다.&lt;/p&gt;
&lt;p data-end=&quot;2228&quot; data-start=&quot;2193&quot; data-ke-size=&quot;size16&quot;&gt;이 과정을 알면&lt;br /&gt;대용량 로그를 다루는 일도 어렵지 않습니다.&lt;/p&gt;
&lt;hr data-end=&quot;2233&quot; data-start=&quot;2230&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2248&quot; data-start=&quot;2235&quot; data-ke-size=&quot;size23&quot;&gt;핵심 명령어 요약&lt;/h3&gt;
&lt;pre id=&quot;code_1752034860090&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 시작 줄 번호 찾기
grep -n -m 1 &quot;에러메시지&quot; your.log

# 끝 줄 번호 찾기
grep -n -m 2 &quot;에러메시지&quot; your.log

# 또는 시작 줄 &amp;plusmn; 여유 줄 수

# 로그 추출
sed -n '시작줄,끝줄p' your.log &amp;gt; extracted.log

awk 'NR&amp;gt;=시작줄 &amp;amp;&amp;amp; NR&amp;lt;=끝줄' your.log &amp;gt; extracted.log

tail -n +시작줄 your.log | head -n (끝줄-시작줄+1) &amp;gt; extracted.log&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;2651&quot; data-start=&quot;2618&quot; data-ke-size=&quot;size23&quot;&gt;PS. 연속된 에러 구간을 자동으로 추출하는 방법&lt;/h3&gt;
&lt;p data-end=&quot;2751&quot; data-start=&quot;2652&quot; data-ke-size=&quot;size16&quot;&gt;에러가 연속으로 이어지는 구간에서,&lt;br /&gt;에러가 아닌 로그가 처음 등장하는 줄까지 자동으로 추출하고 싶을 때가 있습니다.&lt;br /&gt;아래 방법을 참고하면 이 과정을 자동화할 수 있습니다.&lt;/p&gt;
&lt;h4 data-end=&quot;2760&quot; data-start=&quot;2753&quot; data-ke-size=&quot;size20&quot;&gt;흐름&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2828&quot; data-start=&quot;2761&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2778&quot; data-start=&quot;2761&quot;&gt;첫 에러 줄 번호 찾기&lt;/li&gt;
&lt;li data-end=&quot;2812&quot; data-start=&quot;2779&quot;&gt;그 이후, 에러가 아닌 줄의 첫 등장 줄 번호 찾기&lt;/li&gt;
&lt;li data-end=&quot;2828&quot; data-start=&quot;2813&quot;&gt;두 줄 사이 범위 추출&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-end=&quot;2841&quot; data-start=&quot;2830&quot; data-ke-size=&quot;size20&quot;&gt;명령어 예시&lt;/h4&gt;
&lt;pre id=&quot;code_1752034904443&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;start_line=$(grep -n -m 1 &quot;ERROR&quot; your.log | cut -d: -f1)

end_line=$(awk -v start=&quot;$start_line&quot; 'NR &amp;gt;= start { if ($0 !~ /ERROR/) { print NR; exit } }' your.log)

sed -n &quot;${start_line},${end_line}p&quot; your.log &amp;gt; extracted.log&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-end=&quot;3087&quot; data-start=&quot;3080&quot; data-ke-size=&quot;size20&quot;&gt;설명&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3163&quot; data-start=&quot;3088&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3103&quot; data-start=&quot;3088&quot;&gt;첫 에러 줄부터 시작&lt;/li&gt;
&lt;li data-end=&quot;3133&quot; data-start=&quot;3104&quot;&gt;에러가 아닌 줄이 처음 등장하는 위치까지 추출&lt;/li&gt;
&lt;li data-end=&quot;3163&quot; data-start=&quot;3134&quot;&gt;에러가 몇 줄 반복되든 자동으로 범위를 잡습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;3176&quot; data-start=&quot;3165&quot; data-ke-size=&quot;size20&quot;&gt;응용 가능성&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3209&quot; data-start=&quot;3177&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3209&quot; data-start=&quot;3177&quot;&gt;에러 패턴만 바꾸면 다양한 상황에 활용할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3214&quot; data-start=&quot;3211&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;3227&quot; data-start=&quot;3216&quot; data-ke-size=&quot;size23&quot;&gt;마무리하며&lt;/h3&gt;
&lt;p data-end=&quot;3316&quot; data-start=&quot;3228&quot; data-ke-size=&quot;size16&quot;&gt;이 방법을 사용하면,&lt;br /&gt;로그를 일일이 읽지 않고도&lt;br /&gt;연속된 에러 구간을 정확히 추출할 수 있습니다.&lt;br /&gt;상황에 따라 필요한 방법을 선택해 활용하면 됩니다.&lt;/p&gt;</description>
      <category>IT/etc</category>
      <category>awk</category>
      <category>grep</category>
      <category>Log</category>
      <category>SED</category>
      <category>일부분</category>
      <category>자르기</category>
      <category>줄번호</category>
      <category>추출</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/376</guid>
      <comments>https://simryang.tistory.com/entry/%EB%8C%80%EC%9A%A9%EB%9F%89-%EB%A1%9C%EA%B7%B8-%ED%8C%8C%EC%9D%BC-%EC%A4%84-%EB%B2%88%ED%98%B8%EB%A1%9C-%ED%95%84%EC%9A%94%ED%95%9C-%EA%B5%AC%EA%B0%84%EB%A7%8C-%EC%A0%95%ED%99%95%ED%9E%88-%EC%B6%94%EC%B6%9C%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95#entry376comment</comments>
      <pubDate>Wed, 9 Jul 2025 13:22:39 +0900</pubDate>
    </item>
    <item>
      <title>Git 브랜치 강제 이동과 이름 변경, 진짜 안전하게 하는 방법</title>
      <link>https://simryang.tistory.com/entry/Git-%EB%B8%8C%EB%9E%9C%EC%B9%98-%EA%B0%95%EC%A0%9C-%EC%9D%B4%EB%8F%99%EA%B3%BC-%EC%9D%B4%EB%A6%84-%EB%B3%80%EA%B2%BD-%EC%A7%84%EC%A7%9C-%EC%95%88%EC%A0%84%ED%95%98%EA%B2%8C-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</link>
      <description>&lt;p data-end=&quot;421&quot; data-start=&quot;350&quot; data-ke-size=&quot;size16&quot;&gt;Git 브랜치 관리 중엔 &lt;b&gt;포인터 이동(브랜치 강제 이동)&lt;/b&gt;이나&lt;br /&gt;&lt;b&gt;브랜치 이름 변경&lt;/b&gt;이 필요한 순간이 꼭 찾아옵니다.&lt;/p&gt;
&lt;p data-end=&quot;470&quot; data-start=&quot;423&quot; data-ke-size=&quot;size16&quot;&gt;이번 글에서는 다음 두 가지 핵심 Git 작업을 &lt;b&gt;실전 사례&lt;/b&gt;로 쉽게 정리합니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;565&quot; data-start=&quot;472&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;517&quot; data-start=&quot;472&quot;&gt;&amp;nbsp;특정 커밋까지 브랜치 포인터 이동 (커밋 포함 효과, 커밋값 변경 없음)&lt;/li&gt;
&lt;li data-end=&quot;565&quot; data-start=&quot;518&quot;&gt;&amp;nbsp;브랜치 이름을 release/ 접두사로 변경하고, Remote까지 동기화&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-end=&quot;622&quot; data-start=&quot;572&quot; data-ke-size=&quot;size26&quot;&gt;깜빡하고 포함 못한 커밋, 안전하게 브랜치에 포함시키는 법 (포인터 이동)&lt;/h2&gt;
&lt;h3 data-end=&quot;632&quot; data-start=&quot;624&quot; data-ke-size=&quot;size23&quot;&gt;● 상황&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;704&quot; data-start=&quot;633&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;659&quot; data-start=&quot;633&quot;&gt;브랜치에 커밋을 깜빡하고 포함하지 못한 경우&lt;/li&gt;
&lt;li data-end=&quot;704&quot; data-start=&quot;660&quot;&gt;커밋 내용을 유지하면서 &lt;b&gt;커밋값(SHA)&lt;/b&gt;은 절대 건드리고 싶지 않을 때&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;724&quot; data-start=&quot;706&quot; data-ke-size=&quot;size23&quot;&gt;● 해결법 (핵심 명령어)&lt;/h3&gt;
&lt;pre id=&quot;code_1751852271460&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 브랜치 백업 (무조건 추천)
git branch backup_br2 br2

# 브랜치 포인터를 원하는 커밋으로 이동
git checkout br2
git reset --hard &amp;lt;원하는 커밋 ID&amp;gt;

# Remote에도 반영할 경우 (주의: 강제 push)
git push origin br2 --force&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-end=&quot;926&quot; data-start=&quot;913&quot; data-ke-size=&quot;size23&quot;&gt;● 왜 안전한가?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1038&quot; data-start=&quot;927&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;983&quot; data-start=&quot;927&quot;&gt;git branch backup_br2 br2 로 브랜치 백업 가능 &amp;rarr; 되돌리기 100% 가능&lt;/li&gt;
&lt;li data-end=&quot;1024&quot; data-start=&quot;984&quot;&gt;reset은 &lt;b&gt;포인터 이동&lt;/b&gt;이기 때문에 커밋 ID는 그대로 유지됨&lt;/li&gt;
&lt;li data-end=&quot;1038&quot; data-start=&quot;1025&quot;&gt;잘못돼도 복구 쉬움:&lt;/li&gt;
&lt;li data-end=&quot;1038&quot; data-start=&quot;1025&quot;&gt;
&lt;pre id=&quot;code_1751852330483&quot; class=&quot;pgsql&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;git checkout br2
git reset --hard backup_br2&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1113&quot; data-start=&quot;1097&quot; data-ke-size=&quot;size23&quot;&gt;● 이런 경우에 유용!&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1187&quot; data-start=&quot;1114&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1139&quot; data-start=&quot;1114&quot;&gt;브랜치 히스토리 깨끗하게 유지하고 싶을 때&lt;/li&gt;
&lt;li data-end=&quot;1160&quot; data-start=&quot;1140&quot;&gt;커밋값 변경 절대 원하지 않을 때&lt;/li&gt;
&lt;li data-end=&quot;1187&quot; data-start=&quot;1161&quot;&gt;브랜치를 특정 커밋으로 딱 고정하고 싶을 때&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;1242&quot; data-start=&quot;1194&quot; data-ke-size=&quot;size26&quot;&gt;브랜치 이름 변경 + Remote 반영 (release/ 접두사 추가)&lt;/h2&gt;
&lt;h3 data-end=&quot;1252&quot; data-start=&quot;1244&quot; data-ke-size=&quot;size23&quot;&gt;● 목표&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1312&quot; data-start=&quot;1253&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1285&quot; data-start=&quot;1253&quot;&gt;브랜치 이름을 release/ 접두사 붙여서 바꾸기&lt;/li&gt;
&lt;li data-end=&quot;1312&quot; data-start=&quot;1286&quot;&gt;Remote(원격 저장소)까지 동일하게 반영&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1332&quot; data-start=&quot;1314&quot; data-ke-size=&quot;size23&quot;&gt;● 해결법 (완벽 가이드)&lt;/h3&gt;
&lt;pre id=&quot;code_1751852395100&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 로컬 브랜치 이름 변경
git branch -m br2 release/br2

# Remote에 새 브랜치 Push
git push origin release/br2

# 기존 Remote 브랜치 삭제
git push origin --delete br2&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-end=&quot;1512&quot; data-start=&quot;1502&quot; data-ke-size=&quot;size23&quot;&gt;● 주의사항&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1568&quot; data-start=&quot;1513&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1543&quot; data-start=&quot;1513&quot;&gt;브랜치 이름 변경은 협업 중이라면 반드시 공유 필요&lt;/li&gt;
&lt;li data-end=&quot;1568&quot; data-start=&quot;1544&quot;&gt;Remote에서 정리된 브랜치를 보려면:&lt;/li&gt;
&lt;li data-end=&quot;1568&quot; data-start=&quot;1544&quot;&gt;
&lt;pre id=&quot;code_1751852436553&quot; class=&quot;pgsql&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;git fetch --prune&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1615&quot; data-start=&quot;1600&quot; data-ke-size=&quot;size23&quot;&gt;● 이름 변경 효과?&lt;/h3&gt;
&lt;p data-end=&quot;1685&quot; data-start=&quot;1616&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 로컬과 Remote 모두 release/br2 이름으로 깔끔하게 통일&lt;br /&gt;&amp;rarr; 기존 br2 브랜치는 삭제되어 혼란 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;1999&quot; data-start=&quot;1967&quot; data-ke-size=&quot;size26&quot;&gt;마무리: Git 브랜치 관리, 이렇게 생각하세요!&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2128&quot; data-start=&quot;2000&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2027&quot; data-start=&quot;2000&quot;&gt;&lt;b&gt;Git 브랜치 = 단순한 포인터&lt;/b&gt;입니다.&lt;/li&gt;
&lt;li data-end=&quot;2084&quot; data-start=&quot;2028&quot;&gt;브랜치 이름 변경, 커밋 포함(포인터 이동)은 &lt;b&gt;정확히 원리만 알면 전혀 위험하지 않습니다&lt;/b&gt;.&lt;/li&gt;
&lt;li data-end=&quot;2128&quot; data-start=&quot;2085&quot;&gt;항상 &lt;b&gt;백업 브랜치&lt;/b&gt; 하나만 남겨두면 어떤 실수도 100% 복구 가능.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>IT/VCS</category>
      <category>git 브랜치 이름 변경</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/375</guid>
      <comments>https://simryang.tistory.com/entry/Git-%EB%B8%8C%EB%9E%9C%EC%B9%98-%EA%B0%95%EC%A0%9C-%EC%9D%B4%EB%8F%99%EA%B3%BC-%EC%9D%B4%EB%A6%84-%EB%B3%80%EA%B2%BD-%EC%A7%84%EC%A7%9C-%EC%95%88%EC%A0%84%ED%95%98%EA%B2%8C-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95#entry375comment</comments>
      <pubDate>Mon, 7 Jul 2025 10:42:21 +0900</pubDate>
    </item>
    <item>
      <title>설치했고 PATH도 수정했는데... not found? 마지막 한 수는?</title>
      <link>https://simryang.tistory.com/entry/%EC%84%A4%EC%B9%98%ED%96%88%EA%B3%A0-PATH%EB%8F%84-%EC%88%98%EC%A0%95%ED%96%88%EB%8A%94%EB%8D%B0-not-found-%EB%A7%88%EC%A7%80%EB%A7%89-%ED%95%9C-%EC%88%98%EB%8A%94</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;심볼릭 링크도, alias도, PATH도 뭔가 부족했던 당신께.&lt;br /&gt;&lt;b&gt;진짜 실행 흐름을 장악하는 방법&lt;/b&gt;이 여기 있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Node, Java, Vim, Python 버전이 어지럽게 얽힌 환경 속에서,&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;/usr/bin/xxx
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가 어디를 가리키는지 명확히 다루실 수 있으신가요?&lt;br /&gt;그렇다면, 과감히 뒤로가기를 누르셔도 됩니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇지 않고 &lt;b&gt;의도된 실행 흐름 설계&lt;/b&gt;를 원하신다면&lt;br /&gt;update-alternatives가 그 무기가 됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚔️ 그래서 뭐가 좋은데? 삼대장 비교&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;방식&lt;/td&gt;
&lt;td&gt;적용 범위&lt;/td&gt;
&lt;td&gt;반영 시점&lt;/td&gt;
&lt;td&gt;자동 전환&lt;/td&gt;
&lt;td&gt;적합한 상황&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;alias&lt;/td&gt;
&lt;td&gt;셸 세션/사용자 수준&lt;/td&gt;
&lt;td&gt;로그인 후&lt;/td&gt;
&lt;td&gt;❌ 없음&lt;/td&gt;
&lt;td&gt;간단한 별칭, 임시 커맨드 변경&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;심볼릭 링크 수동 수정&lt;/td&gt;
&lt;td&gt;시스템 전체&lt;/td&gt;
&lt;td&gt;즉시 적용&lt;/td&gt;
&lt;td&gt;❌ 없음&lt;/td&gt;
&lt;td&gt;단발성 대체, 경로 override용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;update-alternatives&lt;/td&gt;
&lt;td&gt;시스템 전체 + 정책 기반&lt;/td&gt;
&lt;td&gt;선택 후 적용&lt;/td&gt;
&lt;td&gt;✅ 있음&lt;/td&gt;
&lt;td&gt;&lt;b&gt;다중 버전 관리에 최적&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alias는 셸에 머무르고, symlink는 파일에 머무르며, alternatives는 시스템 실행 흐름을 다룹니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  update-alternatives란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Debian/Ubuntu 계열에 내장된 실행 경로 우선순위 관리 도구로:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;/usr/bin/&amp;lt;이름&amp;gt; 같은 표준 경로에 어떤 바이너리를 연결할지 &lt;b&gt;중앙 정책&lt;/b&gt;으로 결정합니다.&lt;/li&gt;
&lt;li&gt;/etc/alternatives/를 경유하여 symlink를 정리하므로 관리가 체계적입니다.&lt;/li&gt;
&lt;li&gt;자동 선택, 수동 고정, 완전 제거 및 복원까지 하나로 처리 가능합니다.&lt;/li&gt;
&lt;li&gt;--slave 옵션으로 관련 커맨드들을 한 그룹으로 통합 관리할 수도 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  주요 명령 요약&lt;/h2&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;sudo update-alternatives --install &amp;lt;공용링크&amp;gt; &amp;lt;이름&amp;gt; &amp;lt;실제경로&amp;gt; &amp;lt;우선순위&amp;gt;
sudo update-alternatives --config &amp;lt;이름&amp;gt;
sudo update-alternatives --set &amp;lt;이름&amp;gt; &amp;lt;경로&amp;gt;
sudo update-alternatives --auto &amp;lt;이름&amp;gt;
sudo update-alternatives --remove &amp;lt;이름&amp;gt; &amp;lt;경로&amp;gt;
sudo update-alternatives --display &amp;lt;이름&amp;gt;
sudo update-alternatives --get-selections
sudo update-alternatives --remove-all &amp;lt;이름&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚙️ 우선순위와 모드 전환&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; ️ 우선순위&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;--install 시 부여하는 숫자가 클수록 우선순위가 높습니다.&lt;/li&gt;
&lt;li&gt;자동 모드(--auto)에서는 가장 우선순위가 높은 항목이 자동 선택됩니다.&lt;/li&gt;
&lt;li&gt;수동 모드로 지정하면 우선순위와 관계없이 명시된 항목만 사용됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;sudo update-alternatives --set node /usr/local/bin/node  # 수동 지정
sudo update-alternatives --auto node                     # 자동 복귀
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  수동 &amp;harr; 자동 전환&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;수동 모드 지정: --set, 또는 --config에서 수동 선택&lt;/li&gt;
&lt;li&gt;자동 복귀: --auto &amp;lt;이름&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;sudo update-alternatives --auto vim
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  현재 상태 확인 및 제거&lt;/h3&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;sudo update-alternatives --display java
sudo update-alternatives --get-selections
sudo update-alternatives --remove-all python
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  실전 예시: 바이너리 통합 관리&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✍️ Vim을 Neovim으로 교체&lt;/h3&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;sudo update-alternatives --install /usr/bin/vim vim /usr/local/bin/nvim 100
sudo update-alternatives --config vim
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  Python 버전 지정&lt;/h3&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 20
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 40
sudo update-alternatives --config python
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;☕ Java 다중 버전 전환&lt;/h3&gt;
&lt;pre class=&quot;crystal&quot;&gt;&lt;code&gt;sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-8-openjdk/bin/java 1081
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-11-openjdk/bin/java 1111
sudo update-alternatives --config java
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✨ 왜 alias보다 강력한가?&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 52.442%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.8372%;&quot;&gt;항목&lt;/td&gt;
&lt;td style=&quot;width: 14.4287%;&quot;&gt;alias&lt;/td&gt;
&lt;td style=&quot;width: 15.0689%;&quot;&gt;alternatives&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.8372%;&quot;&gt;셸 세션 한정&lt;/td&gt;
&lt;td style=&quot;width: 14.4287%;&quot;&gt;✅&lt;/td&gt;
&lt;td style=&quot;width: 15.0689%;&quot;&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.8372%;&quot;&gt;시스템 전체 반영&lt;/td&gt;
&lt;td style=&quot;width: 14.4287%;&quot;&gt;❌&lt;/td&gt;
&lt;td style=&quot;width: 15.0689%;&quot;&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.8372%;&quot;&gt;자동 우선순위 적용&lt;/td&gt;
&lt;td style=&quot;width: 14.4287%;&quot;&gt;❌&lt;/td&gt;
&lt;td style=&quot;width: 15.0689%;&quot;&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.8372%;&quot;&gt;대화형 CLI 설정&lt;/td&gt;
&lt;td style=&quot;width: 14.4287%;&quot;&gt;❌&lt;/td&gt;
&lt;td style=&quot;width: 15.0689%;&quot;&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.8372%;&quot;&gt;연관 커맨드 그룹 묶음 (--slave)&lt;/td&gt;
&lt;td style=&quot;width: 14.4287%;&quot;&gt;❌&lt;/td&gt;
&lt;td style=&quot;width: 15.0689%;&quot;&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.8372%;&quot;&gt;자동화/스크립트 환경 연동 용이&lt;/td&gt;
&lt;td style=&quot;width: 14.4287%;&quot;&gt; &lt;/td&gt;
&lt;td style=&quot;width: 15.0689%;&quot;&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alias는 마치 &amp;lsquo;서랍 속 메모&amp;rsquo; 같고, alternatives는 &amp;lsquo;시스템의 기본 메뉴판&amp;rsquo;입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  마무리: 이젠 바이너리도 '정책'으로 다스리세요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CLI 커맨드가 어디를 가리키느냐에 따라, 시스템이 전혀 다르게 작동합니다.&lt;br /&gt;PATH 순서만 바꾸는 수준에서 벗어나, &lt;b&gt;정책 기반 실행 통제&lt;/b&gt;를 경험해보세요.&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;/usr/bin/python &amp;rarr; python2? python3?
/usr/bin/vim &amp;rarr; vim.basic? nvim?
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제는 더 이상 우연이 아닌 &lt;b&gt;당신의 의도&lt;/b&gt;가 결정하게 하십시오.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;alias는 즉흥입니다. update-alternatives는 설계입니다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 환경 자동화부터 배포/이식/CI까지.&lt;br /&gt;시스템의 주도권은 이제 당신의 손에 있습니다. ️ &lt;/p&gt;</description>
      <category>IT/shell</category>
      <category>alias</category>
      <category>command-not-found</category>
      <category>Linux</category>
      <category>PATH</category>
      <category>update-alternatives</category>
      <category>개발환경설정</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/373</guid>
      <comments>https://simryang.tistory.com/entry/%EC%84%A4%EC%B9%98%ED%96%88%EA%B3%A0-PATH%EB%8F%84-%EC%88%98%EC%A0%95%ED%96%88%EB%8A%94%EB%8D%B0-not-found-%EB%A7%88%EC%A7%80%EB%A7%89-%ED%95%9C-%EC%88%98%EB%8A%94#entry373comment</comments>
      <pubDate>Tue, 24 Jun 2025 14:04:31 +0900</pubDate>
    </item>
    <item>
      <title>Node.js 설치했는데 node 명령어가 작동하지 않을 때 (bash: /usr/bin/node: No such file)</title>
      <link>https://simryang.tistory.com/entry/Nodejs-%EC%84%A4%EC%B9%98%ED%96%88%EB%8A%94%EB%8D%B0-node-%EB%AA%85%EB%A0%B9%EC%96%B4%EA%B0%80-%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80-%EC%95%8A%EC%9D%84-%EB%95%8C-bash-usrbinnode-No-such-file</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;apt로 설치한 Node.js를 제거하고 스크립트로 재설치한 후 node 명령어가 작동하지 않는 문제. 리눅스 셸의 hash 캐시가 원인입니다. 해결법까지 완벽 정리.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Node.js 설치했는데 `node` 명령어가 작동하지 않을 때&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;mdash; `bash: /usr/bin/node: No such file or directory` 문제 해결법&lt;/h4&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;  요약 (TL;DR)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Node.js를&amp;nbsp;apt로&amp;nbsp;설치했다가&amp;nbsp;제거하고,&amp;nbsp;&amp;nbsp; &lt;br /&gt;스크립트&amp;nbsp;방식으로&amp;nbsp;다시&amp;nbsp;설치했더니&amp;nbsp;&amp;nbsp; &lt;br /&gt;`node&amp;nbsp;-v`&amp;nbsp;명령어가&amp;nbsp;작동하지&amp;nbsp;않는다? &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1750671316824&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bash: /usr/bin/node: No such file or directory&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;859&quot; data-start=&quot;754&quot; data-ke-size=&quot;size16&quot;&gt;which node는 멀쩡히 /usr/local/bin/node로 나오는데?&lt;br /&gt;그 원인은 리눅스 셸의 &lt;b&gt;hash 캐시&lt;/b&gt; 때문이다.&lt;br /&gt;아래 해결 방법을 따라가면 바로 해결된다.&lt;/p&gt;
&lt;hr data-end=&quot;864&quot; data-start=&quot;861&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;893&quot; data-start=&quot;866&quot; data-ke-size=&quot;size26&quot;&gt;  문제 발생 흐름 (재현 가능 시나리오)&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1069&quot; data-start=&quot;895&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;963&quot; data-start=&quot;895&quot;&gt;coc.nvim 등 Vim 플러그인을 설치하려고 했더니 &lt;b&gt;Node.js v16 이상&lt;/b&gt;이 필요하다는 메시지를 봄&lt;/li&gt;
&lt;li data-end=&quot;1018&quot; data-start=&quot;964&quot;&gt;sudo apt install nodejs &amp;rarr; 설치된 버전은 v10.x, 턱없이 낮음&lt;/li&gt;
&lt;li data-end=&quot;1051&quot; data-start=&quot;1019&quot;&gt;sudo apt remove nodejs &amp;rarr; 제거&lt;/li&gt;
&lt;li data-end=&quot;1069&quot; data-start=&quot;1052&quot;&gt;공식 설치 스크립트 실행:
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1069&quot; data-start=&quot;1052&quot;&gt;
&lt;pre id=&quot;code_1750671369787&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;curl -sL https://install-node.vercel.app/lts | sudo bash&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1192&quot; data-start=&quot;1141&quot;&gt;설치 후 which node 확인 &amp;rarr; /usr/local/bin/node ✅&lt;/li&gt;
&lt;li data-end=&quot;1218&quot; data-start=&quot;1193&quot;&gt;하지만 node -v 실행 시 오류:
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1218&quot; data-start=&quot;1193&quot;&gt;
&lt;pre id=&quot;code_1750671417863&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;bash: /usr/bin/node: No such file or directory&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-end=&quot;1324&quot; data-start=&quot;1299&quot; data-ke-size=&quot;size26&quot;&gt;  원인: bash의 해시 테이블 캐시&lt;/h2&gt;
&lt;p data-end=&quot;1421&quot; data-start=&quot;1326&quot; data-ke-size=&quot;size16&quot;&gt;bash는 자주 사용하는 명령어의 경로를 &lt;b&gt;hash 테이블에 캐시&lt;/b&gt;해두고,&lt;br /&gt;다음 실행 때는 &lt;b&gt;PATH를 다시 검색하지 않고&lt;/b&gt; 기억해둔 경로로 바로 실행한다.&lt;/p&gt;
&lt;p data-end=&quot;1488&quot; data-start=&quot;1423&quot; data-ke-size=&quot;size16&quot;&gt;과거에 /usr/bin/node를 실행한 적이 있다면,&lt;br /&gt;설치가 바뀌어도 bash는 &lt;b&gt;계속 그쪽을 찾는다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;1493&quot; data-start=&quot;1490&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1515&quot; data-start=&quot;1495&quot; data-ke-size=&quot;size26&quot;&gt;✅ 해결 방법: hash 초기화&lt;/h2&gt;
&lt;pre id=&quot;code_1750671457215&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;hash -d node&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;pre id=&quot;code_1750671476695&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;hash -r&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;pre id=&quot;code_1750671502127&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;node -v
# v18.x.x  ✅ 정상 출력&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;1670&quot; data-start=&quot;1642&quot; data-ke-size=&quot;size26&quot;&gt;❗ 설치 스크립트가 왜 이걸 말해주지 않을까?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1839&quot; data-start=&quot;1672&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1715&quot; data-start=&quot;1672&quot;&gt;설치 스크립트는 **새로운 셸 프로세스(subshell)**에서 실행된다.&lt;/li&gt;
&lt;li data-end=&quot;1759&quot; data-start=&quot;1716&quot;&gt;bash의 해시 테이블은 &lt;b&gt;현재 사용자의 셸 세션 안에서만&lt;/b&gt; 유효하다.&lt;/li&gt;
&lt;li data-end=&quot;1839&quot; data-start=&quot;1760&quot;&gt;따라서 설치 스크립트는 사용자 셸의 캐시에 접근할 수 없고,&lt;br /&gt;hash -r을 실행해도 &lt;b&gt;사용자 셸에는 아무런 영향이 없다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1881&quot; data-start=&quot;1841&quot; data-ke-size=&quot;size16&quot;&gt;그렇다고 &lt;b&gt;안내도 없이 침묵하는 건 친절한 시스템이라 할 수 없다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;1886&quot; data-start=&quot;1883&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1910&quot; data-start=&quot;1888&quot; data-ke-size=&quot;size26&quot;&gt;  최소한 이렇게 안내했어야 했다&lt;/h2&gt;
&lt;pre id=&quot;code_1750671535247&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;✅ Node.js 설치가 완료되었습니다.

⚠️ 이전 node 경로가 기억된 셸에서는 아래 명령어를 실행해 주세요:

    hash -d node    # 또는 hash -r

또는 터미널을 종료하고 다시 열어주세요.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;2063&quot; data-start=&quot;2053&quot; data-ke-size=&quot;size26&quot;&gt;  추가 팁&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2238&quot; data-start=&quot;2065&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2156&quot; data-start=&quot;2065&quot;&gt;.bashrc 또는 .zshrc에 export PATH를 넣는 것도 좋지만,&lt;br /&gt;hash는 &lt;b&gt;경로 문제가 아니라 캐시 문제&lt;/b&gt;이므로 별개다.&lt;/li&gt;
&lt;li data-end=&quot;2238&quot; data-start=&quot;2157&quot;&gt;source ~/.bashrc로도 해결되지 않는 이유는,&lt;br /&gt;hash 캐시가 여전히 /usr/bin/node를 가리키고 있기 때문.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2243&quot; data-start=&quot;2240&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2254&quot; data-start=&quot;2245&quot; data-ke-size=&quot;size26&quot;&gt;  마무리&lt;/h2&gt;
&lt;p data-end=&quot;2327&quot; data-start=&quot;2256&quot; data-ke-size=&quot;size16&quot;&gt;이 문제는 단순한 설치 실패가 아니다.&lt;br /&gt;&lt;b&gt;리눅스 셸이 &amp;ldquo;한 번 기억한 경로를 바꾸지 않기 때문에 생기는 캐시 문제&amp;rdquo;&lt;/b&gt;다.&lt;/p&gt;
&lt;pre id=&quot;code_1750671587695&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# apt 설치 &amp;rarr; 버전 낮음 &amp;rarr; 제거
# 스크립트 설치 &amp;rarr; which node OK &amp;rarr; 실행 오류 &amp;rarr; hash 캐시 때문&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;2327&quot; data-start=&quot;2256&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;2426&quot; data-start=&quot;2416&quot; data-ke-size=&quot;size26&quot;&gt;  기억하자&lt;/h2&gt;
&lt;blockquote data-end=&quot;2499&quot; data-start=&quot;2428&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2499&quot; data-start=&quot;2430&quot; data-ke-size=&quot;size16&quot;&gt;which node는 되는데,&lt;br /&gt;node 명령은 안 된다면,&lt;br /&gt;&lt;b&gt;문제는 PATH가 아니라 hash다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre id=&quot;code_1750671641191&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;hash -d node&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;2327&quot; data-start=&quot;2256&quot; data-ke-size=&quot;size16&quot;&gt;이 명령 하나면 해결된다.&lt;/p&gt;</description>
      <category>IT/shell</category>
      <category>bash</category>
      <category>coc.nvim</category>
      <category>hash</category>
      <category>node not found</category>
      <category>Node.js</category>
      <category>VIM</category>
      <category>which node는 되는데 실행 안 됨</category>
      <category>리눅스 오류</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/372</guid>
      <comments>https://simryang.tistory.com/entry/Nodejs-%EC%84%A4%EC%B9%98%ED%96%88%EB%8A%94%EB%8D%B0-node-%EB%AA%85%EB%A0%B9%EC%96%B4%EA%B0%80-%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80-%EC%95%8A%EC%9D%84-%EB%95%8C-bash-usrbinnode-No-such-file#entry372comment</comments>
      <pubDate>Mon, 23 Jun 2025 18:41:43 +0900</pubDate>
    </item>
    <item>
      <title>Windows 11에서 Flutter 개발 환경 완벽 설정 가이드</title>
      <link>https://simryang.tistory.com/entry/Windows-11%EC%97%90%EC%84%9C-Flutter-%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%99%84%EB%B2%BD-%EC%84%A4%EC%A0%95-%EA%B0%80%EC%9D%B4%EB%93%9C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Flutter를 Windows 11에서 처음 설정하는 분들을 위해 VS Code 설치부터 Android Studio, 에뮬레이터 실행까지 전 과정을 친절하게 설명합니다. 흔히 겪는 오류 해결법까지 포함한 실전형 가이드입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;610&quot; data-start=&quot;566&quot; data-ke-size=&quot;size16&quot;&gt;VS Code + Android Studio + 에뮬레이터 + 오류 해결까지&lt;/p&gt;
&lt;p data-end=&quot;853&quot; data-start=&quot;612&quot; data-ke-size=&quot;size16&quot;&gt;Flutter는 단일 코드로 iOS와 Android 앱을 동시에 개발할 수 있는 Google의 강력한 UI 프레임워크입니다.&lt;br /&gt;이 글에서는 Windows 11 환경에서 Flutter를 처음 설정하는 개발자나 입문자를 위해 &lt;b&gt;VS Code, Flutter SDK, Android Studio, AVD 설정&lt;/b&gt;까지 한 번에 정리된 실전 가이드를 제공합니다.&lt;br /&gt;추가로, 설정 중 흔히 마주치는 오류들과 그 해결법도 상세히 담았어요.&lt;/p&gt;
&lt;p data-end=&quot;853&quot; data-start=&quot;612&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;887&quot; data-start=&quot;860&quot; data-ke-size=&quot;size26&quot;&gt;1. Visual Studio Code 설치&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1000&quot; data-start=&quot;889&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;972&quot; data-start=&quot;889&quot;&gt;&lt;a href=&quot;https://code.visualstudio.com/download&quot; data-end=&quot;948&quot; data-start=&quot;892&quot;&gt;VS Code 공식 페이지&lt;/a&gt;에서 Windows용 설치 파일 다운로드&lt;/li&gt;
&lt;li data-end=&quot;1000&quot; data-start=&quot;973&quot;&gt;설치 파일 실행 &amp;rarr; 일반 설치 방식대로 진행&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;1005&quot; data-start=&quot;1002&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1038&quot; data-start=&quot;1007&quot; data-ke-size=&quot;size26&quot;&gt;2. Flutter SDK 설치 및 환경 변수 설정&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1289&quot; data-start=&quot;1040&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1141&quot; data-start=&quot;1040&quot;&gt;&lt;a href=&quot;https://docs.flutter.dev/get-started/install/windows&quot; data-end=&quot;1123&quot; data-start=&quot;1043&quot;&gt;Flutter 공식 가이드 (Windows)&lt;/a&gt;에서 최신 안정 버전 다운로드&lt;/li&gt;
&lt;li data-end=&quot;1191&quot; data-start=&quot;1142&quot;&gt;압축 해제 위치는 C:\flutter 등 &lt;b&gt;권한 문제 없는 경로&lt;/b&gt;로 설정&lt;/li&gt;
&lt;li data-end=&quot;1235&quot; data-start=&quot;1192&quot;&gt;환경 변수 편집 &amp;rarr; Path에 C:\flutter\bin 추가&lt;/li&gt;
&lt;li data-end=&quot;1289&quot; data-start=&quot;1236&quot;&gt;명령어로 설치 확인:
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1748778312672&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;flutter doctor&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;1294&quot; data-start=&quot;1291&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1319&quot; data-start=&quot;1296&quot; data-ke-size=&quot;size26&quot;&gt;3. Android Studio 설치&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1620&quot; data-start=&quot;1321&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1399&quot; data-start=&quot;1321&quot;&gt;&lt;a href=&quot;https://developer.android.com/studio&quot; data-end=&quot;1385&quot; data-start=&quot;1324&quot;&gt;Android Studio 공식 페이지&lt;/a&gt;에서 다운로드 후 설치&lt;/li&gt;
&lt;li data-end=&quot;1449&quot; data-start=&quot;1400&quot;&gt;설치 중 &lt;b&gt;Android Virtual Device&lt;/b&gt; 항목 포함되었는지 확인&lt;/li&gt;
&lt;li data-end=&quot;1620&quot; data-start=&quot;1450&quot;&gt;Android SDK Manager에서 다음 구성요소 설치 확인:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1620&quot; data-start=&quot;1494&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1521&quot; data-start=&quot;1494&quot;&gt;Android SDK Build-Tools&lt;/li&gt;
&lt;li data-end=&quot;1560&quot; data-start=&quot;1526&quot;&gt;Android SDK Command-line Tools&lt;/li&gt;
&lt;li data-end=&quot;1585&quot; data-start=&quot;1565&quot;&gt;Android Emulator&lt;/li&gt;
&lt;li data-end=&quot;1620&quot; data-start=&quot;1590&quot;&gt;Android SDK Platform-Tools&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;1625&quot; data-start=&quot;1622&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1647&quot; data-start=&quot;1627&quot; data-ke-size=&quot;size26&quot;&gt;4. Android SDK 설정&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1882&quot; data-start=&quot;1649&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1731&quot; data-start=&quot;1649&quot;&gt;Android Studio에서 &lt;b&gt;SDK 위치 확인&lt;/b&gt; (예: C:\Users\사용자명\AppData\Local\Android\Sdk)&lt;/li&gt;
&lt;li data-end=&quot;1812&quot; data-start=&quot;1732&quot;&gt;Flutter에 SDK 경로 등록:&lt;br /&gt;
&lt;pre id=&quot;code_1748778440624&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;flutter config --android-sdk C:\Users\user\AppData\Local\Android\Sdk&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1882&quot; data-start=&quot;1813&quot;&gt;라이선스 동의:&lt;br /&gt;
&lt;pre id=&quot;code_1748778458992&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;flutter doctor --android-licenses&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;1887&quot; data-start=&quot;1884&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1925&quot; data-start=&quot;1889&quot; data-ke-size=&quot;size26&quot;&gt;5. Android 에뮬레이터 설정 (AVD Manager)&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2173&quot; data-start=&quot;1927&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1970&quot; data-start=&quot;1927&quot;&gt;Android Studio &amp;rarr; Tools &amp;gt; AVD Manager&lt;/li&gt;
&lt;li data-end=&quot;2003&quot; data-start=&quot;1971&quot;&gt;새 가상 기기 생성 (Pixel 6 등 추천)&lt;/li&gt;
&lt;li data-end=&quot;2044&quot; data-start=&quot;2004&quot;&gt;시스템 이미지: x86_64 아키텍처 기반 이미지 사용 권장&lt;/li&gt;
&lt;li data-end=&quot;2104&quot; data-start=&quot;2045&quot;&gt;Graphics 옵션: Hardware - GLES 2.0 또는 Automatic 설정&lt;/li&gt;
&lt;li data-end=&quot;2173&quot; data-start=&quot;2105&quot;&gt;에뮬레이터 실행 후 다음 명령으로 인식 확인:&lt;br /&gt;
&lt;pre id=&quot;code_1748778490723&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;flutter devices&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;2178&quot; data-start=&quot;2175&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2204&quot; data-start=&quot;2180&quot; data-ke-size=&quot;size26&quot;&gt;6. Windows 개발자 모드 활성화&lt;/h2&gt;
&lt;p data-end=&quot;2287&quot; data-start=&quot;2206&quot; data-ke-size=&quot;size16&quot;&gt;Flutter 플러그인이 symlink를 사용하므로 개발자 모드를 켜야 합니다.&lt;br /&gt;Windows 설정 &amp;rarr; 개발자용 &amp;rarr; 개발자 모드 활성화&lt;/p&gt;
&lt;p data-end=&quot;2287&quot; data-start=&quot;2206&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2287&quot; data-start=&quot;2206&quot; data-ke-size=&quot;size16&quot;&gt;또는 Win + R 키를 눌러 실행 창을 실행 시키고, 열기 항목에 ms-settings:developers 를 붙여넣으면 바로 해당 설정으로 이동합니다.&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;2292&quot; data-start=&quot;2289&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2327&quot; data-start=&quot;2294&quot; data-ke-size=&quot;size26&quot;&gt;✅ 마무리: flutter doctor로 최종 점검&lt;/h2&gt;
&lt;p data-end=&quot;2423&quot; data-start=&quot;2329&quot; data-ke-size=&quot;size16&quot;&gt;마지막으로 다시 한 번 flutter doctor를 실행해 전체 설정 상태를 확인하세요.&lt;br /&gt;모든 항목이 초록색 체크(✓)로 나올 때까지 하나씩 해결하면 됩니다.&lt;/p&gt;
&lt;p data-end=&quot;2423&quot; data-start=&quot;2329&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;2450&quot; data-start=&quot;2430&quot; data-ke-size=&quot;size26&quot;&gt;  흔한 오류 &amp;amp; 해결법 요약&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;오류 메시지해결 방법
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2740&quot; data-start=&quot;2452&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2740&quot; data-start=&quot;2499&quot;&gt;
&lt;tr data-end=&quot;2595&quot; data-start=&quot;2499&quot;&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;2554&quot; data-start=&quot;2499&quot;&gt;X Android toolchain - Unable to locate Android SDK&lt;/td&gt;
&lt;td data-end=&quot;2595&quot; data-start=&quot;2554&quot; data-col-size=&quot;md&quot;&gt;flutter config --android-sdk로 경로 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2680&quot; data-start=&quot;2596&quot;&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;2631&quot; data-start=&quot;2596&quot;&gt;Android license status unknown&lt;/td&gt;
&lt;td data-end=&quot;2680&quot; data-start=&quot;2631&quot; data-col-size=&quot;md&quot;&gt;flutter doctor --android-licenses 실행 후 y 입력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2740&quot; data-start=&quot;2681&quot;&gt;
&lt;td data-col-size=&quot;md&quot; data-end=&quot;2705&quot; data-start=&quot;2681&quot;&gt;VS Code에서 디바이스 인식 안 됨&lt;/td&gt;
&lt;td data-end=&quot;2740&quot; data-start=&quot;2705&quot; data-col-size=&quot;md&quot;&gt;에뮬레이터 재실행, flutter devices 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2745&quot; data-start=&quot;2742&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2755&quot; data-start=&quot;2747&quot; data-ke-size=&quot;size26&quot;&gt;  결론&lt;/h2&gt;
&lt;p data-end=&quot;2896&quot; data-start=&quot;2757&quot; data-ke-size=&quot;size16&quot;&gt;이제 Flutter 개발 환경 설정은 끝났습니다!&lt;br /&gt;VS Code에서 새 Flutter 프로젝트를 시작하고, 방금 만든 에뮬레이터에서 실행해보세요.&lt;br /&gt;Flutter는 처음만 조금 까다롭고, 이후엔 정말 빠르고 즐거운 개발 환경이 될 거예요.  &lt;/p&gt;</description>
      <category>IT/언어</category>
      <category>AndroidStudio</category>
      <category>FLUTTER</category>
      <category>FlutterDoctor</category>
      <category>flutter설치</category>
      <category>vscode</category>
      <category>windows11</category>
      <category>모바일앱개발</category>
      <category>에뮬레이터설정</category>
      <category>플러터개발환경</category>
      <category>플러터설정</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/371</guid>
      <comments>https://simryang.tistory.com/entry/Windows-11%EC%97%90%EC%84%9C-Flutter-%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%99%84%EB%B2%BD-%EC%84%A4%EC%A0%95-%EA%B0%80%EC%9D%B4%EB%93%9C#entry371comment</comments>
      <pubDate>Sun, 1 Jun 2025 20:50:44 +0900</pubDate>
    </item>
    <item>
      <title>Gemini 2.5 Pro vs GPT vs Claude &amp;mdash; &amp;quot;나를 이해하는 AI&amp;quot;는 누구인가?</title>
      <link>https://simryang.tistory.com/entry/Gemini-25-Pro-vs-GPT-vs-Claude-%E2%80%94-%EB%82%98%EB%A5%BC-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-AI%EB%8A%94-%EB%88%84%EA%B5%AC%EC%9D%B8%EA%B0%80</link>
      <description>&lt;p data-pm-slice=&quot;1 1 [&amp;quot;blockquote&amp;quot;,{&amp;quot;start&amp;quot;:57,&amp;quot;end&amp;quot;:195}]&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;GPT, Claude, Gemini. 이름은 익숙하지만, 실제로 써보면 이해 방식도 반응 방식도 제각각입니다. 이 글은 세 모델이 사용자의 의도를 어떻게 파악하고, 어떤 식으로 반응&amp;middot;구현하는지를 실제 사용 경험을 바탕으로 비교한 기록입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 [&amp;quot;blockquote&amp;quot;,{&amp;quot;start&amp;quot;:57,&amp;quot;end&amp;quot;:195}]&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;세간의 평가&lt;/span&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;아래는 실제 사용자들의 리뷰, 문서/미디어 입력 성능 테스트, 실사용 코드 흐름 등 다양한 평가 항목을 정리한 요약입니다. 단순 응답 품질을 넘어서 실행력과 맥락 대응, 자료 처리 성향까지 함께 포함합니다.&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;GPT&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 전체 대화 흐름을 비교적 자연스럽게 유지하며, 설정한 문맥을 중심으로 정리하는 능력이 뛰어남. 문서 응답, PDF 처리 등에서 정보 밀도와 응답 흐름이 안정적이라는 평이 많음.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Claude&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 실행 중심 대화에 강하며, 코드 응답에서 부가적 처리까지 챙겨주는 경우가 많음. 다만 텍스트 응답은 간결하고 중립적이라 감정 맥락 전달은 약하다는 의견이 있음.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Gemini&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 요점 추출과 정리는 빠르지만, 이미지&amp;middot;PDF&amp;middot;표 등 미디어 입력에 대해 설명 중심으로 반응하며 흐름 재구성은 부족하다는 의견. 긴 문서 요약은 강하지만 대화 확장은 제한적이라는 평가.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;  AI의 이해력과 맥락 반응력&lt;/span&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;세 모델이 사용자의 말을 어떻게 해석하고 대화 흐름을 얼마나 자연스럽게 이어가는지에 대한 체감 비교입니다. 각 항목은 실제 사용자가 경험한 내용을 중심으로 정리했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;  GPT-4 (Plus)&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;사용자의 의도를 짚으려는 태도가 분명히 보입니다. 단순한 요청에도 '혹시 이런 걸 원한 건가요?' 같은 반응이 따라오기도 하죠.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;하지만 그걸 넘어서 자발적으로 확장해주는 능력은 부족합니다. 기본 요청 범위에서 벗어나는 행동은 적습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;초기에 입력한 조건이나 예시 톤에 고착되는 경향도 강합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;  Claude&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;Claude는 사용자의 의도를 충분히 반영해 구현하며, 필요한 주변 요소들도 알아서 챙겨주는 인상입니다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;코드 작업에서는 특히, 요청하지 않아도 예외 처리나 경로 검사 같은 부수 요소들을 포함해주는 경우가 많았습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;응답 텍스트는 건조한 편이지만, 코드에는 생각이 들어간 느낌이 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;  Gemini 2.5 Pro&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;Gemini는 사용자의 말을 정리하고 요약하는 데는 정확했지만,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;그 요약을 바탕으로 다시 흐름을 이어가거나, 의도를 깊이 파고들지는 않았습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;&amp;ldquo;핵심만 뽑아낸다&amp;rdquo;는 강점이 있지만, &amp;ldquo;맥락을 엮어낸다&amp;rdquo;는 쪽에서는 아쉬움이 있었습니다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;게다가 Pro 는 심층 연구(deep research) 기능을 사용하면 느으으립니다. 뭐 이건 gpt 도 마찬가지긴 합니다만..&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;  코드 작성력 비교&lt;/span&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;코드를 단순히 만들어주는 수준을 넘어, 실제로 실행 가능한 흐름을 얼마나 충실하게 구성하는지 기준으로 비교합니다. 아래는 SWE-Bench 기준 정량 평가 결과와, 각 모델 사용 경험에 기반한 정성 평가입니다. Claude는 부가적인 처리까지 챙기는 경향이 있었고, GPT는 구성은 단정하지만 추가 요청 없이는 빠지는 요소가 많았고, Gemini는 설명 위주의 코드가 많아 실사용과의 간극이 느껴졌습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;  SWE-Bench 기준 정확도&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;Claude 3 Opus (Anthropic 기준, 2024년 측정): 약 71%&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;GPT-4 (Original, 2023년 OpenAI 기준): 약 67%&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Gemini 2.5 Pro (Google DeepMind, 2024년 공개 수치): 약 63.8% ※ 참고 수치이며 실제 체감과 다를 수 있음&lt;br /&gt;※ 위 내용은 gpt 가 검색해서 찾은 내용이고 최근의 평가는 &lt;a href=&quot;https://www.swebench.com/?utm_source=chatgpt.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.swebench.com/?utm_source=chatgpt.com&lt;/a&gt; 를 참고하시기 바랍니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;GPT&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;깔끔한 코드 스타일이 장점입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Claude가 토큰 제한으로 작업하다 이어서 작업을 GPT로 넘기는 경우가 많습니다. GPT는 긴 문맥을 안정적으로 이어받지만, 보조 함수나 예외 처리는 기본 구현에 포함되지 않는 경우가 많습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;excel 파일 작업 등을 진행할 때, 언급한 요청은 구현하지만 excel 파싱 코드가 빠진다던지, 헤더 파싱이 나사가 빠진 경우가 잦았습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;결론은... 초등학생에게 상세하게 방향을 지도해주듯이 보모 모드로 지시(프롬프트)를 자알 노오력해서 작성해야 좋은 결과를 스트레스 줄이고 얻습니다. 버벅일 때는 직접 수정하고 캔버스에 붙여넣어서 그걸 기준으로 작업하라고 지시하는게 효율적일 수도 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;Claude&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;완성도 높은 흐름을 먼저 짜주는 경향이 강합니다. 대략적인 기능 단위로 요청해도 전체 흐름을 먼저 설계해주는 편이며, 세부 분기나 예외 처리까지 포함된 경우도 많았습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;입력/출력 제한(클로드에서 토큰으로 인용됨)이 너무 짧습니다. 수정 요청 몇 번 하다 보면 사용량 제한 때문에 3시간 이상 기다려야 합니다. 성능은 만족스러운데 서비스가 짜다고 생각하시면 됩니다. 제일 비싼 버전은 안써봐서 모르겠지만, 가장 싼 유료 버전을 써도 별차이가 없었습니다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;쓰시다 보면 '계속' 이나 'continue' 연타를 누르고 있는 자신을 보게 될 수 있습니다. 너무 번거롭습니다. 그래서 한동안 열심히 쓰다가 지금은 구독을 취소한 상태입니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;Gemini&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;코드는 아직 직접 사용해보지 못했지만, SWE-Bench 수치상으로는 준수하고, 설명 위주 출력 특성상 문서 구조화 요청에 적합해 보입니다. 벤치마크 상으로는 준수하나, 설명 중심 출력 경향상 실사용과 차이가 있을 가능성이 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;  마무리하며&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;GPT를 비롯한 여러 AI를 만지작거리다 보니,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;어느새 이런 얘기까지 꺼내게 됐네요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;누군가는 &quot;오 이거 나도 느꼈는데&quot; 할 수 있고,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;누군가는 그냥 조용히 창을 닫았을지도 모르죠.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;저는 이렇게 써봤습니다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;여러분은 어떻게 쓰시나요?&lt;/span&gt;&lt;/p&gt;</description>
      <category>IT/etc</category>
      <category>gemini 2.5 pro</category>
      <category>GPT</category>
      <category>비교</category>
      <category>체감</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/370</guid>
      <comments>https://simryang.tistory.com/entry/Gemini-25-Pro-vs-GPT-vs-Claude-%E2%80%94-%EB%82%98%EB%A5%BC-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-AI%EB%8A%94-%EB%88%84%EA%B5%AC%EC%9D%B8%EA%B0%80#entry370comment</comments>
      <pubDate>Thu, 15 May 2025 17:00:05 +0900</pubDate>
    </item>
    <item>
      <title>Linux 네트워크 패킷 관리의 핵심: sk_buff 구조체와 메모리 레이아웃</title>
      <link>https://simryang.tistory.com/entry/Linux-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%ED%8C%A8%ED%82%B7-%EA%B4%80%EB%A6%AC%EC%9D%98-%ED%95%B5%EC%8B%AC-skbuff-%EA%B5%AC%EC%A1%B0%EC%B2%B4%EC%99%80-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%A0%88%EC%9D%B4%EC%95%84%EC%9B%83</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;sk_buff는 Linux 커널에서 네트워크 패킷을 표현하는 핵심 데이터 구조로, &lt;b&gt;netdev_alloc_skb&lt;/b&gt;, &lt;b&gt;skb_reserve&lt;/b&gt;, &lt;b&gt;skb_put&lt;/b&gt; 함수를 통해 메모리 레이아웃이 동적으로 관리됩니다. 이 글에서는 네트워크 드라이버 개발자에게 필수적인 sk_buff를 할당하는 3형제를 소개합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. sk_buff 의 세 가지 할당 단계&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) netdev_alloc_skb() 실행 후&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;head(0), data(0), tail(0), end(68) 포인터 초기화&lt;/li&gt;
&lt;li&gt;68바이트 전체가 사용 가능한 빈 버퍼 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) skb_reserve(2) 적용&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 시작 위치를 2바이트로 설정(data=2)&lt;/li&gt;
&lt;li&gt;패킷 헤더 공간 확보를 위한 전형적인 작업&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) skb_put(64) 실행&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;64바이트 데이터 추가로 tail 포인터 66으로 이동&lt;/li&gt;
&lt;li&gt;남은 2바이트(end=68)는 테일룸으로 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시각화 코드&lt;/p&gt;
&lt;pre id=&quot;code_1744857652785&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;import matplotlib.pyplot as plt
import matplotlib.patches as patches

def draw_skb_layout(stage, head_offset=0, data_offset=0, tail_offset=0, end_offset=68):
    fig, ax = plt.subplots(figsize=(10, 2))
    ax.set_xlim(0, 70)
    ax.set_ylim(0, 1)
    ax.axis('off')

    # Draw memory bar
    bar = patches.Rectangle((0, 0.4), end_offset, 0.2, linewidth=1, edgecolor='black', facecolor='lightgrey')
    ax.add_patch(bar)

    # Add arrows and labels with vertical separation to avoid overlaps
    def add_arrow_label(offset, label, level):
        y_base = 0.7 + level * 0.2
        ax.annotate('', xy=(offset, 0.6), xytext=(offset, y_base),
                    arrowprops=dict(facecolor='black', shrink=0.05, width=1, headwidth=5))
        ax.text(offset, y_base + 0.05, f&quot;{label} ({offset})&quot;, ha='center', va='bottom', fontsize=9)

    add_arrow_label(head_offset, 'head', 0)
    add_arrow_label(data_offset, 'data', 1)
    add_arrow_label(tail_offset, 'tail', 2)
    add_arrow_label(end_offset, 'end', 3)

    ax.text(end_offset / 2, 0.1, stage, ha='center', va='center', fontsize=12, weight='bold')
    return fig

# Create figures for the three stages
fig1 = draw_skb_layout(&quot;1) After alloc_skb()&quot;, head_offset=0, data_offset=0, tail_offset=0, end_offset=68)
fig2 = draw_skb_layout(&quot;2) After skb_reserve(2)&quot;, head_offset=0, data_offset=2, tail_offset=2, end_offset=68)
fig3 = draw_skb_layout(&quot;3) After skb_put(64)&quot;, head_offset=0, data_offset=2, tail_offset=66, end_offset=68)

# Save to PNG
fig1.savefig(&quot;/mnt/data/skb_stage1_alloc.png&quot;, bbox_inches='tight')
fig2.savefig(&quot;/mnt/data/skb_stage2_reserve.png&quot;, bbox_inches='tight')
fig3.savefig(&quot;/mnt/data/skb_stage3_put.png&quot;, bbox_inches='tight')
plt.close('all')&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 코드 실행 결과&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SKB 할당 단계별 메모리 구조&lt;br /&gt;세 단계를 거치며 head, data, tail 포인터의 위치 변화를 명확히 확인 가능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1651&quot; data-origin-height=&quot;479&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ygCmC/btsNn0McBx4/GksgfhdNynVPSTNjCxsc41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ygCmC/btsNn0McBx4/GksgfhdNynVPSTNjCxsc41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ygCmC/btsNn0McBx4/GksgfhdNynVPSTNjCxsc41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FygCmC%2FbtsNn0McBx4%2FGksgfhdNynVPSTNjCxsc41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1651&quot; height=&quot;479&quot; data-origin-width=&quot;1651&quot; data-origin-height=&quot;479&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1651&quot; data-origin-height=&quot;479&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RbmE2/btsNo310Id4/6cPizvZZFYuml4idcvRYJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RbmE2/btsNo310Id4/6cPizvZZFYuml4idcvRYJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RbmE2/btsNo310Id4/6cPizvZZFYuml4idcvRYJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRbmE2%2FbtsNo310Id4%2F6cPizvZZFYuml4idcvRYJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1651&quot; height=&quot;479&quot; data-origin-width=&quot;1651&quot; data-origin-height=&quot;479&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1651&quot; data-origin-height=&quot;479&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bV2h2J/btsNn2JZ7P2/ep0Tl5veOicanP4i5Xerq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bV2h2J/btsNn2JZ7P2/ep0Tl5veOicanP4i5Xerq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bV2h2J/btsNn2JZ7P2/ep0Tl5veOicanP4i5Xerq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbV2h2J%2FbtsNn2JZ7P2%2Fep0Tl5veOicanP4i5Xerq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1651&quot; height=&quot;479&quot; data-origin-width=&quot;1651&quot; data-origin-height=&quot;479&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;skb-&amp;gt;&lt;b&gt;head&lt;/b&gt; 는 &lt;b&gt;skb 시작&lt;/b&gt; 주소,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;skb-&amp;gt;&lt;b&gt;end&lt;/b&gt; 는 &lt;b&gt;skb 끝&lt;/b&gt; 주소,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;skb-&amp;gt;&lt;b&gt;data&lt;/b&gt; 는 &lt;b&gt;페이로드 시작&lt;/b&gt; 주소, 기본값 0이고, skb_reserve(n) 으로 n 값만큼 변경됨(주소 정렬을 위해 사용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;skb-&amp;gt;&lt;b&gt;tail&lt;/b&gt; 은 &lt;b&gt;페이로드 끝&lt;/b&gt; 주소, 기본값 0이고, skb_reserve(n) 으로 skb-&amp;gt;data 와 동일 주소, skb_put(m) 으로 페이로드 길이(m)만큼 이동하여 페이로드 끝 주소 가리킴&lt;/p&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;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;4. 참고&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sk_buff 구조체는 Linux 커널 네트워킹 서브시스템의 핵심 데이터 구조로, &lt;b&gt;네트워크 패킷 메타데이터와 버퍼 관리 정보&lt;/b&gt;를 저장합니다. 다음은 공식 문서와 소스 코드를 기반으로 한 전체 정의와 상세 설명입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;전체 구조체 정의&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1744858232841&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct sk_buff {
    union {
        struct {
            struct sk_buff *next;   // 다음 SKB 포인터
            struct sk_buff *prev;   // 이전 SKB 포인터
            union {
                struct net_device *dev;  // 연관된 네트워크 디바이스
                unsigned long dev_scratch;  // dev 대체용
            };
        };
        struct rb_node rbnode;      // Red-Black 트리 노드 (netem/defrag용)
        struct list_head list;      // 리스트 헤드
    };

    union {
        struct sock *sk;            // 소켓 소유자
        int ip_defrag_offset;       // IP 조각화 오프셋
    };

    union {
        ktime_t tstamp;             // 패킷 타임스탬프
        u64 skb_mstamp_ns;         // 최초 전송 시간 (나노초)
    };

    char cb[48] __aligned(8);      // 컨트롤 버퍼 (레이어별 전용)

    union {
        struct {
            unsigned long _skb_refdst;  // 참조 대상 주소
            void (*destructor)(struct sk_buff *skb);  // 소멸자 함수
        };
        struct list_head tcp_tsorted_anchor;  // TCP 정렬 앵커
    };

    unsigned int len;               // 전체 데이터 길이
    unsigned int data_len;          // 페이지 데이터 길이
    __u16 mac_len;                  // MAC 헤더 길이
    __u16 hdr_len;                  // 복제된 SKB의 헤더 길이
    __u32 csum;                     // 체크섬 값
    __u32 csum_start;               // 체크섬 시작 오프셋

    union {
        struct {
            __u8 local_df:1;        // 로컬 단편화 허용
            __u8 cloned:1;          // 복제된 SKB 여부
            __u8 ip_summed:2;       // IP 체크섬 상태
            __u8 nohdr:1;           // 헤더 공간 확보 여부
        };
        __u8 pkt_type;              // 패킷 유형 (PACKET_HOST 등)
    };
    __u32 priority;                 // QoS 우선순위
    __u16 protocol;                 // 프로토콜 타입 (ETH_P_IP 등)
    __u16 security;                 // 보안 레이블

    /* 네트워크 계층 헤더 포인터 */
    union {
        struct tcphdr *th;          // TCP 헤더
        struct udphdr *uh;          // UDP 헤더
        struct icmphdr *icmph;      // ICMP 헤더
        struct iphdr *iph;          // IPv4 헤더
        struct ipv6hdr *ipv6h;      // IPv6 헤더
        unsigned char *raw;
    } h;

    /* 트랜스포트 계층 헤더 포인터 */
    union {
        struct iphdr *iph;          // IPv4 헤더
        struct ipv6hdr *ipv6h;      // IPv6 헤더
        struct arphdr *arph;        // ARP 헤더
        unsigned char *raw;
    } nh;

    /* 링크 계층 헤더 포인터 */
    union {
        unsigned char *raw;
    } mac;

    struct dst_entry *dst;          // 라우팅 엔트리
    struct sec_path *sp;            // 보안 경로 (IPsec용)
    struct nf_conntrack *nfct;      // Netfilter 연결 추적
    unsigned int nfctinfo;          // 연결 상태
    struct sk_buff_head *list;      // 소속 리스트 헤드

    /* 추가 필드 */
    unsigned int truesize;          // 전체 버퍼 크기
    atomic_t users;                 // 참조 카운터
    unsigned int head;              // 헤드 버퍼 시작
    unsigned int data;              // 데이터 시작
    unsigned int tail;              // 데이터 끝
    unsigned int end;               // 버퍼 끝
};&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 구조는 Linux 커널 버전에 따라 일부 차이가 있을 수 있음&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;영역별 상세 설명&lt;/b&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 리스트 관리&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;next/prev&lt;/b&gt;: SKB를 리스트/큐에 연결할 때 사용 (예: 소켓 송수신 큐)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;rbnode&lt;/b&gt;: 네트워크 에뮬레이션(netem)에서 Red-Black 트리 노드로 사용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;list&lt;/b&gt;: SKB가 속한 리스트 헤드 포인터&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 디바이스 관련&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;dev&lt;/b&gt;: 패킷이 처리되는 네트워크 인터페이스 (예: eth0)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;input_dev&lt;/b&gt;: 실제 패킷을 수신한 물리 디바이스&lt;/li&gt;
&lt;li&gt;&lt;b&gt;real_dev&lt;/b&gt;: 가상 디바이스(bonding, VLAN)의 실제 디바이스&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 프로토콜 헤더&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;h (L4)&lt;/b&gt;: skb-&amp;gt;h.th로 TCP 헤더 접근&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;nh (L3)&lt;/b&gt;: skb-&amp;gt;nh.iph로 IP 헤더 접근&lt;/li&gt;
&lt;li&gt;&lt;b&gt;mac (L2)&lt;/b&gt;: skb-&amp;gt;mac.raw로 이더넷 헤더 접근&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 메모리 관리&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;head&lt;/b&gt;: 할당된 버퍼 시작 주소&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;data&lt;/b&gt;: 실제 데이터 시작 위치&lt;/li&gt;
&lt;li&gt;&lt;b&gt;tail&lt;/b&gt;: 현재 데이터 끝 위치&lt;/li&gt;
&lt;li&gt;&lt;b&gt;end&lt;/b&gt;: 버퍼의 물리적 끝 주소&lt;/li&gt;
&lt;li&gt;&lt;b&gt;truesize&lt;/b&gt;: 전체 버퍼 크기 (head + end)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. 패킷 메타데이터&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;len&lt;/b&gt;: 유효 데이터 길이 (data_len + 헤더)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;data_len&lt;/b&gt;: 페이지 기반 데이터 길이 (scatter/gather용)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;csum&lt;/b&gt;: 체크섬 값 (하드웨어 오프로드 시 사용)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. 소켓/보안&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;sk&lt;/b&gt;: 패킷을 소유한 소켓 객체&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;sp&lt;/b&gt;: IPsec 보안 경로 정보&lt;/li&gt;
&lt;li&gt;&lt;b&gt;nfct&lt;/b&gt;: Netfilter 연결 추적 정보&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;7. 시간 관리&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;tstamp&lt;/b&gt;: 패킷 도착/전송 시간 (패킷 스니퍼용)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;skb_mstamp_ns&lt;/b&gt;: TCP 재전송 타이머 시작 시간&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;8. 참조 관리&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;users&lt;/b&gt;: 참조 카운터 (복제 시 증가)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;destructor&lt;/b&gt;: SKB 해제 시 호출되는 함수&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;특수 멤버 심층 분석&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;cb 컨트롤 버퍼&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&lt;span style=&quot;color: #c5c8c6; text-align: right;&quot;&gt;&lt;span style=&quot;color: #b294bb;&quot;&gt;char&lt;/span&gt;&lt;span&gt; cb&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style=&quot;color: #de935f;&quot;&gt;48&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;__aligned&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #de935f;&quot;&gt;8&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style=&quot;color: #969896;&quot;&gt;// 레이어별 전용 공간&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TCP: struct tcp_skb_cb 저장&lt;/li&gt;
&lt;li&gt;IP: fragmentation 정보 저장&lt;/li&gt;
&lt;li&gt;48바이트 정렬 구조체 주입 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;_skb_refdst 라우팅 캐시&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&lt;span style=&quot;color: #c5c8c6; text-align: right;&quot;&gt;&lt;span style=&quot;color: #b294bb;&quot;&gt;unsigned&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style=&quot;color: #b294bb;&quot;&gt;long&lt;/span&gt;&lt;span&gt; _skb_refdst&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style=&quot;color: #969896;&quot;&gt;// dst_entry 참조 + 플래그 결합&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하위 2비트: 참조 상태 플래그&lt;/li&gt;
&lt;li&gt;상위 비트: struct dst_entry 주소&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;cloned 플래그&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&lt;span style=&quot;color: #c5c8c6; text-align: right;&quot;&gt;&lt;span&gt;__u8 cloned&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style=&quot;color: #de935f;&quot;&gt;1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style=&quot;color: #969896;&quot;&gt;// 복제된 SKB 여부&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;skb_clone() 시 1로 설정&lt;/li&gt;
&lt;li&gt;데이터 버퍼 공유 시 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 설명은 Linux 커널 5.15 기준으로, 모든 필드를 누락 없이 기술했습니다. 실제 구현은 아키텍처와 커널 버전에 따라 다를 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>IT/python</category>
      <category>linx kernel</category>
      <category>netdev_alloc_skb</category>
      <category>skp_put</category>
      <category>skp_reserve</category>
      <category>sk_buff 구조체</category>
      <category>네트워크 드라이버 개발</category>
      <category>네트워크 프로그래밍</category>
      <category>리눅스 커널 심층 분석</category>
      <category>커널 메모리 관리</category>
      <category>패킷 처리 최적화</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/369</guid>
      <comments>https://simryang.tistory.com/entry/Linux-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%ED%8C%A8%ED%82%B7-%EA%B4%80%EB%A6%AC%EC%9D%98-%ED%95%B5%EC%8B%AC-skbuff-%EA%B5%AC%EC%A1%B0%EC%B2%B4%EC%99%80-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%A0%88%EC%9D%B4%EC%95%84%EC%9B%83#entry369comment</comments>
      <pubDate>Thu, 17 Apr 2025 12:01:29 +0900</pubDate>
    </item>
    <item>
      <title>ChatGPT에서 마크다운(markdown) 출력, 왜 파일로는 완전한데 대화 중에는 달라 보일까?</title>
      <link>https://simryang.tistory.com/entry/ChatGPT%EC%97%90%EC%84%9C-%EB%A7%88%ED%81%AC%EB%8B%A4%EC%9A%B4markdown-%EC%B6%9C%EB%A0%A5-%EC%99%9C-%ED%8C%8C%EC%9D%BC%EB%A1%9C%EB%8A%94-%EC%99%84%EC%A0%84%ED%95%9C%EB%8D%B0-%EB%8C%80%ED%99%94-%EC%A4%91%EC%97%90%EB%8A%94-%EB%8B%AC%EB%9D%BC-%EB%B3%B4%EC%9D%BC%EA%B9%8C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;최근 ChatGPT를 사용하면서 마크다운 형식의 문서를 출력할 일이 많아졌습니다. 그런데 한 가지 이상한 점을 발견했죠. &lt;b&gt;대화 중에 보여주는 마크다운은 자꾸 흐름이 끊기거나 설명문으로 바뀌는데, 같은 내용을 파일로 다운로드하면 포맷이 완벽하게 유지됩니다.&lt;/b&gt; 왜 이런 차이가 생길까요?&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 현상 요약&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ChatGPT에게 마크다운 문서를 생성해달라고 하면, 처음에는 코드 블록(````markdown`)으로 잘 출력됩니다.&lt;/li&gt;
&lt;li&gt;하지만 중간쯤 가면 &lt;b&gt;설명체 문장이나 일반 텍스트&lt;/b&gt;로 바뀌는 경우가 많습니다.&lt;/li&gt;
&lt;li&gt;반면, &lt;b&gt;같은 내용을 파일로 저장 요청하면 포맷이 정확히 보존됩니다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;README.md 내용을 작성해줘&quot; &amp;rarr; 대화창에서는 중간에 설명이 섞임 &quot;파일로 만들어줘&quot; &amp;rarr; 다운로드 받은 .md 파일은 완벽함&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이유는?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ChatGPT의 &lt;b&gt;출력 방식 차이&lt;/b&gt; 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력 경로 처리 방식 특징&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;대화창 (chat UI)&lt;/td&gt;
&lt;td&gt;사용자 친화적 렌더링&lt;/td&gt;
&lt;td&gt;자동 요약, 설명체 섞임, 긴 블록 생략 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;파일 다운로드&lt;/td&gt;
&lt;td&gt;순수 텍스트 저장&lt;/td&gt;
&lt;td&gt;포맷 100% 보존, 자동 처리 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;즉, ChatGPT는 대화 중 출력을 &amp;ldquo;보기 좋게 가공&amp;rdquo;하는 반면, 파일 출력은 있는 그대로 제공합니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;사용자 입장에서 왜 불편한가?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;솔직히 말씀드리면... 써보면 압니다. md 파일 포맷일때는 내용이 긁어지는데.. 이걸 gpt 가 자신이 대화하는 것처럼 해석해서 보여줘버리면 코드 블럭에 해당되는 위치에서 복사된 내용이 끊겨있게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 일부 사용자들은 처음부터 아예 이렇게 요청합니다:&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;마크다운 전체를 코드 블록으로 출력해줘. 설명 없이 복사하기 쉽게.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;파일로 저장해서 다운로드하게 해줘.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;그럼 어떻게 대응해야 하나?&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔️ 방법 1: 처음부터 코드 블록 강조 요청&lt;/h3&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;README 전체를 markdown 코드 블록으로만 출력해줘. 설명은 하지 마.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔️ 방법 2: 파일 다운로드 요청&lt;/h3&gt;
&lt;pre class=&quot;erlang&quot;&gt;&lt;code&gt;파일로 만들어서 다운로드할 수 있게 해줘.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔️ 방법 3: 출력 오류 시 직접 요청&lt;/h3&gt;
&lt;pre class=&quot;erlang&quot;&gt;&lt;code&gt;중간에 설명이 섞였는데, 마크다운 전체를 다시 순수 코드 블록으로만 보여줘.
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;정리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ChatGPT는 대화 경험을 더 좋게 만들기 위해 출력 내용을 가공하지만, &lt;b&gt;개발자나 문서 작성자 입장에서는 오히려 불편함을 줄 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 마크다운이나 코드 같은 &lt;b&gt;정확한 포맷 유지가 중요한 작업은 파일로 받는 방식이 가장 안전합니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 이 현상은 OpenAI 개발자들도 인지하고 있으며, 향후 개선 여지가 있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필요하다면 ChatGPT에 직접 피드백을 남기거나, 파일 기반 활용 방식을 익혀두는 것을 추천합니다.&lt;/p&gt;</description>
      <category>IT/AI</category>
      <category>ChatGPT</category>
      <category>Markdown</category>
      <category>README.MD</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/367</guid>
      <comments>https://simryang.tistory.com/entry/ChatGPT%EC%97%90%EC%84%9C-%EB%A7%88%ED%81%AC%EB%8B%A4%EC%9A%B4markdown-%EC%B6%9C%EB%A0%A5-%EC%99%9C-%ED%8C%8C%EC%9D%BC%EB%A1%9C%EB%8A%94-%EC%99%84%EC%A0%84%ED%95%9C%EB%8D%B0-%EB%8C%80%ED%99%94-%EC%A4%91%EC%97%90%EB%8A%94-%EB%8B%AC%EB%9D%BC-%EB%B3%B4%EC%9D%BC%EA%B9%8C#entry367comment</comments>
      <pubDate>Mon, 31 Mar 2025 14:25:57 +0900</pubDate>
    </item>
    <item>
      <title>2025년 산불 현황 지도 안내</title>
      <link>https://simryang.tistory.com/entry/2025%EB%85%84-%EC%82%B0%EB%B6%88-%ED%98%84%ED%99%A9-%EC%A7%80%EB%8F%84-%EC%95%88%EB%82%B4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;2025년 들어 대한민국 전역에서 산불 발생이 잦아지고 있습니다. 특히 3월은 강풍과 건조한 날씨로 인해 산불 위험이 매우 높으며, 실제로 강원도와 경북 지역에서 대형 산불이 잇따라 발생하고 있습니다. 본 글에서는 실시간 산불 정보를 확인할 수 있는 지도를 소개하고자 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 5년간 대한민국에서는 연평균 수백 건의 산불이 발생하고 있으며, 기후 변화로 인해 발생 빈도와 피해 규모가 점점 커지고 있습니다. 주요 산불 발생 지역은 강원도, 경상북도, 충청북도 등이며, 봄철 강수량 부족과 이상 고온 현상이 주요 원인으로 지목되고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2025년 3월 기준, 전국적으로 20건 이상의 산불이 발생했으며 특히 양양군, 울진군 등에서 대규모 피해가 보고되었습니다. 수백 헥타르의 산림이 불에 탔고, 수천 명이 대피하는 등 인명 및 재산 피해가 이어지고 있습니다. 산림청은 진화율과 진행 상태를 실시간으로 공개하며 총력 대응 중입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;산림청이 운영하는 &lt;a href=&quot;https://fd.forest.go.kr/ffas/pubConn/movePage/main_simple.do?systemCode=ffasout_c&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&amp;lsquo;실시간 산불정보 서비스&amp;rsquo;&lt;/a&gt;는 가장 신뢰할 수 있는 공식 정보 제공 사이트입니다. 해당 사이트는 모바일과 PC 모두에서 접근 가능하며, 산불 발생 위치, 시각, 진행 상태, 진화율 등을 확인할 수 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실시간 산불정보 사이트 사용법&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사이트 접속 후 &amp;lsquo;산불별 산불상황 세부정보&amp;rsquo; 섹션을 확인&lt;/li&gt;
&lt;li&gt;표 형식으로 지역, 발생 시각, 진화율, 상태 등이 표시됨&lt;/li&gt;
&lt;li&gt;지도에는 다음과 같은 범례가 함께 제공됨:&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;189&quot; data-origin-height=&quot;227&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Cfofr/btsMY8iY2Ia/KZS3BNQ9Cy0cIZXEPb1TaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Cfofr/btsMY8iY2Ia/KZS3BNQ9Cy0cIZXEPb1TaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Cfofr/btsMY8iY2Ia/KZS3BNQ9Cy0cIZXEPb1TaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCfofr%2FbtsMY8iY2Ia%2FKZS3BNQ9Cy0cIZXEPb1TaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;189&quot; height=&quot;227&quot; data-origin-width=&quot;189&quot; data-origin-height=&quot;227&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;범례 해설:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;화선 (빨간 선):&lt;/b&gt; 현재 불길이 퍼지고 있는 구역&lt;/li&gt;
&lt;li&gt;&lt;b&gt;진화완료 (노란 선):&lt;/b&gt; 진화 작업이 끝난 지역&lt;/li&gt;
&lt;li&gt;&lt;b&gt;저지선 (갈색 점선):&lt;/b&gt; 화재 확산을 막기 위한 인위적 차단선&lt;/li&gt;
&lt;li&gt;&lt;b&gt;풍속항 (파란 선):&lt;/b&gt; 바람 방향 및 속도 표시&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lsquo;진행 중&amp;rsquo;&lt;/b&gt;은 아직 불이 번지고 있는 상태이며, &lt;b&gt;&amp;lsquo;진화 완료&amp;rsquo;&lt;/b&gt;는 모든 불길이 제거된 상태를 뜻합니다. 진화율은 전체 화재 면적 대비 진압된 면적 비율(%)이며, 100%라도 일정 시간 동안 잔불 감시는 계속됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹시나 산불 발생 시에는 즉시 119나 1688-3119(산림청)로 신고하고, 방송이나 재난문자를 통해 안내받은 안전지대로 대피해야 합니다.&lt;/p&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;제발 정치적 혼란이 하루 빨리 해결되어 급히 대책 마련과 구호가 원활하게 이뤄졌으면 좋겠습니다..&lt;/p&gt;</description>
      <category>세상</category>
      <category>산불</category>
      <category>지도</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/366</guid>
      <comments>https://simryang.tistory.com/entry/2025%EB%85%84-%EC%82%B0%EB%B6%88-%ED%98%84%ED%99%A9-%EC%A7%80%EB%8F%84-%EC%95%88%EB%82%B4#entry366comment</comments>
      <pubDate>Thu, 27 Mar 2025 17:32:12 +0900</pubDate>
    </item>
    <item>
      <title>Valkey vs Redis: 2024 오픈소스 인메모리 DB 선택 가이드 및 기능 비교</title>
      <link>https://simryang.tistory.com/entry/Valkey-vs-Redis-2024-%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4-%EC%9D%B8%EB%A9%94%EB%AA%A8%EB%A6%AC-DB-%EC%84%A0%ED%83%9D-%EA%B0%80%EC%9D%B4%EB%93%9C-%EB%B0%8F-%EA%B8%B0%EB%8A%A5-%EB%B9%84%EA%B5%90</link>
      <description>&lt;p&gt;Redis의 라이선스 변경 이후, 오픈소스 기반의 대안 DB를 찾는 움직임이 활발해졌고, 그 중심에 &lt;strong&gt;Valkey&lt;/strong&gt;가 있습니다.&lt;br&gt;
이 글에서는 Redis와 Valkey의 기능, 사용 환경, 클라우드 지원, AI 확장성, 라이선스 구조를 비교하고, 실제 사용 시 어떤 선택이 적합한지 안내합니다.&lt;/p&gt;

&lt;hr&gt;

&lt;h3&gt;  Redis의 라이선스 변화와 Valkey의 탄생 배경&lt;/h3&gt;
&lt;p&gt;Redis는 2023년부터 &lt;strong&gt;라이선스를 RSAL/BSL 형태로 변경&lt;/strong&gt;하면서, SaaS 환경이나 클라우드 제품에서의 자유로운 사용에 제약이 생겼습니다.&lt;br&gt;
이로 인해 기업과 커뮤니티에서는 기존과 동일한 API·구조를 유지하면서도 오픈소스 철학을 지키는 대안이 필요해졌고, 그 결과 &lt;strong&gt;Redis 7.2.4를 기반으로 한 Valkey&lt;/strong&gt;가 Linux Foundation 주도로 등장했습니다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Redis Inc.&lt;/strong&gt;: 다양한 고급 기능을 제공하지만, &lt;strong&gt;라이선스와 사용 제한&lt;/strong&gt;에 유의해야 함&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Valkey&lt;/strong&gt;: BSD-3 기반의 완전한 오픈소스, &lt;strong&gt;커뮤니티 중심 개발과 배포의 자유&lt;/strong&gt;를 지향&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;

&lt;h3&gt;  기능 및 운영 환경 비교&lt;/h3&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;6&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;항목&lt;/th&gt;
      &lt;th&gt;Redis 8.x&lt;/th&gt;
      &lt;th&gt;Valkey 8.x&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;라이선스&lt;/td&gt;
      &lt;td&gt;RSAL / BSL (상업적 사용 시 제한될 수 있음)&lt;/td&gt;
      &lt;td&gt;BSD-3-Clause (완전한 자유 보장)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;모듈 (Stack 포함)&lt;/td&gt;
      &lt;td&gt;RedisStack (RediSearch, RedisAI, RedisJSON 등 포함)&lt;/td&gt;
      &lt;td&gt;Stack 모듈은 포함하지 않으며, 커뮤니티 제안 방식으로 기능 확장 논의 가능&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;AI/벡터/검색&lt;/td&gt;
      &lt;td&gt;RediSearch 및 RedisAI 모듈을 통해 공식 지원&lt;/td&gt;
      &lt;td&gt;공식 지원 없음. 일부 실험적 시도는 있지만 실무 적용에는 안정성 부족&lt;br&gt;&lt;a href=&quot;https://github.com/valkey-io/valkey/discussions&quot; target=&quot;_blank&quot;&gt;GitHub Discussions&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;멀티스레드 I/O&lt;/td&gt;
      &lt;td&gt;읽기/쓰기 모두 멀티스레드 지원&lt;/td&gt;
      &lt;td&gt;복수 쓰레드 처리와 비동기 복제 최적화로 경량 환경에 유리&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;보안/TLS 지원&lt;/td&gt;
      &lt;td&gt;기본 내장&lt;/td&gt;
      &lt;td&gt;빌드 시 옵션 또는 동적 모듈로 적용 가능&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;클러스터 및 Sentinel&lt;/td&gt;
      &lt;td&gt;Enterprise 구성 시 자동화된 설정 사용 (자유도 제한 가능)&lt;/td&gt;
      &lt;td&gt;모든 구성을 사용자가 직접 제어 가능. systemd 연동도 간단&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;운영 배포 도구&lt;/td&gt;
      &lt;td&gt;Helm Chart, 공식 Docker 이미지 제공&lt;/td&gt;
      &lt;td&gt;Docker 이미지 및 Helm Chart는 준비 중. 현재는 소스 설치 기반&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;클라우드 공식 지원&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;
        &lt;ul&gt;
          &lt;li&gt;AWS ElastiCache (Redis)&lt;/li&gt;
          &lt;li&gt;Google Cloud Memorystore (Redis)&lt;/li&gt;
          &lt;li&gt;Microsoft Azure Cache for Redis&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/td&gt;
      &lt;td&gt;
        &lt;ul&gt;
          &lt;li&gt;AWS ElastiCache – 공식 기여자 참여&lt;br&gt;
            &lt;a href=&quot;https://aws.amazon.com/blogs/opensource/introducing-valkey-an-open-source-in-memory-store/&quot; target=&quot;_blank&quot;&gt;AWS 발표&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;GCP Memorystore for Valkey – 7.2 / 8.0 지원&lt;br&gt;
            &lt;a href=&quot;https://cloud.google.com/memorystore/docs/valkey?hl=ko&quot; target=&quot;_blank&quot;&gt;공식 문서&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;Azure AKS – Helm Chart 기반 배포 가능&lt;br&gt;
            &lt;a href=&quot;https://learn.microsoft.com/ko-kr/azure/aks/valkey-overview&quot; target=&quot;_blank&quot;&gt;Azure 문서&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;blockquote&gt;
  &lt;strong&gt;한눈에 요약:&lt;/strong&gt;&lt;br&gt;
Valkey는 자유로운 배포, 커뮤니티 중심 거버넌스, 경량 구조에서 유리하며,&lt;br&gt;
Redis는 AI/벡터 검색, 모듈 생태계, 클라우드 제품 연계에 강점을 갖습니다.
&lt;/blockquote&gt;

&lt;hr&gt;

&lt;h3&gt;  어떤 상황에서 Redis 또는 Valkey를 선택해야 할까?&lt;/h3&gt;

&lt;table border=&quot;1&quot; cellpadding=&quot;6&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;상황&lt;/th&gt;
      &lt;th&gt;추천&lt;/th&gt;
      &lt;th&gt;Redis를 선택하는 이유&lt;/th&gt;
      &lt;th&gt;Valkey를 선택하는 이유&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;상업용 SaaS 또는 배포 가능한 제품에 Redis를 통합할 때&lt;/td&gt;
      &lt;td&gt;Valkey&lt;/td&gt;
      &lt;td&gt;Redis는 해당 경우 라이선스 검토가 필수&lt;/td&gt;
      &lt;td&gt;BSD-3로 자유로운 SaaS, 배포, 수정 허용&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;AI, 벡터 검색, JSON 처리 등 고급 기능이 필요한 경우&lt;/td&gt;
      &lt;td&gt;Redis&lt;/td&gt;
      &lt;td&gt;Redis Stack에서 해당 기능 모듈 제공&lt;/td&gt;
      &lt;td&gt;현재 공식 지원 없음, 일부 실험 사례 존재&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;빠른 CI/CD 연동 및 DevOps 통합이 필요한 경우&lt;/td&gt;
      &lt;td&gt;Redis&lt;/td&gt;
      &lt;td&gt;Docker, Helm Chart 등 공식 제공&lt;/td&gt;
      &lt;td&gt;준비 중이거나 커뮤니티 기반으로 제공됨&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;클러스터 구성을 세밀하게 제어해야 할 경우&lt;/td&gt;
      &lt;td&gt;Valkey&lt;/td&gt;
      &lt;td&gt;Redis Enterprise에서는 설정 유연성 제한 가능&lt;/td&gt;
      &lt;td&gt;구성 파일, 시스템 설정까지 운영자 자유 설정&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;거버넌스, 커뮤니티 참여, 지속 가능성을 중시할 때&lt;/td&gt;
      &lt;td&gt;Valkey&lt;/td&gt;
      &lt;td&gt;Redis는 &lt;strong&gt;기업 중심 개발 구조&lt;/strong&gt;로 주요 의사결정이 비공개로 이뤄짐&lt;/td&gt;
      &lt;td&gt;Linux Foundation 기반으로 &lt;strong&gt;기능 제안, 개선 참여 모두 공개&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;hr&gt;

&lt;h3&gt;  Redis에서 Valkey로 마이그레이션&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Redis 7.2.4 기반과 동일한 구조로 운영 가능&lt;/li&gt;
  &lt;li&gt;AOF / RDB 포맷 호환, Replica 구성 유지&lt;/li&gt;
  &lt;li&gt;클러스터 구조, Sentinel 설정도 유사하게 전환 가능&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://valkey.io/topics/migration/&quot; target=&quot;_blank&quot;&gt;Valkey Migration Guide&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.percona.com/blog/migrate-from-redis-to-valkey-without-downtime/&quot; target=&quot;_blank&quot;&gt;Percona 전환 가이드&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;

&lt;h3&gt;  참고 자료&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://valkey.io&quot; target=&quot;_blank&quot;&gt;Valkey 공식 홈페이지&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/valkey-io/valkey&quot; target=&quot;_blank&quot;&gt;Valkey GitHub&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/valkey-io/valkey/discussions&quot; target=&quot;_blank&quot;&gt;Valkey Discussions – Stack/AI 관련&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/stack/overview/&quot; target=&quot;_blank&quot;&gt;Redis Stack 공식 문서&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://aws.amazon.com/blogs/opensource/introducing-valkey-an-open-source-in-memory-store/&quot; target=&quot;_blank&quot;&gt;AWS 발표&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://cloud.google.com/memorystore/docs/valkey?hl=ko&quot; target=&quot;_blank&quot;&gt;GCP - Valkey 공식 지원&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/ko-kr/azure/aks/valkey-overview&quot; target=&quot;_blank&quot;&gt;Azure - Valkey 클러스터 구성&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://valkey.io/topics/migration/&quot; target=&quot;_blank&quot;&gt;Valkey Migration Guide&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.percona.com/blog/migrate-from-redis-to-valkey-without-downtime/&quot; target=&quot;_blank&quot;&gt;Percona 전환 사례&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>IT/python</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/365</guid>
      <comments>https://simryang.tistory.com/entry/Valkey-vs-Redis-2024-%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4-%EC%9D%B8%EB%A9%94%EB%AA%A8%EB%A6%AC-DB-%EC%84%A0%ED%83%9D-%EA%B0%80%EC%9D%B4%EB%93%9C-%EB%B0%8F-%EA%B8%B0%EB%8A%A5-%EB%B9%84%EA%B5%90#entry365comment</comments>
      <pubDate>Thu, 27 Mar 2025 16:56:44 +0900</pubDate>
    </item>
    <item>
      <title>[git] gitlab 접속시 pageant 로 ssh 키 사용하는 가이드</title>
      <link>https://simryang.tistory.com/entry/git-gitlab-%EC%A0%91%EC%86%8D%EC%8B%9C-pageant-%EB%A1%9C-ssh-%ED%82%A4-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</link>
      <description>&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;GitLab 접속 시 Pageant를 활용해 SSH 키를 안전하고 간편하게 관리하는 방법을 단계별로 안내합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GitLab 이용에 필요한 SSH 접속 설정 과정을 쉽고 빠르게 따라할 수 있도록 설명합니다.&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;GitLab SSH 키 등록하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;GitLab 로그인 및 SSH Keys 접근&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GitLab 홈페이지(&lt;a href=&quot;https://gitlab.com&quot; data-end=&quot;176&quot; data-start=&quot;144&quot;&gt;gitlab.com&lt;/a&gt;)에 로그인 후, 상단 메뉴에서 &lt;b&gt;SSH Keys&lt;/b&gt; 항목을 찾습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;등록된 프로젝트가 없으면 작업 대시보드에 기본 예시 이미지가 표시될 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SSH 키 등록&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Add new key&lt;/b&gt; 버튼을 클릭합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성한 공개키 내용을 복사하여 입력한 후 저장합니다.&lt;/p&gt;
&lt;h2 data-end=&quot;394&quot; data-start=&quot;364&quot; data-ke-size=&quot;size26&quot;&gt;GitLab 대시보드 및 사용자 설정 확인&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;대시보드 구성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왼쪽 최상단의 여우 아이콘은 홈페이지 링크입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1257&quot; data-origin-height=&quot;628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAmMmD/btsMnpFZz74/4seKsJXw0nPaq864t4b45k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAmMmD/btsMnpFZz74/4seKsJXw0nPaq864t4b45k/img.png&quot; data-alt=&quot;gitlab 대시보드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAmMmD/btsMnpFZz74/4seKsJXw0nPaq864t4b45k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAmMmD%2FbtsMnpFZz74%2F4seKsJXw0nPaq864t4b45k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1257&quot; height=&quot;628&quot; data-origin-width=&quot;1257&quot; data-origin-height=&quot;628&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;gitlab 대시보드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 오른쪽에 사각형 아이콘, &lt;b&gt;+&lt;/b&gt; 아이콘, 사용자 프로필 아이콘이 순서대로 위치해 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;259&quot; data-origin-height=&quot;309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zZEf3/btsMnyCJ69N/MckgGGIASroNPe9wVbTru0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zZEf3/btsMnyCJ69N/MckgGGIASroNPe9wVbTru0/img.png&quot; data-alt=&quot;gitlab 사용자 프로필&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zZEf3/btsMnyCJ69N/MckgGGIASroNPe9wVbTru0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzZEf3%2FbtsMnyCJ69N%2FMckgGGIASroNPe9wVbTru0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;259&quot; height=&quot;309&quot; data-origin-width=&quot;259&quot; data-origin-height=&quot;309&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;gitlab 사용자 프로필&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;사용자 설정 변경&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Preferences&lt;/b&gt; 링크를 클릭하면 메뉴 그룹이 &lt;b&gt;Your work&lt;/b&gt;에서 &lt;b&gt;User Settings&lt;/b&gt;로 변경됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 &lt;b&gt;SSH Keys&lt;/b&gt; 메뉴를 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;463&quot; data-origin-height=&quot;712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWr6BE/btsMoAl5g9a/KzfrPfbhy7C9QeKzBhtbfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWr6BE/btsMoAl5g9a/KzfrPfbhy7C9QeKzBhtbfk/img.png&quot; data-alt=&quot;gitlab 사용자 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWr6BE/btsMoAl5g9a/KzfrPfbhy7C9QeKzBhtbfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWr6BE%2FbtsMoAl5g9a%2FKzfrPfbhy7C9QeKzBhtbfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;463&quot; height=&quot;712&quot; data-origin-width=&quot;463&quot; data-origin-height=&quot;712&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;gitlab 사용자 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1656&quot; data-origin-height=&quot;552&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WF7dT/btsMmLbEwZC/sAJM1D8hnlJbQ5sPFFbkck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WF7dT/btsMmLbEwZC/sAJM1D8hnlJbQ5sPFFbkck/img.png&quot; data-alt=&quot;gitlab SSH Keys&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WF7dT/btsMmLbEwZC/sAJM1D8hnlJbQ5sPFFbkck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWF7dT%2FbtsMmLbEwZC%2FsAJM1D8hnlJbQ5sPFFbkck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1656&quot; height=&quot;552&quot; data-origin-width=&quot;1656&quot; data-origin-height=&quot;552&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;gitlab SSH Keys&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;959&quot; data-origin-height=&quot;818&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cShyoC/btsMmsDpA1g/tRQZNKkLvKDTNRZmXRlFAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cShyoC/btsMmsDpA1g/tRQZNKkLvKDTNRZmXRlFAk/img.png&quot; data-alt=&quot;gitlab SSH Keys 추가&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cShyoC/btsMmsDpA1g/tRQZNKkLvKDTNRZmXRlFAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcShyoC%2FbtsMmsDpA1g%2FtRQZNKkLvKDTNRZmXRlFAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;959&quot; height=&quot;818&quot; data-origin-width=&quot;959&quot; data-origin-height=&quot;818&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;gitlab SSH Keys 추가&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-end=&quot;674&quot; data-start=&quot;647&quot; data-ke-size=&quot;size26&quot;&gt;Pageant를 통한 SSH 키 관리&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Pageant 실행 및 키 추가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pageant를 실행한 후, 생성한 SSH 키를 &lt;b&gt;Add Key&lt;/b&gt; 버튼을 통해 추가합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;671&quot; data-origin-height=&quot;417&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhgLbJ/btsMmmi41so/kUJsAu22oXjmHKBEdHGEKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhgLbJ/btsMmmi41so/kUJsAu22oXjmHKBEdHGEKk/img.png&quot; data-alt=&quot;pageant 실행 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhgLbJ/btsMmmi41so/kUJsAu22oXjmHKBEdHGEKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhgLbJ%2FbtsMmmi41so%2FkUJsAu22oXjmHKBEdHGEKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;671&quot; height=&quot;417&quot; data-origin-width=&quot;671&quot; data-origin-height=&quot;417&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;pageant 실행 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고:&lt;/b&gt; PuTTY 용 키인 .ppk 파일로 변환된 키만 사용할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;227&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wECzn/btsMm07GELD/f3GZgqTKa9Y16L3Bz7DK5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wECzn/btsMm07GELD/f3GZgqTKa9Y16L3Bz7DK5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wECzn/btsMm07GELD/f3GZgqTKa9Y16L3Bz7DK5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwECzn%2FbtsMm07GELD%2Ff3GZgqTKa9Y16L3Bz7DK5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;776&quot; height=&quot;227&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;227&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Git 접속 도구 선택&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우용 Git은 기본적으로 ssh.exe를 사용하지만, 이는 Pageant와 연동되지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결방법:&lt;/b&gt; PuTTY가 제공하는 plink.exe를 사용하면 Pageant와 연동하여 SSH 키로 접속할 수 있습니다.&lt;/p&gt;
&lt;h2 data-end=&quot;1011&quot; data-start=&quot;988&quot; data-ke-size=&quot;size26&quot;&gt;GIT_SSH 환경 변수 설정&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시스템 환경 변수에 등록&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;제어판 &amp;gt; 시스템 및 보안 &amp;gt; 시스템 &amp;gt; 고급 시스템 설정 &amp;gt; 고급&lt;/b&gt; 탭의 &lt;b&gt;환경 변수&lt;/b&gt; 항목에서 GIT_SSH 값을 추가합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;값으로는 C:\Program Files\PuTTY\plink.EXE와 같이 plink.exe의 경로를 지정합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;531&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DRdkD/btsMnyv4uC3/KM8ioTjKTDNY79dP8QJAAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DRdkD/btsMnyv4uC3/KM8ioTjKTDNY79dP8QJAAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DRdkD/btsMnyv4uC3/KM8ioTjKTDNY79dP8QJAAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDRdkD%2FbtsMnyv4uC3%2FKM8ioTjKTDNY79dP8QJAAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;477&quot; height=&quot;531&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;531&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brI7z8/btsMoilJDtq/KVrkOaI43kERNPnXpDLED0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brI7z8/btsMoilJDtq/KVrkOaI43kERNPnXpDLED0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brI7z8/btsMoilJDtq/KVrkOaI43kERNPnXpDLED0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrI7z8%2FbtsMoilJDtq%2FKVrkOaI43kERNPnXpDLED0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;626&quot; height=&quot;586&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;586&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;일회성 설정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 cmd.exe에서 한 번만 사용하려면 아래 명령어를 입력합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1739939613571&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;set GIT_SSH=C:\Program Files\PuTTY\plink.EXE&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;1353&quot; data-start=&quot;1336&quot; data-ke-size=&quot;size26&quot;&gt;SSH 접속 테스트&lt;/h2&gt;
&lt;p data-end=&quot;1393&quot; data-start=&quot;1355&quot; data-ke-size=&quot;size16&quot;&gt;cmd.exe를 열고 아래 명령어를 실행해 SSH 접속을 확인합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1739939675155&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;%GIT_SSH% git@gitlab.com&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 접속 시, 서버의 호스트 키가 캐시에 없다는 경고 메시지가 표시됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버의 SSH 키 지문이 출력되면 신뢰할 경우 y를 입력해 캐시에 추가합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 &quot;Using username 'git'&quot;과 함께 접속이 진행되며, GitLab 환영 메시지가 출력됩니다.&lt;/p&gt;
&lt;p data-end=&quot;1594&quot; data-start=&quot;1588&quot; data-ke-size=&quot;size16&quot;&gt;예시 출력:&lt;/p&gt;
&lt;pre id=&quot;code_1739940307407&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;D:\doc\vcs\project1&amp;gt; %GIT_SSH% git@gitlab.com
The server's host key is not cached in the registry. You
have no guarantee that the server is the computer you
think it is.
The server's ssh-ed12345 key fingerprint is:
ssh-ed12345 255 1a:2b:3c:4d:5e:6f:70:81:92:a3:b4:c5:d6:e7:f8:09
If you trust this host, enter &quot;y&quot; to add the key to
PuTTY's cache and carry on connecting.
If you want to carry on connecting just once, without
adding the key to the cache, enter &quot;n&quot;.
If you do not trust this host, press Return to abandon the
connection.
Store key in cache? (y/n) y
Using username &quot;git&quot;.
Access granted. Press Return to begin session.
Server refused to allocate pty
Welcome to GitLab, @your_gitlab_id&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-end=&quot;2290&quot; data-start=&quot;2261&quot; data-ke-size=&quot;size26&quot;&gt;Git 명령어를 통한 원격 저장소 테스트&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;원격 저장소 설정 변경&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트를 위해 빈 저장소를 생성한 후, 기존 원격 저장소 이름을 변경하고 새로 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1739940455567&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git remote rename origin old-origin
git remote add origin git@gitlab.com:your_gitlab_id/project1.git&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;전체 브랜치 Push&lt;/h3&gt;
&lt;pre id=&quot;code_1739940482582&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git push -u origin --all&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;pre id=&quot;code_1739940592406&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Counting objects: 6573, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3093/3093), done.
Writing objects: 100% (6573/6573), 405.16 MiB | 5.60 MiB/s, done.
Total 6573 (delta 3873), reused 6041 (delta 3431)
remote: Resolving deltas: 100% (3873/3873), done.
To gitlab.com:your_gitlab_id/project1.git
 * [new branch]      master -&amp;gt; master
 * [new branch]      debugging -&amp;gt; debugging
Branch 'master' set up to track remote branch 'master' from 'origin'.
Branch 'debugging' set up to track remote branch 'debugging' from 'origin'.&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;참고: PuTTY 공식 문서: &lt;a href=&quot;https://www.chiark.greenend.org.uk/~sgtatham/putty/docs.html&quot;&gt;https://www.chiark.greenend.org.uk/~sgtatham/putty/docs.html&lt;/a&gt;&lt;/p&gt;</description>
      <category>IT/VCS</category>
      <category>Git</category>
      <category>pagent</category>
      <category>VCS</category>
      <category>인증서</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/161</guid>
      <comments>https://simryang.tistory.com/entry/git-gitlab-%EC%A0%91%EC%86%8D%EC%8B%9C-pageant-%EB%A1%9C-ssh-%ED%82%A4-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0#entry161comment</comments>
      <pubDate>Wed, 19 Feb 2025 13:53:11 +0900</pubDate>
    </item>
    <item>
      <title>[Windows11] Dropbox 에서 USB 넣을 때마다 뜨는 카메라 업로드 끄기!!</title>
      <link>https://simryang.tistory.com/entry/Windows11-Dropbox-%EC%97%90%EC%84%9C-USB-%EB%84%A3%EC%9D%84-%EB%95%8C%EB%A7%88%EB%8B%A4-%EB%9C%A8%EB%8A%94-%EC%B9%B4%EB%A9%94%EB%9D%BC-%EC%97%85%EB%A1%9C%EB%93%9C-%EB%81%84%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;드랍박스를 쓰다보면 귀찮은 점이 있습니다. USB 메모리를 연결할 때마다 카메라 업로드 하라고 뜨는 것이 많이 짜증납니다.&lt;/p&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;삽질 끝에 발견한 내용 정리합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Windows + I 키를 누르거나 시작 메뉴에서 설정을 선택합니다.&lt;/li&gt;
&lt;li&gt;자동 실행 을 검색해서 선택합니다. (Bluetooth 및 장치 &amp;gt; 자동 실행 메뉴를 선택해도 됩니다)&lt;/li&gt;
&lt;li&gt;자동 실행 기본값 선택에 그 못된 녀석들이 있습니다. 원하는 걸로 얼른 바꿔줍니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;잘 모르시겠으면 아무것도 안함 선택하시면 됩니다.&lt;/li&gt;
&lt;li&gt;저는 폴더를 열어 파일 보기(파일 탐색기)를 선택해서 장치 연결할 때마다 탐색기가 실행하도록 바꿨습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;406&quot; data-origin-height=&quot;369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oDPWY/btsLGfSoZ33/gsL9LGRDIlunCOOAT2aNY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oDPWY/btsLGfSoZ33/gsL9LGRDIlunCOOAT2aNY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oDPWY/btsLGfSoZ33/gsL9LGRDIlunCOOAT2aNY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoDPWY%2FbtsLGfSoZ33%2FgsL9LGRDIlunCOOAT2aNY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;406&quot; height=&quot;369&quot; data-origin-width=&quot;406&quot; data-origin-height=&quot;369&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;</description>
      <category>IT/System Digging</category>
      <category>dropbox</category>
      <category>USB</category>
      <category>드랍박스</category>
      <category>메모리</category>
      <category>카메라 업로드 끄기</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/364</guid>
      <comments>https://simryang.tistory.com/entry/Windows11-Dropbox-%EC%97%90%EC%84%9C-USB-%EB%84%A3%EC%9D%84-%EB%95%8C%EB%A7%88%EB%8B%A4-%EB%9C%A8%EB%8A%94-%EC%B9%B4%EB%A9%94%EB%9D%BC-%EC%97%85%EB%A1%9C%EB%93%9C-%EB%81%84%EA%B8%B0#entry364comment</comments>
      <pubDate>Thu, 9 Jan 2025 11:44:49 +0900</pubDate>
    </item>
    <item>
      <title>[Raspberry Pi 5] 터미널에서 한글 폰트 보기</title>
      <link>https://simryang.tistory.com/entry/Raspberry-Pi-5-%ED%84%B0%EB%AF%B8%EB%84%90%EC%97%90%EC%84%9C-%ED%95%9C%EA%B8%80-%ED%8F%B0%ED%8A%B8-%EB%B3%B4%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;기록용으로 남깁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라즈비안을 설치하고 한글로 된 메시지(서버 접속 메시지든 파일명이든) 환경에 노출되면 한글이 깨져보입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결책은 간단합니다. 한글 폰트를 설치하고 해당 터미널을 다시 열면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo apt install -y fonts-한글폰트패키지명&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 현재 배포판 버전(bookworm, debian 12)에서 어떤 한글 폰트가 제공되는지 남깁니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 180px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 19.8449%; height: 18px;&quot;&gt;패키지&lt;/td&gt;
&lt;td style=&quot;width: 18.3333%; height: 18px;&quot;&gt;글꼴명 &lt;/td&gt;
&lt;td style=&quot;width: 45.155%; height: 18px;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;width: 16.6666%;&quot;&gt;최소크기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 19.8449%; height: 18px;&quot;&gt;fonts-alee&lt;/td&gt;
&lt;td style=&quot;width: 18.3333%; height: 18px;&quot;&gt;alee 무료 글꼴 모음&lt;/td&gt;
&lt;td style=&quot;width: 45.155%; height: 18px;&quot;&gt;반달, 방울, 은진, 은진낙서, 구슬&lt;br /&gt;&lt;a href=&quot;https://ftp.debian.org/debian/pool/main/f/fonts-alee/fonts-alee_13.3.tar.xz&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ftp.debian.org/debian/pool/main/f/fonts-alee/fonts-alee_13.3.tar.xz&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6666%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 19.8449%; height: 18px;&quot;&gt;fonts-baekmuk&lt;/td&gt;
&lt;td style=&quot;width: 18.3333%; height: 18px;&quot;&gt;백묵 무료 글꼴 모음&lt;/td&gt;
&lt;td style=&quot;width: 45.155%; height: 18px;&quot;&gt;백묵바탕, 백묵돋음, 백묵굴림&lt;br /&gt;&lt;a href=&quot;https://ftp.debian.org/debian/pool/main/f/fonts-baekmuk/fonts-baekmuk_2.2.orig.tar.gz&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ftp.debian.org/debian/pool/main/f/fonts-baekmuk/fonts-baekmuk_2.2.orig.tar.gz&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6666%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 19.8449%; height: 18px;&quot;&gt;fonts-lexi-gulim&lt;/td&gt;
&lt;td style=&quot;width: 18.3333%; height: 18px;&quot;&gt;렉시굴림&lt;/td&gt;
&lt;td style=&quot;width: 45.155%; height: 18px;&quot;&gt;렉시굴림&lt;br /&gt;&lt;a href=&quot;https://ftp.debian.org/debian/pool/main/f/fonts-lexi-gulim/fonts-lexi-gulim_20090423.orig.tar.xz&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ftp.debian.org/debian/pool/main/f/fonts-lexi-gulim/fonts-lexi-gulim_20090423.orig.tar.xz&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6666%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 19.8449%; height: 18px;&quot;&gt;fonts-lexi-saebom&lt;/td&gt;
&lt;td style=&quot;width: 18.3333%; height: 18px;&quot;&gt;렉시새봄&lt;/td&gt;
&lt;td style=&quot;width: 45.155%; height: 18px;&quot;&gt;렉시새봄&lt;br /&gt;&lt;a href=&quot;https://ftp.debian.org/debian/pool/main/f/fonts-lexi-saebom/fonts-lexi-saebom_20100129.orig.tar.gz&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ftp.debian.org/debian/pool/main/f/fonts-lexi-saebom/fonts-lexi-saebom_20100129.orig.tar.gz&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6666%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 19.8449%; height: 18px;&quot;&gt;fonts-nanum&lt;/td&gt;
&lt;td style=&quot;width: 18.3333%; height: 18px;&quot;&gt;나눔 글꼴 모음&lt;/td&gt;
&lt;td style=&quot;width: 45.155%; height: 18px;&quot;&gt;나눔바른고딕, 나눔바른펜, 나눔고딕, 나눔명조, 나눔펜, 나눔스퀘어, &lt;br /&gt;&lt;a href=&quot;https://ftp.debian.org/debian/pool/main/f/fonts-nanum/fonts-nanum_20200506.orig.tar.xz&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ftp.debian.org/debian/pool/main/f/fonts-nanum/fonts-nanum_20200506.orig.tar.xz&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6666%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 19.8449%; height: 18px;&quot;&gt;fonts-nanum-coding&lt;/td&gt;
&lt;td style=&quot;width: 18.3333%; height: 18px;&quot;&gt;나눔코딩&lt;/td&gt;
&lt;td style=&quot;width: 45.155%; height: 18px;&quot;&gt;나눔고딕코딩&lt;br /&gt;&lt;a href=&quot;https://ftp.debian.org/debian/pool/main/f/fonts-nanum-coding/fonts-nanum-coding_2.5.orig.tar.gz&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ftp.debian.org/debian/pool/main/f/fonts-nanum-coding/fonts-nanum-coding_2.5.orig.tar.gz&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6666%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 19.8449%; height: 18px;&quot;&gt;fonts-naver-d2coding&lt;/td&gt;
&lt;td style=&quot;width: 18.3333%; height: 18px;&quot;&gt;d2coding&lt;/td&gt;
&lt;td style=&quot;width: 45.155%; height: 18px;&quot;&gt;d2coding&lt;br /&gt;&lt;a href=&quot;https://ftp.debian.org/debian/pool/main/f/fonts-naver-d2coding/fonts-naver-d2coding_1.3.2.orig.tar.gz&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ftp.debian.org/debian/pool/main/f/fonts-naver-d2coding/fonts-naver-d2coding_1.3.2.orig.tar.gz&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6666%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 19.8449%; height: 18px;&quot;&gt;fonts-noto-cjk&lt;/td&gt;
&lt;td style=&quot;width: 18.3333%; height: 18px;&quot;&gt;Noto Sans CJK KR&lt;br /&gt;Noto Serif CJK KR&lt;/td&gt;
&lt;td style=&quot;width: 45.155%; height: 18px;&quot;&gt;Google 에서 만든 공개 폰트&lt;br /&gt;no tofu 두부 안되! 다국에 폰트 없으면 빈사각형으로 표시되는 것을 두부라고 함&lt;br /&gt;참고로 폰트 크기가 240MB..&lt;br /&gt;&lt;a href=&quot;https://ftp.debian.org/debian/pool/main/f/fonts-noto-cjk/fonts-noto-cjk_20240730+repack1.orig.tar.gz&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ftp.debian.org/debian/pool/main/f/fonts-noto-cjk/fonts-noto-cjk_20240730+repack1.orig.tar.gz&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6666%;&quot;&gt;일반: 14px 이상&lt;br /&gt;중간: 16px 이상&lt;br /&gt;강조: 20px 이상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 19.8449%; height: 18px;&quot;&gt;fonts-unfonts-core&lt;/td&gt;
&lt;td style=&quot;width: 18.3333%; height: 18px;&quot;&gt;은 무료 글꼴 모음&lt;/td&gt;
&lt;td style=&quot;width: 45.155%; height: 18px;&quot;&gt;은바탕, 은디나루, 은돋움, 은그래픽, 은궁서, 은필기&lt;br /&gt;&lt;a href=&quot;https://ftp.debian.org/debian/pool/main/f/fonts-unfonts-core/fonts-unfonts-core_1.0.2-080608.orig.tar.xz&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ftp.debian.org/debian/pool/main/f/fonts-unfonts-core/fonts-unfonts-core_1.0.2-080608.orig.tar.xz&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6666%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.8449%;&quot;&gt;fonts-woowa-bm&lt;/td&gt;
&lt;td style=&quot;width: 18.3333%;&quot;&gt;배달의민족 무료 글꼴 모음&lt;/td&gt;
&lt;td style=&quot;width: 45.155%;&quot;&gt;배민 도현, 배민 을지로, 배민 한나, 배민 주아, 배민 기랑해랑, 배민 꾸불림, 배민 연성&lt;br /&gt;&lt;a href=&quot;https://ftp.debian.org/debian/pool/main/f/fonts-woowa-bm/fonts-woowa-bm_20241002.orig.tar.gz&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ftp.debian.org/debian/pool/main/f/fonts-woowa-bm/fonts-woowa-bm_20241002.orig.tar.gz&lt;/a&gt;&lt;br /&gt;모양 확인: &lt;a href=&quot;https://www.woowahan.com/fonts&quot;&gt;우아한형제들&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6666%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>IT/RaspberryPi</category>
      <category>raspberry pi 5</category>
      <category>raspbian</category>
      <category>깨짐</category>
      <category>리눅스</category>
      <category>터미널</category>
      <category>폰트</category>
      <category>한글</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/363</guid>
      <comments>https://simryang.tistory.com/entry/Raspberry-Pi-5-%ED%84%B0%EB%AF%B8%EB%84%90%EC%97%90%EC%84%9C-%ED%95%9C%EA%B8%80-%ED%8F%B0%ED%8A%B8-%EB%B3%B4%EA%B8%B0#entry363comment</comments>
      <pubDate>Mon, 23 Dec 2024 18:28:20 +0900</pubDate>
    </item>
    <item>
      <title>[python3][one-liner] 섹션 헤더 없는 설정 파일 값 바꾸기</title>
      <link>https://simryang.tistory.com/entry/python3one-liner-%EC%84%B9%EC%85%98-%ED%97%A4%EB%8D%94-%EC%97%86%EB%8A%94-%EC%84%A4%EC%A0%95-%ED%8C%8C%EC%9D%BC-%EA%B0%92-%EB%B0%94%EA%BE%B8%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;기록용으로 남깁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A=B 형태의 설정파일이고, REMOTE_ADDR 이란 변수가 있으며, 섹션 헤더는 없는 경우에 한줄로 원하는 값으로 바꾸는 명령을 소개합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;참고로 ssh_config 파일 내용은 다음과 같습니다.&lt;br /&gt;REMOTE_ADDR=1.2.3.4&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바꾸고 싶은 값은 val='1' 에서 수정하고 파일명은 f='ssh_config' 에서 수정하도록 합니다.&lt;br /&gt;&lt;br /&gt;결과물!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;python3 -c &quot;val='1';from configparser import ConfigParser;f='ssh_config';c=ConfigParser();c.optionxform=str;c.read_string('[sec]\n'+open(f,'r').read());c['sec']['REMOTE_ADDR']=val;open(f,'w').write('\n'.join([k+'='+c['sec'][k] for k in c['sec']]))&quot;&lt;/p&gt;</description>
      <category>IT/python</category>
      <category>Config</category>
      <category>ConfigParser</category>
      <category>INI</category>
      <category>one-liner</category>
      <category>python3</category>
      <category>섹션 헤더 없음</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/362</guid>
      <comments>https://simryang.tistory.com/entry/python3one-liner-%EC%84%B9%EC%85%98-%ED%97%A4%EB%8D%94-%EC%97%86%EB%8A%94-%EC%84%A4%EC%A0%95-%ED%8C%8C%EC%9D%BC-%EA%B0%92-%EB%B0%94%EA%BE%B8%EA%B8%B0#entry362comment</comments>
      <pubDate>Thu, 19 Dec 2024 18:31:09 +0900</pubDate>
    </item>
    <item>
      <title>[W55RP20] mqtt 구현 및 테스트 기</title>
      <link>https://simryang.tistory.com/entry/W55RP20-mqtt-%EA%B5%AC%ED%98%84-%EB%B0%8F-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Wiznet 사의 W55RP20 제품에 mqtt 를 C 기반으로 사용할 수 있는 예제에 대한 안내가 이미 존재합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.wiznet.io/img/application_notes/PICO-C/MQTT_Publish_Subscribe_EXAMPLE_AN_V100.pdf&quot;&gt;MQTT_Publish_Subscribe_EXAMPLE_AN_V100.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 python 을 메인으로 사용하고 있어서 micropython 기반 하의 mqtt 사용 예제를 만들어 보려고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 문서에 따르면 윈도우에다 mosquitto 서버를 설치해서 쉽게! 테스트할 수 있다고 하는데 내부 망에서는 동작을 확인했는데 외부 망에서는 동작을 안하는 문제가 있어서...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고민을 하다가 외부 리눅스 pc에 mosquitto 서버를 설치하고 micropython 기반 mqtt 예제를 작성 및 테스트하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우분투 계열 리눅스 pc에서는 다음 명령으로 mosquitto 서버를 설치합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo apt install -y mosquitto&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정 파일은 /etc/mosquitto/conf.d/ 에 a.conf 형태로 .conf 확장자를 주어 작성하면 서버 시작시 자동으로 로드합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo vim /etc/mosquitto/conf.d/test.conf&lt;/p&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;listener 1883 0.0.0.0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;allow anonymous true&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 윈도우 11에서는 동일한 설정으로 방화벽에서 mosquitto 앱 허용까지 걸었음에도 밖에서 접속이 되질 않았습니다.. 공유기에는 이미 포트포워딩이 지정되어 있었구요. 리눅스는 한방에 되네요. 리눅스 만세!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스 형태로 실행하려면 restart 명령을 주면 설정이 반영됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo systemctl restart mosquitto.service&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그를 직접 보고 싶으면 서비스를 중지시키고 mosquitto 를 실행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo systemctl stop mosquitto.service&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mosquitto -c /etc/mosquitto/conf.d/test.conf -v&lt;/p&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;a href=&quot;https://github.com/WIZnet-ioNIC/WIZnet-ioNIC-micropython-examples?tab=readme-ov-file#redis-client&quot;&gt;WIZnet-ioNIC/WIZnet-ioNIC-micropython-examples: Examples for micropython with W55RP20&lt;/a&gt;&lt;/p&gt;</description>
      <category>IT/IoT</category>
      <category>anonymous</category>
      <category>IOT</category>
      <category>Linux</category>
      <category>listener</category>
      <category>mosquitto</category>
      <category>MQTT</category>
      <category>Raspberry Pi</category>
      <category>w55rp20</category>
      <category>설정</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/361</guid>
      <comments>https://simryang.tistory.com/entry/W55RP20-mqtt-%EA%B5%AC%ED%98%84-%EB%B0%8F-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EA%B8%B0#entry361comment</comments>
      <pubDate>Mon, 16 Dec 2024 10:12:53 +0900</pubDate>
    </item>
    <item>
      <title>[뿌요뿌요퀘스트] 스킬 레벨업 방법</title>
      <link>https://simryang.tistory.com/entry/%EB%BF%8C%EC%9A%94%EB%BF%8C%EC%9A%94%ED%80%98%EC%8A%A4%ED%8A%B8-%EC%8A%A4%ED%82%AC-%EB%A0%88%EB%B2%A8%EC%97%85-%EB%B0%A9%EB%B2%95</link>
      <description>&lt;h2 id=&quot;hl_1&quot; style=&quot;background-color: #313131; color: #ffffff; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;기술 수준을 높이는 방법&lt;/h2&gt;
&lt;h3 id=&quot;hm_1&quot; style=&quot;color: #313131; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;같은 캐릭터를 합성합니다.&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;394&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPb1jP/btsLf9KjsuG/ce8mbKG3k67E3Yur3icKf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPb1jP/btsLf9KjsuG/ce8mbKG3k67E3Yur3icKf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPb1jP/btsLf9KjsuG/ce8mbKG3k67E3Yur3icKf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPb1jP%2FbtsLf9KjsuG%2Fce8mbKG3k67E3Yur3icKf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;394&quot; height=&quot;183&quot; data-origin-width=&quot;394&quot; data-origin-height=&quot;183&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #313131; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;같은 캐릭터와 파워업을 조합하면 스킬과 전투 스킬에 대한 경험치를 얻을 수 있습니다.&lt;/p&gt;
&lt;h4 id=&quot;hs_1&quot; style=&quot;color: #313131; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;습득한 기술 및 경험&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재료 카드 희귀도습득한 기술 및 경험&lt;/p&gt;
&lt;table style=&quot;color: #313131; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;☆1&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;☆2&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;☆3 개&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;☆4 개&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;☆5&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;☆6&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;400&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;☆7&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;800&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #313131; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위의 표에서 볼 수 있듯이 낮은 희귀도는 기술 경험치를 거의 제공하지 않습니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #f15958;&quot;&gt;☆ 2와 ☆ 3은 5 배의 차이가&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;있기 때문에 재료로 사용할 때는 적어도 ☆ 3으로 한 후에 사용하십시오.&lt;/p&gt;
&lt;h4 id=&quot;hs_2&quot; style=&quot;color: #313131; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;레벨 업에 필요한 기술과 경험&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기술 수준다음 단계로 나아가십시오누적 경험 필요&lt;/p&gt;
&lt;table style=&quot;color: #313131; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;레벨 0&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;50&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;레벨 1&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;100&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;레벨 2&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;250&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;150&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;레벨 3&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;400&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;400&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;레벨 4&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;700&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;800&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Lv.5(최대)&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;-&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1500&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #313131; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위의 표에서 1500의 스킬 레벨 5(MAX)에 도달하기 위해 스킬 경험치가 필요하다는 것을 알 수 있습니다. 즉,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #f15958;&quot;&gt;☆ 6의 같은 이름 (같은 처리)의 카드가 4 장 이상 필요합니다&lt;/span&gt;. &lt;span style=&quot;color: #006dd7;&quot;&gt;5성은 8장&lt;/span&gt;, &lt;span style=&quot;color: #ef6f53;&quot;&gt;4성은 15장&lt;/span&gt; 필요합니다.&lt;/p&gt;
&lt;p style=&quot;color: #313131; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;재료 카드가 보유한 스킬 경험치는 기본 카드로 이월됩니다. 따라서 코인을 낮은 레벨의 카드로 그룹화하고 최종적으로 키우는 메인 카드와 결합하여 코인 소비를 줄일 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #313131; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;파워업을 합성할 때 매우 성공적이더라도 스킬 경험치에 대한 보너스는 없습니다. 또, 헨신 합성을 해도 이미 얻은 스킬 레벨이나 스킬 경험치는 그대로 계승됩니다.&lt;/p&gt;
&lt;div style=&quot;color: #313131; text-align: center;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;div-gpt-ad-1506758540255-1&quot; data-google-query-id=&quot;CIff6o-VoYoDFaVtDwId7RAB8w&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&quot;hm_2&quot; style=&quot;color: #313131; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;보라색 비밀의 책 합성하기&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;394&quot; data-origin-height=&quot;175&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGQzPQ/btsLgE4cwNA/uvUMTP8VUVpVd6J83gieX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGQzPQ/btsLgE4cwNA/uvUMTP8VUVpVd6J83gieX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGQzPQ/btsLgE4cwNA/uvUMTP8VUVpVd6J83gieX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGQzPQ%2FbtsLgE4cwNA%2FuvUMTP8VUVpVd6J83gieX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;394&quot; height=&quot;175&quot; data-origin-width=&quot;394&quot; data-origin-height=&quot;175&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #313131; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다른 비밀서와 달리 보라색 비밀서는 스킬 경험치를 증가시키는 재료입니다.&lt;/p&gt;
&lt;h4 id=&quot;hs_3&quot; style=&quot;color: #313131; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;습득한 기술 및 경험&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진귀경험치 획득&lt;/p&gt;
&lt;table style=&quot;color: #313131; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;☆3 개&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;☆4 개&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;☆5&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #313131; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;보라색 비밀의 책을 재료 카드로 사용하면 같은 카드와 같은 희귀도에 해당하는 스킬 경험치를 얻을 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #313131; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #313131; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;참고: &lt;a href=&quot;https://game8.jp/puyoque/153631&quot;&gt;【ぷよクエ】スキルレベルの上げ方とスキル上げをするメリット｜ゲームエイト&lt;/a&gt;&lt;/p&gt;</description>
      <category>재미</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/360</guid>
      <comments>https://simryang.tistory.com/entry/%EB%BF%8C%EC%9A%94%EB%BF%8C%EC%9A%94%ED%80%98%EC%8A%A4%ED%8A%B8-%EC%8A%A4%ED%82%AC-%EB%A0%88%EB%B2%A8%EC%97%85-%EB%B0%A9%EB%B2%95#entry360comment</comments>
      <pubDate>Thu, 12 Dec 2024 11:24:09 +0900</pubDate>
    </item>
    <item>
      <title>buster(debian 10) 에 docker 설치하기</title>
      <link>https://simryang.tistory.com/entry/busterdebian-10-%EC%97%90-docker-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;기록용으로 남깁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;설치 스크립트가 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;설치 스크립트가 /etc/apt/sources.list.d/ 경로에 docker.list 파일을 생성하면서 작업을 하는데 버그가 있는지&lt;span&gt; 기존 파일이 있으면 정상 동작하지 않습니다. 아래와 같은 오류가 발생합니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1733113401596&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;E: The repository 'http://ppa.launchpad.net/deadsnakes/ppa/ubuntu plucky Release' does not have a Release file.&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;br /&gt;apt 목록을 임시로 옮겨놓습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1733113207669&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo mkdir /etc/apt/sources.list.d/BACKUP
sudo mv /etc/apt/sources.list.d/* /etc/apt/sources.list.d/BACKUP&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;pre id=&quot;code_1733112938313&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -fsSL https://get.docker.com -o get-docker.sh&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;이 스크립트를 root 권한으로 설치합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1733113072061&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo bash get-docker.sh&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;os 버전이 오래되었다면 경고가 뜰 수도 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;644&quot; data-origin-height=&quot;189&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSj1Ea/btsK33qpkMu/0t0prsjPA8WEKMaRIt2cnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSj1Ea/btsK33qpkMu/0t0prsjPA8WEKMaRIt2cnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSj1Ea/btsK33qpkMu/0t0prsjPA8WEKMaRIt2cnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSj1Ea%2FbtsK33qpkMu%2F0t0prsjPA8WEKMaRIt2cnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;644&quot; height=&quot;189&quot; data-origin-width=&quot;644&quot; data-origin-height=&quot;189&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;deprecation warning 은 무시합시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상적으로 설치되면 아래와 같은 안내문이 나오고 종료됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDoj29/btsK4vfGNjP/m9b2gSSrjpWFB0uk6Sw9E0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDoj29/btsK4vfGNjP/m9b2gSSrjpWFB0uk6Sw9E0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDoj29/btsK4vfGNjP/m9b2gSSrjpWFB0uk6Sw9E0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDoj29%2FbtsK4vfGNjP%2Fm9b2gSSrjpWFB0uk6Sw9E0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;642&quot; height=&quot;286&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;286&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker version 명령으로 잘 설치되어 있는지 확인해봅시다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btc9dK/btsK2tw9Bl0/Kjh4jsCShMkE8lrE7FSx6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btc9dK/btsK2tw9Bl0/Kjh4jsCShMkE8lrE7FSx6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btc9dK/btsK2tw9Bl0/Kjh4jsCShMkE8lrE7FSx6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbtc9dK%2FbtsK2tw9Bl0%2FKjh4jsCShMkE8lrE7FSx6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;192&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;192&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 오류 메시지를 보셨으면 느끼셨을 테지만 root 권한에서만 사용할 수 있습니다. 현재 계정(pi)에서 사용하려면 그룹에 추가해줘야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1733113681388&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo usermod -aG docker pi&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pi 대신 다른 계정을 쓰고 있다면 pi 를 해당 계정명으로 교체해주세요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 명령을 내렸어도 여전히 permission denied 뜰 겁니다. 왜냐하면 현재 로그인된 셸에는 반영이 안되어 있거든요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 로그아웃 했다가 접속하면 permission denied 메시지는 안보입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자 이제 설치가 잘 되었으니 apt 저장소 목록을 복원합시다!!&lt;/p&gt;
&lt;pre id=&quot;code_1733115580865&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo mv /etc/apt/sources.list.d/BACKUP/* /etc/apt/sources.list.d/&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;docker 이미지가 저장되는 위치 root 디렉토리를 확인하고 싶다면 docker info 명령을 내려보세요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker Root Dir 이란 곳에서 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 되었다면 &lt;a href=&quot;https://hub.docker.com/explore&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;docker hub&lt;/a&gt; 에서 찾아서 사용하거나 나만의 컨테이너를 만들어서 사용하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약에 docker hub 에서 이미지를 받은 적이 있다면 docker inspect 이미지명 으로 실제 경로및 정보를 확인할 수 있습니다.&lt;/p&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;</description>
      <category>IT/RaspberryPi</category>
      <category>4B</category>
      <category>Buster</category>
      <category>docker</category>
      <category>Raspberry Pi</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/359</guid>
      <comments>https://simryang.tistory.com/entry/busterdebian-10-%EC%97%90-docker-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0#entry359comment</comments>
      <pubDate>Mon, 2 Dec 2024 13:44:50 +0900</pubDate>
    </item>
    <item>
      <title>[linux][bash] 파일 크기 감시하기</title>
      <link>https://simryang.tistory.com/entry/linuxbash-%ED%8C%8C%EC%9D%BC-%ED%81%AC%EA%B8%B0-%EA%B0%90%EC%8B%9C%ED%95%98%EA%B8%B0</link>
      <description>&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;리눅스에서 보통 ls -l 하면 파일의 상세 정보가 나오는데 5번째 항목에 파일 크기가 나옵니다.&lt;/p&gt;
&lt;pre id=&quot;code_1731290021460&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ls -l kk.jpg
-rw-r--r-- 1 arhis arhis 32277 Oct 28 10:42 kk.jpg&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;이것을 awk 로 5번째에 있는 항목을 출력했습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1731290238317&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ls -l kk.jpg | awk '{print $5}'&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;그런데 더 간단하고 pipe 안써도 되는 방법이 있었네요!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1731290220837&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;stat --format=%s kk.jpg
32767&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;참고로 stat 옵션입니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1731290950538&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;$ stat --help
Usage: stat [OPTION]... FILE...
Display file or file system status.

Mandatory arguments to long options are mandatory for short options too.
  -L, --dereference     follow links
  -f, --file-system     display file system status instead of file status
  -c  --format=FORMAT   use the specified FORMAT instead of the default;
                          output a newline after each use of FORMAT
      --printf=FORMAT   like --format, but interpret backslash escapes,
                          and do not output a mandatory trailing newline;
                          if you want a newline, include \n in FORMAT
  -t, --terse           print the information in terse form
      --help     display this help and exit
      --version  output version information and exit

The valid format sequences for files (without --file-system):

  %a   access rights in octal (note '#' and '0' printf flags)
  %A   access rights in human readable form
  %b   number of blocks allocated (see %B)
  %B   the size in bytes of each block reported by %b
  %C   SELinux security context string
  %d   device number in decimal
  %D   device number in hex
  %f   raw mode in hex
  %F   file type
  %g   group ID of owner
  %G   group name of owner
  %h   number of hard links
  %i   inode number
  %m   mount point
  %n   file name
  %N   quoted file name with dereference if symbolic link
  %o   optimal I/O transfer size hint
  %s   total size, in bytes
  %t   major device type in hex, for character/block device special files
  %T   minor device type in hex, for character/block device special files
  %u   user ID of owner
  %U   user name of owner
  %w   time of file birth, human-readable; - if unknown
  %W   time of file birth, seconds since Epoch; 0 if unknown
  %x   time of last access, human-readable
  %X   time of last access, seconds since Epoch
  %y   time of last data modification, human-readable
  %Y   time of last data modification, seconds since Epoch
  %z   time of last status change, human-readable
  %Z   time of last status change, seconds since Epoch

Valid format sequences for file systems:

  %a   free blocks available to non-superuser
  %b   total data blocks in file system
  %c   total file nodes in file system
  %d   free file nodes in file system
  %f   free blocks in file system
  %i   file system ID in hex
  %l   maximum length of filenames
  %n   file name
  %s   block size (for faster transfers)
  %S   fundamental block size (for block counts)
  %t   file system type in hex
  %T   file system type in human readable form

--terse is equivalent to the following FORMAT:
    %n %s %b %f %u %g %D %i %h %t %T %X %Y %Z %W %o %C
--terse --file-system is equivalent to the following FORMAT:
    %n %i %l %t %s %S %b %f %a %c %d&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자 이제 감시를 해야겠죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;watch -d -n 2 &quot;stat --format=%s kk.jpg&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1731290780621&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;watch -d -n 2 &quot;stat --format=%s kk.jpg&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;파일 크기 알아내는 명령을 2초마다(-n 2) 차이점을 강조(-d)해서 보여줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdqWNq/btsKDVlUIO2/GakHHgTCRgATkK2RNCDOg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdqWNq/btsKDVlUIO2/GakHHgTCRgATkK2RNCDOg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdqWNq/btsKDVlUIO2/GakHHgTCRgATkK2RNCDOg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdqWNq%2FbtsKDVlUIO2%2FGakHHgTCRgATkK2RNCDOg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;659&quot; height=&quot;125&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;125&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;</description>
      <category>IT/shell</category>
      <category>awk</category>
      <category>bash</category>
      <category>bytes</category>
      <category>Linux</category>
      <category>LS</category>
      <category>Size</category>
      <category>Stat</category>
      <category>크기</category>
      <category>파일</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/358</guid>
      <comments>https://simryang.tistory.com/entry/linuxbash-%ED%8C%8C%EC%9D%BC-%ED%81%AC%EA%B8%B0-%EA%B0%90%EC%8B%9C%ED%95%98%EA%B8%B0#entry358comment</comments>
      <pubDate>Mon, 11 Nov 2024 10:59:20 +0900</pubDate>
    </item>
    <item>
      <title>[펌] python3 용 ctag 사용법</title>
      <link>https://simryang.tistory.com/entry/%ED%8E%8C-python3-%EC%9A%A9-ctag-%EC%82%AC%EC%9A%A9%EB%B2%95</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;기본적인 내용은 &lt;a href=&quot;https://rampart81.github.io/post/python-ctags/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;rampart81 님의 블로그 포스트&lt;/a&gt;를 참고하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 내용은 윈도우인 경우이고 리눅스는 python3 로 지정하지 않으면 오류 뜰 확률이 높아 살짝 수정해서 저장용으로 사용니다.&lt;/p&gt;
&lt;pre class=&quot;lua&quot;&gt;&lt;code&gt;alias python_ctags=&quot;ctags -R --fields=+l --languages=python --python-kinds=-iv -f ./tags . $(python3 -c &quot;import os, sys; print(' '.join('{}'.format(d) for d in sys.path if os.path.isdir(d)))&quot;)&quot;
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>ctag</category>
      <category>Linux</category>
      <category>python3</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/357</guid>
      <comments>https://simryang.tistory.com/entry/%ED%8E%8C-python3-%EC%9A%A9-ctag-%EC%82%AC%EC%9A%A9%EB%B2%95#entry357comment</comments>
      <pubDate>Tue, 5 Nov 2024 11:19:01 +0900</pubDate>
    </item>
    <item>
      <title>Ubuntu 20.04에서 Valkey(구 Redis) 소스 설치하는 방법</title>
      <link>https://simryang.tistory.com/entry/Ubuntu-2004-%EC%97%90%EC%84%9C-Valkey-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Valkey는 Redis에서 포크된 오픈소스 인메모리 데이터 스토어입니다. Ubuntu 24.04 이상에서는 공식 패키지로 제공되지만, &lt;b&gt;Ubuntu 20.04에서는 직접 소스에서 컴파일해야&lt;/b&gt; 사용할 수 있습니다.&lt;br /&gt;이 글에서는 Ubuntu 20.04 환경에서 Valkey를 컴파일 및 설치하는 최신 절차를 정리했습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  Valkey가 무엇인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;\&amp;quot;https://valkey.io\&amp;quot;&quot; target=&quot;\&amp;quot;_blank\&amp;quot;&quot;&gt;Valkey&lt;/a&gt;는 Redis의 오픈소스 포크로, Redis가 BSL 라이선스로 변경된 이후 만들어졌습니다. Valkey는 여전히 완전한 오픈소스로 유지되며, Redis의 기존 기능을 대부분 계승합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  사전 준비: 의존 패키지 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Valkey는 컴파일 시 TLS, RDMA, systemd 지원 등을 위해 추가 라이브러리를 필요로 합니다.&lt;/p&gt;
&lt;pre class=&quot;shell&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;sudo apt update
sudo apt install -y librdmacm-dev libibverbs-dev libsystemd-dev build-essential git&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  소스 코드 다운로드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식 GitHub 저장소에서 최신 소스를 클론합니다.&lt;/p&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;git clone https://github.com/valkey-io/valkey.git
cd valkey&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⚙️ 컴파일&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적인 컴파일 명령은 아래와 같습니다:&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;make&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 기능을 활성화하고 테스트까지 포함하려면 다음과 같이 빌드할 수 있습니다:&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;make BUILD_TLS=yes BUILD_RDMA=module USE_SYSTEMD=yes test&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  옵션 설명:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;BUILD_TLS=yes&lt;/code&gt; &amp;rarr; TLS 암호화 지원&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BUILD_RDMA=module&lt;/code&gt; &amp;rarr; RDMA 모듈 지원&lt;/li&gt;
&lt;li&gt;&lt;code&gt;USE_SYSTEMD=yes&lt;/code&gt; &amp;rarr; systemd 서비스화 기능 포함&lt;/li&gt;
&lt;li&gt;&lt;code&gt;test&lt;/code&gt; &amp;rarr; 설치 전 테스트 자동 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  한 줄로 모든 빌드 + 설치까지 진행하려면:&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;sudo LANG=C time make BUILD_TLS=yes BUILD_RDMA=module USE_SYSTEMD=yes test deps install&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; ️ 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 PREFIX는 &lt;code&gt;/usr/local&lt;/code&gt;이지만, 명시적으로 지정할 수도 있습니다.&lt;/p&gt;
&lt;pre class=&quot;gauss&quot;&gt;&lt;code&gt;sudo make PREFIX=/usr/local install&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  실행 확인&lt;/h3&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;/usr/local/bin/valkey-server --version&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버전 정보가 출력되면 설치가 완료된 것입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  구성 및 서비스 등록 (선택)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;systemd 서비스를 등록하여 자동 실행하고 싶다면 &lt;code&gt;utils&lt;/code&gt; 디렉토리 내 스크립트를 참고하거나 다음과 같이 설정할 수 있습니다:&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;sudo cp utils/valkey.service /etc/systemd/system/
sudo systemctl daemon-reexec
sudo systemctl enable valkey
sudo systemctl start valkey&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 위 파일은 직접 수정하여 &lt;code&gt;ExecStart&lt;/code&gt; 경로 등을 시스템에 맞게 조정해야 합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  참고 자료&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;\&amp;quot;https://github.com/valkey-io/valkey\&amp;quot;&quot; target=&quot;\&amp;quot;_blank\&amp;quot;&quot;&gt;Valkey GitHub 저장소&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;\&amp;quot;https://valkey.io/download/\&amp;quot;&quot; target=&quot;\&amp;quot;_blank\&amp;quot;&quot;&gt;Valkey 다운로드 페이지&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;\&amp;quot;https://ubuntu.com/blog/valkey-ubuntu\&amp;quot;&quot; target=&quot;\&amp;quot;_blank\&amp;quot;&quot;&gt;Valkey 우분투 패키지 포함 소식&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  요약&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ubuntu 24.04 이상은 패키지로 설치 가능&lt;/li&gt;
&lt;li&gt;20.04에서는 &lt;code&gt;git clone&lt;/code&gt; 후 직접 컴파일 필요&lt;/li&gt;
&lt;li&gt;&lt;code&gt;make BUILD_TLS=yes USE_SYSTEMD=yes&lt;/code&gt; 방식 권장&lt;/li&gt;
&lt;li&gt;의존 패키지 먼저 설치 필수&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Ubuntu 20.04 환경에서도 Valkey를 문제없이 사용할 수 있습니다. Redis를 대체할 새로운 오픈소스 키-값 저장소가 궁금하다면 직접 설치해 보세요!&lt;/p&gt;</description>
      <category>IT/database</category>
      <category>20.04</category>
      <category>Python</category>
      <category>redis</category>
      <category>server</category>
      <category>ubuntu</category>
      <category>valkey</category>
      <category>컴파일</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/356</guid>
      <comments>https://simryang.tistory.com/entry/Ubuntu-2004-%EC%97%90%EC%84%9C-Valkey-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0#entry356comment</comments>
      <pubDate>Wed, 30 Oct 2024 14:30:38 +0900</pubDate>
    </item>
    <item>
      <title>[Nox] 특정 앱으로 바로 시작하는 바로가기 만들기</title>
      <link>https://simryang.tistory.com/entry/Nox-%ED%8A%B9%EC%A0%95-%EC%95%B1%EC%9C%BC%EB%A1%9C-%EB%B0%94%EB%A1%9C-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94-%EB%B0%94%EB%A1%9C%EA%B0%80%EA%B8%B0-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Nox 설치가 정상적으로 되어 있다면 시작메뉴에 Nox 바로가기가 존재합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 바로가기가 위치한 곳으로 이동해야 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;743&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/erep1i/btsJRPGvrZK/PM43u1FJVjIFGMzC1BJDF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/erep1i/btsJRPGvrZK/PM43u1FJVjIFGMzC1BJDF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/erep1i/btsJRPGvrZK/PM43u1FJVjIFGMzC1BJDF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ferep1i%2FbtsJRPGvrZK%2FPM43u1FJVjIFGMzC1BJDF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;787&quot; height=&quot;743&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;743&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 아이콘에 마우스 우클릭하면 나오는 메뉴에서 파일 위치 열기를 실행합니다.(윈도우11 기준)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 바로가기 파일이 보일때 마우스 우클릭하면 속성 이라는 메뉴가 있습니다. 이를 실행합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;916&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DKNd7/btsJRRYCtwd/3L7NqXqAxkMWeYks8Y2cHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DKNd7/btsJRRYCtwd/3L7NqXqAxkMWeYks8Y2cHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DKNd7/btsJRRYCtwd/3L7NqXqAxkMWeYks8Y2cHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDKNd7%2FbtsJRRYCtwd%2F3L7NqXqAxkMWeYks8Y2cHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;641&quot; height=&quot;916&quot; data-origin-width=&quot;641&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 바로가기가 가리키고 있는 명령(&quot;~~~\Nox.exe&quot;) 끝에 다음과 추가합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;~~~\Nox.exe&quot; -startPackage:com.sesisoft.PuyoQuest&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;다른 앱을 지정하고 싶으면 그 앱이 설치가 되어 있어야 하고 해당 앱의 패키지 명을 알아내어 위 -startPackage: 뒤에 써줘야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 알아내려면..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cmd 창을 열어서 adb 로 현재 실행된 프로세스 목록을 얻어서 찾아야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;먼저 adb devices 명령으로 조회되는지 확인해봅니다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;380&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xT1f4/btsJQaMeUBK/DmykvaWMc5rpiRWbULIboK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xT1f4/btsJQaMeUBK/DmykvaWMc5rpiRWbULIboK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xT1f4/btsJQaMeUBK/DmykvaWMc5rpiRWbULIboK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxT1f4%2FbtsJQaMeUBK%2FDmykvaWMc5rpiRWbULIboK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;380&quot; height=&quot;82&quot; data-origin-width=&quot;380&quot; data-origin-height=&quot;82&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;어.. 그런데 분명 nox 가 실행되어 있는데 목록에 없네요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;chatgpt 씨에게 물어보니 그런 경우에는 기본 주소(127.0.0.1:62001)로 접속해보라고 하네요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;39&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdYgTM/btsJSjtDTbD/3Z6TgFZMbFD4vuOkWUycLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdYgTM/btsJSjtDTbD/3Z6TgFZMbFD4vuOkWUycLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdYgTM/btsJSjtDTbD/3Z6TgFZMbFD4vuOkWUycLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdYgTM%2FbtsJSjtDTbD%2F3Z6TgFZMbFD4vuOkWUycLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;340&quot; height=&quot;39&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;39&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;다행히 잘 접속되네요.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;227&quot; data-origin-height=&quot;65&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wneIN/btsJREkSleH/vIuVPhwscJXKPgfU06KiC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wneIN/btsJREkSleH/vIuVPhwscJXKPgfU06KiC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wneIN/btsJREkSleH/vIuVPhwscJXKPgfU06KiC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwneIN%2FbtsJREkSleH%2FvIuVPhwscJXKPgfU06KiC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;227&quot; height=&quot;65&quot; data-origin-width=&quot;227&quot; data-origin-height=&quot;65&quot;/&gt;&lt;/span&gt;&lt;/figure&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;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;413&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P3R7b/btsJQc4gng5/sak2MfTHDRFcHLkQKfZXQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P3R7b/btsJQc4gng5/sak2MfTHDRFcHLkQKfZXQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P3R7b/btsJQc4gng5/sak2MfTHDRFcHLkQKfZXQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP3R7b%2FbtsJQc4gng5%2Fsak2MfTHDRFcHLkQKfZXQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;704&quot; height=&quot;413&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;413&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;어휴.. 뭐가 복잡한 게 막 뜨죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 개발한 앱은 com. 으로 시작합니다. &quot;com.&quot; 으로 결과를 필터링하면 좀 찾기 쉬워지겠죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇지 않은 앱은 이 방법이 아닌 인터넷 검색으로 찾으셔야 할 것 같습니다... 아니면 chatgpt 씨한테??&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;adb shell ps | find /N &quot;com.&quot;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RTOqx/btsJReGRk0H/qRSnfkuQvM3kTOG3Ro7q2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RTOqx/btsJReGRk0H/qRSnfkuQvM3kTOG3Ro7q2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RTOqx/btsJReGRk0H/qRSnfkuQvM3kTOG3Ro7q2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRTOqx%2FbtsJReGRk0H%2FqRSnfkuQvM3kTOG3Ro7q2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;350&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;다행히 제 결과는 몇개 안나와서 com.android 이랑 com.google 빼고 나니 몇개 안남았는데 게 중에 com.facebook 은 딱 봐도 아니니.. 범인은 com.sesisoft.PuyoQuest 가 되겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 본인 폰에 프로그램이 백그라운드로 잔뜩 떠 있다면 더 알아보기 힘들텐데요..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모두 닫기로 정리하시고 찾고 싶은 프로그램만 실행시키시면 좀 더 수월히 찾을 수 있을 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정한 결과입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;582&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z4FE9/btsJSlrn3In/xScLkb6sWQLDcPgk9uevZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z4FE9/btsJSlrn3In/xScLkb6sWQLDcPgk9uevZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z4FE9/btsJSlrn3In/xScLkb6sWQLDcPgk9uevZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz4FE9%2FbtsJSlrn3In%2FxScLkb6sWQLDcPgk9uevZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;420&quot; height=&quot;582&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;582&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행해보니 해당 앱이 바로 실행되네요.&lt;/p&gt;</description>
      <category>재미</category>
      <category>ADB</category>
      <category>Android</category>
      <category>nox</category>
      <category>바로가기</category>
      <category>시작</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/355</guid>
      <comments>https://simryang.tistory.com/entry/Nox-%ED%8A%B9%EC%A0%95-%EC%95%B1%EC%9C%BC%EB%A1%9C-%EB%B0%94%EB%A1%9C-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94-%EB%B0%94%EB%A1%9C%EA%B0%80%EA%B8%B0-%EB%A7%8C%EB%93%A4%EA%B8%B0#entry355comment</comments>
      <pubDate>Mon, 30 Sep 2024 14:11:46 +0900</pubDate>
    </item>
    <item>
      <title>[linux] date 명령에 timezone 일시적으로 적용하기</title>
      <link>https://simryang.tistory.com/entry/linux-date-%EB%AA%85%EB%A0%B9%EC%97%90-timezone-%EC%9D%BC%EC%8B%9C%EC%A0%81%EC%9C%BC%EB%A1%9C-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;date 명령에 시간대(timezone)를 적용하는 방법을 정리합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영구적으로 적용하는 것은 timedatectl 을 사용하거나, /etc/localtime 파일이 가리키는 링크를 변경하거나, tzselect 명령을 사용하셔서 하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 설정은 건드리지 않으면서 일시적으로 원하는 시간대를 date 명령에 적용하려면 TZ 라는 환경 변수를 설정하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 쓰면 됩니다. ash 에서도 되고 bash 에서도 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1725519738056&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;TZ='KST-9' date +%Y%m%d-%H%M%S&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;TZ 에 들어가는 원하는 시간대의 키워드가 궁금하다면 아래 파일에서 각 줄의 두번째 항목을 참고하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 한국은 ('Asia/Seoul', 'KST-9'), 로 되어 있으니까 위 예제처럼 'KST-9' 를 사용하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;https://gist.github.com/simryang/f07a8dbc40294c1de999a54ce3455619.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/System Digging</category>
      <category>date</category>
      <category>Linux</category>
      <category>Openwrt</category>
      <category>TimeZone</category>
      <category>TZ</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/354</guid>
      <comments>https://simryang.tistory.com/entry/linux-date-%EB%AA%85%EB%A0%B9%EC%97%90-timezone-%EC%9D%BC%EC%8B%9C%EC%A0%81%EC%9C%BC%EB%A1%9C-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0#entry354comment</comments>
      <pubDate>Thu, 5 Sep 2024 16:04:33 +0900</pubDate>
    </item>
    <item>
      <title>VSCode에서 Ctrl+Shift+K 단축키가 안 먹을 때? 원인은 Notion Desktop!</title>
      <link>https://simryang.tistory.com/entry/notion-desktop-%EA%B3%BC-vscode-%EC%9D%98-%EB%8B%A8%EC%B6%95%ED%82%A4-%EC%B6%A9%EB%8F%8C-CtrlShiftK</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;VSCode에서 줄 삭제 단축키인 &lt;code&gt;Ctrl+Shift+K&lt;/code&gt;가 작동하지 않으시다면, Notion Desktop이 원인일 수 있습니다.&lt;/b&gt;&lt;br /&gt;윈도우에서 글로벌 단축키 충돌 문제로 인해 자주 겪는 문제 중 하나입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  증상: Ctrl+Shift+K가 VSCode에서 작동하지 않음&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Notion과 VSCode를 함께 사용하는 환경에서, 어느 날부턴가 VSCode에서 한 줄 삭제 단축키인 &lt;b&gt;Ctrl+Shift+K&lt;/b&gt;가 반응하지 않는 문제가 발생할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 키는 기본적으로 &lt;code&gt;/sys&lt;/code&gt; 등 시스템 명령어와 관계없고, 보통 Notion 데스크탑 앱이 &lt;b&gt;글로벌 단축키&lt;/b&gt;로 점유하고 있어서 발생합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;왜 글로벌로 등록하냐고!!!&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  Notion의 글로벌 단축키 해제 방법&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;먼저 VSCode를 종료합니다.&lt;/li&gt;
&lt;li&gt;Notion Desktop 앱을 실행한 뒤, &lt;b&gt;설정 &amp;gt; 내 설정&lt;/b&gt;으로 이동합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;194&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cf7NAR/btsI6LRRLPr/GZAhRdZ1P5h1SNzBuhcid1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cf7NAR/btsI6LRRLPr/GZAhRdZ1P5h1SNzBuhcid1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cf7NAR/btsI6LRRLPr/GZAhRdZ1P5h1SNzBuhcid1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcf7NAR%2FbtsI6LRRLPr%2FGZAhRdZ1P5h1SNzBuhcid1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;194&quot; height=&quot;152&quot; data-origin-width=&quot;194&quot; data-origin-height=&quot;152&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;명령어 검색 사용&lt;/b&gt; 기능을 &lt;b&gt;비활성화&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li&gt;Notion을 종료하고 다시 실행합니다.&lt;/li&gt;
&lt;li&gt;다시 설정 메뉴로 들어가면, &lt;b&gt;명령어 검색 단축키&lt;/b&gt;를 변경할 수 있는 옵션이 나타납니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdkoDZ/btsI6LEklqP/usKIVBpc7Tj2Q9C08jvaM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdkoDZ/btsI6LEklqP/usKIVBpc7Tj2Q9C08jvaM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdkoDZ/btsI6LEklqP/usKIVBpc7Tj2Q9C08jvaM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdkoDZ%2FbtsI6LEklqP%2FusKIVBpc7Tj2Q9C08jvaM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;411&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;411&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 단축키를 &lt;b&gt;실수로도 누르지 않을 조합&lt;/b&gt;으로 설정해두면 충돌을 방지할 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  어떤 앱이 단축키를 점유 중인지 확인하려면?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단축키 점유를 추적하고 싶은 경우, 아래 툴을 사용해보세요:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.ntwind.com/freeware/hotkey-screener.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;Hotkey Screener&lt;/b&gt;&lt;/a&gt; - 시스템 전역 단축키를 검사해 어떤 앱이 RegisterHotKey API로 등록했는지 확인할 수 있는 무료 툴입니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;⚠️ 이런 툴들은 제작자가 서비스를 중단하는 경우가 많으므로, 백업해두거나 다운로드 링크를 보관해두는 것이 좋습니다.&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/lHbyE/btsI6flxck3/AWrnc0s3Q9xXM48GmlRVfk/HotkeyScreener.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;HotkeyScreener.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;2.87MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  팁: 단축키 충돌 방지 팁&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자주 사용하는 앱 간에 중복되는 단축키 목록을 정리해두기&lt;/li&gt;
&lt;li&gt;모든 앱의 글로벌 단축키는 최소화하고, 가능한 앱 내부 단축키만 사용하기&lt;/li&gt;
&lt;li&gt;HotkeyScreener로 주기적으로 점검&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  관련 검색 키워드 (SEO)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;vscode 단축키 안 먹힘&lt;/li&gt;
&lt;li&gt;notion 단축키 충돌&lt;/li&gt;
&lt;li&gt;ctrl shift k 작동 안 함&lt;/li&gt;
&lt;li&gt;글로벌 단축키 중복&lt;/li&gt;
&lt;li&gt;윈도우 단축키 점유 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제가 반복된다면 &lt;b&gt;노션 외에도 다른 앱이 충돌을 일으킬 수 있으니&lt;/b&gt;, Hotkey Screener를 활용해 점검해보시길 추천드립니다!&lt;/p&gt;</description>
      <category>IT/etc</category>
      <category>ctrl+shift+k</category>
      <category>notion</category>
      <category>vscode</category>
      <category>노션</category>
      <category>단축키</category>
      <category>안됨</category>
      <category>한줄지우기</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/353</guid>
      <comments>https://simryang.tistory.com/entry/notion-desktop-%EA%B3%BC-vscode-%EC%9D%98-%EB%8B%A8%EC%B6%95%ED%82%A4-%EC%B6%A9%EB%8F%8C-CtrlShiftK#entry353comment</comments>
      <pubDate>Fri, 16 Aug 2024 11:40:44 +0900</pubDate>
    </item>
    <item>
      <title>[openwrt] flash 읽기 쓰기 테스트</title>
      <link>https://simryang.tistory.com/entry/openwrt-flash-%EC%9D%BD%EA%B8%B0-%EC%93%B0%EA%B8%B0-%ED%85%8C%EC%8A%A4%ED%8A%B8</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;현재 파일시스템의 남은 용량만큼 쓰기 및 읽기 테스트해서 flash 메모리 오류를 검사하고자 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;https://gist.github.com/simryang/dab2f733af734af5061734b74be4dfcb.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;div id=&quot;__endic_crx__&quot;&gt;
&lt;div class=&quot;css-diqpy0&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/System Digging</category>
      <category>awk</category>
      <category>bash</category>
      <category>df</category>
      <category>flash</category>
      <category>Openwrt</category>
      <category>READ</category>
      <category>Shell Script</category>
      <category>test</category>
      <category>Write</category>
      <category>읽기쓰기 테스트</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/352</guid>
      <comments>https://simryang.tistory.com/entry/openwrt-flash-%EC%9D%BD%EA%B8%B0-%EC%93%B0%EA%B8%B0-%ED%85%8C%EC%8A%A4%ED%8A%B8#entry352comment</comments>
      <pubDate>Tue, 16 Jul 2024 15:05:04 +0900</pubDate>
    </item>
    <item>
      <title>[vscode] venv 생성 실패</title>
      <link>https://simryang.tistory.com/entry/vscode-venv-%EC%83%9D%EC%84%B1-%EC%8B%A4%ED%8C%A8</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;__endic_crx__&quot;&gt;
&lt;div class=&quot;css-diqpy0&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vscode 에서 보통 가상 환경 추가할 때 화면 하단의 버전 정보를 클릭해서 Create Virtual Environment 를 지정하면 생성을 하게 됩니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관련 그림&lt;/p&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;326&quot; data-origin-height=&quot;109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dlBwYA/btsIs5ENhX2/bJehoSMTReAvbU9QFrQVEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dlBwYA/btsIs5ENhX2/bJehoSMTReAvbU9QFrQVEk/img.png&quot; data-alt=&quot;vscode 하단 파이썬 환경 정보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dlBwYA/btsIs5ENhX2/bJehoSMTReAvbU9QFrQVEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdlBwYA%2FbtsIs5ENhX2%2FbJehoSMTReAvbU9QFrQVEk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;326&quot; height=&quot;109&quot; data-origin-width=&quot;326&quot; data-origin-height=&quot;109&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;vscode 하단 파이썬 환경 정보&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;아래 부분 클릭&lt;/p&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;89&quot; data-origin-height=&quot;33&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOxVgD/btsIsKubI5R/SrKvzAtxZgaPuSSjtshZUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOxVgD/btsIsKubI5R/SrKvzAtxZgaPuSSjtshZUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOxVgD/btsIsKubI5R/SrKvzAtxZgaPuSSjtshZUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOxVgD%2FbtsIsKubI5R%2FSrKvzAtxZgaPuSSjtshZUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;89&quot; height=&quot;33&quot; data-origin-width=&quot;89&quot; data-origin-height=&quot;33&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;Create Virtual Environment... 선택&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHQhc3/btsIurmp0iF/Nb0L5p6nQFgQK7ViOBicyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHQhc3/btsIurmp0iF/Nb0L5p6nQFgQK7ViOBicyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHQhc3/btsIurmp0iF/Nb0L5p6nQFgQK7ViOBicyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHQhc3%2FbtsIurmp0iF%2FNb0L5p6nQFgQK7ViOBicyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;790&quot; height=&quot;281&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;281&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;venv 선택&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;python 을 기존 오래된 버전을 삭제하고 새 버전(현재 기준 3.12 및 3.11)을 설치하고 잘 쓰다가 오랜만에 가상 환경을 추가했는데 오류가 떳습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1720576127064&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;2024-07-10 10:24:36.755 [info] Running: D:\user\util\installed\python3.12\python.exe -m venv .venv
2024-07-10 10:24:38.178 [info] &amp;gt; .\.venv\Scripts\python.exe -I ~\.vscode-insiders\extensions\ms-python.python-2024.10.0-win32-x64\python_files\get_output_via_markers.py ~\.vscode-insiders\extensions\ms-python.python-2024.10.0-win32-x64\python_files\interpreterInfo.py
2024-07-10 10:24:38.178 [info] Environments refresh paths discovered: 12 milliseconds
2024-07-10 10:24:38.269 [info] Environments refresh finished (event): 104 milliseconds
2024-07-10 10:24:44.743 [info] CREATED_VENV:d:\user\src\excel_test\.venv\Scripts\python.exe
2024-07-10 10:24:44.743 [info] Creating: d:\user\src\excel_test\.venv\.gitignore
2024-07-10 10:24:44.744 [info] CREATE_VENV.UPGRADING_PIP
Running: d:\user\src\excel_test\.venv\Scripts\python.exe -m pip install --upgrade pip
2024-07-10 10:24:45.434 [info] Requirement already satisfied: pip in .\.venv\lib\site-packages (24.0)
2024-07-10 10:24:45.793 [info] Collecting pip
2024-07-10 10:24:46.024 [info]   Downloading pip-24.1.2-py3-none-any.whl.metadata (3.6 kB)
2024-07-10 10:24:46.038 [info] Downloading pip-24.1.2-py3-none-any.whl (1.8 MB)
2024-07-10 10:24:46.276 [info] 
2024-07-10 10:24:46.276 [info] ---------------------------------------- 1.8/1.8 MB 8.9 MB/s eta 0:00:00
2024-07-10 10:24:46.276 [info] 
2024-07-10 10:24:46.318 [info] Installing collected packages: pip
2024-07-10 10:24:46.318 [info]   Attempting uninstall: pip
2024-07-10 10:24:46.323 [info]     Found existing installation: pip 24.0
2024-07-10 10:24:46.539 [info]     Uninstalling pip-24.0:
2024-07-10 10:24:47.448 [info] ERROR: Could not install packages due to an OSError: [WinError 32] 다른 프로세스가 파일을 사용 중이기 때문에 프로세스가 액세스 할 수 없습니다: 'd:\\user\\src\\excel_test\\.venv\\lib\\site-packages\\pip\\_vendor\\msgpack'
Check the permissions.
2024-07-10 10:24:47.453 [info] WARNING: Ignoring invalid distribution ~ip (d:\user\src\excel_test\.venv\Lib\site-packages)
2024-07-10 10:24:47.470 [info] WARNING: Ignoring invalid distribution ~ip (d:\user\src\excel_test\.venv\Lib\site-packages)
2024-07-10 10:24:47.546 [info] Traceback (most recent call last):
  File &quot;c:\Users\user\.vscode-insiders\extensions\ms-python.python-2024.10.0-win32-x64\python_files\create_venv.py&quot;, line 92, in run_process
2024-07-10 10:24:47.546 [info]     subprocess.run(args, cwd=os.getcwd(), check=True)
  File &quot;D:\user\util\installed\python3.12\Lib\subprocess.py&quot;, line 571, in run
2024-07-10 10:24:47.558 [info]     raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '['d:\\user\\src\\excel_test\\.venv\\Scripts\\python.exe', '-m', 'pip', 'install', '--upgrade', 'pip']' returned non-zero exit status 1.
2024-07-10 10:24:47.558 [info] During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File &quot;c:\Users\user\.vscode-insiders\extensions\ms-python.python-2024.10.0-win32-x64\python_files\create_venv.py&quot;, line 258, in &amp;lt;module&amp;gt;
2024-07-10 10:24:47.558 [info]     main(sys.argv[1:])
  File &quot;c:\Users\user\.vscode-insiders\extensions\ms-python.python-2024.10.0-win32-x64\python_files\create_venv.py&quot;, line 241, in main
2024-07-10 10:24:47.559 [info]     upgrade_pip(venv_path)
  File &quot;c:\Users\user\.vscode-insiders\extensions\ms-python.python-2024.10.0-win32-x64\python_files\create_venv.py&quot;, line 130, in upgrade_pip
2024-07-10 10:24:47.559 [info]     run_process(
  File &quot;c:\Users\user\.vscode-insiders\extensions\ms-python.python-2024.10.0-win32-x64\python_files\create_venv.py&quot;, line 94, in run_process
2024-07-10 10:24:47.559 [info]     raise VenvError(error_message)
VenvError: CREATE_VENV.UPGRADE_PIP_FAILED
2024-07-10 10:24:47.559 [info] 
2024-07-10 10:24:47.585 [error] Error while running venv creation script:  CREATE_VENV.UPGRADE_PIP_FAILED
2024-07-10 10:24:47.585 [error] CREATE_VENV.UPGRADE_PIP_FAILED&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;뭔가 말도 안된다라고 생각해서 로그에 남겨진 pip 설치 업그레이드 명령에 있는 경로(d:\\user\\src\\excel_test\\.venv\\Scripts)로 이동해서 pip 를 실행했더니 동일한 오류 메시지를 보이며 실행이 안되었습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1720576892374&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\Users\user&amp;gt;d:
D:\&amp;gt; cd d:\\user\\src\\excel_test\\.venv\\Scripts
d:\user\src\excel_test\.venv\Scripts&amp;gt; activate.bat
(.venv) d:\user\src\excel_test\.venv\Scripts&amp;gt;pip
Traceback (most recent call last):
  File &quot;&amp;lt;frozen runpy&amp;gt;&quot;, line 198, in _run_module_as_main
  File &quot;&amp;lt;frozen runpy&amp;gt;&quot;, line 88, in _run_code
  File &quot;d:\user\src\excel_test\.venv\Scripts\pip.exe\__main__.py&quot;, line 4, in &amp;lt;module&amp;gt;
ModuleNotFoundError: No module named 'pip._internal.cli'
(.venv) d:\user\src\excel_test\.venv\Scripts&amp;gt;python -m pip install -U pip
Traceback (most recent call last):
  File &quot;&amp;lt;frozen runpy&amp;gt;&quot;, line 198, in _run_module_as_main
  File &quot;&amp;lt;frozen runpy&amp;gt;&quot;, line 88, in _run_code
  File &quot;d:\user\src\excel_test\.venv\Lib\site-packages\pip\__main__.py&quot;, line 22, in &amp;lt;module&amp;gt;
    from pip._internal.cli.main import main as _main
ModuleNotFoundError: No module named 'pip._internal.cli'&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;인터넷에서는 pip 를 재설치해야 한다고 합니다. 설치 방법들이 동작을 하는게 없어서 찾아 헤매다가 간신히 &lt;a href=&quot;https://stackoverflow.com/questions/4750806/how-do-i-install-pip-on-windows?page=2&amp;amp;tab=scoredesc&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;하나&lt;/a&gt;를 찾아 기록으로 남깁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 curl 을 쓰네요.. 윈도우에서 되나? 하고 실행해보니 잘 됩니다.. 걍 도전!!&lt;br /&gt;아래 명령으로 get-pip.py 를 받아, 실행하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;curl&amp;nbsp;&lt;a href=&quot;https://bootstrap.pypa.io/get-pip.py&quot;&gt;https://bootstrap.pypa.io/get-pip.py&lt;/a&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;-o get-pip.py&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;python&amp;nbsp;get-pip.py&amp;nbsp;--force-reinstall&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;혹시 몰라서 python -m pip install -U pip 명령을 실행해보니 잘 실행됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1720577179222&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(.venv) d:\user\src\excel_test\.venv\Scripts&amp;gt;curl
curl: try 'curl --help' for more information

(.venv) d:\user\src\excel_test\.venv\Scripts&amp;gt;curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 2224k  100 2224k    0     0  8833k      0 --:--:-- --:--:-- --:--:-- 8934k

(.venv) d:\user\src\excel_test\.venv\Scripts&amp;gt;python get-pip.py --force-reinstall
WARNING: Ignoring invalid distribution ~ip (d:\user\src\excel_test\.venv\Lib\site-packages)
WARNING: Ignoring invalid distribution ~ip (d:\user\src\excel_test\.venv\Lib\site-packages)
Collecting pip
  Using cached pip-24.1.2-py3-none-any.whl.metadata (3.6 kB)
Collecting setuptools
  Downloading setuptools-70.3.0-py3-none-any.whl.metadata (5.8 kB)
Collecting wheel
  Using cached wheel-0.43.0-py3-none-any.whl.metadata (2.2 kB)
Using cached pip-24.1.2-py3-none-any.whl (1.8 MB)
Downloading setuptools-70.3.0-py3-none-any.whl (931 kB)
   ---------------------------------------- 931.1/931.1 kB 6.5 MB/s eta 0:00:00
Using cached wheel-0.43.0-py3-none-any.whl (65 kB)
WARNING: Ignoring invalid distribution ~ip (d:\user\src\excel_test\.venv\Lib\site-packages)
Installing collected packages: wheel, setuptools, pip
Successfully installed pip-24.1.2 setuptools-70.3.0 wheel-0.43.0

(.venv) d:\user\src\excel_test\.venv\Scripts&amp;gt;python -m pip install -U pip
Requirement already satisfied: pip in d:\user\src\excel_test\.venv\lib\site-packages (24.1.2)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/editor &amp;amp; ide</category>
      <category>PIP</category>
      <category>Python</category>
      <category>vscode</category>
      <category>오류</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/351</guid>
      <comments>https://simryang.tistory.com/entry/vscode-venv-%EC%83%9D%EC%84%B1-%EC%8B%A4%ED%8C%A8#entry351comment</comments>
      <pubDate>Wed, 10 Jul 2024 11:46:00 +0900</pubDate>
    </item>
    <item>
      <title>[ssh][minicom] 원격 ssh 로 minicom script 사용하기</title>
      <link>https://simryang.tistory.com/entry/sshminicom-%EC%9B%90%EA%B2%A9-ssh-%EB%A1%9C-minicom-script-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</link>
      <description>&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;USB 포트를 통해 시리얼로 연결된 장치가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 장치는 두 개의 펌웨어( fw1.bin, fw2.bin)를 설치해야 업데이트를 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에는 10대 이하의 장비에 일일이 접속해서 minicom -s 로 환경을 설정하고 쓰거나 minicom -b 115200 -D /dev/ttyUSB0 명령으로 실행해서 썼습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;minicom 으로 실행한 상태에서 xmodem 을 사용해서 펌웨어 이미지를 전송하고 장비 리셋을 시키는 구조였습니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시&lt;br /&gt;[start 엔터 키 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;xm 엔터 키 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CCC 표시될 때 Ctrl + A, Z 입력, S 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 방향 키 두번 눌러서 xmodem 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fw1.bin 을 찾아 커서를 이동시킨 후 스페이스 바 키 눌러 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엔터키를 눌러 업데이트 진행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;press any key 메시지 나오면 엔터 키 누르고&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 과정 다시 반복하는데 파일 선택시 fw2.bin 만 다름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ctrl + A, Z 입력, X 입력, 엔터 입력&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;__endic_crx__&quot;&gt;
&lt;div class=&quot;css-diqpy0&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 내용을 보내는 방법을 찾는데 문서가 잘 나와있지 않았습니다. 그래서 최대한 예제들을 찾아 조합하고 gpt 도 괴롭혀보고 하다가 동작하는 내용을 찾았습니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;minicom -b 115200 -D /dev/ttyUSB0 -S minicom_script.txt&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;minicom_script.txt 내용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;print &quot;Starting upgrade firmware...&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;send [start&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;send xm&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;! sx -vv fw1.bin&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;send [start&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;send xm&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;! sx -vv fw2.bin&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;send reset&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;print &quot;Done upgrading!&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sleep 10&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;! killall -9 minicom&lt;/p&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;send 는 문자열(보통 장비가 인식하는 명령)을 시리얼로 보냄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;! 느낌표 빈칸 한개는 실행할 외부 명령어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에서는 sx 가 xmodem 으로 파일 전송하는 명령이라 사용했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;print 는 없어도 됩니다. 아무 글씨도 안나오면 잘 되는지 불안해서 추가했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sleep 10 10초만큼 기다린다는 뜻입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;! killall -9 minicom 은 이게 없으면 minicom 화면이 그대로 남아 있습니다. 그래서 이 명령으로 강제 종료시켜 minicom 화면을 빠져나옵니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지는 잘 되었습니다. 그런데 이를 remote ssh 명령으로 실행시키니...&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;No cursor motion capability (cm) 이란 오류 메시지와 함께 아무 일도 없이 끝나버렸습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷을 찾아보니 터미널을 linux-c-nc 로 바꿔서 쓰라고 합니다. 자세한 내용은 이 &lt;a href=&quot;https://invisible-island.net/ncurses/terminfo.src.html#tic-linux-c-nc&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;페이지&lt;/a&gt;를 참고하시기 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# minicom_script.txt, fw1.bin, fw2.bin 전송 한 후 아래 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TERM=linux-c-nc minicom -b 115200 -D /dev/ttyUSB0 -S minicom_script.txt&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상 실행됩니....는 아니네요. 실행 잘 되는 때도 있고 멈추는 때도 있습니다... 어쨌든 절반의 성공!!&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멈췄던 원인은 다시 들어가보니 xmCCCCCCCC 만 잔뜩 표시되고 있더군요 xmodem 전송 명령인 sx 가 실행이 제대로 안된 느낌이었습니다. 이에 대한 대비책(?)이 있을지는 천천히 찾아봐야겠습니다. 좋은 방법 있으면 알려주세요~~!!&lt;/p&gt;
&lt;div id=&quot;__endic_crx__&quot;&gt;
&lt;div class=&quot;css-diqpy0&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;</description>
      <category>IT/System Digging</category>
      <category>linux-c-nc</category>
      <category>minicom</category>
      <category>no cursor motion capability</category>
      <category>remote ssh</category>
      <category>script</category>
      <author>심량</author>
      <guid isPermaLink="true">https://simryang.tistory.com/350</guid>
      <comments>https://simryang.tistory.com/entry/sshminicom-%EC%9B%90%EA%B2%A9-ssh-%EB%A1%9C-minicom-script-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0#entry350comment</comments>
      <pubDate>Fri, 14 Jun 2024 14:04:56 +0900</pubDate>
    </item>
  </channel>
</rss>