<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>로맨테크</title>
    <link>https://romantech.net/</link>
    <description>앱&amp;amp;서비스 리뷰, 생산성 향상 팁, 중국 관련 정보를 다루는 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Sun, 26 Apr 2026 10:53:14 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>ColorFilter</managingEditor>
    <image>
      <title>로맨테크</title>
      <url>https://tistory1.daumcdn.net/tistory/350237/attach/9b0c417beb814504ae97c2a26b7b3ab6</url>
      <link>https://romantech.net</link>
    </image>
    <item>
      <title>타이중에서 칭징농장 가는 방법: 버스 시간표&amp;middot;관광 패스&amp;middot;추천 코스 정리</title>
      <link>https://romantech.net/1355</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;칭징농장(清境農場)은 해발 1,750~2,000m에 위치한 대만(台灣) 난터우현(南投縣)의 대표적인 산악 휴양지 중 하나다. 유럽풍 숙소와 목초지, 산 능선 전망 덕분에 '대만의 작은 스위스'라고도 불린다. 칭징농장의 푸른 초원 지대인 칭칭초원(青青草原)은 귀여운 양들을 바로 앞에서 볼 수 있고 먹이 주기 체험도 가능해서 아이들은 물론 어른들한테도 즐거운 곳이다. 주말&amp;middot;공휴일에는 양털 깎기 쇼와 승마 공연도 관람할 수 있다(유료).&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;684&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dbVDgP/dJMcab42vwz/jwkOHvGEXjhBRHkKt3kh6k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dbVDgP/dJMcab42vwz/jwkOHvGEXjhBRHkKt3kh6k/img.jpg&quot; data-alt=&quot;칭칭초원 via Meet Nantou&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dbVDgP/dJMcab42vwz/jwkOHvGEXjhBRHkKt3kh6k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdbVDgP%2FdJMcab42vwz%2FjwkOHvGEXjhBRHkKt3kh6k%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;684&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;684&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;칭칭초원 via Meet Nantou&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;칭징농장은 타이중에서 버스로 약 2.5시간, 차로 1.5시간 정도 걸린다. 교통이 살짝 복잡해 보여서 투어를 이용하는 경우가 많지만, 투어는 최소 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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;난터우 버스 간청역&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;div id=&quot;code_1777009484736&quot; data-ke-type=&quot;html&quot; data-source=&quot;&amp;lt;figure class=&amp;quot;map-wrap&amp;quot;&amp;gt;
  &amp;lt;iframe
    src=&amp;quot;https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3640.84611785296!2d120.68551590000001!3d24.1420417!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x34693d9dbb6e4d0d%3A0xa9684485a1966c9!2sNantou%20Bus%20Gancheng%20Station!5e0!3m2!1sko!2skr!4v1777009430602!5m2!1sko!2skr&amp;quot;
    loading=&amp;quot;lazy&amp;quot;
    allowfullscreen
    referrerpolicy=&amp;quot;no-referrer-when-downgrade&amp;quot;
  &amp;gt;&amp;lt;/iframe&amp;gt;
&amp;lt;/figure&amp;gt;

&amp;lt;style&amp;gt;
  .map-wrap {
    width: 100%;
    aspect-ratio: 4 / 3;
    margin: 0;
  }

  .map-wrap iframe {
    display: block;
    width: 100%;
    height: 100%;
    border: 0;
  }
&amp;lt;/style&amp;gt;&quot;&gt;
&lt;figure class=&quot;map-wrap&quot;&gt;&lt;iframe src=&quot;https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3640.84611785296!2d120.68551590000001!3d24.1420417!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x34693d9dbb6e4d0d%3A0xa9684485a1966c9!2sNantou%20Bus%20Gancheng%20Station!5e0!3m2!1sko!2skr!4v1777009430602!5m2!1sko!2skr&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/figure&gt;
&lt;style&gt;
  .map-wrap {
    width: 100%;
    aspect-ratio: 4 / 3;
    margin: 0;
  }

  .map-wrap iframe {
    display: block;
    width: 100%;
    height: 100%;
    border: 0;
  }
&lt;/style&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_2850.jpeg&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFKFqZ/dJMcagrJxXY/QtuLa3lggzb7UQmKcoDnk0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFKFqZ/dJMcagrJxXY/QtuLa3lggzb7UQmKcoDnk0/img.jpg&quot; data-alt=&quot;난터우 버스 간청 역 전경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFKFqZ/dJMcagrJxXY/QtuLa3lggzb7UQmKcoDnk0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFKFqZ%2FdJMcagrJxXY%2FQtuLa3lggzb7UQmKcoDnk0%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;4284&quot; height=&quot;5712&quot; data-filename=&quot;IMG_2850.jpeg&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;칭징 관광 패스&lt;/h2&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;난터우 간청 버스역에서 칭칭초원 입장권과 왕복 버스표 등이 포함된 &lt;a title=&quot;칭징 관광 패스 소개 페이지&quot; href=&quot;https://www.ntbus.com.tw/p-4.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;관광 패스(清境好行套票)&lt;/a&gt;를 판매한다. 이 패스를 이용하면 스카이워크, 스위스가든 등에서 할인 혜택도 받을 수 있다. 가격은 630 TWD(약 29,000원). 간청역에서 칭징까지 편도 요금은 이지카드 기준 200 TWD 정도이고 칭칭초원 입장권은 성인 270 TWD인 점을 감안하면 꽤나 실속 있다. 이 패스 하나로 칭징농장 여행에 필요한 교통편과 입장권을 해결할 수 있고 가성비도 좋은 편이어서 패스권 구매를 추천한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[패스 포함 내역]&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;칭칭초원 입장권&lt;/li&gt;
&lt;li&gt;타이중 &amp;lt;&amp;gt; 칭징 왕복 버스&lt;/li&gt;
&lt;li&gt;국민빈관(國民賓館, 칭징 게스트하우스) &amp;lt;&amp;gt; 칭칭초원 왕복 버스&lt;/li&gt;
&lt;li&gt;국민빈관 할인 (평일 30%, 주말 10%)&lt;/li&gt;
&lt;li&gt;스위스가든(小瑞士花園) 할인&lt;/li&gt;
&lt;li&gt;스카이워크(清境高空觀景步道) 할인 (30 TWD)&lt;/li&gt;
&lt;li&gt;칭칭초원&amp;middot;국민빈관 내 농산품, 기념품, 매장 할인&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;칭징농장은 중간 정거장인 푸리(埔里)를 경유하기 때문에 교통 티켓은 편도마다 2장씩(타이중 &amp;lt;&amp;gt; 푸리, 푸리 &amp;lt;&amp;gt; 칭징) 제공한다. 직행 버스를 탑승한다면 승차 시 2장을 모두 수거해 간다. 패스의 QR 코드를 스캔하면(&lt;a title=&quot;칭징 관광 패스 할인 매장&quot; href=&quot;https://www.ntbus.com.tw/2016cj_coupon.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;링크&lt;/a&gt;) 할인 매장 목록(중국어)을 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_2927.jpeg&quot; data-origin-width=&quot;5711&quot; data-origin-height=&quot;4283&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBV3Xc/dJMcahjU9My/sY2Nxqat2JQW9OkkGvFRfk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBV3Xc/dJMcahjU9My/sY2Nxqat2JQW9OkkGvFRfk/img.jpg&quot; data-alt=&quot;2026 칭징 관광 패스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBV3Xc/dJMcahjU9My/sY2Nxqat2JQW9OkkGvFRfk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBV3Xc%2FdJMcahjU9My%2FsY2Nxqat2JQW9OkkGvFRfk%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;5711&quot; height=&quot;4283&quot; data-filename=&quot;IMG_2927.jpeg&quot; data-origin-width=&quot;5711&quot; data-origin-height=&quot;4283&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2026 칭징 관광 패스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;버스 시간표&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;가는 편 (타이중 &amp;gt; 칭징)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제대로 설명한 블로그가 없어서 가장 헷갈렸던 부분이다. 칭징농장으로 가는 칭징선(清境線) 버스는 푸리(埔里)라는 중간 정거장에 잠시 정차하고, 여기서 한 번 갈아타야 된다. 하지만 간청역 기준 &lt;b&gt;08:30, 09:15, 09:55, 11:15&lt;/b&gt;에 출발하는 6664번 버스는 환승 없이 칭징농장까지 직행으로 갈 수 있다.&lt;/p&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 title=&quot;난터우 버스 시간표&quot; href=&quot;https://www.ntbus.com.tw/cjfm.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;링크&lt;/a&gt;에서 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1548&quot; data-origin-height=&quot;686&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LsLuq/dJMcagFjxfG/Y9KAb0hkKzQafvh7No4MR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LsLuq/dJMcagFjxfG/Y9KAb0hkKzQafvh7No4MR1/img.png&quot; data-alt=&quot;간청역 &amp;amp;gt; 칭징농장 버스 시간표&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LsLuq/dJMcagFjxfG/Y9KAb0hkKzQafvh7No4MR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLsLuq%2FdJMcagFjxfG%2FY9KAb0hkKzQafvh7No4MR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1548&quot; height=&quot;686&quot; data-origin-width=&quot;1548&quot; data-origin-height=&quot;686&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;간청역 &amp;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;h3 data-ke-size=&quot;size23&quot;&gt;오는 편 (칭징 &amp;gt; 타이중)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;국민빈관(國民賓館) 정류장에서 &lt;b&gt;09:10, 11:10, 12:10, 13:10, 14:10, 15:10&lt;/b&gt; 출발하는 버스를 타면 환승 없이 직행으로 갈 수 있다. ⚠️ 직행 시간대에 탑승했지만 운행 상황에 따라 푸리에서 환승이 필요한 경우도 가끔 발생하니 참고하자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1550&quot; data-origin-height=&quot;658&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cE3lib/dJMcaged9lt/Mt9qDQ3OvU1B2MOMZ3gwK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cE3lib/dJMcaged9lt/Mt9qDQ3OvU1B2MOMZ3gwK0/img.png&quot; data-alt=&quot;국민빈관 &amp;amp;gt; 간청역 버스 시간표&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cE3lib/dJMcaged9lt/Mt9qDQ3OvU1B2MOMZ3gwK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcE3lib%2FdJMcaged9lt%2FMt9qDQ3OvU1B2MOMZ3gwK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1550&quot; height=&quot;658&quot; data-origin-width=&quot;1550&quot; data-origin-height=&quot;658&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;국민빈관 &amp;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;div id=&quot;code_1777015016173&quot; data-ke-type=&quot;html&quot; data-source=&quot;&amp;lt;figure class=&amp;quot;map-wrap&amp;quot;&amp;gt;
  &amp;lt;iframe
    src=&amp;quot;https://www.google.com/maps/embed?pb=!1m14!1m8!1m3!1d397.4115887814387!2d121.15517813487733!3d24.044509547418127!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x3468c211a3eaec93%3A0x92ef935b617bc930!2sCingjing%20Guest%20House!5e0!3m2!1sko!2skr!4v1777014988670!5m2!1sko!2skr&amp;quot;
    loading=&amp;quot;lazy&amp;quot;
    allowfullscreen
    referrerpolicy=&amp;quot;no-referrer-when-downgrade&amp;quot;
  &amp;gt;&amp;lt;/iframe&amp;gt;
&amp;lt;/figure&amp;gt;

&amp;lt;style&amp;gt;
  .map-wrap {
    width: 100%;
    aspect-ratio: 4 / 3;
    margin: 0;
  }

  .map-wrap iframe {
    display: block;
    width: 100%;
    height: 100%;
    border: 0;
  }
&amp;lt;/style&amp;gt;&quot;&gt;
&lt;figure class=&quot;map-wrap&quot;&gt;&lt;iframe src=&quot;https://www.google.com/maps/embed?pb=!1m14!1m8!1m3!1d397.4115887814387!2d121.15517813487733!3d24.044509547418127!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x3468c211a3eaec93%3A0x92ef935b617bc930!2sCingjing%20Guest%20House!5e0!3m2!1sko!2skr!4v1777014988670!5m2!1sko!2skr&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/figure&gt;
&lt;style&gt;
  .map-wrap {
    width: 100%;
    aspect-ratio: 4 / 3;
    margin: 0;
  }

  .map-wrap iframe {
    display: block;
    width: 100%;
    height: 100%;
    border: 0;
  }
&lt;/style&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;칭징농장 추천 코스&lt;/h2&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;칭칭초원에서 국민빈관으로 이어지는 길은 대체로 내리막길이라 이 방향으로 이동하는 것이 훨씬 수월하다. 칭칭초원 버스 정류장에서 하차해서 초원을 둘러보고 푸드코트 부근에서 점심을 먹은 뒤, 스카이워크를 따라 국민빈관 쪽으로 내려오는 코스가 체력적으로 부담이 덜하다. 대략적인 루트는 &lt;a title=&quot;칭징농장 추천 코스 구글 지도&quot; href=&quot;https://www.google.com/maps/d/u/0/edit?mid=1_OvlFj-fRQbTvRCWRkIvCLXJ3L9D7gU&amp;amp;usp=sharing&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;구글 지도&lt;/a&gt;로 만들어뒀으니 참고하자.&lt;/p&gt;
&lt;div id=&quot;code_1777041494811&quot; data-ke-type=&quot;html&quot; data-source=&quot;&amp;lt;figure class=&amp;quot;map-wrap&amp;quot;&amp;gt;
  &amp;lt;iframe
    src=&amp;quot;https://www.google.com/maps/d/u/0/embed?mid=1_OvlFj-fRQbTvRCWRkIvCLXJ3L9D7gU&amp;amp;ehbc=2E312F&amp;quot;
    loading=&amp;quot;lazy&amp;quot;
    allowfullscreen
    referrerpolicy=&amp;quot;no-referrer-when-downgrade&amp;quot;
  &amp;gt;&amp;lt;/iframe&amp;gt;
&amp;lt;/figure&amp;gt;

&amp;lt;style&amp;gt;
  .map-wrap {
    width: 100%;
    aspect-ratio: 4 / 3;
    margin: 0;
  }

  .map-wrap iframe {
    display: block;
    width: 100%;
    height: 100%;
    border: 0;
  }
&amp;lt;/style&amp;gt;&quot;&gt;
&lt;figure class=&quot;map-wrap&quot;&gt;&lt;iframe src=&quot;https://www.google.com/maps/d/u/0/embed?mid=1_OvlFj-fRQbTvRCWRkIvCLXJ3L9D7gU&amp;amp;ehbc=2E312F&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/figure&gt;
&lt;style&gt;
  .map-wrap {
    width: 100%;
    aspect-ratio: 4 / 3;
    margin: 0;
  }

  .map-wrap iframe {
    display: block;
    width: 100%;
    height: 100%;
    border: 0;
  }
&lt;/style&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;08:30&lt;/b&gt; 난터우 버스 간청역에서 직행 버스 탑승&lt;/li&gt;
&lt;li&gt;&lt;b&gt;11:00&lt;/b&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;li&gt;칭징농장 푸드코트 부근에서 점심 식사 - 아청 식당(阿青的店) 추천
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;염소 고기 볶음밥(山羊炒飯) 150 TWD&lt;/li&gt;
&lt;li&gt;동과 밀크티(冬瓜鮮奶) 55 TWD&lt;/li&gt;
&lt;li&gt;멧돼지 고기 소시지 (山豬肉香腸) 45 TWD&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;칭칭초원 스카이워크 입장 (남문)&lt;/li&gt;
&lt;li&gt;칭징 스카이워크&lt;/li&gt;
&lt;li&gt;삼나무 숲길(清境柳杉步道) - 길을 따라 내려가다 보면 스위스가든 입구도 지나친다.&lt;/li&gt;
&lt;li&gt;국민빈관(國民賓館) - 산양유/밀크티 마시면서 로비에서 휴식&lt;/li&gt;
&lt;li&gt;&lt;b&gt;15:10&lt;/b&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;h2 data-ke-size=&quot;size26&quot;&gt;기타 팁&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_3076.jpeg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d316u6/dJMcacXaOx4/2qKrgGbkuqnRNJjM6EpmXK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d316u6/dJMcacXaOx4/2qKrgGbkuqnRNJjM6EpmXK/img.jpg&quot; data-alt=&quot;국민빈관에서 판매하는 산양유 (60 TWD)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d316u6/dJMcacXaOx4/2qKrgGbkuqnRNJjM6EpmXK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd316u6%2FdJMcacXaOx4%2F2qKrgGbkuqnRNJjM6EpmXK%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;3024&quot; height=&quot;4032&quot; data-filename=&quot;IMG_3076.jpeg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;국민빈관에서 판매하는 산양유 (60 TWD)&lt;/figcaption&gt;
&lt;/figure&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;칭징농장은 1750m가 넘는 고산지대라 날씨는 선선해도 햇빛은 강렬하다. 얼굴뿐 아니라 목, 팔 등 노출되는 부위 모두 자외선 차단제를 꼼꼼히 발라 주는 게 좋다.&lt;/li&gt;
&lt;li&gt;날씨가 절반은 먹고 들어가는 곳이니, 가능하면 맑은 날을 골라 가자. &amp;mdash; &lt;a title=&quot;대만 중앙기상서 홈페이지&quot; href=&quot;https://www.cwa.gov.tw/V8/C/L/Farm/Farm.html?PID=E011&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;대만 중앙기상서(CWA) 홈페이지&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;산간 지역 특성상 오후에 갑자기 비가 오는 경우도 있다. 작은 우산을 챙겨 두면 좋다.&lt;/li&gt;
&lt;li&gt;칭칭초원 입장 시 손등에 꼭 도장을 찍어 두자. 그래야 다른 구역을 둘러본 뒤에도 재입장할 수 있다.&lt;/li&gt;
&lt;li&gt;산양유(鮮羊乳), 산양유 밀크티(鮮羊奶茶)는 한 번쯤 마셔 보자. 국민빈관, 칭징 장성 산책로(清境長城步道) 부근 매장에서 판매한다.&lt;/li&gt;
&lt;li&gt;일부 매장은 현금 결제만 가능하므로 현금을 챙겨 두는 것이 좋다. 스위스가든 입구 쪽 세븐일레븐에 CTBC ATM 기기가 있다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고 이미지&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_2933.jpeg&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lZqYX/dJMcah5ht6D/mKZqbqf76XwSthkp29MT40/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lZqYX/dJMcah5ht6D/mKZqbqf76XwSthkp29MT40/img.jpg&quot; data-alt=&quot;칭칭초원 정문&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lZqYX/dJMcah5ht6D/mKZqbqf76XwSthkp29MT40/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlZqYX%2FdJMcah5ht6D%2FmKZqbqf76XwSthkp29MT40%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;4284&quot; height=&quot;5712&quot; data-filename=&quot;IMG_2933.jpeg&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;칭칭초원 정문&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_2942.jpeg&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mkifA/dJMcacXaO7M/ZrAKCcanOdnewy51tbrF7K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mkifA/dJMcacXaO7M/ZrAKCcanOdnewy51tbrF7K/img.jpg&quot; data-alt=&quot;장성 산책로 부근 밀크티 판매점 (패스권 보여주면 할인 가능)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mkifA/dJMcacXaO7M/ZrAKCcanOdnewy51tbrF7K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmkifA%2FdJMcacXaO7M%2FZrAKCcanOdnewy51tbrF7K%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;4284&quot; height=&quot;5712&quot; data-filename=&quot;IMG_2942.jpeg&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;장성 산책로 부근 밀크티 판매점 (패스권 보여주면 할인 가능)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_2974.jpeg&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AcVvf/dJMcageek2n/sYsClAqMdY4uzEe0jDJ8zk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AcVvf/dJMcageek2n/sYsClAqMdY4uzEe0jDJ8zk/img.jpg&quot; data-alt=&quot;스카이워크 입구&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AcVvf/dJMcageek2n/sYsClAqMdY4uzEe0jDJ8zk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAcVvf%2FdJMcageek2n%2FsYsClAqMdY4uzEe0jDJ8zk%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;4284&quot; height=&quot;5712&quot; data-filename=&quot;IMG_2974.jpeg&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;스카이워크 입구&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_3048.jpeg&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdwkXG/dJMcafTVtpw/9b18eKY1Kz5QDXuCZxwDs1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdwkXG/dJMcafTVtpw/9b18eKY1Kz5QDXuCZxwDs1/img.jpg&quot; data-alt=&quot;푸드코트 부근 점심식사 장소&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdwkXG/dJMcafTVtpw/9b18eKY1Kz5QDXuCZxwDs1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdwkXG%2FdJMcafTVtpw%2F9b18eKY1Kz5QDXuCZxwDs1%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;4284&quot; height=&quot;5712&quot; data-filename=&quot;IMG_3048.jpeg&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;푸드코트 부근 점심식사 장소&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_3026.jpeg&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tCKGl/dJMcadPgLhD/6kfKYHZDGBhzl5BaZRqCt1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tCKGl/dJMcadPgLhD/6kfKYHZDGBhzl5BaZRqCt1/img.jpg&quot; data-alt=&quot;관산 역참 부근&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tCKGl/dJMcadPgLhD/6kfKYHZDGBhzl5BaZRqCt1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtCKGl%2FdJMcadPgLhD%2F6kfKYHZDGBhzl5BaZRqCt1%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;4284&quot; height=&quot;5712&quot; data-filename=&quot;IMG_3026.jpeg&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;관산 역참 부근&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;7DE433E1-1166-474F-AB81-86C9C054C5A9.jpg&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLP6J7/dJMb99MTGJ3/5tVom8Sq7ZUDXgBdL2eF7K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLP6J7/dJMb99MTGJ3/5tVom8Sq7ZUDXgBdL2eF7K/img.jpg&quot; data-alt=&quot;관산 역참 부근에서 볼 수 있는 발레 블랙노즈 품종&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLP6J7/dJMb99MTGJ3/5tVom8Sq7ZUDXgBdL2eF7K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLP6J7%2FdJMb99MTGJ3%2F5tVom8Sq7ZUDXgBdL2eF7K%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;4284&quot; height=&quot;5712&quot; data-filename=&quot;7DE433E1-1166-474F-AB81-86C9C054C5A9.jpg&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;관산 역참 부근에서 볼 수 있는 발레 블랙노즈 품종&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>  China</category>
      <category>난터우여행</category>
      <category>대만버스여행</category>
      <category>대만여행</category>
      <category>대만자유여행</category>
      <category>칭징농장</category>
      <category>칭징농장가는법</category>
      <category>칭징농장패스</category>
      <category>칭칭초원</category>
      <category>타이중근교여행</category>
      <category>타이중여행</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1355</guid>
      <comments>https://romantech.net/1355#entry1355comment</comments>
      <pubDate>Sat, 25 Apr 2026 13:04:55 +0900</pubDate>
    </item>
    <item>
      <title>홍콩 번호 발급&amp;middot;문자 수신&amp;middot;ICCID 실명 인증 방법 (eSender)</title>
      <link>https://romantech.net/1354</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;얼마 전 홍콩 번호로 문자 인증할 일이 생겨서 이런저런 방법을 알아보다가 &lt;a title=&quot;eSender 홈페이지&quot; href=&quot;https://www.esenderchina.com/kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;eSender(易博通)&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;eSender는 홍콩에 본사를 둔 회사로, SIM 카드 없이 중국 본토(+86), 홍콩(+852) 등의 가상 전화번호를 발급해 주는 서비스다. 번호 발급 후엔 &lt;a title=&quot;eSender iOS 앱&quot; href=&quot;https://apps.apple.com/kr/app/%E6%98%93%E5%8D%9A%E9%80%9Aesender/id1472477960&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;앱(App)&lt;/a&gt;이나 위챗(Wechat, 微信) 공식 계정(公众号)을 통해 문자를 수신할 수 있다. &lt;a title=&quot;Blacktel 홈페이지&quot; href=&quot;https://www.blacktel.io/ko&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Blacktel&lt;/a&gt;, &lt;a title=&quot;Zadarma 홈페이지&quot; href=&quot;https://zadarma.com/en/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Zadarma&lt;/a&gt;, &lt;a title=&quot;Telnum 홈페이지&quot; href=&quot;https://telnum.net/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Telnum&lt;/a&gt; 등 비슷한 서비스가 많지만 eSender 가격이 가장 저렴하다.&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FwaqS/dJMcajona7G/APPcGBpd7Bq5EonehvZrVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FwaqS/dJMcajona7G/APPcGBpd7Bq5EonehvZrVK/img.png&quot; data-alt=&quot;eSender 앱 메인 화면. 영어를 지원한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FwaqS/dJMcajona7G/APPcGBpd7Bq5EonehvZrVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFwaqS%2FdJMcajona7G%2FAPPcGBpd7Bq5EonehvZrVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1440&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;eSender 앱 메인 화면. 영어를 지원한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;가격&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;위챗 공식 계정에서는 문자 수신만 가능하다. 전화도 수신(무료)하려면 eSender 앱이 필요하다. 별도 크레딧을 충전(최소 30 HKD)하면 앱에서 문자&amp;middot;전화 발신도 할 수 있다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;홍콩 번호 발급은 ①사용 이력이 없는 신규 번호(全新号码), ②일반 번호(一般手机号) 두 가지 종류로 나뉜다. 신규 번호는 1년 단위로만 판매하기 때문에 단기 사용이 목적이라면 일반 번호를 선택하는 게 좋다. 일반 번호 기준 가격은 다음과 같다.&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;30일: 18 HKD (약 3,400원)&lt;/li&gt;
&lt;li&gt;90일: 38 HKD (약 7,100원)&lt;/li&gt;
&lt;li&gt;360일: 118 HKD (약 22,000원)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;구매 팁&lt;/h2&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;홍콩 번호는 eSender 앱과 위챗 공식 계정 두 곳에서 모두 구매할 수 있다. 다만 앱에서 구매한 번호는 앱에서만 문자를 수신할 수 있는 반면, 위챗에서 구매한 번호는 위챗&amp;middot;앱 양쪽에서 문자를 수신할 수 있다(앱에서 위챗 연동 필요). 결제는 애플페이, 페이팔, 카카오페이(원화 결제) 등 다양한 방식을 지원한다.&lt;/p&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 title=&quot;eSender 프로모션 페이지&quot; href=&quot;https://www.esenderchina.com/kr/#promo&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;eSender 공식 한국어 페이지&lt;/a&gt;에 위챗을 이용한 구입 방법이 자세히 안내되어 있다. 해당 페이지에서 프로모션 할인 코드도 확인할 수 있으니 놓치지 말자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1662&quot; data-origin-height=&quot;1162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kDOjy/dJMcahYsVOh/OT6arC7ZvymAlEhF3pYWl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kDOjy/dJMcahYsVOh/OT6arC7ZvymAlEhF3pYWl0/img.png&quot; data-alt=&quot;2026년 4월 eSender 프로모션 코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kDOjy/dJMcahYsVOh/OT6arC7ZvymAlEhF3pYWl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkDOjy%2FdJMcahYsVOh%2FOT6arC7ZvymAlEhF3pYWl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1662&quot; height=&quot;1162&quot; data-origin-width=&quot;1662&quot; data-origin-height=&quot;1162&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2026년 4월 eSender 프로모션 코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실명 인증&lt;/h2&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;홍콩/마카오는 2022년부터 통신 실명제를 시행하고 있다. 때문에 홍콩 번호를 사용하려면 ICCID(Integrated Circuit Card Identifier) 실명 인증이 필요하다. ICCID는 SIM 카드에 부여된 고유 식별 번호로, 구매한 홍콩 번호를 본인 명의(여권)로 등록하는 절차라고 보면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uhhRD/dJMcabYgQPf/SjzyDnygNPI3FPzL6gdxLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uhhRD/dJMcabYgQPf/SjzyDnygNPI3FPzL6gdxLk/img.png&quot; data-alt=&quot;실명 인증 안내 문자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uhhRD/dJMcabYgQPf/SjzyDnygNPI3FPzL6gdxLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuhhRD%2FdJMcabYgQPf%2FSjzyDnygNPI3FPzL6gdxLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1440&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&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;a title=&quot;eSender 홍콩 번호 실명 인증 페이지&quot; href=&quot;https://kyc.multibyte.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://kyc.multibyte.com&lt;/a&gt; 실명 등록 페이지에 접속한다(모바일만 가능). 우측 상단 햄버거 버튼(☰) &amp;gt; 语言 &amp;gt; English를 클릭하면 페이지 언어를 영어로 변경할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmihET/dJMcaa57TRO/CCIZynpM9F57ZbhPqDujt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmihET/dJMcaa57TRO/CCIZynpM9F57ZbhPqDujt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmihET/dJMcaa57TRO/CCIZynpM9F57ZbhPqDujt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmihET%2FdJMcaa57TRO%2FCCIZynpM9F57ZbhPqDujt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1440&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&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;Register my SIM card 버튼 클릭 후 Non HKID User를 선택한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4Mn1I/dJMcabcQWM5/1BffkXmLYZVIkdy0yU1nP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4Mn1I/dJMcabcQWM5/1BffkXmLYZVIkdy0yU1nP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4Mn1I/dJMcabcQWM5/1BffkXmLYZVIkdy0yU1nP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4Mn1I%2FdJMcabcQWM5%2F1BffkXmLYZVIkdy0yU1nP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1440&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&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;Mobile No 탭 &amp;gt; 발급받은 휴대폰 번호(+852 제외 8자리) 입력 &amp;gt; Send 버튼을 눌러서 인증번호를 받는다. 인증번호를 입력하고 Okay 버튼 클릭 &amp;gt; 다음 화면에서 여권 정보(사진 나오는 면) 찍어서 업로드하면 끝. 빠르면 5~10분 안에 실명 인증이 완료된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Tnu6V/dJMb990thEZ/ORXUAoBefUIQQBqiVT2wck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Tnu6V/dJMb990thEZ/ORXUAoBefUIQQBqiVT2wck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Tnu6V/dJMb990thEZ/ORXUAoBefUIQQBqiVT2wck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTnu6V%2FdJMb990thEZ%2FORXUAoBefUIQQBqiVT2wck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1440&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&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;  개인은 최대 10개, 기업은 최대 25개의 선불 SIM 카드를 등록할 수 있다.&lt;/p&gt;</description>
      <category>  China</category>
      <category>eSender</category>
      <category>iccid</category>
      <category>易博通</category>
      <category>가상번호</category>
      <category>홍콩가상번호</category>
      <category>홍콩문자수신</category>
      <category>홍콩문자인증</category>
      <category>홍콩번호</category>
      <category>홍콩번호발급</category>
      <category>홍콩유심</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1354</guid>
      <comments>https://romantech.net/1354#entry1354comment</comments>
      <pubDate>Fri, 24 Apr 2026 00:46:29 +0900</pubDate>
    </item>
    <item>
      <title>[CLI] 유용한 셸(Shell) 터미널 단축키/팁 모음</title>
      <link>https://romantech.net/1353</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;셸 공통 기능&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;aside&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이해를 돕기 위해 코드 블록의 &lt;code&gt;|&lt;/code&gt;는 커서라고 가정한다.&lt;/li&gt;
&lt;li&gt;macOS 터미널은 &lt;code&gt;Option&lt;/code&gt;을 메타 키로 지정하면 &lt;code&gt;Alt&lt;/code&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;/aside&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;라인 편집 단축키&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;Ctrl + W&lt;/code&gt; : 커서 앞 단어 잘라내기&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# Before
Excepteur sit est non sed excepteur in commodo.|
# After
Excepteur sit est non sed excepteur in |&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;code&gt;Ctrl + U&lt;/code&gt; : 커서부터 줄 시작까지 잘라내기&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# Before
Excepteur sit est non sed excepteur in commodo.|
# After (커서 앞 내용 다 지워짐)
|&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;code&gt;Ctrl + K&lt;/code&gt; : 커서부터 줄 끝까지 잘라내기&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# Before
Excepteur |sit est non sed excepteur in commodo.
# After
Excepteur |&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;code&gt;Ctrl + Y&lt;/code&gt; : 가장 최근에 잘라낸 내용 붙여넣기&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# Before
Excepteur sit est non sed excepteur in |
# After
Excepteur sit est non sed excepteur in commodo.|&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;code&gt;Ctrl + A&lt;/code&gt; : 줄 맨 앞으로 이동&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# Before
Excepteur sit est non sed excepteur in commodo.|
# After
|Excepteur sit est non sed excepteur in commodo.&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;code&gt;Ctrl + E&lt;/code&gt; : 줄 맨 끝으로 이동&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# Before
|Excepteur sit est non sed excepteur in commodo.
# After
Excepteur sit est non sed excepteur in commodo.|&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;code&gt;Alt + B&lt;/code&gt; : 단어 단위로 뒤로 이동&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# Before
Excepteur sit est non sed excepteur in commodo.|
# After
Excepteur sit est non sed excepteur in |commodo.&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;code&gt;Alt + F&lt;/code&gt; : 단어 단위로 앞으로 이동&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# Before
Excepteur |sit est non sed excepteur in commodo.
# After
Excepteur sit |est non sed excepteur in commodo.&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;글자가 보이지 않거나, 줄바꿈이 이상해지거나, 화면 표시가 깨졌거나, 어떤 프로그램이 비정상적으로 종료되면서 터미널 상태가 꼬였을 때 유용한 복구 명령어.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 터미널 상태 초기화
reset
# 터미널 입력 설정 복구
stty sane&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;Ctrl + C&lt;/code&gt; : 현재 포그라운드에서 실행 중인 명령 중단&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Ctrl + D&lt;/code&gt; : EOF(End of File; 더 이상 입력할 내용 없음) 전송. &lt;code&gt;cat&lt;/code&gt;처럼 입력을 기다리는 프로그램이나 Python 같은 인터프리터를 종료할 때 자주 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;화면 정리&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;Ctrl + L&lt;/code&gt; : 터미널 화면 정리&lt;/li&gt;
&lt;li&gt;macOS 터미널에선 &lt;code&gt;Command + K&lt;/code&gt; 단축키로도 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;디렉터리 이동&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;cd -&lt;/code&gt; : 바로 이전 디렉터리로 이동&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pushd [경로]&lt;/code&gt; : 현재 디렉터리를 스택에 저장하고 지정한 디렉터리로 이동&lt;/li&gt;
&lt;li&gt;&lt;code&gt;popd&lt;/code&gt; : 저장해 둔 디렉터리로 복귀 (디렉터리 스택의 맨 위 경로)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;파일 비우기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;&amp;gt; 파일명&lt;/code&gt; : 파일은 삭제하지 않고 내용만 비움&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;echo &quot;Hello World&quot; &amp;gt; hello.txt
cat hello.txt
# Hello World

&amp;gt; hello.txt
cat hello.txt
# (내용없음)&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;&lt;code&gt;$_&lt;/code&gt; : 직전 명령의 마지막 인자 참조 (히스토리에는 값 노출 없이 &lt;code&gt;$_&lt;/code&gt; 으로 기록됨, 스크립트에서도 사용 가능)&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;mkdir -p project/src
cd $_
pwd
# project/src&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;set -e&lt;/code&gt; : 명령 실패 시 스크립트 종료&lt;/li&gt;
&lt;li&gt;&lt;code&gt;set -u&lt;/code&gt; : 정의되지 않은 변수 사용 시 에러&lt;/li&gt;
&lt;li&gt;&lt;code&gt;set -o pipefail&lt;/code&gt; : 파이프라인 중간 명령을 실패하면 전체를 실패로 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Bash / Zsh 기능&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;히스토리 검색&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;Ctrl + R&lt;/code&gt; : 이전에 실행한 명령을 히스토리에서 역방향으로 검색&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;명령 재사용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;!!&lt;/code&gt; : 직전 명령어 다시 실행&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;pwd 
# /Users/me/project
!!
# pwd
# /Users/me/project&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;&lt;code&gt;Ctrl + X&lt;/code&gt;, &lt;code&gt;Ctrl + E&lt;/code&gt; : 현재 입력 중인 명령을 에디터로 열기&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 터미널에 긴 명령어를 입력하다가...
git commit -m &quot;fix: adjust shell shortcut docs and add editor examples&quot;

# Ctrl + X, Ctrl + E 단축키를 누르면
# 입력 중이던 내용이 에디터에서 열림
# 에디터에서 수정한 뒤 저장하고 종료하면
# 수정된 내용이 터미널 입력창에 반영됨&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;code&gt;fc&lt;/code&gt; : 이전 명령을 &lt;code&gt;$EDITOR&lt;/code&gt;에서 편집&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 직전에 실행한 명령
git rebase -i HEAD~5

# 다시 수정해서 실행하고 싶을 때
fc

# 방금 실행한 명령이 에디터에서 열림
# HEAD~10으로 고친 뒤 저장하고 종료하면
# 수정한 명령이 다시 실행됨&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;&lt;code&gt;Esc + .&lt;/code&gt; 또는 &lt;code&gt;Alt + .&lt;/code&gt; : 직전 명령의 마지막 인자를 현재 커서 위치에 삽입&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;mkdir -p project/src
cd 
# 여기서 Alt + .
# project/src 가 자동으로 입력됨&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;code&gt;!$&lt;/code&gt; : 직전 명령의 마지막 인자 참조 (히스토리에는 실제 값으로 치환되어 기록됨, 셸 전용)&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;mkdir -p project/src
cd !$
pwd
# project/src&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;중괄호 확장 (Brace Expansion)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;{}&lt;/code&gt; 안에 값이나 범위를 넣어 여러 문자열을 한 번에 생성할 수 있는 기능. 쉼표(&lt;code&gt;,&lt;/code&gt;)는 여러 값을 나열할 때 사용하고, &lt;code&gt;..&lt;/code&gt; 는 연속된 범위를 지정할 때 사용한다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;echo file{1,2,3}.txt
# file1.txt file2.txt file3.txt

mkdir -p project/{src,dist,public}
# project/src project/dist project/public 디렉터리 생성

echo {1..5}
# 1 2 3 4 5

echo {a..d}
# a b c d&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;프로세스 치환 (Process Substitution)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어의 출력을 임시 파일처럼 다룰 수 있는 기능. &lt;code&gt;&amp;lt;(명령어)&lt;/code&gt;는 실행 결과를 파일처럼 읽을 수 있게 하고(read), &lt;code&gt;&amp;gt;(명령어)&lt;/code&gt;는 출력을 파일에 쓰듯(write) 다른 명령으로 보낼 수 있게 한다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 임시 파일 생성 없이, 두 디렉터리의 파일 목록 차이를 바로 비교
diff &amp;lt;(ls dirA) &amp;lt;(ls dirB)

# 각 명령어의 실행 결과를 텍스트 파일처럼 이어서 출력
cat &amp;lt;(echo &quot;hello&quot;) &amp;lt;(echo &quot;world&quot;)
# hello
# world

# app.log 내용을 출력하면서 ERROR 줄만 error.log에 저장
tee &amp;gt;(grep &quot;ERROR&quot; &amp;gt; error.log) &amp;lt; app.log
# tee: 입력받은 데이터를 화면(stdout)과 다른 출력 대상으로 동시에 보냄
# 흐름: app.log 읽기 &amp;rarr; 화면에 전체 출력 &amp;rarr; 동시에 grep으로 넘겨 ERROR만 따로 저장&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;글로브 패턴 (Glob Pattern)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 경로를 패턴으로 매칭하는 기능. &lt;code&gt;*&lt;/code&gt;는 현재 디렉터리 수준에서 매칭하고, &lt;code&gt;**&lt;/code&gt;는 하위 디렉터리까지 재귀적으로 탐색한다. bash에서 &lt;code&gt;**&lt;/code&gt;를 사용하려면 &lt;code&gt;shopt -s globstar&lt;/code&gt; 명령어로 globstar 옵션을 활성화해야 한다. zsh에서는 기본적으로 &lt;code&gt;**&lt;/code&gt;를 사용할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 현재 디렉터리의 .js 파일 출력
echo *.js

# 현재 디렉터리와 모든 하위 디렉터리의 .js 파일 출력
echo **/*.js

# 모든 하위 디렉터리의 .md 파일 출력
ls **/*.md

# src의 모든 하위 디렉터리에서 .ts 파일을 찾아 dist로 복사
cp src/**/*.ts dist/&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;작업 제어 (Job Control)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 중인 프로세스를 일시 중지하거나 백그라운드에서 계속 실행하는 기능. &lt;code&gt;Ctrl + Z&lt;/code&gt; 단축키로 현재 포그라운드 작업을 일시 중지할 수 있고, &lt;code&gt;bg&lt;/code&gt; 명령어로 중지한 작업을 백그라운드에서 재개할 수 있다. 반대로 백그라운드 작업을 다시 포그라운드로 가져올 땐 &lt;code&gt;fg&lt;/code&gt;를 사용한다. 현재 셸이 관리 중인 작업 목록은 &lt;code&gt;jobs&lt;/code&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;code&gt;disown&lt;/code&gt; 명령을 사용하면 된다. &lt;code&gt;disown&lt;/code&gt;은 특정 작업을 셸 작업 목록에서 제거해서 셸 종료 시 전송되는 &lt;code&gt;SIGHUP&lt;/code&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;code&gt;disown&lt;/code&gt;으로 분리한 작업은 &lt;code&gt;jobs&lt;/code&gt;에 더 이상 표시되지 않으므로 &lt;code&gt;ps&lt;/code&gt;나 &lt;code&gt;pgrep&lt;/code&gt;으로 실행 여부를 확인해야 한다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 실행 중인 프로세스 일시 중단
node server.js
^Z
# [1]+ Stopped node server.js

# 중단된 작업을 백그라운드에서 계속 실행
bg %1
# [1]+ node server.js &amp;amp;

# 현재 작업 목록 확인
jobs
# [1]+ Running node server.js &amp;amp;

# 셸을 닫아도 프로세스가 종료되지 않도록 작업 목록에서 제거
disown %1&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;code&gt;&amp;amp;&lt;/code&gt;를 붙이면 처음부터 백그라운드로 실행할 수도 있다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;pnpm start:dev &amp;amp;&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;&lt;code&gt;|&amp;amp;&lt;/code&gt;는 표준 출력(stdout)과 표준 에러 출력(stderr)을 합친 후 다음 명령어로 전달(파이프)하는 문법이다. &lt;code&gt;tee&lt;/code&gt; 명령어를 사용하면 출력 내용을 화면에 표시하면서 파일로도 저장할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# stdout과 stderr를 화면에 출력하면서 all.log에 저장
command |&amp;amp; tee all.log

# 기존 로그 파일 끝에 이어서 저장 (-a: append)
command |&amp;amp; tee -a all.log

# 빌드 결과를 화면에 보면서 로그 파일에도 저장
pnpm build |&amp;amp; tee build.log

# 서버 로그를 화면에 출력하면서 기존 파일 끝에 계속 추가
pnpm start:dev |&amp;amp; tee -a 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;code&gt;|&amp;amp;&lt;/code&gt;는 Bash 4+와 zsh에서 지원하는 단축 문법으로, &lt;code&gt;2&amp;gt;&amp;amp;1 |&lt;/code&gt; 동작과 동일하다. sh 스크립트나 구형 환경에서는 &lt;code&gt;2&amp;gt;&amp;amp;1 |&lt;/code&gt;를 사용해야 한다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# |&amp;amp; 와 동일한 동작
pnpm build 2&amp;gt;&amp;amp;1 | tee build.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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;레퍼런스&lt;/h2&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;&lt;a href=&quot;https://blog.hofstede.it/shell-tricks-that-actually-make-life-easier-and-save-your-sanity/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Shell Tricks That Actually Make Life Easier (And Save Your Sanity)&lt;/a&gt;&lt;/p&gt;</description>
      <category>  Programming</category>
      <category>bash</category>
      <category>cli</category>
      <category>zsh</category>
      <category>개발팁</category>
      <category>리눅스</category>
      <category>맥터미널</category>
      <category>셸</category>
      <category>쉘</category>
      <category>커맨드라인</category>
      <category>터미널</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1353</guid>
      <comments>https://romantech.net/1353#entry1353comment</comments>
      <pubDate>Fri, 10 Apr 2026 23:35:21 +0900</pubDate>
    </item>
    <item>
      <title>티스토리 블로그에 자동 목차(TOC) 추가하기</title>
      <link>https://romantech.net/1352</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;목차는 영어로 TOC(Table of Contents)라고 부르는데, 노션(Notion) 사용자라면 &lt;code&gt;/toc&lt;/code&gt; 명령어로 목차를 손쉽게 삽입해 본 경험이 있을 것이다. 그만큼 익숙하고 유용한 기능이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1208&quot; data-origin-height=&quot;719&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T71WL/dJMcabKx4yB/LX2fkGUk7N3QBXB3pXiItk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T71WL/dJMcabKx4yB/LX2fkGUk7N3QBXB3pXiItk/img.png&quot; data-alt=&quot;노션의 목차 삽입 명령어&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T71WL/dJMcabKx4yB/LX2fkGUk7N3QBXB3pXiItk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT71WL%2FdJMcabKx4yB%2FLX2fkGUk7N3QBXB3pXiItk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1208&quot; height=&quot;719&quot; data-origin-width=&quot;1208&quot; data-origin-height=&quot;719&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;아쉽게도 티스토리(Tistory)는 목차 기능을 제공하지 않는다. 다만 티스토리 본문은 어느 정도 시맨틱 마크업(의미/역할에 맞는 HTML 구조)을 따르고 있어서 기본모드 에디터 기준 제목1~제목3은 &lt;code&gt;&amp;lt;h2&amp;gt;&lt;/code&gt;~&lt;code&gt;&amp;lt;h4&amp;gt;&lt;/code&gt;, 본문은 &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; 같은 태그로 구성되어 있다. 이런 구조 덕분에 자바스크립트(JavaScript)를 활용한다면 티스토리에도 목차 기능을 추가할 수 있다.&lt;/p&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;toc-desktop-hover.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nMsgg/dJMcag5798A/1Qm8KMP1DEa6wK7peGhhv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nMsgg/dJMcag5798A/1Qm8KMP1DEa6wK7peGhhv1/img.png&quot; data-alt=&quot;데스크톱 목차&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nMsgg/dJMcag5798A/1Qm8KMP1DEa6wK7peGhhv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnMsgg%2FdJMcag5798A%2F1Qm8KMP1DEa6wK7peGhhv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1440&quot; data-filename=&quot;toc-desktop-hover.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;데스크톱 목차&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;toc-desktop-small.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9uOAk/dJMcagygsJ4/NGKzHAk8Ey4F63t6pLS4L1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9uOAk/dJMcagygsJ4/NGKzHAk8Ey4F63t6pLS4L1/img.png&quot; data-alt=&quot;모바일(1280px 미만 화면) 목차&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9uOAk/dJMcagygsJ4/NGKzHAk8Ey4F63t6pLS4L1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9uOAk%2FdJMcagygsJ4%2FNGKzHAk8Ey4F63t6pLS4L1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1440&quot; data-filename=&quot;toc-desktop-small.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;모바일(1280px 미만 화면) 목차&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치 방법&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;티스토리 관리자 &amp;gt; 스킨 편집 &amp;gt; HTML 편집 화면에서 &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt; 태그 바로 위에 아래 스크립트를 삽입한다.&lt;/p&gt;
&lt;pre id=&quot;code_1775461959120&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script defer src=&quot;https://cdn.jsdelivr.net/gh/romantech/tistory-plugins@latest/dist/toc/index.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TOC 플러그인은 기본적으로 &lt;code&gt;h2&lt;/code&gt;~&lt;code&gt;h4&lt;/code&gt; 제목 태그를 대상으로 목차를 생성한다. 제목이 두 개 미만이라면 목차를 표시하지 않는다. 필요하다면 아래 옵션을 조정해서 원하는 제목 레벨을 직접 지정할 수 있다. ⚠️ 옵션 코드는 스크립트 코드보다 위에 위치해야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1775462170632&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- TOC 플러그인 옵션 --&amp;gt;
&amp;lt;script&amp;gt;
  window.RPPlugins = {
    toc: {
      levels: [2, 3, 4, 5], // 목차에 포함할 제목 레벨 (기본값 2, 3, 4)
      headerOffset: 64, // 화면 상단 부터 제목까지의 여백 (기본값 84)
    },
  };
&amp;lt;/script&amp;gt;

&amp;lt;!-- TOC 플러그인 스크립트 --&amp;gt;
&amp;lt;script defer src=&quot;https://cdn.jsdelivr.net/gh/romantech/tistory-plugins@latest/dist/toc/index.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;플러그인은 다음과 같은 순서로 본문 영역을 탐색한다. 정말 특이한 스킨이 아니라면 아래 셀렉터만으로 무리 없이 찾을 수 있다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;b&gt;셀렉터&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;b&gt;변형 셀렉터&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;code&gt;.contents-style&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;code&gt;.contents_style&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;code&gt;.entry-content&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;code&gt;.entry_content&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;code&gt;.area-view&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;code&gt;.area_view&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;code&gt;.post-content&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;code&gt;.post_content&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;code&gt;.article-view&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;code&gt;.article_view&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;code&gt;#article&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;code&gt;.article-cont&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;code&gt;.article_cont&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스킨 구조가 달라서 본문을 찾지 못하는 경우 셀렉터를 직접 지정할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1775463243974&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
  window.RPPlugins = {
    articleSelectors: [&quot;.my-article&quot;, &quot;#main-content&quot;],
  };
&amp;lt;/script&amp;gt;

&amp;lt;script defer src=&quot;https://cdn.jsdelivr.net/gh/romantech/tistory-plugins@latest/dist/toc/index.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주요 기능&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;색상 모드 자동 전환&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데스크톱 TOC는 현재 적용된 블로그 스킨에 맞춰 라이트/다크 모드가 자동으로 전환된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;toc-theme.png&quot; data-origin-width=&quot;1476&quot; data-origin-height=&quot;1106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dyvOiu/dJMcafGaCjF/Elk2xw9JJFIKTgfHQiJOPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dyvOiu/dJMcafGaCjF/Elk2xw9JJFIKTgfHQiJOPK/img.png&quot; data-alt=&quot;왼쪽 라이트 모드, 오른쪽 다크 모드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dyvOiu/dJMcafGaCjF/Elk2xw9JJFIKTgfHQiJOPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdyvOiu%2FdJMcafGaCjF%2FElk2xw9JJFIKTgfHQiJOPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1476&quot; height=&quot;1106&quot; data-filename=&quot;toc-theme.png&quot; data-origin-width=&quot;1476&quot; data-origin-height=&quot;1106&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;h3 data-ke-size=&quot;size23&quot;&gt;데스크톱 (1280px 이상)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;넓은 화면에선 우측에 레일형 목차가 표시된다. 본문에 집중할 수 있도록 평소에는 막대만 보이고, 마우스를 올리면 제목이 함께 나타난다. 현재 읽고 있는 섹션의 레일 막대는 밝게 하이라이트되며, 제목 레벨이 낮아질수록(&lt;code&gt;h2&lt;/code&gt; &amp;rarr; &lt;code&gt;h4&lt;/code&gt;) 막대 길이가 점점 짧아진다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;toc-hover.gif&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tDCO0/dJMcadIiHxw/CwXYjKlCYhRUAvtsxaDem1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tDCO0/dJMcadIiHxw/CwXYjKlCYhRUAvtsxaDem1/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tDCO0/dJMcadIiHxw/CwXYjKlCYhRUAvtsxaDem1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/tDCO0/dJMcadIiHxw/CwXYjKlCYhRUAvtsxaDem1/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1680&quot; height=&quot;1080&quot; data-filename=&quot;toc-hover.gif&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;1080&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1508&quot; data-origin-height=&quot;1130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pIh8h/dJMcaiW8Vj9/qGXE8S5CC8NHWFtZEYX5M1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pIh8h/dJMcaiW8Vj9/qGXE8S5CC8NHWFtZEYX5M1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pIh8h/dJMcaiW8Vj9/qGXE8S5CC8NHWFtZEYX5M1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpIh8h%2FdJMcaiW8Vj9%2FqGXE8S5CC8NHWFtZEYX5M1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1508&quot; height=&quot;1130&quot; data-origin-width=&quot;1508&quot; data-origin-height=&quot;1130&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;TOC에서 제목을 클릭하면, 해당 섹션까지 이어지는 레일 막대와 제목이 순차적으로 강조된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;toc-trail.gif&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bccsxr/dJMcadO3eZX/l8DgmKC7BtuTyzXhyYDgpk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bccsxr/dJMcadO3eZX/l8DgmKC7BtuTyzXhyYDgpk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bccsxr/dJMcadO3eZX/l8DgmKC7BtuTyzXhyYDgpk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bccsxr/dJMcadO3eZX/l8DgmKC7BtuTyzXhyYDgpk/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1680&quot; height=&quot;1080&quot; data-filename=&quot;toc-trail.gif&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;1080&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;toc-autoscroll.gif&quot; data-origin-width=&quot;1688&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPjiH8/dJMcagd05DO/Mq3XAMsNdPpUfOmpxMXo31/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPjiH8/dJMcagd05DO/Mq3XAMsNdPpUfOmpxMXo31/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPjiH8/dJMcagd05DO/Mq3XAMsNdPpUfOmpxMXo31/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bPjiH8/dJMcagd05DO/Mq3XAMsNdPpUfOmpxMXo31/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1688&quot; height=&quot;1080&quot; data-filename=&quot;toc-autoscroll.gif&quot; data-origin-width=&quot;1688&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;모바일 (1280px 미만)&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;  아래로 스크롤해서 본문 영역을 벗어나면 목차가 자동으로 사라진다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1280px 미만의 좁은 화면에선 레일형 대신 팝업형 목차를 표시한다. 우측 하단   버튼을 누르면 목차 팝업이 나타나고, 제목을 클릭하면 해당 위치로 스크롤되면서 팝업이 자동으로 닫힌다. 모바일 목차는 제목 레벨에 따라 들여쓰기가 적용되어 있어 계층 구조를 쉽게 파악할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;toc-mobile-2.gif&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rEhym/dJMcaf0rbjU/d9oKGsMmayYWL1dO5xxkK1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rEhym/dJMcaf0rbjU/d9oKGsMmayYWL1dO5xxkK1/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rEhym/dJMcaf0rbjU/d9oKGsMmayYWL1dO5xxkK1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/rEhym/dJMcaf0rbjU/d9oKGsMmayYWL1dO5xxkK1/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1500&quot; height=&quot;1080&quot; data-filename=&quot;toc-mobile-2.gif&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;1080&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;TOC 버튼은 본문 영역 안에서 위아래로 드래그할 수 있다. 버튼 위쪽에 공간이 부족하면 목차 팝업은 아래 방향으로 열린다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;toc-mobile3.gif&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CLgrS/dJMcadn0Bye/TGjVZxgJvF30ZRxWKC9Lxk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CLgrS/dJMcadn0Bye/TGjVZxgJvF30ZRxWKC9Lxk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CLgrS/dJMcadn0Bye/TGjVZxgJvF30ZRxWKC9Lxk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/CLgrS/dJMcadn0Bye/TGjVZxgJvF30ZRxWKC9Lxk/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1500&quot; height=&quot;1080&quot; data-filename=&quot;toc-mobile3.gif&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기타 플러그인&lt;/h2&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;앵커 링크 외에도 인라인 코드, LaTeX(KaTeX) 렌더링 등 스크립트 한 줄만 추가하면 바로 적용할 수 있는 다른 플러그인도 함께 만들었다. 전체 코드와 더 자세한 설명은 &lt;a href=&quot;https://github.com/romantech/tistory-plugins&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;GitHub 저장소&lt;/a&gt;에서 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 27.6745%;&quot;&gt;&lt;b&gt;플러그인&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 72.3255%;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 27.6745%;&quot;&gt;&lt;a href=&quot;https://github.com/romantech/tistory-plugins/blob/main/src/plugins/inline-code&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;inline-code&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 72.3255%;&quot;&gt;벡틱(&lt;code&gt;`&lt;/code&gt;)으로 감싼 인라인 텍스트를 &lt;code&gt;&amp;lt;code&amp;gt;&lt;/code&gt;로 변환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 27.6745%;&quot;&gt;&lt;a href=&quot;https://github.com/romantech/tistory-plugins/blob/main/src/plugins/katex&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;katex&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 72.3255%;&quot;&gt;텍스트 내 수학 수식을 KaTeX로 렌더링&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 27.6745%;&quot;&gt;&lt;a href=&quot;https://github.com/romantech/tistory-plugins/blob/main/src/plugins/copy-code&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;copy-code&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 72.3255%;&quot;&gt;코드 블록 우측 상단에 복사 버튼 추가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 27.6745%;&quot;&gt;&lt;a href=&quot;https://github.com/romantech/tistory-plugins/blob/main/src/plugins/focus-guard&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;focus-guard&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 72.3255%;&quot;&gt;사이드바 토글 과정에서 발생하는 &lt;code&gt;aria-hidden&lt;/code&gt; 포커스 경고 완화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 27.6745%;&quot;&gt;&lt;a href=&quot;https://romantech.net/1350&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;heading-anchor&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 72.3255%;&quot;&gt;본문 제목에 앵커 링크를 추가하고 해시 이동 위치 보정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>⌚️ Productivity</category>
      <category>TOC</category>
      <category>목차</category>
      <category>블로그꾸미기</category>
      <category>블로그목차</category>
      <category>스킨</category>
      <category>자동목차</category>
      <category>티스토리</category>
      <category>티스토리목차</category>
      <category>티스토리스킨</category>
      <category>티스토리플러그인</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1352</guid>
      <comments>https://romantech.net/1352#entry1352comment</comments>
      <pubDate>Tue, 7 Apr 2026 21:00:45 +0900</pubDate>
    </item>
    <item>
      <title>티스토리 블로그 본문에 앵커(Anchor) 링크 추가하기</title>
      <link>https://romantech.net/1350</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;앵커 링크(Anchor Link)는 페이지 안에서 특정 위치로 바로 이동할 수 있게 해주는 기능이다. MDN, GitHub, 기술 블로그 등 문서 중심의 웹사이트는 제목 태그(heading)에 앵커 링크를 적용하여 사용자가 원하는 섹션을 빠르게 탐색할 수 있도록 지원한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mdn-anchor.gif&quot; data-origin-width=&quot;1564&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ELH1r/dJMcach93cU/xkatSwgNUwiyt4Gh09kGb1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ELH1r/dJMcach93cU/xkatSwgNUwiyt4Gh09kGb1/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ELH1r/dJMcach93cU/xkatSwgNUwiyt4Gh09kGb1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/ELH1r/dJMcach93cU/xkatSwgNUwiyt4Gh09kGb1/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1564&quot; height=&quot;1080&quot; data-filename=&quot;mdn-anchor.gif&quot; data-origin-width=&quot;1564&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앵커 링크를 클릭해서 특정 섹션으로 이동할 때마다 주소창 URL도 &lt;code&gt;https://...#섹션&lt;/code&gt;으로 변경된다. &lt;code&gt;#섹션&lt;/code&gt;은 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/URL/hash&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;해시(hash)&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;아쉽게도 티스토리는 자체적인 앵커 링크를 제공하지 않기 때문에 자바스크립트로 직접 구현해야 한다. 아래에서 소개할 앵커 링크 추가 스크립트는 개인적으로 사용하려고 만들었지만, jsDelivr 같은 CDN으로 배포하면 다른 스킨 사용자도 쉽게 활용할 수 있지 않을까 싶어서 플러그인 형태로 정리해 봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;적용 방법&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;티스토리 스킨 편집 &amp;gt; HTML 편집 화면에서 &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt; 태그 바로 위에 아래 코드를 삽입한다.&lt;/p&gt;
&lt;pre id=&quot;code_1774173884920&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- Heading-anchor --&amp;gt;
&amp;lt;script defer src=&quot;https://cdn.jsdelivr.net/gh/romantech/tistory-plugins@latest/dist/heading-anchor/index.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 스크립트는 기본적으로 &lt;code&gt;H2&lt;/code&gt;~&lt;code&gt;H4&lt;/code&gt; 제목 태그를 대상으로 앵커 링크를 생성한다. &lt;code&gt;H1&lt;/code&gt; 태그는 포스팅 상단 제목에 사용하므로 제외했다. 본문 제목에 마우스 커서를 올리면 우측에 &lt;code&gt;#&lt;/code&gt; 기호가 나타나고, 제목 혹은 &lt;code&gt;#&lt;/code&gt; 기호를 클릭하면 해당 위치로 부드럽게 스크롤된다. 전반적인 구조와 동작 방식은 MDN 앵커 링크와 유사하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;romantech-anchor.gif&quot; data-origin-width=&quot;1564&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blhKrA/dJMcajnYkMa/PkYO5mZOCPqcKNgcfBJHNK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blhKrA/dJMcajnYkMa/PkYO5mZOCPqcKNgcfBJHNK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blhKrA/dJMcajnYkMa/PkYO5mZOCPqcKNgcfBJHNK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/blhKrA/dJMcajnYkMa/PkYO5mZOCPqcKNgcfBJHNK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1564&quot; height=&quot;1080&quot; data-filename=&quot;romantech-anchor.gif&quot; data-origin-width=&quot;1564&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;작동 방식&lt;/h2&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;작동 방식은 크게 보면 그리 복잡하지 않다. 먼저 본문에 포함된 모든 제목을 찾은 뒤 고유한 해시를 생성한다. 생성된 앵커 링크(제목)를 클릭하거나 해시가 포함된 주소로 접속했을 땐 해당 위치로 자연스럽게 이동하도록 처리한다(&lt;code&gt;scroll-behavior: smooth&lt;/code&gt; 적용).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;본문 영역에서 &lt;code&gt;H2&lt;/code&gt;~&lt;code&gt;H4&lt;/code&gt; 제목 태그를 탐색한다.&lt;/li&gt;
&lt;li&gt;제목 텍스트를 기준으로 &lt;code&gt;id&lt;/code&gt;를 생성하고, 중복 제목은 번호를 붙여 해시가 겹치지 않도록 한다.&lt;/li&gt;
&lt;li&gt;제목 전체를 앵커 링크로 감싸고, 마우스를 올렸을 때 표시할 &lt;code&gt;#&lt;/code&gt; 마커를 추가한다.&lt;/li&gt;
&lt;li&gt;제목을 클릭하면 URL에 &lt;code&gt;#섹션&lt;/code&gt; 해시를 반영하고, 해당 위치로 부드럽게 스크롤한다.&lt;/li&gt;
&lt;li&gt;해시가 포함된 주소로 처음 접속했을 때도 같은 방식으로 동작한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  제목 텍스트 전체 영역에 링크를 적용했다면 앵커 링크가 생성되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설정 옵션&lt;/h2&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;스킨마다 헤더 높이와 본문 구조가 조금씩 다를 수 있으므로, 아래 옵션을 통해 동작 범위를 조정할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;headingAnchor.levels&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;설명: 앵커 링크를 적용할 제목 태그 범위.&lt;/li&gt;
&lt;li&gt;기본값: &lt;code&gt;[2, 3, 4]&lt;/code&gt; (H2~H4)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;headingAnchor.headerOffset&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;설명: 스크롤 위치 보정값.&lt;/li&gt;
&lt;li&gt;상단 고정 헤더가 본문 제목을 가리지 않도록 여백을 추가할 수 있다.&lt;/li&gt;
&lt;li&gt;기본값: &lt;code&gt;84&lt;/code&gt; (화면 상단부터 제목까지의 여백)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;articleSelectors&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;설명: 본문 영역 셀렉터 지정.&lt;/li&gt;
&lt;li&gt;플러그인이 본문 영역을 찾지 못할 경우 직접 지정할 수 있다.&lt;/li&gt;
&lt;li&gt;기본값: &lt;code&gt;[&quot;#article&quot;, &quot;.article-view&quot;, &quot;.post-content&quot;, ...]&lt;/code&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;code&gt;headerOffset&lt;/code&gt;은 실제 헤더 높이와 똑같이 맞추기보다, 상단 여백을 고려해 더 크게 설정하는 게 좋다. 예를 들어 헤더 높이가 &lt;code&gt;64px&lt;/code&gt;이라면 &lt;code&gt;16px&lt;/code&gt; 정도 여유를 더해 &lt;code&gt;80&lt;/code&gt; 정도로 설정한 뒤, 스킨에 맞게 조금씩 조정하는 방식을 추천한다.&lt;/p&gt;
&lt;pre id=&quot;code_1774688502777&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
window.RPPlugins = {
  articleSelectors: [&quot;.my-custom-article&quot;], // 본문 영역 셀렉터 직접 지정
  headingAnchor: {
    levels: [2, 3, 4, 5], // H2~H5 제목에 적용
    headerOffset: 80 // 헤더 높이 64px + 여유값 16px
  }
};
&amp;lt;/script&amp;gt;

&amp;lt;script defer src=&quot;https://cdn.jsdelivr.net/gh/romantech/tistory-plugins@latest/dist/heading-anchor/index.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⚠️ 설정 옵션 코드는 플러그인 스크립트보다 상단에 위치해야 정상적으로 적용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기타 플러그인&lt;/h2&gt;
&lt;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;앵커 링크 외에도 인라인 코드, LaTeX(KaTeX) 렌더링 등 스크립트 한 줄만 추가하면 바로 적용할 수 있는 다른 플러그인도 함께 만들었다. 전체 코드와 더 자세한 설명은 &lt;a href=&quot;https://github.com/romantech/tistory-plugins&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;GitHub 저장소&lt;/a&gt;에서 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 31.2791%;&quot;&gt;&lt;b&gt;플러그인&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 68.7209%;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 31.2791%;&quot;&gt;&lt;a href=&quot;https://github.com/romantech/tistory-plugins/blob/main/src/plugins/inline-code&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;inline-code&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 68.7209%;&quot;&gt;벡틱(&lt;code&gt;`&lt;/code&gt;)으로 감싼 인라인 텍스트를 &lt;code&gt;&amp;lt;code&amp;gt;&lt;/code&gt;로 변환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 31.2791%;&quot;&gt;&lt;a href=&quot;https://github.com/romantech/tistory-plugins/blob/main/src/plugins/katex&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;katex&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 68.7209%;&quot;&gt;텍스트 내 수학 수식을 KaTeX로 렌더링&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 31.2791%;&quot;&gt;&lt;a href=&quot;https://github.com/romantech/tistory-plugins/blob/main/src/plugins/copy-code&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;copy-code&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 68.7209%;&quot;&gt;코드 블록 우측 상단에 복사 버튼 추가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 31.2791%;&quot;&gt;&lt;a href=&quot;https://github.com/romantech/tistory-plugins/blob/main/src/plugins/focus-guard&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;focus-guard&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 68.7209%;&quot;&gt;사이드바 토글 과정에서 발생하는 &lt;code&gt;aria-hidden&lt;/code&gt; 포커스 경고 완화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 31.2791%;&quot;&gt;&lt;a href=&quot;https://romantech.net/1352&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;toc&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 68.7209%;&quot;&gt;자동 목차(TOC) 추가&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>⌚️ Productivity</category>
      <category>AnchorLink</category>
      <category>JavaScript</category>
      <category>블로그꾸미기</category>
      <category>앵커링크</category>
      <category>자동스크롤</category>
      <category>자바스크립트</category>
      <category>티스토리</category>
      <category>티스토리 스킨</category>
      <category>티스토리 플러그인</category>
      <category>플러그인</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1350</guid>
      <comments>https://romantech.net/1350#entry1350comment</comments>
      <pubDate>Sat, 28 Mar 2026 21:28:34 +0900</pubDate>
    </item>
    <item>
      <title>[크롬 확장] 워터마크 제거&amp;middot;모델 고정 등 Gemini 더 편하게 쓰기 - Voyager</title>
      <link>https://romantech.net/1349</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;요즘은 ChatGPT 만큼 구글 제미나이(Gemini)를 메인으로 활용하는 사람들이 많아진 것 같다. 얼마 전 제미나이 웹 버전의 아쉬운 부분을 보완해 주는 &lt;a href=&quot;https://chromewebstore.google.com/detail/Gemini%20Voyager/kjdpnimcnfinmilocccippmododhceol&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Gemini Voyager&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;특히 &lt;b&gt;나노바나나(NanoBanana) 워터마크 제거 기능&lt;/b&gt;이 정말 유용하다. 이 밖에도 대화 타임라인, 폴더 관리, 프롬프트 라이브러리 같은 다양한 편의 기능을 제공한다. 사용하다 보면 이게 원래 기능인지, 확장 프로그램 기능인지 헷갈릴 정도로 제미나이 기본 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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;다운로드&lt;/h2&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a title=&quot;Voyager 크롬 웹 스토어&quot; href=&quot;https://chromewebstore.google.com/detail/iifacdnjakkhjjiengaffnegbndgingi?utm_source=item-share-cb&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;크롬 스토어&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a title=&quot;Voyager 공식 홈페이지&quot; href=&quot;https://voyager.nagi.fun/ko/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;공식 홈페이지&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주요 기능&lt;/h2&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;타임라인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우측 타임라인 막대를 이용해 이전 대화로 이동할 수 있는 기능. 질문/답변이 생성될 때마다 원 모양의 노드가 추가되며, 클릭하면 해당 대화 위치로 스크롤된다. &lt;code&gt;j&lt;/code&gt;, &lt;code&gt;k&lt;/code&gt; 키보드 단축키로 노드 간 이동도 가능하다. 스크롤바에 마우스 커서를 올리면 왼편에 작은 아이콘이 나타나는데, 클릭하면 전체 질문 목록(TOC) 팝업이 열린다. 여기서 질문을 검색하거나 클릭해서 바로 이동할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yyRnG/dJMcacCgiqD/RgjeVAlpNDvLBUcFootoP0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yyRnG/dJMcacCgiqD/RgjeVAlpNDvLBUcFootoP0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yyRnG/dJMcacCgiqD/RgjeVAlpNDvLBUcFootoP0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/yyRnG/dJMcacCgiqD/RgjeVAlpNDvLBUcFootoP0/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;타임라인 대화 이동&quot; loading=&quot;lazy&quot; width=&quot;1020&quot; height=&quot;720&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;720&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;  Voyager 설정 &amp;gt; 외부 컨테이너 숨기기에 체크하면 스크롤 막대의 배경색을 투명으로 바꿀 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1574&quot; data-origin-height=&quot;971&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qCui5/dJMcaa5vBqD/mhFvZVhjlE2TqKESoBARw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qCui5/dJMcaa5vBqD/mhFvZVhjlE2TqKESoBARw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qCui5/dJMcaa5vBqD/mhFvZVhjlE2TqKESoBARw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqCui5%2FdJMcaa5vBqD%2FmhFvZVhjlE2TqKESoBARw0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;860&quot; height=&quot;531&quot; data-origin-width=&quot;1574&quot; data-origin-height=&quot;971&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2190&quot; data-origin-height=&quot;1195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9pnPB/dJMcah4Dxp0/hPJxCVFjqA2DQwoz5kgV81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9pnPB/dJMcah4Dxp0/hPJxCVFjqA2DQwoz5kgV81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9pnPB/dJMcah4Dxp0/hPJxCVFjqA2DQwoz5kgV81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9pnPB%2FdJMcah4Dxp0%2FhPJxCVFjqA2DQwoz5kgV81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;2190&quot; height=&quot;1195&quot; data-origin-width=&quot;2190&quot; data-origin-height=&quot;1195&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;나노바나나 워터마크 제거  &lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인적으로 가장 마음에 드는 기능이다. Voyager 설정 &amp;gt; NanoBanana 워터마크 제거 옵션에 체크하면, 나노바나나로 생성된 이미지를 다운로드할 때 워터마크를 자동으로 제거해 준다. 워터마크를 제외한 나머지 영역은 원본과 동일하게 유지된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2324&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bs1nLQ/dJMcahp2fkS/CZIzr6JHtqjwS5oLkGffKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bs1nLQ/dJMcahp2fkS/CZIzr6JHtqjwS5oLkGffKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bs1nLQ/dJMcahp2fkS/CZIzr6JHtqjwS5oLkGffKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbs1nLQ%2FdJMcahp2fkS%2FCZIzr6JHtqjwS5oLkGffKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;2324&quot; height=&quot;1536&quot; data-origin-width=&quot;2324&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;h3 data-ke-size=&quot;size23&quot;&gt;사이드바 자동 숨기기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마우스 커서를 제미나이 창 왼쪽 가장자리로 가져가면 사이드바가 나타나고, 영역을 벗어나면 자동으로 접히는 기능. 덕분에 왼쪽 상단 사이드바 아이콘을 매번 클릭할 필요가 없어진다. Voyager 설정 &amp;gt; 사이드바 자동 숨김 옵션에 체크하면 활성화된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGal6K/dJMb99ZRhfl/2xJNlqKKJ8KxTnKHp89ZSk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGal6K/dJMb99ZRhfl/2xJNlqKKJ8KxTnKHp89ZSk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGal6K/dJMb99ZRhfl/2xJNlqKKJ8KxTnKHp89ZSk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/cGal6K/dJMb99ZRhfl/2xJNlqKKJ8KxTnKHp89ZSk/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;사이드바 자동 숨기기&quot; loading=&quot;lazy&quot; width=&quot;1044&quot; height=&quot;720&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 모델 고정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제미나이는 새 대화를 시작할 때 기본적으로 '빠른 모델'이 선택된다. Voyager를 통해 특정 모델을 기본값으로 설정할 수 있다. 모델 선택 팝업 &amp;gt; 별표 아이콘을 클릭해서 원하는 모델로 고정해 보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzCsD0/dJMcaaxGmka/vimRNBaH2ecfvf33ounzH1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzCsD0/dJMcaaxGmka/vimRNBaH2ecfvf33ounzH1/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzCsD0/dJMcaaxGmka/vimRNBaH2ecfvf33ounzH1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bzCsD0/dJMcaaxGmka/vimRNBaH2ecfvf33ounzH1/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;기본 모델 고정&quot; loading=&quot;lazy&quot; width=&quot;860&quot; height=&quot;627&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;입력창 접기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력창에 아무것도 입력하지 않은 상태에서 바깥 영역을 클릭하는 순간(포커스 해제), 입력창을 자동으로 숨겨주는 기능. 덕분에 화면을 더 넓게 활용할 수 있다. 숨겨진 입력창은 다시 클릭하거나 &lt;code&gt;Cmd(Ctrl&lt;/code&gt;) + &lt;code&gt;I&lt;/code&gt; 단축키로 표시할 수 있다. Voyager 설정 &amp;gt; 입력창 접기 활성화 옵션에 체크하면 이 기능을 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvjuYK/dJMcaaR08Tu/KLuI1b5T2kSWkHhPnfkx4K/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvjuYK/dJMcaaR08Tu/KLuI1b5T2kSWkHhPnfkx4K/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvjuYK/dJMcaaR08Tu/KLuI1b5T2kSWkHhPnfkx4K/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/cvjuYK/dJMcaaR08Tu/KLuI1b5T2kSWkHhPnfkx4K/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;입력창 접기&quot; loading=&quot;lazy&quot; width=&quot;984&quot; height=&quot;720&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자동 스크롤 방지&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gemini가 답변을 작성 중일 땐 화면 가장 아래로 강제 스크롤된다. 이 기능을 켜면 강제 스크롤을 방지해서 답변 생성 도중에도 이전 대화 내용을 훑어볼 수 있다. 은근히 유용한 꿀 기능이다  . Voyager 설정 &amp;gt; 자동 스크롤 방지 옵션에 체크하면 활성화된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;대화 내보내기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왼쪽 상단 Gemini 로고 &amp;gt; 내보내기 버튼을 클릭하면 원하는 포맷으로 대화 내용을 저장할 수 있다. 마크다운(Markdown)으로 저장하면 노션(Notion)이나 옵시디언(Obsidian)에 그대로 붙여넣을 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2268&quot; data-origin-height=&quot;1550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUry4v/dJMcafeJy7x/R0iWowdQStvX8GkEBDDRA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUry4v/dJMcafeJy7x/R0iWowdQStvX8GkEBDDRA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUry4v/dJMcafeJy7x/R0iWowdQStvX8GkEBDDRA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUry4v%2FdJMcafeJy7x%2FR0iWowdQStvX8GkEBDDRA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;2268&quot; height=&quot;1550&quot; data-origin-width=&quot;2268&quot; data-origin-height=&quot;1550&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;프롬프트 라이브러리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자주 사용하는 프롬프트를 저장해 두고 필요 시 빠르게 불러올 수 있는 기능. 각 프롬프트에 1개 이상의 태그를 지정할 수 있다. 프롬프트 목록은 초록색 플로팅 아이콘을 클릭하면 표시되고, 아이콘을 드래그해서 원하는 위치로 이동할 수도 있다. 프롬프트 라이브러리 기능이 필요 없다면 Voyager 설정 &amp;gt; 프롬프트 관리자 숨기기 옵션에 체크해서 플로팅 아이콘을 감출 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2268&quot; data-origin-height=&quot;1550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUDwXa/dJMb99ZSAnm/5XRJ2mkZeXl5BUKEI1P5b0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUDwXa/dJMb99ZSAnm/5XRJ2mkZeXl5BUKEI1P5b0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUDwXa/dJMb99ZSAnm/5XRJ2mkZeXl5BUKEI1P5b0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUDwXa%2FdJMb99ZSAnm%2F5XRJ2mkZeXl5BUKEI1P5b0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;2268&quot; height=&quot;1550&quot; data-origin-width=&quot;2268&quot; data-origin-height=&quot;1550&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;폴더 기능&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대화를 폴더별로 정리해 둘 수 있는 기능. 계층 구조를 지원하므로 하위 폴더를 생성할 수 있다. 각 폴더는 고정하거나 즐겨찾기로 표시할 수 있고, 색상도 변경할 수 있다. 필요하면 Google Drive 업로드를 통해 폴더 구조와 프롬프트를 동기화할 수도 있다. 드래그 앤 드롭으로 특정 대화를 폴더에 추가할 수 있고, 대화를 길게 눌러 여러 개를 선택한 뒤 한 번에 옮기는 것도 가능하다. 폴더 기능을 사용하지 않는다면 Voyager 설정에서 비활성화할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2268&quot; data-origin-height=&quot;1550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyCT23/dJMcafTi62d/WfyGRgUilpkHVZo3pYOERK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyCT23/dJMcafTi62d/WfyGRgUilpkHVZo3pYOERK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyCT23/dJMcafTi62d/WfyGRgUilpkHVZo3pYOERK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyCT23%2FdJMcafTi62d%2FWfyGRgUilpkHVZo3pYOERK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;2268&quot; height=&quot;1550&quot; data-origin-width=&quot;2268&quot; data-origin-height=&quot;1550&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;middot;대화 너비 조정, 인용 답장, 대화 일괄 삭제, 최근 항목&amp;middot;Gem 숨기기, 탭 제목 동기화 등 다양한 편의 기능을 제공하니 취향에 맞게 직접 설정해 보자. &lt;a href=&quot;https://github.com/Nagi-ovo/gemini-voyager&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;오픈소스&lt;/a&gt;(GPLv3) 프로젝트인 만큼 기능 개선/추가 속도도 매우 빠른 편이다.&lt;/p&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://voyager.nagi.fun/ko/guide/getting-started.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;공식 가이드 문서&lt;/a&gt;는 한글로도 제공된다. 특정 기능 사용법을 잘 모르겠으면 공식 문서를 확인해 보자.&lt;/p&gt;</description>
      <category>⌚️ Productivity</category>
      <category>ai도구</category>
      <category>gemini</category>
      <category>Gemini팁</category>
      <category>Voyager</category>
      <category>나노바나나</category>
      <category>생산성</category>
      <category>제미나이</category>
      <category>제미나이팁</category>
      <category>크롬부가기능</category>
      <category>크롬확장프로그램</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1349</guid>
      <comments>https://romantech.net/1349#entry1349comment</comments>
      <pubDate>Sat, 7 Mar 2026 21:57:29 +0900</pubDate>
    </item>
    <item>
      <title>AI가 사람을 호출하기 시작했다</title>
      <link>https://romantech.net/1348</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1480&quot; data-origin-height=&quot;833&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQLyvP/dJMcagxQW5P/9VYXM0SvixZvfkyl1rubBK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQLyvP/dJMcagxQW5P/9VYXM0SvixZvfkyl1rubBK/img.webp&quot; data-alt=&quot;David Paul Morris ❘ Bloomberg ❘ Getty Images&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQLyvP/dJMcagxQW5P/9VYXM0SvixZvfkyl1rubBK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQLyvP%2FdJMcagxQW5P%2F9VYXM0SvixZvfkyl1rubBK%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;1480&quot; height=&quot;833&quot; data-origin-width=&quot;1480&quot; data-origin-height=&quot;833&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;David Paul Morris ❘ Bloomberg ❘ Getty Images&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;최근 미국에선 자율주행 관련 뉴스 하나가 화제다. 대표적인 자율주행 기업 웨이모(Waymo)는 이미 미국 여러 도시에서 로보택시(무인 택시) 서비스를 운영 중이다.&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;실제로 한 배달 기사가 받은 주문 내용은 이랬다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;기본요금 6.25달러&lt;/li&gt;
&lt;li&gt;1km 떨어진 곳으로 이동&lt;/li&gt;
&lt;li&gt;웨이모 택시를 찾아 차문 닫기&lt;/li&gt;
&lt;li&gt;완료 시 팁 5달러 추가 지급&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;a href=&quot;https://www.reddit.com/r/DoorDash_Dasher/comments/1r170zc/craziest_offer/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;레딧(Reddit)&lt;/a&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3546&quot; data-origin-height=&quot;2659&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pInLw/dJMcaioWbtd/el8sol2DrrGqmxdYRfyj3K/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pInLw/dJMcaioWbtd/el8sol2DrrGqmxdYRfyj3K/img.webp&quot; data-alt=&quot;실제 웨이모 주문 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pInLw/dJMcaioWbtd/el8sol2DrrGqmxdYRfyj3K/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpInLw%2FdJMcaioWbtd%2Fel8sol2DrrGqmxdYRfyj3K%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;3546&quot; height=&quot;2659&quot; data-origin-width=&quot;3546&quot; data-origin-height=&quot;2659&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;b&gt;'프로그램이 인간 노동력을 호출하여 자동화 프로세스를 완성했다'&lt;/b&gt;는 데 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 프로그램은 대체로 디지털 시스템 안에서만 작동했다. 반면, 이번 사례에선 시스템이 스스로 해결하지 못한 물리적 병목 구간이 발생하자 현실 세계의 사람을 직접 호출하여 그 빈틈을 메웠다. 자동화가 멈춘 지점에서 인간이 프로세스의 일부로 편입된 것이다.&lt;/p&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;인간 노동력이 마치 API처럼 호출 가능한 자원&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;본격적인 인공지능(AI)과 로봇 시대가 열리면, 배달 기사 같은 플랫폼 노동은 단순히 '음식 전달'을 넘어, 원격 지시를 받아 현장에서 실행하고 검증하는 &lt;b&gt;인간 노드&lt;/b&gt;로 확장될 수 있다. 즉, '기계-인간'으로 이어지는 자동화 프로세스의 핵심 고리가 되는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 모델이 인간 노동력과 결합하는 순간, AI 활용 범위는 기하급수적으로 확장된다. 지금의 AI 에이전트가 화면 속에서만 작동한다면, &lt;b&gt;미래의 AI는 현실 세계의 노동력을 배치하고 조율하는 '인력 오케스트레이터'로 발전할 가능성&lt;/b&gt;이 크다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;오케스트레이터(Orchestrator): 오케스트라의 지휘자처럼 여러 작업이나 인력을 적재적소에 배치하고 조화롭게 이끄는 시스템.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;집 인테리어 공사를 예로 들어 보자. AI가 전체 디자인 시안을 만들고, 세부 작업을 쪼개 온라인 플랫폼에 발주한다. 전기&amp;middot;배관 작업자가 호출을 받아 기초 공사를 마치면, 감리사가 현장을 확인하고, AI가 비용을 정산한 뒤 다시 미장&amp;middot;목공 작업자를 부른다.&lt;/p&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;우리 집 인테리어 해줘&quot; 같은 프롬프트 한 줄만으로 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가 중개하는 플랫폼에서 일거리를 찾고, 다양한 작업 지시를 수행한 뒤 보상을 받는 구조가 만들어진다. 인간 노동력이 AI 시스템에 편입되는 순간, AI는 단순한 '기술 혁명'을 넘어 사회와 경제 구조를 AI 중심으로 완전히 재구성할 수도 있다.&lt;/p&gt;</description>
      <category>✏️ Topics</category>
      <category>AI</category>
      <category>ai에이전트</category>
      <category>긱이코노미</category>
      <category>로보택시</category>
      <category>에이전트</category>
      <category>워크플로우</category>
      <category>웨이모</category>
      <category>인공지능</category>
      <category>자동화</category>
      <category>플랫폼노동</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1348</guid>
      <comments>https://romantech.net/1348#entry1348comment</comments>
      <pubDate>Thu, 5 Mar 2026 02:00:11 +0900</pubDate>
    </item>
    <item>
      <title>중국 직구 아수스 공유기 TUF BE6500 한글 적용 방법</title>
      <link>https://romantech.net/1347</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tuf6500.png&quot; data-origin-width=&quot;3367&quot; data-origin-height=&quot;2525&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wgCvb/dJMcafr9gJL/zIEk42HuhA2WyOUKny8SUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wgCvb/dJMcafr9gJL/zIEk42HuhA2WyOUKny8SUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wgCvb/dJMcafr9gJL/zIEk42HuhA2WyOUKny8SUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwgCvb%2FdJMcafr9gJL%2FzIEk42HuhA2WyOUKny8SUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3367&quot; height=&quot;2525&quot; data-filename=&quot;tuf6500.png&quot; data-origin-width=&quot;3367&quot; data-origin-height=&quot;2525&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;그동안 AC68U 펌웨어를 올린 아수스 AC1900 공유기를 중고로 영입해서 잘 쓰고 있었는데, &lt;a title=&quot;Asus End-of-life product list&quot; href=&quot;https://www.asus.com/event/network/eol-product/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;2025년부터 공식 지원이 종료&lt;/a&gt;됐다. 출시된 지 10년이 넘은 노장이라 그런지 기가 인터넷을 쓰는데도 최대 500Mbps 정도밖에 안 나온다. 슬슬 바꿀 때가 된 것 같아서 이런저런 제품을 알아보다가 중국에서 판매하는 &lt;a title=&quot;다나와 판매 페이지&quot; href=&quot;https://prod.danawa.com/info/?pcode=68789063&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;ASUS TUF Gaming BE6500&lt;/a&gt;(이하 TUF 6500) 모델이 가성비가 좋아 보여서 냅다 구매해 버렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아쉽게도 중국 내수용으로 판매되는 TUF 6500은 관리자 페이지에서 중국어/영어만 선택할 수 있다. 공유기에 SSH로 접속해서 아래 명령어를 입력하면 다국어를 선택할 수 있지만, 재부팅하는 순간 다시 중국어로 되돌아온다.&lt;/p&gt;
&lt;pre id=&quot;code_1772015886779&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 라우터의 지역/언어 코드(territory)를 한국(KR/01)으로 설정
nvram set territory_code=KR/01

# NVRAM 설정 변경사항을 플래시에 저장
nvram commit&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;재부팅해도 원복되지 않게 하려면, Factory 파티션(기기 고유 메타데이터/캘리브레이션 포함)에 저장된 지역/언어 코드 값을 직접 수정하면 된다. 다만, Factory 영역을 잘못 건드리면 Wi‑Fi가 먹통이 될 수도 있으니 실수 없는 꼼꼼한 진행이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;메타데이터(Metadata): 공유기 모델/시리얼 번호/지역 코드 등 기기 설정&amp;middot;식별에 필요한 기본 정보&lt;/li&gt;
&lt;li&gt;캘리브레이션(Calibration): WiFi 출력/주파수/안테나 등 규격에 맞춰 하드웨어가 동작할 수 있도록 공장에서 맞춰둔 보정값&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;적용 가능한 공유기&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;미디어텍 칩셋: TX-AX6000, TUF-AX4200Q, RT-AX57M&lt;/li&gt;
&lt;li&gt;퀄컴 칩셋: TUF-BE6500&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;적용 방법&lt;/h2&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;⓪ 공유기 SSH 접속 활성화: 공유기 관리자 페이지 &amp;gt; 좌측 [관리] 메뉴 &amp;gt; [시스템] 탭 &amp;gt; [Enable SSH] 체크 후 적용&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1496&quot; data-origin-height=&quot;619&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IBJ3U/dJMcabwvOgW/kHBpdJoAxNAws2qkp6Eo0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IBJ3U/dJMcabwvOgW/kHBpdJoAxNAws2qkp6Eo0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IBJ3U/dJMcabwvOgW/kHBpdJoAxNAws2qkp6Eo0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIBJ3U%2FdJMcabwvOgW%2FkHBpdJoAxNAws2qkp6Eo0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1496&quot; height=&quot;619&quot; data-origin-width=&quot;1496&quot; data-origin-height=&quot;619&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;① 공유기 SSH 접속&lt;/p&gt;
&lt;pre id=&quot;code_1772184443435&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ssh &amp;lt;아이디&amp;gt;@&amp;lt;접속주소&amp;gt; -p &amp;lt;포트번호&amp;gt;
# 예) ssh user@192.168.50.1 -p 22&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_1772184565089&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# /jffs/temp 폴더 생성 후 이동
# jffs 폴더는 재부팅해도 초기화되지 않는다.
mkdir -p /jffs/temp &amp;amp;&amp;amp; cd /jffs/temp&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;code&gt;Factory&lt;/code&gt; 파티션 번호 확인. 모델/펌웨어에 따라 &lt;code&gt;mtd3&lt;/code&gt;가 아닐 수도 있다. 혹시 모르니 &lt;code&gt;Factory&lt;/code&gt; 라벨의 &lt;code&gt;mtd&lt;/code&gt; 번호를 기록해 둔다.&lt;/p&gt;
&lt;pre id=&quot;code_1772184593848&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat /proc/mtd
# ...
# mtd3: 0007c000 0001f000 &quot;Factory&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1480&quot; data-origin-height=&quot;473&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C99Jq/dJMcabccSIb/Epnn2ruKK1oRIxxKgC6Tqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C99Jq/dJMcabccSIb/Epnn2ruKK1oRIxxKgC6Tqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C99Jq/dJMcabccSIb/Epnn2ruKK1oRIxxKgC6Tqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC99Jq%2FdJMcabccSIb%2FEpnn2ruKK1oRIxxKgC6Tqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1480&quot; height=&quot;473&quot; data-origin-width=&quot;1480&quot; data-origin-height=&quot;473&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;code&gt;mtd&lt;/code&gt; 뒤에 숫자는 위에서 확인한 &lt;code&gt;mtd&lt;/code&gt; 번호를 입력한다.&lt;/p&gt;
&lt;pre id=&quot;code_1772184611122&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# /dev/mtd3 (플래시 메모리의 Factory 파티션) 내용을 파일로 덤프(저장) - 백업용
# if= 입력 파일 / of= 출력 파일
dd if=/dev/mtd3 of=/jffs/temp/Factory.bin

# Factory.bin 파일을 복사해서 작업용 파일 work.bin 생성
cp /jffs/temp/Factory.bin /jffs/temp/work.bin

# 잘 생성됐는지 파일 목록 확인
ls -l
# -rw-rw-rw- ... Factory.bin
# -rw-rw-rw- ... work.bin&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  덤프는 기기 메모리에 있는 데이터를 원본 그대로 복사해서 별도 파일로 저장하는 것을 의미한다.&lt;/p&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_1772184640393&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 작업용 파일 work.bin 안에 중국어 지역 코드 &quot;CN/01&quot; 문자열 있는지 확인
# strings는 바이너리에서 출력 가능한 문자 시퀀스(문자들이 연속해서 붙여 있는 부분)를 뽑아준다.
strings work.bin | grep &quot;CN/01&quot;
# CN/01&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_1772184658805&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# work.bin 파일에서 &quot;CN/01&quot; 문자열을 &quot;KR/01&quot;로 치환(s|찾을값|바꿀값|)
# -i: 결과를 표준출력으로 내보내지 않고, 원본 파일 직접 수정(in-place)
sed -i 's|CN/01|KR/01|' work.bin&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  바이너리 파일(&lt;code&gt;*.bin&lt;/code&gt;)은 문자열 치환 시 바이트 길이가 바뀌면 구조가 깨질 수 있다. 다만, 위 작업에선 찾을 값인 &lt;code&gt;CN/01&lt;/code&gt;과 바꿀 값 &lt;code&gt;KR/01&lt;/code&gt; 모두 5바이트(byte)이므로 비교적 안전한 편이다.&lt;/p&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글자당 1바이트를 차지한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⑦ 변경 내용 확인. 명령어 출력 결과가 &lt;code&gt;KR/01&lt;/code&gt;만 나온다면 성공.&lt;/p&gt;
&lt;pre id=&quot;code_1772184700723&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# -E: 확장 정규식(Extended Regular Expressions) 모드로 해석
# -E 옵션이 없으면 | 가 OR 연산자가 아닌 일반 문자로 취급될 수 있다
strings work.bin | grep -E &quot;CN/01|KR/01&quot;
# KR/01&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;⑧ Factory 파티션에 변경 사항 반영&lt;/p&gt;
&lt;pre id=&quot;code_1772184720280&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 수정한 work.bin 이미지를 Factory 파티션에 기록(덮어쓰기)
#  -i : input(입력 파일) 지정
#  -d : destination(대상 파티션/라벨) 지정
mtd-write -i /jffs/temp/work.bin -d Factory&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;code&gt;Factory&lt;/code&gt; 영역은 라우터 하드웨어 구동에 필요한 기기 고유의 메타데이터와 캘리브레이션 데이터가 저장되어 있다. 장치의 무선(RF) 주파수 미세조정 값, Wi-Fi MAC 주소, 하드웨어 보드 ID 등이 포함되어 있다. 이 데이터가 손상되면 무선 통신 기능 자체가 먹통이 될 수 있으므로 주의하자.&lt;/p&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_1772184741101&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 쓰기 완료 플러시 (파일 시스템 버퍼 내용을 플래시에 반영)
sync

# 재부팅
reboot&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&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;950&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m41hK/dJMcaiPT4c2/25KOtKAtMXvplDDwr2316K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m41hK/dJMcaiPT4c2/25KOtKAtMXvplDDwr2316K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m41hK/dJMcaiPT4c2/25KOtKAtMXvplDDwr2316K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm41hK%2FdJMcaiPT4c2%2F25KOtKAtMXvplDDwr2316K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;950&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;950&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Factory 복구&lt;/h2&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;작업 중 문제가 생겼다면 &lt;code&gt;/jffs/temp&lt;/code&gt; 폴더에 백업해 둔 &lt;code&gt;Factory.bin&lt;/code&gt; 파일로 복구할 수 있다. 아래 복구 명령어를 입력하면 공유기가 재부팅되고 원상태로 되돌아온다.&lt;/p&gt;
&lt;pre id=&quot;code_1772184797868&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mtd-write -i /jffs/temp/Factory.bin -d Factory
sync
reboot&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고 내용&lt;/h2&gt;
&lt;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;&lt;a href=&quot;https://blog.naver.com/ststeel/223385122408&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;ASUS 중국 직구 공유기 한글 적용하기 (feat.TX-AX6000 영구 한글화) | 깜깜&lt;/a&gt;&lt;/p&gt;</description>
      <category>⌚️ Productivity</category>
      <category>ASUS</category>
      <category>ASUS Router</category>
      <category>ssh</category>
      <category>TUF6500</category>
      <category>TUFGamingBE6500</category>
      <category>아수스 공유기</category>
      <category>아수스 공유기 한글 변경</category>
      <category>아수스 공유기 한글화</category>
      <category>중국직구</category>
      <category>지역코드변경</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1347</guid>
      <comments>https://romantech.net/1347#entry1347comment</comments>
      <pubDate>Fri, 27 Feb 2026 19:07:29 +0900</pubDate>
    </item>
    <item>
      <title>[시놀로지 나스] Plex 재생 품질/연결 설정 가이드 (트랜스코딩 최소화)</title>
      <link>https://romantech.net/1346</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;시놀로지 나스(Synology NAS) &lt;a title=&quot;DSM 7.2.2 릴리즈 노트&quot; href=&quot;https://www.synology.com/ko-kr/releaseNote/DSM#:~:text=Video%20Station%20is%20not%20available%20on%20DSM%207.2.2&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;DSM 7.2.2 버전부터 Video Station&lt;/a&gt;을 더 이상 사용할 수 없게 됐다. 예상치 못한 소식에 살짝 당황했지만, 다행히 이전에 구매해 둔 &lt;a href=&quot;https://www.plex.tv/ko/plans/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Plex Lifetime&lt;/a&gt; 라이선스가 있어서 바로 갈아탔다. 폴더명도 &lt;a title=&quot;Naming and Organizing Your TV Show Files&quot; href=&quot;https://support.plex.tv/articles/naming-and-organizing-your-tv-show-files/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Plex가 권장하는 형태&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;TV 시리즈 권장 구조 ▼&lt;/p&gt;
&lt;pre id=&quot;code_1771923111297&quot; class=&quot;plaintext&quot; data-ke-language=&quot;plaintext&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/TV Shows
  /Band of Brothers (2001)
    /Season 01
      Band of Brothers (2001) - S01E01 - Currahee.mkv&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;Plex는 웹, 데스크톱 애플리케이션, 모바일 앱 등을 모두 제공하지만 웹은 브라우저 디코더에 의존하기 때문에 MP4, H.264, AAC 등을 제외하면 대부분 트랜스코드(Transcode) 혹은 직접 스트림(Direct Stream)이 필요하다. 특히 브라우저에선 SMI 자막을 직접 처리할 수 없어서 자막 번인(Burn-in)*으로 인한 트랜스코드가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Plex for Mac/Windows는 자체 플레이어 엔진을 탑재하여 코덱/컨테이너 지원 폭이 훨씬 넓다. MKV, HEVC, DTS, TrueHD 등 다양한 코덱을 트랜스코드 없이 직접 재생(Direct Play)할 수 있다. SMI 자막도 영상 재인코딩 없이 텍스트로 띄울 수 있기 때문에 트랜스코드가 필요 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  용어 설명&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Direct Play(직접 재생): 변환 없이 그대로 재생. 서버 부하 거의 없음 (영상 전송만 하므로). 베스트  &lt;/li&gt;
&lt;li&gt;Direct Stream(직접 스트림): 컨테이너(MKV 등)만 바꿔서(remux) 재생. 코덱은 유지. 서버 CPU 부하 적음&lt;/li&gt;
&lt;li&gt;Transcode(트랜스코드): 비디오/오디오 코덱을 다시 인코딩하는 작업. 서버 CPU/GPU 부하 큼  &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;b&gt;결국 서버 부하를 줄이고 끊김 없는 재생을 원한다면 웹보단 전용 애플리케이션을 사용하는 것이 좋다.&lt;/b&gt; Plex 설정을 보면 다양한 옵션이 있는데, 직접 테스트한 결과를 바탕으로 추천 세팅을 소개하고자 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;재생 품질 설정&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Plex for Mac&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xyAtx/dJMcadOydIZ/f0Hkf8y3CKEWfCCXBMO401/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xyAtx/dJMcadOydIZ/f0Hkf8y3CKEWfCCXBMO401/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xyAtx/dJMcadOydIZ/f0Hkf8y3CKEWfCCXBMO401/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxyAtx%2FdJMcadOydIZ%2Ff0Hkf8y3CKEWfCCXBMO401%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;1392&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1392&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비디오 품질: &lt;code&gt;최대&lt;/code&gt;&lt;br /&gt;  4K 영상을 트랜스코딩하는 경우가 아니라면 대부분 무난하게 재생할 수 있다. 비디오 품질을 낮춰도 로컬 네트워크에선 조건에 부합하면 원본 품질로 재생된다.&lt;/li&gt;
&lt;li&gt;더 작은 비디오를 원본 품질로 재생: &lt;code&gt;체크&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;권장 설정 사용: &lt;code&gt;체크&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5BohI/dJMcabcaPDk/i6arrvJmR0nIpYR99IoSpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5BohI/dJMcabcaPDk/i6arrvJmR0nIpYR99IoSpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5BohI/dJMcabcaPDk/i6arrvJmR0nIpYR99IoSpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5BohI%2FdJMcabcaPDk%2Fi6arrvJmR0nIpYR99IoSpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;1376&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1376&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다중 채널 오디오 정규화: &lt;code&gt;체크해제&lt;/code&gt;&lt;br /&gt;  서라운드(5.1/7.1) 음성의 채널 볼륨을 자동으로 맞춰서 소리를 고르게 만드는 기능 (기본값 체크). 전체 볼륨이 낮아지면서 대사가 살짝 묻힐 수 있다. 대사 소리가 너무 작다고 느껴지면 꺼 두는 걸 추천한다.&lt;/li&gt;
&lt;li&gt;Video Playback Quality: &lt;code&gt;Maximum Quality&lt;/code&gt;&lt;br /&gt;  클라이언트(맥)에서 재생 중 이미지 프로세싱/후처리 강도(스케일링)를 조정하는 옵션. 높게 설정할수록 GPU/CPU 사용량이 증가한다. Apple Silicon 맥이라면 Maximum으로 설정해도 무방하다.&lt;/li&gt;
&lt;li&gt;하드웨어 디코딩 사용: &lt;code&gt;체크&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Plex Web&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1327&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beg5yN/dJMcah4yd51/O4lKpStcLYTQkXDEKRoFM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beg5yN/dJMcah4yd51/O4lKpStcLYTQkXDEKRoFM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beg5yN/dJMcah4yd51/O4lKpStcLYTQkXDEKRoFM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbeg5yN%2FdJMcah4yd51%2FO4lKpStcLYTQkXDEKRoFM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;1327&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1327&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;품질 자동 조정: &lt;code&gt;체크해제&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;비디오 품질: &lt;code&gt;최대&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;더 작은 비디오를 원본 품질로 재생: &lt;code&gt;체크&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;권장 설정 사용: &lt;code&gt;체크&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YRG0v/dJMcahjcMIV/korEFdDpLbNFfrOb4oWod1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YRG0v/dJMcahjcMIV/korEFdDpLbNFfrOb4oWod1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YRG0v/dJMcahjcMIV/korEFdDpLbNFfrOb4oWod1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYRG0v%2FdJMcahjcMIV%2FkorEFdDpLbNFfrOb4oWod1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;1274&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1274&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다중 채널 오디오 정규화: &lt;code&gt;체크해제&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;자막 번인: &lt;code&gt;자동&lt;/code&gt; (기본값)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Plex for iOS - Video &amp;amp; Audio&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1535&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cC1DsI/dJMcaaYDXxr/nuh061hLmXEcOAaDKtejz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cC1DsI/dJMcaaYDXxr/nuh061hLmXEcOAaDKtejz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cC1DsI/dJMcaaYDXxr/nuh061hLmXEcOAaDKtejz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcC1DsI%2FdJMcaaYDXxr%2Fnuh061hLmXEcOAaDKtejz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;1535&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1535&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Local Quality: &lt;code&gt;Maximum&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Wi-Fi Quality: &lt;code&gt;Maximum&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Cellular Quality: &lt;code&gt;1080p HD, 8Mbps&lt;/code&gt; (상황에 따라 조절)&lt;/li&gt;
&lt;li&gt;Allow Direct Play: &lt;code&gt;체크&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Allow Direct Stream: &lt;code&gt;체크&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;연결 설정&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 &amp;gt; 보안되지 않은 연결로 대체 허용: &lt;code&gt;서버와 동일한 네트워크에 있음&lt;/code&gt; (Plex Web/Mac 각각 설정). HTTPS 보안 연결을 실패했을 때, 클라이언트와 서버가 같은 네트워크에 있다고 판단되면 HTTP 폴백을 허용하는 옵션.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8Cjk7/dJMcadHNBUl/dCvmhkcTUXc2vXYMJZDvgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8Cjk7/dJMcadHNBUl/dCvmhkcTUXc2vXYMJZDvgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8Cjk7/dJMcadHNBUl/dCvmhkcTUXc2vXYMJZDvgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8Cjk7%2FdJMcadHNBUl%2FdCvmhkcTUXc2vXYMJZDvgk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;1392&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1392&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;gt; 보안 연결: &lt;code&gt;선호함&lt;/code&gt;(Preferred). 가능한 경우 HTTPS로 먼저 연결하고, HTTPS가 불가능하거나 앱이 지원하지 않으면 HTTP 연결도 허용하는 서버 정책. 로컬 네트워크에서 HTTP 연결을 허용하면서 외부 접속 시 보안을 유지하려는 경우 Preferred 설정을 권장한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20260213_021152.png&quot; data-origin-width=&quot;2204&quot; data-origin-height=&quot;1498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YtTSH/dJMcab4jXzo/JS2AHN8AUR5e3tktHmGSAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YtTSH/dJMcab4jXzo/JS2AHN8AUR5e3tktHmGSAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YtTSH/dJMcab4jXzo/JS2AHN8AUR5e3tktHmGSAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYtTSH%2FdJMcab4jXzo%2FJS2AHN8AUR5e3tktHmGSAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2204&quot; height=&quot;1498&quot; data-filename=&quot;20260213_021152.png&quot; data-origin-width=&quot;2204&quot; data-origin-height=&quot;1498&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;gt; 중간 전달 서버 활성: &lt;a title=&quot;포트 개방 없이 원격에서 SMB 접속하기&quot; href=&quot;https://romantech.net/1282&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Tailscale&lt;/a&gt; 사용 시 &lt;code&gt;체크해제&lt;/code&gt; (기본값 체크). 클라이언트가 Plex 서버에 직접 연결할 수 없을 때, Plex가 제공하는 중계(Relay) 서버로 우회 연결하는 기능. Tailscale 환경에선 가상 터널을 통해 서버와 클라이언트가 직접 통신하므로 이 기능이 필요하지 않다. 간헐적인 연결 불안정 때문에 릴레이 모드로 자동 전환될 경우 대역폭이 2Mbps로 제한되므로 비활성화하는 것이 좋다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20260213_112245.png&quot; data-origin-width=&quot;2138&quot; data-origin-height=&quot;1508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qby7B/dJMcaaEm1Tl/zsCeT0ZEvjG0qhpdhkFRY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qby7B/dJMcaaEm1Tl/zsCeT0ZEvjG0qhpdhkFRY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qby7B/dJMcaaEm1Tl/zsCeT0ZEvjG0qhpdhkFRY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqby7B%2FdJMcaaEm1Tl%2FzsCeT0ZEvjG0qhpdhkFRY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2138&quot; height=&quot;1508&quot; data-filename=&quot;20260213_112245.png&quot; data-origin-width=&quot;2138&quot; data-origin-height=&quot;1508&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;연결 테스트&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;영상: 1080p (HEVC Main 10)&lt;br /&gt;자막: SRT&lt;br /&gt;네트워크: 로컬 WiFi&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Plex for Mac&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비디오/오디오/자막 - 직접 재생(Direct Play)  &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20260213_013001.png&quot; data-origin-width=&quot;2204&quot; data-origin-height=&quot;1498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bb1pot/dJMcaca6BOE/tkbuyrEJOhlHdAuT3sSWR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bb1pot/dJMcaca6BOE/tkbuyrEJOhlHdAuT3sSWR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bb1pot/dJMcaca6BOE/tkbuyrEJOhlHdAuT3sSWR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbb1pot%2FdJMcaca6BOE%2FtkbuyrEJOhlHdAuT3sSWR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2204&quot; height=&quot;1498&quot; data-filename=&quot;20260213_013001.png&quot; data-origin-width=&quot;2204&quot; data-origin-height=&quot;1498&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Plex Web&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비디오 - 직접 스트림, 오디오/자막 - 트랜스코드(Transcode)  &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20260213_012212.png&quot; data-origin-width=&quot;2188&quot; data-origin-height=&quot;1420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKwZN8/dJMcaiI69bq/OJqQxXKaLqDOuqE2m6ulFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKwZN8/dJMcaiI69bq/OJqQxXKaLqDOuqE2m6ulFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKwZN8/dJMcaiI69bq/OJqQxXKaLqDOuqE2m6ulFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKwZN8%2FdJMcaiI69bq%2FOJqQxXKaLqDOuqE2m6ulFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2188&quot; height=&quot;1420&quot; data-filename=&quot;20260213_012212.png&quot; data-origin-width=&quot;2188&quot; data-origin-height=&quot;1420&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Plex for iOS&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비디오/오디오/자막 - 직접 재생(Direct Play)  &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20260213_013240.png&quot; data-origin-width=&quot;2204&quot; data-origin-height=&quot;1498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDMSlA/dJMcahcoCzi/OPHvjj2jOB274dtcTUa0x0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDMSlA/dJMcahcoCzi/OPHvjj2jOB274dtcTUa0x0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDMSlA/dJMcahcoCzi/OPHvjj2jOB274dtcTUa0x0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDMSlA%2FdJMcahcoCzi%2FOPHvjj2jOB274dtcTUa0x0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2204&quot; height=&quot;1498&quot; data-filename=&quot;20260213_013240.png&quot; data-origin-width=&quot;2204&quot; data-origin-height=&quot;1498&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;(번외) 원격 액세스 비활성화 (for Tailscale 사용자)&lt;/h2&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;Plex 계정 설정 &amp;gt; 원격 액세스에서 외부 접속을 활성화하면, 임의 포트가 자동으로 할당되고 &lt;code&gt;app.plex.tv&lt;/code&gt; 주소를 통해 로컬/원격 어디서든 접속할 수 있다. 참고로 Plex 내부 포트는 &lt;code&gt;32400&lt;/code&gt;을 기본으로 사용한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20250209_214147.png&quot; data-origin-width=&quot;2070&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgKXZj/dJMcagLlSXj/UHKtRtSMko6r86C2kmoskk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgKXZj/dJMcagLlSXj/UHKtRtSMko6r86C2kmoskk/img.png&quot; data-alt=&quot;15062 외부 포트가 자동으로 할당된 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgKXZj/dJMcagLlSXj/UHKtRtSMko6r86C2kmoskk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgKXZj%2FdJMcagLlSXj%2FUHKtRtSMko6r86C2kmoskk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2070&quot; height=&quot;748&quot; data-filename=&quot;20250209_214147.png&quot; data-origin-width=&quot;2070&quot; data-origin-height=&quot;748&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;15062 외부 포트가 자동으로 할당된 화면&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;보안을 위해 포트 개방을 원하지 않는다면 Plex의 원격 액세스를 끄고 Tailscale을 통해서 접속하면 된다. 만약 Tailscale 연결이 P2P(direct)로 잡히면 속도 저하는 거의 없는 편이다. 하지만 현재 네트워크가 UDP를 차단했거나 방화벽 때문에 DERP relay로 연결되면, 경유로 인한 지연 증가와 대역폭 제한으로 버퍼링이 발생할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① 원격 액세스 &amp;gt; 외부 접속 비활성화로 변경&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2010&quot; data-origin-height=&quot;734&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSt951/dJMcac9WWsl/wAFvxItc3lE7xcLk7ignU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSt951/dJMcac9WWsl/wAFvxItc3lE7xcLk7ignU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSt951/dJMcac9WWsl/wAFvxItc3lE7xcLk7ignU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSt951%2FdJMcac9WWsl%2FwAFvxItc3lE7xcLk7ignU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2010&quot; height=&quot;734&quot; data-origin-width=&quot;2010&quot; data-origin-height=&quot;734&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;gt; [사용자 서버 접속 URL] 필드에 Tailscale 나스 IP 주소 입력(예: 100.79.23.141). Tailscale은 나스와 클라이언트 사이의 트래픽을 종단 간 암호화하므로, HTTP로 접속해도 전송 구간은 안전하다.&lt;/p&gt;
&lt;pre id=&quot;code_1771930204209&quot; class=&quot;plaintext&quot; data-ke-language=&quot;plaintext&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;http://100.79.23.141:32400&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;gt; [LAN 네트워크] 필드에 Tailscale CGNAT* 대역을 입력해 두면 Tailscale로 접속한 기기를 내부 네트워크(로컬 LAN)로 인식한다. 그럼 원격 대역폭 제한을 피할 수 있고, 클라이언트가 원본 화질로 직접 재생할 여지가 커지기 때문에 불필요한 트랜스코드를 줄일 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1771930350424&quot; class=&quot;plaintext&quot; data-ke-language=&quot;plaintext&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;192.168.1.0/24,100.64.0.0/10&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tailscale 서브넷 라우터를 통해(Tailscale IP) Plex에 접속하는 경우, 현재 기기가 로컬 네트워크에 있더라도 Plex에선 원격 접속으로 표시될 수 있다. 따라서 &lt;code&gt;192.168.1.0/24&lt;/code&gt; 같은 LAN 대역도 로컬로 명시해 준다. LAN 대역은 아래 표를 참고해서 입력하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 37.4418%;&quot;&gt;&lt;b&gt;공유기 접속 주소 (예시)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 62.5582%;&quot;&gt;&lt;b&gt;LAN 대역&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 37.4418%;&quot;&gt;&lt;code&gt;http://192.168.1.1&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 62.5582%;&quot;&gt;&lt;code&gt;192.168.1.0/24&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 37.4418%;&quot;&gt;&lt;code&gt;http://192.168.0.1&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 62.5582%;&quot;&gt;&lt;code&gt;192.168.0.0/24&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 37.4418%;&quot;&gt;&lt;code&gt;http://10.0.0.1&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 62.5582%;&quot;&gt;&lt;code&gt;10.0.0.0/24&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 37.4418%;&quot;&gt;&lt;code&gt;http://172.16.0.1&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 62.5582%;&quot;&gt;&lt;code&gt;172.16.0.0/24&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;CGNAT이란?&lt;/b&gt; 집에서 공유기를 이용해 하나의 공인 IP를 여러 기기가 나눠 쓰듯, CGNAT은 이걸 크게 확장해서 여러 가입자를 하나의 IP 주소로 묶어 관리하는 기술. 외부와 격리된 통신사의 사설 IP라고 이해하면 된다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 설정 후 브라우저에서 Tailscale 나스 IP로 접속해 보면, &lt;code&gt;192.168.1.3&lt;/code&gt; Local 네트워크로 표시되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;1050&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z553I/dJMcaaxA0xB/BiWspgIWMnQMAzFAK0BzK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z553I/dJMcaaxA0xB/BiWspgIWMnQMAzFAK0BzK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z553I/dJMcaaxA0xB/BiWspgIWMnQMAzFAK0BzK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz553I%2FdJMcaaxA0xB%2FBiWspgIWMnQMAzFAK0BzK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1400&quot; height=&quot;1050&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;1050&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>⌚️ Productivity</category>
      <category>DSM</category>
      <category>Nas</category>
      <category>PLEX</category>
      <category>Plex설정</category>
      <category>Synology</category>
      <category>tailscale</category>
      <category>VideoStation</category>
      <category>비디오스테이션</category>
      <category>시놀로지</category>
      <category>플렉스</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1346</guid>
      <comments>https://romantech.net/1346#entry1346comment</comments>
      <pubDate>Wed, 25 Feb 2026 18:44:45 +0900</pubDate>
    </item>
    <item>
      <title>[macOS] Tailscale, AdGuard, NextDNS 충돌 없이 함께 쓰기</title>
      <link>https://romantech.net/1345</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1700&quot; data-origin-height=&quot;956&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7ErzZ/dJMcaa5pteB/K6cPNjGSiofv8B7wwFv921/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7ErzZ/dJMcaa5pteB/K6cPNjGSiofv8B7wwFv921/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7ErzZ/dJMcaa5pteB/K6cPNjGSiofv8B7wwFv921/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7ErzZ%2FdJMcaa5pteB%2FK6cPNjGSiofv8B7wwFv921%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;1700&quot; height=&quot;956&quot; data-origin-width=&quot;1700&quot; data-origin-height=&quot;956&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;그동안 보안을 위해 나스(NAS)의 외부 접속은 Tailscale로 제한하고, 광고 차단은 AdGuard를 사용했다. 광고 차단과 시스템 DNS 모두 AdGuard에서 처리하면 관리 측면에서는 좋았지만, AdGuard DNS 응답 속도와 종종 발생하는 지연 때문에 만족스럽지 못했다. 그래서 시스템 DNS는 빠른 속도를 자랑하는 NextDNS에 맡기고, AdGuard는 브라우저 수준의 광고 차단 용도로만 사용하기로 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;a title=&quot;시놀로지 나스 포트 개방 없이 원격 접속 방법&quot; href=&quot;https://romantech.net/1282&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Tailscale&lt;/a&gt; - 기기들을 하나의 사설망(로컬 네트워크)으로 묶어주는 개인용 VPN&lt;/li&gt;
&lt;li&gt;&lt;a title=&quot;NextDNS 설정 방법&quot; href=&quot;https://romantech.net/1344&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;NextDNS&lt;/a&gt; - 빠른 응답 속도의 세밀한 커스텀 필터링이 가능한 DNS 서비스&lt;/li&gt;
&lt;li&gt;&lt;a title=&quot;iOS 앱 광고 차단 방법&quot; href=&quot;https://romantech.net/1076&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;AdGuard&lt;/a&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;AdGuard만 쓰는 환경이라면 설정은 간단하다. AdGuard의 DNS 보호 기능을 끄고, NextDNS 프로파일(또는 앱)을 통해 시스템 DNS를 NextDNS로 지정하면 된다. 하지만 여기에 Tailscale을 실행하는 순간 DNS 충돌로 인해 NextDNS가 적용되지 않는 문제가 발생한다.&lt;/p&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;b&gt;① Tailscale 내부 설정 활용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tailscale 어드민 콘솔 &amp;gt; DNS 탭 &amp;gt; Global Nameservers에 NextDNS를 등록하고, Override local DNS 옵션을 활성화한다. 그럼 Tailscale이 실행 중일 동안 DNS 처리는 NextDNS가 담당하게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1456&quot; data-origin-height=&quot;654&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4mcmm/dJMcacIWgRs/ZJNbWol7nuE6pcn8dx5YRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4mcmm/dJMcacIWgRs/ZJNbWol7nuE6pcn8dx5YRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4mcmm/dJMcacIWgRs/ZJNbWol7nuE6pcn8dx5YRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4mcmm%2FdJMcacIWgRs%2FZJNbWol7nuE6pcn8dx5YRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1456&quot; height=&quot;654&quot; data-origin-width=&quot;1456&quot; data-origin-height=&quot;654&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;② AdGuard DNS 포워딩 활용 (Upstream DNS)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AdGuard의 DNS 보호를 켜고, NextDNS 주소를 커스텀 서버로 등록하는 방식. 이렇게 하면 AdGuard가 1차적으로 트래픽을 필터링하고, 실제 도메인 질의(Query)는 NextDNS가 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;①번 방법은 Tailscale을 종료하면 NextDNS를 적용할 수 없는 단점이 있다. Tailscale 작동 여부와 관계없이 항상 NextDNS를 활성화해 두기 위해 ②번 방식을 선택했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설정 방법&lt;/h2&gt;
&lt;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;① 컴퓨터에 설치된 NextDNS 앱 혹은 프로파일 삭제. macOS 시스템 설정 &amp;gt; 네트워크 &amp;gt; VPN 및 필터 &amp;gt; 필터 및 프록시 목록에 NextDNS가 있다면 삭제해 준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brkcFD/dJMcagEzHoV/iw0Ydkw1K8s9G7VnKDmkX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brkcFD/dJMcagEzHoV/iw0Ydkw1K8s9G7VnKDmkX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brkcFD/dJMcagEzHoV/iw0Ydkw1K8s9G7VnKDmkX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrkcFD%2FdJMcagEzHoV%2Fiw0Ydkw1K8s9G7VnKDmkX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;1536&quot; data-origin-width=&quot;2048&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;② NextDNS 설정(Setup) 페이지에서 본인의 엔드포인트 ID 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2058&quot; data-origin-height=&quot;1544&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dKvjDg/dJMcaadhf3p/6LKhj5AGHByGN04LcYAb91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dKvjDg/dJMcaadhf3p/6LKhj5AGHByGN04LcYAb91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dKvjDg/dJMcaadhf3p/6LKhj5AGHByGN04LcYAb91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdKvjDg%2FdJMcaadhf3p%2F6LKhj5AGHByGN04LcYAb91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2058&quot; height=&quot;1544&quot; data-origin-width=&quot;2058&quot; data-origin-height=&quot;1544&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;③ AdGuard 설정 &amp;gt; DNS 탭 &amp;gt; [DNS 보호] 체크 후 &lt;code&gt;+&lt;/code&gt; 버튼 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2004&quot; data-origin-height=&quot;1502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/loXcX/dJMcagYQnpI/U8q2MQl4LPWWtpFvm3lUk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/loXcX/dJMcagYQnpI/U8q2MQl4LPWWtpFvm3lUk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/loXcX/dJMcagYQnpI/U8q2MQl4LPWWtpFvm3lUk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FloXcX%2FdJMcagYQnpI%2FU8q2MQl4LPWWtpFvm3lUk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2004&quot; height=&quot;1502&quot; data-origin-width=&quot;2004&quot; data-origin-height=&quot;1502&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;code&gt;NextDNS&lt;/code&gt;로 입력하고, 서버 주소는 아래 URL 규칙에 맞춰 DoQ, DoH 주소를 추가한다. 기기 이름에 띄어쓰기를 넣고 싶다면 quic는 &lt;code&gt;--&lt;/code&gt;를, https는 &lt;code&gt;%20&lt;/code&gt;을 사용하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2hAMw/dJMcagdu4Qg/zaCqhoAKTH5E1FTSCRkox1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2hAMw/dJMcagdu4Qg/zaCqhoAKTH5E1FTSCRkox1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2hAMw/dJMcagdu4Qg/zaCqhoAKTH5E1FTSCRkox1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2hAMw%2FdJMcagdu4Qg%2FzaCqhoAKTH5E1FTSCRkox1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1394&quot; height=&quot;456&quot; data-origin-width=&quot;1394&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  DoQ는 QUIC 프로토콜(UDP 기반)을 사용하여 속도/보안이 뛰어나지만, 853 포트가 차단된 네트워크에선 작동하지 않는다. DoH는 일반 웹 트래픽(HTTPS)과 동일한 443 포트를 사용하여 엄격한 방화벽 환경에서도 안정적으로 연결할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  DoQ(&lt;code&gt;quic://...&lt;/code&gt;), DoH(&lt;code&gt;https://...&lt;/code&gt;) 주소를 함께 등록해 두면, 두 주소의 응답 속도를 지속적으로 측정하여 더 빠르고 안정적인 프로토콜을 우선 사용한다. 평소엔 속도가 빠른 DoQ가 주로 선택되지만, 853 포트가 막히거나 응답이 불안정해지면 DoH 비중이 자연스럽게 높아질 수 있다. AdGuard 고급 설정에서 &lt;a href=&quot;https://adguard.com/kb/ko/adguard-for-mac/solving-problems/advanced-settings/#dnsproxyparallelupstreamqueriesenabled&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;병렬 업스트림 쿼리 옵션&lt;/a&gt;을 켜면, 모든 엔드포인트로 동시에 쿼리를 보낸 후 먼저 도착한 응답을 채택하도록 할 수도 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1900&quot; data-origin-height=&quot;1426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L7IjK/dJMb99MaGky/6ZVvf9QtwKQrtKBPxmf8Ak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L7IjK/dJMb99MaGky/6ZVvf9QtwKQrtKBPxmf8Ak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L7IjK/dJMb99MaGky/6ZVvf9QtwKQrtKBPxmf8Ak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL7IjK%2FdJMb99MaGky%2F6ZVvf9QtwKQrtKBPxmf8Ak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1900&quot; height=&quot;1426&quot; data-origin-width=&quot;1900&quot; data-origin-height=&quot;1426&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;⑤ DNS 필터는 NextDNS의 Privacy 탭 &amp;gt; Blocklists에서 관리하므로, AdGuard의 DNS &amp;gt; 필터 탭에 추가해 둔 모든 항목은 체크해제(혹은 삭제) 한다. 차단&amp;middot;허용 목록 역시 AdGuard에 등록해 둔 규칙이 있다면 모두 제거하고 NextDNS로 옮겨준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2004&quot; data-origin-height=&quot;1502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4juyg/dJMcahwH3xq/ijkyeYRmG6GSAUKf9VEui1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4juyg/dJMcahwH3xq/ijkyeYRmG6GSAUKf9VEui1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4juyg/dJMcahwH3xq/ijkyeYRmG6GSAUKf9VEui1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4juyg%2FdJMcahwH3xq%2FijkyeYRmG6GSAUKf9VEui1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2004&quot; height=&quot;1502&quot; data-origin-width=&quot;2004&quot; data-origin-height=&quot;1502&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;접속 테스트&lt;/h2&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;&lt;a title=&quot;NextDNS 테스트 사이트&quot; href=&quot;https://test.nextdns.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;NextDNS 테스트 사이트&lt;/a&gt;에 접속해서 &lt;code&gt;status&lt;/code&gt; 값이 &lt;code&gt;ok&lt;/code&gt;, &lt;code&gt;protocol&lt;/code&gt; 값이 &lt;code&gt;DOQ&lt;/code&gt; 혹은 &lt;code&gt;DOH&lt;/code&gt;로 나오면 설정이 정상적으로 완료된 것이다. DoQ&amp;middot;DoH 서버 주소를 모두 등록했으므로 네트워크 환경에 따라 적절한 프로토콜이 선택된다. &lt;code&gt;deviceName&lt;/code&gt;은 앞서 서버 주소에 입력한 기기 이름이 표시된다. 이 값이 정확해야 NextDNS 로그 페이지에서 어떤 기기의 트래픽인지 구분할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1771841609839&quot; class=&quot;json&quot; data-ke-language=&quot;json&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;status&quot;: &quot;ok&quot;,
  &quot;protocol&quot;: &quot;DOQ&quot;,
  &quot;profile&quot;: &quot;...&quot;,
  &quot;client&quot;: &quot;...&quot;,
  &quot;srcIP&quot;: &quot;...&quot;,
  &quot;destIP&quot;: &quot;...&quot;,
  &quot;anycast&quot;: false,
  &quot;server&quot;: &quot;vultr-sel-1&quot;,
  &quot;clientName&quot;: &quot;unknown-doq&quot;,
  &quot;deviceName&quot;: &quot;Macbook&quot;,
  &quot;deviceID&quot;: &quot;...&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;NextDNS &amp;gt; Logs 페이지에서 좌측 드롭다운을 클릭하면 설정해 둔 기기 이름이 표시된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1790&quot; data-origin-height=&quot;764&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NOYxN/dJMcahDrkYf/8l7PPnrrdkraSdy9quto2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NOYxN/dJMcahDrkYf/8l7PPnrrdkraSdy9quto2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NOYxN/dJMcahDrkYf/8l7PPnrrdkraSdy9quto2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNOYxN%2FdJMcahDrkYf%2F8l7PPnrrdkraSdy9quto2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1790&quot; height=&quot;764&quot; data-origin-width=&quot;1790&quot; data-origin-height=&quot;764&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;이제 Tailscale 실행 여부와 관계없이 시스템 DNS는 항상 NextDNS가 처리하고, AdGuard는 브라우저 수준의 광고 차단에만 집중하는 구조가 완성된다. 역할이 명확히 분리되어 있어 설정 충돌 없이 세 도구를 안정적으로 함께 운용할 수 있다.&lt;/p&gt;</description>
      <category>⌚️ Productivity</category>
      <category>adguard</category>
      <category>dns설정</category>
      <category>DNS포워딩</category>
      <category>macos</category>
      <category>NextDNS</category>
      <category>tailscale</category>
      <category>VPN</category>
      <category>개인정보보호</category>
      <category>광고차단</category>
      <category>네트워크설정</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1345</guid>
      <comments>https://romantech.net/1345#entry1345comment</comments>
      <pubDate>Tue, 24 Feb 2026 01:27:02 +0900</pubDate>
    </item>
    <item>
      <title>NextDNS 추천 설정 가이드 - 광고 차단, 보안, 속도까지 한 번에</title>
      <link>https://romantech.net/1344</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷을 사용하다 보면 쏟아지는 광고와 알게 모르게 내 행동을 추적하는 트래커(Tracker)를 피하기 어렵다. 그래서인지 요즘은 AdBlock, AdGuard, 유니콘 같은 광고 차단 앱을 하나쯤은 설치해 두는 경우가 많다. 오늘은 그중에서도 보안, 개인정보 보호(프라이버시), 광고 차단, 빠른 속도까지 모두 챙긴 NextDNS의 주요 특징과 추천 설정을 살펴볼까 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;NextDNS 장점&lt;/h2&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;NextDNS는 기기가 인터넷에 접속할 때 거치는 DNS 단계(도메인 주소를 IP 주소로 변환하는 과정)에서 광고&amp;middot;추적을 선제적으로 차단해 주는 DNS 기반 솔루션이다. &lt;a title=&quot;NextDNS 공식 홈페이지&quot; href=&quot;https://nextdns.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;공식 홈페이지&lt;/a&gt;에선 &quot;현대 인터넷을 위한 방화벽&quot;으로 설명하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;NextDNS protects you from all kinds of security threats, blocks ads and trackers on websites and in apps and provides a safe and supervised Internet for kids &amp;mdash; on all devices and on all networks.&lt;br /&gt;&lt;br /&gt;NextDNS는 각종 보안 위협으로부터 사용자를 보호하고, 웹사이트와 앱의 광고&amp;middot;트래커를 차단하며, 모든 기기&amp;middot;네트워크에서 아이들을 위한 안전하고 관리 가능한 인터넷 환경을 제공합니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;속도&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NextDNS의 큰 장점 중 하나는 빠른 속도다. 서울을 포함한 전 세계 주요 도시에 네트워크 거점(Point of Presence)을 구축해 뒀기 때문이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2522&quot; data-origin-height=&quot;1914&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1fvc9/dJMcaaK1F1W/1SsO5wz3ULtV6MTkAf8obK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1fvc9/dJMcaaK1F1W/1SsO5wz3ULtV6MTkAf8obK/img.png&quot; data-alt=&quot;NextDNS의 초저지연 네트워크 거점&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1fvc9/dJMcaaK1F1W/1SsO5wz3ULtV6MTkAf8obK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1fvc9%2FdJMcaaK1F1W%2F1SsO5wz3ULtV6MTkAf8obK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;NextDNS의 초저지연 네트워크 거점&quot; loading=&quot;lazy&quot; width=&quot;2522&quot; height=&quot;1914&quot; data-origin-width=&quot;2522&quot; data-origin-height=&quot;1914&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;NextDNS의 초저지연 네트워크 거점&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;연결 방식도 눈여겨볼 점이다. Anycast 방식의 일반 DNS 서비스는 통신사 상황에 따라 해외 서버로 우회되면서 응답 속도가 저하될 수 있다. NextDNS는 Ultralow* 네트워크 기술을 도입하여 사용자와 가까운 서버로 연결되도록 유도한다. 이 방식은 Anycast 라우팅의 불확실성은 줄이고, 물리적 거리를 최적화하여 지연 시간을 최소화한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;Ultralow:&lt;/b&gt; DoH/DoT/DoQ 같은 암호화 프로토콜 환경에서 작동하며, &lt;code&gt;*.dns.nextdns.io&lt;/code&gt; 호스트명을 통해 사용자와 가장 가까운 PoP로 연결한다. 복잡한 인터넷 망에서 최적의 서버 위치를 찾아주는 내비게이션 기술이라고 보면 된다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NextDNS 설치 후 &lt;a title=&quot;NextDNS 핑테스트 사이트&quot; href=&quot;https://ping.nextdns.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;ping.nextdns.io&lt;/a&gt; 페이지에서 핑 테스트를 해 보면 서울 기준 지연 시간이 8ms 내외로 측정된다. 일반적으로 지연 시간이 1~20ms 정도면 쾌적하다고 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1857&quot; data-origin-height=&quot;743&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dIvcQw/dJMcahpQ87K/CT02JQH1BpFls99OXIXor1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dIvcQw/dJMcahpQ87K/CT02JQH1BpFls99OXIXor1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dIvcQw/dJMcahpQ87K/CT02JQH1BpFls99OXIXor1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdIvcQw%2FdJMcahpQ87K%2FCT02JQH1BpFls99OXIXor1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;NextDNS 설치 후 핑 테스트 결과&quot; loading=&quot;lazy&quot; width=&quot;1857&quot; height=&quot;743&quot; data-origin-width=&quot;1857&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;&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;속도뿐 아니라 보안도 놓치지 않았다. NextDNS는 DNS over TLS(DoT)* 등을 통해 모든 쿼리를 암호화하여, 통신사나 중간 네트워크가 어떤 도메인을 조회했는지 감청하지 못하도록 보호한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;DNS over TLS(DoT):&lt;/b&gt; DNS 쿼리(어떤 도메인을 조회했는지)를 암호화하여 중간에서 도청/변조를 어렵게 만드는 프로토콜.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;덕분에 카페/공항 등 보안이 취약한 공용 와이파이 환경에서도 누군가 내 인터넷 접속 기록을 엿보거나 중간에서 조작하는 것을 방지할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;간편함&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 마음에 드는 점은 별도 앱 설치가 필요 없다는 점이다. 안드로이드는 Private DNS* 설정으로, iOS는 프로파일 설치만으로 적용할 수 있다. 이 방식은 시스템 리소스를 거의 차지하지 않으며, 다른 VPN 서비스와 동시에 사용할 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;Private DNS:&lt;/b&gt; 기기에서 DNS 요청을 암호화하여 지정한 DNS 서버로 보내도록 설정하는 기능.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 외에도 실시간 로그 분석, 빠른 설정 반영, 특정 도메인을 원하는 IP로 보내는 Rewrites 같은 고급 기능도 제공한다. 무료 플랜은 매월 30만 쿼리까지 사용할 수 있으므로 모바일 기기 1~2대 정도는 무리 없이 사용할 수 있다. 무료 쿼리 초과 시 차단 기능만 멈추고 인터넷은 정상 작동한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치 방법&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1714&quot; data-origin-height=&quot;696&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmeko4/dJMcabDa96z/bL0SRlldP24JHLjkhktMCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmeko4/dJMcabDa96z/bL0SRlldP24JHLjkhktMCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmeko4/dJMcabDa96z/bL0SRlldP24JHLjkhktMCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcmeko4%2FdJMcabDa96z%2FbL0SRlldP24JHLjkhktMCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;NextDNS Setup 페이지&quot; loading=&quot;lazy&quot; width=&quot;1714&quot; height=&quot;696&quot; data-origin-width=&quot;1714&quot; data-origin-height=&quot;696&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;gt; 네트워크 및 인터넷 &amp;gt; 고급 &amp;gt; 비공개 DNS에서 &lt;code&gt;id.dns.nextdns.io&lt;/code&gt; 주소를 입력하면 되고(&lt;code&gt;id&lt;/code&gt;는 본인 걸로 변경), iOS/macOS는 &lt;a title=&quot;NextDNS Apple Configuration 페이지&quot; href=&quot;https://apple.nextdns.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;apple.nextdns.io&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;자세한 내용은 NextDNS Setup 페이지에서 확인하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;추천 설정&lt;/h2&gt;
&lt;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;NextDNS 설정은 크게 Security, Privacy, Parental Control(자녀 보호 기능), Settings 영역으로 나뉜다. 기본 설정으로 사용해도 무방하지만 보안 강화와 쾌적한 인터넷을 위해 켜 두면 좋은 알짜배기 추천 설정들을 모아봤다.&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;Security&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2270&quot; data-origin-height=&quot;898&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bn4eSI/dJMcafr1Ckh/mvoFyfqIoOJJ9l0F30wYFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bn4eSI/dJMcafr1Ckh/mvoFyfqIoOJJ9l0F30wYFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bn4eSI/dJMcafr1Ckh/mvoFyfqIoOJJ9l0F30wYFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbn4eSI%2FdJMcafr1Ckh%2FmvoFyfqIoOJJ9l0F30wYFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;NextDNS Security 탭&quot; loading=&quot;lazy&quot; width=&quot;2270&quot; height=&quot;898&quot; data-origin-width=&quot;2270&quot; data-origin-height=&quot;898&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;￭ Threat Intelligence: &lt;code&gt;체크&lt;/code&gt;&lt;br /&gt;인텔리전스 소스를 기반으로 이미 알려진 위험 도메인 차단&lt;br /&gt;&lt;br /&gt;￭ Google Safe Browsing: &lt;code&gt;체크&lt;/code&gt;&lt;br /&gt;구글이 제공하는 악성 사이트 목록을 기반으로 위험 사이트 차단&lt;br /&gt;&lt;br /&gt;￭ Cryptojacking Protection: &lt;code&gt;체크&lt;/code&gt;&lt;br /&gt;사용자 동의 없이 기기 자원을 사용하여 암호화폐를 채굴하는 도메인 차단&lt;br /&gt;&lt;br /&gt;￭ DNS Rebinding Protection: &lt;code&gt;체크&lt;/code&gt;&lt;br /&gt;DNS를 조작하여 내부 네트워크(사설 IP)에 접근하려는 공격 차단&lt;br /&gt;&lt;br /&gt;￭ IDN Homograph Attacks Protection: &lt;code&gt;체크&lt;/code&gt;&lt;br /&gt;유니코드 동형 문자(예: 라틴 a와 키릴 а)를 사용하여 위장한 도메인 차단&lt;br /&gt;&lt;br /&gt;￭ Typosquatting Protection: &lt;code&gt;체크&lt;/code&gt;&lt;br /&gt;유명 도메인 주소의 오타를 악용하여(예: gooogle) 만든 유사 사이트 차단&lt;br /&gt;&lt;br /&gt;￭ Domain Generation Algorithms (DGAs) Protection: &lt;code&gt;체크&lt;/code&gt;&lt;br /&gt;차단 회피를 목적으로 알고리즘을 통해 자동 생성한 도메인 차단&lt;br /&gt;&lt;br /&gt;￭ Block Parked Domains: &lt;code&gt;체크&lt;/code&gt; (선택)&lt;br /&gt;콘텐츠 없이 광고 링크나 도메인 판매 중 문구만 있는 사이트 차단&lt;br /&gt;&lt;br /&gt;￭ Block Child Sexual Abuse Material: &lt;code&gt;체크&lt;/code&gt;&lt;br /&gt;아동 성착취물을 포함하거나 유포하는 것으로 알려진 도메인 차단&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Privacy Blocklists (중요)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2270&quot; data-origin-height=&quot;898&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTRcSo/dJMcachMAvy/reyOtGRJD2aXOhU4Jn1gx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTRcSo/dJMcachMAvy/reyOtGRJD2aXOhU4Jn1gx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTRcSo/dJMcachMAvy/reyOtGRJD2aXOhU4Jn1gx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTRcSo%2FdJMcachMAvy%2FreyOtGRJD2aXOhU4Jn1gx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;NextDNS Privacy 탭 - Blocklists&quot; loading=&quot;lazy&quot; width=&quot;2270&quot; height=&quot;898&quot; data-origin-width=&quot;2270&quot; data-origin-height=&quot;898&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;[ADD A BLOCKLIST] 버튼 클릭 후 &lt;code&gt;HaGeZi - Multi NORMAL&lt;/code&gt;과 &lt;code&gt;YousList&lt;/code&gt;를 추가해 둔다. &lt;a title=&quot;HaGeZi GitHub&quot; href=&quot;https://github.com/hagezi/dns-blocklists&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;HaGeZi&lt;/a&gt;는 요즘 가장 핫한 필터 중 하나다. 그중 Multi NORMAL 버전은 낮은 오탐률(False Positive Rate)로 관리가 거의 필요 없기 때문에 여친/가족 필터로 딱 좋다. 더 엄격한 차단 규칙을 원한다면 Multi Pro를 선택할 수 있다. 대신 예외 처리가 가끔 필요할 수 있다.&lt;/p&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://github.com/yous/YousList&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;YousList&lt;/a&gt;는 한국 웹 환경에 특화된 필터다. 개인적으로 &lt;a title=&quot;List-KR GitHub 페이지&quot; href=&quot;https://github.com/List-KR/List-KR&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;List-KR&lt;/a&gt;을 더 선호하지만 아쉽게도 NextDNS용 필터는 제공하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HaGeZi, YousList 정도만 추가해 두면 웬만한 광고&amp;middot;트래커는 대부분 막을 수 있다. 기본적으로 추가되어 있는 NextDNS Ads &amp;amp; Trackers Blocklist 필터는 HaGeZi와 상당 부분 중복되므로 제거해 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;하단 설정&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2270&quot; data-origin-height=&quot;750&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DsWEA/dJMcad10asw/HuuK503dAGhInwDev7BIH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DsWEA/dJMcad10asw/HuuK503dAGhInwDev7BIH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DsWEA/dJMcad10asw/HuuK503dAGhInwDev7BIH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDsWEA%2FdJMcad10asw%2FHuuK503dAGhInwDev7BIH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;NextDNS Privacy 탭 - 하단 설정&quot; loading=&quot;lazy&quot; width=&quot;2270&quot; height=&quot;750&quot; data-origin-width=&quot;2270&quot; data-origin-height=&quot;750&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;￭ Block Disguised Third-Party Trackers: &lt;code&gt;체크&lt;/code&gt;&lt;br /&gt;CNAME을 이용해 퍼스트 파티처럼 위장한 서드 파티 트래커 차단&lt;br /&gt;&lt;br /&gt;￭ Allow Affiliate &amp;amp; Tracking Links: &lt;code&gt;체크&lt;/code&gt;&lt;br /&gt;제휴/클릭 추적 링크 차단으로 링크가 안 열리는 문제를 줄이기 위해 관련 도메인 예외 허용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Allowlist&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2284&quot; data-origin-height=&quot;824&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zpM0Z/dJMcagxManF/lrR3Ugw4KQfKQuADoAWXX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zpM0Z/dJMcagxManF/lrR3Ugw4KQfKQuADoAWXX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zpM0Z/dJMcagxManF/lrR3Ugw4KQfKQuADoAWXX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzpM0Z%2FdJMcagxManF%2FlrR3Ugw4KQfKQuADoAWXX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2284&quot; height=&quot;824&quot; data-origin-width=&quot;2284&quot; data-origin-height=&quot;824&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;NextDNS 적용 후 네이버 서비스가 정상적으로 동작하지 않는다면 아래 주소를 허용 목록에 추가해 보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.938%;&quot;&gt;&lt;b&gt;도메인&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.8914%;&quot;&gt;&lt;b&gt;용도&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 52.1705%;&quot;&gt;&lt;b&gt;차단 시 증상&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.938%;&quot;&gt;&lt;code&gt;adison.co&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.8914%;&quot;&gt;오퍼월(보상형 광고) 네트워크&lt;/td&gt;
&lt;td style=&quot;width: 52.1705%;&quot;&gt;&lt;a title=&quot;Npay 포인트 페이지&quot; href=&quot;https://point.pay.naver.com/pc/main&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;네이버페이&lt;/a&gt; 미션/광고 콘텐츠 로드 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.938%;&quot;&gt;&lt;code&gt;pstatic.net&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 30.8914%;&quot;&gt;네이버 CDN&lt;/td&gt;
&lt;td style=&quot;width: 52.1705%;&quot;&gt;네이버 서비스 일부 이미지 로드 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Settings Logs&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2268&quot; data-origin-height=&quot;1022&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/46gkv/dJMcajnB5kD/ibc8mXUO3y95wVdAsubCQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/46gkv/dJMcajnB5kD/ibc8mXUO3y95wVdAsubCQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/46gkv/dJMcajnB5kD/ibc8mXUO3y95wVdAsubCQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F46gkv%2FdJMcajnB5kD%2Fibc8mXUO3y95wVdAsubCQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;NextDNS Security 탭 - Logs&quot; loading=&quot;lazy&quot; width=&quot;2268&quot; height=&quot;1022&quot; data-origin-width=&quot;2268&quot; data-origin-height=&quot;1022&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;￭ Enable Logs: &lt;code&gt;체크&lt;/code&gt;&lt;br /&gt;￭ Log client IPs: &lt;code&gt;체크&lt;/code&gt;&lt;br /&gt;￭ Log Domains: &lt;code&gt;체크&lt;/code&gt;&lt;br /&gt;￭ Retention: &lt;code&gt;1 week&lt;/code&gt; (로그 확인을 통해 예외 처리 하기 적당한 기간)&lt;br /&gt;￭ Storage location: &lt;code&gt;Switzerland&lt;/code&gt; (개인정보 보호법 가장 강력)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Block Page&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;￭ Enable Block Page : &lt;code&gt;체크 해제&lt;/code&gt;&lt;br /&gt;NextDNS에 의해 도메인이 차단됐을 때, 연결 실패 대신 '도메인 차단' 안내 페이지를 보여주는 기능. 설정하면 페이지 로딩이 살짝 느려질 수 있다. 교육기관/기업처럼 명시적인 안내가 중요한 환경이 아니라면 꺼두는 걸 권장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Performance&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2268&quot; data-origin-height=&quot;878&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/udbb4/dJMcag5yMlS/ufw8TEmpKGaDufhsMuefYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/udbb4/dJMcag5yMlS/ufw8TEmpKGaDufhsMuefYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/udbb4/dJMcag5yMlS/ufw8TEmpKGaDufhsMuefYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fudbb4%2FdJMcag5yMlS%2Fufw8TEmpKGaDufhsMuefYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;NextDNS Security 탭 - Performance&quot; loading=&quot;lazy&quot; width=&quot;2268&quot; height=&quot;878&quot; data-origin-width=&quot;2268&quot; data-origin-height=&quot;878&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;￭ Anonymized EDNS Client Subnet: &lt;code&gt;체크&lt;/code&gt;&lt;br /&gt;가까운 CDN 서버를 선택하기 위해 대략적인 위치(서브넷) 정보를 보내되, 실제 IP는 노출되지 않도록 대표 서브넷으로 익명화하여 전달하는 기능. 속도는 높이고 프라이버시 노출은 최소화할 수 있다.&lt;br /&gt;&lt;br /&gt;￭ Cache Boost: &lt;code&gt;체크&lt;/code&gt;&lt;br /&gt;DNS 응답의 TTL(유효 시간)을 300초로 변경하여 DNS 요청 횟수를 줄이는 기능(5분 동안은 같은 도메인에 DNS 조회 안 함). 쿼리 절약, 배터리/속도 향상에 도움이 될 수 있다.&lt;br /&gt;&lt;br /&gt;￭ CNAME Flattening: &lt;code&gt;체크&lt;/code&gt;&lt;br /&gt;CNAME 경로를 서버가 미리 추적하여 최종 IP 주소만 반환하는 기능. 보통 DNS 조회는 &lt;code&gt;a.com&lt;/code&gt; &amp;rarr; &lt;code&gt;cname1.com&lt;/code&gt; &amp;rarr; &lt;code&gt;cname2.com&lt;/code&gt; &amp;rarr; &lt;code&gt;1.2.3.4&lt;/code&gt;와 같이 여러 CNAME을 거치는데, 이 과정을 생략하고 최종 IP만 응답하여 불필요한 질의를 줄일 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  NextDNS는 DNS 레벨에서 광고 트래픽 자체를 차단해 주지만, 웹페이지에 이미 할당된 광고 영역(요소)은 빈 공간으로 남게 된다. 광고 영역까지 깔끔하게 없애려면 AdGuard 같은 브라우저 확장 프로그램이 필요하다.&lt;/p&gt;</description>
      <category>⌚️ Productivity</category>
      <category>NextDNS</category>
      <category>개인정보보호</category>
      <category>광고제거</category>
      <category>광고차단</category>
      <category>사이버보안</category>
      <category>악성코드차단</category>
      <category>인터넷보안</category>
      <category>추적기차단</category>
      <category>트래커차단</category>
      <category>프라이버시</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1344</guid>
      <comments>https://romantech.net/1344#entry1344comment</comments>
      <pubDate>Tue, 17 Feb 2026 19:39:27 +0900</pubDate>
    </item>
    <item>
      <title>[macOS] Parallels 패러렐즈 윈도우의 ENG 영어 키보드 삭제 방법</title>
      <link>https://romantech.net/1343</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1148&quot; data-origin-height=&quot;860&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bl45rr/dJMcaajXoDL/ffTLr8GofFjdQoZqMJHA3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bl45rr/dJMcaajXoDL/ffTLr8GofFjdQoZqMJHA3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bl45rr/dJMcaajXoDL/ffTLr8GofFjdQoZqMJHA3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbl45rr%2FdJMcaajXoDL%2FffTLr8GofFjdQoZqMJHA3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1148&quot; height=&quot;860&quot; data-origin-width=&quot;1148&quot; data-origin-height=&quot;860&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패러렐즈 환경에서 윈도우를 사용하다 보면 어느 순간 &lt;b&gt;ENG 영어(미국)&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;한동안 이 영어 키보드를 없애본다고 다양한 삽질을 시도했는데 방법은 의외로 간단했다. 이 문제는 맥(macOS)과 윈도우(Windows) 간의 &lt;a title=&quot;키보드 레이아웃 동기화 기능 공식 문서&quot; href=&quot;https://kb.parallels.com/125490&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;키보드 레이아웃 동기화(Keyboard Layout Sync)&lt;/a&gt; 때문에 발생하는 현상으로, 이 기능을 비활성화하면 말끔하게 해결할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결 방법&lt;/h2&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;① 패러렐즈 윈도우 완전히 종료 (일시 정지 아님)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;② 파인더(Finder)에서 패러렐즈 가상 머신 파일(&lt;code&gt;*.pvm&lt;/code&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;code&gt;*.pvm&lt;/code&gt; 파일 우클릭 &amp;gt; [패키지 내용 보기] 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;474&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsOosg/dJMcagLfrW6/9lK2L0Rs96vGWsgKfa875k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsOosg/dJMcagLfrW6/9lK2L0Rs96vGWsgKfa875k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsOosg/dJMcagLfrW6/9lK2L0Rs96vGWsgKfa875k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdsOosg%2FdJMcagLfrW6%2F9lK2L0Rs96vGWsgKfa875k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;560&quot; height=&quot;254&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;474&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;④ &lt;code&gt;config.pvs&lt;/code&gt; 파일 우클릭 &amp;gt; 텍스트 편집기로 열기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1368&quot; data-origin-height=&quot;604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FBRNd/dJMcai3ihBr/EMWfX1yK5zeIfiLbZXem70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FBRNd/dJMcai3ihBr/EMWfX1yK5zeIfiLbZXem70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FBRNd/dJMcai3ihBr/EMWfX1yK5zeIfiLbZXem70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFBRNd%2FdJMcai3ihBr%2FEMWfX1yK5zeIfiLbZXem70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;561&quot; height=&quot;248&quot; data-origin-width=&quot;1368&quot; data-origin-height=&quot;604&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;code&gt;KeyboardLayoutSync&lt;/code&gt; 검색 후 &lt;code&gt;&amp;lt;Enabled&amp;gt;1&amp;lt;/Enabled&amp;gt;&lt;/code&gt; 태그의 숫자를 &lt;code&gt;0&lt;/code&gt;으로 변경&lt;/p&gt;
&lt;pre id=&quot;code_1771226084541&quot; class=&quot;xml&quot; data-ke-language=&quot;xml&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- 변경 전 --&amp;gt;
&amp;lt;KeyboardLayoutSync dyn_lists=&quot;&quot;&amp;gt;
  &amp;lt;Enabled&amp;gt;1&amp;lt;/Enabled&amp;gt;
&amp;lt;/KeyboardLayoutSync&amp;gt;
    
&amp;lt;!-- 변경 후 --&amp;gt;
&amp;lt;KeyboardLayoutSync dyn_lists=&quot;&quot;&amp;gt;
  &amp;lt;Enabled&amp;gt;0&amp;lt;/Enabled&amp;gt;
&amp;lt;/KeyboardLayoutSync&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⑥ 저장 후 패러렐즈 윈도우 재실행&lt;/p&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;code&gt;Win&lt;/code&gt; + &lt;code&gt;R&lt;/code&gt; &amp;gt; &lt;code&gt;intl.cpl&lt;/code&gt; 입력 후 확인 &amp;gt; [관리자 옵션] 탭 &amp;gt; [설정 복사] 클릭 &amp;gt; 하단 [시작 화면 및 시스템 계정], [새 사용자 계정] 두 항목에 체크 후 확인. 이렇게 하면 현재 설정(한국어 Only)을 시스템 전체에 강제로 복사해서 ENG 입력기가 되살아나는 것을 방지할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1966&quot; data-origin-height=&quot;1474&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clCyn7/dJMcaajXphd/KKEPCuh3NLRnqyvP05kEoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clCyn7/dJMcaajXphd/KKEPCuh3NLRnqyvP05kEoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clCyn7/dJMcaajXphd/KKEPCuh3NLRnqyvP05kEoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclCyn7%2FdJMcaajXphd%2FKKEPCuh3NLRnqyvP05kEoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1966&quot; height=&quot;1474&quot; data-origin-width=&quot;1966&quot; data-origin-height=&quot;1474&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;code&gt;Cmd&lt;/code&gt; + &lt;code&gt;Space&lt;/code&gt;, 한글 입력기에서 한/영 전환은 우측 &lt;code&gt;Option&lt;/code&gt; 키를 누르면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;테스트 환경&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;패러렐즈 버전: 26.2.2&lt;/li&gt;
&lt;li&gt;윈도우 버전: Windows 11 25H2&lt;/li&gt;
&lt;li&gt;macOS 버전: Tahoe 26.3&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;레퍼런스&lt;/h2&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;&lt;a href=&quot;https://kb.parallels.com/en/115200&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;How to disable keyboard layout synchronisation between Mac and Windows virtual machine&lt;/a&gt;&lt;/p&gt;</description>
      <category>⌚️ Productivity</category>
      <category>macos</category>
      <category>Parallels</category>
      <category>Windows</category>
      <category>가상머신</category>
      <category>맥북꿀팁</category>
      <category>맥북윈도우</category>
      <category>언어설정</category>
      <category>윈도우</category>
      <category>패러렐즈</category>
      <category>한영전환</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1343</guid>
      <comments>https://romantech.net/1343#entry1343comment</comments>
      <pubDate>Mon, 16 Feb 2026 16:46:15 +0900</pubDate>
    </item>
    <item>
      <title>[미립자팁] 맞춤 설정으로 ChatGPT 답변 간결하고 전문적으로 만들기</title>
      <link>https://romantech.net/1342</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;ChatGPT 답변 내용이 유독 장황하거나 원하는 결론이 너무 늦게 나와서 답답함을 느꼈다면, 간단한 설정 변경만으로 군더더기 없이 핵심부터 말하는 T스러운 스타일로 바꿀 수 있다.&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2366&quot; data-origin-height=&quot;1774&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rtU1d/dJMcacPwlJx/lDkqe3Q6bbBR2jwqS0JfLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rtU1d/dJMcacPwlJx/lDkqe3Q6bbBR2jwqS0JfLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rtU1d/dJMcacPwlJx/lDkqe3Q6bbBR2jwqS0JfLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrtU1d%2FdJMcacPwlJx%2FlDkqe3Q6bbBR2jwqS0JfLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2366&quot; height=&quot;1774&quot; data-origin-width=&quot;2366&quot; data-origin-height=&quot;1774&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;ChatGPT 설정 &amp;gt; 개인 맞춤 설정(Personalization)에서 아래 옵션을 변경해 보자.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;기본 스타일 및 말투: 전문적 (Professional)&lt;/li&gt;
&lt;li&gt;이모지 사용: 낮음 (Less)&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;이 두 가지 설정만 바꿔 줘도 불필요한 서론이 줄어들고 문장이 훨씬 간결해진다. 여기에 맞춤형 지침(Custom Instructions)까지 추가하면 정보 밀도가 높아지고 결론부터 말하는 두괄식 답변 패턴을 유도할 수 있다. 분석이나 문제 해결 중심으로 GPT를 활용하는 사람들에게 추천한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[맞춤형 지침] 한글 버전&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;스타일:&lt;/b&gt; 간결, 직접적, 명확한 주관, 분석적, 자연스러운 문장, 문단 중심 서술&lt;br /&gt;&lt;br /&gt;&lt;b&gt;출력 규칙:&lt;/b&gt;&lt;br /&gt;- 간단한 질문: 1~2 문장으로 즉시 답변&lt;br /&gt;- 일반적인 질문: 3~5 문장으로 결론 제시 후 이유 설명&lt;br /&gt;- 복잡한 질문: 한 문장 요약 + 필요시 Plan/Tradeoffs/Risks/Steps 같은 라벨로 문단 구분&lt;br /&gt;&lt;br /&gt;&lt;b&gt;금지사항:&lt;/b&gt; 질문 반복, 불필요한 예의 표현, &quot;네, 알겠습니다&quot; 같은 무의미한 서두&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[맞춤형 지침] 영어 버전&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;Style:&lt;/b&gt; Concise, direct, analytical. Default to short paragraphs. Be decisive when appropriate.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Output Rules:&lt;/b&gt; &lt;br /&gt;- Simple questions: Answer immediately in 1-2 sentences. &lt;br /&gt;- General questions: Start with the conclusion in 3-5 sentences, then give the key reasoning.&lt;br /&gt;- Complex questions: One-sentence summary first, then structure with labels like Plan / Tradeoffs / Risks / Steps&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Negative Constraints:&lt;/b&gt; Don't restate the question. No pleasantries. No filler like &quot;I understand.&quot;&lt;/blockquote&gt;</description>
      <category>⌚️ Productivity</category>
      <category>AI</category>
      <category>ChatGPT</category>
      <category>GPT</category>
      <category>llm</category>
      <category>OpenAI</category>
      <category>맞춤형 지침</category>
      <category>생성형AI</category>
      <category>인공지능</category>
      <category>챗GPT</category>
      <category>프롬프트</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1342</guid>
      <comments>https://romantech.net/1342#entry1342comment</comments>
      <pubDate>Tue, 3 Feb 2026 01:43:26 +0900</pubDate>
    </item>
    <item>
      <title>[macOS] 찌꺼기까지 싹다 지워주는 무료 언인스톨러 - PearCleaner</title>
      <link>https://romantech.net/1341</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;맥에 설치된 앱(프로그램)을 삭제할 땐 보통 &lt;a href=&quot;https://cleanmymac.com/ko&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;CleanMyMac&lt;/a&gt;을 사용했다. CleanMyMac은 맥 사용자들한테 잘 알려진 올인원 최적화 도구다. 구독형 요금제로 비싼 편이지만 &lt;a href=&quot;https://setapp.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Setapp&lt;/a&gt;에 포함되어 있어 별생각 없이 사용하고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Setapp은 우크라이나 소프트웨어 기업 MacPaw가 운영하는 서비스로, 한 번의 구독으로 macOS&amp;middot;iOS 유료 앱을 추가 비용 없이 사용할 수 있다. 2026년 기준 Craft, Ulysses 등 240개 이상의 프리미엄 앱을 제공하고 있다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;얼마 전 최신 버전의 Office 설치를 위해 CleanMyMac으로 Office for Mac 2021 구버전을 삭제했다. 하지만 Application Support 폴더를 확인해 보니 잔여 파일이 여전히 남아 있었다. 테스트 목적으로 다른 앱을 삭제/재설치해 봐도 기존 설정값이 유지되고 있었다. 결국 CleanMyMac은 언인스톨러로 쓰기엔 살짝 부족하다고 판단하고 대체재를 찾기 시작했다. 유명한 무료 프로그램인 &lt;a href=&quot;https://freemacsoft.net/appcleaner/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;AppCleaner&lt;/a&gt;가 떠올랐지만 아쉽게도 &lt;a href=&quot;https://freemacsoft.net/appcleaner/releasenotes.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;2023년 7월 이후로 업데이트&lt;/a&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1478&quot; data-origin-height=&quot;1012&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6TDHH/dJMcadAL7wR/IiDecj3gNvxYk124L1rHh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6TDHH/dJMcadAL7wR/IiDecj3gNvxYk124L1rHh0/img.png&quot; data-alt=&quot;AppCleaner 릴리즈 노트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6TDHH/dJMcadAL7wR/IiDecj3gNvxYk124L1rHh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6TDHH%2FdJMcadAL7wR%2FIiDecj3gNvxYk124L1rHh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1478&quot; height=&quot;1012&quot; data-origin-width=&quot;1478&quot; data-origin-height=&quot;1012&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AppCleaner 릴리즈 노트&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;b&gt;무료 오픈소스&lt;/b&gt; 프로그램인 &lt;a href=&quot;https://itsalin.com/appInfo/?id=pearcleaner&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;PearCleaner&lt;/a&gt;를 발견했다. 현재까지 꾸준히 업데이트되고 있고 삭제한 앱의 잔여(Orphans) 파일까지 구석구석 찾아서 삭제할 수 있는 장점이 있다. 언인스톨러는 물론 파일 검색, Homebrew 관리, 패키지/플러그인/서비스 매니저, 앱 삭제 감지 등 다양한 부가 기능도 제공한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2910&quot; data-origin-height=&quot;1824&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9LY7O/dJMcabbWnl4/mKAJti6Bu3jTP4zQnjBSZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9LY7O/dJMcabbWnl4/mKAJti6Bu3jTP4zQnjBSZK/img.png&quot; data-alt=&quot;PearCleaner이 찾은 Microsoft Excel 잔여 파일들&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9LY7O/dJMcabbWnl4/mKAJti6Bu3jTP4zQnjBSZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9LY7O%2FdJMcabbWnl4%2FmKAJti6Bu3jTP4zQnjBSZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2910&quot; height=&quot;1824&quot; data-origin-width=&quot;2910&quot; data-origin-height=&quot;1824&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PearCleaner이 찾은 Microsoft Excel 잔여 파일들&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주요 기능&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Core&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;앱 삭제 및 잔여(Orphaned) 파일 정리&lt;/li&gt;
&lt;li&gt;개발 환경, Homebrew, 패키지(PKG), 플러그인, 서비스 관리&lt;/li&gt;
&lt;li&gt;파일 검색 및 앱 업데이트&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;편의&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;드래그 앤 드롭, CLI 지원, 딥링크 기반 자동화 뷰&lt;/li&gt;
&lt;li&gt;리스트/그리드 보기 (배지로 Web/iOS 구분)&lt;/li&gt;
&lt;li&gt;Finder 우클릭(확장 프로그램) 메뉴로 즉시 삭제&lt;/li&gt;
&lt;li&gt;PearCleaner 자체 삭제(self-uninstall)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;부가기능&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;사용하지 않는 언어팩 정리 (선호 언어만 유지)&lt;/li&gt;
&lt;li&gt;유니버설 앱의 불필요한 아키텍처 제거 (Xcode 없이 가능)&lt;/li&gt;
&lt;li&gt;Sentinel Monitor (앱을 휴지통에 버리면 자동 정리)&lt;/li&gt;
&lt;li&gt;앱 번들/파일 리스트 내보내기&lt;/li&gt;
&lt;li&gt;스팀(Steam) 게임 관리 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;맞춤 설정&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;커스텀 컬러/테마 시스템&lt;/li&gt;
&lt;li&gt;검색 디렉토리 포함/제외 설정&lt;/li&gt;
&lt;li&gt;검색 감도 조절&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;/h2&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;&lt;a href=&quot;https://github.com/alienator88/Pearcleaner/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;GitHub 릴리즈 페이지&lt;/a&gt;에서 다운로드하거나 Homebrew를 사용한다면 아래 명령어로 설치할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1769528766810&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew install --cask pearcleaner&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;필수 설정&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2436&quot; data-origin-height=&quot;1828&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSo0ff/dJMcaihQbJ7/y1mLX5eypOB9Ywd8vVuYak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSo0ff/dJMcaihQbJ7/y1mLX5eypOB9Ywd8vVuYak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSo0ff/dJMcaihQbJ7/y1mLX5eypOB9Ywd8vVuYak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSo0ff%2FdJMcaihQbJ7%2Fy1mLX5eypOB9Ywd8vVuYak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2436&quot; height=&quot;1828&quot; data-origin-width=&quot;2436&quot; data-origin-height=&quot;1828&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;code&gt;CMD&lt;/code&gt; + &lt;code&gt;,&lt;/code&gt; 단축키를 누르면 설정 화면이 열린다. 개인적으로 추천하는 설정은 아래와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30.7752%;&quot;&gt;&lt;b&gt;설정 이름&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 11.8217%;&quot;&gt;&lt;b&gt;추천&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.403%;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30.7752%;&quot;&gt;제거 후 Homebrew 정리&lt;/td&gt;
&lt;td style=&quot;width: 11.8217%;&quot;&gt;체크&lt;/td&gt;
&lt;td style=&quot;width: 57.403%;&quot;&gt;삭제 시 해당 앱이 Homebrew로 설치됐는지 확인하고, Homebrew 관리 목록에서도 제거&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30.7752%;&quot;&gt;검색 민감도&lt;/td&gt;
&lt;td style=&quot;width: 11.8217%;&quot;&gt;엄격&lt;/td&gt;
&lt;td style=&quot;width: 57.403%;&quot;&gt;앱 이름, 번들 ID 일치 등 가장 보수적인 기준으로 연관 파일 탐색&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30.7752%;&quot;&gt;앱이 휴지통으로 이동될 때 감지&lt;/td&gt;
&lt;td style=&quot;width: 11.8217%;&quot;&gt;체크&lt;/td&gt;
&lt;td style=&quot;width: 57.403%;&quot;&gt;앱을 휴지통으로 버리면 PearCleaner가 자동 실행되면서 잔여 파일 목록 표시(&lt;a href=&quot;https://www.noodlesoft.com/manual/hazel/hazel-basics/manage-your-trash/use-app-sweep/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Hazel의 App Sweep&lt;/a&gt; 기능과 비슷)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30.7752%;&quot;&gt;Finder 컨텍스트 메뉴 확장 활성화&lt;/td&gt;
&lt;td style=&quot;width: 11.8217%;&quot;&gt;체크&lt;/td&gt;
&lt;td style=&quot;width: 57.403%;&quot;&gt;Finder 우클릭 &amp;gt; 서비스 목록에 &lt;i&gt;Uninstall with PearCleaner&lt;/i&gt; 추가&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PearCleaner는 연관 파일을 찾을 때 기본적으로 모든 디스크를 탐색한다. 이 과정에서 Google Drive나 Dropbox 같은 클라우드 폴더도 스캔 대상에 포함된다. 일반적으로 이런 폴더들은 앱과 관련된 파일이 거의 없고, 스캔 시간만 증가시키기 때문에 제외 폴더로 등록해 두는 걸 권장한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2432&quot; data-origin-height=&quot;1824&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bonnIB/dJMcagEmm2n/k0aWqkjJfIhJCOScD4N4rK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bonnIB/dJMcagEmm2n/k0aWqkjJfIhJCOScD4N4rK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bonnIB/dJMcagEmm2n/k0aWqkjJfIhJCOScD4N4rK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbonnIB%2FdJMcagEmm2n%2Fk0aWqkjJfIhJCOScD4N4rK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2432&quot; height=&quot;1824&quot; data-origin-width=&quot;2432&quot; data-origin-height=&quot;1824&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;macOS는 &lt;code&gt;~/Library/CloudStorage&lt;/code&gt; 폴더에서 클라우드 데이터를 통합 관리한다. 이 경로를 Spotlight 검색창에 붙여넣고 엔터를 누르면 해당 폴더가 열린다. 이 폴더를 PearCleaner 제외 목록으로 드래그 앤 드롭해서 추가해 두자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1632&quot; data-origin-height=&quot;1017&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xM3ug/dJMcadOiFQ6/INUz9lIlQNjAA7X2InMf4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xM3ug/dJMcadOiFQ6/INUz9lIlQNjAA7X2InMf4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xM3ug/dJMcadOiFQ6/INUz9lIlQNjAA7X2InMf4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxM3ug%2FdJMcadOiFQ6%2FINUz9lIlQNjAA7X2InMf4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1632&quot; height=&quot;1017&quot; data-origin-width=&quot;1632&quot; data-origin-height=&quot;1017&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;부가기능 톺아보기&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;개발 환경&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IDE, 빌드 도구, 패키지 매니저 등이 생성한 대용량 캐시&amp;middot;아티팩트(빌드 산출물, 인덱스, 로그 등)를 정리할 수 있다. 개발을 하다 보면 빌드 캐시나 각종 임시 파일이 수십 기가바이트까지 쌓이는 경우가 흔하다. 이런 파일들은 시스템 깊숙이 숨겨진 폴더에 저장돼서 직접 관리하기 번거롭다. PearCleaner를 사용하면 이러한 파일들을 유형별로 찾아서 말끔하게 정리할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2490&quot; data-origin-height=&quot;1404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzryw9/dJMcacWe5wA/kEDHeRRDvfJUNk9JkUoV11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzryw9/dJMcacWe5wA/kEDHeRRDvfJUNk9JkUoV11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzryw9/dJMcacWe5wA/kEDHeRRDvfJUNk9JkUoV11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdzryw9%2FdJMcacWe5wA%2FkEDHeRRDvfJUNk9JkUoV11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2490&quot; height=&quot;1404&quot; data-origin-width=&quot;2490&quot; data-origin-height=&quot;1404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Homebrew 관리자&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Homebrew로 설치한 패키지(Formula)와 애플리케이션(Cask)을 관리하고, 버전 업데이트와 유지보수 작업을 수행할 수 있다. Homebrew를 오래 사용하다 보면 구버전 패키지나 사용하지 않는 의존성 파일, 다운로드 캐시가 계속 누적되면서 디스크 용량을 낭비하게 된다. PearCleaner를 사용하면 이러한 찌꺼기를 손쉽게 정리할 수 있다. 설치한 항목을 시각적으로 확인할 수 있기 때문에 CLI에 익숙하지 않은 사용자에게도 유용하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2490&quot; data-origin-height=&quot;1404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKWbB3/dJMcac2YRok/ucVFGAELSHf0UXMwBrOUVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKWbB3/dJMcac2YRok/ucVFGAELSHf0UXMwBrOUVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKWbB3/dJMcac2YRok/ucVFGAELSHf0UXMwBrOUVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKWbB3%2FdJMcac2YRok%2FucVFGAELSHf0UXMwBrOUVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2490&quot; height=&quot;1404&quot; data-origin-width=&quot;2490&quot; data-origin-height=&quot;1404&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;Auto Update 탭에선 패키지 업데이트와 정리 작업을 자동으로 수행하는 스케줄을 설정할 수 있다. 매번 터미널에 업데이트 명령어를 입력하는 번거로움 없이, PearCleaner가 정해진 주기에 따라 관리해 줘서 훨씬 편하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2490&quot; data-origin-height=&quot;924&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCVmxc/dJMcafMeuwA/WelhTgfdJkWigrLGX6IRok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCVmxc/dJMcafMeuwA/WelhTgfdJkWigrLGX6IRok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCVmxc/dJMcafMeuwA/WelhTgfdJkWigrLGX6IRok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCVmxc%2FdJMcafMeuwA%2FWelhTgfdJkWigrLGX6IRok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2490&quot; height=&quot;924&quot; data-origin-width=&quot;2490&quot; data-origin-height=&quot;924&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스케줄을 활성화하면 백그라운드 실행을 위해 아래 경로에 LaunchAgent 설정 파일(plist)이 생성된다.&lt;/p&gt;
&lt;pre id=&quot;code_1769850292845&quot; class=&quot;plaintext&quot; data-ke-language=&quot;plaintext&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;~/Library/LaunchAgents/com.alienator88.Pearcleaner.homebrew-autoupdate.plist&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;macOS 앱은 호환성을 위해 Intel(x86_64)과 Apple Silicon(arm64) 맥을 위한 실행 파일을 함께 포함하는 경우가 많다. 이런 형태를 유니버설 바이너리(Universal Binary)라고 부른다. 하지만 Apple Silicon(M 시리즈) 맥 사용자는 Intel용 실행 파일(바이너리)을 굳이 가지고 있을 필요가 없다. PearCleaner의 번들 축소 기능으로 Intel용 바이너리를 제거해 주면, 앱 기능에 영향을 주지 않으면서 저장 공간을 확보할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2490&quot; data-origin-height=&quot;1404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KC06o/dJMcafepdw3/WZrmDxLKbGt6LXCbP3bx40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KC06o/dJMcafepdw3/WZrmDxLKbGt6LXCbP3bx40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KC06o/dJMcafepdw3/WZrmDxLKbGt6LXCbP3bx40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKC06o%2FdJMcafepdw3%2FWZrmDxLKbGt6LXCbP3bx40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2490&quot; height=&quot;1404&quot; data-origin-width=&quot;2490&quot; data-origin-height=&quot;1404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;고아 파일 (연결되지 않은 파일)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 삭제된 애플리케이션과 연결 고리가 끊어진 이른바 고아 파일(Orphans)을 스캔해서 보여준다. 삭제 과정에서 남겨진 라이브러리, 캐시, 설정 파일 등이 포함될 수 있다. 다만, 현재 컴퓨터에 설치된 앱과 겹치지 않는 항목을 찾아내는 '추측 기반' 방식이므로 100% 정확하지 않을 수 있다. 파일명과 경로를 꼼꼼히 확인한 뒤 정리하는 것이 좋다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2490&quot; data-origin-height=&quot;1404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wh0dm/dJMcafyHxgs/Xh1XXKUcllBXCZBqLZifq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wh0dm/dJMcafyHxgs/Xh1XXKUcllBXCZBqLZifq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wh0dm/dJMcafyHxgs/Xh1XXKUcllBXCZBqLZifq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwh0dm%2FdJMcafyHxgs%2FXh1XXKUcllBXCZBqLZifq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2490&quot; height=&quot;1404&quot; data-origin-width=&quot;2490&quot; data-origin-height=&quot;1404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;패키지 관리자&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 앱과 달리 &lt;code&gt;*.pkg&lt;/code&gt; 형식(설치 마법사)으로 설치되어 삭제가 까다로운 프로그램들을 관리하는 기능. macOS의 설치 기록을 추적하여 시스템 곳곳에 흩어진 구성 파일들을 찾아내고 깔끔하게 제거할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2490&quot; data-origin-height=&quot;1404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mMmoD/dJMcadU7FA6/siplIKzPMNT7GJyunB9bfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mMmoD/dJMcadU7FA6/siplIKzPMNT7GJyunB9bfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mMmoD/dJMcadU7FA6/siplIKzPMNT7GJyunB9bfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmMmoD%2FdJMcadU7FA6%2FsiplIKzPMNT7GJyunB9bfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2490&quot; height=&quot;1404&quot; data-origin-width=&quot;2490&quot; data-origin-height=&quot;1404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;플러그인 관리자&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오디오, 폰트, 입력기(Input Methods), 인터넷 플러그인, QuickLook 등 macOS 기능을 확장하는 다양한 요소를 한 곳에서 관리할 수 있다. 항목별로 설치 경로와 용량을 확인하면서 더 이상 사용하지 않는 플러그인을 선택 삭제할 수 있다. 오디오 플러그인처럼 눈에 잘 띄지 않는 구성 요소를 정리할 때 특히 유용하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2490&quot; data-origin-height=&quot;1404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dAZc5R/dJMcabpw6cX/wjhphPbx07pP3zz7g6fQjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dAZc5R/dJMcabpw6cX/wjhphPbx07pP3zz7g6fQjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dAZc5R/dJMcabpw6cX/wjhphPbx07pP3zz7g6fQjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdAZc5R%2FdJMcabpw6cX%2FwjhphPbx07pP3zz7g6fQjk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2490&quot; height=&quot;1404&quot; data-origin-width=&quot;2490&quot; data-origin-height=&quot;1404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;서비스 관리자&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 로그인 시 자동 실행되거나 백그라운드에 상주하는 런치 에이전트(Launch Agents) 및 데몬(Daemons)을 조회하고 관리한다. 이미 삭제된 앱과 연동되어 불필요하게 시스템 리소스를 점유하거나 부팅 속도를 저하시키는 좀비 프로세스(Orphaned Services)를 식별하여 정리할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2490&quot; data-origin-height=&quot;1404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uQfMK/dJMcafZJ424/CnusUklbL1KH2DPu4RdVm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uQfMK/dJMcafZJ424/CnusUklbL1KH2DPu4RdVm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uQfMK/dJMcafZJ424/CnusUklbL1KH2DPu4RdVm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuQfMK%2FdJMcafZJ424%2FCnusUklbL1KH2DPu4RdVm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2490&quot; height=&quot;1404&quot; data-origin-width=&quot;2490&quot; data-origin-height=&quot;1404&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;  LaunchAgents는 사용자 로그인 후 동작하며, 현재 사용자 권한으로 실행된다. LaunchDaemons는 부팅 시점부터 동작하는 시스템 레벨의 프로세스로, 보통 root 권한으로 실행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;업데이터&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱스토어, Homebrew, Sparkle(앱 내부 업데이트) 등 파편화된 업데이트 경로를 한 화면에서 조회할 수 있다. Sparkle 프레임워크 기반 앱은 PearCleaner 내에서 직접 업데이트도 가능하다. MacUpdater(2026년부터 운영 종료) 같은 전문 업데이트 도구와 비교하면 세부 기능이나 앱 메타정보 매칭 범위가 제한적이어서 활용도는 낮은 편이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2490&quot; data-origin-height=&quot;1404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRpjHc/dJMcabbX6te/fILo86dfQSO73fjHKCdeoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRpjHc/dJMcabbX6te/fILo86dfQSO73fjHKCdeoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRpjHc/dJMcabbX6te/fILo86dfQSO73fjHKCdeoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRpjHc%2FdJMcabbX6te%2FfILo86dfQSO73fjHKCdeoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2490&quot; height=&quot;1404&quot; data-origin-width=&quot;2490&quot; data-origin-height=&quot;1404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;알프레드 워크플로우&lt;/h2&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;Alfred 사용자는 전용 워크플로우를 활용해서 원하는 앱을 더 빠르게 삭제할 수 있다. 알프레드 런처창에 &lt;code&gt;키워드 앱이름&lt;/code&gt;을 입력하고 엔터 키를 누르면 PearCleaner가 실행되면서 해당 앱의 잔여 파일들을 보여준다. 키워드 기본값은 &lt;code&gt;pear&lt;/code&gt;이며, 자유롭게 변경할 수 있다. 워크플로우는 &lt;a href=&quot;https://github.com/andylundqvist/alfred-pearcleaner/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;링크&lt;/a&gt;에서 다운로드할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1888&quot; data-origin-height=&quot;1416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lMnfz/dJMcafk9lcJ/HZVDmzikdJHON7zZZdkIXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lMnfz/dJMcafk9lcJ/HZVDmzikdJHON7zZZdkIXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lMnfz/dJMcafk9lcJ/HZVDmzikdJHON7zZZdkIXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlMnfz%2FdJMcafk9lcJ%2FHZVDmzikdJHON7zZZdkIXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1888&quot; height=&quot;1416&quot; data-origin-width=&quot;1888&quot; data-origin-height=&quot;1416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주의할 점&lt;/h2&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;같은 개발사의 프로그램을 여러 개 설치한 상태라면, PearCleaner가 잔여 파일을 찾는 과정에서 해당 회사의 다른 프로그램 파일까지 찌꺼기로 인식할 수 있다. 예를 들어 JetBrains Toolbox를 삭제하려고 검색했지만, 같은 개발사의 WebStorm 관련 폴더까지 삭제 목록에 잡히는 경우다. 개발사 폴더 안에 여러 프로그램의 하위 폴더가 함께 저장되는 구조라면 특히 주의가 필요하다. 흔치 않은 케이스지만, 삭제 전에는 한 번 더 꼼꼼하게 확인하는 게 좋다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2490&quot; data-origin-height=&quot;1404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxPyDf/dJMcaiITW6c/pdC2D75Z3q7Do5sePCd3Dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxPyDf/dJMcaiITW6c/pdC2D75Z3q7Do5sePCd3Dk/img.png&quot; data-alt=&quot;JetBrains 폴더는 WebStorm, IntelliJ 같은 프로그램별 하위 폴더를 포함하는 구조다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxPyDf/dJMcaiITW6c/pdC2D75Z3q7Do5sePCd3Dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxPyDf%2FdJMcaiITW6c%2FpdC2D75Z3q7Do5sePCd3Dk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2490&quot; height=&quot;1404&quot; data-origin-width=&quot;2490&quot; data-origin-height=&quot;1404&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;JetBrains 폴더는 WebStorm, IntelliJ 같은 프로그램별 하위 폴더를 포함하는 구조다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>⌚️ Productivity</category>
      <category>맥디스크정리</category>
      <category>맥북</category>
      <category>맥삭제프로그램</category>
      <category>맥앱</category>
      <category>맥앱삭제</category>
      <category>맥앱추천</category>
      <category>맥언인스톨러</category>
      <category>맥캐시정리</category>
      <category>맥클린업</category>
      <category>맥프로그램추천</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1341</guid>
      <comments>https://romantech.net/1341#entry1341comment</comments>
      <pubDate>Sun, 1 Feb 2026 15:03:34 +0900</pubDate>
    </item>
    <item>
      <title>[macOS] 구글 Gemini 제미나이 Dock에 넣고 앱처럼 사용하기</title>
      <link>https://romantech.net/1340</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 안 쓰는 사람이 없을 정도로 대중화된 ChatGPT는 &lt;a href=&quot;https://chatgpt.com/ko-KR/features/desktop/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;데스크톱(Windows/macOS) 클라이언트&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;[ChatGPT 런처 실행 화면. 출처 OpenAI]&lt;/p&gt;
&lt;div id=&quot;code_1769406780866&quot; data-ke-type=&quot;html&quot; data-source=&quot;&amp;lt;figure class=&amp;quot;video-embed&amp;quot;&amp;gt;
  &amp;lt;iframe
    src=&amp;quot;https://player.vimeo.com/video/964938316?h=715570ac8a&amp;amp;autoplay=1&amp;amp;loop=true&amp;amp;controls=1&amp;amp;autopause=0&amp;amp;muted=1&amp;amp;playsinline=1&amp;quot;
    title=&amp;quot;Embedded Vimeo video player&amp;quot;
    allow=&amp;quot;autoplay; fullscreen; picture-in-picture&amp;quot;
    referrerpolicy=&amp;quot;strict-origin-when-cross-origin&amp;quot;
    allowfullscreen
    loading=&amp;quot;lazy&amp;quot;
  &amp;gt;&amp;lt;/iframe&amp;gt;
&amp;lt;/figure&amp;gt;

&amp;lt;style&amp;gt;
  .video-embed {
    width: 100%;
    aspect-ratio: 16 / 9;
    margin: 0;
    overflow: hidden;
    border-radius: 12px;
    background: #000;
  }

  .video-embed iframe {
    display: block;
    width: 100%;
    height: 100%;
    border: 0;
  }
&amp;lt;/style&amp;gt;&quot;&gt;
&lt;figure class=&quot;video-embed&quot;&gt;&lt;iframe src=&quot;https://player.vimeo.com/video/964938316?h=715570ac8a&amp;amp;autoplay=1&amp;amp;loop=true&amp;amp;controls=1&amp;amp;autopause=0&amp;amp;muted=1&amp;amp;playsinline=1&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/figure&gt;
&lt;style&gt;
  .video-embed {
    width: 100%;
    aspect-ratio: 16 / 9;
    margin: 0;
    overflow: hidden;
    border-radius: 12px;
    background: #000;
  }

  .video-embed iframe {
    display: block;
    width: 100%;
    height: 100%;
    border: 0;
  }
&lt;/style&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;최근 무섭게 치고 올라오는 구글 제미나이(Gemini)는 아쉽게도 데스크톱 클라이언트가 없다. 그래서 매번 브라우저를 열고 접속해야 하는데, 이 과정이 꽤 번거롭다(바쁠 땐 특히 더). Gmail, Calendar, Meet 등 다른 구글 서비스 역시 마찬가지다. 구글은 기본적으로 웹 기반 서비스 중심으로 운영해 온 만큼, 앞으로도 데스크톱 클라이언트를 제공할 가능성은 낮아 보인다.&lt;/p&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://developer.mozilla.org/ko/docs/Web/Progressive_web_apps/Tutorials/js13kGames&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;PWA(프로그레시브 웹 앱)&lt;/a&gt;로 설치해 두면 거의 데스크톱 앱처럼 사용할 수 있다. PWA는 웹사이트를 앱(App)처럼 실행할 수 있게 해주는 기술이다. 한 번 설치해 두면 브라우저를 따로 열지 않아도 독(Dock)에서 바로 실행할 수 있다.&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20260127_003733 2.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bq8WBd/dJMcagqL0ox/t9cjiA1XFgOtAloxKqqKf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bq8WBd/dJMcagqL0ox/t9cjiA1XFgOtAloxKqqKf1/img.png&quot; data-alt=&quot;Dock에 추가된 Google Gemini PWA&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bq8WBd/dJMcagqL0ox/t9cjiA1XFgOtAloxKqqKf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbq8WBd%2FdJMcagqL0ox%2Ft9cjiA1XFgOtAloxKqqKf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1376&quot; height=&quot;468&quot; data-filename=&quot;20260127_003733 2.png&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;468&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Dock에 추가된 Google Gemini PWA&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;웹사이트를 PWA로 설치하는 과정은 클릭 몇 번이면 될 정도로 간단하다. 단, 크롬(Chrome)이나 엣지(Edge) 같은 크로미움 기반 브라우저가 필요하다. 아래에서 설치 방법을 살펴보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;제미나이 PWA 설치하기&lt;/h2&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;먼저 크롬 혹은 엣지 브라우저로 &lt;a href=&quot;https://gemini.google.com/app&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;제미나이 사이트&lt;/a&gt;에 접속한다. 브라우저 우측 상단 [점 3개 메뉴] &amp;gt; [전송, 저장, 공유] &amp;gt; [페이지를 앱으로 설치] 버튼을 클릭하면 PWA가 설치되고 Dock에 추가된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2312&quot; data-origin-height=&quot;1112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLpql0/dJMcaaxk45r/8xHvhm6S7RwiVKHhmO6G31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLpql0/dJMcaaxk45r/8xHvhm6S7RwiVKHhmO6G31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLpql0/dJMcaaxk45r/8xHvhm6S7RwiVKHhmO6G31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLpql0%2FdJMcaaxk45r%2F8xHvhm6S7RwiVKHhmO6G31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2312&quot; height=&quot;1112&quot; data-origin-width=&quot;2312&quot; data-origin-height=&quot;1112&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;macOS 기준 PWA가 설치되는 경로는 아래와 같다(사용자/유저명/응용 프로그램/Chrome 앱).&lt;/p&gt;
&lt;pre id=&quot;code_1769412882593&quot; class=&quot;plaintext&quot; data-ke-language=&quot;plaintext&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/Users/유저이름/Applications/Chrome Apps.localized/Google Gemini.app&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;Dock에 추가된 Google Gemini를 클릭하면 아래 스크린샷처럼 앱 형태로 실행된다. 브라우저 기반으로 동작하므로 새로고침, 뒤로가기, 확대/축소 같은 단축키를 그대로 사용할 수 있고, 설치한 확장 프로그램도 동일하게 적용된다. 예를 들어 &lt;a href=&quot;https://chromewebstore.google.com/detail/grammarly-ai-writing-assi/kbfnbcaeplbcioakkpcpgfkobkghlhen&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Grammarly&lt;/a&gt; 확장 프로그램(영어 문법/맞춤법 도구)을 사용한다면, Gemini 채팅창에 영어 문장을 입력했을 때 교정/추천 제안이 표시된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yGZL6/dJMcafZHhbn/ypsZiNaJP6WNB2iO61HcsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yGZL6/dJMcafZHhbn/ypsZiNaJP6WNB2iO61HcsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yGZL6/dJMcafZHhbn/ypsZiNaJP6WNB2iO61HcsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyGZL6%2FdJMcafZHhbn%2FypsZiNaJP6WNB2iO61HcsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1440&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&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;PWA 우측 상단 [점 3개 메뉴] &amp;gt; [앱 정보] &amp;gt; [설정]을 클릭하면 권한 설정 페이지가 열린다. 여기서 알림, 마이크, 위치 같은 권한을 조정할 수 있다. 기본적으로 &lt;a href=&quot;https://gemini.google.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;제미나이 URL&lt;/a&gt;은 PWA로 열리는데, &quot;브라우저에서 열기&quot; 항목에 체크하면 Chrome 탭에서 열리도록 변경할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20260127_113037.png&quot; data-origin-width=&quot;1948&quot; data-origin-height=&quot;1330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vqcBI/dJMcaiB6tuj/NJHGvKbM5j9Aq3JsczcqNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vqcBI/dJMcaiB6tuj/NJHGvKbM5j9Aq3JsczcqNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vqcBI/dJMcaiB6tuj/NJHGvKbM5j9Aq3JsczcqNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvqcBI%2FdJMcaiB6tuj%2FNJHGvKbM5j9Aq3JsczcqNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1948&quot; height=&quot;1330&quot; data-filename=&quot;20260127_113037.png&quot; data-origin-width=&quot;1948&quot; data-origin-height=&quot;1330&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;[미립자팁] PWA 앱 종료 방지하기&lt;/h2&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;맥 사용자라면 &lt;code&gt;CMD&lt;/code&gt; + &lt;code&gt;W&lt;/code&gt; 닫기 단축키를 정말 자주 사용한다. 하지만 PWA 창에서 이 단축키를 누르면 앱 자체가 완전히 종료되어 버린다. PWA를 다시 실행하기까지 어느 정도 로딩 시간이 필요하기 때문에 은근히 거슬린다. 그렇다고 매번 &lt;code&gt;CMD&lt;/code&gt; + &lt;code&gt;H&lt;/code&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;code&gt;CMD&lt;/code&gt; + &lt;code&gt;W&lt;/code&gt; 단축키를 '닫기' 대신 '숨기기' 동작으로 변경하면 해결할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1446&quot; data-origin-height=&quot;980&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byUCj3/dJMcaioAvRn/sqnjd5xhpVXTX1U1u2K75K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byUCj3/dJMcaioAvRn/sqnjd5xhpVXTX1U1u2K75K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byUCj3/dJMcaioAvRn/sqnjd5xhpVXTX1U1u2K75K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyUCj3%2FdJMcaioAvRn%2Fsqnjd5xhpVXTX1U1u2K75K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1446&quot; height=&quot;980&quot; data-origin-width=&quot;1446&quot; data-origin-height=&quot;980&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;시스템 설정 &amp;gt; 키보드 &amp;gt; 키보드 단축키 &amp;gt; 앱 단축키로 이동한다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;+&lt;/code&gt; 버튼을 눌러서 Google Gemini 앱을 추가한다.&lt;/li&gt;
&lt;li&gt;메뉴 제목에 &lt;code&gt;Google Gemini 숨기기&lt;/code&gt;를 정확히 입력한다.&lt;/li&gt;
&lt;li&gt;키보드 단축키 입력창을 클릭하고 &lt;code&gt;CMD&lt;/code&gt; + &lt;code&gt;W&lt;/code&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;이제 제미나이 앱에서 &lt;code&gt;CMD&lt;/code&gt; + &lt;code&gt;W&lt;/code&gt;를 눌러도 앱이 꺼지지 않고 창만 깔끔하게 숨겨진다. 만약 PWA 앱 이름을 &lt;code&gt;Gemini&lt;/code&gt;로 설정했다면 메뉴 제목 역시 &lt;code&gt;Gemini 숨기기&lt;/code&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;  BetterTouchTool(BTT)를 사용 중이라면 더 간단하게 설정할 수 있다. Keyboard Shortcuts 항목에 Google Gemini 앱을 추가한 뒤 &lt;code&gt;CMD&lt;/code&gt; + &lt;code&gt;W&lt;/code&gt; 입력을 &lt;code&gt;CMD&lt;/code&gt; + &lt;code&gt;H&lt;/code&gt; 동작으로 매핑해 주면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2172&quot; data-origin-height=&quot;809&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p1Ctz/dJMcacPsQgd/3y8Rdhv2wbV8qlWfUQEgz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p1Ctz/dJMcacPsQgd/3y8Rdhv2wbV8qlWfUQEgz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p1Ctz/dJMcacPsQgd/3y8Rdhv2wbV8qlWfUQEgz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp1Ctz%2FdJMcacPsQgd%2F3y8Rdhv2wbV8qlWfUQEgz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2172&quot; height=&quot;809&quot; data-origin-width=&quot;2172&quot; data-origin-height=&quot;809&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>⌚️ Productivity</category>
      <category>BTT</category>
      <category>ChatGPT</category>
      <category>Google Gemini</category>
      <category>GPT</category>
      <category>PWA</category>
      <category>구글 제미나이</category>
      <category>구글 크롬</category>
      <category>맥북꿀팁</category>
      <category>맥팁</category>
      <category>생산성</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1340</guid>
      <comments>https://romantech.net/1340#entry1340comment</comments>
      <pubDate>Tue, 27 Jan 2026 00:44:16 +0900</pubDate>
    </item>
    <item>
      <title>LG U+ 유플러스 가입 후 꼭 챙겨야 할 무료 부가서비스, 꿀팁 모음</title>
      <link>https://romantech.net/1339</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;얼마 전, 10년 동안 사용했던 KT를 떠나 LG U+ 너겟 47 요금제로 번호이동했다. 약정이 거의 끝나가던 시점이기도 했고, KT 개인정보 유출 이슈 등으로 뒤숭숭하던 차에 위약금 면제 프로그램을 진행하길래 냅다 갈아탔다. 그동안 LTE만 사용하다가 처음으로 5G를 써보는 거라 내심 기대했지만, 생각보다 속도 면에서 큰 차이는 느끼지 못했다. 지역, 기지국 환경에 따라 편차가 있겠지만 서울 내에서도 신호가 약한 음영 구간이 꽤 존재했다. 지하철에선 아주 잘 터진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_2338.PNG&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZOu7B/dJMcag5n65l/m4m9ql5agPD5C9XkjYkBfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZOu7B/dJMcag5n65l/m4m9ql5agPD5C9XkjYkBfk/img.png&quot; data-alt=&quot;SpeedTest 테스트 결과. 최대 약 130MB/s 속도로 다운로드할 수 있다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZOu7B/dJMcag5n65l/m4m9ql5agPD5C9XkjYkBfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZOu7B%2FdJMcag5n65l%2Fm4m9ql5agPD5C9XkjYkBfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;497&quot; height=&quot;265&quot; data-filename=&quot;IMG_2338.PNG&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SpeedTest 테스트 결과. 최대 약 130MB/s 속도로 다운로드할 수 있다.&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;a href=&quot;https://www.lguplus.com/mobile/plan/mplan/direct/nerget/LPZ1004889&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;너겟 47 온라인 전용 요금제&lt;/a&gt;는 약정 없이 월 100GB 데이터를 제공하고(소진 시 3Mbps 속도 제한), 최대 60GB까지 테더링/쉐어링 할 수도 있다. 아마 알뜰폰을 제외한 통신 3사 중에선 가장 저렴하지 않을까 싶다(47000원/월). &lt;a href=&quot;https://www.moyoplan.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;모요&lt;/a&gt;에서 구매하면 7개월 동안 총 25.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;한편 통신사를 옮기고 보니 생각보다 처리해야 할 일이 많았다. U+one 앱 설치, PASS by U+ 재설정 그리고 각종 자잘한 설정까지... 오늘은 LG 유플러스 개통 후 놓치면 아까운 무료 부가서비스와 유용한 꿀팁들을 정리해 볼까 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;무료 부가서비스&lt;/h2&gt;
&lt;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;&lt;a href=&quot;https://www.lguplus.com/mobile/plan/addon/addon-all&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;LG U+ 홈페이지 &amp;gt; 스토어 &amp;gt; 모바일 서비스 &amp;gt; 전체&lt;/a&gt;를 클릭하면 가입할 수 있는 모든 부가 서비스 목록이 나온다. 이 페이지에서 [무료]에 체크하면 무료 서비스만 필터링해서 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2988&quot; data-origin-height=&quot;1332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0EUEO/dJMcagEk6LQ/XPUhCQkLKEjeu78zBaABp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0EUEO/dJMcagEk6LQ/XPUhCQkLKEjeu78zBaABp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0EUEO/dJMcagEk6LQ/XPUhCQkLKEjeu78zBaABp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0EUEO%2FdJMcagEk6LQ%2FXPUhCQkLKEjeu78zBaABp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2988&quot; height=&quot;1332&quot; data-origin-width=&quot;2988&quot; data-origin-height=&quot;1332&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;꼭 신청해야 할 필수 서비스&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.lguplus.com/mobile/plan/addon/addon-call-msg/Z100000006&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;통화 중 대기&lt;/a&gt;: 통화 중 다른 전화가 오면 기존 통화를 잠시 대기시키고 새 전화를 받을 수 있는 기능.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.lguplus.com/mobile/plan/addon/addon-call-msg/LRZ0002297&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;번호도용 문자차단&lt;/a&gt;: 내 번호가 스팸 문자의 발신 번호로 악용되는 것을 막아주는 서비스.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.lguplus.com/mobile/plan/addon/addon-familysafety-info/LRZ1005180&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;피싱/해킹 안심서비스&lt;/a&gt;: 피싱, 해킹으로 인한 금융 피해 발생 시 최대 300만 원까지 보상해 주는 무료 보험(안 할 이유가...?). 가입 후 24개월 뒤에 자동 해지된다.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.lguplus.com/mobile/plan/addon/addon-call-msg/LRZ1000144&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;U+스팸전화알림&lt;/a&gt;: 걸려온 전화의 스팸 여부를 확인할 수 있는 서비스(별도 앱 불필요).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.lguplus.com/plan/roaming-addon&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;데이터 로밍 완전 차단&lt;/a&gt;: 해외에서 데이터 사용을 막아주는 서비스. 요즘은 해외여행 시 현지 유심/이심을 주로 쓰기 때문에 혹시 모를 요금 폭탄을 막기 위해 가입해 두는 걸 추천한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;상황에 따라 가입하면 좋은 서비스&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.lguplus.com/mobile/plan/addon/addon-call-msg/Z100001205&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;국제전화수신차단&lt;/a&gt;: 해외 스팸 전화가 싫다면 추천. 나는 종종 해외 전화를 받아야 해서 가입하지 않았다.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.lguplus.com/mobile/plan/addon/addon-call-msg/LRZ0000076&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;국제전화발신차단&lt;/a&gt;: 실수로 국제전화 거는 걸 방지해 준다. 단, 해외에서 한국으로 전화를 걸 수 없게 되므로 주의하자 ⚠️&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.lguplus.com/plan/roaming-addon&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;음성 로밍 차단&lt;/a&gt;: 해외에서 문자, 전화 발신을 막아주는 서비스.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.lguplus.com/plan/roaming-addon&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;로밍 안내 방송&lt;/a&gt;: 전화를 건 사람에게 로밍 중임을 알려주는 서비스.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.lguplus.com/plan/roaming-addon&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;해외 도착 알리미&lt;/a&gt;: 최대 5명에게 해외 도착 사실을 문자로 전송해 주는 서비스.&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;모든 LG U+ 모바일 회원은 &quot;&lt;a href=&quot;https://www.lguplus.com/mobile/plan/addon/addon-call-msg/LRZ0000277&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;스팸 차단&lt;/a&gt;&quot; 부가 서비스에 자동 가입된다. 차단된 문자 메시지는 U+스팸차단 앱에서 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5G 데이터 적극 활용하기 (아이폰)&lt;/h2&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;무제한 요금제를 사용하거나 매달 데이터가 넉넉하게 남는다면, 아이폰 설정을 변경해서 5G 데이터를 적극 활용할 수 있다. 아이폰 설정 &amp;gt; 셀룰러 &amp;gt; 셀룰러 데이터 옵션에서 [데이터 모드] 옵션을 '5G에서 데이터 더 허용'으로 설정해 주자. 그럼 와이파이에 연결되어 있지 않을 때 페이스타임, 동영상 스트리밍 등에 5G 데이터를 사용해서 선명하고 끊김 없는 고품질 콘텐츠를 즐길 수 있다. 다만, 배터리 소모는 조금 더 늘어날 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQotvo/dJMcafSXJSW/Gq30D5pQtn8l6vKAh75Pt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQotvo/dJMcafSXJSW/Gq30D5pQtn8l6vKAh75Pt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQotvo/dJMcafSXJSW/Gq30D5pQtn8l6vKAh75Pt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQotvo%2FdJMcafSXJSW%2FGq30D5pQtn8l6vKAh75Pt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1440&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&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;  [음성 및 데이터] 옵션을 '5G 우선'으로 선택하면, 5G 신호가 잡히는 곳에선 항상 5G로 연결된다. 하지만 신호가 약한 환경에서도 5G 연결을 무리하게 유지하려다 보니 배터리를 10~20% 정도 더 소모할 수 있다. 5G 품질이 좋은 지역이 아니라면 '5G 자동'으로 선택하는 게 여러모로 좋다. 5G 신호가 약할 땐 LTE로 자연스럽게 전환되어 배터리 효율 관리 측면에서 훨씬 유리하기 때문.&lt;/p&gt;</description>
      <category>  Living</category>
      <category>LG유플러스</category>
      <category>가성비요금제</category>
      <category>너겟47</category>
      <category>로밍차단</category>
      <category>무료부가서비스</category>
      <category>번호이동</category>
      <category>아이폰팁</category>
      <category>유플러스</category>
      <category>유플러스부가서비스</category>
      <category>통신사이동</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1339</guid>
      <comments>https://romantech.net/1339#entry1339comment</comments>
      <pubDate>Sun, 25 Jan 2026 18:26:45 +0900</pubDate>
    </item>
    <item>
      <title>[시놀로지 나스] macOS 26 타호 NAS 타임머신 백업 안되는 문제 해결하기</title>
      <link>https://romantech.net/1338</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;macOS 26 타호(Tahoe) 버전부터 나스 타임머신 백업이 계속 실패하는 문제가 발생한다. 백업 디스크 문제인가 싶어서 기존 백업을 모두 삭제하고 초기화해도 여전히 실패했다.&lt;/p&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://discussions.apple.com/thread/256137390&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Apple Support Community&lt;/a&gt; 게시글을 찾아보니 원인은 '한글' 때문이었다. 백업 이미지 볼륨 이름에 한글 같은 비-ASCII 문자가 포함돼 있으면 이를 제대로 인식하지 못하는 문제였던 것. 애플이 공식 업데이트로 수정해 주기 전까지는 아래 방법으로 임시 해결할 수 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/ASCII&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;ASCII(아스키코드)&lt;/a&gt;는 영문 알파벳, 숫자 및 일부 기호를 다루는 가장 기초적인 표준 문자 규격&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결 방법&lt;/h2&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;❶ 파인더(Finder)에서 NAS 백업 폴더 접속. 참고로 &lt;code&gt;CMD&lt;/code&gt; + &lt;code&gt;K&lt;/code&gt; 단축키를 누르면 [서버에 연결] 창이 열린다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1592&quot; data-origin-height=&quot;1194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pxgdu/dJMcacomjQ3/KBvxQaLHUKSthkKpv5jkkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pxgdu/dJMcacomjQ3/KBvxQaLHUKSthkKpv5jkkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pxgdu/dJMcacomjQ3/KBvxQaLHUKSthkKpv5jkkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpxgdu%2FdJMcacomjQ3%2FKBvxQaLHUKSthkKpv5jkkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1592&quot; height=&quot;1194&quot; data-origin-width=&quot;1592&quot; data-origin-height=&quot;1194&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;rarr; 상단 메뉴 [파일] &amp;rarr; 디스크 이미지 열기(단축키: &lt;code&gt;Option&lt;/code&gt; + &lt;code&gt;CMD&lt;/code&gt; + &lt;code&gt;O&lt;/code&gt;) &amp;rarr; 백업 이미지 파일 선택(확장자 &lt;code&gt;*.sparsebundle&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4NsfS/dJMcabpsbJz/YdHATw4pUJnc6Wvk9bQVyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4NsfS/dJMcabpsbJz/YdHATw4pUJnc6Wvk9bQVyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4NsfS/dJMcabpsbJz/YdHATw4pUJnc6Wvk9bQVyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4NsfS%2FdJMcabpsbJz%2FYdHATw4pUJnc6Wvk9bQVyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;1130&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1130&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;rarr; 이름 클릭 &amp;rarr; 한글/특수문자 제거 (예: &lt;code&gt;Mac23의 백업&lt;/code&gt; &amp;rarr; &lt;code&gt;Mac23&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;955&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjsDXP/dJMcajucii3/bDmnAKygOnehYeaQZl4IB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjsDXP/dJMcajucii3/bDmnAKygOnehYeaQZl4IB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjsDXP/dJMcajucii3/bDmnAKygOnehYeaQZl4IB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjsDXP%2FdJMcajucii3%2FbDmnAKygOnehYeaQZl4IB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;955&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;955&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❹ 백업 디스크 추출 후 타임머신 백업 재시도. 디스크를 추출하지 않은 상태에서 백업을 시도하면 시스템이 '사용 중인 볼륨'으로 판단하고 백업을 시작할 수 없으므로 주의하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;레퍼런스&lt;/h2&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;&lt;a href=&quot;https://discussions.apple.com/thread/256137390&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Timemachine Back-up in MacOS 26 (Tahoe) does not work on Synology DS920+ NAS&lt;/a&gt;&lt;/p&gt;</description>
      <category>⌚️ Productivity</category>
      <category>macOS 26</category>
      <category>Nas</category>
      <category>Synology NAS</category>
      <category>Tahoe</category>
      <category>TimeMachine</category>
      <category>나스</category>
      <category>시놀로지 나스</category>
      <category>타임머신 백업</category>
      <category>타임머신 백업실패</category>
      <category>타임머신 한글 오류</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1338</guid>
      <comments>https://romantech.net/1338#entry1338comment</comments>
      <pubDate>Thu, 22 Jan 2026 21:42:33 +0900</pubDate>
    </item>
    <item>
      <title>[OS] 하드 링크, 심볼릭 링크 차이점</title>
      <link>https://romantech.net/1337</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;파일 시스템에서 실제 데이터는 디스크의 &lt;u&gt;데이터 블록&lt;/u&gt;(물리적 디스크 공간)에 저장되고, 파일의 메타데이터(권한/소유자/크기 등)와 데이터 블록의 위치(주소) 정보가 &lt;u&gt;inode&lt;/u&gt;에 저장된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;inode는 약 128바이트 크기의 고정된 구조체로, 파일에 대한 정보를 저장하는 테이블 같은 곳이다. 우리가 보는 파일 이름은 사실 이 inode를 가리키는 하나의 이름일 뿐이다. 하드 링크를 만들면 같은 inode를 가리키는 이름이 하나 더 생기는 셈이다. inode는 링크 카운트를 가지고 있어서 하드 링크를 추가할 때마다 이 카운트가 1씩 증가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;하드 링크 Hard Link&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 하드 링크 생성 명령어
ln &amp;lt;원본 경로&amp;gt; &amp;lt;링크 이름&amp;gt;
# test.txt의 하드 링크 test2.txt 생성
ln test.txt test2.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일한 파일(inode)을 가리키는 또 하나의 &lt;b&gt;이름&lt;/b&gt;. 어느 쪽을 수정하든 같은 데이터 블록이 수정된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 &lt;code&gt;touch test.txt&lt;/code&gt; 파일 1개를 생성하면 새로운 inode 생성 &amp;rarr; 데이터 블록 할당 &amp;rarr; &lt;code&gt;test.txt&lt;/code&gt; 라는 이름이 그 inode를 가리키는 첫 번째 하드 링크가 된다.&lt;/p&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;code&gt;ln test.txt test2.txt&lt;/code&gt; 명령어로 하드 링크를 추가하면 새로운 inode를 생성하지 않고 같은 inode를 가리키는 이름 &lt;code&gt;test2.txt&lt;/code&gt;가 하나 더 생긴다. 이때 inode의 링크 카운트가 2로 증가한다. 파일을 삭제(&lt;code&gt;rm&lt;/code&gt;)하면 실제로는 링크 카운트만 1 감소하고, 카운트가 0이 되어야 inode와 데이터 블록이 실제로 해제된다.&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;디렉토리는 하드 링크를 만들 수 없다(루트는 예외적으로 &lt;code&gt;.&lt;/code&gt;과 &lt;code&gt;..&lt;/code&gt; 보유).&lt;/li&gt;
&lt;li&gt;다른 파일 시스템(파티션)을 넘어서 하드 링크를 만들 수 없다(inode 번호는 파일 시스템마다 독립적).&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;심볼릭 링크 Symbolic Link&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 심볼릭 링크 생성 명령어
ln -s &amp;lt;원본 경로&amp;gt; &amp;lt;링크 이름&amp;gt;
# test.txt를 가리키는 심볼릭 링크 link_to_test.txt 생성
ln -s /home/user/test.txt link_to_test.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원본 파일 경로(예: &lt;code&gt;/home/user/file.txt&lt;/code&gt;)를 문자열로 저장한 &lt;b&gt;파일&lt;/b&gt;. 윈도우의 바로가기와 유사하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;심볼릭 링크에 접근하면 파일 시스템이 저장된 경로로 이동한 후, 해당 파일(하드 링크)을 통해 inode에 접근한다. 만약 원본 파일이 삭제되면 심볼릭 링크는 경로가 끊겨서 무효화되지만, 하드 링크는 여전히 같은 데이터(inode)를 가리키므로 접근/수정이 가능하다.&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;심볼릭 링크는 소프트 링크라고도 불린다.&lt;/li&gt;
&lt;li&gt;심볼릭 링크 자체는 고유한 inode를 가진다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>  Programming</category>
      <category>hard link</category>
      <category>Linux</category>
      <category>soft link</category>
      <category>symbolic link</category>
      <category>리눅스</category>
      <category>소프트 링크</category>
      <category>심볼릭 링크</category>
      <category>운영체제</category>
      <category>파일 시스템</category>
      <category>하드 링크</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1337</guid>
      <comments>https://romantech.net/1337#entry1337comment</comments>
      <pubDate>Sun, 19 Oct 2025 18:06:20 +0900</pubDate>
    </item>
    <item>
      <title>[시놀로지 나스] NAS에 서브넷 라우터 구성하기 (Tailscale 활용)</title>
      <link>https://romantech.net/1336</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Tailscale의 서브넷 라우터 기능을 시놀로지 NAS에 설정하면 Tailscale을 설치할 수 없는 구형 기기도 원격으로 접속할 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;서브넷(Subnet)은 같은 네트워크에 연결된 기기들의 그룹&lt;/b&gt;을 의미한다. 우리가 흔히 사용하는 인터넷 공유기는 통신사(ISP)에서 받은 공인 IP 주소를 이용해, 집 안의 여러 기기가 인터넷을 함께 쓸 수 있도록 별도의 내부 네트워크(사설망)를 구성한다. 이 내부 네트워크에 속한 기기들은 공유기로부터 192.168.1.x 같은 내부 IP 주소를 할당받는데, 192.168.1.x 대역 전체를 하나의 서브넷으로 볼 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;서브넷 라우터(Subnet Router)는 말 그대로 특정 서브넷에 접근할 수 있도록 통로 역할을 하는 장치&lt;/b&gt;다. 시놀로지 NAS를 서브넷 라우터로 설정하면 외부에서 스마트폰이나 노트북으로 Tailscale에 접속했을 때 NAS는 물론 NAS와 같은 서브넷(예: 192.168.1.x)에 있는 다른 모든 기기에도 접근할 수 있다. 예를 들어 공유기 관리자 페이지의 내부 주소가 192.168.1.1 이라면, 어디서든 Tailscale을 통해 해당 주소에 접속할 수 있다.&lt;br /&gt;&lt;br /&gt;Tailscale을 이용하면 서브넷 라우터 설정도 간편하게 할 수 있다. NAS의 로컬 네트워크 정보를 Tailscale 네트워크에 광고(Advertise)하면, 외부 기기들은 이 정보를 바탕으로 로컬 네트워크에 있는 어떤 장치와도 통신할 수 있게 된다. 시놀로지 NAS가 Tailscale 가상 네트워크와 집 안의 로컬 네트워크를 서로 연결해 주는 다리(게이트웨이) 역할을 수행하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;사전 준비&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시놀로지 나스에 Tailscale이 설치되어 있어야 한다 &amp;mdash; &lt;a href=&quot;https://romantech.net/1282&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;참고 포스팅&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;서브넷 라우터를 구성하려면 TUN 설정이 활성화된 상태여야 한다 &amp;mdash; &lt;a href=&quot;https://romantech.net/1335#rp-tun-%ED%99%9C%EC%84%B1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;참고 포스팅&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;IP 포워딩 활성화&lt;/h2&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;먼저 시놀로지 나스에 SSH로 접속한 뒤 관리자 권한을 획득한다. SSH를 처음 사용한다면 &lt;a href=&quot;https://romantech.net/1061#rp-2-%EB%82%98%EC%8A%A4-ssh-%ED%99%9C%EC%84%B1%ED%99%94&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;가이드 포스팅&lt;/a&gt;을 참고하자.&lt;/p&gt;
&lt;pre id=&quot;code_1754800226203&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 나스 SSH 접속 명령어 형식
# 예: myuser@192.168.1.50 -p 2222
ssh [사용자명]@[호스트 주소] -p [포트 번호]

# 관리자 권한 획득 (비밀번호 입력 필요)
sudo -i&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;그런 다음 NAS의 IP 포워딩을 활성화한다. 이렇게 하면 NAS가 라우터처럼 작동하여, 서로 다른 네트워크 인터페이스들의 데이터를 중계(전달)할 수 있게 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1754803068612&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# IPv4 포워딩 설정 추가
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
# IPv6 포워딩 설정 추가
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.conf
# 설정 파일 적용
sysctl -p /etc/sysctl.conf&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;서브넷 네트워크에 광고&lt;/h2&gt;
&lt;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;이제 NAS가 연결된 로컬 네트워크 대역(서브넷)을 Tailscale에게 알려줘야 한다. &lt;b&gt;아래 명령어에서 192.168.1.0/24 부분을 본인의 내부 네트워크 대역에 맞게 수정&lt;/b&gt;한 후 명령어를 입력한다. 현재 사용하는 공유기는 192.168.1.x 형식의 내부 IP를 할당하므로 192.168.1.0/24로 입력했다.&lt;/p&gt;
&lt;pre id=&quot;code_1754803116026&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tailscale set --advertise-routes=192.168.1.0/24&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;(배경지식) IP주소&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 흔히 사용하는 IP 주소(IPv4)는 총 32비트(bit)로 구성되며, 점(.)으로 구분된 4개의 8비트 숫자로 표현한다. 8비트는 0부터 255(11111111)까지의 값을 가질 수 있으므로, IPv4 주소는 0.0.0.0부터 255.255.255.255까지의 범위를 갖는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3rYVM/btsPMMLoENy/UQJ5qGu11fjkdKD7lZ3Agk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3rYVM/btsPMMLoENy/UQJ5qGu11fjkdKD7lZ3Agk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3rYVM/btsPMMLoENy/UQJ5qGu11fjkdKD7lZ3Agk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3rYVM%2FbtsPMMLoENy%2FUQJ5qGu11fjkdKD7lZ3Agk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1448&quot; height=&quot;290&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(배경지식) 서브넷 마스크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;192.168.1.0/24 형식의 주소에서 /24는 서브넷 마스크를 의미한다. 서브넷 마스크는 IP 주소에서 &lt;b&gt;네트워크 영역과 호스트 영역을 구분하는 기준&lt;/b&gt;으로, 앞의 24비트가 네트워크 주소임을 나타낸다. IPv4는 총 32비트이므로 남은 8비트는 호스트 주소로 사용된다.&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;네트워크 영역(Network ID): 해당 네트워크에 속한 기기들이 공통으로 사용하는 고정 주소&lt;/li&gt;
&lt;li&gt;호스트 영역(Host ID): 같은 네트워크 내에서 개별 기기를 구분하기 위한 숫자&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;서브넷 마스크(Subnet Mask) 이름 그대로 네트워크 영역(고정)은 &lt;code&gt;1&lt;/code&gt;로 마스킹하고, 호스트 영역(가변)은 &lt;code&gt;0&lt;/code&gt;으로 마스킹한다고 이해하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;324&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Pyqp3/btsPNGxaG2N/THsvMrFB7IFSYIjHi1a5b1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Pyqp3/btsPNGxaG2N/THsvMrFB7IFSYIjHi1a5b1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Pyqp3/btsPNGxaG2N/THsvMrFB7IFSYIjHi1a5b1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPyqp3%2FbtsPNGxaG2N%2FTHsvMrFB7IFSYIjHi1a5b1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1448&quot; height=&quot;324&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;324&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;호스트 영역에서 0(예: 192.168.1.0)은 &lt;u&gt;네트워크 주소&lt;/u&gt;, 255(예: 192.168.1.255)는 &lt;u&gt;브로드캐스트&lt;/u&gt; 주소로 예약되기 때문에 실질적으로 사용할 수 있는 호스트 주소는 1부터 254까지(예: 192.168.1.1~192.168.1.254) 총 254개가 된다(2⁸-2=254).&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;네트워크 주소: 해당 네트워크 대역(서브넷)의 대표 주소&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;정리하면, 네트워크 대역은 서브넷 마스크를 기준으로 구분된다고 볼 수 있다. 앞에서 서브넷 마스크는 IP 주소에서 어디까지가 네트워크 ID(네트워크 영역)이고, 어디부터가 호스트 ID(개별 장치 식별 영역)인지 결정한다고 했다. 가장 흔히 쓰이는 /24 표기법을 기준으로 IP 주소의 앞 3자리가 네트워크 ID가 된다. 따라서 192.168.1.x와 192.168.0.x는 다른 네트워크 대역이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;/24 처럼 서브넷 마스크를 슬래시와 비트 수로 간결하게 표시하는 방식을 &lt;a href=&quot;https://aws.amazon.com/ko/what-is/cidr/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;CIDR(Classless Inter-Domain Routing) 표기법&lt;/a&gt;이라고 부른다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;서브넷 네트워크 활성화&lt;/h2&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;Tailscale 콘솔 &amp;gt; Machines 페이지를 보면 방금 설정한 시놀로지 NAS 기기에 파란색 &lt;b&gt;Subnets&lt;/b&gt; 배지가 표시된 걸 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2318&quot; data-origin-height=&quot;1124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGtd99/btsPNPtWOlU/Ztfq4kAZygzQ1kdksdnF61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGtd99/btsPNPtWOlU/Ztfq4kAZygzQ1kdksdnF61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGtd99/btsPNPtWOlU/Ztfq4kAZygzQ1kdksdnF61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGtd99%2FbtsPNPtWOlU%2FZtfq4kAZygzQ1kdksdnF61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2318&quot; height=&quot;1124&quot; data-origin-width=&quot;2318&quot; data-origin-height=&quot;1124&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;gt; Edit route settings 클릭 &amp;gt; 서브넷 대역 체크 &amp;gt; Save 버튼을 클릭하면 설정이 완료된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1750&quot; data-origin-height=&quot;1312&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6AZXq/btsPMSkmira/JK93AHO3B2yCKmO7iafEfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6AZXq/btsPMSkmira/JK93AHO3B2yCKmO7iafEfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6AZXq/btsPMSkmira/JK93AHO3B2yCKmO7iafEfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6AZXq%2FbtsPMSkmira%2FJK93AHO3B2yCKmO7iafEfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1750&quot; height=&quot;1312&quot; data-origin-width=&quot;1750&quot; data-origin-height=&quot;1312&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Access Rule 설정 (선택)&lt;/h2&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;&lt;a href=&quot;https://login.tailscale.com/admin/acls/file&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Tailscale 콘솔 &amp;gt; Access control 규칙&lt;/a&gt;을 별도로 수정하지 않았다면 기본적으로 Tailscale 네트워크 내의 모든 장치와 포트에 자유롭게 접근할 수 있다. Tailscale을 혼자 사용한다면 큰 문제가 되지 않지만, 여러 명이 함께 사용한다면 보안을 위해 적절한 규칙을 설정해 주는 게 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 본인이 소유한 디바이스에만 접근할 수 있도록 제한하고, admin 그룹만 서브넷을 포함한 모든 디바이스에 접근할 수 있도록 설정했다.&lt;/p&gt;
&lt;pre id=&quot;code_1754804022441&quot; class=&quot;json&quot; data-ke-language=&quot;json&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;groups&quot;: {
    // admin 그룹 정의
    &quot;group:admin&quot;: [&quot;hello@gmail.com&quot;]
  },

  &quot;tagOwners&quot;: {
    &quot;tag:server&quot;: [&quot;group:admin&quot;]
  },

  &quot;acls&quot;: [
    // Tailnet에 있는 모든 장치들끼리 접근 허용 (기본값)
    // { &quot;action&quot;: &quot;accept&quot;, &quot;src&quot;: [&quot;*&quot;], &quot;dst&quot;: [&quot;*:*&quot;] }

    // 모든 사용자가 자신의 디바이스에만 접근 가능
    {
      &quot;action&quot;: &quot;accept&quot;,
      &quot;src&quot;: [&quot;autogroup:member&quot;],
      &quot;dst&quot;: [&quot;autogroup:self:*&quot;]
    },
    // admin 그룹은 모든 디바이스 접근 가능
    {
      &quot;action&quot;: &quot;accept&quot;,
      &quot;src&quot;: [&quot;group:admin&quot;],
      &quot;dst&quot;: [&quot;*:*&quot;]
    }
  ]

  // ... 생략
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;접속 테스트&lt;/h2&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;서브넷 라우터가 올바르게 구성됐다면 외부에서도 집에 있는 네트워크 장치에 접속할 수 있다. Tailscale이 연결된 기기에서 시놀로지 NAS의 내부 IP 주소(예: 192.168.1.x)로 ping을 보내보자. &lt;i&gt;n bytes from &amp;hellip;&lt;/i&gt; 메시지가 연속적으로 표시된다면 연결이 성공적으로 이루어진 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1754804087715&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ping 192.168.1.2
# PING 192.168.1.2 (192.168.1.2): 56 data bytes
# 64 bytes from 192.168.1.2: icmp_seq=0 ttl=64 time=36.396 ms
# 64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=14.177 ms&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;ASUS Router App은 [WAN을 통한 웹 액세스 사용]을 &lt;code&gt;예&lt;/code&gt;로 설정해야만 외부에서 접속할 수 있지만(로컬 네트워크에선 가능), 서브넷 라우터를 설정했으므로 &lt;code&gt;아니오&lt;/code&gt;로 설정해도 Tailscale이 연결된 상태에서 ASUS Router App에 접속할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;626&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CdOeB/btsPNPtWPix/8G5egdZGyPlIvHJlvfB5p1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CdOeB/btsPNPtWPix/8G5egdZGyPlIvHJlvfB5p1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CdOeB/btsPNPtWPix/8G5egdZGyPlIvHJlvfB5p1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCdOeB%2FbtsPNPtWPix%2F8G5egdZGyPlIvHJlvfB5p1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1512&quot; height=&quot;626&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;626&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;맥북 타임머신&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타임머신 최초 설정 시 백업 디스크를 NAS의 사설 IP 주소(192.168.x.x)로 지정해 두면, OS 라우팅 우선순위에 따라 로컬 네트워크에선 LAN으로 직접 연결돼서 빠른 속도로 백업할 수 있다. 외부에선 Tailscale 서브넷 라우터를 통해 트래픽이 터널링(전용 통로로 전달)되므로 원격 백업도 가능하다. 다만, 원격에선 WireGuard 암호화/캡슐화로 인한 오버헤드와 인터넷 환경 영향으로 속도가 상대적으로 느릴 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;a href=&quot;https://tailscale.com/blog/how-nat-traversal-works&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Tailscale은 최적의 경로를 자동으로 탐색&lt;/a&gt;하여 로컬 네트워크 안에선 LAN 직결(Direct) 연결이 이루어지도록 설계되어 있다. 다만, 로컬 환경이라도 &lt;a href=&quot;https://tailscale.com/docs/features/magicdns&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;MagicDNS&lt;/a&gt;(혹은 Tailscale IP)로 접속하면 트래픽이 WireGuard 터널을 통과하므로, 암호화/복호화 오버헤드가 발생하여 순수 로컬 접속보다는 다소 느려질 수 있다. &lt;br /&gt;&lt;br /&gt;원격 접속 시에는 P2P(Direct) 연결을 우선 시도하며, 방화벽 문제 등으로 실패할 경우에만 &lt;a href=&quot;https://tailscale.com/docs/reference/derp-servers&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;중계 서버(DERP)&lt;/a&gt;를 거친다. 그럼 물리적 거리가 멀어지고 중계 과정이 추가되므로 속도 저하가 발생한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;레퍼런스&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;figure id=&quot;og_1754804122294&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Subnet routers &amp;middot; Tailscale Docs&quot; data-og-description=&quot;Use subnet routers to give devices outside your local network access to services within specific subnets. Extend your private network with Tailscale.&quot; data-og-host=&quot;tailscale.com&quot; data-og-source-url=&quot;https://tailscale.com/kb/1019/subnets#use-your-subnet-routes-from-other-devices&quot; data-og-url=&quot;https://tailscale.com/kb/1019/subnets&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fDIj8/hyZyf248qy/dMMyQKO22J2k3vGzLLgTvk/img.png?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628,https://scrap.kakaocdn.net/dn/U4ZSq/hyZuzoBaGU/nkBxqKzftKaAKNn3pjNMO0/img.png?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628&quot;&gt;&lt;a href=&quot;https://tailscale.com/kb/1019/subnets#use-your-subnet-routes-from-other-devices&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; data-source-url=&quot;https://tailscale.com/kb/1019/subnets#use-your-subnet-routes-from-other-devices&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fDIj8/hyZyf248qy/dMMyQKO22J2k3vGzLLgTvk/img.png?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628,https://scrap.kakaocdn.net/dn/U4ZSq/hyZuzoBaGU/nkBxqKzftKaAKNn3pjNMO0/img.png?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628');&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;Subnet routers &amp;middot; Tailscale Docs&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Use subnet routers to give devices outside your local network access to services within specific subnets. Extend your private network with Tailscale.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;tailscale.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>⌚️ Productivity</category>
      <category>Nas</category>
      <category>subnet</category>
      <category>Subnet router</category>
      <category>Synology NAS</category>
      <category>tailscale</category>
      <category>나스</category>
      <category>네트워크</category>
      <category>서브넷</category>
      <category>서브넷 라우터</category>
      <category>시놀로지 나스</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1336</guid>
      <comments>https://romantech.net/1336#entry1336comment</comments>
      <pubDate>Sun, 10 Aug 2025 15:07:12 +0900</pubDate>
    </item>
    <item>
      <title>[시놀로지 나스] NAS에 설치한 Tailscale 자동 업데이트 설정 방법</title>
      <link>https://romantech.net/1335</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Tailscale은 보통 4주마다 새 버전이 출시되지만 시놀로지(Synology) 패키지 센터는 분기별 한 번 정도로 업데이트가 이뤄지기 때문에 변경사항 반영이 비교적 느린 편이다. 이를 보완하기 위해 스케줄러를 활용하면 매주 또는 원하는 주기마다 Tailscale이 자동으로 갱신되도록 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  아직 Tailscale 패키지를 설치/설정하지 않았다면 &lt;a href=&quot;https://romantech.net/1282&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;이전 포스팅&lt;/a&gt;을 참고하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Tailscale 자동 업데이트&lt;/h2&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;① DSM 제어판 &amp;gt; 작업 스케줄러 &amp;gt; 예약된 작업 &amp;gt; [사용자 정의 스크립트] 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2026&quot; data-origin-height=&quot;778&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nzyxX/btsPHllD4kj/R89V3MSkB9u8HBmjQFBTe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nzyxX/btsPHllD4kj/R89V3MSkB9u8HBmjQFBTe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nzyxX/btsPHllD4kj/R89V3MSkB9u8HBmjQFBTe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnzyxX%2FbtsPHllD4kj%2FR89V3MSkB9u8HBmjQFBTe0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2026&quot; height=&quot;778&quot; data-origin-width=&quot;2026&quot; data-origin-height=&quot;778&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;gt; [작업] 필드에 원하는 이름 입력, [사용자]는 &lt;code&gt;root&lt;/code&gt; 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2028&quot; data-origin-height=&quot;780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZYbfl/btsPHlFWSmG/GZifkqyQ7spk6AhSiSaxF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZYbfl/btsPHlFWSmG/GZifkqyQ7spk6AhSiSaxF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZYbfl/btsPHlFWSmG/GZifkqyQ7spk6AhSiSaxF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZYbfl%2FbtsPHlFWSmG%2FGZifkqyQ7spk6AhSiSaxF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2028&quot; height=&quot;780&quot; data-origin-width=&quot;2028&quot; data-origin-height=&quot;780&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;gt; 원하는 실행 날짜 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2028&quot; data-origin-height=&quot;1061&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RxqXy/btsPEpDgZBU/8mbCik8nzJBxQTUVxPo4n0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RxqXy/btsPEpDgZBU/8mbCik8nzJBxQTUVxPo4n0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RxqXy/btsPEpDgZBU/8mbCik8nzJBxQTUVxPo4n0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRxqXy%2FbtsPEpDgZBU%2F8mbCik8nzJBxQTUVxPo4n0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2028&quot; height=&quot;1061&quot; data-origin-width=&quot;2028&quot; data-origin-height=&quot;1061&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;gt; [사용자 정의 스크립트] 필드에 아래 명령어 입력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20250802_140301.png&quot; data-origin-width=&quot;2028&quot; data-origin-height=&quot;874&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzzEn3/btsPDDB2rKz/wfkbgK1vAKJbky2P0KKovK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzzEn3/btsPDDB2rKz/wfkbgK1vAKJbky2P0KKovK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzzEn3/btsPDDB2rKz/wfkbgK1vAKJbky2P0KKovK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzzEn3%2FbtsPDDB2rKz%2FwfkbgK1vAKJbky2P0KKovK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2028&quot; height=&quot;874&quot; data-filename=&quot;20250802_140301.png&quot; data-origin-width=&quot;2028&quot; data-origin-height=&quot;874&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1754228670574&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tailscale update --yes&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  [실행 상세 정보를 이메일로 보내기] 옵션에 체크하고 이메일 주소를 입력하면 스케줄 실행 후 이메일로 결과를 받아볼 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;TUN 활성&lt;/h2&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;Synology DSM 7 버전부터 보안이 강화되면서 인바운드 연결은 허용하지만, &lt;u&gt;아웃바운드 연결은 기본적으로 차단&lt;/u&gt;된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인바운드&lt;/b&gt; 연결은 외부 장치가 Tailscale 네트워크를 통해 NAS로 들어오는 통신을 의미한다. 외부의 스마트폰이나 노트북에서 NAS의 파일 공유(SMB)나 DSM 관리자 페이지에 접속하는 경우 인바운드에 해당한다. 반대로 &lt;b&gt;아웃바운드&lt;/b&gt;는 NAS 내부의 애플리케이션(Docker 컨테이너, Plex 미디어 서버 등)이 Tailscale 네트워크를 통해 외부 장치로 나가는 통신을 가리킨다. 예를 들어 NAS의 Plex 서버가 Tailscale로 연결된 다른 위치의 Plex 클라이언트로 미디어 콘텐츠를 스트리밍한다면 아웃바운드에 해당된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 제한은 Tailscale 패키지가 TUN 장치를 생성할 권한이 없어서 발생한다. TUN 장치는 VPN 같은 프로그램이 네트워크 트래픽을 처리하기 위해 사용하는 가상의 인터페이스로, 이 장치가 없으면 NAS 내부 애플리케이션이 외부와 통신할 수 있는 경로를 확보하지 못하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  TUN 장치 생성 권한이 없으면 서브넷 라우터 같은 기능도 사용할 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제는 TUN 장치 생성 권한을 부여하면 해결할 수 있다. 하지만 DSM을 재부팅하면 해당 권한 설정이 초기화되기 때문에, 스케줄러를 이용해서 부팅할 때마다 권한을 다시 부여하는 설정이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① Tailscale 패키지 버전이 1.22 이상인지 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2054&quot; data-origin-height=&quot;1150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q2pWU/btsPDGZMA7O/9gFozdBZQJ55hLOI3orjUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q2pWU/btsPDGZMA7O/9gFozdBZQJ55hLOI3orjUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q2pWU/btsPDGZMA7O/9gFozdBZQJ55hLOI3orjUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq2pWU%2FbtsPDGZMA7O%2F9gFozdBZQJ55hLOI3orjUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2054&quot; height=&quot;1150&quot; data-origin-width=&quot;2054&quot; data-origin-height=&quot;1150&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;② DSM 제어판 &amp;gt; 작업 스케줄러 &amp;gt; 트리거 된 작업 &amp;gt; [사용자 정의 스크립트] 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2028&quot; data-origin-height=&quot;790&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7uJ3k/btsPErnBPaS/0JSFocbLTbTHS82KCnmaPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7uJ3k/btsPErnBPaS/0JSFocbLTbTHS82KCnmaPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7uJ3k/btsPErnBPaS/0JSFocbLTbTHS82KCnmaPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7uJ3k%2FbtsPErnBPaS%2F0JSFocbLTbTHS82KCnmaPk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2028&quot; height=&quot;790&quot; data-origin-width=&quot;2028&quot; data-origin-height=&quot;790&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;gt; [작업] 필드에 원하는 이름 입력, [사용자]는 &lt;code&gt;root&lt;/code&gt; 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2028&quot; data-origin-height=&quot;730&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WG6ro/btsPDUwLbNw/OqTXsv3LHEFFJ3KMmoOFbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WG6ro/btsPDUwLbNw/OqTXsv3LHEFFJ3KMmoOFbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WG6ro/btsPDUwLbNw/OqTXsv3LHEFFJ3KMmoOFbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWG6ro%2FbtsPDUwLbNw%2FOqTXsv3LHEFFJ3KMmoOFbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2028&quot; height=&quot;730&quot; data-origin-width=&quot;2028&quot; data-origin-height=&quot;730&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;gt; [사용자 정의 스크립트] 필드에 아래 명령어 입력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20250802_142336.png&quot; data-origin-width=&quot;2028&quot; data-origin-height=&quot;981&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LwHwK/btsPEsUdfX6/IkOO6uGvVoNMTSVjhGqGn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LwHwK/btsPEsUdfX6/IkOO6uGvVoNMTSVjhGqGn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LwHwK/btsPEsUdfX6/IkOO6uGvVoNMTSVjhGqGn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLwHwK%2FbtsPEsUdfX6%2FIkOO6uGvVoNMTSVjhGqGn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2028&quot; height=&quot;981&quot; data-filename=&quot;20250802_142336.png&quot; data-origin-width=&quot;2028&quot; data-origin-height=&quot;981&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1754228911278&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/var/packages/Tailscale/target/bin/tailscale configure-host; synosystemctl restart pkgctl-Tailscale.service&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Tailscale 업데이트 + TUN 활성 스크립트&lt;/h2&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;Tailscale 패키지를 업데이트하면 TUN 설정도 함께 초기화된다. 업데이트할 때마다 매번 TUN을 수동으로 활성화하기 번거롭기 때문에 패키지 업데이트와 TUN 활성화를 함께 처리하는 스크립트를 만들어 두고 스케줄러에 등록하면 더 편리하다.&lt;/p&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;a href=&quot;https://romantech.net/1061#rp-2-%EB%82%98%EC%8A%A4-ssh-%ED%99%9C%EC%84%B1%ED%99%94&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;가이드 링크&lt;/a&gt; 참고)&lt;/p&gt;
&lt;pre id=&quot;code_1754229083196&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 나스 SSH 접속 명령어 형식
# 예: myuser@192.168.1.50 -p 2222
ssh [사용자명]@[호스트 주소] -p [포트 번호]&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_1754229166369&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 명령어를 입력하면 DSM 비밀번호를 물어보는 프롬프트가 나온다
sudo -i&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;code&gt;~/.scripts&lt;/code&gt; 폴더에 &lt;code&gt;update_tailscale.sh&lt;/code&gt; 파일 생성 후 편집기 열기&lt;/p&gt;
&lt;pre id=&quot;code_1754229228047&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 파일 생성 후 편집기를 여는 명령어
mkdir -p ~/.scripts &amp;amp;&amp;amp; vi ~/.scripts/update_tailscale.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;④ &lt;code&gt;i&lt;/code&gt; 눌러서 편집 모드로 진입 &amp;rarr; 아래 내용 복사/붙여 넣기 &amp;rarr; ESC 누른 후 &lt;code&gt;:wq&lt;/code&gt; 입력해서 저장/편집기 종료&lt;/p&gt;
&lt;pre id=&quot;code_1754229316966&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#!/bin/sh

# Tailscale 실행 파일의 전체 경로를 변수로 지정
TAILSCALE_BIN=&quot;/var/packages/Tailscale/target/bin/tailscale&quot;

# 업데이트 전 Tailscale 버전 확인
version_before=$($TAILSCALE_BIN version | head -n 1)

# 업데이트 시도 (--yes 플래그로 자동 동의)
$TAILSCALE_BIN update --yes

# 업데이트 후 Tailscale 버전 다시 확인
version_after=$($TAILSCALE_BIN version | head -n 1)

# 두 버전이 다른지 비교
if [ &quot;$version_before&quot; != &quot;$version_after&quot; ]; then
  # 버전이 다르다면, 업데이트가 성공한 것이므로 후속 명령어 실행
  echo &quot;Tailscale이 $version_before 에서 $version_after 버전으로 업데이트되었습니다.&quot;
  echo &quot;TUN 활성화를 실행합니다...&quot;

  $TAILSCALE_BIN configure-host
  synosystemctl restart pkgctl-Tailscale.service

  echo &quot;작업이 완료되었습니다.&quot;

fi&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_1754229343897&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 실행 권한 추가 명령어
chmod +x /root/.scripts/update_tailscale.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;⑥ &lt;code&gt;/root/.scripts/update_tailscale.sh&lt;/code&gt; 명령어 입력해서 스크립트 실행 테스트&lt;/p&gt;
&lt;pre id=&quot;code_1754229385287&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 로그 출력 예시
already running stable version 1.86.2; no update needed&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;⑦ TUN 활성 스케줄러의 [사용자 정의 스크립트] 경로 변경&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20250802_172121.png&quot; data-origin-width=&quot;2026&quot; data-origin-height=&quot;874&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/duOCaU/btsPEtr7Ar8/cEFzWDh8apfzcakNYy8f80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/duOCaU/btsPEtr7Ar8/cEFzWDh8apfzcakNYy8f80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/duOCaU/btsPEtr7Ar8/cEFzWDh8apfzcakNYy8f80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FduOCaU%2FbtsPEtr7Ar8%2FcEFzWDh8apfzcakNYy8f80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2026&quot; height=&quot;874&quot; data-filename=&quot;20250802_172121.png&quot; data-origin-width=&quot;2026&quot; data-origin-height=&quot;874&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1754229430581&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/root/.scripts/update_tailscale.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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;레퍼런스&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;figure id=&quot;og_1754231685068&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Access Synology NAS from anywhere &amp;middot; Tailscale Docs&quot; data-og-description=&quot;Install Tailscale on your Synology device. Use this guide to get secure access to your Synology NAS from anywhere.&quot; data-og-host=&quot;tailscale.com&quot; data-og-source-url=&quot;https://tailscale.com/kb/1131/synology&quot; data-og-url=&quot;https://tailscale.com/kb/1131/synology&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Ia6RX/hyZvmnLGET/4WO17XtHrBbz4F5gnQIhsK/img.png?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628,https://scrap.kakaocdn.net/dn/dva4L8/hyZuGNvHk4/CbIB4sf5fjGkKczvXm5fn1/img.png?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628,https://scrap.kakaocdn.net/dn/M7xcq/hyZvqjpBuI/EkzbZceQk2NPy9jYhX5uRK/img.png?width=1080&amp;amp;height=568&amp;amp;face=0_0_1080_568&quot;&gt;&lt;a href=&quot;https://tailscale.com/kb/1131/synology&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; data-source-url=&quot;https://tailscale.com/kb/1131/synology&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Ia6RX/hyZvmnLGET/4WO17XtHrBbz4F5gnQIhsK/img.png?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628,https://scrap.kakaocdn.net/dn/dva4L8/hyZuGNvHk4/CbIB4sf5fjGkKczvXm5fn1/img.png?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628,https://scrap.kakaocdn.net/dn/M7xcq/hyZvqjpBuI/EkzbZceQk2NPy9jYhX5uRK/img.png?width=1080&amp;amp;height=568&amp;amp;face=0_0_1080_568');&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;Access Synology NAS from anywhere &amp;middot; Tailscale Docs&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Install Tailscale on your Synology device. Use this guide to get secure access to your Synology NAS from anywhere.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;tailscale.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>⌚️ Productivity</category>
      <category>Mesh network</category>
      <category>Nas</category>
      <category>Synology NAS</category>
      <category>tailscale</category>
      <category>VPN</category>
      <category>나스</category>
      <category>스케줄러</category>
      <category>시놀로지</category>
      <category>시놀로지 나스</category>
      <category>작업 스케줄러</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1335</guid>
      <comments>https://romantech.net/1335#entry1335comment</comments>
      <pubDate>Sun, 3 Aug 2025 23:43:16 +0900</pubDate>
    </item>
    <item>
      <title>작은 크기의 소음없는 최고의 가성비 UPS - WalleCube</title>
      <link>https://romantech.net/1334</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;24시간 내내 작동하는 나스(NAS)에 중요한 자료를 저장해 두고 사용한다면, 예기치 못한 정전이나 불안정한 전력 상황으로부터 데이터를 보호하기 위해 UPS 사용을 적극 권장한다. UPS(Uninterruptible Power Supply, 무정전 전원 공급장치)는 내부에 배터리를 탑재하여 비상 전원을 공급해 주는 장치다. 일종의 외장 배터리라고 보면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UPS는 단순히 전원을 유지하는 데 그치지 않고, NAS가 시스템을 안전하게 종료할 수 있도록 시간적 여유를 제공한다는 장점이 있다. NAS를 UPS에 연결해 두면 정전이 발생했을 때 모든 작업을 마친 뒤 자동으로 전원을 종료하도록 설정할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하드디스크는 고속으로 회전하는 플래터 위를 미세한 간격으로 헤드가 움직이는 정밀한 기계장치로, 갑작스러운 전원 차단에 매우 취약하다. UPS 없이 전원이 꺼지면 데이터 기록 중 헤드가 플래터에 충돌하거나 파일 시스템이 손상되어 데이터를 영구적으로 잃을 수 있다. UPS는 단순한 주변기기가 아닌, 데이터를 지키기 위한 필수적인 안전장치라고 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UPS는 용량, 배터리 종류, 브랜드, 기능에 따라 가격이 천차만별이다. 일반적으로 보급형 7~15만 원, 중급형 15만 원~30만 원, 고급형 30만 원 이상으로 형성되어 있으며, 대표적인 브랜드로 델타(Delta), 이튼(Eaton), APC 등이 있다. 가정용으로 사용할 경우 보급형으로도 충분하지만 대부분 납축(Lead-Acid) 배터리를 사용하기 때문에 충격에 약하고 폭발 위험이 있으며 수명도 300~500회 충방전으로 짧은 편이다. 반면 리튬인산철(LFP) 배터리는 2,000회 이상 충방전이 가능하고 납축 배터리보다 가벼우면서 부피 또한 작다. 아쉽게도 리튬인산철은 대부분 중&amp;middot;고급형 모델에서만 사용한다.&lt;/p&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.wallecube.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;WalleCube(瓦力盒子)&lt;/a&gt;라는 중국의 가성비 좋은 UPS 제품을 영입하여 매우 만족스럽게 사용하고 있다. 이번 포스팅에는 이 제품의 주요 특징과 설정 방법을 소개해 보려고 한다. &lt;u&gt;작은 크기, 무소음, 리튬인산철 배터리, 전력 대시보드 및 알림 지원(via 위챗), WOL 지원(Wake-on-LAN), 5만 원대 저렴한 가격&lt;/u&gt; 등 장점이 정말 많은 제품이다. 중국 내 커뮤니티에서도 좋은 평가를 받고 있다. 중국어에 대한 거부감이 없거나 중국어가 가능하다면 강력 추천한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wallecube-w120.JPG&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wXg0S/btsPCkNXEKB/rkPSs1nfaNIEnDaiZJdWg1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wXg0S/btsPCkNXEKB/rkPSs1nfaNIEnDaiZJdWg1/img.jpg&quot; data-alt=&quot;시놀로지 나스 DS218+ 위에 올려둔 WalleCube W120 UPS. 아담한 사이즈로 부담없이 배치할 수 있다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wXg0S/btsPCkNXEKB/rkPSs1nfaNIEnDaiZJdWg1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwXg0S%2FbtsPCkNXEKB%2FrkPSs1nfaNIEnDaiZJdWg1%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;3024&quot; height=&quot;4032&quot; data-filename=&quot;wallecube-w120.JPG&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;시놀로지 나스 DS218+ 위에 올려둔 WalleCube W120 UPS. 아담한 사이즈로 부담없이 배치할 수 있다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;제품 스펙&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TV9Q2/btsPAWt0hzc/jj2lezTO3ubBRRqdaWkHSK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TV9Q2/btsPAWt0hzc/jj2lezTO3ubBRRqdaWkHSK/img.jpg&quot; data-alt=&quot;WalleCube W120 UPS 외관. 이미지 출처 WalleCube&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TV9Q2/btsPAWt0hzc/jj2lezTO3ubBRRqdaWkHSK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTV9Q2%2FbtsPAWt0hzc%2Fjj2lezTO3ubBRRqdaWkHSK%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;2000&quot; height=&quot;1136&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1136&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;WalleCube W120 UPS 외관. 이미지 출처 WalleCube&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;내가 사용 중인 Synology DS218+ 모델은 공식적으로 액세스(데이터 읽기/쓰기) 상태일 때 17.23W, 절전 모드일 때 5.4W 전력 소비량을 가진다. W120 UPS는 액세스 상태를 기준으로 약 3시간 정도 사용할 수 있는 넉넉한 배터리 용량을 제공한다.&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;모델명: W120 (다음 모델인 W150 나온 상태)&lt;/li&gt;
&lt;li&gt;전압: 9V-20V&lt;/li&gt;
&lt;li&gt;전류: 2A-10A&lt;/li&gt;
&lt;li&gt;최대 출력: 120W&lt;/li&gt;
&lt;li&gt;대기 전력: 0.6W&lt;/li&gt;
&lt;li&gt;배터리 용량: 57.6Wh (12V 기준 약 4800mAh)&lt;/li&gt;
&lt;li&gt;배터리 유형: 리튬 인산철 (2000회 이상 충방전)&lt;/li&gt;
&lt;li&gt;작동 온도: 0-40℃&lt;/li&gt;
&lt;li&gt;디스플레이: 1.47인치 TFT&lt;/li&gt;
&lt;li&gt;크기: 120x104x40 (mm)&lt;/li&gt;
&lt;li&gt;중량: 722g&lt;/li&gt;
&lt;li&gt;인터넷 연결 방식: 2.4G 와이파이&lt;/li&gt;
&lt;li&gt;네트워크 설정 방식: 블루투스&lt;/li&gt;
&lt;li&gt;지원 NAS 브랜드: 시놀로지, 유그린, 테라마스터, QNAP 등&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주요 특징&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ups-dashboard.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MOxaD/btsPCIWzhub/VREVp7KLSQnR3kaXiizFL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MOxaD/btsPCIWzhub/VREVp7KLSQnR3kaXiizFL0/img.png&quot; data-alt=&quot;WalleCube UPS 위챗 대시보드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MOxaD/btsPCIWzhub/VREVp7KLSQnR3kaXiizFL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMOxaD%2FbtsPCIWzhub%2FVREVp7KLSQnR3kaXiizFL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1440&quot; data-filename=&quot;ups-dashboard.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;WalleCube UPS 위챗 대시보드&lt;/figcaption&gt;
&lt;/figure&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;기존 어댑터에 연결해서 사용&lt;/li&gt;
&lt;li&gt;무소음 작동 (팬리스 설계)&lt;/li&gt;
&lt;li&gt;배터리 전환 지연 시간 5ms (W150 모델은 1ms)&lt;/li&gt;
&lt;li&gt;전력 대시보드 (위챗)&lt;/li&gt;
&lt;li&gt;WOL 지원 (위챗)&lt;/li&gt;
&lt;li&gt;배터리 모드 진입 알림 (위챗)&lt;/li&gt;
&lt;li&gt;배터리 온도 모니터링 (W150 모델)&lt;/li&gt;
&lt;li&gt;배터리 헬스 체크 (W150 모델)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;커넥터 연결&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;973&quot; data-origin-height=&quot;622&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boLfXR/btsPCRS6I8L/pJ1n1ZN4xeUnOK7sjK2L7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boLfXR/btsPCRS6I8L/pJ1n1ZN4xeUnOK7sjK2L7K/img.png&quot; data-alt=&quot;DC5521 키트 연결 방법. 이미지 출처 WalleCube&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boLfXR/btsPCRS6I8L/pJ1n1ZN4xeUnOK7sjK2L7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboLfXR%2FbtsPCRS6I8L%2FpJ1n1ZN4xeUnOK7sjK2L7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;973&quot; height=&quot;622&quot; data-origin-width=&quot;973&quot; data-origin-height=&quot;622&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DC5521 키트 연결 방법. 이미지 출처 WalleCube&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;WalleCube는 기존 어댑터를 이용해 전원을 공급하기 때문에 사용 중인 NAS 모델에 맞는 옵션을 선택해야 한다. 나는 시놀로지 DS218+ 제품을 사용하고 있어서 DC5521 키트 옵션으로 구매했다. DC5521 키트는 UPS 본체, USB 케이블, 커넥터 2개로 구성돼 있으며 아래 순서로 연결한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;기존 사용하고 있는 나스 어댑터에 DC5521 Female to DC5525 Male 커넥터 연결&lt;/li&gt;
&lt;li&gt;UPS 본체에 DC5521 Female to DC5525 Male 커넥터 연결&lt;/li&gt;
&lt;li&gt;UPS ⇄ NAS에 DC5525 Male to DC5521 Male 커넥터 연결&lt;/li&gt;
&lt;li&gt;UPS ⇄ NAS에 USB 케이블 연결&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;참고로 시놀로지 DS4xx, DS7xx, DS9xx 시리즈는 4핀 커넥터 키트로 구매해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기기 연동&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;device-pairing.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRz5w9/btsPBk3rrl8/lbcbIcRE6Sb9rFucZBmzpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRz5w9/btsPBk3rrl8/lbcbIcRE6Sb9rFucZBmzpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRz5w9/btsPBk3rrl8/lbcbIcRE6Sb9rFucZBmzpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRz5w9%2FbtsPBk3rrl8%2FlbcbIcRE6Sb9rFucZBmzpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1440&quot; data-filename=&quot;device-pairing.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;UPS 전원 켜고 화면 켜질 때까지 대기&lt;/li&gt;
&lt;li&gt;UPS 전원 버튼 3초 누르면 QR 코드 표시&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wxaurl.cn/VNrySXl38cq&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;위챗 WalleCube 미니앱(瓦力电源小程序)&lt;/a&gt; 회원가입/로그인&lt;/li&gt;
&lt;li&gt;우측 상단 &amp;oplus; 버튼(위 이미지 ❶번) &amp;rarr; UPS 화면상에 표시된 QR 스캔해서 기기 연동&lt;/li&gt;
&lt;li&gt;블루투스 연결 (위 이미지 ❷번 连接蓝牙 버튼)&lt;/li&gt;
&lt;li&gt;2.4G 와이파이 연결 (위 이미지 ❸번 设置WiFi 버튼)&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;h2 data-ke-size=&quot;size26&quot;&gt;나스 설정 (시놀로지 기준)&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;DSM &amp;gt; 제어판 &amp;gt; 하드웨어 및 전원 &amp;gt; 일반 탭&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[전원 공급 문제가 해결되면 자동으로 다시 시작]은 UPS가 배터리 모드에서 AC 모드로 전환될 때 NAS가 자동으로 켜지도록 하는 기능이다. [LAN에서 WOL 활성화]는 네트워크를 통해 원격으로 NAS를 켤 수 있는 기능이다. 이 두 옵션을 모두 활성화하면, 정전 후 전원이 복구될 때 NAS가 자동으로 부팅되고, 필요할 때마다 원격으로 시스템을 시작할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2028&quot; data-origin-height=&quot;1340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/quyXN/btsPCoqeca0/10IkXKIKODICDTeT4S1O91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/quyXN/btsPCoqeca0/10IkXKIKODICDTeT4S1O91/img.png&quot; data-alt=&quot;제어판 &amp;amp;rarr; 하드웨어 및 전원 &amp;amp;rarr; 일반 탭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/quyXN/btsPCoqeca0/10IkXKIKODICDTeT4S1O91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FquyXN%2FbtsPCoqeca0%2F10IkXKIKODICDTeT4S1O91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2028&quot; height=&quot;1340&quot; data-origin-width=&quot;2028&quot; data-origin-height=&quot;1340&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;제어판 &amp;rarr; 하드웨어 및 전원 &amp;rarr; 일반 탭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;DSM &amp;gt; 제어판 &amp;gt; 하드웨어 및 전원 &amp;gt; UPS 탭&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[시간 사용자 지정]은 정전 발생 시 설정한 시간만큼 기다린 후 시스템을 대기 모드로 전환시키는 기능이다. 일반적으로 5~10분 사이로 설정하는 것을 권장한다. 예를 들어 5분으로 설정하면 정전 발생 5분 후 NAS가 대기 모드로 진입한다. UPS 배터리 잔량이 매우 낮을 경우 설정한 시간과 관계없이 즉시 대기 모드로 전환될 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2030&quot; data-origin-height=&quot;1340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6Z0l0/btsPDYcTtHi/gKaHMx3SJYv5UvH5dAk9Bk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6Z0l0/btsPDYcTtHi/gKaHMx3SJYv5UvH5dAk9Bk/img.png&quot; data-alt=&quot;제어판 &amp;amp;rarr; 하드웨어 및 전원 &amp;amp;rarr; UPS 탭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6Z0l0/btsPDYcTtHi/gKaHMx3SJYv5UvH5dAk9Bk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6Z0l0%2FbtsPDYcTtHi%2FgKaHMx3SJYv5UvH5dAk9Bk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2030&quot; height=&quot;1340&quot; data-origin-width=&quot;2030&quot; data-origin-height=&quot;1340&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;제어판 &amp;rarr; 하드웨어 및 전원 &amp;rarr; UPS 탭&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;참고로 [네트워크 UPS 서버 활성화]는 하나의 UPS로 여러 대의 시놀로지 NAS 전원을 관리하는 기능이다. UPS에 직접 연결된 NAS 한 대를 '서버'로 지정하면, 같은 네트워크에 있는 다른 NAS들이 이 서버로부터 UPS 상태 정보를 받아 정전 시 안전하게 종료 절차를 수행할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;전원 어댑터 설정 ⚡️&lt;/h2&gt;
&lt;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;먼저 UPS에 연결한 어댑터의 정격 출력을 확인해야 한다. 보통 OUTPUT이라고 적혀 있는 부분에 전압(V)과 전류(A)가 표기되어 있다. 나는 12V 5A로 총 60W(12V&amp;times;5A) 출력을 지원하는 어댑터를 사용하고 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;nas-adapter.png&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;844&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgjdI3/btsPDocffqv/dh8uHeM7kVdqRQsXEdTlq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgjdI3/btsPDocffqv/dh8uHeM7kVdqRQsXEdTlq1/img.png&quot; data-alt=&quot;전압 12V 전류 5A 어댑터 참고용 이미지 via 이베이&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgjdI3/btsPDocffqv/dh8uHeM7kVdqRQsXEdTlq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgjdI3%2FbtsPDocffqv%2Fdh8uHeM7kVdqRQsXEdTlq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1400&quot; height=&quot;844&quot; data-filename=&quot;nas-adapter.png&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;844&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;전압 12V 전류 5A 어댑터 참고용 이미지 via 이베이&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;a href=&quot;https://wxaurl.cn/VNrySXl38cq&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;위챗 WalleCube 미니앱&lt;/a&gt; &amp;gt; 连接蓝牙 버튼을 눌러 블루투스에 연결한다. 연결이 완료되면 高级配置(고급 설정) &amp;gt; 电源适配器设置(전원 어댑터 설정) 페이지로 이동하여 전압과 전류를 각각 입력해 준다. 잘못 입력하면 UPS가 충전되지 않거나 NAS에 손상을 줄 수 있으므로 주의하자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;power-adapter-settings.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dg37hn/btsPDFEQGf5/rAwoFEPXRWz5rK3OFNOhPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dg37hn/btsPDFEQGf5/rAwoFEPXRWz5rK3OFNOhPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dg37hn/btsPDFEQGf5/rAwoFEPXRWz5rK3OFNOhPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdg37hn%2FbtsPDFEQGf5%2FrAwoFEPXRWz5rK3OFNOhPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1440&quot; data-filename=&quot;power-adapter-settings.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;电源适配器电压: 전원 어댑터 전압(V)&lt;/li&gt;
&lt;li&gt;电源适配器电流: 전원 어댑터 전류(A)&lt;/li&gt;
&lt;li&gt;断电判断电压: 정전 여부 판단 전압(A). 입력한 전압보다 낮아지면 정전으로 간주하고 배터리 모드로 전환된다. 전압값 변경 시 자동으로 입력되며, 전압의 90% 수준으로 설정하는 걸 권장한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;무출력 절전 시간 설정&lt;/h2&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;&lt;a href=&quot;https://wxaurl.cn/VNrySXl38cq&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;위챗 WalleCube 미니앱&lt;/a&gt; &amp;gt; 高级配置(고급 설정) &amp;gt; 无输出休眠时间配置(무출력 절전 시간 설정) 페이지에서 무출력 절전 시간과 임계 전류를 설정할 수 있다. 기본값으로 두고 사용해도 무방하지만, NAS 외에 다른 기기도 UPS에 연결하여 사용한다면 설정값을 적절하게 조절해 주는 것이 좋다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;no-output-sleep-time.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZz1pY/btsPCkPcdMF/14DKlQ1WmkkWgXRk4A3F10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZz1pY/btsPCkPcdMF/14DKlQ1WmkkWgXRk4A3F10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZz1pY/btsPCkPcdMF/14DKlQ1WmkkWgXRk4A3F10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZz1pY%2FbtsPCkPcdMF%2F14DKlQ1WmkkWgXRk4A3F10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1440&quot; data-filename=&quot;no-output-sleep-time.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&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;h4 data-ke-size=&quot;size20&quot;&gt;无输出休眠时间 무출력 절전 시간&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⚙️ 기본값 300(초) | 설정 범위 31~3600(초)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UPS 출력 전류가 일정 기준(기본값 150 mA) 미만인 상태로 &lt;u&gt;설정한 시간&lt;/u&gt; 동안 지속되면, UPS는 출력을 멈추고 절전 모드로 전환된다. 이후 전력이 복구되면 UPS가 다시 켜져서 NAS에 전원을 공급하고, WOL 설정을 해뒀다면 NAS도 자동으로 부팅된다. 일반적인 정전 시나리오는 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;정전 발생 &amp;rarr; UPS 배터리로 NAS에 전원 공급&lt;/li&gt;
&lt;li&gt;NAS 설정에 의해 일정 시간 이후 자동 종료(대기 모드)&lt;/li&gt;
&lt;li&gt;UPS 출력 전류가 임계값 미만으로 감소&lt;/li&gt;
&lt;li&gt;설정한 시간 동안 출력 전류가 낮은 상태로 유지되면 UPS가 절전 모드로 진입&lt;/li&gt;
&lt;li&gt;이후 다시 전기 공급되면 UPS 켜짐 &amp;rarr; NAS에 전원 공급 &amp;rarr; NAS 자동 재시작&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;无输出休眠最大电流 무출력 절전 임계 전류&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⚙️ 기본값 150(mA) | 설정 범위 50~1000(mA)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UPS 출력이 &lt;u&gt;설정한 전류값 이상&lt;/u&gt;이면 절전 모드로 전환되지 않는다. NAS 외에 공유기 같은 다른 장치를 함께 연결한 경우, 정전 시 NAS는 종료되더라도 다른 장치의 출력 전류로 인해 UPS가 절전 모드에 진입하지 못한다. 이럴 때는 NAS를 제외한 다른 장치들의 소비 전력보다 임계값을 높게 설정해 두면 문제를 해결할 수 있다. UPS가 절전 모드로 전환되지 못하는 시나리오는 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;NAS와 공유기를 UPS에 함께 연결해서 사용&lt;/li&gt;
&lt;li&gt;정전 발생 &amp;rarr; NAS는 자동 종료되지만, 공유기는 계속 켜진 상태&lt;/li&gt;
&lt;li&gt;공유기 소비 전력 때문에 총 출력 전류가 임계값(150mA) 이하로 감소하지 않음&lt;/li&gt;
&lt;li&gt;UPS가 절전 모드로 진입하지 못해서 배터리 소진 후 종료&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;  150 mA(밀리암페어)는 0.15A(암페어), 전압이 12V라면 0.15A &amp;times; 12V = 1.8W&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;화면 절전 시간 설정&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;screen-sleep-time.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bykcGa/btsPB7bm6kc/4rXRemcJvpsNFxmQBIFYBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bykcGa/btsPB7bm6kc/4rXRemcJvpsNFxmQBIFYBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bykcGa/btsPB7bm6kc/4rXRemcJvpsNFxmQBIFYBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbykcGa%2FbtsPB7bm6kc%2F4rXRemcJvpsNFxmQBIFYBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1440&quot; data-filename=&quot;screen-sleep-time.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&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;UPS 본체의 화면은 기본적으로 5분(300초) 후에 꺼진다. &lt;a href=&quot;https://wxaurl.cn/VNrySXl38cq&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;위챗 WalleCube 미니앱&lt;/a&gt; &amp;gt; 高级配置(고급 설정) &amp;gt; 屏幕休眠时间(화면 절전 시간) 설정 페이지에서 30~36000초 사이의 화면 꺼짐 시간을 조정할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;WOL 기능 활성&lt;/h2&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;나스가 WOL 기능을 지원하고 UPS와 동일한 네트워크에 연결돼 있다면 원격으로 나스를 켤 수 있다. UPS 대시보드에서 자동 부팅(自动开机)으로 설정해 두면, 정전 후 전원이 복구될 때 UPS가 지정한 MAC 주소로 WOL 신호를 전송한다. 다만 WOL은 신호 수신 여부를 확인하지 않는 단방향 명령(UDP)이므로 부팅 성공을 100% 보장하지는 않는다. NAS가 켜지지 않을 경우 수동 부팅(手动开机)으로 여러 차례 다시 시도해 보자. &lt;br /&gt;&lt;br /&gt;시놀로지 나스 제어판 &amp;gt; 정보 센터 &amp;gt; 네트워크 탭 &amp;gt; MAC 주소를 복사한 후, &lt;a href=&quot;https://wxaurl.cn/VNrySXl38cq&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;위챗 WalleCube 미니앱&lt;/a&gt; &amp;gt; 远程开机(원격 부팅) &amp;gt; 自动开机(자동 부팅) 탭에서 복사한 MAC 주소를 붙여넣으면 설정이 완료된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2028&quot; data-origin-height=&quot;996&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csftLg/btsPDNQdjpe/e39VEx0giCCb6L6JujacK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csftLg/btsPDNQdjpe/e39VEx0giCCb6L6JujacK1/img.png&quot; data-alt=&quot;시놀로지 나스 MAC 주소 복사&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csftLg/btsPDNQdjpe/e39VEx0giCCb6L6JujacK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsftLg%2FbtsPDNQdjpe%2Fe39VEx0giCCb6L6JujacK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2028&quot; height=&quot;996&quot; data-origin-width=&quot;2028&quot; data-origin-height=&quot;996&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;시놀로지 나스 MAC 주소 복사&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;auto-wol.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Oe23t/btsPB04qkaH/KMDZBoPazJWxWCBeKqIfq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Oe23t/btsPB04qkaH/KMDZBoPazJWxWCBeKqIfq1/img.png&quot; data-alt=&quot;복사한 MAC 주소를 UPS 위챗 대시보드에 등록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Oe23t/btsPB04qkaH/KMDZBoPazJWxWCBeKqIfq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOe23t%2FbtsPB04qkaH%2FKMDZBoPazJWxWCBeKqIfq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1440&quot; data-filename=&quot;auto-wol.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;복사한 MAC 주소를 UPS 위챗 대시보드에 등록&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;다중 장치 연결&lt;/h2&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;  UPS 입력 단자에는 전원 공급용 어댑터 하나만 연결할 수 있지만, 출력 단자를 통해 전압이 동일한 기기(공유기, NAS 등)를 여러 대 연결하여 동시에 전원을 공급할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;UPS에서 사용하는 어댑터와 전압이 같다면&lt;/u&gt; 공유기 등 다른 기기를 UPS에 연결해서 함께 사용할 수 있다(UPS에 연결할 커넥터가 필요할 수 있음). &lt;u&gt;이때 UPS 어댑터의 출력은 연결하려는 모든 장치의 원래 어댑터 출력의 합보다 커야 한다.&lt;/u&gt; ⚠️ 전압이 다르면 어떤 경우에도 함께 사용할 수 없으므로 주의하자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ac1900-adapter.webp&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;1143&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LhPBN/btsPDmetzri/pNKHwvYXldrl9X2B3gZC70/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LhPBN/btsPDmetzri/pNKHwvYXldrl9X2B3gZC70/img.webp&quot; data-alt=&quot;현재 사용 중인 나스 어댑터 전압은 12V인 반면 공유기 어댑터 전압은 19V여서 공유기는 UPS에 연결해서 사용할 수 없다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LhPBN/btsPDmetzri/pNKHwvYXldrl9X2B3gZC70/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLhPBN%2FbtsPDmetzri%2FpNKHwvYXldrl9X2B3gZC70%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;1143&quot; data-filename=&quot;ac1900-adapter.webp&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;1143&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;현재 사용 중인 나스 어댑터 전압은 12V인 반면 공유기 어댑터 전압은 19V여서 공유기는 UPS에 연결해서 사용할 수 없다&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;예를 들어 나스 전류가 5A, 공유기 전류가 2A라면 어댑터는 최소 7A 이상의 전류를 공급할 수 있어야 한다. 전압이 12V이면 최대 출력은 7A &amp;times; 12 = 84W이므로, UPS의 최대 출력(120W)보다 작아서 여유롭게 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;위챗 알림 설정&lt;/h2&gt;
&lt;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;UPS가 &lt;a href=&quot;https://wxaurl.cn/VNrySXl38cq&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;위챗 WalleCube 미니앱&lt;/a&gt;에 연동된 상태에서, &lt;a href=&quot;https://mp.weixin.qq.com/mp/profile_ext?action=home&amp;amp;__biz=MzkyMzY0OTY5MQ==&amp;amp;scene=124#wechat_redirect&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;WalleCube 위챗 공식 계정(瓦力电源公众号)&lt;/a&gt;을 팔로우하면 배터리/AC 모드 전환, 전력 사용량, UPS 오프라인 상태에 대한 실시간 알림을 받을 수 있다. 알림은 WalleCube 공식 계정을 통해 전달된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ups-notification-2.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWx1BU/btsPCJ83Bc8/x5rhiEBV653GCk4cBNZtdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWx1BU/btsPCJ83Bc8/x5rhiEBV653GCk4cBNZtdK/img.png&quot; data-alt=&quot;배터리 모드 전환 실시간 알림 예시. 중국어만 지원한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWx1BU/btsPCJ83Bc8/x5rhiEBV653GCk4cBNZtdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWx1BU%2FbtsPCJ83Bc8%2Fx5rhiEBV653GCk4cBNZtdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1440&quot; data-filename=&quot;ups-notification-2.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&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;a href=&quot;https://wxaurl.cn/VNrySXl38cq&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;위챗 WalleCube 미니앱&lt;/a&gt; &amp;gt; 消息通知(메시지 알림) 페이지에서 세부적인 알림을 설정할 수도 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ups-notofication.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLVNPT/btsPCltLgz7/VRihNXxSovIxcRTcAgYOh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLVNPT/btsPCltLgz7/VRihNXxSovIxcRTcAgYOh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLVNPT/btsPCltLgz7/VRihNXxSovIxcRTcAgYOh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLVNPT%2FbtsPCltLgz7%2FVRihNXxSovIxcRTcAgYOh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1440&quot; data-filename=&quot;ups-notofication.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&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;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;电量使用微信推送: UPS 전력 사용량 알림 (매일 혹은 매주)&lt;/li&gt;
&lt;li&gt;离线推送间隔时间: UPS가 오프라인 상태일 때 알림 반복 전송 간격(30분 단위로 설정 가능)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;제품 분해 사진&lt;/h2&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;WalleCube UPS는 인버터를 사용하지 않은 DC 출력 회로를 통해 빠른 전환 속도, 작은 크기, 무소음을 구현한 특징을 가진다. 내부적으론 XHSC(小华半导体)의 HC32L072JATA MCU(마이크로컨트롤러)가 전반적인 시스템 제어를 담당하고, SouthChip(南芯科技)의 SC8812A 칩이 배터리 충&amp;middot;방전을 관리한다. 발열 해소를 위한 서멀 패드와 온도 감지 센서 등 안전장치도 충실하게 갖추고 있다. 배터리 셀은 SunPower(长虹三杰) 26700 리튬인산철(LiFePO₄) 전지를 사용하고 있다.&lt;/p&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.ednchina.com/technews/32365.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;EDN China(电子技术设计)&lt;/a&gt;에서 확인할 수 있다. PCB 구성, 핵심 부품, 슬라이싱 구조, 방열 설계 등 제품 내부의 디테일한 정보가 포함되어 있다.&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6HkUE/btsPBrg7Fgf/40zjF8kgp2lTTDBirkB1kK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6HkUE/btsPBrg7Fgf/40zjF8kgp2lTTDBirkB1kK/img.jpg&quot; data-alt=&quot;본체 화면을 통해 출력 전압/전류, 배터리 잔량, 남은 사용 시간 및 연결 상태가 표시된다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6HkUE/btsPBrg7Fgf/40zjF8kgp2lTTDBirkB1kK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6HkUE%2FbtsPBrg7Fgf%2F40zjF8kgp2lTTDBirkB1kK%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;1080&quot; height=&quot;720&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;본체 화면을 통해 출력 전압/전류, 배터리 잔량, 남은 사용 시간 및 연결 상태가 표시된다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhbf0o/btsPCijwcFT/hb0bsOF6lkyCqJnDe09ZgK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhbf0o/btsPCijwcFT/hb0bsOF6lkyCqJnDe09ZgK/img.jpg&quot; data-alt=&quot;본체 뒷면에는 전원 입력, 전원 출력, USB 포트가 장착되어 있다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhbf0o/btsPCijwcFT/hb0bsOF6lkyCqJnDe09ZgK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbhbf0o%2FbtsPCijwcFT%2Fhb0bsOF6lkyCqJnDe09ZgK%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;1080&quot; height=&quot;720&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;본체 뒷면에는 전원 입력, 전원 출력, USB 포트가 장착되어 있다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/evlykw/btsPBEHoHri/WUNIHQsk7WYWsdCHhIp4x0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/evlykw/btsPBEHoHri/WUNIHQsk7WYWsdCHhIp4x0/img.jpg&quot; data-alt=&quot;UN38.3 국제 운송 안전 표준 통과 마크&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/evlykw/btsPBEHoHri/WUNIHQsk7WYWsdCHhIp4x0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fevlykw%2FbtsPBEHoHri%2FWUNIHQsk7WYWsdCHhIp4x0%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;1080&quot; height=&quot;720&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;UN38.3 국제 운송 안전 표준 통과 마크&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qnsxQ/btsPDNCOfUe/60lyvh7DHmi55FtMYwLun1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qnsxQ/btsPDNCOfUe/60lyvh7DHmi55FtMYwLun1/img.jpg&quot; data-alt=&quot;한 손에 들어오는 작은 크기와 알루미늄 합금 케이스 덕분에 디자인이 깔끔해보인다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qnsxQ/btsPDNCOfUe/60lyvh7DHmi55FtMYwLun1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqnsxQ%2FbtsPDNCOfUe%2F60lyvh7DHmi55FtMYwLun1%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;1080&quot; height=&quot;720&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;한 손에 들어오는 작은 크기와 알루미늄 합금 케이스 덕분에 디자인이 깔끔해보인다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUkttD/btsPDDNN3jr/tThK9se5I67mAkY6mnvKV1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUkttD/btsPDDNN3jr/tThK9se5I67mAkY6mnvKV1/img.jpg&quot; data-alt=&quot;배터리는 플라스틱 브래킷으로 절연 고정되어 있다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUkttD/btsPDDNN3jr/tThK9se5I67mAkY6mnvKV1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUkttD%2FbtsPDDNN3jr%2FtThK9se5I67mAkY6mnvKV1%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;1080&quot; height=&quot;720&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;배터리는 플라스틱 브래킷으로 절연 고정되어 있다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zJvAP/btsPEwAFzUj/kKkiigh1Lp68yPjq8NZk51/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zJvAP/btsPEwAFzUj/kKkiigh1Lp68yPjq8NZk51/img.jpg&quot; data-alt=&quot;SunPower 리튬 인산철 배터리. 정격 전압 3.2V, 용량 4500mAH, 에너지 14.4Wh&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zJvAP/btsPEwAFzUj/kKkiigh1Lp68yPjq8NZk51/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzJvAP%2FbtsPEwAFzUj%2FkKkiigh1Lp68yPjq8NZk51%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;1080&quot; height=&quot;720&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SunPower 리튬 인산철 배터리. 정격 전압 3.2V, 용량 4500mAH, 에너지 14.4Wh&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzmup9/btsPBqiguov/7XxXcyRxIMXdIKJBWKn9Nk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzmup9/btsPBqiguov/7XxXcyRxIMXdIKJBWKn9Nk/img.jpg&quot; data-alt=&quot;RISC-V 32비트 싱글 코어 프로세서가 내장된 저전력 SoC 무선 연결 칩&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzmup9/btsPBqiguov/7XxXcyRxIMXdIKJBWKn9Nk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbzmup9%2FbtsPBqiguov%2F7XxXcyRxIMXdIKJBWKn9Nk%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;1080&quot; height=&quot;720&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;RISC-V 32비트 싱글 코어 프로세서가 내장된 저전력 SoC 무선 연결 칩&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dNzFHe/btsPB8aln81/eWI7sEIs1T0lZKZt4nRfz0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dNzFHe/btsPB8aln81/eWI7sEIs1T0lZKZt4nRfz0/img.jpg&quot; data-alt=&quot;화면 케이블 커넥터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dNzFHe/btsPB8aln81/eWI7sEIs1T0lZKZt4nRfz0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdNzFHe%2FbtsPB8aln81%2FeWI7sEIs1T0lZKZt4nRfz0%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;1080&quot; height=&quot;720&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;화면 케이블 커넥터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rFnde/btsPBGZLv8U/fumgSDoEPTeEzp6n6rV2lk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rFnde/btsPBGZLv8U/fumgSDoEPTeEzp6n6rV2lk/img.jpg&quot; data-alt=&quot;XHSC의 MCU(마이크로컨트롤러 유닛)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rFnde/btsPBGZLv8U/fumgSDoEPTeEzp6n6rV2lk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrFnde%2FbtsPBGZLv8U%2FfumgSDoEPTeEzp6n6rV2lk%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;1080&quot; height=&quot;720&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;XHSC의 MCU(마이크로컨트롤러 유닛)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>⌚️ Productivity</category>
      <category>Nas</category>
      <category>Synology</category>
      <category>UPS</category>
      <category>WalleCube</category>
      <category>WOL</category>
      <category>瓦力电源</category>
      <category>瓦力盒子</category>
      <category>나스</category>
      <category>무정전 전원 공급장치</category>
      <category>시놀로지</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1334</guid>
      <comments>https://romantech.net/1334#entry1334comment</comments>
      <pubDate>Wed, 30 Jul 2025 06:55:43 +0900</pubDate>
    </item>
    <item>
      <title>홍콩 스테이블코인 발행과 디지털 금융 경쟁 구도</title>
      <link>https://romantech.net/1333</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ruslan-bardash-1N8Erd9Xcrs-unsplash.jpg&quot; data-origin-width=&quot;4536&quot; data-origin-height=&quot;3036&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r8pta/btsPv814xLL/XEhyCZkPpKZMwZ2Msn0TwK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r8pta/btsPv814xLL/XEhyCZkPpKZMwZ2Msn0TwK/img.jpg&quot; data-alt=&quot;Photo by Ruslan Bardash&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r8pta/btsPv814xLL/XEhyCZkPpKZMwZ2Msn0TwK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr8pta%2FbtsPv814xLL%2FXEhyCZkPpKZMwZ2Msn0TwK%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;4536&quot; height=&quot;3036&quot; data-filename=&quot;ruslan-bardash-1N8Erd9Xcrs-unsplash.jpg&quot; data-origin-width=&quot;4536&quot; data-origin-height=&quot;3036&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Photo by Ruslan Bardash&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;지난 5월 홍콩이 &lt;a href=&quot;https://www.chaincatcher.com/article/2182994&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;「스테이블코인 조례」&lt;/a&gt;를 통과시키면서, 오는 8월 1일부터 기업들이 라이선스를 신청하고 스테이블코인을 발행할 수 있게 되었다. 홍콩에서 스테이블코인을 도입하면 모두에게 새로운 금융 수단과 기회가 생기게 된다. 오늘은 홍콩 스테이블코인 발행이 갖는 중요한 의미를 설명해 볼까 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;스테이블코인이란?&lt;/h2&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;스테이블코인은 암호화폐의 한 종류로, 비트코인이 가진 가격 불안을 해소하기 위해 등장했다. 비트코인은 최초의 암호화폐지만 가격 변동이 매우 심하다. 오늘 햄버거 8개 가치였던 것이 내일은 5개가 되고 모레는 다시 7개로 변할 수 있다. 이 때문에 비트코인은 실제 거래 수단으로는 부적합하여 다른 물건을 구매할 때 사용하기 어렵다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 사람들은 가격이 안정적인 암호화폐인 스테이블코인을 만들었다. 가장 대표적인 스테이블코인인 USDT는 2014년 테더(Tether)사가 발행하기 시작했다. 참고로 비트코인은 2009년에 탄생했다.&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;thomas-couillard-ug0gPPYvG1M-unsplash.jpg&quot; data-origin-width=&quot;6000&quot; data-origin-height=&quot;4000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WZEQB/btsPwwO9h7x/Kz7TstQKzjjHRoabhNuPyK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WZEQB/btsPwwO9h7x/Kz7TstQKzjjHRoabhNuPyK/img.jpg&quot; data-alt=&quot;Tether는 밧줄이나 끈처럼 무언가를 묶거나 고정하는 데 쓰이는 줄을 뜻한다. Photo by Thomas Couillard&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WZEQB/btsPwwO9h7x/Kz7TstQKzjjHRoabhNuPyK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWZEQB%2FbtsPwwO9h7x%2FKz7TstQKzjjHRoabhNuPyK%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;6000&quot; height=&quot;4000&quot; data-filename=&quot;thomas-couillard-ug0gPPYvG1M-unsplash.jpg&quot; data-origin-width=&quot;6000&quot; data-origin-height=&quot;4000&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Tether는 밧줄이나 끈처럼 무언가를 묶거나 고정하는 데 쓰이는 줄을 뜻한다. Photo by Thomas Couillard&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;테더는 USDT의 가격이 항상 1달러로 유지된다고 약속한다. 1달러를 테더사에 주면 USDT 1개를 얻을 수 있고(실물이 아닌 블록체인 장부에 기록), 필요하지 않으면 다시 테더사에 팔아서 1달러를 돌려받을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이론적으로 테더가 항상 충분한 달러 준비금을 보유하고 있는 한, 스테이블코인과 달러의 교환 비율은 1:1로 유지될 수 있다. 테더는 준비금 현황 보고서를 정기적으로 공개하고 있으며, 예치된 달러 자산의 대부분을 미국 국채 매입 등에 사용하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사람들이 스테이블코인을 달러와 동일한 가치로 인정하기 시작하면, 달러를 사용할 수 있는 곳 어디서나 스테이블코인을 사용할 수 있게 되어 다양한 상품을 구매할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 USDT는 세계에서 거래량이 가장 많은 암호화폐로 비트코인을 넘어섰다. 대부분의 경우 다른 암호화폐 거래에 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;미국의 규제 움직임&lt;/h2&gt;
&lt;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;사람들은 스테이블코인을 사용하면서 미국 정부의 규제를 피할 수 있다는 사실을 발견했다. 스테이블코인 거래는 은행 시스템과 완전히 분리되어 있으며, 익명 지갑 간의 거래이므로 추적이나 규제가 거의 불가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 미국 정부가 어느 날 갑자기 A라는 사람의 달러 사용 금지 명령을 내렸다고 가정해 보자. 이 경우 A는 스테이블코인을 사용하여 B로부터 원하는 물건을 구매하고, B는 그 스테이블코인을 다시 달러로 환전하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 블록체인의 모든 거래는 원칙적으로 추적이 가능하고, 미국 정부가 제재 대상과 연관된 암호화폐 지갑 주소를 차단하거나 발행사에 요청하여 자금을 동결시키기도 한다. 하지만 수많은 지갑이 익명으로 생성되고 믹서(Mixer) 같은 서비스로 출처를 흐릴 수 있어 완벽한 추적은 여전히 어려운 과제로 남아 있다.&lt;/p&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.whitehouse.gov/fact-sheets/2025/07/fact-sheet-president-donald-j-trump-signs-genius-act-into-law/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;스테이블코인에 대한 포괄적 규제 프레임워크인 지니어스 법안(GENIUS Act)이 최근 법률로 제정&lt;/a&gt;됐다. 법안의 주요 골자는 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;스테이블코인 발행 기관은 미국 관할 지역 내에 있어야 하며, 정부 허가를 받아야 한다.&lt;/li&gt;
&lt;li&gt;발행기관은 예치된 달러를 1:1 비율로 미국 예금/단기 국채 등으로 보유해야 한다.&lt;/li&gt;
&lt;li&gt;미국 규제를 충족하지 않는 스테이블코인은 미국 내 유통이 차단&amp;middot;동결될 수 있다.&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;h2 data-ke-size=&quot;size26&quot;&gt;홍콩의 절묘한 한 수&lt;/h2&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;홍콩 정부가 제정한 「스테이블코인 조례」는 디지털 자산 허브의 주도권을 잡기 위한 전략적 묘수로 평가된다. 이 제도는 라이선스를 취득한 기관이 홍콩 달러 기반의 스테이블코인을 발행할 수 있도록 허용한다.&lt;/p&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.8 홍콩 달러(HKD)는 1 미국 달러(USD)로 고정되어(페깅) 있기 때문에 홍콩 달러 기반 스테이블코인과 미국 달러 기반 스테이블코인의 환율도 동일하게 고정된다(물론 시장 상황과 수수료 등에 따라 유동적으로 변할 수 있다).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;페깅(Pegging): 특정 자산의 가치를 다른 자산에 고정시키는 것.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;홍콩 달러 스테이블코인은 미국 달러 스테이블코인과 공존하며 새로운 경쟁 구도를 형성할 것으로 보인다. 특히 아시아 시장을 중심으로 국경 간 결제를 혁신하고, 디지털 자산 시장에서 일부 기축 통화 역할을 수행하며 영향력을 확대해 나갈 것으로 전망된다.&lt;/p&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;u&gt;즉, 홍콩은 달러 가치와 연동되면서도 미국의 규제를 피할 수 있는 금융 수단&lt;/u&gt;을 만들어낸 셈이다. 만약 특정 상황의 국제 무역에서 달러 결제가 불가능해진다면, 홍콩 달러 스테이블코인을 결제 수단으로 사용할 수 있을지도 모른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;위안화 스테이블코인의 가능성&lt;/h2&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;위안화에 연동된 스테이블코인이 등장할 수 있을까? 현재로서는 그럴 가능성은 낮아 보인다. 스테이블코인은 익명성을 바탕으로 자유로운 교환 및 국경 간 이동이라는 속성을 지녔다. 만약 위안화 기반 스테이블코인이 발행된다면, 자본 유출 통로로 악용될 수 있어 중국 정부의 통제 정책과 정면으로 배치된다.&lt;/p&gt;</description>
      <category>  China</category>
      <category>genius act</category>
      <category>Tether</category>
      <category>USDT</category>
      <category>디지털 자산</category>
      <category>스테이블코인</category>
      <category>암호화폐</category>
      <category>지니어스 법안</category>
      <category>테더</category>
      <category>홍콩 금융 정책</category>
      <category>홍콩 달러</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1333</guid>
      <comments>https://romantech.net/1333#entry1333comment</comments>
      <pubDate>Thu, 24 Jul 2025 00:09:58 +0900</pubDate>
    </item>
    <item>
      <title>[JS] 두 점 사이의 거리 계산하기</title>
      <link>https://romantech.net/1332</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;요소 내부의 고정된 지점과 마우스 클릭 지점 사이의 거리를 계산해야 하는 경우가 종종 있다. 예를 들어 사용자 경험(UX) 개선을 위해 버튼 클릭 감지 영역을 실제보다 더 넓게 설정할 때(클릭하기 쉽도록 하기 위해) 이런 계산이 필요하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1610&quot; data-origin-height=&quot;784&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMzGvz/btsPp9GVI1y/4QrYCP3aOkfB51eFV77iK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMzGvz/btsPp9GVI1y/4QrYCP3aOkfB51eFV77iK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMzGvz/btsPp9GVI1y/4QrYCP3aOkfB51eFV77iK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMzGvz%2FbtsPp9GVI1y%2F4QrYCP3aOkfB51eFV77iK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1610&quot; height=&quot;784&quot; data-origin-width=&quot;1610&quot; data-origin-height=&quot;784&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 두 지점 간의 거리는 피타고라스 정리를 이용해서 구할 수 있다. 피타고라스 정리는 직각삼각형에서 빗변(가장 긴 변)의 제곱은 다른 두 변의 제곱의 합과 같다는 원리다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$c^2 = a^2 + b^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;빗변 $c$의 길이를 구하기 위해 양변에 제곱근(루트; square root)을 적용하여 다음과 같이 표현할 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$c = \sqrt{a^2+b^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;한편, 피타고라스의 원리를 적용하기 위해 좌표평면(서로 수직으로 교차하는 두 직선으로 이루어진 평면)에서 두 점을 기준으로 가상의 직각삼각형을 만들 수 있다. 고정된 지점 $(x_1,y_1)$과 마우스 클릭 지점 $(x_2,y_2)$은 직각삼각형의 빗변을 이루고, 나머지 가상의 꼭짓점은 $(x_2,y_1)$ 또는 $(x_1,y_2)$ 좌표에 위치하게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1610&quot; data-origin-height=&quot;790&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckBTBR/btsPrhjTpJl/i4K9asUbq4tflk6FmUkI11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckBTBR/btsPrhjTpJl/i4K9asUbq4tflk6FmUkI11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckBTBR/btsPrhjTpJl/i4K9asUbq4tflk6FmUkI11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckBTBR%2FbtsPrhjTpJl%2Fi4K9asUbq4tflk6FmUkI11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1610&quot; height=&quot;790&quot; data-origin-width=&quot;1610&quot; data-origin-height=&quot;790&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;위 원리를 이용하면 마우스 클릭 지점과 특정 지점 사이의 거리가 허용 범위 안에 들어오는지 확인하는 함수를 만들 수 있다. 특정 요소의 원점(0, 0)을 기준으로 클릭 지점의 좌표 계산하는 방법은 &lt;a title=&quot;요소 왼쪽/위쪽 변부터 클릭 지점까지 거리 구하기&quot; href=&quot;https://romantech.net/1173&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;이전 포스팅&lt;/a&gt; 참고.&lt;/p&gt;
&lt;pre class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot;&gt;&lt;code&gt;const isColliding = (point: Point, mouse: Point): boolean =&amp;gt; {
  // 피타고라스 정리를 이용해 point와 mouse 사이의 거리(빗변) 계산
  // mouse.x 또는 mouse.y는 요소를 기준으로 한 좌표 (e.clientX/Y - rect.left/top)
  const dx = point.x - mouse.x;
  const dy = point.y - mouse.y;
  const distance = Math.sqrt(dx ** 2 + dy ** 2);
  // 클릭 판정 영역을 넓게 설정하여 선택하기 쉽도록 조정
  return distance &amp;lt; STYLE.BASE_POINT_RADIUS * 2.5;
};&lt;/code&gt;&lt;/pre&gt;</description>
      <category>  Programming</category>
      <category>getBoundingClientRect</category>
      <category>JavaScript</category>
      <category>Math.sqrt</category>
      <category>mouseEvent</category>
      <category>pythagorean theorem</category>
      <category>거리 계산</category>
      <category>마우스 이벤트</category>
      <category>자바스크립트</category>
      <category>클릭 판정</category>
      <category>피타고라스 정리</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1332</guid>
      <comments>https://romantech.net/1332#entry1332comment</comments>
      <pubDate>Sun, 20 Jul 2025 00:23:07 +0900</pubDate>
    </item>
    <item>
      <title>AdGuard 사용 시 티스토리 gif 이미지 안나오는 문제 해결</title>
      <link>https://romantech.net/1331</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 파악&lt;/h2&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;얼마 전부터 티스토리 블로그에 &lt;code&gt;.gif&lt;/code&gt; 파일을 올려도 이미지가 보이지 않는 문제가 발생했다. 포스트를 발행하고 내용을 확인해 보면 아래 스크린샷처럼 이미지 캡션(설명)만 보이고 정작 이미지는 나오지 않고 있었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2868&quot; data-origin-height=&quot;872&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3eVAZ/btsO5YzDi75/kPRvWmLRGLz6RytFTKynK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3eVAZ/btsO5YzDi75/kPRvWmLRGLz6RytFTKynK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3eVAZ/btsO5YzDi75/kPRvWmLRGLz6RytFTKynK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3eVAZ%2FbtsO5YzDi75%2FkPRvWmLRGLz6RytFTKynK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2868&quot; height=&quot;872&quot; data-origin-width=&quot;2868&quot; data-origin-height=&quot;872&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;원인을 파악하기 위해 크롬 개발자 도구로 HTML 코드를 살펴보니, 업로드한 원본 파일명과 관계없이 실제 이미지를 불러오는 주소는 아래처럼 항상 &lt;code&gt;img.gif&lt;/code&gt; 라는 파일명을 가진 임시 URL을 통해 리소스를 요청하고 있었다.&lt;/p&gt;
&lt;pre id=&quot;code_1751866756415&quot; class=&quot;plaintext&quot; data-ke-language=&quot;plaintext&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;https://blog.kakaocdn.net/dna/.../img.gif?credential=...&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;카카오 CDN(콘텐츠 전송 네트워크)에 원본 파일을 저장하되, 보안을 위해 일정 시간만 유효한 임시 주소(Pre-signed URL)를 발급하는 방식으로 보였다. 이 임시 URL 주소를 복사한 후 브라우저에서 직접 열어보니 이미지는 정상적으로 표시됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹시 AdGuard 필터 때문에 발생한 문제인가 싶어서 필터링 로그를 확인해 보니... 역시나 AdGuard 추적 보호(Tracking Protection) 필터에 포함된 &lt;code&gt;/img.gif?&lt;/code&gt; 규칙이 카카오 CDN의 임시 URL을 광고로 오인하여 차단하고 있었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2224&quot; data-origin-height=&quot;1334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SpxQn/btsO6qJAEiD/Rm4QWMvK8qEUEq8o6OBwJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SpxQn/btsO6qJAEiD/Rm4QWMvK8qEUEq8o6OBwJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SpxQn/btsO6qJAEiD/Rm4QWMvK8qEUEq8o6OBwJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSpxQn%2FbtsO6qJAEiD%2FRm4QWMvK8qEUEq8o6OBwJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2224&quot; height=&quot;1334&quot; data-origin-width=&quot;2224&quot; data-origin-height=&quot;1334&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결 방법&lt;/h2&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;해결 방법은 간단하다. AdGuard 설정 &amp;gt; 필터 구독 &amp;gt; User rules 항목에서 아래 규칙을 추가해 주면 된다. 모바일에선 보호(하단 방패 아이콘) &amp;gt; Safari 보호(iOS 기준) &amp;gt; 사용자 규칙에서 추가할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1751865535109&quot; class=&quot;plaintext&quot; data-ke-language=&quot;plaintext&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@@||blog.kakaocdn.net*/img.gif&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1844&quot; data-origin-height=&quot;1118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RmP9K/btsO7xBqkis/4AQ4GXfkclcfUFHwIScwf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RmP9K/btsO7xBqkis/4AQ4GXfkclcfUFHwIScwf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RmP9K/btsO7xBqkis/4AQ4GXfkclcfUFHwIScwf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRmP9K%2FbtsO7xBqkis%2F4AQ4GXfkclcfUFHwIScwf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1844&quot; height=&quot;1118&quot; data-origin-width=&quot;1844&quot; data-origin-height=&quot;1118&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;code&gt;.gif&lt;/code&gt; 이미지가 모두 정상적으로 표시되는 걸 확인할 수 있다.&lt;/p&gt;</description>
      <category>⌚️ Productivity</category>
      <category>adguard</category>
      <category>adguard 사용자 규칙</category>
      <category>adguard 필터 규칙</category>
      <category>img.gif</category>
      <category>광고차단</category>
      <category>애드가드</category>
      <category>추적 보호 필터</category>
      <category>카카오 cdn</category>
      <category>티스토리 GIF</category>
      <category>티스토리 이미지 오류</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1331</guid>
      <comments>https://romantech.net/1331#entry1331comment</comments>
      <pubDate>Mon, 7 Jul 2025 21:05:09 +0900</pubDate>
    </item>
    <item>
      <title>[CS] 베지에 곡선 원리 이해하기 feat. 카스텔조 알고리즘</title>
      <link>https://romantech.net/1330</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;CSS에서 애니메이션이나 전환 효과를 제어할 때 타이밍 함수(가속도 곡선)를 사용한다. 타이밍 함수는 애니메이션이 얼마나 빠르게 또는 느리게 시작하고 끝나는지를 결정하는 수학적인 함수다. 쉽게 말해 애니메이션의 속도 변화를 제어하는 역할을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tailwind CSS를 사용한다면 &lt;code&gt;ease-in&lt;/code&gt;, &lt;code&gt;ease-out&lt;/code&gt;, &lt;code&gt;ease-in-out&lt;/code&gt; 등 미리 정의되어 있는 유틸리티 클래스를 사용해서 다양한 가속도 곡선을 적용할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;html xml&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;&amp;lt;!-- 
transition-timing-function: cubic-bezier(0.4, 0, 1, 1); 
transition-duration: 300ms;
--&amp;gt;
&amp;lt;button class=&quot;ease-in duration-300 ...&quot;&amp;gt;Button A&amp;lt;/button&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 &lt;code&gt;ease&lt;/code&gt;는 부드럽게 시작해서 부드럽게 끝나고(일반적인 가속도 곡선), &lt;code&gt;ease-in&lt;/code&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;code&gt;ease&lt;/code&gt;, &lt;code&gt;ease-in&lt;/code&gt;, &lt;code&gt;ease-out&lt;/code&gt;, &lt;code&gt;ease-in-out&lt;/code&gt; 등은 CSS에서 기본적으로 제공하는 타이밍 함수(easing function) 프리셋이다. 각 값은 아래처럼 cubic-bezier 곡선으로 미리 정의되어 있다.&lt;/p&gt;
&lt;pre class=&quot;css&quot; data-ke-language=&quot;css&quot;&gt;&lt;code&gt;ease           /* cubic-bezier(0.25, 0.1, 0.25, 1) */
ease-in        /* cubic-bezier(0.42, 0, 1, 1) */
ease-out       /* cubic-bezier(0, 0, 0.58, 1) */
ease-in-out    /* cubic-bezier(0.42, 0, 0.58, 1) */
...&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;베지에 곡선은 컴퓨터 그래픽스에서 부드러운 곡선을 표현하기 위해 사용하는 수학적 곡선으로, 조절점(control point)이라고 부르는 점들의 집합으로 정의된다. &lt;code&gt;n&lt;/code&gt;개의 조절점이 주어지면 &lt;code&gt;n-1&lt;/code&gt;차 베지에 곡선을 만들 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6Kn4o/btsOKTeBJMI/ttenXZKJzU4ShVD7AWtKIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6Kn4o/btsOKTeBJMI/ttenXZKJzU4ShVD7AWtKIK/img.png&quot; data-alt=&quot;왼쪽부터 1차(조절점 2개), 2차(조절점 3개), 3차(조절점 4개) 베지에 곡선. Image via JavaScript Info&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6Kn4o/btsOKTeBJMI/ttenXZKJzU4ShVD7AWtKIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6Kn4o%2FbtsOKTeBJMI%2FttenXZKJzU4ShVD7AWtKIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;360&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;360&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;왼쪽부터 1차(조절점 2개), 2차(조절점 3개), 3차(조절점 4개) 베지에 곡선. Image via JavaScript Info&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;CSS에서 사용하는 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/easing-function/cubic-bezier&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;cubic-bezier()&lt;/a&gt; 함수는 4개의 조절점(P₀, P₁, P₂, P₃)으로 구성된 3차 베지에 곡선을 기반으로 한다. 이 중 시작점(P₀)과 끝점(P₃)은 항상 (0, 0)과 (1, 1)로 고정되어 있다. 따라서 실제로는 중간에 있는 두 제어점(P₁, P₂)만 직접 설정한다.&lt;/p&gt;
&lt;pre class=&quot;css&quot; data-ke-language=&quot;css&quot;&gt;&lt;code&gt;/* cubic-bezier(P1.x, P1.y, P2.x, P2.y) 형태로 사용 */
transition: width 1s cubic-bezier(0.12, 0.83, 0.92, 1);

/* x 좌표(지속시간)는 반드시 [0, 1] 범위 내에 있어야 함 */
cubic-bezier(0.25, 0.1, 0.75, 1.0) /* ✅ */
cubic-bezier(1.5, 0.1, 0.75, 1.0)  /* ❌ */

/* y 좌표(진행률)는 [0, 1] 범위를 벗어날 수 있으며, 범위를 벗어나면 바운싱 효과 생성 */
cubic-bezier(0.1, -0.6, 0.2, 2.0)&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;u&gt;카스텔조 알고리즘&lt;/u&gt;을 통해 만들 수 있다. 주어진 조절점을 선분(시작점과 끝점이 정해진 직선)으로 연결한 후, 각 선분을 동일한 비율 &lt;code&gt;t&lt;/code&gt;로 &lt;u&gt;내분&lt;/u&gt;(선분을 주어진 비율로 나눔; 선형 보간)하여 새로운 점들을 구하는 과정을 기반으로 한다. 두 점 사이의 선분을 특정 비율 &lt;code&gt;t&lt;/code&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;u&gt;점의 개수가 1개만 남을 때까지 선형 보간을 반복&lt;/u&gt;하면, 최종적으로 남은 점이 베지어 곡선 위의 좌표가 된다. 즉, 카스텔조 알고리즘은 선형 보간을 재귀적으로 적용하여 곡선의 점을 계산하는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글만 보면 이해하기 어려울 수도 있으니 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;  &lt;b&gt;보간 (插值, Interpolation)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보간은 이미 알고 있는 여러 지점을 기반으로, 그 사이의 알려지지 않은 값을 추론하는 모든 과정을 가리킨다. 한자 뜻 그대로 사이(間)를 보충(補)한다는 의미. 예를 들어 $x=0$일 때 값이 $0$이고 $x=10$일 때 값이 $100$이라면, 그 사이인 $x=3$이나 $x=7$의 값을 추정하는 과정이 바로 보간이다.&lt;/p&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;선형 보간 (线性插值, Linear Interpolation)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선형 보간은 이러한 보간 기법 중 가장 대표적이고 간단한 방법. 선형 보간은 알려진 두 점을 직선으로 잇는다고 가정하고, 그 직선 위의 중간 값을 계산하는 방식이다. 줄여서 Lerp라고도 부른다. 참고로 선형은 직선 형태를 가리킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2차 베지에 곡선&lt;/h2&gt;
&lt;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;먼저 &lt;code&gt;A&lt;/code&gt;, &lt;code&gt;B&lt;/code&gt;, &lt;code&gt;C&lt;/code&gt; 조절점 3개를 직선으로 잇는다. 그럼 &lt;code&gt;AB&lt;/code&gt;, &lt;code&gt;BC&lt;/code&gt; 두 개의 선분이 생긴다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1726&quot; data-origin-height=&quot;726&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x35BA/btsOKSGPn0x/vqkZCpi2PameAHjkphzFfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x35BA/btsOKSGPn0x/vqkZCpi2PameAHjkphzFfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x35BA/btsOKSGPn0x/vqkZCpi2PameAHjkphzFfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx35BA%2FbtsOKSGPn0x%2FvqkZCpi2PameAHjkphzFfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1726&quot; height=&quot;726&quot; data-origin-width=&quot;1726&quot; data-origin-height=&quot;726&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;code&gt;t&lt;/code&gt;(0 &amp;le; t &amp;le; 1)로 나눈다(내분). 예를 들어 &lt;code&gt;t&lt;/code&gt;가 0.3이라면 &lt;code&gt;A&lt;/code&gt;에서 &lt;code&gt;B&lt;/code&gt; 방향으로 30% 이동한 지점 &lt;code&gt;D&lt;/code&gt;와, &lt;code&gt;B&lt;/code&gt;에서 &lt;code&gt;C&lt;/code&gt; 방향으로 30% 이동한 지점 &lt;code&gt;E&lt;/code&gt;가 만들어진다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1676&quot; data-origin-height=&quot;726&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b50Zct/btsOK7jhvp9/EL9Rqcuj5F60hbhXE1trBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b50Zct/btsOK7jhvp9/EL9Rqcuj5F60hbhXE1trBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b50Zct/btsOK7jhvp9/EL9Rqcuj5F60hbhXE1trBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb50Zct%2FbtsOK7jhvp9%2FEL9Rqcuj5F60hbhXE1trBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1676&quot; height=&quot;726&quot; data-origin-width=&quot;1676&quot; data-origin-height=&quot;726&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;code&gt;D&lt;/code&gt;와 &lt;code&gt;E&lt;/code&gt;를 다시 직선으로 이어 새로운 선분 &lt;code&gt;DE&lt;/code&gt;를 만든다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1676&quot; data-origin-height=&quot;726&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DzBH5/btsOMdiHadX/OjSUIUdqKe6DSV7kqyEFLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DzBH5/btsOMdiHadX/OjSUIUdqKe6DSV7kqyEFLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DzBH5/btsOMdiHadX/OjSUIUdqKe6DSV7kqyEFLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDzBH5%2FbtsOMdiHadX%2FOjSUIUdqKe6DSV7kqyEFLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1676&quot; height=&quot;726&quot; data-origin-width=&quot;1676&quot; data-origin-height=&quot;726&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;code&gt;t&lt;/code&gt;만큼 이동한 지점 &lt;code&gt;F&lt;/code&gt;를 구한다. 점이 &lt;code&gt;F&lt;/code&gt; 하나만 남았으므로 이 지점이 베지에 곡선의 좌표가 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1676&quot; data-origin-height=&quot;726&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kJfPE/btsOLmHgzxM/Kk95yo7XV2VfBaePCj9dJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kJfPE/btsOLmHgzxM/Kk95yo7XV2VfBaePCj9dJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kJfPE/btsOLmHgzxM/Kk95yo7XV2VfBaePCj9dJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkJfPE%2FbtsOLmHgzxM%2FKk95yo7XV2VfBaePCj9dJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1676&quot; height=&quot;726&quot; data-origin-width=&quot;1676&quot; data-origin-height=&quot;726&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;code&gt;t&lt;/code&gt; 값을 0부터 1까지 조금씩 증가시키며(0.05, 0.1, &amp;hellip;, 0.95, 1) 위 과정을 반복하면, 여러 개의 점이 생성되고, 이 점들을 순서대로 이으면 2차 베지에 곡선이 완성된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1676&quot; data-origin-height=&quot;726&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEcLAf/btsONLrYGUT/prkTXlwKEdYAuKpGLZVWNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEcLAf/btsONLrYGUT/prkTXlwKEdYAuKpGLZVWNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEcLAf/btsONLrYGUT/prkTXlwKEdYAuKpGLZVWNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEcLAf%2FbtsONLrYGUT%2FprkTXlwKEdYAuKpGLZVWNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1676&quot; height=&quot;726&quot; data-origin-width=&quot;1676&quot; data-origin-height=&quot;726&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;아래 코드펜에서 Start Animation 버튼을 클릭하면 곡선이 그려지는 과정을 직접 확인해 볼 수 있다.&lt;/p&gt;
&lt;div id=&quot;code_1750608202783&quot; data-ke-type=&quot;html&quot; data-source=&quot;&amp;lt;style&amp;gt;
  .codepen-wrap {
    width: 100%;
    aspect-ratio: 10 / 9;
    overflow: hidden;
  }

  .codepen-wrap iframe {
    width: 100%;
    height: 100%;
    border: 0;
    display: block;
  }
&amp;lt;/style&amp;gt;

&amp;lt;div class=&amp;quot;codepen-wrap&amp;quot;&amp;gt;
  &amp;lt;iframe
    src=&amp;quot;https://codepen.io/colorfilter/embed/ogXaQQQ?default-tab=result&amp;quot;
    title=&amp;quot;Quadratic Bezier Curves 2차 베지에 곡선&amp;quot;
    loading=&amp;quot;lazy&amp;quot;
    allowfullscreen
  &amp;gt;&amp;lt;/iframe&amp;gt;
&amp;lt;/div&amp;gt;&quot;&gt;
&lt;style&gt;
  .codepen-wrap {
    width: 100%;
    aspect-ratio: 10 / 9;
    overflow: hidden;
  }

  .codepen-wrap iframe {
    width: 100%;
    height: 100%;
    border: 0;
    display: block;
  }
&lt;/style&gt;
&lt;div class=&quot;codepen-wrap&quot;&gt;&lt;iframe src=&quot;https://codepen.io/colorfilter/embed/ogXaQQQ?default-tab=result&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3차 베지에 곡선&lt;/h2&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;3차 베지에 곡선은 조절점 4개로 이루어진다. 곡선을 만드는 기본 원리는 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;먼저 &lt;code&gt;A&lt;/code&gt;, &lt;code&gt;B&lt;/code&gt;, &lt;code&gt;C&lt;/code&gt;, &lt;code&gt;D&lt;/code&gt; 조절점 4개를 직선으로 잇는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1562&quot; data-origin-height=&quot;902&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N0DWX/btsOLmNZxmr/pOQC8D3ZGbDo9PQkN6vTY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N0DWX/btsOLmNZxmr/pOQC8D3ZGbDo9PQkN6vTY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N0DWX/btsOLmNZxmr/pOQC8D3ZGbDo9PQkN6vTY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN0DWX%2FbtsOLmNZxmr%2FpOQC8D3ZGbDo9PQkN6vTY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1562&quot; height=&quot;902&quot; data-origin-width=&quot;1562&quot; data-origin-height=&quot;902&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;code&gt;AB&lt;/code&gt;, &lt;code&gt;BC&lt;/code&gt;, &lt;code&gt;CD&lt;/code&gt; 각 선분을 동일한 비율 &lt;code&gt;t&lt;/code&gt;로 내분한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1562&quot; data-origin-height=&quot;902&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2l9hP/btsOMJOYdLX/zOhBlyvF9G5VGCVFKNiXSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2l9hP/btsOMJOYdLX/zOhBlyvF9G5VGCVFKNiXSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2l9hP/btsOMJOYdLX/zOhBlyvF9G5VGCVFKNiXSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2l9hP%2FbtsOMJOYdLX%2FzOhBlyvF9G5VGCVFKNiXSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1562&quot; height=&quot;902&quot; data-origin-width=&quot;1562&quot; data-origin-height=&quot;902&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;code&gt;E&lt;/code&gt;, &lt;code&gt;F&lt;/code&gt;, &lt;code&gt;G&lt;/code&gt;를 이어 새로운 선분 &lt;code&gt;EF&lt;/code&gt;, &lt;code&gt;FG&lt;/code&gt;을 만든다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1562&quot; data-origin-height=&quot;902&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zcZ7R/btsOLQVBE3l/0uZ23Tb7c3vKp2uEUcCGV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zcZ7R/btsOLQVBE3l/0uZ23Tb7c3vKp2uEUcCGV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zcZ7R/btsOLQVBE3l/0uZ23Tb7c3vKp2uEUcCGV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzcZ7R%2FbtsOLQVBE3l%2F0uZ23Tb7c3vKp2uEUcCGV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1562&quot; height=&quot;902&quot; data-origin-width=&quot;1562&quot; data-origin-height=&quot;902&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;code&gt;t&lt;/code&gt;로 내분하여 점 &lt;code&gt;H&lt;/code&gt;, &lt;code&gt;I&lt;/code&gt;를 만든다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1562&quot; data-origin-height=&quot;902&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d97DPs/btsOLxPvBSU/o11D7lMpzHWlET0ZhGKS70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d97DPs/btsOLxPvBSU/o11D7lMpzHWlET0ZhGKS70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d97DPs/btsOLxPvBSU/o11D7lMpzHWlET0ZhGKS70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd97DPs%2FbtsOLxPvBSU%2Fo11D7lMpzHWlET0ZhGKS70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1562&quot; height=&quot;902&quot; data-origin-width=&quot;1562&quot; data-origin-height=&quot;902&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;code&gt;HI&lt;/code&gt;를 만든다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1562&quot; data-origin-height=&quot;902&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckA2gc/btsOLcrrpJB/rzeQRQap9C6J9NPBt47hn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckA2gc/btsOLcrrpJB/rzeQRQap9C6J9NPBt47hn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckA2gc/btsOLcrrpJB/rzeQRQap9C6J9NPBt47hn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckA2gc%2FbtsOLcrrpJB%2FrzeQRQap9C6J9NPBt47hn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1562&quot; height=&quot;902&quot; data-origin-width=&quot;1562&quot; data-origin-height=&quot;902&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;code&gt;t&lt;/code&gt;만큼 내분하여 점 &lt;code&gt;J&lt;/code&gt;를 구한다. 점이 1개만 남았으므로 이 지점이 베지어 곡선의 좌표가 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1562&quot; data-origin-height=&quot;902&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qUDAO/btsOK8idQWx/V2AkLfCSTxJ0AqXwS7POr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qUDAO/btsOK8idQWx/V2AkLfCSTxJ0AqXwS7POr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qUDAO/btsOK8idQWx/V2AkLfCSTxJ0AqXwS7POr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqUDAO%2FbtsOK8idQWx%2FV2AkLfCSTxJ0AqXwS7POr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1562&quot; height=&quot;902&quot; data-origin-width=&quot;1562&quot; data-origin-height=&quot;902&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;3차 베지에 곡선이 만들어지는 자세한 과정은 아래 코드펜을 참고하자.&lt;/p&gt;
&lt;div id=&quot;code_1750608335382&quot; data-ke-type=&quot;html&quot; data-source=&quot;&amp;lt;style&amp;gt;
  .codepen-wrap {
    width: 100%;
    aspect-ratio: 10 / 9;
    overflow: hidden;
  }

  .codepen-wrap iframe {
    width: 100%;
    height: 100%;
    border: 0;
    display: block;
  }
&amp;lt;/style&amp;gt;

&amp;lt;div class=&amp;quot;codepen-wrap&amp;quot;&amp;gt;
  &amp;lt;iframe
    src=&amp;quot;https://codepen.io/colorfilter/embed/GgJwJRW?default-tab=result&amp;quot;
    title=&amp;quot;Cubic Bezier Curves 3차 베지에 곡선&amp;quot;
    loading=&amp;quot;lazy&amp;quot;
    allowfullscreen
  &amp;gt;&amp;lt;/iframe&amp;gt;
&amp;lt;/div&amp;gt;&quot;&gt;
&lt;style&gt;
  .codepen-wrap {
    width: 100%;
    aspect-ratio: 10 / 9;
    overflow: hidden;
  }

  .codepen-wrap iframe {
    width: 100%;
    height: 100%;
    border: 0;
    display: block;
  }
&lt;/style&gt;
&lt;div class=&quot;codepen-wrap&quot;&gt;&lt;iframe src=&quot;https://codepen.io/colorfilter/embed/GgJwJRW?default-tab=result&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;베지에 곡선 수학 공식 이해하기&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1차 베지에 곡선 (조절점 2개)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1차 베지에 곡선(조절점 2개)은 아래 수학 공식으로 표현할 수 있다. &amp;mdash; 선형 보간 공식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ P = (1-t)P_1 + tP_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;$P_1$은 시작점, $P_2$는 끝점, $t$는 진행률(0 이상 1 이하, 0이면 출발 1이면 도착), $P$는 $t$에 따라 $P_1$에서 $P_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;예를 들어 $t = 0$일 때 $P$는 $P_1$과 정확히 일치한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \begin{aligned} t &amp;amp;= 0 \\ P &amp;amp;= (1 - 0)P_1 + 0 \cdot P_2 \\ &amp;amp;= 1 \cdot P_1 + 0 \\ &amp;amp;= P_1 \end{aligned} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$t = 0.3$은 출발점 $P_1$에서 끝점 $P_2$ 방향으로 전체 거리의 30%만큼 이동한 지점을 의미한다. 이 지점의 위치 $P$는 $P_1$과 $P_2$ 위치에 각각 가중치를 곱하여 더하는 &lt;u&gt;가중 평균(weighted average)&lt;/u&gt; 방식으로 계산할 수 있다. 가중 평균은 위치가 더 가까운 지점에 더 큰 가중치를 부여한다. $t = 0.3$ 일 때 $P$는 $P_1$에서 30%만큼 떨어져 있고, $P_2$에 70%만큼 떨어져 있으므로 $P_1$에 더 가깝다. 따라서 $P_1$에 가중치를 70%, $P_2$에 가중치 30%를 적용하여 결과적으로 $P = 0.7 \cdot P_1 + 0.3 \cdot P_2$ 수식이 완성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \begin{aligned} t &amp;amp;= 0.3 \\ P &amp;amp;= (1 - 0.3)P_1 + 0.3 \cdot P_2 \\ &amp;amp;= 0.7 \cdot P_1 + 0.3 \cdot P_2 \end{aligned} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$t = 1$일 때 $P$는 $P_2$와 정확히 일치한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \begin{aligned} t &amp;amp;= 1 \\ P &amp;amp;= (1 - 1)P_1 + 1 \cdot P_2 \\ &amp;amp;= 0 \cdot P_1 + 1 \cdot P_2 \\ &amp;amp;= 0 + P_2 \\ &amp;amp;= P_2 \end{aligned} $$&lt;/p&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차 베지에 곡선(선형 보간) 공식은 다음과 같이 수식을 전개하여 보다 직관적으로 나타낼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \begin{aligned} P &amp;amp;= P_1-tP_1+tP_2 \\ &amp;amp;= P_1+tP_2-tP_1 \\ &amp;amp;= P_1+t(P_2-P_1) \end{aligned} $$&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;2차 베지에 곡선 (조절점 3개)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조절점이 3개일 때 공식은 아래와 같다. 1차 베지에 곡선의 원리를 재귀적으로 적용한 것으로 기본적인 원리는 다르지 않다. 어떤 과정을 거쳐 아래 공식이 도출되는지 하나하나 살펴보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ P = (1 - t)^2 P_1 + 2(1 - t)t P_2 + t^2 P_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;먼저 2차 베지에 곡선에 필요한 3개의 조절점&amp;mdash;시작 $P_1$, 중간 $P_2$, 끝 $P_3$&amp;mdash;이 있다고 가정해 보자. 이 세 점을 이용해 두 개의 동적인 점을 만든다.&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;$P_1$에서 $P_2$로 이동하는 점 $Q_1 = (1-t)P_1+tP_2$&lt;/li&gt;
&lt;li&gt;$P_2$에서 $P_3$으로 이동하는 점 $Q_2 = (1-t)P_2+tP_3$&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;매개변수 $t$가 0에서 1로 변함에 따라, $Q_1$은 $P_1$에서 $P_2$로, $Q_2$는 $P_2$에서 $P_3$으로 일정하게(선형적) 이동한다. 2차 베지에 곡선 위의 최종적인 점 $P$는 이렇게 움직이는 두 점 $Q_1$, $Q_2$를 다시 $t$에 대해 선형 보간하여 얻을 수 있다. 즉, $Q_1$을 시작점으로 $Q_2$를 끝점으로 갖는 또 다른 1차 베지에 곡선을 만드는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ P = (1-t)Q_1 + tQ_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;이제 위 공식에 $Q_1$과 $Q_2$ 정의를 각각 대입해 보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \begin{aligned} P &amp;amp;= (1-t){\color{cyan}Q_1} + {\color{orange}tQ_2} \\ &amp;amp;= (1-t){\color{cyan}((1-t)P_1 + tP_2)} + {\color{orange}t((1-t)P_2 + tP_3)} \end{aligned} $$&lt;/p&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;$$ P = {\color{cyan}(1-t)(1-t)P_1 + (1-t)tP_2} + {\color{orange}t(1-t)P_2 + t \cdot tP_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;거듭제곱(&amp;sup2;)을 사용해서 식을 정리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ P = {\color{yellowgreen}(1-t)^2P_1} + (1-t)tP_2 + t(1-t)P_2 + {\color{yellowgreen}t^2P_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;가운데 있는 2개의 $P_2$ 항은 곱의 순서만 다를 뿐 동일하므로(동류항) 하나로 합쳐준다. 그럼 2차 베지에 곡선의 공식이 완성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ P = (1-t)^2P_1+{\color{yellowgreen}2(1-t)tP_2}+t^2P_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;3차, 4차 등 더 높은 차수의 베지에 곡선도 위와 동일한 원리가 재귀적으로 적용되어 만들어진다.&lt;/p&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-t)^2$, $2(1-t)t$, $t^2$ 같은 항들을 번스타인 기저 다항식(Bernstein basis polynomials)이라고 부른다. 이러한 항들은 $t$ 값에 따라 각 조절점이 곡선 위의 점 $P$에 얼마나 큰 영향(가중치)을 미치는지 결정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;베지에 곡선의 기울기&lt;/h2&gt;
&lt;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;아래는 다양한 베지에 곡선 예시.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;easing-example.gif&quot; data-origin-width=&quot;1731&quot; data-origin-height=&quot;1075&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d04G7z/btsO0x11KWl/WcwKnTYkxyBEjhvfPqntxK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d04G7z/btsO0x11KWl/WcwKnTYkxyBEjhvfPqntxK/img.gif&quot; data-alt=&quot;Image via Josh Collins Worth&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d04G7z/btsO0x11KWl/WcwKnTYkxyBEjhvfPqntxK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/d04G7z/btsO0x11KWl/WcwKnTYkxyBEjhvfPqntxK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1731&quot; height=&quot;1075&quot; data-filename=&quot;easing-example.gif&quot; data-origin-width=&quot;1731&quot; data-origin-height=&quot;1075&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Image via Josh Collins Worth&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;u&gt;x축은 시간의 흐름(지속 시간)&lt;/u&gt;, &lt;u&gt;y축은 애니메이션의 진행률&lt;/u&gt;을 나타낸다. 이때 곡선의 기울기가 그 순간의 속도가 된다. 따라서 기울기가 가팔수록 빠르게, 완만할수록 느리게 움직이는 효과를 낼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4O1xV/btsOKGzweZd/zmaDDBV5Rof2eEGvKetYS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4O1xV/btsOKGzweZd/zmaDDBV5Rof2eEGvKetYS1/img.png&quot; data-alt=&quot;Image via Josh Collins Worth&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4O1xV/btsOKGzweZd/zmaDDBV5Rof2eEGvKetYS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4O1xV%2FbtsOKGzweZd%2FzmaDDBV5Rof2eEGvKetYS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;720&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Image via Josh Collins Worth&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;x축은 애니메이션의 전체 지속시간을 1로 정규화했으므로 항상 0~1 범위로 지정해야 하지만, y축은 목표값 1을 넘어섰다가 다시 돌아오는 패턴을 활용해서 바운스 효과를 만들 수 있다.&lt;/p&gt;
&lt;pre class=&quot;plaintext&quot;&gt;&lt;code&gt;[0 &amp;rarr; 0.5 &amp;rarr; 0.8] &amp;rarr; [1.1] &amp;rarr; [0.95 &amp;rarr; 1.02 &amp;rarr; 0.98] &amp;rarr; [1.0]
     가속구간       오버슈트         바운스              도달&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;가속 구간 (0 &amp;rarr; 0.8): 기울기가 증가하면서 점점 빨라짐&lt;/li&gt;
&lt;li&gt;오버슈트 (1.1): y 값이 1.1에 도달했을 때 순간적으로 속도가 0이 된 후 운동 방향 전환&lt;/li&gt;
&lt;li&gt;바운스 (0.95 &amp;rarr; 1.02 &amp;rarr; 0.98): 목표값을 중심으로 y값이 위아래로 여러 번 출렁이는 구간&lt;/li&gt;
&lt;li&gt;도달 (1.0): 목표값에 도달하여 멈추는 구간&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;예를 들어 &lt;code&gt;cubic-bezier(0.34, 1.56, 0.64, 1)&lt;/code&gt; 처럼 설정하면 오버슈트 효과를 만들 수 있다. 참고로 오버슈트(Overshoot)는 목표 지점(1)을 의도적으로 넘어갔다가 다시 목표 지점으로 되돌아오는 움직임이고, 언더슈트(Undershoot)는 반대로 시작 지점(0)보다 더 뒤로 갔다가 다시 목표 지점으로 향하는 움직임을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드 및 데모&lt;/h2&gt;
&lt;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;베지에 곡선 애니메이션 구현 코드(타입스크립트)는 &lt;a title=&quot;레포지토리 링크&quot; href=&quot;https://github.com/romantech/bezier-curve&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;리포지토리 링크&lt;/a&gt;에서 확인할 수 있다. 아래는 구현 결과를 렌더링한 화면&lt;a title=&quot;베지에 곡선 애니메이션 데모&quot; href=&quot;https://romantech.github.io/bezier-curve/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;(데모 링크)&lt;/a&gt;. 셀렉트 박스를 눌러서 곡선의 차수(Degree)를 직접 변경할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;code_1751379780105&quot; data-ke-type=&quot;html&quot; data-source=&quot;&amp;lt;style&amp;gt;
  .embed-wrap {
    width: 100%;
    aspect-ratio: 10 / 9;
    overflow: hidden;
  }

  .embed-wrap iframe {
    width: 100%;
    height: 100%;
    border: 0;
    display: block;
  }
&amp;lt;/style&amp;gt;

&amp;lt;div class=&amp;quot;embed-wrap&amp;quot;&amp;gt;
  &amp;lt;iframe
    src=&amp;quot;https://romantech.github.io/bezier-curve/&amp;quot;
    title=&amp;quot;Bezier Curve Demo&amp;quot;
    loading=&amp;quot;lazy&amp;quot;
    allowfullscreen
  &amp;gt;&amp;lt;/iframe&amp;gt;
&amp;lt;/div&amp;gt;&quot;&gt;
&lt;style&gt;
  .embed-wrap {
    width: 100%;
    aspect-ratio: 10 / 9;
    overflow: hidden;
  }

  .embed-wrap iframe {
    width: 100%;
    height: 100%;
    border: 0;
    display: block;
  }
&lt;/style&gt;
&lt;div class=&quot;embed-wrap&quot;&gt;&lt;iframe src=&quot;https://romantech.github.io/bezier-curve/&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;레퍼런스&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;https://ko.javascript.info/bezier-curve&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;베지어 곡선 | JavaScript Info&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://joshcollinsworth.com/blog/easing-curves&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Understanding easing and cubic-bezier curves in CSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/easing-function&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;easing-function | MDN&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>  Programming</category>
      <category>B&amp;eacute;zier curve</category>
      <category>CSS</category>
      <category>cubic-bezier()</category>
      <category>Linear Interpolation</category>
      <category>베지어 곡선</category>
      <category>베지에 곡선</category>
      <category>선형 보간</category>
      <category>카스텔조 알고리즘</category>
      <category>컴퓨터 과학</category>
      <category>컴퓨터 그래픽스</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1330</guid>
      <comments>https://romantech.net/1330#entry1330comment</comments>
      <pubDate>Mon, 23 Jun 2025 01:39:22 +0900</pubDate>
    </item>
    <item>
      <title>[JS] async 함수가 await를 만났을 때 동작 흐름</title>
      <link>https://romantech.net/1329</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;TL;DR&lt;/h2&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;async/await는 비동기 코드를 동기 코드처럼 작성할 수 있도록 해주는 문법적 설탕(Syntax Sugar)이다. 내부적으로는 async 함수 실행을 일시 중단했다가 프로미스가 처리되면 마이크로태스크 큐를 통해 다시 재개하는 방식으로 논블로킹을 유지한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;async/await는 함수 실행을 중단/재개할 수 있는 제너레이터와 프로미스를 활용해서 구현되어 있으며, await 이후의 코드는 사실상 &lt;code&gt;.then()&lt;/code&gt; 메서드의 콜백 함수라고 볼 수 있다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;promise.then(() =&amp;gt; { /* await 이후의 코드 */ })&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;async/await 내부 메커니즘&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;async 함수를 호출하면 await 키워드를 만나기 전까지 일반 함수처럼 동기적으로 실행.&lt;/li&gt;
&lt;li&gt;async 함수 실행 중 await 키워드를 만나면 해당 지점에서 함수 실행을 일시 중지하고, 호출자에게 제어권 반환. 백그라운드에선 Promise 처리 시작.&lt;/li&gt;
&lt;li&gt;async 함수가 일시 중지(suspend)된 동안 JS 런타임은 호출자 컨텍스트의 다음 동기 코드 계속 실행. 덕분에 메인 스레드가 블로킹되지 않고, UI 렌더링 같은 다른 작업을 지연 없이 처리할 수 있음.&lt;/li&gt;
&lt;li&gt;프로미스가 처리(이행 혹은 거부)되면, 중단 지점 이후의 코드가 마이크로태스크 큐에 추가되고, 이벤트 루프에 의해 콜스택에 들어가서 실행 재개. 이때 await 표현식은 이행된 값을 반환하며, 거부된 경우 예외 throw.&lt;/li&gt;
&lt;li&gt;나머지 동기 코드 실행. async 함수 안에 또 다른 await를 만나면 2-4 과정 반복.&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;h2 data-ke-size=&quot;size26&quot;&gt;async/await 실행 흐름 예제&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;function main() {
  // Promise 생성자가 받는 executor 함수 자체는 동기적으로 실행됨
  return new Promise((resolve) =&amp;gt; {
    console.log(3);
    resolve(4);
    console.log(5);
  });
}

async function f() {
  console.log(2);
  let r = await main(); // 여기서 f() 실행 일시 중단
  console.log(r); // main() 프로미스 처리 후 실행
}

console.log(1);
f();
console.log(6);

// 1, 2, 3, 5, 6, 4&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;code&gt;console.log(1)&lt;/code&gt; : 전역 스코프의 동기적 코드 실행&lt;/li&gt;
&lt;li&gt;&lt;code&gt;f()&lt;/code&gt; 함수 호출
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;code&gt;console.log(2)&lt;/code&gt; : 함수 내부의 동기적 코드 실행&lt;/li&gt;
&lt;li&gt;&lt;code&gt;main()&lt;/code&gt; 함수 호출
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;console.log(3)&lt;/code&gt; : 실행자 함수 내부의 동기적 코드 실행&lt;/li&gt;
&lt;li&gt;&lt;code&gt;resolve(4)&lt;/code&gt; : 프로미스를 이행(fulfilled) 상태로 변경 &amp;rarr; 이 시점에 await로 대기중인 &lt;code&gt;f()&lt;/code&gt; 함수의 나머지 부분이 마이크로태스크 큐에 등록됨&lt;/li&gt;
&lt;li&gt;&lt;code&gt;console.log(5)&lt;/code&gt; : 실행자 함수 내부의 동기적 코드 실행&lt;/li&gt;
&lt;li&gt;&lt;code&gt;main()&lt;/code&gt; 함수는 이행된 상태의 프로미스 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;main()&lt;/code&gt; 함수가 반환한 프로미스를 확인하고, &lt;code&gt;f()&lt;/code&gt; 함수 실행 일시 중단 및 전역 스코프로 제어권 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;console.log(6)&lt;/code&gt; : 전역 스코프의 동기적 코드 실행&lt;/li&gt;
&lt;li&gt;&lt;code&gt;f()&lt;/code&gt; 함수의 나머지 코드 실행 &amp;rarr; 콜스택이 비어있는걸 확인한 이벤트 루프가 마이크로태스크 큐의 작업을 콜스택에 추가함
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;await 표현식에서 프로미스 결과값 &lt;code&gt;4&lt;/code&gt; 반환&lt;/li&gt;
&lt;li&gt;&lt;code&gt;console.log(4)&lt;/code&gt; : 함수 내부의 동기적 코드 실행&lt;/li&gt;
&lt;/ul&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;위 코드의 비동기 처리 과정을 시퀀스 다이어그램으로 표현해보면 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;async-await-flow.png&quot; data-origin-width=&quot;2118&quot; data-origin-height=&quot;2497&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9Kt6a/btsOAXN5ZWT/cgKNTjmX8KwXtZuPIkZGs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9Kt6a/btsOAXN5ZWT/cgKNTjmX8KwXtZuPIkZGs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9Kt6a/btsOAXN5ZWT/cgKNTjmX8KwXtZuPIkZGs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9Kt6a%2FbtsOAXN5ZWT%2FcgKNTjmX8KwXtZuPIkZGs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2118&quot; height=&quot;2497&quot; data-filename=&quot;async-await-flow.png&quot; data-origin-width=&quot;2118&quot; data-origin-height=&quot;2497&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>  Programming</category>
      <category>async function</category>
      <category>await</category>
      <category>JavaScript</category>
      <category>microtask</category>
      <category>Promise</category>
      <category>마이크로태스크</category>
      <category>비동기 처리</category>
      <category>실행 컨텍스트</category>
      <category>이벤트 루프</category>
      <category>자바스크립트</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1329</guid>
      <comments>https://romantech.net/1329#entry1329comment</comments>
      <pubDate>Sat, 14 Jun 2025 14:43:00 +0900</pubDate>
    </item>
    <item>
      <title>[CSS] grid-row 동작 방식 살펴보기</title>
      <link>https://romantech.net/1328</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;grid-row-start&lt;/code&gt;, &lt;code&gt;grid-row-end&lt;/code&gt; 속성은 그리드 아이템이 어느 행 라인부터 시작하여 어느 행 라인에서 끝날지 지정할 때 사용한다. 이 속성은 그리드 아이템(그리드 컨테이너의 직계 자식 요소) 자체에 적용한다. 참고로 그리드 라인은 컨테이너 시작 지점부터 1, 2, 3, &amp;hellip; 양수 번호가 부여되고, 컨테이너 끝 지점부터는 -1, -2, -3, &amp;hellip; 음수 번호가 부여된다.&lt;/p&gt;
&lt;pre class=&quot;css&quot; data-ke-language=&quot;css&quot;&gt;&lt;code&gt;/* 그리드 아이템이 1~2번 라인 차지(첫 번째 행 트랙) */
grid-row-start: 1; 
grid-row-end: 2;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IUeHn/btsOpd3qXx3/gAE1ojyyXFINKiLVfbREnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IUeHn/btsOpd3qXx3/gAE1ojyyXFINKiLVfbREnk/img.png&quot; data-alt=&quot;grid-row-start: 1; grid-row-end: 2;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IUeHn/btsOpd3qXx3/gAE1ojyyXFINKiLVfbREnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIUeHn%2FbtsOpd3qXx3%2FgAE1ojyyXFINKiLVfbREnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;1470&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1470&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;grid-row-start: 1; grid-row-end: 2;&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;code&gt;span&lt;/code&gt;은 그리드 아이템이 차지할 트랙의 개수를 지정할 때 사용한다. 여기서 트랙(track)이란 두 그리드 라인 사이의 공간을 의미한다. 그리드 셀 1개는 기본적으로 하나의 행 트랙과, 하나의 열 트랙이 교차하여 만들어지는 최소 단위 공간으로, 한 칸을 의미한다. 예를 들어 &lt;code&gt;span 2&lt;/code&gt; 를 사용하면 아이템이 2개의 행(또는 열) 트랙을 차지하도록 지정할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;css&quot; data-ke-language=&quot;css&quot;&gt;&lt;code&gt;grid-row-start: auto; /* 브라우저가 자동으로 아이템 행 시작 위치 결정 */
grid-row-end: span 2; /* 그리드 아이템이 시작 지점부터 2개 행 차지 */&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMpYVg/btsOo73rbCu/6YY2jiWJEkaTrkKquRkl7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMpYVg/btsOo73rbCu/6YY2jiWJEkaTrkKquRkl7K/img.png&quot; data-alt=&quot;grid-row-start: auto; grid-row-end: span 2;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMpYVg/btsOo73rbCu/6YY2jiWJEkaTrkKquRkl7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMpYVg%2FbtsOo73rbCu%2F6YY2jiWJEkaTrkKquRkl7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;1470&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1470&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;grid-row-start: auto; grid-row-end: span 2;&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;code&gt;grid-row&lt;/code&gt; 속성은 행 시작 위치(첫 번째 값; &lt;code&gt;grid-row-start&lt;/code&gt;)와 종료 위치(두 번째 값: &lt;code&gt;grid-row-end&lt;/code&gt;)를 한 번에 지정할 수 있는 단축 속성이다. 두 값은 슬래시 &lt;code&gt;/&lt;/code&gt; 를 이용하여 구분한다.&lt;/p&gt;
&lt;pre class=&quot;css&quot; data-ke-language=&quot;css&quot;&gt;&lt;code&gt;grid-row: auto / span 2;

/*
아래와 동일
grid-row-start: auto;
grid-row-end: span 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;code&gt;grid-row&lt;/code&gt; 속성의 두 번째 값을 생략하면 &lt;code&gt;grid-row-end&lt;/code&gt; 값은 &lt;code&gt;auto&lt;/code&gt;(하나의 트랙만 차지)로 설정된다.&lt;/p&gt;
&lt;pre class=&quot;css&quot; data-ke-language=&quot;css&quot;&gt;&lt;code&gt;grid-row: 2;

/*
아래와 동일 (2~3번 라인 차지)
grid-row-start: 2;
grid-row-end: auto;
-&amp;gt; grid-row-end: 3 혹은 grid-row-end: span 1 과 동일하게 동작
*/&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;code&gt;span&lt;/code&gt; 값을 지정하면, &lt;code&gt;grid-row-end&lt;/code&gt;만 지정한 것처럼 동작한다. &lt;a href=&quot;https://drafts.csswg.org/css-grid/#placement&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;CSS 명세&lt;/a&gt;에 따르면, 시작/종료 라인 값이 같을 경우 종료 라인은 무시되어 &lt;code&gt;auto&lt;/code&gt;로 처리된다. 시작 라인이 &lt;code&gt;span&lt;/code&gt;, 종료 라인이 &lt;code&gt;auto&lt;/code&gt; 일 땐, 시작 라인 &lt;code&gt;auto&lt;/code&gt;, 종료 라인 &lt;code&gt;span&lt;/code&gt;으로 지정한 것과 동일하게 동작한다&lt;a href=&quot;https://stackoverflow.com/questions/69971381/difference-between-auto-span-n-and-span-n-span-n-in-css-grid-column&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;(참고글)&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;참고로 Tailwind CSS의 &lt;code&gt;row-span-2&lt;/code&gt; 같은 클래스도 내부적으로 &lt;code&gt;grid-row: span 2 / span 2&lt;/code&gt; 형태로 지정되어 있기 때문에 결과적으로 &lt;code&gt;grid-row: auto / span 2&lt;/code&gt;와 동일하다고 볼 수 있다.&lt;/p&gt;
&lt;pre class=&quot;css&quot; data-ke-language=&quot;css&quot;&gt;&lt;code&gt;grid-row: span 2 / span 2;

/*
아래처럼 동작 (현재 위치에서 2개의 행 트랙 차지)
grid-row-start: auto;
grid-row-end: span 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;code&gt;span&lt;/code&gt; 키워드를 단독으로 사용했을 때도 시작 라인 &lt;code&gt;auto&lt;/code&gt;, 종료 라인 &lt;code&gt;span&lt;/code&gt;으로 해석돼서 &lt;code&gt;gird-row-end&lt;/code&gt;만 지정한 것처럼 동작한다.&lt;/p&gt;
&lt;pre class=&quot;css&quot; data-ke-language=&quot;css&quot;&gt;&lt;code&gt;grid-row: span 2;

/*
grid-row: span 2 / auto;
-&amp;gt; grid-row: auto / span 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;code&gt;grid-column&lt;/code&gt;, &lt;code&gt;grid-row&lt;/code&gt;는 각각 수평(열), 수직(행) 방향 차이만 있을 뿐 속성의 동작 원리는 동일하다.&lt;/p&gt;</description>
      <category>  Programming</category>
      <category>CSS</category>
      <category>GRID</category>
      <category>grid-column</category>
      <category>grid-row</category>
      <category>grid-row-end</category>
      <category>grid-row-start</category>
      <category>layout</category>
      <category>그리드</category>
      <category>레이아웃</category>
      <category>프론트엔드</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1328</guid>
      <comments>https://romantech.net/1328#entry1328comment</comments>
      <pubDate>Tue, 3 Jun 2025 20:28:04 +0900</pubDate>
    </item>
    <item>
      <title>[HTTP] ETag 엔티티 태그 헤더</title>
      <link>https://romantech.net/1327</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;TL;DR&lt;/h2&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;ETag(엔티티 태그; Entity Tag)는 HTTP 응답 헤더 중 하나로, 웹 리소스의 특정 버전을 식별하기 위한 고유한 식별자다. 클라이언트는 ETag를 이용해 리소스 변경 여부를 서버에 검증하고, 변경되지 않았으면 캐시 된 콘텐츠를 재사용함으로써 대역폭을 절약하고 성능을 개선할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;작동 방식&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;클라이언트가 특정 리소스를 처음 요청하면, 서버는 응답 헤더에 ETag 값을 포함하여 리소스와 함께 전달&lt;/li&gt;
&lt;li&gt;클라이언트는 응답으로 받은 ETag 값 저장&lt;/li&gt;
&lt;li&gt;이후 동일한 리소스 재요청 시 &lt;code&gt;If-None-Match&lt;/code&gt; 요청 헤더에 ETag 값을 담아서 서버로 전송&lt;/li&gt;
&lt;li&gt;서버는 전달받은 ETag 값과 현재 리소스의 ETag 값 비교
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;값이 일치하면 본문(body)은 생략하고 &lt;code&gt;304 Not Modified&lt;/code&gt; 반환&lt;/li&gt;
&lt;li&gt;값이 일치하지 않으면 최신 리소스와 새로운 ETag 값을 담아서 &lt;code&gt;200 OK&lt;/code&gt; 반환&lt;/li&gt;
&lt;/ul&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;h2 data-ke-size=&quot;size26&quot;&gt;ETag 종류&lt;/h2&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;ETag는 검증 강도에 따라 Strong ETag와 Weak ETag 두 가지 종류로 나뉜다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Strong ETag&lt;/b&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;리소스가 조금이라도 변경되면 ETag 값이 변경됨&lt;/li&gt;
&lt;li&gt;표기 예시: &lt;code&gt;&quot;abcdefg&quot;&lt;/code&gt; (접두사 없음)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Weak ETag&lt;/b&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;code&gt;W/&quot;abcdefg&quot;&lt;/code&gt; (&lt;code&gt;W/&lt;/code&gt; 접두사 추가)&lt;/li&gt;
&lt;/ul&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;Weak ETag는 의미에 영향을 주지 않는 부분(동적 타임스탬프, 광고 배너 등)을 제거하거나 정규화한 뒤, 남은 콘텐츠를 해시(hash)하여 생성한다. 정규화란 원본 데이터에서 불필요하거나 의미 없는 부분을 제거하고, 일정한 형태로 통일하는 과정을 의미한다. 예를 들어, HTML 타임스탬프는 다음과 같이 정규화할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;html xml&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;&amp;lt;!-- 정규화 전 --&amp;gt;
&amp;lt;div class=&quot;updated&quot;&amp;gt;2025-05-04 12:34&amp;lt;/div&amp;gt;
&amp;lt;!-- 정규화 후 --&amp;gt;
&amp;lt;div class=&quot;updated&quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ETag 값&lt;/h2&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;ETag 값은 일반적으로 큰따옴표로 감싼 문자열 형태로 표현하며, 별도의 표준 포맷은 없지만 주로 다음과 같은 방식으로 생성한다.&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;콘텐츠 내용의 해시 값 (MD5, SHA1 등)&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;업데이트 손실&lt;/h2&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;여러 클라이언트가 동일한 리소스를 거의 동시에 읽고 각각 수정을 시도하면, 나중에 처리된 변경이 앞선 변경을 덮어쓰는 업데이트 손실(Lost Update) 문제가 발생할 수 있다. 이를 방지하기 위해 &lt;code&gt;If-Match&lt;/code&gt; 헤더를 사용하여 클라이언트가 보유한 ETag와 서버의 ETag가 일치할 때만 변경 작업을 수행하도록 조건부 요청을 보낼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;클라이언트 A, B가 동시에 리소스 조회&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;A와 B가 각각 &lt;code&gt;GET&lt;/code&gt; 요청&lt;/li&gt;
&lt;li&gt;서버는 &lt;code&gt;ETag: &quot;v1&quot;&lt;/code&gt; 응답&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;A가 먼저 변경 요청&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;A는 &lt;code&gt;If-Match: &quot;v1&quot;&lt;/code&gt; 헤더와 함께 &lt;code&gt;PUT&lt;/code&gt; 요청&lt;/li&gt;
&lt;li&gt;서버는 ETag 일치 확인 후 업데이트 수행 &amp;rarr; ETag를 &lt;code&gt;&quot;v2&quot;&lt;/code&gt;로 갱신하고 &lt;code&gt;200 OK&lt;/code&gt; 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;B가 뒤이어 변경 요청&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;B는 여전히 &lt;code&gt;ETag: &quot;v1&quot;&lt;/code&gt;를 사용하여 &lt;code&gt;PUT&lt;/code&gt; 요청&lt;/li&gt;
&lt;li&gt;서버의 ETag는 이미 &lt;code&gt;&quot;v2&quot;&lt;/code&gt;이므로 B의 ETag와 불일치 &amp;rarr; &lt;code&gt;412 Precondition Failed&lt;/code&gt; 반환&lt;/li&gt;
&lt;/ul&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;만약 3번에서 조건 없이 B의 내용으로 덮어쓴다면 A의 변경 내용이 사라지는 문제가 발생한다. &lt;code&gt;If-Match&lt;/code&gt; 조건이 실패했을 땐 일반적으로 &lt;code&gt;412 Precondition Failed&lt;/code&gt;로 응답한다. 요청이 거부된 클라이언트가 충돌을 해결하려면 최신 리소스를 다시 GET 해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ETag와 Cache-Control&lt;/h2&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;Cache-Control은 브라우저와 중간 서버(Proxy, CDN 등)가 어떤 방식으로 응답을 캐싱할지 지정하는 헤더로, 캐싱 가능 여부(&lt;code&gt;public&lt;/code&gt;, &lt;code&gt;private&lt;/code&gt;, &lt;code&gt;no-store&lt;/code&gt;), 캐시 유효 기간(&lt;code&gt;max-age&lt;/code&gt;), 재검증 방식(&lt;code&gt;no-cache&lt;/code&gt;, &lt;code&gt;must-revalidate&lt;/code&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;Cache-Control과 ETag는 웹 캐싱 전략에서 상호 보완적인 역할을 수행하여, 함께 사용하면 더 효율적인 캐싱 정책을 구현할 수 있다.&lt;/p&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;code&gt;no-cache&lt;/code&gt; 설정을 적용하여 매번 서버에 재검증을 요청하게 하고, ETag를 통해 콘텐츠가 변경되지 않았을 땐 &lt;code&gt;304 Not Modified&lt;/code&gt;로 응답하여 불필요한 데이터 전송을 줄일 수 있다.&lt;/p&gt;
&lt;pre class=&quot;txt sql&quot;&gt;&lt;code&gt;Cache-Control: no-cache
ETag: &quot;v123&quot;&lt;/code&gt;&lt;/pre&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;code&gt;no-cache&lt;/code&gt;: 캐시 데이터 사용 전 매번 원본 서버에 재검증&lt;/li&gt;
&lt;li&gt;&lt;code&gt;must-revalidate&lt;/code&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;code&gt;max-age&lt;/code&gt;와 &lt;code&gt;immutable&lt;/code&gt;을 함께 설정하여 유효 기간 동안 서버 재검증 요청 없이 캐시 된 응답을 사용하도록 한다. &lt;code&gt;max-age&lt;/code&gt; 기간 동안 ETag를 이용한 재검증이 일어나지 않지만, 캐시가 만료되거나 &lt;code&gt;immutable&lt;/code&gt;을 지원하지 않는 일부 환경에서의 재검증을 위해 ETag를 함께 보내는 것이 일반적이다.&lt;/p&gt;
&lt;pre class=&quot;txt pgsql&quot;&gt;&lt;code&gt;Cache-Control: max-age=31536000, immutable
ETag: &quot;abc456&quot;&lt;/code&gt;&lt;/pre&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;code&gt;public&lt;/code&gt;: 브라우저와 중간 서버(프록시, CDN 등) 모두 응답을 캐싱하고 재사용할 수 있도록 허용&lt;/li&gt;
&lt;li&gt;&lt;code&gt;max-age=31536000&lt;/code&gt;: 캐시 생성 후 1년(31,536,000초) 동안 fresh 상태 유지&lt;/li&gt;
&lt;li&gt;&lt;code&gt;immutable&lt;/code&gt;: 유효 기간 내 리소스가 변경되지 않음을 나타내며, 해당 기간 동안 브라우저가 재검증 요청을 보내지 않도록 지시&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;레퍼런스&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;figure id=&quot;og_1746451133952&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;ETag - HTTP | MDN&quot; data-og-description=&quot;ETag HTTP 응답 헤더는 특정 버전의 리소스를 식별하는 식별자입니다. 웹 서버가 내용을 확인하고 변하지 않았으면, 웹 서버로 full 요청을 보내지 않기 때문에, 캐쉬가 더 효율적이게 되고, 대역폭&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Reference/Headers/ETag&quot; data-og-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Reference/Headers/ETag&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/v3Yw4/hyYRyvxEBK/3YNjakvKJr5TvqSDVoHZZ1/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Reference/Headers/ETag&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; data-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Reference/Headers/ETag&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/v3Yw4/hyYRyvxEBK/3YNjakvKJr5TvqSDVoHZZ1/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&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;ETag - HTTP | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;ETag HTTP 응답 헤더는 특정 버전의 리소스를 식별하는 식별자입니다. 웹 서버가 내용을 확인하고 변하지 않았으면, 웹 서버로 full 요청을 보내지 않기 때문에, 캐쉬가 더 효율적이게 되고, 대역폭&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.mozilla.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>  Programming</category>
      <category>cache-control</category>
      <category>Caching</category>
      <category>entity tag</category>
      <category>etag</category>
      <category>HTTP</category>
      <category>Network</category>
      <category>네트워크</category>
      <category>엔티티 태그</category>
      <category>웹개발</category>
      <category>캐싱</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1327</guid>
      <comments>https://romantech.net/1327#entry1327comment</comments>
      <pubDate>Mon, 5 May 2025 22:35:06 +0900</pubDate>
    </item>
    <item>
      <title>[JS] 자바스크립트 6줄로 이미지 비교 슬라이더 만들기</title>
      <link>https://romantech.net/1326</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이미지 비교 슬라이더는 핸들을 좌우로 움직여서 두 이미지를 비교할 수 있는 UI 패턴으로 쇼핑몰이나 제품 소개 페이지 등에서 자주 볼 수 있다. 이러한 이미지 비교 슬라이더는 &lt;code&gt;range&lt;/code&gt; 타입의 &lt;code&gt;input&lt;/code&gt; 태그와 6줄 정도의 자바스크립트 코드만으로 구현할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnb0dv/btsNpSNtLQJ/HD9SLAcVnKUAFIJVKemLD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnb0dv/btsNpSNtLQJ/HD9SLAcVnKUAFIJVKemLD1/img.png&quot; data-alt=&quot;이미지 출처 CopyHouse&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnb0dv/btsNpSNtLQJ/HD9SLAcVnKUAFIJVKemLD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcnb0dv%2FbtsNpSNtLQJ%2FHD9SLAcVnKUAFIJVKemLD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;840&quot; height=&quot;480&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이미지 출처 CopyHouse&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;code&gt;range&lt;/code&gt; 타입의 &lt;code&gt;input&lt;/code&gt;은 슬라이드바를 조정하여 범위 내 숫자 값을 선택할 수 있는 입력 필드다. 기본적으로 브라우저에서 제공하는 스타일이 적용되어 있다. 이 기본 스타일을 모두 제거하고 이미지의 너비/높이만큼 크기를 확장하면, 슬라이더 영역을 클릭 혹은 드래그할 때마다 (스타일을 제거해서 화면에 보이지 않는) 핸들이 해당 위치로 이동해서 값이 변경된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1522&quot; data-origin-height=&quot;738&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eev2ac/btsNpL8E8cV/R5yqkEDdgOrky9LTPam0UK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eev2ac/btsNpL8E8cV/R5yqkEDdgOrky9LTPam0UK/img.png&quot; data-alt=&quot;range input 기본 스타일 via MDN&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eev2ac/btsNpL8E8cV/R5yqkEDdgOrky9LTPam0UK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feev2ac%2FbtsNpL8E8cV%2FR5yqkEDdgOrky9LTPam0UK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1522&quot; height=&quot;738&quot; data-origin-width=&quot;1522&quot; data-origin-height=&quot;738&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;range input 기본 스타일 via MDN&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;이미지 1, 이미지 2를 감싸는 마스크 요소, range input, 구분선(Separator) 및 커스텀 핸들 이렇게 4개 레이어를 포개지도록 구성한다. 핸들을 움직일 때마다 슬라이더(range input) 값 만큼 마스크 요소의 너비를 조정하고, 넘치는 부분은 보이지 않도록 처리하면(overflow: hidden) 기본적인 이미지 비교 슬라이더가 완성된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1824&quot; data-origin-height=&quot;1242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/co08Ju/btsNpVv5sLv/3VQkdlywf5mNH9UtGhq7Dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/co08Ju/btsNpVv5sLv/3VQkdlywf5mNH9UtGhq7Dk/img.png&quot; data-alt=&quot;이미지 비교 슬라이더 레이어 구성. Separator는 Image Mask 가장 우측에 위치시킨다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/co08Ju/btsNpVv5sLv/3VQkdlywf5mNH9UtGhq7Dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fco08Ju%2FbtsNpVv5sLv%2F3VQkdlywf5mNH9UtGhq7Dk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1824&quot; height=&quot;1242&quot; data-origin-width=&quot;1824&quot; data-origin-height=&quot;1242&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이미지 비교 슬라이더 레이어 구성. Separator는 Image Mask 가장 우측에 위치시킨다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;HTML 구조&lt;/h2&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;첫 번째 이미지는 &lt;code&gt;.compare-img-one&lt;/code&gt; 클래스로 직접 배치하고(가장 하단), 두 번째 이미지는 마스킹 처리를 위해 &lt;code&gt;.compare-mask&lt;/code&gt; 요소 안에 포함되도록 한다. 두 번째 이미지는 첫 번째 이미지 위에 겹친 상태로 위치하게 된다. 구분선과 커스텀 핸들은 &lt;code&gt;.compare-mask&lt;/code&gt; 우측 끝에 위치해서 이미지 1과의 경계를 나타낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;.compare-input&lt;/code&gt; 요소는 클릭 혹은 드래그 이벤트를 처리하기 위해 가장 상단에 위치하게 된다. 참고로 HTML 문서에서 하단에 작성한 요소일수록 화면에선 위에 표시된다.&lt;/p&gt;
&lt;pre class=&quot;html xml&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;&amp;lt;section class=&quot;compare&quot;&amp;gt;
  &amp;lt;!-- 이미지 1 --&amp;gt;
  &amp;lt;img class=&quot;compare-img-one&quot; src=&quot;...&quot; /&amp;gt;
  &amp;lt;!-- 이미지 2 마스크 --&amp;gt;
  &amp;lt;div class=&quot;compare-mask&quot;&amp;gt;
    &amp;lt;!-- 이미지 2 --&amp;gt;
    &amp;lt;img class=&quot;compare-img-two&quot; src=&quot;...&quot; /&amp;gt;
  &amp;lt;/div&amp;gt;

  &amp;lt;!-- 이미지 1, 2 구분선 --&amp;gt;
  &amp;lt;div class=&quot;compare-separator&quot;&amp;gt;
    &amp;lt;!-- 커스텀 핸들 (svg 속성 및 path 생략) --&amp;gt;
    &amp;lt;svg class=&quot;compare-icon&quot;&amp;gt;&amp;lt;!-- ... --&amp;gt;&amp;lt;/svg&amp;gt;
  &amp;lt;/div&amp;gt;

  &amp;lt;!-- range input --&amp;gt;
  &amp;lt;input class=&quot;compare-input&quot; type=&quot;range&quot; min=&quot;0&quot; step=&quot;0.5&quot; max=&quot;100&quot; /&amp;gt;
&amp;lt;/section&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;CSS&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;컨테이너&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자식 요소들을 컨테이너인 &lt;code&gt;.compare&lt;/code&gt; 요소 기준으로 배치하기 위해 &lt;code&gt;position: relative&lt;/code&gt; 속성을 설정한다. 필요한 CSS 변수도 컨테이너에 정의한다. 부모 요소에서 정의한 CSS 변수는 자식 요소에서 참조할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;css&quot; data-ke-language=&quot;css&quot;&gt;&lt;code&gt;.compare {
  --mask-width: 50%; /* slider value */
  --handle-size: 33px;

  position: relative;
}&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;이미지 1&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Baseline (베이스라인): 글자 아래에 있는 가상의 선. 텍스트 요소는 글자마다 높이가 다르더라도 이 선을 기준으로 나란히 배치된다. g, j, p, q, y 같은 글자는 꼬리 부분이 베이스라인 아래로 내려간다. 이렇게 베이스라인 하단으로 확장되는 부분은 Descender라고 부른다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지 태그의 &lt;code&gt;display&lt;/code&gt; 속성 기본값은 &lt;code&gt;inline&lt;/code&gt;이기 때문에 텍스트처럼 베이스라인 기준으로 정렬된다. 이때 이미지 하단에 descender를 가진 글자들을 위한 공간이 자동으로 생성된다. 이 하단 여백을 없애고 싶으면 이미지의 &lt;code&gt;display&lt;/code&gt; 속성을 &lt;code&gt;block&lt;/code&gt;으로 설정하면 된다.&lt;/p&gt;
&lt;pre class=&quot;css&quot; data-ke-language=&quot;css&quot;&gt;&lt;code&gt;.compare-img-one {
  width: 100%; /* 부모 요소 너비만큼 이미지 크기 제한 */
  display: block; /* 이미지 아래 생성되는 하단 여백을 없애기 위해 block으로 변경 */
}&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;이미지 2 마스크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지 마스크는 컨테이너를 기준으로 위치해야 하므로 &lt;code&gt;position: absolute&lt;/code&gt;를 설정한다. 슬라이드 핸들을 조정할 때마다 슬라이더 값이 &lt;code&gt;--mask-width&lt;/code&gt; CSS 변수에 반영되며, 이 값은 이미지 마스크 요소의 너비로 적용된다. 만약 &lt;code&gt;--mask-width&lt;/code&gt; 가 50%라면 이미지 2는 절반만 표시된다. 나머지 영역은 &lt;code&gt;overflow: hidden&lt;/code&gt; 속성에 의해 잘림 처리되고, 그 아래에 있던 이미지 1이 표시된다.&lt;/p&gt;
&lt;pre class=&quot;css&quot; data-ke-language=&quot;css&quot;&gt;&lt;code&gt;.compare-mask {
  position: absolute;
  inset: 0;
  width: var(--mask-width);
  height: 100%;
  overflow: hidden;
}

.compare-img-two {
  height: 100%;
  /* width: auto 기본값 -&amp;gt; 원본 이미지 너비로 렌더링 */
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;이미지 구분선, 커스텀 핸들&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 설정된 이미지 마스크 너비만큼 구분선을 오른쪽으로 이동시키면 이미지 마스크 바로 우측(화면에 보이는 이미지 1 시작 지점)에 위치하게 된다. 이 상태에서 구분선 너비의 절반만큼 다시 왼쪽으로 이동하면 정확히 두 이미지의 경계에 걸치게 된다.&lt;/p&gt;
&lt;pre class=&quot;css&quot; data-ke-language=&quot;css&quot;&gt;&lt;code&gt;.compare-separator {
  position: absolute;
  inset: 0;
  width: 2px;
  height: 100%;
  left: var(--mask-width); /* 마스크 너비만큼 오른쪽으로 이동 */
  translate: -50%; /* 자신 너비의 50% 만큼 왼쪽으로 이동(1px) */
  background: var(--bg-color);
}&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;code&gt;top&lt;/code&gt;, &lt;code&gt;left&lt;/code&gt;, &lt;code&gt;translate&lt;/code&gt; 속성을 이용해서 경계선 중앙에 걸치도록 작성한다. 참고로 대부분의 브라우저에선 &lt;code&gt;translate&lt;/code&gt;, &lt;code&gt;rotate&lt;/code&gt;, &lt;code&gt;scale&lt;/code&gt; 등의 속성을 독립적인 CSS 속성으로 사용할 수 있다. 2021년 이전의 구형 브라우저에선 여전히 &lt;code&gt;transform: translate(x, y)&lt;/code&gt; 형태로 사용해야 한다.&lt;/p&gt;
&lt;pre class=&quot;css&quot; data-ke-language=&quot;css&quot;&gt;&lt;code&gt;.compare-icon {
  position: absolute;
  top: 50%;
  left: var(--mask-width);
  width: var(--handle-size);
  height: var(--handle-size);
  translate: -50% -50%;
  padding: 6px;
  color: var(--bg-color);
  background: white;
  stroke-width: 2px;
  border: 2px solid currentColor;
  border-radius: 50%;
}&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;Range Input&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커스텀 핸들 코드를 잠시 제거한 뒤 가장자리로 드래그해 보면, 구분선과 핸들 사이에 간격이 생기는 것을 확인할 수 있다. 이 간격은 정확히 핸들 너비의 절반만큼 벌어진다. 핸들이 슬라이드 영역을 벗어나지 않도록 내부적으로 일정 비율만큼 이동을 제한하기 때문에 이러한 현상이 발생하는 것.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20250414_224909.gif&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;831&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dOjw59/btsNp1DnUV6/hbOvoLV0qv3PW3vvTwheN0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dOjw59/btsNp1DnUV6/hbOvoLV0qv3PW3vvTwheN0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dOjw59/btsNp1DnUV6/hbOvoLV0qv3PW3vvTwheN0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/dOjw59/btsNp1DnUV6/hbOvoLV0qv3PW3vvTwheN0/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;831&quot; data-filename=&quot;20250414_224909.gif&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;831&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 이미지처럼 슬라이더(range input) 양쪽에 핸들 너비의 절반만큼(벌어진 간격) 공간을 추가하면, 핸들의 중심이 슬라이더 끝점에 정확히 위치해서 문제가 해결된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1669&quot; data-origin-height=&quot;1041&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Uxa7c/btsNqjQ5zo8/7BzVbuxyQBd7EKbk8PxNDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Uxa7c/btsNqjQ5zo8/7BzVbuxyQBd7EKbk8PxNDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Uxa7c/btsNqjQ5zo8/7BzVbuxyQBd7EKbk8PxNDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUxa7c%2FbtsNqjQ5zo8%2F7BzVbuxyQBd7EKbk8PxNDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1669&quot; height=&quot;1041&quot; data-origin-width=&quot;1669&quot; data-origin-height=&quot;1041&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;.compare-input {
  appearance: none; /* 슬라이더 기본 스타일 제거 */
  background: none; /* 슬라이더 배경 제거 */

  position: absolute;
  inset: 0; /* 네 방향의 여백을 모두 0으로 설정하면 부모 요소 크기만큼 채움 */
  cursor: col-resize;

  /* 핸들의 중심이 슬라이더 끝점에 위치할 수 있도록 조정 */
  width: calc(100% + var(--handle-size));
  left: calc(var(--handle-size) / -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;code&gt;::-webkit-slider-thumb&lt;/code&gt; 가상 요소에 &lt;code&gt;appearance: none;&lt;/code&gt; 속성을 추가하여 브라우저 기본 스타일을 제거한다. 이때 &lt;code&gt;width&lt;/code&gt; 값을 지정하지 않으면 핸들이 슬라이더 트랙 너비만큼 확장되는 현상이 발생하므로 커스텀 핸들 크기에 맞게 너비를 설정해준다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;.compare-input::-webkit-slider-thumb {
  appearance: none; /* Range Input 기본 핸들 스타일 제거 */
  width: var(--handle-size); /* width 지정 안하면 트랙 꽉 채움 */
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;JavaScript&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;부모 요소에 선언한 CSS 변수는 자식 요소에서 참조할 수 있으며, 자식 요소에서 동일한 변수 이름으로 재정의(오버라이드)할 수도 있다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트 코드는 복잡한 로직 없이 range input 이벤트 핸들러만 할당하면 된다. input 이벤트가 발생할 때마다(슬라이드 핸들 드래그) &lt;code&gt;--mask-width&lt;/code&gt; CSS 변수 값을 업데이트하면, 해당 변수를 사용하는 이미지 마스크, 구분선, 커스텀 핸들에 바로 반영된다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;const $compare = document.querySelector(&quot;.compare&quot;);
const $compareInput = document.querySelector(&quot;.compare-input&quot;);

// range input 값이 변경될 때마다 --mask-width CSS 변수 업데이트
// .compare 자식 요소에서 해당 CSS 변수를 사용한다면 변경된 값이 적용됨
$compareInput.addEventListener(&quot;input&quot;, (e) =&amp;gt; {
  $compare.style.setProperty(&quot;--mask-width&quot;, `${e.target.value}%`);
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;완성 CodePen&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;div id=&quot;code_1744888759425&quot; data-ke-type=&quot;html&quot; data-source=&quot;&amp;lt;style&amp;gt;
  .codepen-wrap {
    width: 100%;
    aspect-ratio: 4 / 3;
    overflow: hidden;
  }

  .codepen-wrap iframe {
    width: 100%;
    height: 100%;
    border: 0;
    display: block;
  }
&amp;lt;/style&amp;gt;

&amp;lt;div class=&amp;quot;codepen-wrap&amp;quot;&amp;gt;
  &amp;lt;iframe
    src=&amp;quot;https://codepen.io/colorfilter/embed/bNGXWoV?default-tab=result&amp;quot;
    title=&amp;quot;Image Comparison Slider 이미지 비교 슬라이더&amp;quot;
    loading=&amp;quot;lazy&amp;quot;
    allowfullscreen
  &amp;gt;&amp;lt;/iframe&amp;gt;
&amp;lt;/div&amp;gt;&quot;&gt;
&lt;style&gt;
  .codepen-wrap {
    width: 100%;
    aspect-ratio: 4 / 3;
    overflow: hidden;
  }

  .codepen-wrap iframe {
    width: 100%;
    height: 100%;
    border: 0;
    display: block;
  }
&lt;/style&gt;
&lt;div class=&quot;codepen-wrap&quot;&gt;&lt;iframe src=&quot;https://codepen.io/colorfilter/embed/bNGXWoV?default-tab=result&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;레퍼런스&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;https://muffinman.io/blog/image-comparison-slider/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Image comparison slider in 6 lines of JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/input/range&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;MDN&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>  Programming</category>
      <category>CSS</category>
      <category>css 변수</category>
      <category>HTML</category>
      <category>image comparison slider</category>
      <category>JavaScript</category>
      <category>range input</category>
      <category>슬라이더</category>
      <category>이미지 비교</category>
      <category>이미지 비교 슬라이더</category>
      <category>자바스크립트</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1326</guid>
      <comments>https://romantech.net/1326#entry1326comment</comments>
      <pubDate>Thu, 17 Apr 2025 20:27:32 +0900</pubDate>
    </item>
    <item>
      <title>무료 이미지 호스팅 구축하기 (Cloudflare R2 + PicGo + WebP Cloud)</title>
      <link>https://romantech.net/1325</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;a href=&quot;https://developers.cloudflare.com/r2/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Cloudflare R2&lt;/a&gt;, &lt;a href=&quot;https://picgo.github.io/PicGo-Doc/en/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;PicGo&lt;/a&gt;, &lt;a href=&quot;https://webp.se/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;WebP Cloud&lt;/a&gt;를 이용해 이미지 호스팅을 직접 구축하는 방법을 소개할까 한다. 개인적인 용도로 사용한다면 각 서비스의 무료 요금제(Free tier)로도 충분히 사용할 수 있다. 특히 Cloudflare R2는 330개 이상 데이터 센터로 구성된 글로벌 네트워크를 통해 안정적인 데이터 접근을 보장하고, 무엇보다 &lt;a href=&quot;https://developers.cloudflare.com/r2/pricing/#free-tier&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;이그레스 비용(외부로 데이터 전송)이 없다는 장점&lt;/a&gt;이 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;이그레스(Egress) 비용은 클라우드에서 외부로 나가는 데이터에 대해 부과하는 요금을 의미한다. 예를 들어 스토리지에 저장된 이미지를 웹 브라우저에서 로드하거나 다운로드할 때도 이그레스 트래픽이 발생한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 74px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 25.0775%; height: 19px;&quot;&gt;&lt;b&gt;서비스&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 37.8682%; height: 19px;&quot;&gt;&lt;b&gt;용도&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 37.0542%; height: 19px;&quot;&gt;&lt;b&gt;무료 플랜 제공&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 25.0775%; height: 19px;&quot;&gt;Cloudflare R2&lt;/td&gt;
&lt;td style=&quot;width: 37.8682%; height: 19px;&quot;&gt;S3 호환 오브젝트 스토리지 서비스&lt;/td&gt;
&lt;td style=&quot;width: 37.0542%; height: 19px;&quot;&gt;매월 10GB 저장 공간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 25.0775%; height: 19px;&quot;&gt;PicGo&lt;/td&gt;
&lt;td style=&quot;width: 37.8682%; height: 19px;&quot;&gt;이미지 업로드 도구. GUI/CLI 지원&lt;/td&gt;
&lt;td style=&quot;width: 37.0542%; height: 19px;&quot;&gt;오픈소스 (무료)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 25.0775%; height: 17px;&quot;&gt;WebP Cloud&lt;/td&gt;
&lt;td style=&quot;width: 37.8682%; height: 17px;&quot;&gt;이미지 프록시 (이미지 최적화)&lt;/td&gt;
&lt;td style=&quot;width: 37.0542%; height: 17px;&quot;&gt;하루 3000건 요청, 200MB 캐시&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cloudflare R2 버킷에 업로드한 이미지는 WebP Cloud라는 이미지 프록시 서비스를 이용해 최적화된 형태로 불러올 수 있다. URL 파라미터를 통해 이미지 리사이즈, 퀄리티 조정, 워커마크 추가 등 &lt;a href=&quot;https://docs.webp.se/webp-cloud/feature/#quality&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;다양한 기능&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;위 서비스들을 이용해 이미지 호스팅을 구축하면 아래 과정을 거쳐 이미지를 처리하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;이미지 업로드:&lt;/b&gt; PicGo 이용해서 이미지 업로드 &amp;rarr; R2 버킷에 원본 이미지 저장 &amp;rarr; WebP Cloud URL 반환&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이미지 요청:&lt;/b&gt; WebP Cloud URL로 이미지 요청 &amp;rarr; R2 버킷에서 불러온 원본 이미지를 WebP/AVIF로 최적화하여 응답 후 캐싱. 이후 동일한 이미지로 요청을 받으면 캐싱한 이미지로 빠르게 응답&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;1140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D99T5/btsNa23QKLl/YPEkiHItzHkZcfI8RqvUm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D99T5/btsNa23QKLl/YPEkiHItzHkZcfI8RqvUm0/img.png&quot; data-alt=&quot;이미지 요청/응답 과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D99T5/btsNa23QKLl/YPEkiHItzHkZcfI8RqvUm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD99T5%2FbtsNa23QKLl%2FYPEkiHItzHkZcfI8RqvUm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1408&quot; height=&quot;1140&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;1140&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Cloudflare R2 버킷 생성&lt;/h2&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;① &lt;a href=&quot;https://dash.cloudflare.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Cloudflare 대시보드&lt;/a&gt; &amp;rarr; R2 개체 저장공간 &amp;rarr; 신용카드 연동(무료 사용량 초과 시 요금 청구). 클래스 A 작업은 쓰기, 업로드 등에 해당되고 클래스 B 작업은 읽기, 조회 등에 해당된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2980&quot; data-origin-height=&quot;1502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdgAeJ/btsM9JLp59T/zeu5MBMH3HDnZtj7wmOhE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdgAeJ/btsM9JLp59T/zeu5MBMH3HDnZtj7wmOhE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdgAeJ/btsM9JLp59T/zeu5MBMH3HDnZtj7wmOhE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdgAeJ%2FbtsM9JLp59T%2Fzeu5MBMH3HDnZtj7wmOhE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2980&quot; height=&quot;1502&quot; data-origin-width=&quot;2980&quot; data-origin-height=&quot;1502&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1034&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zV55q/btsM90e4x3I/36xRsWk0TBWusOBXB772m1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zV55q/btsM90e4x3I/36xRsWk0TBWusOBXB772m1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zV55q/btsM90e4x3I/36xRsWk0TBWusOBXB772m1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzV55q%2FbtsM90e4x3I%2F36xRsWk0TBWusOBXB772m1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;1034&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1034&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;버킷 이름: 임의 입력&lt;/li&gt;
&lt;li&gt;위치: 자동 (WebP Cloud 리전이 Hillsboro, OR에 위치하므로 위치 힌트를 서부 북아메리카로 선택)&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;③ 버킷 &amp;rarr; 설정 &amp;rarr; &quot;사용자 설정 도메인 추가&quot;에서 도메인 연동. 연동한 도메인을 통해 버킷 콘텐츠에 공개적으로 액세스할 수 있다. 만약 도메인이 없다면 R2.dev 하위 도메인을 활성화해서 공개적으로 액세스할 수도 있지만 속도 제한이 있는 단점이 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;592&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kZlvK/btsNaE98Rw2/BZJEGKy4KnSirHYvTVCawk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kZlvK/btsNaE98Rw2/BZJEGKy4KnSirHYvTVCawk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kZlvK/btsNaE98Rw2/BZJEGKy4KnSirHYvTVCawk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkZlvK%2FbtsNaE98Rw2%2FBZJEGKy4KnSirHYvTVCawk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;592&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;592&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;④ R2 개요 페이지 &amp;rarr; { } API ⏷ 버튼 &amp;rarr; API 토큰 관리 &amp;rarr; API 토큰 생성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bViRCc/btsNbfICxGc/KROsbTknaUqIk36BE5fL2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bViRCc/btsNbfICxGc/KROsbTknaUqIk36BE5fL2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bViRCc/btsNbfICxGc/KROsbTknaUqIk36BE5fL2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbViRCc%2FbtsNbfICxGc%2FKROsbTknaUqIk36BE5fL2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;1604&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1604&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;토큰 이름: 임의 입력&lt;/li&gt;
&lt;li&gt;권한: 개체 읽기 및 쓰기&lt;/li&gt;
&lt;li&gt;버킷 지정: &quot;특정 버킷에만 적용&quot; 선택 후 생성한 버킷 선택&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⑤ 생성한 API 토큰 값, 액세스 ID/키, 엔드포인트 주소는 안전한 곳(비밀번호 관리자 등)에 저장&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1755&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNXSvT/btsNaya7mYX/IIDOkiVCkybp9tGKvls6O0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNXSvT/btsNaya7mYX/IIDOkiVCkybp9tGKvls6O0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNXSvT/btsNaya7mYX/IIDOkiVCkybp9tGKvls6O0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNXSvT%2FbtsNaya7mYX%2FIIDOkiVCkybp9tGKvls6O0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;1755&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1755&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;WebP Cloud 설정 (이미지 최적화)&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Free 플랜은 하루 3000건 요청, 200MB 캐시, 대역폭 무제한, 최대 3개의 프록시를 생성할 수 있다. WebP Cloud는 요청받은 이미지에 대해 WebP/AVIF 포맷으로 변환한 후 최적화된 이미지를 제공한다.&lt;br /&gt;&lt;br /&gt;만약 일일 한도(Quota)를 초과했다면 원본 이미지 주소로 301 리다이렉트되고, 캐시 용량을 초과한 경우에는 LRU(Least Recently Used) 알고리즘에 따라 가장 오래 사용하지 않은 캐시부터 순차적으로 삭제된다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;프록시 생성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① &lt;a href=&quot;https://dashboard.webp.se/proxy&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;WebP Cloud 로그인&lt;/a&gt; 후 Create Proxy 버튼 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;851&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lp6jF/btsNa14YjpJ/tkMv9J9MJStX4o31xwApLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lp6jF/btsNa14YjpJ/tkMv9J9MJStX4o31xwApLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lp6jF/btsNa14YjpJ/tkMv9J9MJStX4o31xwApLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flp6jF%2FbtsNa14YjpJ%2FtkMv9J9MJStX4o31xwApLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;851&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;851&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 widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbJWA1/btsNaBMqtd1/ItnjxxrrTE5j3BFAGZmHGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbJWA1/btsNaBMqtd1/ItnjxxrrTE5j3BFAGZmHGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbJWA1/btsNaBMqtd1/ItnjxxrrTE5j3BFAGZmHGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbJWA1%2FbtsNaBMqtd1%2FItnjxxrrTE5j3BFAGZmHGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;1536&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1536&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Proxy Region: Hillsboro, OR (미국 서부 북아메리카)&lt;/li&gt;
&lt;li&gt;Proxy Name: 임의 입력&lt;/li&gt;
&lt;li&gt;Proxy Origin URL: R2 버킷에 설정한 도메인 혹은 R2.dev 주소&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;WebP Cloud URL&lt;/b&gt; 복사. 필요 시 커스텀 도메인을 설정할 수도 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2530&quot; data-origin-height=&quot;868&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cStWmK/btsM90zrpFc/sf78vudESDfbJt7wby5Djk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cStWmK/btsM90zrpFc/sf78vudESDfbJt7wby5Djk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cStWmK/btsM90zrpFc/sf78vudESDfbJt7wby5Djk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcStWmK%2FbtsM90zrpFc%2Fsf78vudESDfbJt7wby5Djk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2530&quot; height=&quot;868&quot; data-origin-width=&quot;2530&quot; data-origin-height=&quot;868&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;적응형 크기 조절&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프록시 대시보드에서 Adaptive Resize 기능을 통해 데스크톱/모바일에 대한 최대 이미지 너비를 설정할 수 있다. 이 기능을 활성화하면 브라우저의 User Agent 헤더를 기반으로 데스크톱/모바일 사용 여부를 판단한 후, 설정한 기기 너비보다 더 큰 이미지는 자동으로 비율에 맞춰 리사이즈된다. &lt;br /&gt;&lt;br /&gt;예를 들어 데스크톱 최대 너비를 1600(px)으로 설정했다면, 데스크톱으로 접속했을 때 너비가 2000인 이미지는 1600으로 자동 리사이즈된다. 이를 통해 이미지 용량을 줄이고 렌더링 속도를 향상할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2046&quot; data-origin-height=&quot;948&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dC1VkI/btsNbw4qH8l/2xHxWBAExC5JPAaYbzfty0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dC1VkI/btsNbw4qH8l/2xHxWBAExC5JPAaYbzfty0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dC1VkI/btsNbw4qH8l/2xHxWBAExC5JPAaYbzfty0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdC1VkI%2FbtsNbw4qH8l%2F2xHxWBAExC5JPAaYbzfty0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2046&quot; height=&quot;948&quot; data-origin-width=&quot;2046&quot; data-origin-height=&quot;948&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;이미지 조작&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WebP Cloud는 URL 파라미터를 통해 이미지 조작 기능을 제공한다. 아래 표에 있는 기능 외에도 워터마크 추가, 이미지 필터, 커스텀 헤더 등 다양한 기능을 제공한다. 자세한 내용은 &lt;a href=&quot;https://docs.webp.se/webp-cloud/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;공식 문서&lt;/a&gt; 참고.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;b&gt;기능&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 28.3721%;&quot;&gt;&lt;b&gt;파라미터 예시&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.6279%;&quot;&gt;&lt;b&gt;조정 범위&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;b&gt;참고&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;크기 조정&lt;/td&gt;
&lt;td style=&quot;width: 28.3721%;&quot;&gt;&lt;code&gt;?width=200&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.6279%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;수직 뒤집기&lt;/td&gt;
&lt;td style=&quot;width: 28.3721%;&quot;&gt;&lt;code&gt;?flip=v&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.6279%;&quot;&gt;&lt;code&gt;v&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;수평 뒤집기&lt;/td&gt;
&lt;td style=&quot;width: 28.3721%;&quot;&gt;&lt;code&gt;?flip=h&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.6279%;&quot;&gt;&lt;code&gt;h&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;퀄리티 조정&lt;/td&gt;
&lt;td style=&quot;width: 28.3721%;&quot;&gt;&lt;code&gt;?quality=60&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.6279%;&quot;&gt;10~100&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;100은 무손실 변환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;블러 효과&lt;/td&gt;
&lt;td style=&quot;width: 28.3721%;&quot;&gt;&lt;code&gt;?blur=10&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.6279%;&quot;&gt;10~100&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;선명함&lt;/td&gt;
&lt;td style=&quot;width: 28.3721%;&quot;&gt;&lt;code&gt;?sharpen=5&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.6279%;&quot;&gt;1~10&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;회전&lt;/td&gt;
&lt;td style=&quot;width: 28.3721%;&quot;&gt;&lt;code&gt;?rotate=90&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.6279%;&quot;&gt;0~360&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;밝기&lt;/td&gt;
&lt;td style=&quot;width: 28.3721%;&quot;&gt;&lt;code&gt;?brightness=0.2&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.6279%;&quot;&gt;0~10&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;1은 변경없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;채도&lt;/td&gt;
&lt;td style=&quot;width: 28.3721%;&quot;&gt;&lt;code&gt;?saturation=0&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.6279%;&quot;&gt;0~10&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;1은 변경없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;색조&lt;/td&gt;
&lt;td style=&quot;width: 28.3721%;&quot;&gt;&lt;code&gt;?hue=45&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.6279%;&quot;&gt;0~360&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;0은 변경없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;대비&lt;/td&gt;
&lt;td style=&quot;width: 28.3721%;&quot;&gt;&lt;code&gt;?contrast=0.5&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.6279%;&quot;&gt;0~10&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;1은 변경없음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;PicGo 설정 (이미지 업로드)&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;PicGo 언어가 중국어로 나온다면 PicGo设置(설정) &amp;rarr; 选择语言(언어 선택) 메뉴에서 영어로 변환할 수 있다. 중국 개발자가 만든 플러그인이 다국어(영어 등)를 지원하지 않는다면 중국어 메뉴로 표시될 수 있다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① &lt;a href=&quot;https://github.com/Molunerfinn/PicGo/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Release&lt;/a&gt; 페이지에서 최신 버전 다운로드/설치. 패키지 매니저를 통해 설치할 수도 있다(아래 명령어 참고).&lt;/p&gt;
&lt;pre id=&quot;code_1743928841440&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Homebrew (macOS)
brew install picgo

# Chocolatey (Windows)
choco install picgo&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;② PicGo Main Window &amp;rarr; Plugins Settings &amp;rarr; &lt;code&gt;s3&lt;/code&gt; 검색 후 설치 (wayjam 개발자)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;900&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rqAnT/btsNa4ADL8P/Hj8866kF03mNykkkjbLVA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rqAnT/btsNa4ADL8P/Hj8866kF03mNykkkjbLVA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rqAnT/btsNa4ADL8P/Hj8866kF03mNykkkjbLVA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrqAnT%2FbtsNa4ADL8P%2FHj8866kF03mNykkkjbLVA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;900&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;900&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;③ PicGo Main Window &amp;rarr; Picbeds Settings &amp;rarr; Amazon S3 클릭 후 설정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;1952&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVBYZx/btsNbwpQytY/KzbhfcJFkebFrP81NkoeP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVBYZx/btsNbwpQytY/KzbhfcJFkebFrP81NkoeP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVBYZx/btsNbwpQytY/KzbhfcJFkebFrP81NkoeP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVBYZx%2FbtsNbwpQytY%2FKzbhfcJFkebFrP81NkoeP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1246&quot; height=&quot;1952&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;1952&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Configuration Name: 임의 입력&lt;/li&gt;
&lt;li&gt;应用密钥 ID: Cloudflare에서 생성한 API 액세스 키 ID&lt;/li&gt;
&lt;li&gt;应用密钥: Cloudflare에서 생성한 API 액세스 키&lt;/li&gt;
&lt;li&gt;桶名: Cloudflare 버킷 이름&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/wayjam/picgo-plugin-s3#%E4%B8%8A%E4%BC%A0%E8%B7%AF%E5%BE%84uploadpath&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;上传文件路径&lt;/a&gt;: 이미지 저장 경로/파일명 (파일명만 입력하면 루트 경로에 저장)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파일명.확장자 지정 예시: &lt;code&gt;{fileName}.{extName}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;경로/파일명.확장자 지정 예시: &lt;code&gt;{year}/{month}/{md5}.{extName}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;自定义节点: Cloudflare API 엔드포인트 주소&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/wayjam/picgo-plugin-s3#%E8%87%AA%E5%AE%9A%E4%B9%89%E8%BE%93%E5%87%BA-url-%E6%A8%A1%E6%9D%BFoutputurlpattern&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;自定义输出URL模板&lt;/a&gt;: 이미지 업로드 후 생성되는 URL 형식 (도메인 부분에 WebP Cloud URL 입력)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예) &lt;code&gt;https://abc.webp.li/{fileName}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상적으로 설정했다면 PicGo로 이미지를 업로드했을 때 WebP Cloud 주소가 생성된다. 브라우저 주소창에 생성된 이미지 주소로 접속해 보면 최적화된 이미지를 불러온다. 1.7MB 크기의 PNG 이미지를 업로드했을 때 최적화한 이미지 크기는 150KB 정도로 약 91% 줄어들었다. 상당한 감소다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2666&quot; data-origin-height=&quot;1046&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Q4kVG/btsNaHyRMz8/Ar0nxT9uqnfbAETtm23yG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Q4kVG/btsNaHyRMz8/Ar0nxT9uqnfbAETtm23yG1/img.png&quot; data-alt=&quot;WebP Cloud를 사용했을 때 이미지 크기/퀄리티 변화 예시 via WebP Cloud&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Q4kVG/btsNaHyRMz8/Ar0nxT9uqnfbAETtm23yG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQ4kVG%2FbtsNaHyRMz8%2FAr0nxT9uqnfbAETtm23yG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2666&quot; height=&quot;1046&quot; data-origin-width=&quot;2666&quot; data-origin-height=&quot;1046&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;WebP Cloud를 사용했을 때 이미지 크기/퀄리티 변화 예시 via WebP Cloud&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;(번외) Typora 자동 이미지 업로드 설정&lt;/h2&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;유명한 마크다운 에디터인 &lt;a href=&quot;https://typora.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Typora&lt;/a&gt;는 PicGo를 연동한 이미지 업로드 기능을 지원한다. 마크다운 파일은 일반 텍스트 형식이기 때문에 이미지 파일을 포함하지 않고 외부 경로에 대한 참조만 유지한다. 만약 마크다운 파일을 이동하거나 공유할 경우 이미지 참조가 유실될 수 있다. PicGo를 이용해 이미지를 온라인에 자동 업로드하도록 설정하면 이러한 문제를 방지할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① Typora 설정 &amp;rarr; 일반 &amp;rarr; 언어 &amp;rarr; 简体中文 선택 (PicGo App 항목은 중국어로 설정했을 때만 표시된다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;② Typora 재시작&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;③ 설정 &amp;rarr; 图像(이미지)에서...&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;960&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dFt7w1/btsNbqDiptl/8shkjIphwbl3DSlvyKuhv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dFt7w1/btsNbqDiptl/8shkjIphwbl3DSlvyKuhv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dFt7w1/btsNbqDiptl/8shkjIphwbl3DSlvyKuhv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdFt7w1%2FbtsNbqDiptl%2F8shkjIphwbl3DSlvyKuhv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1440&quot; height=&quot;960&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;插入图片时 (이미지 삽입 시): 上传图片 (이미지 업로드)&lt;/li&gt;
&lt;li&gt;上传服务 (이미지 업로더): PicGo.app 선택&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;④ 다시 원래 언어로 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정 후 이미지를 Typora 창으로 드래그하면, 해당 이미지가 PicGo에서 설정한 호스팅 서비스로 자동 업로드되고, 업로드한 이미지의 링크가 마크다운 문서에 삽입되어 렌더링된다. 이미지 업로드 시 PicGo App이 실행 중이 아니라면 자동 실행된다. 만약 업로드할 때마다 앱이 실행되는 게 싫다면 &lt;a href=&quot;https://github.com/PicGo/PicGo-Core&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;PicGo Core(CLI)&lt;/a&gt;를 이용해서 설정할 수도 있다.&lt;/p&gt;</description>
      <category>⌚️ Productivity</category>
      <category>cloudflare r2</category>
      <category>picgo</category>
      <category>typora</category>
      <category>webp cloud</category>
      <category>웹호스팅</category>
      <category>이미지 업로드</category>
      <category>이미지 프록시</category>
      <category>이미지 호스팅</category>
      <category>클라우드 스토리지</category>
      <category>클라우드플레어</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1325</guid>
      <comments>https://romantech.net/1325#entry1325comment</comments>
      <pubDate>Sun, 6 Apr 2025 23:23:53 +0900</pubDate>
    </item>
  </channel>
</rss>