<?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>Fri, 5 Jun 2026 21:15:13 +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>[시놀로지 나스] Tailscale 전용 NAS에서 파일/폴더 외부 공유하기</title>
      <link>https://romantech.net/1366</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;시놀로지 NAS의 모든 포트포워딩을 해제하고 &lt;a title=&quot;Tailscale 설치 가이드&quot; href=&quot;https://romantech.net/1282&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Tailscale&lt;/a&gt;을 통해서만 접속하도록 구성했다면, File Station에서 공유 링크를 생성하더라도 외부 사용자는 기본적으로 접속할 수 없다. &lt;a href=&quot;https://tailscale.com/docs/features/tailscale-funnel&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Tailscale Funnel&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;다행히 간단한 해결 방법이 있다. QuickConnect를 활성화하고 파일 공유 권한을 허용해 두면 File Station에서 파일/폴더를 공유할 때 외부 접속이 가능한 &lt;code&gt;gofile.me&lt;/code&gt; 링크를 자동으로 생성한다. 공유받는 사람은 DSM 계정이나 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;p data-ke-size=&quot;size16&quot;&gt;DSM &amp;gt; [제어판] &amp;gt; [외부 액세스]에서 QuickConnect를 활성화한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2460&quot; data-origin-height=&quot;1450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dpIw2d/dJMcaip1HNH/cyEvtpgVYLfpJVBzLKeFjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dpIw2d/dJMcaip1HNH/cyEvtpgVYLfpJVBzLKeFjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dpIw2d/dJMcaip1HNH/cyEvtpgVYLfpJVBzLKeFjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdpIw2d%2FdJMcaip1HNH%2FcyEvtpgVYLfpJVBzLKeFjK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2460&quot; height=&quot;1450&quot; data-origin-width=&quot;2460&quot; data-origin-height=&quot;1450&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에 직접 연결할 수 없는 환경에서 시놀로지에서 제공하는 경유 서버를 통해 파일을 다운로드할 수 있도록 해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2460&quot; data-origin-height=&quot;1450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nDITM/dJMcaip1HN8/xyUk0FUP1cekW1ieqiIoM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nDITM/dJMcaip1HN8/xyUk0FUP1cekW1ieqiIoM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nDITM/dJMcaip1HN8/xyUk0FUP1cekW1ieqiIoM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnDITM%2FdJMcaip1HN8%2FxyUk0FUP1cekW1ieqiIoM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2460&quot; height=&quot;1450&quot; data-origin-width=&quot;2460&quot; data-origin-height=&quot;1450&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;이제 File Station에서 파일/폴더를 공유하면 아래처럼 &lt;code&gt;gofile.me&lt;/code&gt; 링크가 생성된다. 외부 사용자는 DSM 계정이나 Tailscale 없이도 이 링크에 접속할 수 있다.   보안을 위해 비밀번호와 유효기간을 설정하는 것이 좋다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1472&quot; data-origin-height=&quot;948&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FIwXC/dJMcadIVPLU/jNd5KgY39OUoCvurSG4RO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FIwXC/dJMcadIVPLU/jNd5KgY39OUoCvurSG4RO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FIwXC/dJMcadIVPLU/jNd5KgY39OUoCvurSG4RO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFIwXC%2FdJMcadIVPLU%2FjNd5KgY39OUoCvurSG4RO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1472&quot; height=&quot;948&quot; data-origin-width=&quot;1472&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;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;DSM에 DDNS 혹은 사용자 지정 도메인이 설정돼 있더라도, QuickConnect를 활성화하고 파일 공유 권한을 켜두면 File Station에서 생성한 공유 링크는 항상 &lt;code&gt;gofile.me&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;또한, 실제 파일 전송이 항상 시놀로지 릴레이 서버를 통해 이루어지는 것은 아니다. QuickConnect는 접속 환경을 분석하여 최적의 연결 경로를 선택한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;When QuickConnect is enabled, a file sharing link always takes the form in the &quot;gofile.me&quot; domain. By way of the connectivity procedure, this link allows the connecting browser to take the best possible path to access the shared files. That is to say, the client browser will be redirected to the shared link's LAN/WAN address if available, before attempting through the relay tunnel.&lt;br /&gt;&lt;br /&gt;출처: &lt;a href=&quot;https://kb.synology.com/en-global/WP/Synology_QuickConnect_White_Paper/4#:~:text=When%20QuickConnect%20is%20enabled%2C%20a%20file%20sharing%20link%20always%20takes%20the%20form%20in%20the%20%22gofile.me%22%20domain&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Synology QuickConnect White Paper &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;즉, 가능한 경우 LAN 또는 WAN 주소를 통한 직접 연결을 시도하고, 직접 연결이 불가능한 환경에서만 최후의 수단으로 릴레이 터널을 이용한다. 물론, 릴레이 서버를 거치면 속도 저하가 발생할 수 있다.&lt;/p&gt;</description>
      <category>⌚️ Productivity</category>
      <category>filestation</category>
      <category>gofile.me</category>
      <category>Nas</category>
      <category>NAS파일공유</category>
      <category>quickconnect</category>
      <category>Synology</category>
      <category>tailscale</category>
      <category>나스</category>
      <category>시놀로지</category>
      <category>퀵커넥트</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1366</guid>
      <comments>https://romantech.net/1366#entry1366comment</comments>
      <pubDate>Thu, 4 Jun 2026 18:37:16 +0900</pubDate>
    </item>
    <item>
      <title>[시놀로지 나스] n8n 셀프 호스팅 가이드 - PostgreSQL + Cloudflare Tunnel</title>
      <link>https://romantech.net/1365</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;n8n은 노드 기반의 오픈소스 워크플로우 자동화 도구다. 각종 앱과 서비스를 연결해 반복 작업을 자동화한다는 점에서 &lt;a title=&quot;Zapier 공식 홈페이지&quot; href=&quot;https://zapier.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Zapier&lt;/a&gt;, &lt;a title=&quot;Make 공식 홈페이지&quot; href=&quot;https://www.make.com/en&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Make&lt;/a&gt;(구 Integromat)와 비슷하지만, 가장 큰 차별점은 셀프 호스팅 공식 지원에 있다. n8n을 직접 서버에 설치해서 운영하면 실행 횟수 제한 없이 사용할 수 있고, Code 노드를 이용해 표준 노드만으로 해결하기 어려운 로직도 구현할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n8n은 &lt;a title=&quot;n8n 클라우드 플랜 가격 비교표&quot; href=&quot;https://n8n.io/pricing/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;클라우드 플랜(n8n Cloud)&lt;/a&gt;도 제공하지만(최소 월 20유로), 워크플로우가 늘어나고 실행 횟수가 많아질수록 비용 부담이 커질 수밖에 없다. 반면 NAS, 홈서버에 셀프 호스팅하면 이미 보유한 장비를 활용해 &lt;b&gt;'나만의 자동화 서버'&lt;/b&gt;를 직접 운영할 수 있다. 물론 실행 환경과 데이터 저장 방식 역시 원하는 대로 제어할 수 있다. 꼭 홈서버가 아니더라도 &lt;a title=&quot;Hetzner 공식 홈페이지&quot; href=&quot;https://www.hetzner.com/cloud&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Hetzner Cloud&lt;/a&gt;, &lt;a title=&quot;Vultr 공식 홈페이지&quot; href=&quot;https://www.vultr.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Vultr&lt;/a&gt; 같은 VPS(Virtual Private Server; 가상 사설 서버)에 배포해서 n8n 클라우드보다 훨씬 저렴한 가격으로 운영할 수 있다.&lt;/p&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 키, 웹훅 토큰 같은 민감한 자격 증명(Credentials)이 외부 서버가 아닌 소유한 NAS에 저장된다. Telegram Trigger, Webhook 노드처럼 외부 요청을 받아야 하는 경우 Cloudflare Tunnel을 활용하면 공유기 포트 개방(포트포워딩) 없이 HTTPS 요청을 안전하게 전달할 수 있다.&lt;/p&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 NAS에 n8n을 셀프 호스팅하는 과정을 단계별로 살펴보자. 단순히 도커 컨테이너 하나를 띄우는 데서 끝나지 않고 장기 운영을 고려한 안정적인 구축을 목표로 했다.&lt;/p&gt;
&lt;p data-ke-size=&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;n8n은 단일 컨테이너로도 실행할 수 있지만, 시스템 안정성과 유지보수성을 고려하면 역할별로 컨테이너를 분리하는 것이 좋다. n8n 기본 내장 DB인 &lt;a title=&quot;SQLite 공식 홈페이지&quot; href=&quot;https://sqlite.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;SQLite&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;n8n이 공식 지원하는 &lt;a title=&quot;PostgreSQL 공식 홈페이지&quot; href=&quot;https://www.postgresql.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;PostgreSQL&lt;/a&gt;을 별도의 컨테이너로 운영하면 데이터를 더 안정적으로 저장할 수 있다. 또한 Code 노드 실행을 메인 n8n 프로세스와 분리할 경우 스크립트 오류나 과부하가 발생하더라도 n8n 서비스에 미치는 영향을 최소화할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부 요청을 전달하는 터널까지 포함하면 전체 서비스는 아래 4개 컨테이너로 구성된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;n8n-postgres: 워크플로우, 실행 기록, 자격 증명 등 주요 데이터를 저장하는 PostgreSQL DB&lt;/li&gt;
&lt;li&gt;n8n: 웹 UI, 워크플로우 관리, 스케줄 실행, 웹훅 처리 등을 담당하는 메인 컨테이너&lt;/li&gt;
&lt;li&gt;n8n-runners: Code 노드 실행을 독립적으로 처리하는 샌드박스 컨테이너&lt;/li&gt;
&lt;li&gt;cloudflared: Cloudflare Tunnel을 통해 외부 HTTPS 요청을 n8n으로 전달하는 컨테이너&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;먼저 DSM 패키지 센터에서 Container Manager를 설치한다. 설치를 완료하면 컨테이너 데이터와 설정 파일이 저장될 공유 폴더(docker)가 생성된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2108&quot; data-origin-height=&quot;1146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIh2VW/dJMcaijb7nG/7PbC8KXv0p20bY0gofNlk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIh2VW/dJMcaijb7nG/7PbC8KXv0p20bY0gofNlk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIh2VW/dJMcaijb7nG/7PbC8KXv0p20bY0gofNlk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIh2VW%2FdJMcaijb7nG%2F7PbC8KXv0p20bY0gofNlk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2108&quot; height=&quot;1146&quot; data-origin-width=&quot;2108&quot; data-origin-height=&quot;1146&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 접속 후 아래 명령어를 입력하여 필요한 폴더와 빈 파일들을 생성한다. SSH 사용이 처음이라면 &lt;a title=&quot;NAS SSH 접속 방법 가이드&quot; 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 class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# n8n 최상위/하위 폴더 한 번에 생성 (-p 옵션)
mkdir -p /volume1/docker/n8n/n8n_data
mkdir -p /volume1/docker/n8n/postgres_data

# n8n 폴더로 이동
cd /volume1/docker/n8n

# 설정 파일 생성
touch docker-compose.yml .env init-data.sh

# 폴더/파일 잘 만들어졌는지 확인
ls -l&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 class=&quot;plaintext&quot;&gt;&lt;code&gt;/volume1/docker/n8n/
├─ docker-compose.yml
├─ .env
├─ init-data.sh
├─ n8n_data/
└─ postgres_data/&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;n8n과 PostgreSQL을 안전하게 설정하려면 암호화와 인증에 사용할 무작위 키가 필요하다. 터미널에 아래 명령어를 실행한 후 출력되는 결과값은 &lt;code&gt;.env&lt;/code&gt; 파일을 구성할 때 사용하므로 각각 기록해 둔다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;# N8N_ENCRYPTION_KEY 생성
openssl rand -hex 32

# N8N_RUNNERS_AUTH_TOKEN 생성
openssl rand -hex 32&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;1660&quot; data-origin-height=&quot;684&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/R7tza/dJMcaaMduje/PwLFqcOgeatNiN0Bvp379K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/R7tza/dJMcaaMduje/PwLFqcOgeatNiN0Bvp379K/img.png&quot; data-alt=&quot;출력 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/R7tza/dJMcaaMduje/PwLFqcOgeatNiN0Bvp379K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FR7tza%2FdJMcaaMduje%2FPwLFqcOgeatNiN0Bvp379K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1660&quot; height=&quot;684&quot; data-origin-width=&quot;1660&quot; data-origin-height=&quot;684&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출력 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;첫 번째 값: n8n 자격 증명 데이터를 암호화하는 데 사용 (&lt;code&gt;N8N_ENCRYPTION_KEY&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;두 번째 값: n8n &amp;lt;&amp;gt; Task Runner 통신 인증 토큰으로 사용 (&lt;code&gt;N8N_RUNNERS_AUTH_TOKEN&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;.env 파일 구성&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;middot;비밀번호&amp;middot;암호화 키 같은 설정값은 &lt;code&gt;.env&lt;/code&gt; 파일에서 별도로 관리하는 게 좋다. 나스 DSM &amp;gt; 텍스트 편집기에서 docker &amp;gt; n8n 폴더에 있는 &lt;code&gt;.env&lt;/code&gt; 파일을 열고 아래 내용을 붙여넣는다. &lt;code&gt;.env&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;1113&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N18OZ/dJMcaiKdyex/wKCPmMcMDkFfQXprzNi9D1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N18OZ/dJMcaiKdyex/wKCPmMcMDkFfQXprzNi9D1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N18OZ/dJMcaiKdyex/wKCPmMcMDkFfQXprzNi9D1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN18OZ%2FdJMcaiKdyex%2FwKCPmMcMDkFfQXprzNi9D1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1113&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1113&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;POSTGRES_PASSWORD&lt;/code&gt;, &lt;code&gt;N8N_DB_PASSWORD&lt;/code&gt;에는 원하는 데이터베이스 비밀번호를 직접 입력하고, &lt;code&gt;N8N_ENCRYPTION_KEY&lt;/code&gt;, &lt;code&gt;N8N_RUNNERS_AUTH_TOKEN&lt;/code&gt;에는 위 단계에서 생성한 보안 키를 각각 입력한다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;# n8n 버전(stable 권장)
N8N_VERSION=stable
# PostgreSQL 버전
POSTGRES_VERSION=18

# n8n 실행 환경을 운영 모드로 설정
NODE_ENV=production

# 컨테이너 내부 시스템 시간대
TZ=Asia/Seoul
# n8n 워크플로우/스케줄 기준 시간대
GENERIC_TIMEZONE=Asia/Seoul

# Postgres 초기 접속용 기본 DB
POSTGRES_DB=postgres
# Postgres 관리자 계정 이름
POSTGRES_USER=postgres
# Postgres 관리자 계정 비밀번호
POSTGRES_PASSWORD=슈퍼유저_비밀번호

# n8n 전용 DB 이름 (실제 n8n 데이터가 저장되는 DB)
N8N_DB_NAME=n8n
# n8n이 DB에 접속할 때 사용할 계정 이름
N8N_DB_USER=n8n
# n8n 전용 DB 계정 비밀번호
N8N_DB_PASSWORD=n8n유저_비밀번호

# n8n 자격증명 데이터를 암호화하는 고정 키 (생성 후 변경 금지)
N8N_ENCRYPTION_KEY=openssl_rand_hex_32_결과값
# n8n Task Runner 인증 토큰
N8N_RUNNERS_AUTH_TOKEN=openssl_rand_hex_32_결과값
# runner 동시 실행 수
N8N_RUNNERS_MAX_CONCURRENCY=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;  PostgreSQL은 슈퍼유저 계정 1개와 DB 1개로도 n8n을 실행할 수 있다. 하지만 이 방식은 항상 최고 관리자 권한으로 DB에 접근하는 것이므로, 외부 공격을 받거나 컨테이너 제어권이 탈취될 경우 피해 범위가 PostgreSQL 전체로 확대될 수 있다. 이 가이드에선 보안 강화를 위해 초기 DB 생성/관리에만 PostgreSQL 관리자 계정을 사용하고, 실제 n8n 실행에는 전용 DB/계정을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&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;PostgreSQL 공식 Docker 이미지는 컨테이너가 처음 초기화될 때 &lt;code&gt;/docker-entrypoint-initdb.d&lt;/code&gt; 경로에 있는 &lt;code&gt;.sh&lt;/code&gt;, &lt;code&gt;.sql&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;초기화 스크립트를 NAS에 미리 만들어 두고 이 경로를 볼륨으로 마운트해 두면, 최초 실행 시(PostgreSQL 데이터 디렉터리가 비어 있는 상태) n8n 전용 데이터베이스와 계정이 자동으로 생성된다. 데이터 디렉터리가 한 번 초기화된 이후에는 초기화 스크립트가 다시 실행되지 않는다.&lt;/p&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 File Station &amp;gt; docker &amp;gt; n8n 폴더에 있는 &lt;code&gt;init-data.sh&lt;/code&gt; 파일을 텍스트 편집기로 열고, 아래 내용을 붙여넣는다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;#!/bin/bash
set -e

# n8n 전용 DB와 DB 계정을 생성하는 스크립트
# postgres_data 디렉터리가 비어 있을때만 실행됨 (최초 초기화 시점)
# N8N_DB_PASSWORD에는 작은따옴표(')를 넣지 않는 것을 권장

psql -v ON_ERROR_STOP=1 \
  --username &quot;$POSTGRES_USER&quot; \
  --dbname &quot;$POSTGRES_DB&quot; &amp;lt;&amp;lt;-EOSQL
  CREATE USER ${N8N_DB_USER} WITH PASSWORD '${N8N_DB_PASSWORD}';
  CREATE DATABASE ${N8N_DB_NAME} OWNER ${N8N_DB_USER};
EOSQL&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;psql&lt;/code&gt; : PostgreSQL에 접속해서 SQL을 실행하는 CLI 도구&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-v ON_ERROR_STOP=1&lt;/code&gt; : SQL 실행 중 오류가 발생하면 즉시 중단하도록 설정&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--username &quot;$POSTGRES_USER&quot;&lt;/code&gt; : PostgreSQL에 접속할 관리자 계정 지정&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--dbname &quot;$POSTGRES_DB&quot;&lt;/code&gt; : 초기 접속에 사용할 데이터베이스 지정&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;&amp;lt;-EOSQL&lt;/code&gt; : 아래 SQL 문들을 &lt;code&gt;psql&lt;/code&gt; 입력으로 전달 (heredoc 문법)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CREATE USER ...&lt;/code&gt; : &lt;code&gt;N8N_DB_USER&lt;/code&gt;, &lt;code&gt;N8N_DB_PASSWORD&lt;/code&gt;로 n8n 전용 DB 계정 생성&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CREATE DATABASE ...&lt;/code&gt; : &lt;code&gt;N8N_DB_NAME&lt;/code&gt;으로 n8n 전용 DB 생성, &lt;code&gt;N8N_DB_USER&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;도커를 서비스로 띄우는 방법은 크게 일반 docker run 방식과 Docker Compose 방식으로 나뉜다. docker run은 컨테이너를 하나씩 직접 실행하는 방식인 반면, Docker Compose는 여러 컨테이너의 실행 설정을 &lt;code&gt;.yml&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;이번 가이드에서 구축할 환경은 n8n, n8n Runner, PostgreSQL 등 여러 컨테이너를 함께 사용해야 하므로 Docker Compose 방식이 더 적합하다. Compose를 사용하면 각 컨테이너의 이미지, 환경 변수, 포트, 볼륨, 의존 관계까지 &lt;code&gt;.yml&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;docker &amp;gt; n8n 폴더에 생성한 &lt;code&gt;docker-compose.yml&lt;/code&gt; 파일을 텍스트 편집기로 열고 아래 내용을 붙여넣는다.&lt;/p&gt;
&lt;pre class=&quot;yaml&quot; data-ke-language=&quot;yaml&quot;&gt;&lt;code&gt;services:
  postgres:
    image: postgres:${POSTGRES_VERSION}
    container_name: n8n-postgres

    # 직접 정지한 경우를 제외하고 재부팅/오류 상황에서 자동 재시작
    restart: unless-stopped

    environment:
      TZ: ${TZ}

      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}

      N8N_DB_NAME: ${N8N_DB_NAME}
      N8N_DB_USER: ${N8N_DB_USER}
      N8N_DB_PASSWORD: ${N8N_DB_PASSWORD}

    # 볼륨 연결 설정 (NAS 경로:컨테이너 내부 경로)
    # 컨테이너가 오른쪽 경로에 데이터를 쓰거나 읽으면, 실제 파일은 왼쪽 NAS 경로에 저장되거나 읽힘
    volumes:
      # PostgreSQL 데이터 디렉터리를 NAS 폴더에 연결
      # PostgreSQL 18부터 볼륨 마운트 경로가 /var/lib/postgresql 로 변경됨
      - /volume1/docker/n8n/postgres_data:/var/lib/postgresql
      # NAS 초기화 스크립트를 PostgreSQL 자동 실행 경로에 연결
      # :ro를 붙이면 컨테이너 안에서 읽기 전용으로 마운트됨
      - /volume1/docker/n8n/init-data.sh:/docker-entrypoint-initdb.d/init-data.sh:ro

    # PostgreSQL이 실제로 접속 가능한 상태인지 확인
    healthcheck:
      # healthcheck 명령어 정의
      test: [&quot;CMD-SHELL&quot;, &quot;pg_isready -U \&quot;$${POSTGRES_USER}\&quot; -d \&quot;$${POSTGRES_DB}\&quot;&quot;]
      # healthcheck 실행 간격
      interval: 10s
      # healthcheck 명령이 이 시간 안에 응답하지 않으면 실패로 간주
      timeout: 5s
      # 연속으로 실패할 수 있는 최대 횟수 (이 횟수만큼 실패하면 unhealthy)
      retries: 10
      # 컨테이너 시작 후 이 시간 동안은 실패해도 실패 횟수로 계산하지 않음
      start_period: 30s

  n8n:
    image: n8nio/n8n:${N8N_VERSION}
    container_name: n8n
    restart: unless-stopped

    # PostgreSQL이 접속 가능 상태가 된 뒤 n8n 시작
    depends_on:
      postgres:
        condition: service_healthy

    # 포트 설정 (호스트 포트:컨테이너 포트)
    # NAS의 5678 포트를 컨테이너의 5678 포트와 연결
    # http://나스IP:5678 접속 &amp;rarr; 컨테이너 내부 5678 포트로 전달 &amp;rarr; n8n 페이지 표시
    ports:
      - &quot;5678:5678&quot;

    environment:
      # Runtime
      NODE_ENV: ${NODE_ENV}

      # 컨테이너 시스템 시간대
      TZ: ${TZ}

      # n8n 애플리케이션 시간대
      GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}

      # Database
      DB_TYPE: postgresdb
      DB_POSTGRESDB_HOST: postgres
      DB_POSTGRESDB_PORT: 5432
      DB_POSTGRESDB_DATABASE: ${N8N_DB_NAME}
      DB_POSTGRESDB_USER: ${N8N_DB_USER}
      DB_POSTGRESDB_PASSWORD: ${N8N_DB_PASSWORD}

      # Security / persistence
      N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}

      # n8n 설정 파일을 소유자만 읽고 쓸 수 있도록 권한 검사
      N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: true

      # HTTPS에서만 쿠키 전송 허용 여부(Cloudflare Tunnel 적용 후 true로 변경)
      N8N_SECURE_COOKIE: false

      # Task Runner
      N8N_RUNNERS_MODE: external

      # 외부 Runner 컨테이너가 n8n Task Broker에 접속할 수 있도록 허용
      # Task Broker는 n8n 본체와 러너 사이에서 작업을 전달/관리하는 중계 서버
      N8N_RUNNERS_BROKER_LISTEN_ADDRESS: 0.0.0.0
      N8N_RUNNERS_AUTH_TOKEN: ${N8N_RUNNERS_AUTH_TOKEN}

      # Diagnostics
      N8N_DIAGNOSTICS_ENABLED: false

    # n8n 설정 데이터를 NAS 폴더에 보존 (NAS 경로:컨테이너 내부 경로)
    volumes:
      - /volume1/docker/n8n/n8n_data:/home/node/.n8n

  n8n-runners:
    image: n8nio/runners:${N8N_VERSION}
    container_name: n8n-runners
    restart: unless-stopped

    depends_on:
      - n8n

    environment:
      # Runtime
      TZ: ${TZ}

      # Task Runner
      # 러너가 작업을 받아오기 위해 n8n의 Task Broker에 접속하는 내부 주소
      # 주소에서 'n8n'은 Docker Compose 서비스명, '5679'는 Task Broker 기본 포트
      N8N_RUNNERS_TASK_BROKER_URI: http://n8n:5679
      N8N_RUNNERS_AUTH_TOKEN: ${N8N_RUNNERS_AUTH_TOKEN}
      N8N_RUNNERS_MAX_CONCURRENCY: ${N8N_RUNNERS_MAX_CONCURRENCY}

      # 로그 수준 설정
      # info는 일반 실행 정보와 주요 상태 기록
      N8N_RUNNERS_LAUNCHER_LOG_LEVEL: info&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; [인코딩 ⏵] &amp;gt; Unicode (UTF-8)에 체크한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1614&quot; data-origin-height=&quot;804&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dj3OFX/dJMcadvlvgm/SKxk42q26LybEHz8bY7jKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dj3OFX/dJMcadvlvgm/SKxk42q26LybEHz8bY7jKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dj3OFX/dJMcadvlvgm/SKxk42q26LybEHz8bY7jKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdj3OFX%2FdJMcadvlvgm%2FSKxk42q26LybEHz8bY7jKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1614&quot; height=&quot;804&quot; data-origin-width=&quot;1614&quot; data-origin-height=&quot;804&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;n8n과 PostgreSQL은 각각 컨테이너 내부의 특정 사용자 권한으로 실행된다. 따라서 컨테이너가 직접 데이터를 읽고 쓰는 &lt;code&gt;n8n_data&lt;/code&gt;, &lt;code&gt;postgres_data&lt;/code&gt; 폴더는 해당 사용자의 UID(사용자 ID)/GID(그룹 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;code&gt;.env&lt;/code&gt; 파일에는 DB 비밀번호, n8n 암호화 키 같은 민감한 정보가 포함되어 있으므로 다른 사용자가 열어볼 수 없도록 권한을 엄격히 제한하는 것이 좋다. 나스 SSH에서 아래 명령어를 입력한다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# n8n 작업 폴더로 이동
cd /volume1/docker/n8n

# 컨테이너가 직접 쓰는 데이터 폴더는 컨테이너 내부 사용자 UID:GID에 맞춤
# n8n 컨테이너의 node 사용자 UID:GID는 보통 1000:1000
sudo chown -R 1000:1000 n8n_data

# PostgreSQL 컨테이너의 postgres 사용자 UID:GID는 보통 999:999
sudo chown -R 999:999 postgres_data

# 데이터 폴더는 컨테이너 사용자만 접근 가능하도록 제한
sudo chmod 700 n8n_data postgres_data

# Compose 설정 파일은 소유자만 수정, 나머지는 읽기만 허용
sudo chmod 644 docker-compose.yml

# 초기화 스크립트는 실행 가능하도록 설정
sudo chmod 755 init-data.sh

# 비밀번호/키가 들어 있는 .env는 소유자만 읽기/쓰기 허용
sudo chmod 600 .env&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;터미널에서 직접 명령어를 입력하거나, Container Manager 앱의 프로젝트 기능을 이용해 Compose 컨테이너를 생성하고 실행할 수 있다. 터미널 사용이 익숙하지 않다면 Container Manager 한 곳에서 관리하는 게 더 편하다.&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;Container Manager 사용 시&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Container Manager 앱 실행 &amp;gt; 왼쪽 [프로젝트] 메뉴 &amp;gt; [생성] 버튼을 클릭하고 경로를 &lt;code&gt;/docker/n8n&lt;/code&gt;으로 지정한다. 폴더를 지정하면 미리보기창에 Compose 구성 파일 내용이 표시되어야 한다. 프로젝트 이름은 구분하기 쉽도록 &lt;code&gt;n8n&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;1087&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIIrVC/dJMcaa6zrkd/yluQtXU4OLrMrXIZAjuZDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIIrVC/dJMcaa6zrkd/yluQtXU4OLrMrXIZAjuZDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIIrVC/dJMcaa6zrkd/yluQtXU4OLrMrXIZAjuZDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIIrVC%2FdJMcaa6zrkd%2FyluQtXU4OLrMrXIZAjuZDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1087&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1087&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;n8n은 &lt;code&gt;5678&lt;/code&gt; 포트를 통해 웹 UI를 제공하므로 웹 포털은 따로 설정하지 않아도 된다. 체크박스가 해제된 상태에서 [다음] 버튼을 누른다.&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;1087&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c48dDM/dJMcaipXU3n/4dSJRXUVcSHnJU7svs7GS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c48dDM/dJMcaipXU3n/4dSJRXUVcSHnJU7svs7GS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c48dDM/dJMcaipXU3n/4dSJRXUVcSHnJU7svs7GS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc48dDM%2FdJMcaipXU3n%2F4dSJRXUVcSHnJU7svs7GS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1087&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1087&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;1087&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d0UgJb/dJMcaiwI96r/A99HfOdSMD6c4FUFXg5lnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d0UgJb/dJMcaiwI96r/A99HfOdSMD6c4FUFXg5lnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d0UgJb/dJMcaiwI96r/A99HfOdSMD6c4FUFXg5lnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd0UgJb%2FdJMcaiwI96r%2FA99HfOdSMD6c4FUFXg5lnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1087&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1087&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;1087&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bANp2X/dJMcacQNpYX/J6O5KiYizP6jMXGmzXUDHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bANp2X/dJMcacQNpYX/J6O5KiYizP6jMXGmzXUDHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bANp2X/dJMcacQNpYX/J6O5KiYizP6jMXGmzXUDHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbANp2X%2FdJMcacQNpYX%2FJ6O5KiYizP6jMXGmzXUDHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1087&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1087&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;나스 SSH에서 아래 명령어를 입력하여 컨테이너를 생성/실행한다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;cd /volume1/docker/n8n
# docker-compose.yml에 정의된 이미지 다운로드
sudo docker compose pull
# 컨테이너를 백그라운드에서 생성 후 실행
sudo docker compose up -d&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 명령어를 입력해서 정상적으로 실행됐는지 확인해 본다. 모든 컨테이너가 Up(실행 중) 상태로 표시되면 성공이다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 컨테이너 실행 상태 확인
sudo docker compose ps&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;430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uwcQy/dJMcageCvPq/D9De36IMCBrPP7mM1bbCHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uwcQy/dJMcageCvPq/D9De36IMCBrPP7mM1bbCHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uwcQy/dJMcageCvPq/D9De36IMCBrPP7mM1bbCHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuwcQy%2FdJMcageCvPq%2FD9De36IMCBrPP7mM1bbCHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;430&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;430&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;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# n8n 컨테이너 로그 확인
sudo docker compose logs n8n --tail=100

# PostgreSQL 컨테이너 로그 확인
sudo docker compose logs postgres --tail=100

# n8n 러너 컨테이너 로그 확인
sudo docker compose logs n8n-runners --tail=100&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;1718&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HMnOB/dJMcadPFlLw/krKVulkk6e7KfecIdZQj3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HMnOB/dJMcadPFlLw/krKVulkk6e7KfecIdZQj3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HMnOB/dJMcadPFlLw/krKVulkk6e7KfecIdZQj3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHMnOB%2FdJMcadPFlLw%2FkrKVulkk6e7KfecIdZQj3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1718&quot; height=&quot;514&quot; data-origin-width=&quot;1718&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p 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;컨테이너가 정상적으로 실행됐다면 브라우저에서 n8n 웹 UI에 접속한다. NAS 내부 IP가 &lt;code&gt;192.168.1.2&lt;/code&gt; 라면 &lt;code&gt;http://192.168.1.2:5678&lt;/code&gt; 주소로 접속할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# NAS 내부 IP로 접속
http://NAS_내부IP:5678
# Tailscale 사용 중이면 NAS의 Tailscale IP로도 접속 가능
http://NAS_TAILSCALE_IP:5678&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;아래 화면이 나오면 성공이다. Owner Account 계정을 생성하고 로그인한다.&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;1297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EhvvL/dJMb990TPfo/WFLaev38iRJ5SkBHsdHZC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EhvvL/dJMb990TPfo/WFLaev38iRJ5SkBHsdHZC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EhvvL/dJMb990TPfo/WFLaev38iRJ5SkBHsdHZC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEhvvL%2FdJMb990TPfo%2FWFLaev38iRJ5SkBHsdHZC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1297&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1297&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;참고로 Compose 구성 파일에 재시작 정책을 추가해뒀기 때문에, 컨테이너를 수동으로 중지하지 않는 이상 NAS를 재부팅하더라도 자동으로 다시 실행된다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;restart: unless-stopped&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://docs.n8n.io/release-notes/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;n8n 릴리즈 노트&lt;/a&gt;에서 호환성에 영향을 줄 수 있는 변경사항(breaking changes)을 확인하고, 가능하면 백업 후 진행하는 것이 좋다. 먼저 &lt;code&gt;.env&lt;/code&gt; 파일에서 &lt;code&gt;N8N_VERSION&lt;/code&gt; 값을 원하는 버전으로 변경한다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;N8N_VERSION=2.21.7&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나스 SSH에서 업데이트하려면 아래 명령어를 순서대로 실행한다. 컨테이너 매니저를 사용 중이라면 프로젝트를 [중지]한 후 [빌드] 버튼을 누르면 된다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;cd /volume1/docker/n8n

# docker-compose.yml에 정의된 이미지 다운로드 또는 갱신
sudo docker compose pull

# 컨테이너를 백그라운드에서 생성/재생성 후 백그라운드 실행
sudo docker compose up -d

# 컨테이너 실행 상태 확인
sudo docker compose ps&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;middot;삭제는 아래 명령어를 사용한다. &lt;code&gt;docker compose up -d&lt;/code&gt;는 기존 컨테이너가 있더라도 이미지나 설정이 변경되면 필요한 컨테이너만 다시 생성한다. &lt;code&gt;down&lt;/code&gt; 명령어는 버전 업데이트에선 사용할 일이 거의 없고, 서비스를 완전히 내리거나 컨테이너를 깨끗한 상태에서 재구성할 때 주로 사용한다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;cd /volume1/docker/n8n
# 실행 중인 n8n 관련 컨테이너와 Compose 네트워크를 안전하게 중지/삭제
sudo docker compose down&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;터미널 명령어와 Container Manager UI 비교&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;2048&quot; data-origin-height=&quot;1089&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCeD5w/dJMcaaS07aK/FAxJUWSW2IFm8qN2OpA1KK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCeD5w/dJMcaaS07aK/FAxJUWSW2IFm8qN2OpA1KK/img.png&quot; data-alt=&quot;Container Manager UI 프로젝트에서 사용할 수 있는 작업 버튼&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCeD5w/dJMcaaS07aK/FAxJUWSW2IFm8qN2OpA1KK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCeD5w%2FdJMcaaS07aK%2FFAxJUWSW2IFm8qN2OpA1KK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1089&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1089&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Container Manager UI 프로젝트에서 사용할 수 있는 작업 버튼&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지 버전을 변경했을 때 (업데이트)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;터미널 명령어: &lt;code&gt;docker compose pull&lt;/code&gt; &amp;rarr; &lt;code&gt;docker compose up -d&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Container Manager: 중지 &amp;rarr; 빌드(이미지 있으면 재사용, 없거나 버전 다르면 자동으로 pull)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;구성 파일을 수정했을 때
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;터미널 명령어: &lt;code&gt;docker compose up -d&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Container Manager: 중지 &amp;rarr; 빌드&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;컨테이너 중지&amp;middot;제거하고 Compose로 생성된 네트워크까지 정리할 때
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;터미널 명령어: &lt;code&gt;docker compose down&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Container Manager: 정리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Cloudflare Tunnel&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;외부 네트워크에서 n8n 컨테이너에 접속하려면 일반적으로 공유기 포트포워딩이 필요하다. 하지만 포트포워딩은 외부에서 내부 네트워크로 들어오는 인바운드 연결을 허용하는 방식이어서 신중하게 사용해야 한다. 인바운드 연결을 열어 두면 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;포트포워딩을 설정하지 않으면 NAS에서 외부로 나가는 아웃바운드 연결은 가능하지만, 외부에서 NAS로 직접 들어오는 인바운드 연결은 허용되지 않는다. &lt;a title=&quot;Cloudflare Tunnel 공식 문서&quot; href=&quot;https://developers.cloudflare.com/tunnel/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Cloudflare Tunnel&lt;/a&gt;은 이 구조를 활용해 로컬 기기에서 Cloudflare 서버로 아웃바운드 연결을 만들어 두고 이 연결을 계속 유지한다. 이렇게 내부 네트워크에서 외부 서버로 연결을 만들어 두는 방식을 터널(Tunnel)이라고 부른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부 사용자가 n8n 도메인으로 요청을 보내면 Cloudflare가 먼저 요청을 받은 뒤, 이미 열려 있는 터널을 통해 내부 네트워크의 n8n 컨테이너로 전달한다. 이를 통해 공유기 포트를 개방하지 않고도 외부에서 HTTPS로 접속할 수 있고, SSL 인증서도 Cloudflare에서 자동으로 관리해 준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1392&quot; data-origin-height=&quot;1708&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L5jVd/dJMcagZWUuh/bT5URXK3EPTZPbK08k8Cak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L5jVd/dJMcagZWUuh/bT5URXK3EPTZPbK08k8Cak/img.png&quot; data-alt=&quot;Cloudflare Tunnel을 이용한 n8n 접속 흐름&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L5jVd/dJMcagZWUuh/bT5URXK3EPTZPbK08k8Cak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL5jVd%2FdJMcagZWUuh%2FbT5URXK3EPTZPbK08k8Cak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1392&quot; height=&quot;1708&quot; data-origin-width=&quot;1392&quot; data-origin-height=&quot;1708&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Cloudflare Tunnel을 이용한 n8n 접속 흐름&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;Telegram Trigger나 Webhook 노드처럼 외부 서비스가 n8n으로 데이터를 보내야 하는 경우, 외부에서 접근 가능한 HTTPS 주소가 필요하다. Cloudflare Tunnel을 사용하면 &lt;code&gt;https://webhook.yourdomain.net&lt;/code&gt; 같은 공개 HTTPS 주소를 n8n에 연결해서 포트포워딩 없이도 웹훅 요청을 받을 수 있다.&lt;/p&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 Tunnel을 무료로 사용할 수 있다.&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;blockquote data-ke-style=&quot;style3&quot;&gt;Cloudflare Tunnel을 이용하려면 외부 접속에 사용할 도메인이 있어야 하고, 이 도메인의 네임서버가 Cloudflare로 설정되어 있어야 한다.&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://dash.cloudflare.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Cloudflare 콘솔 페이지&lt;/a&gt; &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;1811&quot; data-origin-height=&quot;1007&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tH24n/dJMcacJ576v/OZDZDxgfaOk1irlEGFvnk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tH24n/dJMcacJ576v/OZDZDxgfaOk1irlEGFvnk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tH24n/dJMcacJ576v/OZDZDxgfaOk1irlEGFvnk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtH24n%2FdJMcacJ576v%2FOZDZDxgfaOk1irlEGFvnk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1811&quot; height=&quot;1007&quot; data-origin-width=&quot;1811&quot; data-origin-height=&quot;1007&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터널 이름은 &lt;code&gt;n8n-nas&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;1848&quot; data-origin-height=&quot;686&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2VufV/dJMcajbe8pj/JbpCQ1KGXcjZTISbKDSvF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2VufV/dJMcajbe8pj/JbpCQ1KGXcjZTISbKDSvF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2VufV/dJMcajbe8pj/JbpCQ1KGXcjZTISbKDSvF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2VufV%2FdJMcajbe8pj%2FJbpCQ1KGXcjZTISbKDSvF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1848&quot; height=&quot;686&quot; data-origin-width=&quot;1848&quot; data-origin-height=&quot;686&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;운영체제는 Docker를 선택한 뒤, Run tunnel with Docker 필드 우측에 있는 명령어 복사 버튼을 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1848&quot; data-origin-height=&quot;1480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A17IE/dJMcajoMIE9/yCSzboVJmnpSIoxy8HyyQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A17IE/dJMcajoMIE9/yCSzboVJmnpSIoxy8HyyQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A17IE/dJMcajoMIE9/yCSzboVJmnpSIoxy8HyyQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA17IE%2FdJMcajoMIE9%2FyCSzboVJmnpSIoxy8HyyQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1848&quot; height=&quot;1480&quot; data-origin-width=&quot;1848&quot; data-origin-height=&quot;1480&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;--token&lt;/code&gt; 뒤에 있는 토큰값을 따로 저장해 둔다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;docker run cloudflare/cloudflared:latest tunnel --no-autoupdate run --token &amp;lt;TOKEN&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;DSM으로 돌아와서 &lt;code&gt;.env&lt;/code&gt; 파일을 텍스트 편집기로 열고 아래 내용을 추가한다. &lt;code&gt;CLOUDFLARED_TOKEN&lt;/code&gt;에는 방금 복사한 토큰값을 붙여넣는다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# Cloudflare Zero Trust에서 터널 생성 후 발급받은 token 값
CLOUDFLARED_TOKEN=cloudflare_tunnel_token_값
# n8n이 인식할 외부 접속 호스트명
N8N_HOST=n8n.yourdomain.net
# n8n 외부 접속 프로토콜
N8N_PROTOCOL=https
# n8n 컨테이너 내부 리스닝 포트
N8N_PORT=5678
# n8n 에디터 UI 접속 주소 (주소 마지막에 / 포함)
N8N_EDITOR_BASE_URL=https://n8n.yourdomain.net/
# n8n이 생성하는 웹훅 URL의 기준 주소 (주소 마지막에 / 포함)
WEBHOOK_URL=https://webhook.yourdomain.net/
# n8n이 리버스 프록시(중간 서버) 1단계 뒤에서 동작한다고 인식하도록 설정
N8N_PROXY_HOPS=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;docker-compose.yml&lt;/code&gt; 파일을 열고 아래 내용을 붙여넣는다.&lt;/p&gt;
&lt;pre class=&quot;yaml&quot; data-ke-language=&quot;yaml&quot;&gt;&lt;code&gt;services:
  postgres:
    image: postgres:${POSTGRES_VERSION}
    container_name: n8n-postgres

    # 직접 정지한 경우를 제외하고 재부팅/오류 상황에서 자동 재시작
    restart: unless-stopped

    environment:
      TZ: ${TZ}

      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}

      N8N_DB_NAME: ${N8N_DB_NAME}
      N8N_DB_USER: ${N8N_DB_USER}
      N8N_DB_PASSWORD: ${N8N_DB_PASSWORD}

    # 볼륨 연결 설정 (NAS 경로:컨테이너 내부 경로)
    # 컨테이너가 오른쪽 경로에 데이터를 쓰거나 읽으면, 실제 파일은 왼쪽 NAS 경로에 저장되거나 읽힘
    volumes:
      # PostgreSQL 데이터 디렉터리를 NAS 폴더에 연결
      # PostgreSQL 18부터 볼륨 마운트 경로가 /var/lib/postgresql 로 변경됨
      - /volume1/docker/n8n/postgres_data:/var/lib/postgresql
      # NAS의 초기화 스크립트를 PostgreSQL 자동 실행 경로에 연결
      # :ro를 붙이면 컨테이너 안에서 읽기 전용으로 마운트됨
      - /volume1/docker/n8n/init-data.sh:/docker-entrypoint-initdb.d/init-data.sh:ro

    # PostgreSQL이 실제로 접속 가능한 상태인지 확인
    healthcheck:
      # healthcheck 명령어 정의
      test: [&quot;CMD-SHELL&quot;, &quot;pg_isready -U \&quot;$${POSTGRES_USER}\&quot; -d \&quot;$${POSTGRES_DB}\&quot;&quot;]
      # healthcheck 실행 간격
      interval: 10s
      # healthcheck 명령이 이 시간 안에 응답하지 않으면 실패로 간주
      timeout: 5s
      # 연속으로 실패할 수 있는 최대 횟수 (이 횟수만큼 실패하면 unhealthy)
      retries: 10
      # 컨테이너 시작 후 이 시간 동안은 실패해도 실패 횟수로 계산하지 않음
      start_period: 30s

  n8n:
    image: n8nio/n8n:${N8N_VERSION}
    container_name: n8n
    restart: unless-stopped

    # PostgreSQL이 접속 가능 상태가 된 뒤 n8n 시작
    depends_on:
      postgres:
        condition: service_healthy

    # 포트 설정 (호스트 포트:컨테이너 포트)
    # n8n 포트를 NAS 자신(127.0.0.1, 루프백)한테만 개방(바인딩)
    # 나스IP:5678 직접 접속은 불가하지만, 같은 Docker 네트워크에선 접근 가능
    ports:
      - &quot;127.0.0.1:5678:5678&quot;

    environment:
      # Runtime
      NODE_ENV: ${NODE_ENV}

      # 컨테이너 시스템 시간대
      TZ: ${TZ}

      # n8n 애플리케이션 시간대
      GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}

      # Database
      DB_TYPE: postgresdb
      DB_POSTGRESDB_HOST: postgres
      DB_POSTGRESDB_PORT: 5432
      DB_POSTGRESDB_DATABASE: ${N8N_DB_NAME}
      DB_POSTGRESDB_USER: ${N8N_DB_USER}
      DB_POSTGRESDB_PASSWORD: ${N8N_DB_PASSWORD}

      # Security / persistence
      N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}

      # n8n 설정 파일을 소유자만 읽고 쓸 수 있도록 권한 검사
      N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: true

      # HTTPS에서만 쿠키 전송 허용 여부
      N8N_SECURE_COOKIE: true

      # Task Runner
      N8N_RUNNERS_MODE: external

      # 외부 Runner 컨테이너가 n8n Task Broker에 접속할 수 있도록 허용
      # Task Broker는 n8n 본체와 러너 사이에서 작업을 전달/관리하는 중계 서버
      N8N_RUNNERS_BROKER_LISTEN_ADDRESS: 0.0.0.0
      N8N_RUNNERS_AUTH_TOKEN: ${N8N_RUNNERS_AUTH_TOKEN}

      # Public URL
      N8N_HOST: ${N8N_HOST}
      N8N_PROTOCOL: ${N8N_PROTOCOL}
      N8N_PORT: ${N8N_PORT}
      N8N_EDITOR_BASE_URL: ${N8N_EDITOR_BASE_URL}
      WEBHOOK_URL: ${WEBHOOK_URL}
      N8N_PROXY_HOPS: ${N8N_PROXY_HOPS}

      # Diagnostics
      N8N_DIAGNOSTICS_ENABLED: false

    # n8n 설정 데이터를 NAS 폴더에 보존 (NAS 경로:컨테이너 내부 경로)
    volumes:
      - /volume1/docker/n8n/n8n_data:/home/node/.n8n

  n8n-runners:
    image: n8nio/runners:${N8N_VERSION}
    container_name: n8n-runners
    restart: unless-stopped

    depends_on:
      - n8n

    environment:
      # Runtime
      TZ: ${TZ}

      # Task Runner
      # 러너가 작업을 받아오기 위해 n8n의 Task Broker에 접속하는 내부 주소
      # 주소에서 n8n은 Docker Compose 서비스명, 5679는 Task Broker 기본 포트
      N8N_RUNNERS_TASK_BROKER_URI: http://n8n:5679
      N8N_RUNNERS_AUTH_TOKEN: ${N8N_RUNNERS_AUTH_TOKEN}
      N8N_RUNNERS_MAX_CONCURRENCY: ${N8N_RUNNERS_MAX_CONCURRENCY}

      # 로그 수준 설정
      # info는 일반 실행 정보와 주요 상태 기록
      N8N_RUNNERS_LAUNCHER_LOG_LEVEL: info
      
  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: n8n-cloudflared
    restart: unless-stopped

    depends_on:
      - n8n

    command: tunnel --no-autoupdate run --token ${CLOUDFLARED_TOKEN}&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;위 YAML 파일에선 n8n 서비스의 &lt;code&gt;5678&lt;/code&gt; 포트를 NAS 호스트의 루프백 주소인 &lt;code&gt;127.0.0.1&lt;/code&gt;(자기 자신을 가리키는 주소)에만 연결했다. 그럼 같은 LAN에 연결된 다른 기기에서는 &lt;code&gt;나스IP:5678&lt;/code&gt; 주소로 직접 접속할 수 없다. 대신 NAS 내부 서비스에서는 &lt;code&gt;https://127.0.0.1:5678&lt;/code&gt; 주소로 n8n에 접근할 수 있다.&lt;br /&gt;&lt;br /&gt;별도의 네트워크 설정 없이 동일한 Compose 프로젝트에서 실행한 컨테이너들은 자동으로 생성되는 기본 네트워크를 공유한다. 같은 Docker 네트워크에 연결된 컨테이너들은 서비스 이름을 호스트명처럼 사용하여 서로 통신할 수 있다. 따라서 &lt;code&gt;cloudflared&lt;/code&gt; 컨테이너는 호스트 포트의 공개 여부와 관계없이 Docker 내부 주소인 &lt;code&gt;https://n8n:5678&lt;/code&gt;(서비스명:포트)을 통해 n8n에 접근할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1952&quot; data-origin-height=&quot;574&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drfmru/dJMcaccdnvQ/Y6M8zGPPgfyoWUhgGdJX81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drfmru/dJMcaccdnvQ/Y6M8zGPPgfyoWUhgGdJX81/img.png&quot; data-alt=&quot;외부 요청이 n8n 컨테이너로 전달되는 과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drfmru/dJMcaccdnvQ/Y6M8zGPPgfyoWUhgGdJX81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdrfmru%2FdJMcaccdnvQ%2FY6M8zGPPgfyoWUhgGdJX81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1952&quot; height=&quot;574&quot; data-origin-width=&quot;1952&quot; data-origin-height=&quot;574&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;외부 요청이 n8n 컨테이너로 전달되는 과정&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;  서로 다른 Compose 프로젝트에서 실행한 컨테이너들은 기본 네트워크를 공유하지 않는다. 다만 동일한 사용자 정의 네트워크(Custom network)에 연결하면 서비스 이름을 호스트명처럼 사용하여 서로 통신할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;터널 경로 설정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 기본적인 설정은 모두 완료했다. 나스 SSH에 아래 명령어를 입력하거나, Container Manager 앱에서 프로젝트를 [중지]한 뒤 [빌드] 버튼을 눌러 컨테이너를 생성하고 실행한다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;cd /volume1/docker/n8n

sudo docker compose pull
sudo docker compose up -d
sudo docker compose ps&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;컨테이너가 정상적으로 실행되면 Cloudflare 설정 화면에 &quot;터널이 성공적으로 연결되었다&quot;는 메시지가 표시된다.&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;1201&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xKlnM/dJMcah5HFHi/e9nKAnUsFPiKSkI7BnYagk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xKlnM/dJMcah5HFHi/e9nKAnUsFPiKSkI7BnYagk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xKlnM/dJMcah5HFHi/e9nKAnUsFPiKSkI7BnYagk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxKlnM%2FdJMcah5HFHi%2Fe9nKAnUsFPiKSkI7BnYagk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1201&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1201&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; [게시된 애플리케이션] 버튼을 클릭하고, n8n 웹 UI 접속 시 사용할 서브도메인을 추가한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2354&quot; data-origin-height=&quot;1658&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9QTbt/dJMcajbfFIL/XzfgP6ckPAccpFMaDBX1g1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9QTbt/dJMcajbfFIL/XzfgP6ckPAccpFMaDBX1g1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9QTbt/dJMcajbfFIL/XzfgP6ckPAccpFMaDBX1g1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9QTbt%2FdJMcajbfFIL%2FXzfgP6ckPAccpFMaDBX1g1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2354&quot; height=&quot;1658&quot; data-origin-width=&quot;2354&quot; data-origin-height=&quot;1658&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;n8n&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;도메인: 등록한 도메인 선택&lt;/li&gt;
&lt;li&gt;서비스 URL: &lt;code&gt;http://n8n:5678&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;웹훅은 외부 서비스의 요청을 받아야 하는 공개 엔드포인트인 반면, n8n 웹 UI는 관리자용 콘솔이므로 &lt;a title=&quot;Cloudflare Access 홈페이지&quot; href=&quot;https://www.cloudflare.com/ko-kr/sase/products/access/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Cloudflare Access&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;보안을 위해 웹 UI와 웹훅 전용 엔드포인트를 분리하고, 웹훅 전용 주소는 &lt;code&gt;/webhook&lt;/code&gt; , &lt;code&gt;/webhook-test&lt;/code&gt; 같은 경로만 n8n으로 전달되도록 제한하면 불필요한 경로 노출을 줄일 수 있다.&lt;/p&gt;
&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;2354&quot; data-origin-height=&quot;1658&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjhZfa/dJMcaffLeDq/q3nojqo7mSUsYhfsghHls1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjhZfa/dJMcaffLeDq/q3nojqo7mSUsYhfsghHls1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjhZfa/dJMcaffLeDq/q3nojqo7mSUsYhfsghHls1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjhZfa%2FdJMcaffLeDq%2Fq3nojqo7mSUsYhfsghHls1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2354&quot; height=&quot;1658&quot; data-origin-width=&quot;2354&quot; data-origin-height=&quot;1658&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;webhook&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;도메인: 등록한 도메인 선택&lt;/li&gt;
&lt;li&gt;경로: &lt;code&gt;^/(?:webhook|webhook-test|webhook-waiting)/[a-zA-Z0-9_-]+(?:/[a-zA-Z0-9_-]+)*/?$&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;서비스 URL: &lt;code&gt;http://n8n:5678&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;여기까지 완료하면 PostgreSQL, 외부 Task Runner, Cloudflare Tunnel을 연동한 n8n 셀프 호스팅 환경이 완성된다. 단일 n8n 컨테이너 방식보다 초기 설정은 다소 복잡하지만 데이터 저장, Code 노드 실행, 외부 HTTPS 통신을 명확히 분리함으로써 훨씬 안정적으로 운영할 수 있다.&lt;/p&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;docker compose ps&lt;/code&gt;와 로그 확인 명령어로 컨테이너 상태를 주기적으로 점검하고, n8n 업데이트 전에는 릴리즈 노트와 백업 상태를 먼저 확인하는 것이 좋다. 특히 &lt;code&gt;n8n_data&lt;/code&gt;, &lt;code&gt;postgres_data&lt;/code&gt; 폴더와 &lt;code&gt;.env&lt;/code&gt; 파일은 &lt;a title=&quot;Hyper Backup 소개 페이지&quot; href=&quot;https://www.synology.com/ko-kr/dsm/feature/hyper_backup&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Hyper Backup&lt;/a&gt; 등을 이용해 안전한 곳에 자동 백업되도록 설정해 두는 것을 권장한다.&lt;/p&gt;</description>
      <category>⌚️ Productivity</category>
      <category>CloudflareTunnel</category>
      <category>ContainerManager</category>
      <category>DockerCompose</category>
      <category>n8n</category>
      <category>n8n셀프호스팅</category>
      <category>PostgreSQL</category>
      <category>SynologyNAS</category>
      <category>시놀로지NAS</category>
      <category>업무자동화</category>
      <category>홈서버</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1365</guid>
      <comments>https://romantech.net/1365#entry1365comment</comments>
      <pubDate>Sat, 30 May 2026 00:58:33 +0900</pubDate>
    </item>
    <item>
      <title>[n8n] 음식 사진으로 식단 기록하는 AI 텔레그램 봇 만들기</title>
      <link>https://romantech.net/1364</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  워크플로우 목표&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;텔레그램 봇으로 음식 사진 업로드&lt;/li&gt;
&lt;li&gt;AI가 칼로리, 탄수화물, 단백질, 지방 분석&lt;/li&gt;
&lt;li&gt;분석 결과 구글 시트에 기록 &amp;gt; 텔레그램으로 응답&lt;/li&gt;
&lt;li&gt;필요 시 구글 시트 데이터 조회 &amp;gt; 섭취량 요약&lt;/li&gt;
&lt;/ol&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;1686&quot; data-origin-height=&quot;1298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dKQEJA/dJMcabxvUHj/AZAm7BgQXPA96CxvzbcTJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dKQEJA/dJMcabxvUHj/AZAm7BgQXPA96CxvzbcTJk/img.png&quot; data-alt=&quot;칼로리 트래커 텔레그램 봇&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dKQEJA/dJMcabxvUHj/AZAm7BgQXPA96CxvzbcTJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdKQEJA%2FdJMcabxvUHj%2FAZAm7BgQXPA96CxvzbcTJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1686&quot; height=&quot;1298&quot; data-origin-width=&quot;1686&quot; data-origin-height=&quot;1298&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 href=&quot;https://t.me/BotFather&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;@BotFather&lt;/a&gt;에서 칼로리 트래커 전용 봇을 만들어둔다(&lt;a href=&quot;https://romantech.net/1358#rp-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EC%9E%A5%EC%95%A0-%ED%85%94%EB%A0%88%EA%B7%B8%EB%9E%A8%EC%9C%BC%EB%A1%9C-%EB%A9%94%EC%8B%9C%EC%A7%80-%EB%B3%B4%EB%82%B4%EA%B8%B0&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;다시 n8n으로 돌아와서 단축키 &lt;code&gt;n&lt;/code&gt; &amp;gt; Telegram &amp;gt; On message 트리거 노드를 추가한다. 트리거 설정창을 열고 Credential 창 &amp;gt; Access Token 필드에는 칼로리 트래커 봇의 토큰 값을 입력한다.&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;1273&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nlaay/dJMcahEt0A6/b6AXsraovA3GRc7WTZPqek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nlaay/dJMcahEt0A6/b6AXsraovA3GRc7WTZPqek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nlaay/dJMcahEt0A6/b6AXsraovA3GRc7WTZPqek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnlaay%2FdJMcahEt0A6%2Fb6AXsraovA3GRc7WTZPqek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1273&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1273&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;Trigger On 항목은 Message를 선택한 후, 첨부파일 데이터를 받아올 수 있도록 Add Field &amp;gt; Download Image/Files 필드를 추가하고 활성화한다. 이제 텔레그램 봇으로 이미지를 보낸 뒤 Execute step 버튼을 눌러 보자. 우측 OUTPUT 창에 Binary 파일이 표시된다면 성공이다.&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;1273&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjMZ1d/dJMcacb8KnL/3lkMMDZKEAYilpqlBPkQx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjMZ1d/dJMcacb8KnL/3lkMMDZKEAYilpqlBPkQx1/img.png&quot; data-alt=&quot;Telegram On message 트리거 설정창&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjMZ1d/dJMcacb8KnL/3lkMMDZKEAYilpqlBPkQx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjMZ1d%2FdJMcacb8KnL%2F3lkMMDZKEAYilpqlBPkQx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1273&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1273&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Telegram On message 트리거 설정창&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;AI Agent 노드&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;텔레그램에서 받아온 음식 사진을 AI가 분석하여 영양 성분을 계산할 단계다. 이미지를 인식해야 하므로 Vision 기능을 지원하는 모델을 사용해야 한다. 단축키 &lt;code&gt;n&lt;/code&gt; &amp;gt; AI Agent 노드 추가 후, 설정창에서 Source for Prompt는 Define below를 선택한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2282&quot; data-origin-height=&quot;1418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byfGdp/dJMcafGJrxV/ksfJLyNvtfWwdmHAOGTkek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byfGdp/dJMcafGJrxV/ksfJLyNvtfWwdmHAOGTkek/img.png&quot; data-alt=&quot;AI Agent 설정창&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byfGdp/dJMcafGJrxV/ksfJLyNvtfWwdmHAOGTkek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyfGdp%2FdJMcafGJrxV%2FksfJLyNvtfWwdmHAOGTkek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2282&quot; height=&quot;1418&quot; data-origin-width=&quot;2282&quot; data-origin-height=&quot;1418&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AI Agent 설정창&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;Prompt (User Message) 입력란에는 아래 내용을 복사/붙여넣는다. 이 프롬프트는 ①음식 이미지 분석/영양 성분 계산, ②구글 시트 기록(write_sheet 툴), ③구글 시트에서 정보 조회(read_sheet 툴)까지 세 가지 주요 행동 지침을 담고 있다.&lt;/p&gt;
&lt;pre class=&quot;plaintext&quot;&gt;&lt;code&gt;You are **Calorie Tracker Bot**, a friendly assistant that helps the user monitor their daily calorie and macro intake.  

You have three main responsibilities:

1. **Analyze images of food** sent by the user (via Telegram).  
   - If the user sends an image, you can find it below.  
   - Use your vision capabilities to identify the food items, estimate portion sizes, and calculate approximate calories and macronutrients (protein, carbs, fat).

2. **Log the data** using the `write_sheet` tool.  
   - The tool must always be called when an image contains identifiable food.  
   - Log the following fields:  
     - `date`: current date and time (ISO format)  
     - `food`: food name(s)  
     - `calories`: estimated total calories  
     - `protein`, `carbs`, `fat`: grams of each macronutrient  
     - `notes`: optional observations (like &quot;approximation&quot; or &quot;mixed dish&quot;)  
⚠️ Never just say the data was logged &amp;mdash; always call the write_sheet tool.

Confirm and summarize the result back to the user in a short, friendly message after the tool call completes.
Example:
&quot;Logged: Chicken salad &amp;mdash; 420 kcal (Protein 35g, Carbs 20g, Fat 18g). ✅ Added to your tracker!&quot;

Additionally, you should:

Answer the user&amp;rsquo;s questions about their daily, weekly, or overall calorie intake and nutrition trends.
Use the read_sheet tool to retrieve and summarize data.

Be concise and encouraging &amp;mdash; think of yourself as a helpful health companion, not a strict diet coach.

If the image is unclear or incomplete, politely ask for clarification or a text description.

When an image is added and you can identify ingredients, calories, and macros, always log it with write_sheet.

Use this context to keep a consistent and helpful tone across all interactions.

When logging food items, make sure to separate them, that means, instead of logging: Pizza with coke, you first log the Pizza and then the coke.

Current date and time is {{ $now }}

&amp;lt;USER MESSAGE&amp;gt;
Username: {{ $json.message.from.first_name }}
Image: {{ $binary.data || &quot;No image provided&quot; }} 
Text: {{ $json.message.text || &quot;No message provided.&quot; }}
&amp;lt;/USER MESSAGE&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;$json.message.text&lt;/code&gt; 속성으로 참조할 수 있고, 첨부파일은 &lt;code&gt;$binary.data&lt;/code&gt;로 참조할 수 있다. &lt;code&gt;$json&lt;/code&gt;은 현재 노드로 전달된 입력 아이템의 JSON 데이터이고, &lt;code&gt;$binary&lt;/code&gt;는 입력 아이템의 바이너리 데이터를 가리킨다. &lt;code&gt;$json&lt;/code&gt;, &lt;code&gt;$binary&lt;/code&gt; 관련 더 자세한 내용은 &lt;a class=&quot;&quot; href=&quot;https://romantech.net/1362#rp-binary-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%97%90-%EC%A0%91%EA%B7%BC%ED%95%98%EB%8A%94-%EB%91%90-%EA%B0%80%EC%A7%80-%EB%B0%A9%EC%8B%9D&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;노드 설정창 하단 Chat Model을 클릭하고 Model은 저렴한 &lt;code&gt;gpt-4.1-mini&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;2284&quot; data-origin-height=&quot;1420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Kf8pj/dJMcaaelHGF/lJxn32P1pFBkVz2bZsyhn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Kf8pj/dJMcaaelHGF/lJxn32P1pFBkVz2bZsyhn0/img.png&quot; data-alt=&quot;Chat Model 설정창&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Kf8pj/dJMcaaelHGF/lJxn32P1pFBkVz2bZsyhn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKf8pj%2FdJMcaaelHGF%2FlJxn32P1pFBkVz2bZsyhn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1420&quot; data-origin-width=&quot;2284&quot; data-origin-height=&quot;1420&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Chat Model 설정창&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;AI가 생성한 답변 노드를 텔레그램 봇으로 보내기 위해 Telegram &amp;gt; Send a text message 노드를 추가한다. 텔레그램 봇은 사용자가 먼저 메시지를 보내야 대화가 시작되는 구조이므로, 이 단계에선 텔레그램 트리거 노드에 기록된 사용자의 Chat ID를 참조하여 메시지를 보낼 수 있다.&lt;/p&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;1420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLfGbF/dJMcabEiGxt/26dYIOriX7Ktki5rkOIiY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLfGbF/dJMcabEiGxt/26dYIOriX7Ktki5rkOIiY0/img.png&quot; data-alt=&quot;Telegram Send a text message 설정창&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLfGbF/dJMcabEiGxt/26dYIOriX7Ktki5rkOIiY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLfGbF%2FdJMcabEiGxt%2F26dYIOriX7Ktki5rkOIiY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1420&quot; data-origin-width=&quot;2284&quot; data-origin-height=&quot;1420&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Telegram Send a text message 설정창&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Resource (대상): Message&lt;/li&gt;
&lt;li&gt;Operation (동작): Send Message&lt;/li&gt;
&lt;li&gt;Chat ID (받는 사람): &lt;code&gt;{{ $('trigger').item.json.message.chat.id }}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Text (보낼 내용): &lt;code&gt;{{ $json.output }}&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;AI Agent가 분석한 영양 성분 데이터를 저장/조회하기 위해 새로운 구글 시트를 만들고, 첫 번째 행(A1~F1)에 아래 컬럼(헤더)을 미리 추가해 둔다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1694&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mr6lQ/dJMcahEt1hQ/grwyxte09hpKszWh1E3Tkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mr6lQ/dJMcahEt1hQ/grwyxte09hpKszWh1E3Tkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mr6lQ/dJMcahEt1hQ/grwyxte09hpKszWh1E3Tkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmr6lQ%2FdJMcahEt1hQ%2Fgrwyxte09hpKszWh1E3Tkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1694&quot; height=&quot;600&quot; data-origin-width=&quot;1694&quot; data-origin-height=&quot;600&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;name_of_food: 음식 이름&lt;/li&gt;
&lt;li&gt;portion_size: 섭취량&lt;/li&gt;
&lt;li&gt;calories: 칼로리&lt;/li&gt;
&lt;li&gt;protein: 단백질&lt;/li&gt;
&lt;li&gt;carbs: 탄수화물&lt;/li&gt;
&lt;li&gt;fat: 지방&lt;/li&gt;
&lt;li&gt;date: 날짜/시간&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;AI Agent가 분석한 영양 성분 데이터를 구글 시트에 기록하기 위해 Google Sheets 도구를 추가할 차례다. AI Agent 노드 하단의 Tool 영역에서 [+] 버튼을 클릭한 뒤 Google Sheets Tool을 선택한다. 생성된 구글 시트 노드 설정창을 열고 다음과 같이 설정한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2282&quot; data-origin-height=&quot;1418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8Xj8p/dJMcadaYUXP/DdOpLckj0DPzkOZgnk0c8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8Xj8p/dJMcadaYUXP/DdOpLckj0DPzkOZgnk0c8k/img.png&quot; data-alt=&quot;Google Sheets Tool 설정창 (write_sheet 이름으로 변경)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8Xj8p/dJMcadaYUXP/DdOpLckj0DPzkOZgnk0c8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8Xj8p%2FdJMcadaYUXP%2FDdOpLckj0DPzkOZgnk0c8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2282&quot; height=&quot;1418&quot; data-origin-width=&quot;2282&quot; data-origin-height=&quot;1418&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Google Sheets Tool 설정창 (write_sheet 이름으로 변경)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Resource: Sheet Within Document (문서 내 시트를 타겟으로 지정)&lt;/li&gt;
&lt;li&gt;Operation: Append Row (기존 데이터 아래에 새로운 행으로 추가)&lt;/li&gt;
&lt;li&gt;Document &amp;gt; From list: 데이터를 기록할 구글 시트 파일 선택&lt;/li&gt;
&lt;li&gt;Sheet &amp;gt; From list: 데이터가 입력될 시트 선택&lt;/li&gt;
&lt;li&gt;Mapping Column Mode: Map Each Column Manually (각 컬럼에 값 직접 매핑)&lt;/li&gt;
&lt;li&gt;Values to Send: 모든 필드에 ✨ 우측 마법 버튼 클릭 (AI Agent가 값을 자동으로 채우도록 설정)&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;AI Agent가 구글 시트에 기록된 데이터를 확인하고 읽어올 수 있도록 Google Sheets 도구를 하나 더 추가해야 한다. 이전과 동일하게 AI Agent 노드 하단의 Tool 영역에서 [+] 버튼을 클릭한 뒤 Google Sheets Tool을 선택한다. 생성된 구글 시트 노드의 이름을 &lt;code&gt;read_sheet&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;2286&quot; data-origin-height=&quot;1424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pfj59/dJMb99T0WlA/RnZ5XXiYYkUuJ9pAhD3E00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pfj59/dJMb99T0WlA/RnZ5XXiYYkUuJ9pAhD3E00/img.png&quot; data-alt=&quot;Google Sheets Tool 설정창 (read_sheet 이름으로 변경)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pfj59/dJMb99T0WlA/RnZ5XXiYYkUuJ9pAhD3E00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpfj59%2FdJMb99T0WlA%2FRnZ5XXiYYkUuJ9pAhD3E00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2286&quot; height=&quot;1424&quot; data-origin-width=&quot;2286&quot; data-origin-height=&quot;1424&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Google Sheets Tool 설정창 (read_sheet 이름으로 변경)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Resource: Sheet Within Document (문서 내 시트를 타겟으로 지정)&lt;/li&gt;
&lt;li&gt;Operation: Get Row (시트에서 행 데이터 가져오기)&lt;/li&gt;
&lt;li&gt;Document &amp;gt; From list: 데이터를 조회할 구글 시트 파일 선택&lt;/li&gt;
&lt;li&gt;Sheet &amp;gt; From list: 데이터를 조회할 시트 선택&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;특정 데이터만 골라서 불러오고 싶다면 하단 Filters 영역 &amp;gt; Add Filter를 클릭해서 조건을 설정할 수 있다. 이번 예제에선 따로 필터를 지정하지 않았으므로 시트에 있는 전체 데이터를 가져온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Execute workflow를 클릭하고 텔레그램 봇에 음식 사진이나 메시지를 보내서 잘 작동하는지 확인해보자.&lt;/p&gt;
&lt;p data-ke-size=&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;텔레그램 봇 채팅창에는 이전 대화가 그대로 남아 있기 때문에, 봇도 이를 기억할 것 같지만, 실제로는 그렇지 않다(Stateless). n8n 워크플로우는 기본적으로 메시지를 받고 응답을 생성한 뒤 실행을 종료한다. 다음 메시지가 들어오면 새로운 실행으로 처리되기 때문에 이전 대화 내용을 알 수 없다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1688&quot; data-origin-height=&quot;786&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kH1I4/dJMcafUghEG/s2AF5Y3zJgh45BswBX5z01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kH1I4/dJMcafUghEG/s2AF5Y3zJgh45BswBX5z01/img.png&quot; data-alt=&quot;이름을 기억하지 못하고 텔레그램 유저 이름을 반환하는 봇&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kH1I4/dJMcafUghEG/s2AF5Y3zJgh45BswBX5z01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkH1I4%2FdJMcafUghEG%2Fs2AF5Y3zJgh45BswBX5z01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;786&quot; data-origin-width=&quot;1688&quot; data-origin-height=&quot;786&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;사용자와의 대화 맥락을 유지하려면 별도의 메모리 설정이 필요하다. n8n에선 인스턴스 로컬 메모리에 저장되는 Simple Memory와 MongoDB/Redis/Postgres 같은 외부 저장소 기반 메모리를 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 연습용이라면 Simple Memory로도 충분하지만 로컬 메모리에 저장되기 때문에 서버를 재시작하면 모든 내용이 초기화되고, 여러 개의 워커(Worker) 노드끼리 메모리를 공유하지 못하는 단점이 있다. 실제 운영 환경에선 Redis 같은 데이터베이스 연동을 권장한다.&lt;/p&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 Agent 노드 하단의 Memory 영역에서 [+] 버튼을 클릭한 뒤 Simple Memory를 추가하고 다음과 같이 설정한다.&lt;/p&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;1422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HVnjl/dJMcaarSZhP/sykumbBRKGWkNCw8p0B3i0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HVnjl/dJMcaarSZhP/sykumbBRKGWkNCw8p0B3i0/img.png&quot; data-alt=&quot;Simple Memory 설정창 (memory 이름으로 변경)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HVnjl/dJMcaarSZhP/sykumbBRKGWkNCw8p0B3i0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHVnjl%2FdJMcaarSZhP%2FsykumbBRKGWkNCw8p0B3i0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1422&quot; data-origin-width=&quot;2284&quot; data-origin-height=&quot;1422&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Simple Memory 설정창 (memory 이름으로 변경)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Session ID: Define below&lt;/li&gt;
&lt;li&gt;Key (메모리 식별자): &lt;code&gt;{{ $('trigger').item.json.message.chat.id }}&lt;/code&gt;&lt;br /&gt;메모리를 구분하는 고유값. 텔레그램 Chat ID를 넣어두면 사용자별로 다른 메모리 공간을 사용할 수 있다.&lt;/li&gt;
&lt;li&gt;Context Window Length (참고할 대화 기록 수): &lt;code&gt;5&lt;/code&gt;&lt;br /&gt;AI에게 전달할 이전 대화 개수. 5로 설정하면 최근 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;&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;모든 노드 설정과 메모리 연결까지 완료했다면 아래와 같은 AI 기반 칼로리 트래커 워크플로우가 완성된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2612&quot; data-origin-height=&quot;1454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmSWPe/dJMcagr4yms/LJzoRj9XleqHzA6gIjOxsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmSWPe/dJMcagr4yms/LJzoRj9XleqHzA6gIjOxsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmSWPe/dJMcagr4yms/LJzoRj9XleqHzA6gIjOxsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmSWPe%2FdJMcagr4yms%2FLJzoRj9XleqHzA6gIjOxsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2612&quot; height=&quot;1454&quot; data-origin-width=&quot;2612&quot; data-origin-height=&quot;1454&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 텔레그램 봇으로 음식 사진을 보내면 AI Agent가 비전(Vision) 기능으로 음식을 분석하고, &lt;code&gt;write_sheet&lt;/code&gt; 도구를 통해 구글 시트에 영양 성분을 기록한다. 반대로 &quot;오늘 총 몇 칼로리 먹었어?&quot;처럼 질문하면 &lt;code&gt;read_sheet&lt;/code&gt; 도구로 시트 데이터를 조회하고 기록된 데이터를 바탕으로 섭취량을 요약해준다.&lt;/p&gt;</description>
      <category>  Programming</category>
      <category>aiagent</category>
      <category>ai식단관리</category>
      <category>ai자동화</category>
      <category>n8n</category>
      <category>n8n자동화</category>
      <category>식단기록</category>
      <category>업무자동화</category>
      <category>칼로리트래커</category>
      <category>텔레그램봇</category>
      <category>텔레그램자동화</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1364</guid>
      <comments>https://romantech.net/1364#entry1364comment</comments>
      <pubDate>Fri, 22 May 2026 18:19:42 +0900</pubDate>
    </item>
    <item>
      <title>[n8n] AI 이메일 자동 답변 워크플로우 만들기</title>
      <link>https://romantech.net/1363</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  워크플로우 목표&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;읽지 않은 이메일 확인&lt;/li&gt;
&lt;li&gt;AI로 이메일 답장 초안 자동 생성&lt;/li&gt;
&lt;li&gt;자동 생성한 초안에 대해 승인 또는 피드백 요청&lt;/li&gt;
&lt;li&gt;승인한 답장은 자동 발송, 거절한 답장은 피드백 반영 후 재작성&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;n&lt;/code&gt; &amp;gt; Gmail 검색 &amp;gt; On message received 트리거를 추가한다.&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;1254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzkF9X/dJMcah5BwUs/zLgrXnJowJAergJzIq3guk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzkF9X/dJMcah5BwUs/zLgrXnJowJAergJzIq3guk/img.png&quot; data-alt=&quot;Gmail 트리거 설정창 (get_email 이름으로 변경)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzkF9X/dJMcah5BwUs/zLgrXnJowJAergJzIq3guk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzkF9X%2FdJMcah5BwUs%2FzLgrXnJowJAergJzIq3guk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1254&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1254&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Gmail 트리거 설정창 (get_email 이름으로 변경)&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;Credential: Gmail OAuth2 API (지메일 연동 계정 선택)&lt;/li&gt;
&lt;li&gt;Poll Times &amp;gt; Mode: Every Minute (1분마다 새 이메일 확인)&lt;/li&gt;
&lt;li&gt;Event: Message Received (새 이메일 수신 감지)&lt;/li&gt;
&lt;li&gt;Simplify: 활성화 (원본 데이터 대신 주요 메타데이터만 간략하게 반환)&lt;/li&gt;
&lt;li&gt;Filters &amp;gt; Read Status: Unread emails only (읽지 않은 이메일만 가져오기)&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;이렇게 설정하면 1분마다 받은편지함을 확인하고, 읽지 않은 새 이메일이 있을 때만 워크플로우가 실행된다. 테스트할 때는 Fetch Test Event 버튼을 클릭하면 된다. 정상적으로 이메일을 가져오면 우측 Output 영역에서 &lt;code&gt;from&lt;/code&gt;, &lt;code&gt;to&lt;/code&gt;, &lt;code&gt;text&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;  이메일 트리거에서 수신한 데이터를 PIN으로 고정해 두면, 워크플로우를 다시 실행해도 새로운 이메일을 가져오지 않고 고정한 이메일 내용으로 반복 테스트할 수 있다.&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;1235&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sVtbh/dJMcaiwC8wQ/LeDUx6SqoRoCODde64ZDUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sVtbh/dJMcaiwC8wQ/LeDUx6SqoRoCODde64ZDUK/img.png&quot; data-alt=&quot;PIN Data 버튼 (노란색 화살표 부분)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sVtbh/dJMcaiwC8wQ/LeDUx6SqoRoCODde64ZDUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsVtbh%2FdJMcaiwC8wQ%2FLeDUx6SqoRoCODde64ZDUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1235&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1235&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PIN Data 버튼 (노란색 화살표 부분)&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;Edit Fields(Set) 노드를 사용하여 AI에게 전달할 프롬프트를 &lt;code&gt;prompt&lt;/code&gt; 필드에 미리 정의해 둔다. 이렇게 하면 다음 AI 노드에서 &lt;code&gt;{{ $json.prompt }}&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;1255&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d7iQMG/dJMcaf7ITPy/bnzgglrNkSoGzilowbkZX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d7iQMG/dJMcaf7ITPy/bnzgglrNkSoGzilowbkZX0/img.png&quot; data-alt=&quot;Edit Fields 노드 설정창 (set_initial_prompt 이름으로 변경)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d7iQMG/dJMcaf7ITPy/bnzgglrNkSoGzilowbkZX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd7iQMG%2FdJMcaf7ITPy%2FbnzgglrNkSoGzilowbkZX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1255&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1255&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Edit Fields 노드 설정창 (set_initial_prompt 이름으로 변경)&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;i&gt;Use my real name&lt;/i&gt; 부분은 원하는 이름으로 변경한다.&lt;/p&gt;
&lt;pre class=&quot;plaintext&quot;&gt;&lt;code&gt;Hi, your task is to reply to this email.

Write a response that sounds natural, and keep in mind I'm very busy and have little time for things.

If something personal comes up, please write a response asking to schedule a call.

For any events, invitations, or promotions, please politely decline.

Here is the email I just received.
Your task is to reply to the email as if you were me.

&amp;lt;EMAIL&amp;gt;
Subject: {{ $json.subject }}
Message: {{ $json.text }}
&amp;lt;/EMAIL&amp;gt;

IMPORTANT
Reply with the email ready to send. Don't include the subject.
AND very important: DO NOT USE PLACEHOLDERS LIKE [Your Name].
Use my real name: Sion&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;앞 단계에서 정의한 프롬프트를 받아 AI 답장 초안을 생성할 차례다. OpenAI &amp;gt; Message a model 액션 노드를 추가한 후 다음과 같이 설정한다.&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;1163&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbBtG5/dJMcad27hNL/4HFpAwHha5jht2eixlIFe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbBtG5/dJMcad27hNL/4HFpAwHha5jht2eixlIFe1/img.png&quot; data-alt=&quot;OpenAI Message a model 노드 설정창 (write_response 이름으로 변경)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbBtG5/dJMcad27hNL/4HFpAwHha5jht2eixlIFe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbBtG5%2FdJMcad27hNL%2F4HFpAwHha5jht2eixlIFe1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1163&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1163&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;OpenAI Message a model 노드 설정창 (write_response 이름으로 변경)&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;Resource: Text (텍스트 기반 답변 생성)&lt;/li&gt;
&lt;li&gt;Operation: Message a Model (AI 모델에게 메시지 보낸 후 답변 받기)&lt;/li&gt;
&lt;li&gt;Model &amp;gt; From list: gpt-4o-mini (저렴한 모델로도 충분하다)&lt;/li&gt;
&lt;li&gt;Message:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Type: Text&lt;/li&gt;
&lt;li&gt;Role: User&lt;/li&gt;
&lt;li&gt;Prompt: &lt;code&gt;{{ $json.prompt }}&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;아래 내용으로 테스트 이메일을 보낸 후 Execute step을 눌러보면 우측 Output에 답변 초안이 생성된 것을 확인할 수 있다. 이메일 내용은 점심 약속을 제안하면서 제품 구매를 유도하는 광고성 메일이므로, AI는 프롬프트 지시에 따라 정중히 거절하는 답변을 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트 이메일:&lt;/p&gt;
&lt;pre class=&quot;plaintext&quot;&gt;&lt;code&gt;제목: Meet up for lunch? I'll pay!
본문: 

Hello E.

I would like to meet you for lunch because I want you to buy my things.
You can choose the restaurant and the time, and I'll pay for everything.

I promise,

Best Regards,
Paco.&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;AI 답변 초안:&lt;/p&gt;
&lt;pre class=&quot;plaintext&quot;&gt;&lt;code&gt;Hi Paco,

Thanks for the offer! I really appreciate it, but I'm quite swamped at the moment and won't be able to meet up for lunch. 

If something else comes up that requires a call, just let me know and we can schedule a time that works for both of us.

Best,
Sion&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;AI가 작성한 답장 초안을 사람이 직접 검토하고 승인/거절할 수 있도록 이메일 발송 노드를 설정한다. Send and Wait for Response 기능을 사용하면 메일에 포함된 버튼을 클릭할 때까지 워크플로우는 대기 상태가 된다. 단축키 &lt;code&gt;n&lt;/code&gt; &amp;gt; Gmail &amp;gt; Send Message and Wait for Response 노드를 추가하고 다음과 같이 설정한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2326&quot; data-origin-height=&quot;1422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBpZ05/dJMcahYM84n/KXUKtOEv2isEQI2FEoIvt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBpZ05/dJMcahYM84n/KXUKtOEv2isEQI2FEoIvt0/img.png&quot; data-alt=&quot;Send Message and Wait for Response 노드 설정창 (approve_email 이름으로 변경)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBpZ05/dJMcahYM84n/KXUKtOEv2isEQI2FEoIvt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBpZ05%2FdJMcahYM84n%2FKXUKtOEv2isEQI2FEoIvt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2326&quot; height=&quot;1422&quot; data-origin-width=&quot;2326&quot; data-origin-height=&quot;1422&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Send Message and Wait for Response 노드 설정창 (approve_email 이름으로 변경)&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;Resource: Message (이메일 메시지를 대상으로 작업)&lt;/li&gt;
&lt;li&gt;Operation: Send and Wait for Response (버튼 누를때까지 대기)&lt;/li&gt;
&lt;li&gt;To: 승인 요청을 받아볼 이메일 주소&lt;/li&gt;
&lt;li&gt;Subject: &lt;code&gt;[AI Auto Respond Approval Request]&lt;/code&gt; (승인 메일 제목)&lt;/li&gt;
&lt;li&gt;Message: 승인 메일 본문&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1779342650320&quot; class=&quot;plaintext&quot; data-ke-language=&quot;plaintext&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;You are required to approve or reject the following AI response to the email you just received from {{ $('get_email').item.json.from.text }} with the subject &quot;{{ $('get_email').item.json.subject }}&quot;

Here is the content of the email: 
&quot;{{ $('get_email').item.json.text }}&quot;

And here is what the AI answered with:
&quot;{{ $json.output[0].content[0].text }}&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Response Type: Approval (메일 본문에 승인/거절 버튼 활성화)&lt;/li&gt;
&lt;li&gt;Approval Options:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Type of Approval: Approve and Disapprove (승인/거절 두 가지 선택지 제공)&lt;/li&gt;
&lt;li&gt;Approve Button Label: Approve (승인 버튼 텍스트)&lt;/li&gt;
&lt;li&gt;Approve Button Style: Primary (승인 버튼 스타일)&lt;/li&gt;
&lt;li&gt;Disapprove Button Label: Reject (거절 버튼 텍스트)&lt;/li&gt;
&lt;li&gt;Disapprove Button Style: Secondary (거절 버튼 스타일)&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;Execute step 버튼을 클릭하면 위에서 설정한 제목/본문 내용으로 승인 메일이 발송된다. 메일의 Approve/Reject 버튼을 누를 때까지 워크플로우는 대기 상태로 유지된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1404&quot; data-origin-height=&quot;1206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KMvvr/dJMcadounvj/uTDBnBnmaoNYRfGkiJ19w0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KMvvr/dJMcadounvj/uTDBnBnmaoNYRfGkiJ19w0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KMvvr/dJMcadounvj/uTDBnBnmaoNYRfGkiJ19w0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKMvvr%2FdJMcadounvj%2FuTDBnBnmaoNYRfGkiJ19w0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1404&quot; height=&quot;1206&quot; data-origin-width=&quot;1404&quot; data-origin-height=&quot;1206&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;승인 요청 메일에서 Approve 혹은 Reject 버튼을 클릭하면 결과값이 &lt;code&gt;approved&lt;/code&gt; 속성에 반영된 후 다음 노드로 전달된다. 분기 처리를 위해 If 노드를 추가하고 아래와 같이 조건을 설정한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2326&quot; data-origin-height=&quot;1072&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zRTJp/dJMcadaXLl8/NIoL046ymNwTXAr2KyOKd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zRTJp/dJMcadaXLl8/NIoL046ymNwTXAr2KyOKd1/img.png&quot; data-alt=&quot;If 노드 설정창 (check_approval 이름으로 변경)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zRTJp/dJMcadaXLl8/NIoL046ymNwTXAr2KyOKd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzRTJp%2FdJMcadaXLl8%2FNIoL046ymNwTXAr2KyOKd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2326&quot; height=&quot;1072&quot; data-origin-width=&quot;2326&quot; data-origin-height=&quot;1072&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;If 노드 설정창 (check_approval 이름으로 변경)&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;value1: &lt;code&gt;{{ $json.data.approved }}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Condition: &lt;code&gt;is equal to&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;value2: &lt;code&gt;true&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;approved&lt;/code&gt; 값에 따라 두 방향으로 분기된다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;true인 경우: 답변 초안을 승인했으므로 True 브랜치로 이동&lt;/li&gt;
&lt;li&gt;false인 경우: 답변 초안을 거절했으므로 False 브랜치로 이동&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;답변 초안을 승인하면 원본 메일 발신자에게 초안 내용으로 답장을 보내야 한다. If 노드의 True 브랜치에 Gmail &amp;gt; Reply to a message 노드를 추가하고 다음과 같이 설정한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2326&quot; data-origin-height=&quot;1420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dXuC5P/dJMcaaSVDxV/zVUds5it1Win1TTkFTolNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dXuC5P/dJMcaaSVDxV/zVUds5it1Win1TTkFTolNk/img.png&quot; data-alt=&quot;Reply to a message 설정창 (send_response 이름으로 변경)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dXuC5P/dJMcaaSVDxV/zVUds5it1Win1TTkFTolNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdXuC5P%2FdJMcaaSVDxV%2FzVUds5it1Win1TTkFTolNk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2326&quot; height=&quot;1420&quot; data-origin-width=&quot;2326&quot; data-origin-height=&quot;1420&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Reply to a message 설정창 (send_response 이름으로 변경)&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;Resource: Message (이메일 메시지를 대상으로 작업)&lt;/li&gt;
&lt;li&gt;Operation: Reply (원본 메일에 답장)&lt;/li&gt;
&lt;li&gt;Message ID: 답장할 원본 이메일 ID&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1779343214879&quot; class=&quot;plaintext&quot; data-ke-language=&quot;plaintext&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{{ $('get_email').item.json.id }}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Email Type: Text (일반 텍스트 이메일)&lt;/li&gt;
&lt;li&gt;Message: AI가 작성한 답변 초안&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1779343223579&quot; class=&quot;plaintext&quot; data-ke-language=&quot;plaintext&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{{ $('write_response').item.json.output[0].content[0].text }}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;승인 메일에서 Approve 버튼을 누른 후, AI가 작성한 초안으로 답변 메일이 잘 발송됐는지 확인해 보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1570&quot; data-origin-height=&quot;910&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baaFf0/dJMcaglg1ky/pJlgXMkknNmnDciLWmhBy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baaFf0/dJMcaglg1ky/pJlgXMkknNmnDciLWmhBy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baaFf0/dJMcaglg1ky/pJlgXMkknNmnDciLWmhBy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaaFf0%2FdJMcaglg1ky%2FpJlgXMkknNmnDciLWmhBy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1570&quot; height=&quot;910&quot; data-origin-width=&quot;1570&quot; data-origin-height=&quot;910&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;AI가 작성한 답변 초안이 마음에 들지 않을 경우(Reject), 초안 검토자에게 어떤 부분을 수정해야 할지 피드백을 요청하는 메시지를 발송한다. If 노드의 False 브랜치에 Gmail &amp;gt; Send message and wait for response 노드를 추가하고 다음과 같이 설정한다.&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;1422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xjFxa/dJMcaf7IUZ4/Xg1UPzkcvTkXUW9GsV4C9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xjFxa/dJMcaf7IUZ4/Xg1UPzkcvTkXUW9GsV4C9k/img.png&quot; data-alt=&quot;Send message and wait for response 설정창 (ask_for_feedback 이름으로 변경)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xjFxa/dJMcaf7IUZ4/Xg1UPzkcvTkXUW9GsV4C9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxjFxa%2FdJMcaf7IUZ4%2FXg1UPzkcvTkXUW9GsV4C9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1422&quot; data-origin-width=&quot;2318&quot; data-origin-height=&quot;1422&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Send message and wait for response 설정창 (ask_for_feedback 이름으로 변경)&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;Resource: Message (이메일 메시지를 대상으로 작업)&lt;/li&gt;
&lt;li&gt;Operation: Send and Wait for Response (응답할 때까지 대기)&lt;/li&gt;
&lt;li&gt;To: 피드백 요청을 받을 이메일 주소&lt;/li&gt;
&lt;li&gt;Subject: &lt;code&gt;[AI Auto Respond Feedback Request]&lt;/code&gt; (피드백 요청 메일 제목)&lt;/li&gt;
&lt;li&gt;Message: 피드백 요청 메일 본문&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1779343339818&quot; class=&quot;plaintext&quot; data-ke-language=&quot;plaintext&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;You rejected the following AI response to the email you just received from {{ $('get_email').item.json.from.text }} with the subject &quot;{{ $('get_email').item.json.subject }}&quot;

Here is the content of the email: 
&quot;{{ $('get_email').item.json.text }}&quot;

And here is what the AI answered with:
&quot;{{ $('write_response').item.json.output[0].content[0].text }}&quot;

Since you did not like it, please provide feedback of what you would like to change.&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Response Type: Free Text (텍스트로 피드백 작성)&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;테스트를 위해 [approve_email] 노드 실행 &amp;gt; 초안 검토 메일에서 Reject 버튼 클릭 &amp;gt; [ask_for_feedback] 노드 실행 &amp;gt; 피드백 요청 메일이 잘 도착하는지 확인해 보자. 피드백 요청 메일에서 Respond 버튼을 클릭하면 아래 이미지처럼 텍스트를 입력할 수 있는 폼이 열린다. 여기에 수정하고 싶은 구체적인 내용을 입력하고 제출(Submit)하면, 대기 상태였던 워크플로우가 피드백 내용을 받아 다음 단계로 이어진다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1526&quot; data-origin-height=&quot;1074&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yiOsx/dJMcacwrL2x/ukXAZl2KXDaTlDCPpyVmJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yiOsx/dJMcacwrL2x/ukXAZl2KXDaTlDCPpyVmJk/img.png&quot; data-alt=&quot;n8n에서 제공하는 입력 폼&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yiOsx/dJMcacwrL2x/ukXAZl2KXDaTlDCPpyVmJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyiOsx%2FdJMcacwrL2x%2FukXAZl2KXDaTlDCPpyVmJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1526&quot; height=&quot;1074&quot; data-origin-width=&quot;1526&quot; data-origin-height=&quot;1074&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;n8n에서 제공하는 입력 폼&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;답변 초안이 반려될 경우, ①초안 생성에 사용했던 프롬프트, ②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;이를 구현하기 위해 피드백을 수집하는 [ask_for_feedback] 노드 뒤에 Edit Fields(Set) 노드를 추가하고 답변 재작성에 사용할 프롬프트를 입력한다. 이때 필드 이름을 초안 프롬프트 노드(set_initial_prompt)와 동일하게 &lt;code&gt;prompt&lt;/code&gt;로 지정하면, 이후 실행되는 AI 노드에서 &lt;code&gt;{{ $json.prompt }}&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;2326&quot; data-origin-height=&quot;1422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dFlJGw/dJMcacDeao8/bt2xAoNSlt93IKnJsTXhV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dFlJGw/dJMcacDeao8/bt2xAoNSlt93IKnJsTXhV1/img.png&quot; data-alt=&quot;Edit Fields 노드 설정창 (set_feedback_prompt 이름으로 변경)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dFlJGw/dJMcacDeao8/bt2xAoNSlt93IKnJsTXhV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdFlJGw%2FdJMcacDeao8%2Fbt2xAoNSlt93IKnJsTXhV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2326&quot; height=&quot;1422&quot; data-origin-width=&quot;2326&quot; data-origin-height=&quot;1422&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Edit Fields 노드 설정창 (set_feedback_prompt 이름으로 변경)&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;ORIGINAL_PROMPT&amp;gt;&lt;/code&gt; : 처음 답변 초안을 생성할 때 사용했던 원본 지시사항&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;NEW_PROMPT&amp;gt;&lt;/code&gt; : 기존 답변 내용과 피드백을 바탕으로 다시 작성하라는 지시사항&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;plaintext&quot;&gt;&lt;code&gt;&amp;lt;ORIGINAL_PROMPT&amp;gt;
Hi, your task is to reply to this email.

Write a response that sounds natural, and keep in mind I'm very busy and have little time for things.

If something personal comes up, please write a response asking to schedule a call.

For any events, invitations, or promotions, please politely decline.

Here is the email I just received.
Your task is to reply to the email as if you were me.

&amp;lt;EMAIL&amp;gt;
Subject: {{ $('get_email').item.json.subject }}
Message: {{ $('get_email').item.json.text }}
&amp;lt;/EMAIL&amp;gt;

IMPORTANT
Reply with the email ready to send. Don't include the subject.
AND very important: DO NOT USE PLACEHOLDERS LIKE [Your Name].
Use my real name: Sion
&amp;lt;/ORIGINAL_PROMPT&amp;gt;

&amp;lt;NEW_PROMPT&amp;gt;
That was your task, and you failed at it. The user rejected your answer.

This is what you replied with:

&amp;lt;YOUR_REPLY&amp;gt;
{{ $('write_response').item.json.output[0].content[0].text }}
&amp;lt;/YOUR_REPLY&amp;gt;

And this is what the user had to say about it, the user feedback:

&amp;lt;USER_FEEDBACK&amp;gt;
{{ $json.data.text }}
&amp;lt;/USER_FEEDBACK&amp;gt;

Your task is to adapt the reply to follow the feedback that the user provided.
&amp;lt;/NEW_PROMPT&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;p data-ke-size=&quot;size16&quot;&gt;처음 워크플로우를 실행하면 [set_initial_prompt] 노드에서 생성한 프롬프트가 &lt;code&gt;prompt&lt;/code&gt; 필드에 담겨 전달되고, [write_response] 노드는 &lt;code&gt;{{ $json.prompt }}&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;이후 답변이 거절되면 [set_feedback_prompt] 노드에서 출력한 재작성 프롬프트가 [write_response] 노드로 전달된다. 두 프롬프트 생성 노드의 필드 이름을 모두 &lt;code&gt;prompt&lt;/code&gt;로 지정했기 때문에 [write_response] 노드는 동일한 표현식인 &lt;code&gt;{{ $json.prompt }}&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;3734&quot; data-origin-height=&quot;1610&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zvZRk/dJMcafGIcvt/wfF6Cpvl3JpLuXKVk7bBXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zvZRk/dJMcafGIcvt/wfF6Cpvl3JpLuXKVk7bBXk/img.png&quot; data-alt=&quot;워크플로우 완성 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zvZRk/dJMcafGIcvt/wfF6Cpvl3JpLuXKVk7bBXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzvZRk%2FdJMcafGIcvt%2FwfF6Cpvl3JpLuXKVk7bBXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3734&quot; height=&quot;1610&quot; data-origin-width=&quot;3734&quot; data-origin-height=&quot;1610&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;워크플로우 완성 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>  Programming</category>
      <category>ai자동화</category>
      <category>n8n</category>
      <category>n8n자동화</category>
      <category>노코드</category>
      <category>로우코드</category>
      <category>업무자동화</category>
      <category>워크플로우자동화</category>
      <category>이메일자동답장</category>
      <category>이메일자동화</category>
      <category>자동화</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1363</guid>
      <comments>https://romantech.net/1363#entry1363comment</comments>
      <pubDate>Thu, 21 May 2026 15:34:12 +0900</pubDate>
    </item>
    <item>
      <title>[n8n] AI 에이전트로 영수증 지출 내역(가계부) 자동 기록하기</title>
      <link>https://romantech.net/1362</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  워크플로우 목표&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;이메일 첨부파일 영수증 이미지에서 데이터 추출&lt;/li&gt;
&lt;li&gt;추출한 데이터를 구글 시트에 기록&lt;/li&gt;
&lt;li&gt;영수증 원본은 구글 드라이브에 백업&lt;/li&gt;
&lt;li&gt;처리된 이메일은 자동 정리&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Gmail Trigger 노드&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;walmart receipt&lt;/code&gt; 키워드로 영수증 이미지를 찾은 뒤, 본인 이메일 주소로 영수증 이미지를 첨부하여 메일을 보내 둔다. n8n이 메일을 인식할 수 있도록 메일 제목에는 &lt;code&gt;receipt&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;1568&quot; data-origin-height=&quot;1164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OIxGv/dJMcaiQTTjv/4eKvf9hBSN0eutC3m8Y7O0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OIxGv/dJMcaiQTTjv/4eKvf9hBSN0eutC3m8Y7O0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OIxGv/dJMcaiQTTjv/4eKvf9hBSN0eutC3m8Y7O0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOIxGv%2FdJMcaiQTTjv%2F4eKvf9hBSN0eutC3m8Y7O0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1568&quot; height=&quot;1164&quot; data-origin-width=&quot;1568&quot; data-origin-height=&quot;1164&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;월마트 영수증 예시 이미지&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;981&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MPPZ9/dJMcaicmKRX/pvwjfF37vrRclGAEi0hj60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MPPZ9/dJMcaicmKRX/pvwjfF37vrRclGAEi0hj60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MPPZ9/dJMcaicmKRX/pvwjfF37vrRclGAEi0hj60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMPPZ9%2FdJMcaicmKRX%2FpvwjfF37vrRclGAEi0hj60%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;736&quot; height=&quot;981&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;981&quot;/&gt;&lt;/span&gt;&lt;/figure&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;n8n으로 돌아와서 Gmail Trigger 노드(on message received)를 추가하고, 수식 입력 편의를 위해 노드 이름은 &lt;code&gt;get_emails&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;/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;1302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3QD7E/dJMcacDc7hI/ko6ABWeT8k9PUT2TrToz71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3QD7E/dJMcacDc7hI/ko6ABWeT8k9PUT2TrToz71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3QD7E/dJMcacDc7hI/ko6ABWeT8k9PUT2TrToz71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3QD7E%2FdJMcacDc7hI%2Fko6ABWeT8k9PUT2TrToz71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1302&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1302&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;Poll Times &amp;gt; Mode: Every Minute (1분마다 이메일 확인)&lt;/li&gt;
&lt;li&gt;Event: Message Received (메일 도착하면 트리거)&lt;/li&gt;
&lt;li&gt;Simplify: 체크해제 (상세 데이터 출력)&lt;br /&gt;Simplify 옵션을 체크 해제해야 추가적인 옵션을 지정할 수 있다.&lt;/li&gt;
&lt;li&gt;Add Filter &amp;gt; Search: &lt;code&gt;from:me has:attachment subject:receipt&lt;/code&gt;&lt;br /&gt;&lt;code&gt;from:&lt;/code&gt;, &lt;code&gt;has:&lt;/code&gt; 등은 구글에서 지원하는 &lt;a href=&quot;https://support.google.com/mail/answer/7190&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;검색 연산자&lt;/a&gt;다. 위 연산자는 나에게 보낸 메일(from:me) 중에서 첨부파일이 있고(has:attachment) 제목에 &lt;code&gt;receipt&lt;/code&gt;(subject:receipt)가 포함된 메일을 골라낸다.&lt;/li&gt;
&lt;li&gt;Add option &amp;gt; Download Attachments: 체크 (첨부파일 다운로드)&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;설정을 마치고 Fetch Test Event 버튼을 클릭해 보자. 우측 Output 영역에 Binary 탭이 새로 생긴 것을 확인할 수 있다. 트리거 설정에서 Download Attachments 옵션을 체크했기 때문에 n8n이 메일에 첨부된 이미지를 다운로드하여 이 Binary 탭에 담아 둔 것. 이 이미지 데이터는 다음 노드에서 활용할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;778&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r5Qdq/dJMb99NbfJ0/ypLsST8I21Uy2ZUuIwJKf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r5Qdq/dJMb99NbfJ0/ypLsST8I21Uy2ZUuIwJKf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r5Qdq/dJMb99NbfJ0/ypLsST8I21Uy2ZUuIwJKf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr5Qdq%2FdJMb99NbfJ0%2FypLsST8I21Uy2ZUuIwJKf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1616&quot; height=&quot;778&quot; data-origin-width=&quot;1616&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;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;AI Agent 노드&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;앞서 다운로드한 영수증 이미지(attachment_0)에서 가계부 작성에 필요한 핵심 정보(결제일, 금액 등)를 추출할 차례다. 이를 위해선 Vision(이미지 인식) 기능이 있는 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 Agent 노드를 추가하고 아래처럼 설정한다.&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;1045&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQjAvo/dJMcagFCooq/FVrhKmyY1eygtQR218Hthk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQjAvo/dJMcagFCooq/FVrhKmyY1eygtQR218Hthk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQjAvo/dJMcagFCooq/FVrhKmyY1eygtQR218Hthk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQjAvo%2FdJMcagFCooq%2FFVrhKmyY1eygtQR218Hthk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1045&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1045&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;Source for Prompt: Define below&lt;/li&gt;
&lt;li&gt;Prompt: 현재 노드로 전달된 바이너리 파일은 &lt;code&gt;$binary&lt;/code&gt; 변수로 접근할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1779251860714&quot; class=&quot;plaintext&quot; data-ke-language=&quot;plaintext&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Extract the invoice data from this image: {{ $binary.attachment_0 }} Date format needs to be YYYY.MM.DD&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Require Specific Output Format: 체크 (정형화된 데이터로 출력)&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;그 다음 프롬프트를 이해하고 이미지를 실제로 분석할 '두뇌' 역할을 하는 AI 모델을 연결한다. 에이전트 설정창 하단 Chat Model [+] 버튼을 클릭하고 OpenAI Chat Model 등을 선택한다. Chat Model은 저렴한 gpt-4.1-mini 정도면 충분하다.&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;1044&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chyHkn/dJMcaii5kcJ/rxwvW9O8latUiqn0jq1KVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chyHkn/dJMcaii5kcJ/rxwvW9O8latUiqn0jq1KVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chyHkn/dJMcaii5kcJ/rxwvW9O8latUiqn0jq1KVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchyHkn%2FdJMcaii5kcJ%2FrxwvW9O8latUiqn0jq1KVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1044&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1044&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;구조화된 출력 (Structured Outputs)&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;AI 모델은 기본적으로 사람이 읽기 편한 일반 텍스트(줄글)를 반환한다. 하지만 LLM이 추출한 영수증 데이터를 구글 스프레드시트 같은 데이터베이스에 안정적으로 저장하려면 JSON 같은 정형화된 구조를 가져야 한다. 이를 강제하기 위해 Structured Output Parser 노드를 활용할 수 있다.&lt;/p&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 Agent 설정에서 Require Specific Output Format 옵션에 체크했다면, 아래쪽에 출력 파서(Output Parser)를 연결할 수 있는 [+] 버튼이 생긴다. 클릭해서 노드를 생성하고, 설정 창에서 Schema Type을 Generate From JSON Example로 선택한 뒤, 원하는 데이터 형태를 JSON으로 작성한다.&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;1065&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beStL4/dJMcafGHaHO/ejIicZbrnMSLGpSe6Gh1n0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beStL4/dJMcafGHaHO/ejIicZbrnMSLGpSe6Gh1n0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beStL4/dJMcafGHaHO/ejIicZbrnMSLGpSe6Gh1n0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeStL4%2FdJMcafGHaHO%2FejIicZbrnMSLGpSe6Gh1n0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1065&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1065&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;JSON Example 예시:&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;date&quot;: &quot;2025.10.31&quot;,
  &quot;vendor&quot;: &quot;Apple Store Gangnam&quot;,
  &quot;totalAmount&quot;: 1400,
  &quot;currency&quot;: &quot;USD&quot;,
  &quot;items&quot;: [
    {
      &quot;description&quot;: &quot;Apple Watch&quot;,
      &quot;unitPrice&quot;: 200,
      &quot;quantity&quot;: 2,
      &quot;totalPrice&quot;: 400
    },
    {
      &quot;description&quot;: &quot;iPhone&quot;,
      &quot;unitPrice&quot;: 1000,
      &quot;quantity&quot;: 1,
      &quot;totalPrice&quot;: 1000
    }
  ]
}&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;이렇게 샘플 JSON만 입력하면 n8n이 구조를 분석하여 AI에게 전달할 스키마 규칙을 자동으로 생성해준다. 각 필드의 키값이나 데이터 타입을 일일이 지정하지 않아도 돼서 편리하다. 필요하다면 &lt;a href=&quot;https://json-schema.org/learn&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;JSON Schema&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;2048&quot; data-origin-height=&quot;1109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EHKum/dJMcadWmfwI/ylDzNuQRMieIkAg6Uuemh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EHKum/dJMcadWmfwI/ylDzNuQRMieIkAg6Uuemh1/img.png&quot; data-alt=&quot;AI Agent에 Chat Model과 Output Parser 노드가 연결된 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EHKum/dJMcadWmfwI/ylDzNuQRMieIkAg6Uuemh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEHKum%2FdJMcadWmfwI%2FylDzNuQRMieIkAg6Uuemh1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1109&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1109&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AI Agent에 Chat Model과 Output Parser 노드가 연결된 모습&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;/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;AI Agent의 Tool로 추가: 여러 도구 중 어떤 것을 언제 호출해야 할지 AI 스스로 판단하고 결정해야 하는 상황&lt;/li&gt;
&lt;li&gt;일반 Google Sheets 노드로 연결: [영수증 정보 추출 &amp;rarr; 구글 시트 기록]처럼 실행 단계가 명확하게 정해진 상황&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;이번 예제처럼 프로세스가 고정되어 있다면 일반 노드를 사용하여 AI 크레딧(비용) 낭비를 방지할 수 있다. 워크플로우 실행 흐름이 더 명확해지는 장점도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 새로운 구글 시트를 만들고 &lt;code&gt;Date&lt;/code&gt;, &lt;code&gt;Vendor&lt;/code&gt;, &lt;code&gt;Items&lt;/code&gt;, &lt;code&gt;Total Amount&lt;/code&gt;, &lt;code&gt;Currency&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;1526&quot; data-origin-height=&quot;656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buof5N/dJMcajhYoYv/h5Yne2xH114K23KlP0WzZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buof5N/dJMcajhYoYv/h5Yne2xH114K23KlP0WzZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buof5N/dJMcajhYoYv/h5Yne2xH114K23KlP0WzZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbuof5N%2FdJMcajhYoYv%2Fh5Yne2xH114K23KlP0WzZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1526&quot; height=&quot;656&quot; data-origin-width=&quot;1526&quot; data-origin-height=&quot;656&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서 파일을 만들었다면 n8n 워크플로우 화면으로 돌아와 단축키 &lt;code&gt;n&lt;/code&gt; &amp;gt; Google Sheets &amp;gt; Append or update row in sheet 액션을 선택해서 추가한 후, 설정창을 열어 아래처럼 지정한다.&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;1264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RMRhJ/dJMcacQHbaH/ms2UF2T3O1AhUEHg3wfE5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RMRhJ/dJMcacQHbaH/ms2UF2T3O1AhUEHg3wfE5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RMRhJ/dJMcacQHbaH/ms2UF2T3O1AhUEHg3wfE5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRMRhJ%2FdJMcacQHbaH%2Fms2UF2T3O1AhUEHg3wfE5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1264&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1264&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;Resource: Sheet Within Document (문서내 특정 시트 대상으로 작업)&lt;/li&gt;
&lt;li&gt;Operation: Append Row (기존 데이터 아래에 새로운 행 추가)&lt;/li&gt;
&lt;li&gt;Document &amp;gt; From list: 데이터를 저장할 구글 스프레드시트 파일명&lt;/li&gt;
&lt;li&gt;Sheet &amp;gt; From list: 해당 문서 내에서 실제 데이터를 기록할 시트/탭&lt;/li&gt;
&lt;li&gt;Mapping Column Mode: Map Each Column Manually (구글 시트 각 컬럼에 수동으로 값 매핑)&lt;/li&gt;
&lt;li&gt;Values to Send (저장할 데이터 매핑)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Date: &lt;code&gt;{{ $json.output.date }}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Vendor: &lt;code&gt;{{ $json.output.vendor }}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Items: &lt;code&gt;{{ $json.output.items }}&lt;/code&gt;&lt;br /&gt;&lt;code&gt;items&lt;/code&gt;는 여러 상품 정보를 담은 배열/객체이므로 그대로 입력하면 &lt;code&gt;[object Object]&lt;/code&gt;처럼 표시될 수 있다. 이때는 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;JSON.stringify()&lt;/a&gt; 메서드를 사용하여 문자열로 변환하면 된다.&lt;/li&gt;
&lt;li&gt;Total Amount: &lt;code&gt;{{ $json.output.totalAmount }}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Currency: &lt;code&gt;{{ $json.output.currency }}&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;&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;처리가 끝난 이메일을 받은 편지함에 그대로 두면 다음 워크플로우 실행 시 똑같은 영수증을 중복 처리할 수 있기 때문에, 데이터 기록을 완료한 이메일은 정리하는 것이 좋다. 여기서는 완전히 영구 삭제(Delete a message 액션) 하는 것보단 안전하게 휴지통(Trash a thread 액션)으로 이동시키는 방식을 추천한다.&lt;/p&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;n&lt;/code&gt; &amp;gt; Gmail &amp;gt; Trash a thread 액션을 추가한 후 아래처럼 설정한다.&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;1269&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJbpXv/dJMcaglf3it/SmMLzI2p0NpQPffr8oJNXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJbpXv/dJMcaglf3it/SmMLzI2p0NpQPffr8oJNXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJbpXv/dJMcaglf3it/SmMLzI2p0NpQPffr8oJNXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJbpXv%2FdJMcaglf3it%2FSmMLzI2p0NpQPffr8oJNXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1269&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1269&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;Credential: Gmail OAuth2 API (미리 연동해둔 Gmail 계정 선택)&lt;/li&gt;
&lt;li&gt;Resource: Thread (개별 메시지가 아닌 스레드 전체를 대상으로 작업)&lt;/li&gt;
&lt;li&gt;Operation: Trash (해당 스레드를 휴지통으로 이동)&lt;/li&gt;
&lt;li&gt;Thread ID: &lt;code&gt;{{ $('get_emails').item.json.threadId }}&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;Thread ID 값은 직접 타이핑할 필요 없이 왼쪽 INPUT 패널에서 이메일 불러오기 노드의 &lt;code&gt;threadID&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;p data-ke-size=&quot;size16&quot;&gt;혹시 모를 상황을 대비해 영수증 원본 이미지는 안전하게 백업해 두는 것이 좋다. 단축키 &lt;code&gt;n&lt;/code&gt; &amp;gt; Google Drive &amp;gt; Upload file 액션을 추가한 후, 설정창을 열어 아래처럼 지정한다.&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;1271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t6fHw/dJMb997wooy/hnlm7vMtfBG4XNl1wT1mZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t6fHw/dJMb997wooy/hnlm7vMtfBG4XNl1wT1mZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t6fHw/dJMb997wooy/hnlm7vMtfBG4XNl1wT1mZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft6fHw%2FdJMb997wooy%2Fhnlm7vMtfBG4XNl1wT1mZ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1271&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1271&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;Credential: Google Drive OAuth2 API (구글 드라이브 연동 계정)&lt;/li&gt;
&lt;li&gt;Resource: File (작업 대상)&lt;/li&gt;
&lt;li&gt;Operation: Upload (실행할 작업)&lt;/li&gt;
&lt;li&gt;Input Data Field Name: 업로드할 첨부파일 데이터&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;$('노드이름').item.binary&lt;/code&gt; 속성으로 특정 노드의 첨부 파일(바이너리 데이터)에 접근할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1779252126520&quot; class=&quot;plaintext&quot; data-ke-language=&quot;plaintext&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{{ $('get_emails').item.binary.attachment_0 }}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;File Name: 저장될 파일명&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1779252140016&quot; class=&quot;plaintext&quot; data-ke-language=&quot;plaintext&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{{ $json.output.date }}-{{ $json.output.vendor }}-{{ $json.output.totalAmount }}.{{ $('get_emails').item.binary.attachment_0.fileExtension }}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Parent Drive &amp;gt; From list: My Drive (개인 드라이브 지정)&lt;/li&gt;
&lt;li&gt;Parent Folder &amp;gt; From list: Receipts (업로드할 폴더 지정)&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;이제 모든 노드를 연결하고 워크플로우를 실행해 보자. 구글 시트 기록, 구글 드라이브 업로드, 이메일 휴지통 이동까지 정상적으로 작동했다면 성공이다. 마지막으로 워크플로우를 Publish 상태로 변경하면 지정한 주기마다 메일함을 확인하고 제목에 &lt;code&gt;receipt&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;1187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d0TdBa/dJMcafUd0mq/tTPDR9Z79Qf26b24bjba9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d0TdBa/dJMcafUd0mq/tTPDR9Z79Qf26b24bjba9k/img.png&quot; data-alt=&quot;워크플로우 완성 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d0TdBa/dJMcafUd0mq/tTPDR9Z79Qf26b24bjba9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd0TdBa%2FdJMcafUd0mq%2FtTPDR9Z79Qf26b24bjba9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1187&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1187&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;1494&quot; data-origin-height=&quot;614&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lHEyY/dJMcaffD52H/54Kj3f0io2BC3IsucuHq60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lHEyY/dJMcaffD52H/54Kj3f0io2BC3IsucuHq60/img.png&quot; data-alt=&quot;구글 시트에 지출 내역이 자동으로 기록된 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lHEyY/dJMcaffD52H/54Kj3f0io2BC3IsucuHq60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlHEyY%2FdJMcaffD52H%2F54Kj3f0io2BC3IsucuHq60%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1494&quot; height=&quot;614&quot; data-origin-width=&quot;1494&quot; data-origin-height=&quot;614&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;binary 데이터에 접근하는 두 가지 방식&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;&lt;code&gt;$binary&lt;/code&gt;는 &lt;code&gt;$input.item.binary&lt;/code&gt;의 &lt;a href=&quot;https://docs.n8n.io/data/expression-reference/root/#binary&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;축약 표현&lt;/a&gt;으로, 현재 노드로 전달된 입력(input) 아이템의 바이너리 데이터에 접근할 때 사용한다. 즉, 현재 노드가 처리 중인 입력 아이템이 &lt;code&gt;binary&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;$('노드이름').item.binary&lt;/code&gt;는 현재 노드의 입력이 아닌, 특정 노드가 출력한 아이템의 바이너리 데이터에 접근할 때 사용한다. 이때 현재 아이템이 해당 노드의 아이템과 연결(&lt;a href=&quot;https://docs.n8n.io/data/data-mapping/data-item-linking/item-linking-concepts/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Item Linking&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;중간에 다른 노드를 거치면서 현재 입력 데이터의 binary 속성이 유실됐다면 &lt;code&gt;$binary&lt;/code&gt; 로는 접근할 수 없다. 이 경우 원본 파일이 있는 노드를 직접 참조해야 한다. 예) &lt;code&gt;$('노드이름').item.binary&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;$json&lt;/code&gt; 역시 &lt;code&gt;$input.item.json&lt;/code&gt;의 &lt;a href=&quot;https://docs.n8n.io/data/expression-reference/root/#json&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;축약 표현&lt;/a&gt;으로, 현재 노드로 전달된 입력 아이템의 JSON 데이터에 접근할 때 사용한다. &lt;code&gt;$input&lt;/code&gt;은 현재 노드로 들어온 입력 데이터를 다루는 객체로 &lt;code&gt;all()&lt;/code&gt;, &lt;code&gt;first()&lt;/code&gt;, &lt;code&gt;last()&lt;/code&gt; 등의 메서드를 제공한다. &lt;code&gt;$input.item&lt;/code&gt;은 노드가 현재 처리 중인 단일 아이템을 가리킨다. 마찬가지로 &lt;code&gt;$('노드이름').item&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;n8n에서 노드로 전달되는 데이터는 아래와 같이 여러 개의 item을 담은 배열 구조로 이루어져 있다. 각 item은 일반 데이터를 담는 &lt;code&gt;json&lt;/code&gt; 객체를 기본으로 가지며, 파일을 포함할 경우 데이터와 메타데이터를 담는 &lt;code&gt;binary&lt;/code&gt; 객체를 함께 가진다&lt;a href=&quot;https://docs.n8n.io/data/data-structure/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;(참고 링크)&lt;/a&gt;.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;// $input.all() 반환값
[
  {
    // 일반 데이터
    json: {
      apple: &quot;beets&quot;,
      carrot: {
        dill: 1,
      },
    },

    // 바이너리 데이터
    binary: {
      &quot;apple-picture&quot;: {
        data: &quot;...&quot;, // Base64, 필수
        mimeType: &quot;image/png&quot;,
        fileExtension: &quot;png&quot;,
        fileName: &quot;example.png&quot;,
      },
    },
  },
];&lt;/code&gt;&lt;/pre&gt;</description>
      <category>  Programming</category>
      <category>aiagent</category>
      <category>ai에이전트</category>
      <category>n8n</category>
      <category>가계부자동화</category>
      <category>로우코드</category>
      <category>업무자동화</category>
      <category>영수증정리</category>
      <category>워크플로우자동화</category>
      <category>이메일자동화</category>
      <category>자동화</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1362</guid>
      <comments>https://romantech.net/1362#entry1362comment</comments>
      <pubDate>Wed, 20 May 2026 13:56:13 +0900</pubDate>
    </item>
    <item>
      <title>[n8n] 구글 드라이브 파일/폴더 정리 AI 에이전트 만들기</title>
      <link>https://romantech.net/1361</link>
      <description>&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;AI Agent가 파일 이름/유형을 기준으로 분류하고&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;Google Drive 트리거 노드 추가&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;n&lt;/code&gt;) &amp;gt; Google Drive 검색 &amp;gt; On changes involving a specific folder 트리거를 선택해서 추가한다. 이 트리거는 지정한 구글 드라이브 폴더 안에서 파일 추가/삭제/수정 등 변경 사항을 감지하면 워크플로우를 실행하는 역할을 한다.&lt;/p&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;1276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3uv7N/dJMcadaVXKM/wH5z4w3Dgls9oIHXOk9QhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3uv7N/dJMcadaVXKM/wH5z4w3Dgls9oIHXOk9QhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3uv7N/dJMcadaVXKM/wH5z4w3Dgls9oIHXOk9QhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3uv7N%2FdJMcadaVXKM%2FwH5z4w3Dgls9oIHXOk9QhK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1276&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1276&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;Credentials (인증): 구글 드라이브 계정 연동.&lt;/li&gt;
&lt;li&gt;Poll Times (확인 주기): 구글 드라이브의 변경 사항을 체크하는 주기. 1분 정도가 적당하다.&lt;/li&gt;
&lt;li&gt;Trigger On (트리거 기준): 특정 폴더의 변경사항을 감지하기 위해 Changes Involving a Specific Folder를 선택한다.&lt;/li&gt;
&lt;li&gt;Folder (대상 폴더): 변경 사항을 감지할 구글 드라이브 폴더 지정.&lt;/li&gt;
&lt;li&gt;Watch For (감지 조건): 새로운 파일을 업로드할 때만 워크플로우가 작동하도록 File Created를 선택한다.&lt;/li&gt;
&lt;/ul&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;이제 지정한 구글 드라이브 폴더에 파일을 업로드하고 Fetch Test Event 버튼을 클릭해 보자. 우측 OUTPUT 영역에 해당 파일의 메타데이터가 표시되면 트리거 설정이 정상적으로 완료된 것이다.&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/cgjBfq/dJMcahLftdS/yYlJ46nuB8XAFBYk7tA2bk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgjBfq/dJMcahLftdS/yYlJ46nuB8XAFBYk7tA2bk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgjBfq/dJMcahLftdS/yYlJ46nuB8XAFBYk7tA2bk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgjBfq%2FdJMcahLftdS%2FyYlJ46nuB8XAFBYk7tA2bk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;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;AI Agent 노드 추가&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;b&gt;AI Agent는 AI 모델을 사용해서 상황을 판단하고, 필요한 도구를 호출하며, 작업 흐름을 제어하는 실행 주체(오케스트레이터)&lt;/b&gt;다. 모델이 Agent 안에서 생각과 판단을 담당하는 '두뇌'라면, Agent는 그 두뇌를 바탕으로 여러 도구를 사용하여 작업을 수행하는 '신체'와 비슷하다. 에이전트의 구조를 간단히 살펴보면 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;plaintext&quot;&gt;&lt;code&gt;AI Agent
├─ Chat Model / LLM: 요청을 해석하고 실행 흐름 결정
├─ Tools: Google Drive, Sheets 등 실제 작업 도구
├─ Memory: 이전 대화나 상태 기억
└─ Instructions: 어떤 방식으로 행동할지에 대한 지시문&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;먼저 AI Agent 노드를 추가한 뒤, 앞서 만든 구글 드라이브 트리거 노드와 연결한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2376&quot; data-origin-height=&quot;888&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/culhwT/dJMcab5jY9p/1l4ebyV9A7S186zoMfXlQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/culhwT/dJMcab5jY9p/1l4ebyV9A7S186zoMfXlQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/culhwT/dJMcab5jY9p/1l4ebyV9A7S186zoMfXlQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FculhwT%2FdJMcab5jY9p%2F1l4ebyV9A7S186zoMfXlQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2376&quot; height=&quot;888&quot; data-origin-width=&quot;2376&quot; data-origin-height=&quot;888&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에이전트가 잘 작동하는지 확인하기 위해 AI Agent 설정 창에서 아래와 같이 설정한다.&lt;/p&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;1420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UJG0e/dJMcabxsUVY/SMHPuCaJuFhPjETJG8oVz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UJG0e/dJMcabxsUVY/SMHPuCaJuFhPjETJG8oVz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UJG0e/dJMcabxsUVY/SMHPuCaJuFhPjETJG8oVz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUJG0e%2FdJMcabxsUVY%2FSMHPuCaJuFhPjETJG8oVz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1420&quot; data-origin-width=&quot;2284&quot; data-origin-height=&quot;1420&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;Source for Prompt (에이전트에게 전달할 프롬프트 출처): Define below&lt;/li&gt;
&lt;li&gt;Prompt:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;plaintext&quot;&gt;&lt;code&gt;Given this file name and mimeType, what folder would you put this file on?

Filename: {{ $json.name }}
mimeType: {{ $json.mimeType }}&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;이제 Agent의 두뇌를 담당할 Chat Model 서브 노드를 연결할 차례다. 이 모델이 실제 프롬프트를 읽고, 어떤 폴더로 이동시켜야 할지 최종 판단을 내리게 된다. AI Agent 하단의 Chat Model 연결점에서 + 버튼을 클릭하여 노드를 추가한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2380&quot; data-origin-height=&quot;1454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xHDtF/dJMcajvvA93/9v7ERYM2k3PLRq86MpPV5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xHDtF/dJMcajvvA93/9v7ERYM2k3PLRq86MpPV5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xHDtF/dJMcajvvA93/9v7ERYM2k3PLRq86MpPV5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxHDtF%2FdJMcajvvA93%2F9v7ERYM2k3PLRq86MpPV5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2380&quot; height=&quot;1454&quot; data-origin-width=&quot;2380&quot; data-origin-height=&quot;1454&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;Chat Model 서브 노드의 모델은 저렴한 gpt-4.1-mini 등으로 선택한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2380&quot; data-origin-height=&quot;1114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo2p5K/dJMcagle9Ts/IWurW3tYc7R4boIEdp0j81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo2p5K/dJMcagle9Ts/IWurW3tYc7R4boIEdp0j81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo2p5K/dJMcagle9Ts/IWurW3tYc7R4boIEdp0j81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo2p5K%2FdJMcagle9Ts%2FIWurW3tYc7R4boIEdp0j81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2380&quot; height=&quot;1114&quot; data-origin-width=&quot;2380&quot; data-origin-height=&quot;1114&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;이제 Execute step 버튼을 눌러서 워크플로우를 실행해 보자. 우측 Output 결과를 보면, AI가 파일 이름/유형을 분석한 뒤, 이 파일은 이미지 폴더에 넣는 것이 적절하다고 판단한 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2280&quot; data-origin-height=&quot;1206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bI0yUx/dJMcahYLhJL/DI9jmFP5rXsFjL2ihHnAEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bI0yUx/dJMcahYLhJL/DI9jmFP5rXsFjL2ihHnAEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bI0yUx/dJMcahYLhJL/DI9jmFP5rXsFjL2ihHnAEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbI0yUx%2FdJMcahYLhJL%2FDI9jmFP5rXsFjL2ihHnAEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2280&quot; height=&quot;1206&quot; data-origin-width=&quot;2280&quot; data-origin-height=&quot;1206&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Output 내용 요약:&lt;/p&gt;
&lt;pre class=&quot;plaintext&quot;&gt;&lt;code&gt;파일명과 image/jpeg라는 유형을 보아 이 파일은 JPEG 이미지입니다. 따라서 'Images', 'Photos' 또는 'Pictures' 같은 이미지 전용 폴더에 넣는 것이 가장 적절합니다.&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;AI Agent Tools 추가&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;이제 에이전트가 실제 작업을 수행할 때 사용할 도구(Tools) 노드를 추가할 차례다. 이 워크플로우에선 폴더 안을 들여다보고 어떤 파일/폴더가 있는지 확인하는 도구와 폴더를 만들고 지정한 위치로 파일을 옮기는 도구가 필요하다.&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;Search Tool&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI Agent 노드 하단의 Tools 연결점에서 + 버튼을 눌러 Google Drive Tool 노드를 추가하고, 헷갈리지 않도록 노드 이름은 &lt;code&gt;search_tool&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;2282&quot; data-origin-height=&quot;1418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OC0OX/dJMcafmnvIm/6ZQPFdJP5GSTvBNSkE2ok0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OC0OX/dJMcafmnvIm/6ZQPFdJP5GSTvBNSkE2ok0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OC0OX/dJMcafmnvIm/6ZQPFdJP5GSTvBNSkE2ok0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOC0OX%2FdJMcafmnvIm%2F6ZQPFdJP5GSTvBNSkE2ok0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2282&quot; height=&quot;1418&quot; data-origin-width=&quot;2282&quot; data-origin-height=&quot;1418&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;Credential: 앞서 연동해둔 Google Drive 계정 선택&lt;/li&gt;
&lt;li&gt;Tool Description: Set Automatically (자동 설정)&lt;/li&gt;
&lt;li&gt;Resource: File/Folder (파일/폴더 모두 검색 대상)&lt;/li&gt;
&lt;li&gt;Operation: Search (검색 작업 수행)&lt;/li&gt;
&lt;li&gt;Search Method: Search File/Folder Name (이름 기준으로 검색)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Search Query: 우측 ✨ 마법 버튼 클릭 (AI Agent가 검색어를 자동으로 채움)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Return All: 활성화 (검색 결과를 모두 가져오기 위해 켬)&lt;/li&gt;
&lt;li&gt;Filter &amp;gt; Folder: 보안을 위해 실습하고 있는 최상위 폴더 선택&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;Create Folder Tool&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일을 옮길 대상 폴더가 없다면, 새 폴더를 만들어 주는 도구가 필요하다. AI Agent 노드 하단의 Tools 연결점에서 [+] 버튼을 눌러 Google Drive Tool 노드를 하나 더 추가하고, 역할을 쉽게 알 수 있도록 노드 이름을 &lt;code&gt;create_folder_tool&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;2282&quot; data-origin-height=&quot;1366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F98WJ/dJMcajoFop8/KRYh6pYDHaJMVYC0yjrxJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F98WJ/dJMcajoFop8/KRYh6pYDHaJMVYC0yjrxJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F98WJ/dJMcajoFop8/KRYh6pYDHaJMVYC0yjrxJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF98WJ%2FdJMcajoFop8%2FKRYh6pYDHaJMVYC0yjrxJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2282&quot; height=&quot;1366&quot; data-origin-width=&quot;2282&quot; data-origin-height=&quot;1366&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;Credential: 앞서 연동해둔 Google Drive 계정 선택&lt;/li&gt;
&lt;li&gt;Tool Description: Set Automatically (자동 설정)&lt;/li&gt;
&lt;li&gt;Resource: Folder&lt;/li&gt;
&lt;li&gt;Operation: Create (새로운 폴더 생성)&lt;/li&gt;
&lt;li&gt;Folder Name: &lt;code&gt;{{ $fromAI('folder_name') }}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Parent Drive: &lt;code&gt;My Drive&lt;/code&gt; 선택&lt;/li&gt;
&lt;li&gt;Parent Folder: 실습하고 있는 최상위 기준 폴더 선택 (&lt;code&gt;N8N Practice&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;위 설정에서 Folder Name 파라미터에 &lt;code&gt;{{ $fromAI() }}&lt;/code&gt; 표현식을 사용한 것에 주목하자. &lt;code&gt;$fromAI()&lt;/code&gt;는 AI Agent가 상황에 맞게 파라미터 값을 직접 채우도록 위임하는 함수다.&lt;/p&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;{{ $fromAI('folder_name') }}&lt;/code&gt;이라고 입력하면, n8n은 AI Agent에게 &lt;code&gt;folder_name&lt;/code&gt; 값이 필요하다고 알려준다. 그럼 AI Agent는 이전 단계에서 넘겨받은 파일 이름/유형 등을 바탕으로 적절한 폴더 이름을 판단하고 Tool 노드에 전달한다.&lt;/p&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;folder_name&lt;/code&gt; 같은 이름은 AI에게 어떤 값을 생성해야 할지 알려주는 중요한 힌트가 된다. &lt;code&gt;{{ $fromAI('abc') }}&lt;/code&gt;처럼 임의의 이름을 사용할 수도 있지만, AI가 어떤 값을 채워야 하는지 이해할 수 있도록 역할이 드러나는 이름을 사용하는 것이 좋다.&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;Move File Tool&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 분류가 끝난 파일을 지정한 목적지 폴더로 이동시킬 도구가 필요하다. AI Agent 노드 하단의 Tools 연결점에서 [+] 버튼을 눌러 Google Drive Tool 노드를 하나 더 추가하고, 역할을 쉽게 알 수 있도록 노드 이름을 &amp;thinsp;&lt;code&gt;move_file_tool&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;2282&quot; data-origin-height=&quot;1294&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1eBzt/dJMcaiJ6hhj/F8zM5NaSs07fwH7iM38vhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1eBzt/dJMcaiJ6hhj/F8zM5NaSs07fwH7iM38vhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1eBzt/dJMcaiJ6hhj/F8zM5NaSs07fwH7iM38vhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1eBzt%2FdJMcaiJ6hhj%2FF8zM5NaSs07fwH7iM38vhK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2282&quot; height=&quot;1294&quot; data-origin-width=&quot;2282&quot; data-origin-height=&quot;1294&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;Credential: 앞서 연동해둔 Google Drive 계정 선택&lt;/li&gt;
&lt;li&gt;Tool Description: Set Automatically (자동 설정)&lt;/li&gt;
&lt;li&gt;Resource: File (파일을 옮겨야 하므로)&lt;/li&gt;
&lt;li&gt;Operation: Move (파일 이동)&lt;/li&gt;
&lt;li&gt;File &amp;gt; By ID: 우측 ✨ 마법 버튼 클릭 (업로드한 파일이 매번 다르므로, AI Agent가 파일 ID 자동 입력)&lt;/li&gt;
&lt;li&gt;From list: &lt;code&gt;My Drive&lt;/code&gt; 선택&lt;/li&gt;
&lt;li&gt;Parent Folder &amp;gt; By ID: 우측 ✨ 마법 버튼 클릭 (이동할 폴더는 상황에 따라 다르므로, AI Agent가 폴더 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;위 설정에선 File(이동할 파일 ID)과 Parent Folder(대상 폴더 ID) 파라미터 값을 AI가 자동으로 채우도록 위임(Defined automatically by the AI)한 것이 핵심이다. 앞서 설명한 &amp;thinsp;&lt;code&gt;{{ $fromAI() }}&lt;/code&gt;&amp;thinsp; 방식과 마찬가지로 AI Agent가 현재 처리 중인 파일과 앞 단계에서 찾았거나 생성한 폴더 정보를 바탕으로 알맞은 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;&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;AI Agent가 위에서 추가한 도구들을 상황에 맞게 제대로 활용하려면, 에이전트에게 역할과 작업 규칙을 명확하게 알려줘야 한다. 단순히 &quot;파일을 정리해 줘&quot;라고 지시하면 기존 폴더를 확인하지 않고 새 폴더를 만들거나 잘못된 위치로 이동할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI Agent 노드의 설정 창을 열고, 아래와 같이 구체적인 시스템 프롬프트로 변경해 주자.&lt;/p&gt;
&lt;pre class=&quot;plaintext&quot;&gt;&lt;code&gt;You are a file organizer assistant.
You keep my Google Drive folder organized.
Here is the file that was just uploaded to my Google Drive.

Name: {{ $json.name }}
MimeType: {{ $json.mimeType }}
File ID: {{ $json.id }}

You have a set of tools to help you accomplish the task: 
`search_tool`: This tool searches for files and folders. Use this to search and see if you need to create a folder or if it already exists.
`move_file_tool`: This tool is to move a file to a folder.
`create_folder_tool`: This tool is to create a folder.

ALWAYS use the `search_tool` first to make sure that you don't create duplicate folders.&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;새롭게 작성한 프롬프트는 에이전트가 오류 없이 작동할 수 있도록 4가지 요소를 담고 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;역할 부여 (Role): AI Agent가 어떤 역할을 수행해야 하는지 정의한다.&lt;/li&gt;
&lt;li&gt;컨텍스트 제공 (Context): 구글 드라이브 트리거에서 전달받은 파일 이름/유형/ID를 제공한다.&lt;/li&gt;
&lt;li&gt;도구 설명 (Tools): 앞서 정의한 3개 툴들이 각각 언제, 어떤 용도로 쓰이는지 설명한다.&lt;/li&gt;
&lt;li&gt;핵심 규칙 (Rules/Safeguards): 폴더 중복 생성을 막기 위해 기존 폴더를 먼저 검색하도록 지시한다.&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;이제 AI Agent가 도구들을 올바르게 호출하는지 확인해 보자. 구글 드라이브에 파일을 업로드한 뒤 워크플로우를 실행하면 AI Agent는 다음과 같은 순서로 작업을 처리한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2382&quot; data-origin-height=&quot;1456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwOxDB/dJMb99Naqt9/2fJba221K9ABZ3KgMtPwT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwOxDB/dJMb99Naqt9/2fJba221K9ABZ3KgMtPwT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwOxDB/dJMb99Naqt9/2fJba221K9ABZ3KgMtPwT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwOxDB%2FdJMb99Naqt9%2F2fJba221K9ABZ3KgMtPwT0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2382&quot; height=&quot;1456&quot; data-origin-width=&quot;2382&quot; data-origin-height=&quot;1456&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;업로드한 파일을 어떤 폴더에 넣을지 판단 &amp;mdash; Chat Model&lt;/li&gt;
&lt;li&gt;해당 폴더가 이미 존재하는지 검색 &amp;mdash; Search Tool&lt;/li&gt;
&lt;li&gt;폴더가 없다면 생성 &amp;mdash; Create Folder Tool&lt;/li&gt;
&lt;li&gt;파일을 대상 폴더로 이동 &amp;mdash; Move File Tool&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;Chat Model에 표시된 숫자 3은 AI Agent가 전체 작업을 처리하는 동안 Chat Model을 3번 호출했다는 의미다. 반대로 체크 표시가 없는 Tool 노드는 이번 워크플로우 실행에서 사용되지 않았음을 나타낸다. 예를 들어 대상 폴더가 이미 존재할 땐 폴더를 새로 만들 필요가 없으므로 &lt;code&gt;create_folder_tool&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;AI Agent 설정 창 우측의 Logs 영역을 보면 에이전트가 어떤 도구를 어떤 순서로 호출했는지, 토큰은 얼마나 사용했는지, 각 단계의 입력과 출력은 무엇이었는지 등을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2222&quot; data-origin-height=&quot;1042&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G8qGf/dJMcadosuMV/kbyIENMwt5blJr1KhPVK30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G8qGf/dJMcadosuMV/kbyIENMwt5blJr1KhPVK30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G8qGf/dJMcadosuMV/kbyIENMwt5blJr1KhPVK30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG8qGf%2FdJMcadosuMV%2FkbyIENMwt5blJr1KhPVK30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2222&quot; height=&quot;1042&quot; data-origin-width=&quot;2222&quot; data-origin-height=&quot;1042&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>  Programming</category>
      <category>aiagent</category>
      <category>ai자동화</category>
      <category>n8n</category>
      <category>구글드라이브자동화</category>
      <category>노코드자동화</category>
      <category>업무자동화</category>
      <category>에이전트</category>
      <category>워크플로우자동화</category>
      <category>파일자동분류</category>
      <category>파일정리자동화</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1361</guid>
      <comments>https://romantech.net/1361#entry1361comment</comments>
      <pubDate>Tue, 19 May 2026 13:33:19 +0900</pubDate>
    </item>
    <item>
      <title>[n8n] 유튜브 구독 채널 새 영상 이메일로 받아보기</title>
      <link>https://romantech.net/1360</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  워크플로우 목표&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;특정 유튜브 채널의 새로운 영상 조회 (RSS 이용)&lt;/li&gt;
&lt;li&gt;최근 1주일 이내 업로드한 영상만 필터링&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&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1368&quot; data-origin-height=&quot;842&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvRVJW/dJMcahEqlEw/e4jkK3fHcvue4vkKcWhWp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvRVJW/dJMcahEqlEw/e4jkK3fHcvue4vkKcWhWp1/img.png&quot; data-alt=&quot;유튜브 구독 채널 요약 메일&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvRVJW/dJMcahEqlEw/e4jkK3fHcvue4vkKcWhWp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvRVJW%2FdJMcahEqlEw%2Fe4jkK3fHcvue4vkKcWhWp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1368&quot; height=&quot;842&quot; data-origin-width=&quot;1368&quot; data-origin-height=&quot;842&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;유튜브 채널 ID 확인하기&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;RSS는 즐겨 찾는 웹사이트나 블로그 등의 새로운 소식을 매번 직접 방문할 필요 없이 한곳에서 모아 볼 수 있도록 해주는 기술이다. Feedly 같은 RSS 리더기를 사용하면 새 글이 올라올 때마다 콘텐츠를 자동으로 가져올 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유튜브는 RSS 버튼을 별도로 제공하지 않지만, 아래 URL 형식을 통해 RSS 피드 기능을 지원한다. 유튜브 RSS 피드는 최신 동영상 15개(변동 가능) 정보를 XML 형식으로 받아볼 수 있다.&lt;/p&gt;
&lt;pre class=&quot;txt awk&quot;&gt;&lt;code&gt;https://www.youtube.com/feeds/videos.xml?channel_id=채널ID&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;특정 채널의 영상을 RSS로 받아보려면 먼저 채널 ID를 알아야 한다. 구글에 Youtube Channel ID Finder를 검색하면 채널 ID를 찾아주는 다양한 사이트가 나오는데, 개인적으로 &lt;a href=&quot;https://commentpicker.com/youtube-channel-id.php&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;COMMENT PICKER&lt;/a&gt;를 추천한다. 영상 링크, 채널 주소 또는 사용자 이름(핸들)을 입력하면 채널 ID를 자동으로 찾아준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1488&quot; data-origin-height=&quot;942&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cG7eC9/dJMcaii3JRd/wNBkfBjk2cBvfXSce1oMXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cG7eC9/dJMcaii3JRd/wNBkfBjk2cBvfXSce1oMXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cG7eC9/dJMcaii3JRd/wNBkfBjk2cBvfXSce1oMXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcG7eC9%2FdJMcaii3JRd%2FwNBkfBjk2cBvfXSce1oMXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1488&quot; height=&quot;942&quot; data-origin-width=&quot;1488&quot; data-origin-height=&quot;942&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;좋아하는 채널 2~3개 정도 골라서 채널 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;&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;윈도우 스티커 메모처럼 n8n 워크플로우 캔버스에도 스티커 노트를 추가할 수 있다. 단축키 &lt;code&gt;Shift&lt;/code&gt; + &lt;code&gt;S&lt;/code&gt; 혹은 마우스 우클릭 &amp;gt; Add sticky note를 클릭하면 노란색 포스트잇이 추가된다. 기본적으로 마크다운 문법을 지원하기 때문에 좀 더 편하게 필요한 내용을 정리할 수 있다. 위에서 확인한 채널 ID를 스티커 노트에 적어두자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;762&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8PAUm/dJMcaciN1xs/fQKEtBNx9dYVImZWsMEyc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8PAUm/dJMcaciN1xs/fQKEtBNx9dYVImZWsMEyc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8PAUm/dJMcaciN1xs/fQKEtBNx9dYVImZWsMEyc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8PAUm%2FdJMcaciN1xs%2FfQKEtBNx9dYVImZWsMEyc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1594&quot; height=&quot;762&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;762&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;채널 ID 입력하기&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;위에서 확인한 채널 ID를 n8n에서 사용할 수 있도록 Edit Fields (Set) 노드를 추가한다. Mode는 Manual Mapping으로 선택하고, Add Field를 클릭해서 채널 ID를 배열(Array) 형태로 입력한다.&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;1115&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qrUDM/dJMcacXrFfI/Ly6WuB6TDBVU0pueKJTcek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qrUDM/dJMcacXrFfI/Ly6WuB6TDBVU0pueKJTcek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qrUDM/dJMcacXrFfI/Ly6WuB6TDBVU0pueKJTcek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqrUDM%2FdJMcacXrFfI%2FLy6WuB6TDBVU0pueKJTcek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1115&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1115&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;pre class=&quot;json&quot;&gt;&lt;code&gt;[
  &quot;UCA_hgsFzmynpv1zkvA5A7jA&quot;,
  &quot;UCHKDlM4UOmtEBhwDTg8lqJQ&quot;,
  &quot;UCoCvTlU0KpNYwnMIgs7MPrA&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;채널 ID 분리하기&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;Edit Fields 노드에서 만든 배열은 아직 하나의 아이템 안에 여러 채널 ID가 묶여 있는 형태다. 각 채널의 RSS 피드를 개별적으로 조회하려면 배열에 담긴 값을 하나씩 분리해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 위해 Split Out 노드를 추가한다. 분리할 대상 필드(Field To Split Out)에 &lt;code&gt;channel_ids&lt;/code&gt;를 지정하고, 분리된 값이 담길 새 필드 이름은 &lt;code&gt;channel_id&lt;/code&gt;로 설정한다. 이렇게 하면 배열에 들어 있던 채널 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;1115&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tfjzJ/dJMcagr0PKX/CADTDPRgzqvXVqluFNeQ4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tfjzJ/dJMcagr0PKX/CADTDPRgzqvXVqluFNeQ4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tfjzJ/dJMcagr0PKX/CADTDPRgzqvXVqluFNeQ4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtfjzJ%2FdJMcagr0PKX%2FCADTDPRgzqvXVqluFNeQ4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1115&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1115&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;pre class=&quot;json&quot;&gt;&lt;code&gt;[
  { &quot;channel_id&quot;: &quot;UCA_hgsFzmynpv1zkvA5A7jA&quot; },
  { &quot;channel_id&quot;: &quot;UCHKDlM4UOmtEBhwDTg8lqJQ&quot; },
  { &quot;channel_id&quot;: &quot;UCoCvTlU0KpNYwnMIgs7MPrA&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;RSS 피드 조회하기&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;이제 분리된 각각의 채널 ID를 이용해 유튜브 채널의 최신 영상 정보를 가져올 차례다. RSS Feed 노드 추가 &amp;gt; 노드 설정 화면 &amp;gt; URL 필드를 표현식 모드로 변경 &amp;gt; 유튜브 RSS 기본 주소 뒤에 앞서 만든 &lt;code&gt;channel_id&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;1066&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dvNiFz/dJMcacQFJ8p/S2exEkbAh4WQ9KS53fp971/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dvNiFz/dJMcacQFJ8p/S2exEkbAh4WQ9KS53fp971/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dvNiFz/dJMcacQFJ8p/S2exEkbAh4WQ9KS53fp971/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdvNiFz%2FdJMcacQFJ8p%2FS2exEkbAh4WQ9KS53fp971%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1066&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1066&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 표현식(Expression) 입력 예시:&lt;/p&gt;
&lt;pre class=&quot;txt awk&quot;&gt;&lt;code&gt;https://www.youtube.com/feeds/videos.xml?channel_id={{ $json.channel_id }}&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;1주일 이내에 업로드한 영상만 골라내기 위해 Filter 노드 추가 &amp;gt; 노드 설정 화면 &amp;gt; Add Condition 버튼을 클릭해서 조건을 설정한다. 첫 번째 값에는 영상 업로드 날짜를 입력하고, 조건 연산자는 is after(이후)를 선택한다. 두 번째 값에는 오늘 기준 1주일 전 날짜를 지정한다.&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;1066&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciIZLa/dJMcabYzniW/NbaMxOeCi5SIEUCkW6ixk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciIZLa/dJMcabYzniW/NbaMxOeCi5SIEUCkW6ixk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciIZLa/dJMcabYzniW/NbaMxOeCi5SIEUCkW6ixk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciIZLa%2FdJMcabYzniW%2FNbaMxOeCi5SIEUCkW6ixk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1066&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1066&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;정확한 날짜 비교를 위해 각 필드를 표현식 모드로 변경한 뒤 아래 코드를 입력한다. 이 코드는 두 날짜를 UTC 기준으로 맞추고, 시간 단위 차이를 없애기 위해 하루의 시작 시점(00시 00분)으로 통일하여 비교한다.&lt;/p&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 class=&quot;js javascript&quot;&gt;&lt;code&gt;{{ DateTime.fromISO($json.isoDate).setZone(&quot;utc&quot;).startOf(&quot;day&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;두 번째 값 입력 예시(1주일 전 날짜):&lt;/p&gt;
&lt;pre class=&quot;js javascript&quot;&gt;&lt;code&gt;{{ $now.minus({weeks:1}).setZone(&quot;utc&quot;).startOf(&quot;day&quot;) }}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;setZone(&quot;utc&quot;)&lt;/code&gt;: 기준 시간을 UTC(협정 세계시)로 통일하여 지역 설정에 따른 시간 차이를 줄인다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;startOf(&quot;day&quot;)&lt;/code&gt;: 해당 날짜의 시작 시점(00시 00분)으로 초기화하여 날짜(일) 단위로 비교할 수 있게 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;UTC 협정 세계시란?&lt;/b&gt;&lt;br /&gt;전 세계가 공통으로 사용하는 표준 시간. UTC 자체는 기준점인 UTC+0을 의미하며, 각 국가와 지역의 시간은 이 UTC를 기준으로 몇 시간 빠른지 또는 느린지로 표현한다. 한국 시간(KST)은 UTC보다 9시간 빠른 UTC+9다. &lt;br /&gt;&lt;br /&gt;유튜브 서버와 n8n 시스템의 시간대 설정이 다를 수 있으므로, 날짜를 비교할 때는 UTC로 기준을 통일하면 시차로 인한 계산 오류를 줄일 수 있다.&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;Filter 노드를 통과한 영상들은 각각 개별 아이템(item)으로 전달된다. 만약 이 상태에서 이메일 발송 노드를 연결하면, 필터링된 영상 개수만큼 이메일이 발송되는 문제가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 개의 영상 정보를 하나의 이메일에 담아서 보내려면, 개별 아이템들을 하나로 묶어주는 Aggregate 노드를 추가해야 한다.&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;1066&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EXWm5/dJMcabqJwif/3MBPUrAIFFv1Am5Ikk8Hw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EXWm5/dJMcabqJwif/3MBPUrAIFFv1Am5Ikk8Hw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EXWm5/dJMcabqJwif/3MBPUrAIFFv1Am5Ikk8Hw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEXWm5%2FdJMcabqJwif%2F3MBPUrAIFFv1Am5Ikk8Hw0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1066&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1066&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;Aggregate 노드를 추가하고 다음과 같이 설정한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Aggregate: &lt;code&gt;All Item Data (Into a Single List)&lt;/code&gt;&lt;br /&gt;모든 아이템 데이터를 하나의 리스트로 합친다.&lt;/li&gt;
&lt;li&gt;Put Output in Field: &lt;code&gt;data&lt;/code&gt;&lt;br /&gt;합친 결과를 &lt;code&gt;data&lt;/code&gt;라는 이름의 필드에 담는다.&lt;/li&gt;
&lt;li&gt;Include: &lt;code&gt;Specified Fields&lt;/code&gt;&lt;br /&gt;지정한 필드만 결과에 포함한다.&lt;/li&gt;
&lt;li&gt;Fields To Include: &lt;code&gt;title, link, author, pubDate&lt;/code&gt;&lt;br /&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;data&lt;/code&gt; 배열에 포함된 것을 확인할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;[
  {
    &quot;data&quot;: [
      {
        &quot;title&quot;: &quot;영상제목 1&quot;,
        &quot;link&quot;: &quot;https://www.youtube.com/watch?v=...&quot;,
        // ...
      },
      {
        &quot;title&quot;: &quot;영상제목 2&quot;,
        &quot;link&quot;: &quot;https://www.youtube.com/watch?v=...&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;이제 하나로 취합된 영상 정보를 이메일로 받아볼 차례다. 사용 중인 이메일 서비스에 맞게 발송 노드를 추가하고 다음과 같이 설정한다.&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;1371&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JT3I3/dJMcad24PS5/FXPQiwXpiDVfuzI4Cd4gJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JT3I3/dJMcad24PS5/FXPQiwXpiDVfuzI4Cd4gJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JT3I3/dJMcad24PS5/FXPQiwXpiDVfuzI4Cd4gJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJT3I3%2FdJMcad24PS5%2FFXPQiwXpiDVfuzI4Cd4gJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1371&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1371&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;Resource: Message&lt;/li&gt;
&lt;li&gt;Operation: Send&lt;/li&gt;
&lt;li&gt;To: 받는 사람 이메일 주소&lt;/li&gt;
&lt;li&gt;Subject: Your Weekly YouTube Digest!&lt;/li&gt;
&lt;li&gt;Email Type: HTML&lt;/li&gt;
&lt;li&gt;Message: 표현식 모드로 변경 후 아래 내용 입력&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;js javascript&quot;&gt;&lt;code&gt;&amp;lt;h1&amp;gt;Your YT Weekly Digest&amp;lt;/h1&amp;gt;

{{
  $json.data.map(item =&amp;gt; `
    &amp;lt;div&amp;gt;
      &amp;lt;h2&amp;gt;${item.title}&amp;lt;/h2&amp;gt;
      Author: ${item.author}&amp;lt;br /&amp;gt;
      Date: ${DateTime.fromISO(item.pubDate).toRelative({ locale: &quot;ko&quot; })}&amp;lt;br /&amp;gt;
      Link: ${item.link}
    &amp;lt;/div&amp;gt;
    &amp;lt;hr /&amp;gt;
  `).join(&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;위 코드에서 &lt;code&gt;DateTime.fromISO(...).toRelative({ locale: &quot;ko&quot; })&lt;/code&gt; 부분은 영상 업로드 날짜를 3일 전, 5시간 전과 같이 읽기 편한 한국어 상대 시간으로 변환해준다. 자세한 내용은 &lt;a href=&quot;https://moment.github.io/luxon/api-docs/index.html#datetimetorelative&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Luxon 공식 문서&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;표현식 입력창 우측 하단의 편집기 [↖] 버튼을 누른 뒤, Result 영역의 HTML 탭을 선택하면 메일 본문이 실제로 어떻게 표시되는지 미리 확인할 수 있다.&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;1320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSbx7y/dJMb99TXj33/vbG750DDkCRiu4ACEUf7h0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSbx7y/dJMb99TXj33/vbG750DDkCRiu4ACEUf7h0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSbx7y/dJMb99TXj33/vbG750DDkCRiu4ACEUf7h0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSbx7y%2FdJMb99TXj33%2FvbG750DDkCRiu4ACEUf7h0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1320&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1320&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;1041&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqKP2J/dJMcabK38Hs/mMZ5LLUwibQ0vo8EAOgsY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqKP2J/dJMcabK38Hs/mMZ5LLUwibQ0vo8EAOgsY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqKP2J/dJMcabK38Hs/mMZ5LLUwibQ0vo8EAOgsY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqKP2J%2FdJMcabK38Hs%2FmMZ5LLUwibQ0vo8EAOgsY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1041&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1041&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>  Programming</category>
      <category>n8n</category>
      <category>RSS</category>
      <category>youtube</category>
      <category>노코드</category>
      <category>업무자동화</category>
      <category>워크플로우자동화</category>
      <category>유튜브RSS</category>
      <category>이메일자동화</category>
      <category>자동화툴</category>
      <category>콘텐츠모니터링</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1360</guid>
      <comments>https://romantech.net/1360#entry1360comment</comments>
      <pubDate>Mon, 18 May 2026 15:18:13 +0900</pubDate>
    </item>
    <item>
      <title>[n8n] 생일 알림 이메일 보내기</title>
      <link>https://romantech.net/1359</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  워크플로우 목표&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;구글 시트에서 생일 목록 조회&lt;/li&gt;
&lt;li&gt;오늘, 내일, 일주일 후 생일인 사람 필터링&lt;/li&gt;
&lt;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;&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;이름, 생일, 이메일 주소 컬럼을 포함한 구글 시트를 생성한다. 실습을 위해 3명의 생일을 각각 오늘, 내일, 일주일 후 날짜로 변경한다.&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: 29.1472%;&quot;&gt;&lt;b&gt;Name&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 29.1473%;&quot;&gt;&lt;b&gt;Birthdate&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.7054%;&quot;&gt;&lt;b&gt;Email&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.1472%;&quot;&gt;Emily Chen&lt;/td&gt;
&lt;td style=&quot;width: 29.1473%;&quot;&gt;05/05/1990&lt;/td&gt;
&lt;td style=&quot;width: 41.7054%;&quot;&gt;emily.chen@example.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.1472%;&quot;&gt;Michael Davis&lt;/td&gt;
&lt;td style=&quot;width: 29.1473%;&quot;&gt;05/06/1985&lt;/td&gt;
&lt;td style=&quot;width: 41.7054%;&quot;&gt;michael.d@example.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.1472%;&quot;&gt;Sarah Johnson&lt;/td&gt;
&lt;td style=&quot;width: 29.1473%;&quot;&gt;05/11/1992&lt;/td&gt;
&lt;td style=&quot;width: 41.7054%;&quot;&gt;sarah.j@example.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.1472%;&quot;&gt;David Lee&lt;/td&gt;
&lt;td style=&quot;width: 29.1473%;&quot;&gt;18/01/1988&lt;/td&gt;
&lt;td style=&quot;width: 41.7054%;&quot;&gt;david.l@example.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.1472%;&quot;&gt;Olivia Garcia&lt;/td&gt;
&lt;td style=&quot;width: 29.1473%;&quot;&gt;06/05/1995&lt;/td&gt;
&lt;td style=&quot;width: 41.7054%;&quot;&gt;olivia.g@example.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.1472%;&quot;&gt;James Wilson&lt;/td&gt;
&lt;td style=&quot;width: 29.1473%;&quot;&gt;01/04/1983&lt;/td&gt;
&lt;td style=&quot;width: 41.7054%;&quot;&gt;james.w@example.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.1472%;&quot;&gt;Sophia Miller&lt;/td&gt;
&lt;td style=&quot;width: 29.1473%;&quot;&gt;16/10/1991&lt;/td&gt;
&lt;td style=&quot;width: 41.7054%;&quot;&gt;sophia.m@example.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.1472%;&quot;&gt;Daniel Brown&lt;/td&gt;
&lt;td style=&quot;width: 29.1473%;&quot;&gt;12/09/1987&lt;/td&gt;
&lt;td style=&quot;width: 41.7054%;&quot;&gt;daniel.b@example.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.1472%;&quot;&gt;Isabella Jones&lt;/td&gt;
&lt;td style=&quot;width: 29.1473%;&quot;&gt;08/02/1993&lt;/td&gt;
&lt;td style=&quot;width: 41.7054%;&quot;&gt;isabella.j@example.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.1472%;&quot;&gt;Alexander White&lt;/td&gt;
&lt;td style=&quot;width: 29.1473%;&quot;&gt;12/05/1986&lt;/td&gt;
&lt;td style=&quot;width: 41.7054%;&quot;&gt;alexander.w@example.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.1472%;&quot;&gt;Mia Martinez&lt;/td&gt;
&lt;td style=&quot;width: 29.1473%;&quot;&gt;11/08/1994&lt;/td&gt;
&lt;td style=&quot;width: 41.7054%;&quot;&gt;mia.m@example.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.1472%;&quot;&gt;William Taylor&lt;/td&gt;
&lt;td style=&quot;width: 29.1473%;&quot;&gt;27/05/1989&lt;/td&gt;
&lt;td style=&quot;width: 41.7054%;&quot;&gt;william.t@example.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.1472%;&quot;&gt;Charlotte Hall&lt;/td&gt;
&lt;td style=&quot;width: 29.1473%;&quot;&gt;07/07/1996&lt;/td&gt;
&lt;td style=&quot;width: 41.7054%;&quot;&gt;charlotte.h@example.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.1472%;&quot;&gt;Ethan King&lt;/td&gt;
&lt;td style=&quot;width: 29.1473%;&quot;&gt;22/03/1984&lt;/td&gt;
&lt;td style=&quot;width: 41.7054%;&quot;&gt;ethan.k@example.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.1472%;&quot;&gt;Ava Lewis&lt;/td&gt;
&lt;td style=&quot;width: 29.1473%;&quot;&gt;16/11/1990&lt;/td&gt;
&lt;td style=&quot;width: 41.7054%;&quot;&gt;ava.l@example.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.1472%;&quot;&gt;Noah Clark&lt;/td&gt;
&lt;td style=&quot;width: 29.1473%;&quot;&gt;09/01/1982&lt;/td&gt;
&lt;td style=&quot;width: 41.7054%;&quot;&gt;noah.c@example.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.1472%;&quot;&gt;Sofia Hill&lt;/td&gt;
&lt;td style=&quot;width: 29.1473%;&quot;&gt;25/04/1997&lt;/td&gt;
&lt;td style=&quot;width: 41.7054%;&quot;&gt;sofia.h@example.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.1472%;&quot;&gt;Lucas Green&lt;/td&gt;
&lt;td style=&quot;width: 29.1473%;&quot;&gt;02/09/1981&lt;/td&gt;
&lt;td style=&quot;width: 41.7054%;&quot;&gt;lucas.g@example.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.1472%;&quot;&gt;Amelia Baker&lt;/td&gt;
&lt;td style=&quot;width: 29.1473%;&quot;&gt;19/06/1998&lt;/td&gt;
&lt;td style=&quot;width: 41.7054%;&quot;&gt;amelia.b@example.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.1472%;&quot;&gt;Ben Carter&lt;/td&gt;
&lt;td style=&quot;width: 29.1473%;&quot;&gt;10/10/1980&lt;/td&gt;
&lt;td style=&quot;width: 41.7054%;&quot;&gt;ben.c@example.com&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1894&quot; data-origin-height=&quot;1244&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNdqvH/dJMcabK3qwK/7cBXUntaAZBSXySpK5MJ2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNdqvH/dJMcabK3qwK/7cBXUntaAZBSXySpK5MJ2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNdqvH/dJMcabK3qwK/7cBXUntaAZBSXySpK5MJ2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNdqvH%2FdJMcabK3qwK%2F7cBXUntaAZBSXySpK5MJ2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1894&quot; height=&quot;1244&quot; data-origin-width=&quot;1894&quot; data-origin-height=&quot;1244&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;n&lt;/code&gt; &amp;gt; Google Sheets &amp;gt; Get row(s) in sheet 액션 노드를 추가한 뒤, 노드 설정창에서 생일 정보가 포함된 시트(Sheet)를 지정한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2300&quot; data-origin-height=&quot;1422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4ES6u/dJMcacDaLeA/w5eTdlxMsH7MK7IdqUlhk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4ES6u/dJMcacDaLeA/w5eTdlxMsH7MK7IdqUlhk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4ES6u/dJMcacDaLeA/w5eTdlxMsH7MK7IdqUlhk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4ES6u%2FdJMcacDaLeA%2Fw5eTdlxMsH7MK7IdqUlhk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2300&quot; height=&quot;1422&quot; data-origin-width=&quot;2300&quot; data-origin-height=&quot;1422&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;Resource (작업 영역): Sheet Within Document&lt;/li&gt;
&lt;li&gt;Operation (수행 작업): Get Row(s)&lt;/li&gt;
&lt;li&gt;Document (대상 파일): 생성한 문서 선택&lt;/li&gt;
&lt;li&gt;Sheet (시트 지정): 생일 정보가 포함된 시트 선택&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;Execute step 버튼을 클릭해서 워크플로우를 실행해 보면 구글 시트의 각 행(row)을 객체 형태로 불러오는 것을 확인할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;[
  {
    &quot;row_number&quot;: 2,
    &quot;name&quot;: &quot;Emily Chen&quot;,
    &quot;birthdate&quot;: &quot;05/10/1990&quot;,
    &quot;email&quot;: &quot;emily.chen@example.com&quot;
  },
  {
    &quot;row_number&quot;: 3,
    &quot;name&quot;: &quot;Michael Davis&quot;,
    &quot;birthdate&quot;: &quot;05/11/1985&quot;,
    &quot;email&quot;: &quot;michael.d@example.com&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;생일 날짜별 분기 처리 &amp;mdash; Switch 노드&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;Switch 노드는 입력 데이터 값이 특정 조건과 일치하는지 확인한 후, 조건별로 다른 경로로 분기시키는 노드다. 생일이 오늘인지, 내일인지, 일주일 후인지에 따라 다른 알림 메시지를 보내도록 나눌 수 있다.&lt;/p&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;n&lt;/code&gt; &amp;gt; Switch 검색 후 노드를 추가한다.&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;오늘(Today) 생일 분기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n8n은 날짜/시간을 편리하게 다룰 수 있도록 &lt;a href=&quot;https://docs.n8n.io/data/specific-data-types/luxon/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Luxon 라이브러리&lt;/a&gt;를 내장하고 있다. Luxon으로 날짜를 처리하려면 &lt;code&gt;05/10/1990&lt;/code&gt;과 같은 문자열을 Luxon의 &lt;code&gt;DateTime&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;05/10/1990&lt;/code&gt; 형식이지만, 오늘이 생일인지 확인할 때는 연도가 필요 없으므로 월/일만 추출하면 충분하다. Routing Rules 첫 번째 필드(비교할 입력값)에 아래 표현식을 입력하면 &lt;code&gt;05/10&lt;/code&gt; 형식으로 변환할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;js javascript&quot;&gt;&lt;code&gt;{{ DateTime.fromFormat($json.Birthdate, &quot;M/d/y&quot;).setZone(&quot;Asia/Seoul&quot;).toFormat('MM/dd') }}&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://moment.github.io/luxon/api-docs/index.html#datetimefromformat&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;fromFormat(text, format, options?)&lt;/a&gt;: 날짜 문자열을 DateTime 객체로 변환
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;첫 번째 인자: 파싱할 문자열 날짜. 예: &lt;code&gt;05/10/1990&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;두 번째 인자: 해당 문자열의 날짜 포맷. 예: &lt;code&gt;M/d/y&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://moment.github.io/luxon/api-docs/index.html#datetimesetzone&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;setZone(zone, options?)&lt;/a&gt;: 기준 타임존 설정. 타임존 값은 &lt;a href=&quot;https://en.wikipedia.org/wiki/List_of_tz_database_time_zones&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;TZ identifier&lt;/a&gt;를 사용한다.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://moment.github.io/luxon/api-docs/index.html#datetimetoformat&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;toFormat(format, options?)&lt;/a&gt;: DateTime 객체를 지정한 형식의 문자열로 변환. 인자에는 &lt;code&gt;yyyy&lt;/code&gt;(년), &lt;code&gt;MM&lt;/code&gt;(월), &lt;code&gt;dd&lt;/code&gt;(일) 같은 &lt;a href=&quot;https://moment.github.io/luxon/#/formatting?id=table-of-tokens&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;두 번째 필드의 비교 조건은 &lt;code&gt;is equal to&lt;/code&gt;(두 값이 일치)로 선택한다. 세 번째 필드 비교 대상값에는 현재 날짜를 첫 번째 필드와 동일한 날짜 포맷(&lt;code&gt;MM/dd&lt;/code&gt;)으로 변환하기 위해 아래 표현식을 입력한다. &lt;code&gt;$now&lt;/code&gt;는 현재를 나타내는 Luxon DateTime 객체이다.&lt;/p&gt;
&lt;pre class=&quot;js javascript&quot;&gt;&lt;code&gt;{{ $now.toFormat('MM/dd') }}&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;각 브랜치를 더 쉽게 구분하기 위해 Rename Output 옵션에 체크한 후 &lt;code&gt;today&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;1888&quot; data-origin-height=&quot;880&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mUugW/dJMcagldSmB/ZXWkSlROizNvhfOkqmGSOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mUugW/dJMcagldSmB/ZXWkSlROizNvhfOkqmGSOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mUugW/dJMcagldSmB/ZXWkSlROizNvhfOkqmGSOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmUugW%2FdJMcagldSmB%2FZXWkSlROizNvhfOkqmGSOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;880&quot; data-origin-width=&quot;1888&quot; data-origin-height=&quot;880&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;내일(Tomorrow) 생일 분기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째, 두 번째 필드는 오늘 생일 분기와 동일하게 설정하고, 세 번째 필드(비교 대상값)에는 &lt;a href=&quot;https://moment.github.io/luxon/api-docs/index.html#datetimeplus&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;plus(duration)&lt;/a&gt; 메서드를 사용해서 현재 날짜에 1일을 더해준다. &lt;code&gt;plus()&lt;/code&gt; 메서드 인자는 숫자(밀리초) 혹은 &lt;code&gt;years&lt;/code&gt;, &lt;code&gt;months&lt;/code&gt;, &lt;code&gt;weeks&lt;/code&gt; 처럼 기간을 나타내는 &lt;a href=&quot;https://moment.github.io/luxon/api-docs/index.html#duration&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Luxon Duration&lt;/a&gt; 형태로 입력할 수 있다. 예: &lt;code&gt;{ days: 1 }&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;js javascript&quot;&gt;&lt;code&gt;{{ $now.plus({days:1}).toFormat('MM/dd') }}&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;1888&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FsXR0/dJMcajvucju/yTU4TzYJgiNVOEwPuoezU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FsXR0/dJMcajvucju/yTU4TzYJgiNVOEwPuoezU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FsXR0/dJMcajvucju/yTU4TzYJgiNVOEwPuoezU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFsXR0%2FdJMcajvucju%2FyTU4TzYJgiNVOEwPuoezU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;748&quot; data-origin-width=&quot;1888&quot; data-origin-height=&quot;748&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;일주일 후(In One Week) 생일 분기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일주일 후 생일 분기도 위와 동일한 방식으로 설정하되, 세 번째 필드(비교 대상값)만 &lt;code&gt;plus()&lt;/code&gt; 메서드를 이용해서 일주일 뒤 날짜로 변경한다.&lt;/p&gt;
&lt;pre class=&quot;js javascript&quot;&gt;&lt;code&gt;{{ $now.plus({weeks:1}).toFormat('MM/dd') }}&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;1888&quot; data-origin-height=&quot;848&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/croTNK/dJMcagMlpQX/N5kLUucCfZImL77HHT9DHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/croTNK/dJMcagMlpQX/N5kLUucCfZImL77HHT9DHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/croTNK/dJMcagMlpQX/N5kLUucCfZImL77HHT9DHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcroTNK%2FdJMcagMlpQX%2FN5kLUucCfZImL77HHT9DHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;848&quot; data-origin-width=&quot;1888&quot; data-origin-height=&quot;848&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;Gmail 노드 추가&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;Gmail &amp;gt; Send a message 노드를 추가한 후 이전 노드의 데이터를 받아 생일 알림 메시지를 작성한다. 오늘, 내일, 일주일 후 분기로 나눠져 있으므로 Gmail 노드도 총 3개를 생성해야 한다.&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;997&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxybsN/dJMcadaUEGF/kkIVblfkM9k4DAA2Fd6KG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxybsN/dJMcadaUEGF/kkIVblfkM9k4DAA2Fd6KG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxybsN/dJMcadaUEGF/kkIVblfkM9k4DAA2Fd6KG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdxybsN%2FdJMcadaUEGF%2FkkIVblfkM9k4DAA2Fd6KG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;997&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;997&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;Subject 필드 입력 예시. &lt;code&gt;$json.Name&lt;/code&gt; 표현식으로 생일자 이름을 포함할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;txt ada&quot;&gt;&lt;code&gt;Today is {{ $json.Name }}'s Birthday.&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;Message(본문) 필드 입력 예시. &lt;code&gt;$json.Email&lt;/code&gt; 표현식으로 이메일을 포함할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;txt xquery&quot;&gt;&lt;code&gt;Hi!
Today is {{ $json.Name }}'s Birthday.
Here's the email by the way: {{ $json.Email }}&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;Gmail 노드를 모두 생성했다면 각 노드를 엣지로 연결해서 워크플로우를 완성한다. 구글 시트에서 가져온 20개 아이템이 Switch 노드로 전달되면, Switch 노드는 각 아이템을 순회하면서 생일 값과 조건을 비교한다. 오늘, 내일, 일주일 뒤 조건에 일치하는 아이템은 해당 조건 분기로 전달된 후 Gmail 노드를 통해 이메일을 발송한다. 만약 여러 아이템이 같은 조건 분기로 전달됐다면, Gmail 노드는 전달받은 아이템 수만큼 반복 실행되어 각 대상자에게 이메일을 발송한다.&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;1179&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oxQwn/dJMcaicknHt/wBcZtBEDaukjBnB01QkY00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oxQwn/dJMcaicknHt/wBcZtBEDaukjBnB01QkY00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oxQwn/dJMcaicknHt/wBcZtBEDaukjBnB01QkY00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoxQwn%2FdJMcaicknHt%2FwBcZtBEDaukjBnB01QkY00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1179&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1179&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>  Programming</category>
      <category>LUXON</category>
      <category>n8n</category>
      <category>n8n자동화</category>
      <category>생일알림</category>
      <category>업무자동화</category>
      <category>워크플로우</category>
      <category>워크플로우자동화</category>
      <category>이메일자동화</category>
      <category>자동화</category>
      <category>지메일자동화</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1359</guid>
      <comments>https://romantech.net/1359#entry1359comment</comments>
      <pubDate>Sun, 17 May 2026 13:53:33 +0900</pubDate>
    </item>
    <item>
      <title>[n8n] 웹사이트 모니터링 텔레그램 봇 만들기</title>
      <link>https://romantech.net/1358</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;워크플로우 목표&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;웹사이트 정상 작동 여부 확인&lt;/li&gt;
&lt;li&gt;사이트 장애 발생 시 텔레그램 봇으로 알림 전송&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;사이트 응답 확인 &amp;mdash; HTTP Request 노드 생성&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;1930&quot; data-origin-height=&quot;1418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uEF6X/dJMcad23Itn/na2PlKUABNyRY0WTh7Pbvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uEF6X/dJMcad23Itn/na2PlKUABNyRY0WTh7Pbvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uEF6X/dJMcad23Itn/na2PlKUABNyRY0WTh7Pbvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuEF6X%2FdJMcad23Itn%2Fna2PlKUABNyRY0WTh7Pbvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1930&quot; height=&quot;1418&quot; data-origin-width=&quot;1930&quot; data-origin-height=&quot;1418&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;Method: GET&lt;/li&gt;
&lt;li&gt;URL: 확인하고 싶은 사이트 주소 입력&lt;/li&gt;
&lt;li&gt;하단 Add Options &amp;gt; Response &amp;gt; 아래 두 항목 체크
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Include Response Header: 응답 헤더까지 결과에 포함&lt;/li&gt;
&lt;li&gt;Never Error: 요청 실패해도 워크플로우를 에러로 중단하지 않음 (에러 직접 처리할 때 사용)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;장애 여부 판단 &amp;mdash; If 노드 추가&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;사이트 정상 여부를 판단하는 If 노드를 추가한다. 응답 헤더의 statusCode가 &lt;code&gt;200&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;1930&quot; data-origin-height=&quot;978&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PhKbD/dJMcaipO1fH/WdSSkq9AlzhKRcUaQw8lQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PhKbD/dJMcaipO1fH/WdSSkq9AlzhKRcUaQw8lQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PhKbD/dJMcaipO1fH/WdSSkq9AlzhKRcUaQw8lQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPhKbD%2FdJMcaipO1fH%2FWdSSkq9AlzhKRcUaQw8lQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1930&quot; height=&quot;978&quot; data-origin-width=&quot;1930&quot; data-origin-height=&quot;978&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;사이트 장애 &amp;rarr; 텔레그램으로 메시지 보내기&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;Telegram &amp;gt; Send a text message 노드 추가 후 Access Token, Chat ID를 입력한다. Access Token은 &lt;a href=&quot;https://t.me/BotFather&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;@BotFather&lt;/a&gt;에서 봇을 만든 뒤 확인할 수 있고, Chat ID는 &lt;a href=&quot;https://t.me/userinfobot&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;@UserInfoBot&lt;/a&gt; 봇에서 확인할 수 있다. 하단 푸터 메시지(&lt;i&gt;This message was sent &amp;hellip; n8n&lt;/i&gt;)를 감추려면 Append n8n Attribution 옵션을 체크 해제한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1930&quot; data-origin-height=&quot;1318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V1y3s/dJMcagFzHVM/nCgVba9L3S25bHRX6UQEqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V1y3s/dJMcagFzHVM/nCgVba9L3S25bHRX6UQEqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V1y3s/dJMcagFzHVM/nCgVba9L3S25bHRX6UQEqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV1y3s%2FdJMcagFzHVM%2FnCgVba9L3S25bHRX6UQEqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1930&quot; height=&quot;1318&quot; data-origin-width=&quot;1930&quot; data-origin-height=&quot;1318&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;pre class=&quot;plaintext&quot;&gt;&lt;code&gt;  The website with URL {{ $('split_urls').item.json.url }} is DOWN!

Status Code: {{ $('get_website').item.json.statusCode }}

Fix it soon!&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;텔레그램은 보안/스팸 방지 정책 때문에 사용자가 먼저 봇(Bot)을 시작해야만 해당 사용자에게 메시지를 보낼 수 있다. 봇 채팅방에서 Start 버튼을 누르면 봇을 시작할 수 있다. 봇 시작 &amp;gt; HTTP Request에 틀린 URL 주소 입력 &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;1720&quot; data-origin-height=&quot;408&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tpGzq/dJMcaicjZ8m/VQDkzqOgg3os0TKfNrtSIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tpGzq/dJMcaicjZ8m/VQDkzqOgg3os0TKfNrtSIK/img.png&quot; data-alt=&quot;수동 트리거 실행 후 봇이 전송한 메시지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tpGzq/dJMcaicjZ8m/VQDkzqOgg3os0TKfNrtSIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtpGzq%2FdJMcaicjZ8m%2FVQDkzqOgg3os0TKfNrtSIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1720&quot; height=&quot;408&quot; data-origin-width=&quot;1720&quot; data-origin-height=&quot;408&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;여러 URL 확인하기&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;현재는 한 개의 URL에 대한 상태 체크만 할 수 있다. 여러 URL을 체크하기 위해 Edit Fields, Split Out 노드를 활용할 수 있다. Edit Fields는 워크플로우에서 사용할 데이터를 직접 추가/정리할 수 있는 노드이고, Split Out은 배열 형태의 데이터를 하나씩 분리해서 개별 아이템으로 만들어주는 노드다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 Edit Fields에서 만든 데이터가 아래와 같다면(1개 아이템)&amp;hellip;&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;urls&quot;: [
    &quot;https://example.com&quot;,
    &quot;https://google.com&quot;,
    &quot;https://naver.com&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;Split Out을 거친 후 URL이 하나씩 분리된다(여러 아이템).&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{ &quot;urls&quot;: &quot;https://example.com&quot; }
{ &quot;urls&quot;: &quot;https://google.com&quot; }
{ &quot;urls&quot;: &quot;https://naver.com&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;즉, Edit Fields로 여러 URL 목록을 만들고, Split Out을 통해 목록에 있는 URL을 하나씩 분리하여 HTTP Request가 개별적으로 처리하도록 만들 수 있다.&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;Edit Fields 노드 추가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Edit Fields 노드 추가 후, 데이터를 직접 구성하기 위해 Mode를 Manual Mapping으로 선택한다. 하단 설정에서 필드 이름은 &lt;code&gt;urls&lt;/code&gt;, 값 타입은 Array로 지정하고, 체크하고 싶은 URL 목록을 배열 형태로 입력한다.&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;1074&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/69LRO/dJMcadPwefe/cJX59oiUo4UnX9uB3lCJvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/69LRO/dJMcadPwefe/cJX59oiUo4UnX9uB3lCJvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/69LRO/dJMcadPwefe/cJX59oiUo4UnX9uB3lCJvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F69LRO%2FdJMcadPwefe%2FcJX59oiUo4UnX9uB3lCJvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1074&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1074&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL 입력 예시.&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;[&quot;https://example.com&quot;, &quot;https://romantech.net/ggg&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;그럼 아래와 같은 데이터가 생성된다(1개 아이템).&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;[
  {
    &quot;urls&quot;: [
      &quot;https://example.com&quot;,
      &quot;https://romantech.net/ggg&quot;
    ]
  }
]&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;Split Out 노드 추가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Split Out 노드를 추가한 후, Fields To Split Out에 분리할 배열 필드인 &lt;code&gt;urls&lt;/code&gt;를 입력한다. Destination Field Name 옵션에서 분리된 개별 값을 저장할 필드 이름을 지정할 수 있다. 단일 URL 값을 의미하도록 필드 이름을 &lt;code&gt;url&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;2300&quot; data-origin-height=&quot;1206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0maaV/dJMb99TWeAP/KmiIzy6pqPUthWUYv2dlr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0maaV/dJMb99TWeAP/KmiIzy6pqPUthWUYv2dlr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0maaV/dJMb99TWeAP/KmiIzy6pqPUthWUYv2dlr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0maaV%2FdJMb99TWeAP%2FKmiIzy6pqPUthWUYv2dlr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2300&quot; height=&quot;1206&quot; data-origin-width=&quot;2300&quot; data-origin-height=&quot;1206&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Split Out 노드를 거치면 기존 &lt;code&gt;urls: [...]&lt;/code&gt; 형태의 1개 아이템이 아래처럼 &lt;code&gt;url&lt;/code&gt; 필드를 가진 여러 개의 아이템으로 분리된 것을 확인할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;[
    { &quot;url&quot;: &quot;https://example.com&quot; }, 
    { &quot;url&quot;: &quot;https://romantech.net/ggg&quot; }
]&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;Trigger &amp;rarr; Edit Fields &amp;rarr; Split Out &amp;rarr; HTTP Request &amp;rarr; &amp;hellip; 순으로 노드를 연결한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2610&quot; data-origin-height=&quot;1452&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0rPkn/dJMcaayzF8z/LmXoYuHKlLZrUEdo7nkk0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0rPkn/dJMcaayzF8z/LmXoYuHKlLZrUEdo7nkk0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0rPkn/dJMcaayzF8z/LmXoYuHKlLZrUEdo7nkk0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0rPkn%2FdJMcaayzF8z%2FLmXoYuHKlLZrUEdo7nkk0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2610&quot; height=&quot;1452&quot; data-origin-width=&quot;2610&quot; data-origin-height=&quot;1452&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;Split Out 엣지를 보면 2 items라고 표시되어 있다. Edit Fields에 추가한 URL 2개가 Split Out을 거치면서 각각의 아이템으로 분리됐기 때문. &lt;b&gt;따라서 Split Out 다음에 연결된 노드는 아이템 개수만큼 총 2회 실행&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;1670&quot; data-origin-height=&quot;844&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEGV7W/dJMcahdnMF7/TKMpB9PAQha30C2ms3TBl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEGV7W/dJMcahdnMF7/TKMpB9PAQha30C2ms3TBl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEGV7W/dJMcahdnMF7/TKMpB9PAQha30C2ms3TBl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEGV7W%2FdJMcahdnMF7%2FTKMpB9PAQha30C2ms3TBl1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1670&quot; height=&quot;844&quot; data-origin-width=&quot;1670&quot; data-origin-height=&quot;844&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;n8n 대부분의 노드는 입력받은 아이템을 기준으로 실행되며, 전달된 아이템 개수만큼 작업을 반복 처리한다. 예를 들어 앞 단계에서 아이템 2개가 전달됐다면, 다음 노드는 보통 2개의 아이템을 각각 처리한다.&lt;/blockquote&gt;</description>
      <category>  Programming</category>
      <category>n8n</category>
      <category>n8n자동화</category>
      <category>telegrambot</category>
      <category>사이트모니터링</category>
      <category>업무자동화</category>
      <category>워크플로우자동화</category>
      <category>웹사이트모니터링</category>
      <category>장애알림</category>
      <category>텔레그램봇</category>
      <category>텔레그램알림</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1358</guid>
      <comments>https://romantech.net/1358#entry1358comment</comments>
      <pubDate>Sat, 16 May 2026 14:05:46 +0900</pubDate>
    </item>
    <item>
      <title>[n8n] 워크플로우 자동화 입문: 핵심 개념 + 기초 실습</title>
      <link>https://romantech.net/1357</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;n8n은 다양한 앱과 서비스를 연결하여 반복적인 작업을 처리하는 워크플로우 자동화 플랫폼이다. 코딩 없이 마우스 드래그로 노드(Node)를 연결하는 것만으로 데이터 수집, 알림 발송, 이메일 전송, API 호출 등을 손쉽게 처리할 수 있으며, 자바스크립트를 활용하면 복잡하고 고도화된 작업도 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 AI 시대에 n8n은 여러 서비스와 AI 모델을 이어주는 강력한 오케스트레이션 허브 역할을 한다. 외부에서 데이터를 가져와 AI로 요약&amp;middot;분류&amp;middot;생성한 뒤, 그 결과를 이메일&amp;middot;메신저&amp;middot;스프레드시트&amp;middot;DB 등으로 전달하는 일련의 과정을 하나의 워크플로우로 구성할 수 있다. 예를 들어, 고객 문의를 AI로 분석하여 슬랙으로 자동 라우팅하거나 매일 아침 특정 뉴스를 크롤링해서 AI 요약본을 노션에 쌓는 등의 작업을 수행할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Make, Zapier 같은 경쟁 도구와 달리 n8n은 셀프 호스팅(Self-hosting)을 지원한다는 장점도 있다. 도커(Docker)만 다룰 줄 안다면 시놀로지 NAS나 개인 서버에 설치해서 실행 횟수 제한 없이 서버 비용만으로 운영할 수 있다. 셀프 호스팅은 외부 클라우드를 거치지 않고 내부 서버에서만 처리되므로 보안과 데이터 주권 측면에서도 유리하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;트리거 종류 3가지&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;Manual Trigger: 개발 중 테스트/수동 실행이 필요할 때 사용&lt;/li&gt;
&lt;li&gt;Schedule Trigger: 매일/매주/매시간처럼 정기적인 실행이 필요할 때&lt;/li&gt;
&lt;li&gt;Webhook: 외부 앱이나 서비스가 HTTP 요청을 보냈을 때 (이벤트)&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;1392&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TiWZP/dJMcabEaoMf/w9ewlLkogWqr3p71UAjdXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TiWZP/dJMcabEaoMf/w9ewlLkogWqr3p71UAjdXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TiWZP/dJMcabEaoMf/w9ewlLkogWqr3p71UAjdXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTiWZP%2FdJMcabEaoMf%2Fw9ewlLkogWqr3p71UAjdXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1392&quot; height=&quot;640&quot; data-origin-width=&quot;1392&quot; data-origin-height=&quot;640&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;트리거(Trigger): 워크플로우 시작점&lt;/li&gt;
&lt;li&gt;노드(Node): 작업을 수행하는 기본 단위&lt;/li&gt;
&lt;li&gt;엣지(Edge): 노드와 노드를 연결하는 선&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://zenquotes.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;ZenQuotes&lt;/a&gt;에서 명언 조회 &amp;rarr; OpenAI API로 번역 &amp;rarr; 이메일로 전달&lt;/p&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://app.n8n.cloud/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;n8n cloud&lt;/a&gt; 계정을 만들고 워크플로우를 생성한다. n8n cloud는 n8n에서 직접 제공하는 호스팅 서비스로, 브라우저에서 바로 워크플로우를 만들고 실행할 수 있다. 회원가입 후 14일 동안 Pro 플랜 기능을 무료로 체험할 수 있고, 최대 1000회 워크플로우 실행을 제공한다. 실습용으로는 충분한 수준이다.&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;HTTP Request 노드 생성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우측 노드 패널(단축키 &lt;code&gt;N&lt;/code&gt;) &amp;gt; HTTP Request 검색 후 추가.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;1138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PXPYW/dJMcaaFhZnM/NjmsGDom8kJPTaYgyrusgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PXPYW/dJMcaaFhZnM/NjmsGDom8kJPTaYgyrusgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PXPYW/dJMcaaFhZnM/NjmsGDom8kJPTaYgyrusgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPXPYW%2FdJMcaaFhZnM%2FNjmsGDom8kJPTaYgyrusgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1874&quot; height=&quot;1138&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;1138&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP Request 노드를 열어서 Method는 GET을 선택하고 URL에는 아래 엔드포인트를 입력한다.&lt;/p&gt;
&lt;pre class=&quot;plaintext&quot; data-ke-language=&quot;plaintext&quot;&gt;&lt;code&gt;https://zenquotes.io/api/random&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;OpenAI &amp;gt; Message a model 노드 추가&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;좌측 Input 노드에서 Execute previous nodes 버튼 클릭하면 이전 노드 데이터를 조회할 수 있다.&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1870&quot; data-origin-height=&quot;1562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwlkI5/dJMcaaZxX5X/GdgzBADkF5xmrp0Kih8A8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwlkI5/dJMcaaZxX5X/GdgzBADkF5xmrp0Kih8A8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwlkI5/dJMcaaZxX5X/GdgzBADkF5xmrp0Kih8A8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwlkI5%2FdJMcaaZxX5X%2FGdgzBADkF5xmrp0Kih8A8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1870&quot; height=&quot;1562&quot; data-origin-width=&quot;1870&quot; data-origin-height=&quot;1562&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;① Credential: OpenAI 추가 혹은 n8n에서 제공하는 무료 OpenAI API credits 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;② Resource: Text&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;③ Operation: Message a Model&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;④ Model: &lt;code&gt;gpt-4o-mini&lt;/code&gt; 같은 저렴한 모델 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⑤ Messages:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;￭ Type: Text&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;￭ Role: User&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;￭ Prompt:&lt;/p&gt;
&lt;pre class=&quot;plaintext&quot; data-ke-language=&quot;plaintext&quot;&gt;&lt;code&gt;Please translate this quote, but not the author to Korean. Include the author name, even though you don't need to translate it.

Quote: {{ $json.q }}
Author: {{ $json.a }}

Reply only with the translation no chatter or extra words.&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;Input 패널의 데이터를 직접 드래그하거나 &lt;code&gt;{{ $json.q }}&lt;/code&gt; 중괄호를 입력해서 필요한 속성을 직접 참조할 수 있다. &lt;code&gt;$json&lt;/code&gt; 변수는 &lt;b&gt;이전 노드에서 전달받아 현재 처리 중인 아이템의 JSON 데이터&lt;/b&gt;를 가리킨다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n8n에서 &lt;code&gt;{{ expression }}&lt;/code&gt; 중괄호 안쪽은 자바스크립트 표현식이다. &lt;code&gt;{{&lt;/code&gt; 를 입력하고 한 칸 띄우거나 중괄호 표현식 안에서 &lt;code&gt;$&lt;/code&gt;달러 기호를 입력하면 자동완성 제안이 표시된다.&lt;/p&gt;
&lt;pre id=&quot;code_1778510211785&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{{ new Date() }} // Date: 2026-04-26T09:03:19.840-04:00&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;중괄호 표현식을 사용하려면 파라미터 필드를 Expression 모드로 전환해야 한다. Fixed는 이름 그대로 고정된 값을 넣는 모드로, 정적인 값을 다룰 때 사용한다.&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;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HAN6L/dJMcacXmzlt/vkilvAxkctuDfkHixnjIk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HAN6L/dJMcacXmzlt/vkilvAxkctuDfkHixnjIk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HAN6L/dJMcacXmzlt/vkilvAxkctuDfkHixnjIk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHAN6L%2FdJMcacXmzlt%2FvkilvAxkctuDfkHixnjIk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1020&quot; height=&quot;360&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;360&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;트리거 왼쪽 Execute Workflow 버튼을 클릭해서 워크플로우를 수동으로 실행해 본다. Manual Trigger 실행은 Executions 크레딧이 차감되지 않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2032&quot; data-origin-height=&quot;584&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zzxbE/dJMb99TSgTc/PKzHFUnpr6xz9CANAc7oZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zzxbE/dJMb99TSgTc/PKzHFUnpr6xz9CANAc7oZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zzxbE/dJMb99TSgTc/PKzHFUnpr6xz9CANAc7oZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzzxbE%2FdJMb99TSgTc%2FPKzHFUnpr6xz9CANAc7oZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2032&quot; height=&quot;584&quot; data-origin-width=&quot;2032&quot; data-origin-height=&quot;584&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;OpenAI 노드 더블클릭 후 우측 OUTPUT 창에 번역 결과 나오면 성공.&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;1098&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KDbqK/dJMcag6xKQm/Zc05yk50VdnYkp8cQYCBtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KDbqK/dJMcag6xKQm/Zc05yk50VdnYkp8cQYCBtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KDbqK/dJMcag6xKQm/Zc05yk50VdnYkp8cQYCBtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKDbqK%2FdJMcag6xKQm%2FZc05yk50VdnYkp8cQYCBtk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1098&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1098&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;Gmail &amp;gt; Send a message 추가.&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;963&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p6uwC/dJMcag6xKQs/m2S93G6bmkf5uElrsAMY40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p6uwC/dJMcag6xKQs/m2S93G6bmkf5uElrsAMY40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p6uwC/dJMcag6xKQs/m2S93G6bmkf5uElrsAMY40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp6uwC%2FdJMcag6xKQs%2Fm2S93G6bmkf5uElrsAMY40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;963&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;963&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;Credential 추가 후 필드 내용 입력. 좌측 INPUT 창의 &lt;code&gt;text&lt;/code&gt; 속성을 Message 필드로 드래그하면 해당 값이 자동으로 추가된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1744&quot; data-origin-height=&quot;1187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdmh59/dJMcagk9LZj/Ps1nO8ePwNMBqkwbngygh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdmh59/dJMcagk9LZj/Ps1nO8ePwNMBqkwbngygh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdmh59/dJMcagk9LZj/Ps1nO8ePwNMBqkwbngygh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcdmh59%2FdJMcagk9LZj%2FPs1nO8ePwNMBqkwbngygh1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1744&quot; height=&quot;1187&quot; data-origin-width=&quot;1744&quot; data-origin-height=&quot;1187&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;Execute step 눌러서 테스트. 아래처럼 메일 도착하면 성공.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1192&quot; data-origin-height=&quot;510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tM1y4/dJMcagk9LZs/9MVxpkjMT5fR2Z7okMZHqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tM1y4/dJMcagk9LZs/9MVxpkjMT5fR2Z7okMZHqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tM1y4/dJMcagk9LZs/9MVxpkjMT5fR2Z7okMZHqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtM1y4%2FdJMcagk9LZs%2F9MVxpkjMT5fR2Z7okMZHqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1192&quot; height=&quot;510&quot; data-origin-width=&quot;1192&quot; data-origin-height=&quot;510&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 option &amp;gt; Append n8n Attribution에 체크해제하면 This email was sent &amp;hellip; 푸터가 포함되지 않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;824&quot; data-origin-height=&quot;430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmlrg1/dJMcaiDhdaB/QldsJxskeduLLKng75dTU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmlrg1/dJMcaiDhdaB/QldsJxskeduLLKng75dTU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmlrg1/dJMcaiDhdaB/QldsJxskeduLLKng75dTU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbmlrg1%2FdJMcaiDhdaB%2FQldsJxskeduLLKng75dTU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;824&quot; height=&quot;430&quot; data-origin-width=&quot;824&quot; data-origin-height=&quot;430&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;Schedule Trigger 추가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노드 패널(단축키 &lt;code&gt;N&lt;/code&gt;) &amp;gt; &lt;code&gt;schedule&lt;/code&gt; 검색 &amp;gt; Schedule Trigger 추가.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1620&quot; data-origin-height=&quot;916&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0tzXT/dJMcaipLdoD/JTS7sxIuz2Dr0liQae5fo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0tzXT/dJMcaipLdoD/JTS7sxIuz2Dr0liQae5fo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0tzXT/dJMcaipLdoD/JTS7sxIuz2Dr0liQae5fo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0tzXT%2FdJMcaipLdoD%2FJTS7sxIuz2Dr0liQae5fo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1620&quot; height=&quot;916&quot; data-origin-width=&quot;1620&quot; data-origin-height=&quot;916&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 수동 트리거의 엣지를 제거하고, 스케줄 트리거 엣지 연결.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1980&quot; data-origin-height=&quot;614&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/toOxS/dJMcaiiYy4A/sPX1ZHMXQlEgIF3L22w89k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/toOxS/dJMcaiiYy4A/sPX1ZHMXQlEgIF3L22w89k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/toOxS/dJMcaiiYy4A/sPX1ZHMXQlEgIF3L22w89k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtoOxS%2FdJMcaiiYy4A%2FsPX1ZHMXQlEgIF3L22w89k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1980&quot; height=&quot;614&quot; data-origin-width=&quot;1980&quot; data-origin-height=&quot;614&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;스케줄 트리거 시간 설정. 실습용으로는 5분 간격 정도가 적당하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1182&quot; data-origin-height=&quot;874&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/epGHTW/dJMcaiiYy4G/3MWrbkfcYRciDaVie5Sxl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/epGHTW/dJMcaiiYy4G/3MWrbkfcYRciDaVie5Sxl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/epGHTW/dJMcaiiYy4G/3MWrbkfcYRciDaVie5Sxl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FepGHTW%2FdJMcaiiYy4G%2F3MWrbkfcYRciDaVie5Sxl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1182&quot; height=&quot;874&quot; data-origin-width=&quot;1182&quot; data-origin-height=&quot;874&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;Publish&lt;/code&gt; 버튼을 클릭하면 스케줄이 활성화된다. 스케줄 트리거를 실행할 때마다 Executions 크레딧이 차감되므로 주의하자. 스케줄을 비활성화하려면 &lt;code&gt;Unpublish&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;876&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uSp1z/dJMcajvpBnR/I9nA4EC3mYxpsn5r4WH5Vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uSp1z/dJMcajvpBnR/I9nA4EC3mYxpsn5r4WH5Vk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uSp1z/dJMcajvpBnR/I9nA4EC3mYxpsn5r4WH5Vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuSp1z%2FdJMcajvpBnR%2FI9nA4EC3mYxpsn5r4WH5Vk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;876&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;876&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Executions 탭에서 이전 실행 내역을 확인할 수 있고, 각 노드를 더블클릭하면 데이터 등 세부 정보를 볼 수 있다.&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;967&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GL0Bs/dJMcafT7jrY/kbGLXChFZzWYIZ6pg92TW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GL0Bs/dJMcafT7jrY/kbGLXChFZzWYIZ6pg92TW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GL0Bs/dJMcafT7jrY/kbGLXChFZzWYIZ6pg92TW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGL0Bs%2FdJMcafT7jrY%2FkbGLXChFZzWYIZ6pg92TW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;967&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;967&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;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;유용한 단축키&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;￭ 이름 변경: 노드 선택 &amp;gt; &lt;code&gt;Space&lt;/code&gt;&lt;br /&gt;￭ 노드 종류 변경: 노드 선택 &amp;gt; &lt;code&gt;R&lt;/code&gt;&lt;br /&gt;￭ 노드 복제: &lt;code&gt;Cmd&lt;/code&gt; + &lt;code&gt;D&lt;/code&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;rarr; 오른쪽으로 실행된다. 하나의 노드에서 여러 브랜치로 나뉘는 경우 위 &amp;rarr; 아래 브랜치 순서로 실행된다. 아래 이미지처럼 노드를 구성했을 때 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;2048&quot; data-origin-height=&quot;856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bojHnz/dJMcagrVNe4/oPVDA3VRRqImd02tEIciak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bojHnz/dJMcagrVNe4/oPVDA3VRRqImd02tEIciak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bojHnz/dJMcagrVNe4/oPVDA3VRRqImd02tEIciak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbojHnz%2FdJMcagrVNe4%2FoPVDA3VRRqImd02tEIciak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;856&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;856&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;조건&amp;middot;분기&amp;middot;루프 워크플로우 실습&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;b&gt;워크플로우 흐름&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;유머 API에서 유머 받아오기 (&lt;a href=&quot;https://icanhazdadjoke.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;ICanHazDadJoke&lt;/a&gt; 이용)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;GET 성공(200 OK): 2번 진행&lt;/li&gt;
&lt;li&gt;GET 실패: 30초 대기 후 다시 시도&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AI한테 조회한 유머가 재밌는지 여부 평가
&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;재미없으면: 5초 대기 &amp;gt; 유머 다시 조회 &amp;gt; AI가 재밌다고 평가할 때까지 반복&lt;/li&gt;
&lt;li&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;h3 data-ke-size=&quot;size23&quot;&gt;HTTP Request 노드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요청 정보 입력 후 Execute step 버튼을 눌러서 유머 API가 정상적으로 조회되는지 확인한다. 응답 데이터의 &lt;code&gt;status&lt;/code&gt; 값이 &lt;code&gt;200&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;1465&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bq9KAQ/dJMcaayvCUP/yVsoPRKKGPGwygNicFuToK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bq9KAQ/dJMcaayvCUP/yVsoPRKKGPGwygNicFuToK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bq9KAQ/dJMcaayvCUP/yVsoPRKKGPGwygNicFuToK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbq9KAQ%2FdJMcaayvCUP%2FyVsoPRKKGPGwygNicFuToK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1465&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1465&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;Method: &lt;code&gt;GET&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;URL: &lt;code&gt;https://icanhazdadjoke.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Send Headers: &lt;code&gt;체크&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Headers
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Name: &lt;code&gt;Accept&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Value: &lt;code&gt;application/json&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;h3 data-ke-size=&quot;size23&quot;&gt;If 노드 추가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP Request 노드 뒤에 If 노드를 추가해서 API 조회 결과가 정상인지 확인한다. &lt;code&gt;json.status&lt;/code&gt; 값이 &lt;code&gt;200&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;1471&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NNrrD/dJMcajvpBq3/PGpAXkzVWD64gEkWzQ01s1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NNrrD/dJMcajvpBq3/PGpAXkzVWD64gEkWzQ01s1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NNrrD/dJMcajvpBq3/PGpAXkzVWD64gEkWzQ01s1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNNrrD%2FdJMcajvpBq3%2FPGpAXkzVWD64gEkWzQ01s1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1471&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1471&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;API 조회 실패 분기 &amp;mdash; Wait 노드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Wait 노드를 추가해서 API 조회에 실패했을 때 30초 대기 후 다시 시도하도록 설정한다.&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;1471&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xXehp/dJMcahj7sv3/71V3w4sLNFiE0gQ9OcTNLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xXehp/dJMcahj7sv3/71V3w4sLNFiE0gQ9OcTNLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xXehp/dJMcahj7sv3/71V3w4sLNFiE0gQ9OcTNLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxXehp%2FdJMcahj7sv3%2F71V3w4sLNFiE0gQ9OcTNLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1471&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1471&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;그다음 Wait 노드의 엣지를 드래그해서 HTTP Request에 연결한다.&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;996&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMiJ0m/dJMcajvpBrd/Bywk6pIEQpJ5e1bV5mbXTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMiJ0m/dJMcajvpBrd/Bywk6pIEQpJ5e1bV5mbXTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMiJ0m/dJMcajvpBrd/Bywk6pIEQpJ5e1bV5mbXTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMiJ0m%2FdJMcajvpBrd%2FBywk6pIEQpJ5e1bV5mbXTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;996&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;996&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;API 조회 성공 분기 &amp;mdash; OpenAI 노드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유머 API 조회에 성공했다면 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;If 노드의 성공 분기를 OpenAI 노드에 연결하고, API 응답의 &lt;code&gt;$json.joke&lt;/code&gt; 값을 입력값으로 전달한다. AI가 유머를 평가한 뒤 재밌으면 &lt;code&gt;is_funny&lt;/code&gt;, 재미없으면 &lt;code&gt;is_not_funny&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;1471&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d02iis/dJMcajvpBrk/k8lNhTFLCGst8XRDKSdQa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d02iis/dJMcajvpBrk/k8lNhTFLCGst8XRDKSdQa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d02iis/dJMcajvpBrk/k8lNhTFLCGst8XRDKSdQa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd02iis%2FdJMcajvpBrk%2Fk8lNhTFLCGst8XRDKSdQa1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1471&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1471&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;code&gt;&amp;lt;joke&amp;gt;...&amp;lt;/joke&amp;gt;&lt;/code&gt; 같은 태그로 감싸면, AI가 지시문과 실제 데이터를 명확하게 구분할 수 있다. 이처럼 태그를 활용해 데이터의 범위와 역할을 구조화하는 기법을 XML 태그 기반 프롬프팅이라고 부른다.&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;plaintext&quot;&gt;&lt;code&gt;Tell me if this joke is funny: 

&amp;lt;joke&amp;gt;
{{ $json.joke }}
&amp;lt;/joke&amp;gt;

Reply ONLY with `is_funny` or `is_not_funny`. Anything else is NOT allowed.

Be extremely critical. You're hard to please.&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;AI 응답 오류 처리 &amp;mdash; If 노드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI가 잘못된 응답을 반환했을 경우를 대비해 If 노드를 추가한다. 응답값이 &lt;code&gt;is_funny&lt;/code&gt;, &lt;code&gt;is_not_funny&lt;/code&gt; 둘 다 아닌 경우 오류로 판단하고, 다시 OpenAI 노드로 돌아가서 유머를 재평가하도록 설정한다.&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;930&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTEJVX/dJMcaiXxEaZ/ytsOCOItEpJfbKuUFwBAS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTEJVX/dJMcaiXxEaZ/ytsOCOItEpJfbKuUFwBAS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTEJVX/dJMcaiXxEaZ/ytsOCOItEpJfbKuUFwBAS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTEJVX%2FdJMcaiXxEaZ%2FytsOCOItEpJfbKuUFwBAS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;930&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;930&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;여기서 true 분기는 &lt;code&gt;is_funny&lt;/code&gt;, &lt;code&gt;is_not_funny&lt;/code&gt; 둘 중 어느 값도 아닌 오류 발생 상황을 의미한다. If 노드의 true 분기 엣지를 드래그해서 OpenAI로 연결한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1956&quot; data-origin-height=&quot;822&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M8jTT/dJMcagepP8W/16ZeF1PCkeOBzEPtUS6vO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M8jTT/dJMcagepP8W/16ZeF1PCkeOBzEPtUS6vO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M8jTT/dJMcagepP8W/16ZeF1PCkeOBzEPtUS6vO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM8jTT%2FdJMcagepP8W%2F16ZeF1PCkeOBzEPtUS6vO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1956&quot; height=&quot;822&quot; data-origin-width=&quot;1956&quot; data-origin-height=&quot;822&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;재밌는 유머인지 판단 &amp;mdash; If 노드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI가 유머를 평가하는 과정에서 오류가 발생하지 않았다면, AI 응답값을 기준으로 재밌는 유머인지 판단해야 한다. 응답값이 &lt;code&gt;is_funny&lt;/code&gt; 인지 확인하는 If 노드를 추가한다.&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;1442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dVFnVA/dJMcajhRl3I/MLNNp8BSuDmASkiM2kjYlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dVFnVA/dJMcajhRl3I/MLNNp8BSuDmASkiM2kjYlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dVFnVA/dJMcajhRl3I/MLNNp8BSuDmASkiM2kjYlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdVFnVA%2FdJMcajhRl3I%2FMLNNp8BSuDmASkiM2kjYlK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1442&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1442&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;이전 If 노드의 false 분기(허용된 응답값) 엣지를 드래그해서 연결한다.&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;920&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDLQIA/dJMcabxnku2/66YDpAgKfCAFswkpQhk14k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDLQIA/dJMcabxnku2/66YDpAgKfCAFswkpQhk14k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDLQIA/dJMcabxnku2/66YDpAgKfCAFswkpQhk14k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDLQIA%2FdJMcabxnku2%2F66YDpAgKfCAFswkpQhk14k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;920&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;920&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;AI가 재밌다고 평가하면(true 분기) 이메일을 보내기 위해 Gmail &amp;gt; Send a message 노드를 추가한다.&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;1478&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6lfO5/dJMcabxnkvf/oHoZLipI6ow3P3Kmce0J9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6lfO5/dJMcabxnkvf/oHoZLipI6ow3P3Kmce0J9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6lfO5/dJMcabxnkvf/oHoZLipI6ow3P3Kmce0J9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6lfO5%2FdJMcabxnkvf%2FoHoZLipI6ow3P3Kmce0J9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1478&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1478&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;이전 If 노드의 true 분기(재밌는 유머) 엣지를 드래그해서 연결한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1906&quot; data-origin-height=&quot;608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cw4Ute/dJMcabxnkvi/Rv5WkyAJGkIXfM30fRGBxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cw4Ute/dJMcabxnkvi/Rv5WkyAJGkIXfM30fRGBxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cw4Ute/dJMcabxnkvi/Rv5WkyAJGkIXfM30fRGBxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcw4Ute%2FdJMcabxnkvi%2FRv5WkyAJGkIXfM30fRGBxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1906&quot; height=&quot;608&quot; data-origin-width=&quot;1906&quot; data-origin-height=&quot;608&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;AI가 유머를 재미없다고 평가했다면, false 분기를 통해 Wait 노드로 이동하도록 설정한다. Wait 노드는 과도한 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;648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGP5CY/dJMcabxnkvo/T7CC1CD1BEBARjfPmLYwaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGP5CY/dJMcabxnkvo/T7CC1CD1BEBARjfPmLYwaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGP5CY/dJMcabxnkvo/T7CC1CD1BEBARjfPmLYwaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGP5CY%2FdJMcabxnkvo%2FT7CC1CD1BEBARjfPmLYwaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;648&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;648&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;대기가 끝나면 새로운 유머를 조회하기 위해 Wait 노드를 HTTP Request 노드에 연결한다.&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;836&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmOGNr/dJMcabYtZUh/CObVYs4bX1qbFXwpCbOVv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmOGNr/dJMcabYtZUh/CObVYs4bX1qbFXwpCbOVv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmOGNr/dJMcabYtZUh/CObVYs4bX1qbFXwpCbOVv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmOGNr%2FdJMcabYtZUh%2FCObVYs4bX1qbFXwpCbOVv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;836&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;836&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적인 워크플로우 구성을 완료했다. Execute workflow 버튼을 클릭해서 워크플로우를 실행해 보자. n8n은 워크플로우가 실행되는 동안 각 노드의 상태와 데이터 흐름을 실시간으로 표시해 주기 때문에 실행 순서와 결과를 쉽게 파악할 수 있다.&lt;/p&gt;</description>
      <category>  Programming</category>
      <category>ai자동화</category>
      <category>automation</category>
      <category>n8n</category>
      <category>노코드</category>
      <category>업무자동화</category>
      <category>워크플로우</category>
      <category>워크플로우자동화</category>
      <category>자동화</category>
      <category>자동화도구</category>
      <category>자동화툴</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1357</guid>
      <comments>https://romantech.net/1357#entry1357comment</comments>
      <pubDate>Tue, 12 May 2026 00:27:29 +0900</pubDate>
    </item>
    <item>
      <title>[macOS] 예쁘고 직관적인 라디얼 스타일 앱 전환기 - Orbit</title>
      <link>https://romantech.net/1356</link>
      <description>&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;1309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QuzgH/dJMcaaE6exF/5G0f3Tv28UA3HrY5eAGZJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QuzgH/dJMcaaE6exF/5G0f3Tv28UA3HrY5eAGZJ1/img.png&quot; data-alt=&quot;Orbit 앱 전환기 via 공식 문서&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QuzgH/dJMcaaE6exF/5G0f3Tv28UA3HrY5eAGZJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQuzgH%2FdJMcaaE6exF%2F5G0f3Tv28UA3HrY5eAGZJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1309&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1309&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Orbit 앱 전환기 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;macOS 사용자라면 하루에도 수십 번씩 Cmd + Tab 단축키를 이용해 앱을 전환한다. 하지만 가로로 길게 늘어놓은 기본 앱 전환기(App Switcher)는 익숙하면서도 어딘지 모르게 심심하다. Orbit은 이런 앱 전환을 조금 더 직관적으로 바꿔주는 macOS 맥 생산성 유틸리티다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보조키(기본값 Option)를 길게 누르면 마우스 커서 주변에 현재 실행 중인 앱들이 라디얼(원형) 형태로 펼쳐지고, 탭이나 방향키로 원하는 앱을 선택하여 전환할 수 있다. 단순 앱 전환뿐 아니라 앱 종료, 파일 삭제, AirDrop 전송 같은 부가 기능도 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Orbit은 기본적으로 무료이고 소스 코드도 GitHub에 공개되어 있다. 다만 일반적인 오픈소스와 달리, 소스 사용&amp;middot;수정&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;&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;추후 Homebrew 지원 예정&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 class=&quot;clutterFree_existingDuplicate cf_div_theme_dark&quot; title=&quot;Orbit 릴리즈 페이지&quot; href=&quot;https://github.com/yuzeguitarist/Orbit/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Orbit 릴리즈 페이지&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a class=&quot;&quot; title=&quot;Orbit GitHub 페이지&quot; href=&quot;https://github.com/yuzeguitarist/Orbit&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;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;기본값으로 설정된 보조키 Option을 길게 누르면 앱 전환기가 나타난다. 이후 Tab, 방향키, 숫자키 또는 앱 이름의 첫 글자 알파벳으로 원하는 앱을 선택한 뒤, 보조키에서 손을 떼는 순간 해당 앱으로 전환된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2002&quot; data-origin-height=&quot;1232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/db6A3i/dJMcahc78f0/jgQIsOihCkM8RibzZNb6S0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/db6A3i/dJMcahc78f0/jgQIsOihCkM8RibzZNb6S0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/db6A3i/dJMcahc78f0/jgQIsOihCkM8RibzZNb6S0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdb6A3i%2FdJMcahc78f0%2FjgQIsOihCkM8RibzZNb6S0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2002&quot; height=&quot;1232&quot; data-origin-width=&quot;2002&quot; data-origin-height=&quot;1232&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;보조키는 Orbit 설정에서 [트리거 키] 옵션에서 변경할 수 있다. [Cmd + Tab 바로가기 사용]에 체크하면 Cmd + Tab을 눌렀을 때도 앱 전환기가 나타난다. 이 외에도 카드 크기와 재질(리퀴드 글래스 등), 전환기 표시 위치, 링 펼침 속도 등 취향에 맞게 세부 옵션을 조정할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;1260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIsNVe/dJMcadBIASE/iOxEhN8zZowcX5FYPKyEOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIsNVe/dJMcadBIASE/iOxEhN8zZowcX5FYPKyEOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIsNVe/dJMcadBIASE/iOxEhN8zZowcX5FYPKyEOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIsNVe%2FdJMcadBIASE%2FiOxEhN8zZowcX5FYPKyEOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1260&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;1260&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;Orbit 앱 전환기에서 특정 앱을 링 중앙으로 드래그하면 블랙홀(?) 모양의 아이콘이 나타나고, 드래그를 놓는 순간 앱이 종료된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2002&quot; data-origin-height=&quot;1232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XKSWR/dJMcabDZotP/ROAKCzCAomTIvpiAsZOM1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XKSWR/dJMcabDZotP/ROAKCzCAomTIvpiAsZOM1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XKSWR/dJMcabDZotP/ROAKCzCAomTIvpiAsZOM1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXKSWR%2FdJMcabDZotP%2FROAKCzCAomTIvpiAsZOM1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2002&quot; height=&quot;1232&quot; data-origin-width=&quot;2002&quot; data-origin-height=&quot;1232&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;파일을 Orbit 링 중앙으로 드래그하면 Drop to Share 문구가 나타난다. 이 상태에서 드래그를 놓으면 AirDrop 공유 화면이 열리고, 주변 기기로 파일을 전송할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2002&quot; data-origin-height=&quot;1220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5hEHh/dJMcai37u0p/vDcRWKzONkvseIGvj1KOy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5hEHh/dJMcai37u0p/vDcRWKzONkvseIGvj1KOy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5hEHh/dJMcai37u0p/vDcRWKzONkvseIGvj1KOy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5hEHh%2FdJMcai37u0p%2FvDcRWKzONkvseIGvj1KOy1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2002&quot; height=&quot;1220&quot; data-origin-width=&quot;2002&quot; data-origin-height=&quot;1220&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;파일/폴더를 Orbit 링 중앙으로 드래그하고 잠시 기다리면 블랙홀 아이콘이 나타난다. 이 상태에서 드래그를 놓으면 해당 파일이 삭제된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2002&quot; data-origin-height=&quot;1220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xQOXv/dJMcageeLux/vwKe8PnnzcA7O62As4vbK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xQOXv/dJMcageeLux/vwKe8PnnzcA7O62As4vbK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xQOXv/dJMcageeLux/vwKe8PnnzcA7O62As4vbK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxQOXv%2FdJMcageeLux%2FvwKe8PnnzcA7O62As4vbK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2002&quot; height=&quot;1220&quot; data-origin-width=&quot;2002&quot; data-origin-height=&quot;1220&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에서 Option + 방향키로 단어 단위 커서 이동을 자주 사용한다면 Orbit의 기본 보조키와 충돌할 수 있다. 이때는 보조키를 비활성화하고 Cmd + Tab으로 Orbit을 호출하는 방식을 추천한다.&lt;/p&gt;
&lt;p data-ke-size=&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; 카드 재질 옵션에서 시스템, 화이트, 블랙, 리퀴드 글래스 네 가지 카드 스타일을 선택할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2002&quot; data-origin-height=&quot;1232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3agY6/dJMcaffmlJu/TmuVm3PXCrKWakXY6Upzj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3agY6/dJMcaffmlJu/TmuVm3PXCrKWakXY6Upzj0/img.png&quot; data-alt=&quot;화이트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3agY6/dJMcaffmlJu/TmuVm3PXCrKWakXY6Upzj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3agY6%2FdJMcaffmlJu%2FTmuVm3PXCrKWakXY6Upzj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2002&quot; height=&quot;1232&quot; data-origin-width=&quot;2002&quot; data-origin-height=&quot;1232&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;2002&quot; data-origin-height=&quot;1232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qmNjS/dJMcad2OOkM/tydW9fEesdTmVUPv8RXBH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qmNjS/dJMcad2OOkM/tydW9fEesdTmVUPv8RXBH0/img.png&quot; data-alt=&quot;블랙&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qmNjS/dJMcad2OOkM/tydW9fEesdTmVUPv8RXBH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqmNjS%2FdJMcad2OOkM%2FtydW9fEesdTmVUPv8RXBH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2002&quot; height=&quot;1232&quot; data-origin-width=&quot;2002&quot; data-origin-height=&quot;1232&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;2002&quot; data-origin-height=&quot;1232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A7iLG/dJMcahjWcym/9EkSGyOewaCJZtXyeUgmIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A7iLG/dJMcahjWcym/9EkSGyOewaCJZtXyeUgmIk/img.png&quot; data-alt=&quot;리퀴드 글래스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A7iLG/dJMcahjWcym/9EkSGyOewaCJZtXyeUgmIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA7iLG%2FdJMcahjWcym%2F9EkSGyOewaCJZtXyeUgmIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2002&quot; height=&quot;1232&quot; data-origin-width=&quot;2002&quot; data-origin-height=&quot;1232&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;리퀴드 글래스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>⌚️ Productivity</category>
      <category>AppSwitcher</category>
      <category>macos앱</category>
      <category>Orbit</category>
      <category>맥북앱</category>
      <category>맥북유틸리티</category>
      <category>맥북추천앱</category>
      <category>맥앱추천</category>
      <category>맥유틸리티</category>
      <category>생산성앱</category>
      <category>앱전환기</category>
      <author>ColorFilter</author>
      <guid isPermaLink="true">https://romantech.net/1356</guid>
      <comments>https://romantech.net/1356#entry1356comment</comments>
      <pubDate>Sun, 26 Apr 2026 14:35:48 +0900</pubDate>
    </item>
    <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; 동작과 동일하다. 셸 스크립트나 구형 환경에서는 &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>
  </channel>
</rss>