<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>seohyun han</title>
    <link>https://feelfreetothink.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sat, 27 Jun 2026 22:50:49 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>sian han</managingEditor>
    <image>
      <title>seohyun han</title>
      <url>https://tistory1.daumcdn.net/tistory/5197054/attach/da65f164faed48b5a617a5b86de032cb</url>
      <link>https://feelfreetothink.tistory.com</link>
    </image>
    <item>
      <title>[네트워크] idwwt.com으로 DNS 동작 따라가기</title>
      <link>https://feelfreetothink.tistory.com/271</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;글을 쓸 일이 생겼습니다. 개발자를 위한 글쓰기 플랫폼 &lt;a href=&quot;https://rog.idwwt.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;rog.idwwt.com&lt;/a&gt;에 접속해야겠죠. 주소창에 입력하고 엔터를 칩니다.&lt;br /&gt;&lt;br /&gt;이때 컴퓨터 입장에서는 할 일이 있습니다. rog.idwwt.com 이라는 이름만으로는 어디로 가야 할지 모릅니다. 컴퓨터끼리 통신할 때는 결국 IP 주소가 필요합니다. 그러면 rog.idwwt.com 이 어느 IP인지를 먼저 알아내야 합니다.&lt;br /&gt;&lt;br /&gt;이&amp;nbsp;&quot;이름&amp;nbsp;&amp;rarr;&amp;nbsp;IP&quot;를&amp;nbsp;처리하는&amp;nbsp;전&amp;nbsp;세계적인&amp;nbsp;체계가&amp;nbsp;DNS(Domain&amp;nbsp;Name&amp;nbsp;System)입니다.&amp;nbsp;그리고&amp;nbsp;그&amp;nbsp;체계&amp;nbsp;안에서&amp;nbsp;실제로&amp;nbsp;&quot;제가&amp;nbsp;알고&amp;nbsp;있습니다&quot;라고&amp;nbsp;답해주는&amp;nbsp;서버가&amp;nbsp;네임서버입니다.&lt;br /&gt;&lt;br /&gt;네임서버는&amp;nbsp;역할에&amp;nbsp;따라&amp;nbsp;세&amp;nbsp;종류로&amp;nbsp;나뉩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;루트 서버&lt;/b&gt; &amp;mdash; 가장 상위입니다. .com은 저 TLD 서버가 관리해처럼 TLD 서버의 위치만 알려줍니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;TLD&amp;nbsp;서버&lt;/b&gt;&amp;nbsp;&amp;mdash;&amp;nbsp;.com,&amp;nbsp;.kr&amp;nbsp;같은&amp;nbsp;최상위&amp;nbsp;도메인&amp;nbsp;단위로&amp;nbsp;있습니다.&amp;nbsp;그&amp;nbsp;도메인은&amp;nbsp;저&amp;nbsp;권한&amp;nbsp;서버가&amp;nbsp;관리해라고&amp;nbsp;다음&amp;nbsp;단계를&amp;nbsp;안내합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;권한&amp;nbsp;서버&amp;nbsp;&lt;/b&gt;&amp;mdash; 특정 도메인의 진짜 답을 들고 있는 서버입니다. idwwt.com의 경우 Cloudflare가 여기에 해당합니다. A 레코드, CNAME 같은 실제 레코드가 여기 등록되어 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루트와&amp;nbsp;TLD는&amp;nbsp;&quot;저쪽으로&amp;nbsp;가보세요&quot;만&amp;nbsp;하고,&amp;nbsp;권한&amp;nbsp;서버에서&amp;nbsp;조회가&amp;nbsp;끝납니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;&lt;b&gt;IP를&amp;nbsp;찾는&amp;nbsp;순서&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rog.idwwt.com에 접속하려 합니다. 그러면 컴퓨터는 우선 내 안에서 먼저 해결하는 것을 시도합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;첫&amp;nbsp;번째,&lt;/b&gt;&lt;/span&gt;&amp;nbsp;/etc/hosts를&amp;nbsp;봅니다.&amp;nbsp;내가&amp;nbsp;직접&amp;nbsp;도메인과&amp;nbsp;IP를&amp;nbsp;써넣을&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;파일입니다.&amp;nbsp;127.0.0.1은&amp;nbsp;&quot;내&amp;nbsp;컴퓨터&amp;nbsp;자신&quot;을&amp;nbsp;가리키는&amp;nbsp;IP이고,&amp;nbsp;로컬에서&amp;nbsp;서버를&amp;nbsp;띄우고&amp;nbsp;localhost:3000으로&amp;nbsp;접속할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;게&amp;nbsp;이&amp;nbsp;줄&amp;nbsp;덕분입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1782196852496&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1       localhost
255.255.255.255 broadcasthost
::1             localhost&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;예를&amp;nbsp;들어&amp;nbsp;여기에&amp;nbsp;1.1.1.1&amp;nbsp;idwwt.com을&amp;nbsp;추가하면,&amp;nbsp;idwwt.com에&amp;nbsp;접속할&amp;nbsp;때&amp;nbsp;DNS&amp;nbsp;조회&amp;nbsp;없이&amp;nbsp;무조건&amp;nbsp;1.1.1.1로&amp;nbsp;가게&amp;nbsp;됩니다.&lt;br /&gt;&lt;br /&gt;여기 없으면 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;두 번째&lt;/b&gt;&lt;/span&gt;, 로컬 캐시를 봅니다. 한 번 찾아온 답은 버리지 않습니다. 일정 시간 동안 기억해뒀다가 같은 도메인이 오면 바로 꺼내씁니다. 단, 영원히 남아 있지는 않습니다. 각 레코드에는 TTL(Time to Live)이라는 유효기간이 붙어 있고, 그 시간이 지나면 캐시에서 사라집니다.&lt;/p&gt;
&lt;pre id=&quot;code_1782196900437&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;➜  dscacheutil -q host -a name rog.idwwt.com
name: rog.idwwt.com
ip_address: 116.45.183.36&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;116.45.183.36&lt;/b&gt; 이 지금 rog.idwwt.com 에 연결된 실제 서버 IP입니다. 캐시에 이미 들어 있다는 건, 이전에 한 번 이 도메인에 접속한 적이 있어서 리졸버가 찾아온 답이 저장되어 있다는 뜻입니다.&lt;br /&gt;&lt;br /&gt;여기도 없으면 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;세 번째&lt;/b&gt;&lt;/span&gt;, 바깥으로 나갑니다. /etc/resolv.conf에 지정된 외부 DNS 서버로 요청을 보내는 겁니다.&lt;br /&gt;&lt;br /&gt;조회&amp;nbsp;순서를&amp;nbsp;정리하면&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;1.&amp;nbsp;/etc/hosts&amp;nbsp;&amp;mdash;&amp;nbsp;캐시보다&amp;nbsp;우선,&amp;nbsp;DNS&amp;nbsp;자체를&amp;nbsp;건너뜁니다.&lt;/li&gt;
&lt;li&gt;2.&amp;nbsp;로컬&amp;nbsp;캐시&lt;/li&gt;
&lt;li&gt;3. /etc/resolv.conf에 지정된 외부 DNS&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;/etc/resolv.conf&lt;/b&gt; 에는 현재 KT DNS 서버 주소가 적혀 있습니다. 리졸버 주소를 지정하는 파일입니다. 여기 적힌 서버로 DNS 질의가 나갑니다. 비어 있으면 어디에 물어야 할지 모르니까 조회가 안 됩니다.&lt;br /&gt;&lt;br /&gt;이&amp;nbsp;값은&amp;nbsp;어떤&amp;nbsp;네트워크에&amp;nbsp;연결하느냐에&amp;nbsp;따라&amp;nbsp;달라집니다.&amp;nbsp;공유기에&amp;nbsp;연결하면,&amp;nbsp;공유기가&amp;nbsp;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;DHCP로&amp;nbsp;IP를&amp;nbsp;배정&lt;/b&gt;&lt;/span&gt;해주면서&amp;nbsp;DNS&amp;nbsp;서버&amp;nbsp;주소도&amp;nbsp;함께&amp;nbsp;알려줍니다.&amp;nbsp;그&amp;nbsp;값이&amp;nbsp;/etc/resolv.conf에&amp;nbsp;자동으로&amp;nbsp;적히는&amp;nbsp;겁니다.&amp;nbsp;KT&amp;nbsp;회선의&amp;nbsp;공유기라면&amp;nbsp;KT&amp;nbsp;DNS를,&amp;nbsp;SK&amp;nbsp;회선이라면&amp;nbsp;SK&amp;nbsp;DNS를&amp;nbsp;알려주는&amp;nbsp;식입니다.&lt;br /&gt;&lt;br /&gt;그렇지만&amp;nbsp;macOS&amp;nbsp;네트워크&amp;nbsp;설정에서&amp;nbsp;DNS를&amp;nbsp;수동으로&amp;nbsp;지정하면&amp;nbsp;DHCP가&amp;nbsp;알려주는&amp;nbsp;값을&amp;nbsp;무시합니다.&amp;nbsp;공유기가&amp;nbsp;KT&amp;nbsp;DNS를&amp;nbsp;쓰라고&amp;nbsp;알려줘도,&amp;nbsp;이미&amp;nbsp;지정해놨으니&amp;nbsp;무시하는&amp;nbsp;것입니다.&lt;br /&gt;&lt;br /&gt;만약 수동 지정을 하는데 8.8.8.7처 럼 오타를 내면 DNS 조회가 안 됩니다. 8.8.8.7은 존재하지 않기 때문에 응답이 없고, 그러면 idwwt.com의 IP를 아무도 알려주지 못하니까 접속이 안 됩니다. 이 경우에는 IP 주소를 직접 치면 됩니다. 브라우저에 116.45.183.36을 직접 입력하면 DNS 조회 없이 바로 연결됩니다. DNS는 이름을 IP로 바꿔주는 역할만 하기 때문에, IP를 이미 알고 있으면 DNS가 없어도 상관없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;DHCP(Dynamic&amp;nbsp;Host&amp;nbsp;Configuration&amp;nbsp;Protocol)&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DHCP 는 네트워크에 연결한 기기에 자동으로 설정값을 배정해주는 프로토콜입니다. DHCP가 배정해주는 것은 IP 주소, 서브넷 마스크, 게이트웨이, DNS 서버입니다. /etc/resolv.conf에 자동으로 값이 적히는 이유는, Wi-Fi 연결 시 DHCP가 알려준 값이 자동으로 들어간 것입니다.&lt;br /&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;&lt;b&gt;리졸버&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/etc/resolv.conf 에 지정된 외부 DNS 서버, 즉 바깥으로 나갔을 때 도달하는 곳이 리졸버(Recursive Resolver)입니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;8.8.8.8&lt;/b&gt;(Google),&amp;nbsp;&lt;b&gt;1.1.1.1&lt;/b&gt;(Cloudflare),&amp;nbsp;아까&amp;nbsp;본&amp;nbsp;&lt;b&gt;203.248.252.2&lt;/b&gt;(KT)&amp;nbsp;같은&amp;nbsp;것들이&amp;nbsp;전부&amp;nbsp;리졸버입니다.&amp;nbsp;운영&amp;nbsp;주체가&amp;nbsp;다를&amp;nbsp;뿐&amp;nbsp;역할은&amp;nbsp;동일합니다.&amp;nbsp;내&amp;nbsp;컴퓨터&amp;nbsp;대신&amp;nbsp;루트&amp;nbsp;서버부터&amp;nbsp;권한&amp;nbsp;서버까지&amp;nbsp;순서대로&amp;nbsp;찾아다니며&amp;nbsp;최종&amp;nbsp;답을&amp;nbsp;가져오는&amp;nbsp;서버입니다.&lt;br /&gt;&lt;br /&gt;내가 &quot;이 도메인 IP가 뭐야?&quot; 라고 한 번만 물어보면, 리졸버가 나 대신 전 과정을 돌아다니며 최종 답을 통째로 가져옵니다. 이걸 &lt;b&gt;재귀 조회&lt;/b&gt;(recursive query)라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조회&amp;nbsp;경로는&amp;nbsp;이렇습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1782197059615&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;루트 서버 &amp;rarr; TLD 서버(.com 담당) &amp;rarr; 권한 서버(idwwt.com 담당) &amp;rarr; 진짜 IP&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;여기서 루트 서버, TLD 서버, 권한 서버 &amp;mdash; 이 세 가지가 전부 네임서버(Name Server)입니다. 역할이 달라서 이름이 다를 뿐, 본질은 같습니다. &quot;내가 아는 범위에서 답해주거나, 모르면 다음 담당자를 알려주는 서버&quot;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;네임서버라는&amp;nbsp;단어가&amp;nbsp;두&amp;nbsp;가지&amp;nbsp;맥락에서&amp;nbsp;쓰입니다.&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;하나는 DNS 계층 구조를 설명할 때입니다. 루트 서버, TLD 서버, 권한 서버 &amp;mdash; 이 셋을 통칭해서 네임서버라고 부릅니다.&lt;/li&gt;
&lt;li&gt;다른 하나는 &quot;어떤 DNS 서비스를 쓰냐&quot;를 말할 때입니다. &quot;네임서버를 Cloudflare로 바꿨다&quot;는 말은, 그 중 권한 서버 역할을 Cloudflare 에 맡겼다는 뜻입니다. 루트 서버나 TLD 서버는 공공 인프라라 우리가 선택할 수 있는 영역이 아닙니다.&lt;/li&gt;
&lt;li&gt;같은 단어인데 앞에서는 계층 전체를 가리키고, 뒤에서는 권한 서버 하나만 가리킵니다. 문맥으로 구분해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;루트&amp;nbsp;서버&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DNS&amp;nbsp;계층의&amp;nbsp;맨&amp;nbsp;꼭대기입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루트 서버가 아는 건 딱 하나입니다. .com은 어느 TLD 서버가 담당하는지, .kr은 어느 TLD 서버가 담당하는지. 그 이상은 모릅니다. idwwt.com의 IP가 뭔지는 전혀 관심이 없습니다. 그냥 &quot;.com 관련이면 저 TLD 서버한테 물어봐&quot; 라고만 합니다.&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;b&gt;TLD&amp;nbsp;서버&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루트&amp;nbsp;서버&amp;nbsp;다음&amp;nbsp;단계입니다.&amp;nbsp;&lt;b&gt;TLD(Top-Level&amp;nbsp;Domain)&lt;/b&gt;는&amp;nbsp;도메인&amp;nbsp;맨&amp;nbsp;뒤&amp;nbsp;조각,&amp;nbsp;.com,&amp;nbsp;.net,&amp;nbsp;.kr,&amp;nbsp;.io&amp;nbsp;같은&amp;nbsp;것들입니다.&amp;nbsp;TLD&amp;nbsp;서버는&amp;nbsp;그&amp;nbsp;TLD에&amp;nbsp;속한&amp;nbsp;도메인들이&amp;nbsp;어느&amp;nbsp;권한&amp;nbsp;서버를&amp;nbsp;쓰는지&amp;nbsp;알고&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.com TLD 서버를 예로 들면, 세상의 모든 .com 도메인이 어느 권한 서버에 등록돼 있는지 목록을 갖고 있습니다. 리졸버가 &quot;idwwt.com 어디야?&quot;라고 물으면, TLD 서버는 &quot;idwwt.com은 Cloudflare가 관리해&quot;라고 NS 레코드로 알려주고 끝냅니다. 최종 IP는 여기서도 나오지 않습니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;권한&amp;nbsp;서버(Authoritative&amp;nbsp;Server)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 진짜 답이 나옵니다. 특정 도메인의 실제 레코드(A, CNAME, MX 등)를 직접 들고 있는 서버입니다. idwwt.com이라면 Cloudflare가 권한 서버 역할을 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;리졸버가&amp;nbsp;&quot;idwwt.com의&amp;nbsp;IP가&amp;nbsp;뭐야?&quot;라고&amp;nbsp;물으면,&amp;nbsp;권한&amp;nbsp;서버는&amp;nbsp;&quot;116.45.183.36이야&quot;라고&amp;nbsp;A&amp;nbsp;레코드를&amp;nbsp;돌려줍니다.&amp;nbsp;추측이나&amp;nbsp;위임이&amp;nbsp;아니라&amp;nbsp;실제&amp;nbsp;등록된&amp;nbsp;값&amp;nbsp;그대로입니다.&amp;nbsp;도메인을&amp;nbsp;구입한&amp;nbsp;뒤&amp;nbsp;Cloudflare&amp;nbsp;같은&amp;nbsp;서비스에서&amp;nbsp;레코드를&amp;nbsp;설정하는&amp;nbsp;게&amp;nbsp;바로&amp;nbsp;이&amp;nbsp;권한&amp;nbsp;서버에&amp;nbsp;데이터를&amp;nbsp;쓰는&amp;nbsp;행위입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;각&amp;nbsp;단계가&amp;nbsp;직접&amp;nbsp;최종&amp;nbsp;답을&amp;nbsp;주는&amp;nbsp;게&amp;nbsp;아니라&amp;nbsp;&quot;다음엔&amp;nbsp;저쪽으로&amp;nbsp;가보세요&quot;라고&amp;nbsp;길만&amp;nbsp;알려줍니다.&amp;nbsp;이걸&amp;nbsp;&lt;b&gt;위임(delegation)&lt;/b&gt;이라고&amp;nbsp;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;그리고&amp;nbsp;이&amp;nbsp;&quot;어느&amp;nbsp;네임서버에게&amp;nbsp;가라&quot;는&amp;nbsp;이정표가&amp;nbsp;바로&amp;nbsp;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;NS&amp;nbsp;레코드&lt;/b&gt;&lt;/span&gt;입니다.&amp;nbsp;A나&amp;nbsp;CNAME처럼&amp;nbsp;도메인을&amp;nbsp;목적지로&amp;nbsp;연결하는&amp;nbsp;게&amp;nbsp;아니라,&amp;nbsp;이&amp;nbsp;도메인의&amp;nbsp;관리를&amp;nbsp;누가&amp;nbsp;맡고&amp;nbsp;있는지를&amp;nbsp;가리키는&amp;nbsp;레코드입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;idwwt.com의&amp;nbsp;NS&amp;nbsp;레코드가&amp;nbsp;Cloudflare를&amp;nbsp;가리키고&amp;nbsp;있기&amp;nbsp;때문에,&amp;nbsp;리졸버가&amp;nbsp;TLD&amp;nbsp;서버에&amp;nbsp;물어봤을&amp;nbsp;때&amp;nbsp;&quot;Cloudflare한테&amp;nbsp;가봐&quot;라는&amp;nbsp;답을&amp;nbsp;받을&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;NS&amp;nbsp;레코드는&amp;nbsp;루트&amp;nbsp;서버,&amp;nbsp;TLD&amp;nbsp;서버,&amp;nbsp;권한&amp;nbsp;서버&amp;nbsp;모두&amp;nbsp;갖고&amp;nbsp;있습니다.&lt;/b&gt;&lt;/i&gt; 역할은&amp;nbsp;조금&amp;nbsp;다릅니다.&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;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;b&gt;서버&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;b&gt;NS&amp;nbsp;레코드&amp;nbsp;예시&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;b&gt;의미&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;루트&amp;nbsp;서버&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;.com&amp;nbsp;NS&amp;nbsp;a.gtld-servers.net&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&quot;`.com`은&amp;nbsp;저&amp;nbsp;TLD&amp;nbsp;서버가&amp;nbsp;담당해&quot;&amp;nbsp;(위임)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;TLD&amp;nbsp;서버&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;idwwt.com&amp;nbsp;NS&amp;nbsp;toby.ns.cloudflare.com&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&quot;`idwwt.com`은&amp;nbsp;저&amp;nbsp;권한&amp;nbsp;서버가&amp;nbsp;담당해&quot;&amp;nbsp;(위임)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;권한&amp;nbsp;서버&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;idwwt.com&amp;nbsp;NS&amp;nbsp;toby.ns.cloudflare.com&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&quot;이&amp;nbsp;존의&amp;nbsp;담당&amp;nbsp;서버가&amp;nbsp;나야&quot;&amp;nbsp;(자기&amp;nbsp;선언)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루트&amp;nbsp;서버와&amp;nbsp;TLD&amp;nbsp;서버의&amp;nbsp;NS&amp;nbsp;레코드는&amp;nbsp;&quot;다음엔&amp;nbsp;저쪽으로&quot;라는&amp;nbsp;위임&amp;nbsp;이정표이고,&amp;nbsp;권한&amp;nbsp;서버의&amp;nbsp;NS&amp;nbsp;레코드는&amp;nbsp;&quot;이&amp;nbsp;도메인의&amp;nbsp;담당이&amp;nbsp;나야&quot;라는&amp;nbsp;선언입니다.&amp;nbsp;같은&amp;nbsp;레코드&amp;nbsp;타입이지만&amp;nbsp;누가&amp;nbsp;들고&amp;nbsp;있느냐에&amp;nbsp;따라&amp;nbsp;역할이&amp;nbsp;달라집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;참고로 리졸버가 루트, TLD, 권한 서버를 순서대로 거치는 건 맞지만, 체인처럼 넘어가는 게 아닙니다. 리졸버가 매번 직접 질의합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1782197564062&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;리졸버 &amp;rarr; 루트 서버     &quot;`.com` TLD 서버 주소 알려줘&quot;
리졸버 &amp;larr; 루트 서버     &quot;여기야: a.gtld-servers.net&quot;

리졸버 &amp;rarr; TLD 서버     &quot;`idwwt.com` 권한 서버 주소 알려줘&quot;
리졸버 &amp;larr; TLD 서버     &quot;여기야: toby.ns.cloudflare.com&quot;

리졸버 &amp;rarr; 권한 서버    &quot;`idwwt.com` IP 알려줘&quot;
리졸버 &amp;larr; 권한 서버    &quot;116.45.183.36&quot;

리졸버 &amp;rarr; 내 컴퓨터    최종 답 전달&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;루트&amp;nbsp;서버가&amp;nbsp;TLD&amp;nbsp;서버로&amp;nbsp;직접&amp;nbsp;넘기는&amp;nbsp;게&amp;nbsp;아닙니다.&amp;nbsp;루트&amp;nbsp;서버는&amp;nbsp;리졸버한테&amp;nbsp;TLD&amp;nbsp;서버&amp;nbsp;주소를&amp;nbsp;알려주고&amp;nbsp;끝냅니다.&amp;nbsp;리졸버가&amp;nbsp;그&amp;nbsp;주소를&amp;nbsp;들고&amp;nbsp;TLD&amp;nbsp;서버로&amp;nbsp;새로&amp;nbsp;질의하는&amp;nbsp;겁니다.&amp;nbsp;매번&amp;nbsp;리졸버가&amp;nbsp;출발점입니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;레코드&amp;nbsp;타입&amp;nbsp;&amp;mdash;&amp;nbsp;A와&amp;nbsp;CNAME&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cloudflare 같은 네임서버 안에는 DNS 관리 영역이 있습니다. 거기에 레코드를 등록하는 겁니다. idwwt.com 은 카페24에서 샀지만 네임서버는 Cloudflare로 옮겼습니다. CNAME이나 A 레코드를 거기서 관리하고 있습니다.&lt;br /&gt;&lt;br /&gt;레코드&amp;nbsp;타입&amp;nbsp;중&amp;nbsp;일단&amp;nbsp;두&amp;nbsp;개만&amp;nbsp;알면&amp;nbsp;됩니다.&amp;nbsp;A랑&amp;nbsp;CNAME.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;A&amp;nbsp;레코드&lt;/b&gt;는&amp;nbsp;도메인을&amp;nbsp;IP&amp;nbsp;주소로&amp;nbsp;직접&amp;nbsp;연결합니다.&amp;nbsp;무조건&amp;nbsp;숫자,&amp;nbsp;IP&amp;nbsp;주소로만&amp;nbsp;등록할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;CNAME은 도메인을 다른 도메인으로 연결합니다. 문자열로 등록하는 겁니다. 문자열끼리 매핑을 하는 타입이 CNAME입니다.&lt;br /&gt;&lt;br /&gt;권한&amp;nbsp;서버는&amp;nbsp;어디를&amp;nbsp;쓰느냐에&amp;nbsp;따라&amp;nbsp;지원하는&amp;nbsp;기능이&amp;nbsp;달라집니다.&amp;nbsp;도메인을&amp;nbsp;산&amp;nbsp;곳(카페24,&amp;nbsp;가비아&amp;nbsp;등)에서&amp;nbsp;기본으로&amp;nbsp;제공하는&amp;nbsp;DNS를&amp;nbsp;그대로&amp;nbsp;쓸&amp;nbsp;수도&amp;nbsp;있고,&amp;nbsp;Route&amp;nbsp;53이나&amp;nbsp;Cloudflare&amp;nbsp;같은&amp;nbsp;전문&amp;nbsp;DNS로&amp;nbsp;옮길&amp;nbsp;수도&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;레지스트라&amp;nbsp;내장&amp;nbsp;DNS&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레지스트라 내장 DNS(카페24, 가비아 등)는 도메인을 샀을 때 기본으로 딸려오는 겁니다. A, CNAME, MX 정도 기본 레코드는 되는데, 그 이상을 기대하기 어렵습니다. 와일드카드 안 되고, 레코드 타입도 제한적이고, TTL 최솟값도 높아서 설정 바꿔도 반영이 느립니다. 관리 UI도 단순합니다. 간단한 개인 사이트 수준이면 충분하지만, 뭔가 특이한 설정이 필요하면 막히는 경우가 생깁니다.&lt;br /&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;size18&quot;&gt;&lt;b&gt;전문&amp;nbsp;DNS&amp;nbsp;(Route&amp;nbsp;53,&amp;nbsp;Cloudflare&amp;nbsp;등)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전문 DNS(Route 53, Cloudflare 등)는 DNS가 본업이라 지원 범위가 넓습니다. 와일드카드, SRV, CAA 같은 레코드도 되고, Apex 도메인에 CNAME 못 쓰는 제약을 우회하는 기능도 있습니다. TTL을 거의 0에 가깝게 낮출 수 있어서 변경 사항이 빠르게 반영됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;&lt;b&gt;CNAME이&amp;nbsp;필요한&amp;nbsp;이유&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브도메인을 여러 개 만들었습니다. 홈서버 IP가 바뀌면 연결된 모든 서브도메인을 일일이 수정해야 합니다. 수백 개가 되면 수백 개를 전부. 그래서 서브도메인은 CNAME으로, 루트 도메인은 A 레코드로 등록합니다. IP가 바뀌어도 idwwt.com A 레코드 하나만 수정하면 나머지가 다 따라옵니다. 변수화를 하는 겁니다.&lt;br /&gt;&lt;br /&gt;한&amp;nbsp;가지&amp;nbsp;주의할&amp;nbsp;점이&amp;nbsp;있습니다.&amp;nbsp;idwwt.com&amp;nbsp;같은&amp;nbsp;루트&amp;nbsp;도메인(apex&amp;nbsp;domain)&amp;nbsp;자체에는&amp;nbsp;CNAME을&amp;nbsp;쓸&amp;nbsp;수&amp;nbsp;없습니다.&amp;nbsp;DNS&amp;nbsp;표준&amp;nbsp;제약입니다.&amp;nbsp;CNAME은&amp;nbsp;반드시&amp;nbsp;서브도메인에만&amp;nbsp;씁니다.&lt;br /&gt;&lt;br /&gt;rog.idwwt.com 에 접속하면 &amp;rarr; idwwt.com으로 가봐 &amp;rarr; idwwt.com은 116.45.183.36이네 &amp;rarr; 연결. 중간에 하나 거쳐서 치환으로 되게끔 하는 겁니다. IP가&amp;nbsp;바뀌어도&amp;nbsp;`idwwt.com`&amp;nbsp;A&amp;nbsp;레코드&amp;nbsp;하나만&amp;nbsp;수정하면&amp;nbsp;나머지가&amp;nbsp;다&amp;nbsp;따라옵니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&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;br /&gt;&lt;b&gt;실제 레코드로 읽어보면&lt;/b&gt;&lt;/h3&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;br /&gt;&lt;b&gt;idwwt.com&amp;nbsp;&amp;mdash;&amp;nbsp;카페24&amp;nbsp;+&amp;nbsp;Cloudflare&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카페24 도메인 관리 화면을 보면 아래와 같습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;207&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3jmp1/dJMcabLvBGN/d5xjgQIZSlx2Ps0oNysBr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3jmp1/dJMcabLvBGN/d5xjgQIZSlx2Ps0oNysBr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3jmp1/dJMcabLvBGN/d5xjgQIZSlx2Ps0oNysBr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3jmp1%2FdJMcabLvBGN%2Fd5xjgQIZSlx2Ps0oNysBr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;633&quot; height=&quot;207&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;207&quot;/&gt;&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;도메인 구입처: 카페24&lt;/li&gt;
&lt;li&gt;현재 네임서버: toby.ns.cloudflare.com, vida.ns.cloudflare.com&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도메인은 카페24에서 샀지만, 권한 서버는 Cloudflare로 바꿔놓은 상태입니다. .com TLD 서버에는 지금 이렇게 등록되어 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1782198029912&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;idwwt.com  NS  toby.ns.cloudflare.com
idwwt.com  NS  vida.ns.cloudflare.com&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;`idwwt.com`에&amp;nbsp;접속하면,&amp;nbsp;리졸버가&amp;nbsp;`.com`&amp;nbsp;TLD&amp;nbsp;서버에&amp;nbsp;물어봤을&amp;nbsp;때&amp;nbsp;&quot;Cloudflare한테&amp;nbsp;가봐&quot;라는&amp;nbsp;답을&amp;nbsp;받고,&amp;nbsp;Cloudflare&amp;nbsp;권한&amp;nbsp;서버에서&amp;nbsp;최종&amp;nbsp;IP를&amp;nbsp;받아오게&amp;nbsp;됩니다.&lt;/p&gt;</description>
      <author>sian han</author>
      <guid isPermaLink="true">https://feelfreetothink.tistory.com/271</guid>
      <comments>https://feelfreetothink.tistory.com/271#entry271comment</comments>
      <pubDate>Tue, 23 Jun 2026 16:01:24 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] 서로 다른 VPC에 있는 EC2에서 RDS로 연결하기 (VPC 피어링)</title>
      <link>https://feelfreetothink.tistory.com/269</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;EC2에서 RDS로 접속하려는데, 둘이 서로 다른 VPC에 있어 McpError('Connection closed') 같은 연결 오류가 나는 상황. 이럴 때 VPC 피어링으로 어떻게 연결하는지 정리한다.&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;AWS&amp;nbsp;네트워크&amp;nbsp;관련&amp;nbsp;개념은&amp;nbsp;&lt;a href=&quot;https://feelfreetothink.tistory.com/259&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;예전&amp;nbsp;글&lt;/a&gt;에서&amp;nbsp;한&amp;nbsp;번&amp;nbsp;정리했는데,&amp;nbsp;이번&amp;nbsp;작업을&amp;nbsp;이해하는&amp;nbsp;데&amp;nbsp;필요한&amp;nbsp;만큼만&amp;nbsp;다시&amp;nbsp;짚고&amp;nbsp;넘어가자.&lt;/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;b&gt;VPC&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;VPC(Virtual&amp;nbsp;Private&amp;nbsp;Cloud)&amp;nbsp;는&amp;nbsp;AWS&amp;nbsp;에서&amp;nbsp;논리적으로&amp;nbsp;격리된&amp;nbsp;네트워크&amp;nbsp;공간이며,&amp;nbsp;기본적으로&amp;nbsp;서로&amp;nbsp;다른&amp;nbsp;VPC&amp;nbsp;에&amp;nbsp;있는&amp;nbsp;리소스끼리는&amp;nbsp;통신이&amp;nbsp;불가능하다.&amp;nbsp;&lt;br /&gt;VPC&amp;nbsp;는&amp;nbsp;하나의&amp;nbsp;리전&amp;nbsp;안에만&amp;nbsp;속하며,&amp;nbsp;여러&amp;nbsp;리전에&amp;nbsp;걸칠&amp;nbsp;수&amp;nbsp;없다.&amp;nbsp;&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;b&gt;서브넷&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서브넷은&amp;nbsp;VPC&amp;nbsp;네트워크&amp;nbsp;공간을&amp;nbsp;잘게&amp;nbsp;나눈&amp;nbsp;하위&amp;nbsp;공간이다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;EC2&amp;nbsp;나&amp;nbsp;RDS&amp;nbsp;같은&amp;nbsp;리소스는&amp;nbsp;VPC&amp;nbsp;에&amp;nbsp;직접&amp;nbsp;놓이는게&amp;nbsp;아니라,&amp;nbsp;반드시&amp;nbsp;어떤&amp;nbsp;서브넷&amp;nbsp;안에&amp;nbsp;배치된다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;각&amp;nbsp;서브넷은&amp;nbsp;하나의&amp;nbsp;가용&amp;nbsp;영역(AZ)에&amp;nbsp;연결되며,&amp;nbsp;여러&amp;nbsp;AZ&amp;nbsp;에&amp;nbsp;걸칠&amp;nbsp;수&amp;nbsp;없다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;즉&amp;nbsp;서브넷&amp;nbsp;하나&amp;nbsp;=&amp;nbsp;하나의&amp;nbsp;AZ&amp;nbsp;이다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;라우팅&amp;nbsp;테이블&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;라우팅&amp;nbsp;테이블은&amp;nbsp;네트워크&amp;nbsp;트래픽이&amp;nbsp;어디로&amp;nbsp;가야&amp;nbsp;하는지&amp;nbsp;알려주는&amp;nbsp;규칙&amp;nbsp;목록이다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;라우팅&amp;nbsp;테이블은&amp;nbsp;'서브넷&amp;nbsp;단위'&amp;nbsp;로&amp;nbsp;붙는다.&amp;nbsp;VPC&amp;nbsp;전체에&amp;nbsp;일괄&amp;nbsp;적용되는&amp;nbsp;게&amp;nbsp;아니라,&amp;nbsp;각&amp;nbsp;서브넷에&amp;nbsp;하나씩&amp;nbsp;연결된다.&amp;nbsp;따라서&amp;nbsp;어떤&amp;nbsp;서브넷이&amp;nbsp;너떤&amp;nbsp;라우팅&amp;nbsp;테이블을&amp;nbsp;쓰는지는&amp;nbsp;중요한&amp;nbsp;포인트이다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;서브넷에&amp;nbsp;별도&amp;nbsp;테이블을&amp;nbsp;명시하지&amp;nbsp;않으면&amp;nbsp;VPC&amp;nbsp;기본&amp;nbsp;테이블을&amp;nbsp;쓰지만,&amp;nbsp;명시적으로&amp;nbsp;다른&amp;nbsp;테이블을&amp;nbsp;연결해두면&amp;nbsp;기본&amp;nbsp;테이블에&amp;nbsp;아무리&amp;nbsp;라우트를&amp;nbsp;추가해도&amp;nbsp;그&amp;nbsp;서브넷에는&amp;nbsp;적용되지&amp;nbsp;않는다.&amp;nbsp;&lt;/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;b&gt;상황&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;EC2와&amp;nbsp;RDS가&amp;nbsp;서로&amp;nbsp;다른&amp;nbsp;VPC에&amp;nbsp;놓여&amp;nbsp;있는&amp;nbsp;구성이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&lt;b&gt;리소스&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&lt;b&gt;VPC&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&lt;b&gt;IP&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;agent-ec2&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;vpc-001&amp;nbsp;(vpc-dev)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;10.0.x.x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;RDS&amp;nbsp;rds-production&amp;nbsp;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;vpc-002&amp;nbsp;(vpc-prod)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;10.1.x.x&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;agent-ec2에서&amp;nbsp;rds-production에&amp;nbsp;접속하려고&amp;nbsp;하는데,&amp;nbsp;둘은&amp;nbsp;서로&amp;nbsp;다른&amp;nbsp;VPC에&amp;nbsp;위치해&amp;nbsp;있다.&lt;br /&gt;이&amp;nbsp;경우&amp;nbsp;기본&amp;nbsp;상태로는&amp;nbsp;통신이&amp;nbsp;되지&amp;nbsp;않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;VPC 피어링 연결&lt;/b&gt;&lt;/u&gt;을 통해 서로 다른 VPC에 걸쳐 통신 할 수 있다.&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;b&gt;VPC 피어링&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VPC 피어링은 서로 다른 두 VPC를 직접 연결하는 전용 통로다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷을 거치지 않고 프라이빗&amp;nbsp;IP로&amp;nbsp;통신할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;해주는&amp;nbsp;AWS&amp;nbsp;기능이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VPC&amp;nbsp;피어링이&amp;nbsp;실제로&amp;nbsp;동작하려면&amp;nbsp;&lt;i&gt;&lt;b&gt;아래&amp;nbsp;3가지&lt;/b&gt;&lt;/i&gt;가&amp;nbsp;모두&amp;nbsp;갖춰져야&amp;nbsp;한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 하나라도 빠지면 연결되지&amp;nbsp;않는다.&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;VPC&amp;nbsp;피어링&amp;nbsp;연결&amp;nbsp;:&amp;nbsp;두&amp;nbsp;VPC&amp;nbsp;사이에&amp;nbsp;통로가&amp;nbsp;뚫려&amp;nbsp;있는가&lt;/li&gt;
&lt;li&gt;라우팅&amp;nbsp;테이블&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;EC2/RDS&amp;nbsp;서브넷이&amp;nbsp;실제로&amp;nbsp;쓰는&amp;nbsp;테이블에&amp;nbsp;피어링&amp;nbsp;라우트가&amp;nbsp;있는가&lt;/li&gt;
&lt;li&gt;RDS&amp;nbsp;보안&amp;nbsp;그룹&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;RDS&amp;nbsp;인바운드가&amp;nbsp;EC2의&amp;nbsp;접근을&amp;nbsp;허용하는가&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;size18&quot;&gt;&lt;b&gt;▶ Step 1. VPC 피어링 연결 생성 &amp;mdash; 통로 뚫기&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;VPC&amp;nbsp;&amp;rarr;&amp;nbsp;피어링&amp;nbsp;연결&amp;nbsp;&amp;rarr;&amp;nbsp;피어링&amp;nbsp;연결&amp;nbsp;생성&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3020&quot; data-origin-height=&quot;968&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b56jbz/dJMcahLyTyJ/v1lV6jlKfpiZflyTYYCM9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b56jbz/dJMcahLyTyJ/v1lV6jlKfpiZflyTYYCM9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b56jbz/dJMcahLyTyJ/v1lV6jlKfpiZflyTYYCM9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb56jbz%2FdJMcahLyTyJ%2Fv1lV6jlKfpiZflyTYYCM9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3020&quot; height=&quot;968&quot; data-origin-width=&quot;3020&quot; data-origin-height=&quot;968&quot;/&gt;&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;요청자&amp;nbsp;VPC&amp;nbsp;:&amp;nbsp;vpc-001&amp;nbsp;(vpc-dev)&lt;/li&gt;
&lt;li&gt;수락자&amp;nbsp;VPC&amp;nbsp;:&amp;nbsp;vpc-002&amp;nbsp;(vpc-prod)&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;수락자&amp;nbsp;구분은&amp;nbsp;통신&amp;nbsp;방향과&amp;nbsp;아무&amp;nbsp;상관이&amp;nbsp;없다.&amp;nbsp;&lt;br /&gt;VPC&amp;nbsp;피어링은&amp;nbsp;두&amp;nbsp;VPC&amp;nbsp;를&amp;nbsp;연결할&amp;nbsp;때&amp;nbsp;한쪽이&amp;nbsp;&quot;연결하자&quot;고&amp;nbsp;요청을&amp;nbsp;보내고,&amp;nbsp;다른&amp;nbsp;쪽이&amp;nbsp;수락하는&amp;nbsp;handshake&amp;nbsp;절차를&amp;nbsp;거친다.&amp;nbsp;&lt;br /&gt;따라서&amp;nbsp;이것은&amp;nbsp;그냥&amp;nbsp;역할일&amp;nbsp;뿐이며,&amp;nbsp;요청자라고&amp;nbsp;해서&amp;nbsp;트래픽을&amp;nbsp;보내기만&amp;nbsp;하는&amp;nbsp;것도&amp;nbsp;아니고,&amp;nbsp;수락자라고&amp;nbsp;해서&amp;nbsp;받기만&amp;nbsp;하는&amp;nbsp;것도&amp;nbsp;아니다.&amp;nbsp;&lt;/p&gt;
&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; 된다&lt;br /&gt;두개&amp;nbsp;역할을&amp;nbsp;반대로&amp;nbsp;입력해도&amp;nbsp;결과는&amp;nbsp;완전히&amp;nbsp;동일하다.&amp;nbsp;요청자,&amp;nbsp;수락자가&amp;nbsp;실제로&amp;nbsp;의미를&amp;nbsp;갖는&amp;nbsp;것은,&amp;nbsp;다른&amp;nbsp;AWS&amp;nbsp;계정의&amp;nbsp;VPC&amp;nbsp;와&amp;nbsp;피어링을&amp;nbsp;할때&amp;nbsp;이다.&amp;nbsp;그때는&amp;nbsp;상대&amp;nbsp;계정&amp;nbsp;소유자가&amp;nbsp;수락&amp;nbsp;버튼을&amp;nbsp;눌러줘야&amp;nbsp;하기&amp;nbsp;때문이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;통신이&amp;nbsp;어느&amp;nbsp;방향으로&amp;nbsp;흐를지를&amp;nbsp;결정하는&amp;nbsp;것은&amp;nbsp;요청자&amp;nbsp;/&amp;nbsp;수락자가&amp;nbsp;아니라,&amp;nbsp;글&amp;nbsp;뒤쪽에&amp;nbsp;나오는&amp;nbsp;라우팅&amp;nbsp;테이블과&amp;nbsp;보안그룹이다.&amp;nbsp;&lt;/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;라우팅 테이블 : 어느 VPC 에서 어느 대역으로 가는 길을 열지&lt;/li&gt;
&lt;li&gt;보안 그룹 : 어느 IP 의 인바운드를 허용할지&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;VPC&amp;nbsp;피어링&amp;nbsp;연결을&amp;nbsp;생성한&amp;nbsp;후&amp;nbsp;작업&amp;nbsp;&amp;rarr;&amp;nbsp;요청&amp;nbsp;수락을&amp;nbsp;통해&amp;nbsp;활성화&amp;nbsp;한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2548&quot; data-origin-height=&quot;486&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OnEO7/dJMb99UhH9F/hZ8yjdlKBgRIjrycRCKgsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OnEO7/dJMb99UhH9F/hZ8yjdlKBgRIjrycRCKgsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OnEO7/dJMb99UhH9F/hZ8yjdlKBgRIjrycRCKgsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOnEO7%2FdJMb99UhH9F%2FhZ8yjdlKBgRIjrycRCKgsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2548&quot; height=&quot;486&quot; data-origin-width=&quot;2548&quot; data-origin-height=&quot;486&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 통로 뚫기가 완료되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;▶ step 2. 라우팅 테이블 설정&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;피어링&amp;nbsp;통로를&amp;nbsp;만들었어도,&amp;nbsp;각&amp;nbsp;VPC가&amp;nbsp;&quot;저쪽으로&amp;nbsp;가려면&amp;nbsp;피어링을&amp;nbsp;타라&quot;는&amp;nbsp;규칙을&amp;nbsp;모르면&lt;br /&gt;통신이&amp;nbsp;되지&amp;nbsp;않는다.&amp;nbsp;그&amp;nbsp;규칙을&amp;nbsp;적어주는&amp;nbsp;게&amp;nbsp;라우팅&amp;nbsp;테이블이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞에서 짚었듯, VPC를 만들면 메인 라우팅 테이블이 하나 자동 생성되고, 아무것도 지정하지 않은 서브넷은 전부 이 메인 테이블을 따라간다. 그러다 특정 서브넷에 다른 라우팅 테이블을 명시적으로 연결하면, 그 서브넷만 메인에서 떨어져 나와 지정한 테이블을 따른다.&lt;br /&gt;&lt;br /&gt;그리고 EC2 인스턴스는 항상 하나의 서브넷에 할당된다. 인스턴스를 시작할 때 서브넷을 지정해야 하고, 한 번 정해지면 그 인스턴스의 기본 네트워크 위치가 된다. 따라서 라우트를 추가할 때는 &quot;VPC의 기본 테이블&quot;이 아니라 그 인스턴스의 서브넷이 실제로 쓰는 테이블을&amp;nbsp;찾아야&amp;nbsp;한다.&lt;/p&gt;
&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;▷ 2-1. EC2 서브넷의 라우팅 테이블에 추가&lt;/b&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;EC2&amp;nbsp;&amp;rarr;&amp;nbsp;인스턴스&amp;nbsp;&amp;rarr;&amp;nbsp;네트워킹&amp;nbsp;&amp;rarr;&amp;nbsp;서브넷ID&amp;nbsp;&amp;rarr;&amp;nbsp;라우팅&amp;nbsp;테이블&amp;nbsp;&amp;rarr;&amp;nbsp;라우팅&amp;nbsp;테이블&amp;nbsp;연결&amp;nbsp;편집&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서&amp;nbsp;step&amp;nbsp;1&amp;nbsp;에서&amp;nbsp;생성한&amp;nbsp;VPC&amp;nbsp;피어링&amp;nbsp;연결&amp;nbsp;ID&amp;nbsp;를&amp;nbsp;선택해서&amp;nbsp;추가한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2506&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WRfhO/dJMcahY4Mvk/wCsRiWyKVNGj0Me7r6kbK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WRfhO/dJMcahY4Mvk/wCsRiWyKVNGj0Me7r6kbK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WRfhO/dJMcahY4Mvk/wCsRiWyKVNGj0Me7r6kbK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWRfhO%2FdJMcahY4Mvk%2FwCsRiWyKVNGj0Me7r6kbK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2506&quot; height=&quot;670&quot; data-origin-width=&quot;2506&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&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;▷ 2-2. RDS 서브넷의 라우팅 테이블에도 추가&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;라우팅은&amp;nbsp;EC2&amp;nbsp;쪽만&amp;nbsp;하면&amp;nbsp;안&amp;nbsp;되고,&amp;nbsp;RDS가&amp;nbsp;위치한&amp;nbsp;서브넷의&amp;nbsp;라우팅&amp;nbsp;테이블에도&amp;nbsp;추가해야&amp;nbsp;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이유는 라우팅이 방향마다 따로 필요하기 때문이다. EC2가 RDS로 패킷을 보낼 때(가는 길)와, RDS가 그 응답을 EC2로 돌려보낼 때(오는 길)는 각각 출발하는 쪽의 라우팅 테이블을 참조한다. EC2 쪽만 설정하면 패킷이 RDS까지 가긴 하지만, RDS가 답을 돌려보낼 길을 몰라&amp;nbsp;통신이&amp;nbsp;반쪽만&amp;nbsp;되고&amp;nbsp;끊긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RDS(특히 Aurora)는 여러 서브넷에 걸쳐 배치될 수 있으므로, 먼저 RDS가 어느 서브넷을 쓰는지부터&amp;nbsp;확인한다.&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;Aurora&amp;nbsp;and&amp;nbsp;RDS&amp;nbsp;&amp;rarr;&amp;nbsp;데이터베이스&amp;nbsp;&amp;rarr;&amp;nbsp;인스턴스&amp;nbsp;&amp;rarr;&amp;nbsp;VPC&amp;nbsp;ID&amp;nbsp;확인&lt;/li&gt;
&lt;li&gt;Aurora&amp;nbsp;and&amp;nbsp;RDS&amp;nbsp;&amp;rarr;&amp;nbsp;서브넷&amp;nbsp;그룹&amp;nbsp;&amp;rarr;&amp;nbsp;위에서&amp;nbsp;확인한&amp;nbsp;VPC&amp;nbsp;내의&amp;nbsp;서브넷&amp;nbsp;그룹&amp;nbsp;&amp;rarr;&amp;nbsp;서브넷&amp;nbsp;ID&amp;nbsp;&amp;rarr;&amp;nbsp;라우팅&amp;nbsp;테이블&amp;nbsp;연결&amp;nbsp;편집&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서&amp;nbsp;동일하게&amp;nbsp;step&amp;nbsp;1&amp;nbsp;에서&amp;nbsp;생성한&amp;nbsp;VPC&amp;nbsp;피어링&amp;nbsp;연결&amp;nbsp;ID&amp;nbsp;를&amp;nbsp;선택하여&amp;nbsp;추가한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와&amp;nbsp;같이&amp;nbsp;EC2&amp;nbsp;와&amp;nbsp;Aurora&amp;nbsp;RDS&amp;nbsp;이&amp;nbsp;위치한&amp;nbsp;서브넷이&amp;nbsp;어떤&amp;nbsp;라우팅&amp;nbsp;테이블을&amp;nbsp;실제로&amp;nbsp;사용하는지&amp;nbsp;먼저&amp;nbsp;확인한&amp;nbsp;뒤,&amp;nbsp;그&amp;nbsp;테이블에&amp;nbsp;라우트를&amp;nbsp;추가해야한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;▶ step 3. RDS 보안 그룹 생성 및 연결&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;step&amp;nbsp;1&amp;nbsp;에서&amp;nbsp;길을&amp;nbsp;뚫어주고,&amp;nbsp;step&amp;nbsp;2&amp;nbsp;에서&amp;nbsp;이&amp;nbsp;길로&amp;nbsp;가면&amp;nbsp;된다고&amp;nbsp;안내판을&amp;nbsp;세워줬다.&amp;nbsp;&lt;br /&gt;step&amp;nbsp;3&amp;nbsp;는&amp;nbsp;출입&amp;nbsp;허가증을&amp;nbsp;발급하는&amp;nbsp;절차라고&amp;nbsp;보면&amp;nbsp;되겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보안 그룹은 RDS 앞에 선 방화벽이다. 허용 규칙만 설정할 수 있고, 기본적으로 모든 인바운드가 차단돼 있다. 그래서 라우팅을 통해 패킷이 RDS 문 앞까지 도착해도, 보안 그룹 인바운드에 그 출처가 등록돼 있지 않으면 문턱에서 막힌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;참고:&amp;nbsp;보안&amp;nbsp;그룹은&amp;nbsp;RDS&amp;nbsp;쪽만&amp;nbsp;열면&amp;nbsp;된다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;(단, EC2 아웃바운드를 일부러 제한해둔 경우라면 RDS 포트로 나가는 것이 허용돼 있는지만 확인한다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;▷ 3-1. EC2의 프라이빗 IP 확인&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;먼저&amp;nbsp;RDS&amp;nbsp;인바운드에&amp;nbsp;등록할&amp;nbsp;EC2의&amp;nbsp;프라이빗&amp;nbsp;IP를&amp;nbsp;확인한다.&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;EC2 &amp;rarr; 인스턴스 &amp;rarr; 해당 인스턴스 &amp;rarr; [네트워킹] 탭 &amp;rarr; 프라이빗 IPv4 주소&lt;/li&gt;
&lt;li&gt;여기&amp;nbsp;표시되는&amp;nbsp;값(예:&amp;nbsp;10.0.17.105)이&amp;nbsp;RDS&amp;nbsp;인바운드&amp;nbsp;소스로&amp;nbsp;넣을&amp;nbsp;IP다.&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;▷ 3-2. RDS 보안 그룹 인바운드 규칙 수정&lt;/b&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;RDS&amp;nbsp;&amp;rarr;&amp;nbsp;데이터베이스&amp;nbsp;&amp;rarr;&amp;nbsp;해당&amp;nbsp;인스턴스&amp;nbsp;&amp;rarr;&amp;nbsp;[연결&amp;nbsp;및&amp;nbsp;보안]&amp;nbsp;탭&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;rarr;&amp;nbsp;연결된&amp;nbsp;보안&amp;nbsp;그룹&amp;nbsp;클릭&amp;nbsp;&amp;rarr;&amp;nbsp;[인바운드&amp;nbsp;규칙]&amp;nbsp;탭&amp;nbsp;&amp;rarr;&amp;nbsp;[인바운드&amp;nbsp;규칙&amp;nbsp;편집]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;rarr;&amp;nbsp;[규칙&amp;nbsp;추가]&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;RDS에 보안 그룹이 여러 개 연결돼 있을 수 있다. 규칙은 합집합으로 적용되므로, EC2 접근용으로 목적이 분명한 보안 그룹(예: rds-prd-access처럼 dev 대역 IP가 이미 들어 있는 것) 하나를 골라 거기에 추가하면 된다. 내부 통신용 보안 그룹에 섞지 않는 편이 나중에&amp;nbsp;관리하기&amp;nbsp;깔끔하다.&lt;/p&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 /32 대신 EC2의 보안 그룹 ID를 넣을 수도 있다. 그러면 EC2가 재시작돼 IP가 바뀌어도 규칙을 고칠 필요가 없다. 단, 이 방식은 두 리소스가 같은 VPC이거나 VPC 피어링으로&amp;nbsp;연결된&amp;nbsp;경우에만&amp;nbsp;동작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;정리&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서로&amp;nbsp;다른&amp;nbsp;VPC에&amp;nbsp;있는&amp;nbsp;EC2와&amp;nbsp;RDS를&amp;nbsp;연결하려면&amp;nbsp;&lt;b&gt;VPC&amp;nbsp;피어링&lt;/b&gt;을 사용할 수 있다. 다만 단순히&lt;br /&gt;피어링&amp;nbsp;연결만&amp;nbsp;생성한다고&amp;nbsp;통신이&amp;nbsp;되는&amp;nbsp;것은&amp;nbsp;아니며,&amp;nbsp;다음&amp;nbsp;3가지가&amp;nbsp;모두&amp;nbsp;갖춰져야&amp;nbsp;한다.&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;nbsp; 피어링 연결 생성 - 두 VPC 사이의 전용 통로&lt;/li&gt;
&lt;li&gt;&amp;nbsp;라우팅 테이블 설정 - EC2와 RDS가 실제로 사용하는 서브넷의 테이블 양쪽에 추가 (기본 테이블 != 실제 사용 테이블일 수 있음)&lt;/li&gt;
&lt;li&gt;&amp;nbsp;보안 그룹 설정 - RDS 인바운드에 EC2 IP를 명시적으로 허용&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;위 세 가지를 갖추면 VPC 피어링을 통해 서로 다른 VPC에&amp;nbsp;위치한&amp;nbsp;리소스끼리도&amp;nbsp;프라이빗&amp;nbsp;IP로&amp;nbsp;통신할&amp;nbsp;수&amp;nbsp;있다.&lt;/p&gt;</description>
      <category>AWS</category>
      <author>sian han</author>
      <guid isPermaLink="true">https://feelfreetothink.tistory.com/269</guid>
      <comments>https://feelfreetothink.tistory.com/269#entry269comment</comments>
      <pubDate>Wed, 17 Jun 2026 14:56:52 +0900</pubDate>
    </item>
    <item>
      <title>[AX] 비개발자 팀을 위한 두 번째 Claude 세미나 : 절반의 성공</title>
      <link>https://feelfreetothink.tistory.com/268</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1회차를&amp;nbsp;끝낸&amp;nbsp;직후의&amp;nbsp;상태&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://feelfreetothink.tistory.com/267&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;1회차 글&lt;/a&gt; 에서 적었듯이, 1회차에서는 내가 놓친 것들이 많았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1회차에서 준비한 Hands-On 은 매끄럽지 않았다.&amp;nbsp; vscode&amp;nbsp;+&amp;nbsp;터미널&amp;nbsp;조합으로&amp;nbsp;Claude&amp;nbsp;Hands-On&amp;nbsp;을&amp;nbsp;구성하여&amp;nbsp;환경설치&amp;nbsp;단계에서&amp;nbsp;참여자들은&amp;nbsp;무너졌고, 내가&amp;nbsp;개발자&amp;nbsp;Hands-On&amp;nbsp;에&amp;nbsp;참석하며&amp;nbsp;좋다고&amp;nbsp;느꼈던&amp;nbsp;방식인&amp;nbsp;git&amp;nbsp;branch(실습용/완성본)&amp;nbsp;형식으로&amp;nbsp;안내하여&amp;nbsp;결국&amp;nbsp;아래와&amp;nbsp;같은&amp;nbsp;피드백으로&amp;nbsp;이어졌다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oKcy8/dJMcaiXVkCW/mM6YMRUENtKEzXtaH43Aak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oKcy8/dJMcaiXVkCW/mM6YMRUENtKEzXtaH43Aak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oKcy8/dJMcaiXVkCW/mM6YMRUENtKEzXtaH43Aak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoKcy8%2FdJMcaiXVkCW%2FmM6YMRUENtKEzXtaH43Aak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;818&quot; height=&quot;374&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;&quot;모든 것이 다 생소해서 어려웠습니다...&quot;&lt;/b&gt;&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션이&amp;nbsp;끝난&amp;nbsp;직후&amp;nbsp;솔직히&amp;nbsp;조금&amp;nbsp;우울했다.&amp;nbsp;쉽게&amp;nbsp;전달하는&amp;nbsp;것에&amp;nbsp;초점을&amp;nbsp;맞추면서&amp;nbsp;&lt;u&gt;&lt;b&gt;10시간&lt;/b&gt;&lt;/u&gt;을&amp;nbsp;준비했는데,&amp;nbsp;많은&amp;nbsp;것이&amp;nbsp;닿지&amp;nbsp;않은&amp;nbsp;것&amp;nbsp;같았다.&amp;nbsp;&lt;br /&gt;그래도&amp;nbsp;2회차&amp;nbsp;세미나는&amp;nbsp;이틀&amp;nbsp;뒤였고,&amp;nbsp;우울할&amp;nbsp;시간이&amp;nbsp;없었다.&amp;nbsp;1회차에서&amp;nbsp;받은&amp;nbsp;피드백을&amp;nbsp;참고하여&amp;nbsp;2회차에서는&amp;nbsp;무엇을&amp;nbsp;바꿔야&amp;nbsp;더&amp;nbsp;잘&amp;nbsp;전달할&amp;nbsp;수&amp;nbsp;있을지&amp;nbsp;정리해야&amp;nbsp;했다.&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;b&gt;2회차에서는 무엇을 바꿨는가&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1.&amp;nbsp;도구&amp;nbsp;&amp;mdash;&amp;nbsp;터미널&amp;middot;VS&amp;nbsp;Code&amp;middot;Git을&amp;nbsp;전부&amp;nbsp;뺐다&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1회차에&amp;nbsp;쓴&amp;nbsp;Claude&amp;nbsp;Code&amp;nbsp;+&amp;nbsp;터미널&amp;nbsp;조합은&amp;nbsp;비개발자에게&amp;nbsp;진입&amp;nbsp;장벽이&amp;nbsp;너무&amp;nbsp;높다는&amp;nbsp;게&amp;nbsp;확인됐다.&amp;nbsp;&lt;br /&gt;그래서 2회차는 &lt;b&gt;Claude Desktop&lt;/b&gt;으로 준비했다, Claude Desktop은 설치하고 로그인만 하면 끝난다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;GitHub&amp;nbsp;clone,&amp;nbsp;브랜치&amp;nbsp;이동,&amp;nbsp;영어&amp;nbsp;에러&amp;nbsp;메시지&amp;nbsp;등&amp;nbsp;1회차에서&amp;nbsp;참여자들의&amp;nbsp;에너지를&amp;nbsp;뺐던&amp;nbsp;것들을&amp;nbsp;전부&amp;nbsp;없앴다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2.&amp;nbsp;목표를&amp;nbsp;푸는&amp;nbsp;방식&amp;nbsp;&amp;mdash;&amp;nbsp;수단을&amp;nbsp;바꿨다&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목표 자체는 1회차와 같았다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&quot;나도 해볼 수 있겠는데?&quot;라는 감각&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Claude에게 업무를 위임함으로써 정말 집중해야 할 일에 집중하는 작업 방식에 대한 동경&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것이&amp;nbsp;1&amp;middot;2회차를&amp;nbsp;통틀어&amp;nbsp;내가&amp;nbsp;가장&amp;nbsp;만들고&amp;nbsp;싶었던&amp;nbsp;결과였다.&lt;br /&gt;&lt;br /&gt;1회차에서는 직접 손으로 만들어보면 Claude에 업무를 위임한다는 감각을 알려줄 수 있을 거라고 생각했다.&amp;nbsp;&lt;br /&gt;그래서 아주 쉽게 Skill을 만들 수 있도록 1회차 세션을 설계했고, 이렇게 직접 Skill을 만들어보는 경험이&amp;nbsp;세미나가&amp;nbsp;끝난&amp;nbsp;뒤에도&amp;nbsp;&quot;&lt;i&gt;나&amp;nbsp;혼자서도&amp;nbsp;만들어볼&amp;nbsp;수&amp;nbsp;있겠다&lt;/i&gt;&quot;는&amp;nbsp;자신감으로&amp;nbsp;이어질&amp;nbsp;거라고&amp;nbsp;기대했다.&lt;br /&gt;&lt;br /&gt;그런데 이런 방법이 효과를 보려면, 먼저 &lt;b&gt;동경을 충분히 불러일으킨 다음 쉽게 만드는 방법을 알려줘야&lt;/b&gt; 사람들이 더 적극적으로 따라오는건데, 1회차에는 그 부분이 부족했던 것 같다. 그래서&amp;nbsp;2회차에서는&amp;nbsp;직접&amp;nbsp;만들어보는&amp;nbsp;데&amp;nbsp;초점을&amp;nbsp;맞추기보다,&amp;nbsp;동경을&amp;nbsp;불러일으키기&amp;nbsp;위해&amp;nbsp;다른&amp;nbsp;마케터들이&amp;nbsp;&lt;b&gt;Claude를&amp;nbsp;어떻게&amp;nbsp;활용하고&amp;nbsp;있는지&amp;nbsp;사례를&amp;nbsp;보여주는&amp;nbsp;데&amp;nbsp;절반을&amp;nbsp;할애&lt;/b&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;nbsp;충분히&amp;nbsp;불러일으키기&lt;/li&gt;
&lt;li&gt;쉽게 시작하는 방법을 알려주기&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게&amp;nbsp;순서를&amp;nbsp;바꾼&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;b&gt;세션 구성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션은&amp;nbsp;크게&amp;nbsp;세&amp;nbsp;파트로&amp;nbsp;나눴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Part 1. 해외 사례 &amp;mdash; &quot;저 사람도 했네 = 나도 할 수 있어 !&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발을 전혀 모르는 마케터들이 Claude로 어떻게 업무를 하고 있는지 사례를 보여줬다. 그중에서 Anthropic의 퍼포먼스 마케터 Austin의 사례가 가장 좋다고 생각했다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;641&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6qWxq/dJMcahY0zTW/Hapi80FpOq3jvj4d0SavQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6qWxq/dJMcahY0zTW/Hapi80FpOq3jvj4d0SavQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6qWxq/dJMcahY0zTW/Hapi80FpOq3jvj4d0SavQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6qWxq%2FdJMcahY0zTW%2FHapi80FpOq3jvj4d0SavQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1152&quot; height=&quot;641&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;641&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&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;Claude를&amp;nbsp;만든&amp;nbsp;회사의&amp;nbsp;마케터&lt;/b&gt;'라는&amp;nbsp;점이&amp;nbsp;신뢰를&amp;nbsp;주면서도,&amp;nbsp;시작점만큼은&amp;nbsp;우리와&amp;nbsp;다르지&amp;nbsp;않았기&amp;nbsp;때문이다.&amp;nbsp;&lt;i&gt;&lt;b&gt;Austin은&amp;nbsp;터미널을&amp;nbsp;어떻게&amp;nbsp;켜는지도&amp;nbsp;몰랐다.&lt;/b&gt;&lt;/i&gt;&amp;nbsp;Claude&amp;nbsp;Code가&amp;nbsp;처음&amp;nbsp;나왔을&amp;nbsp;때&amp;nbsp;&quot;이게&amp;nbsp;뭔지&amp;nbsp;모르겠다&quot;고&amp;nbsp;했고,&amp;nbsp;터미널을&amp;nbsp;어떻게&amp;nbsp;여는지&amp;nbsp;구글에&amp;nbsp;직접&amp;nbsp;검색했을&amp;nbsp;정도였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그랬던&amp;nbsp;그가&amp;nbsp;지금은&amp;nbsp;다양한&amp;nbsp;도구를&amp;nbsp;직접&amp;nbsp;만들어낸다.&amp;nbsp;광고&amp;nbsp;시안&amp;nbsp;생성을&amp;nbsp;위한&amp;nbsp;Figma&amp;nbsp;플러그인을&amp;nbsp;만들어,&amp;nbsp;기존에는&amp;nbsp;프레임을&amp;nbsp;일일이&amp;nbsp;복사하고&amp;nbsp;텍스트를&amp;nbsp;붙여넣어야&amp;nbsp;했던&amp;nbsp;작업을&amp;nbsp;단&amp;nbsp;한&amp;nbsp;번의&amp;nbsp;클릭으로&amp;nbsp;수십&amp;nbsp;개의&amp;nbsp;광고&amp;nbsp;변형을&amp;nbsp;만들어내도록&amp;nbsp;바꿨다.&amp;nbsp;이를&amp;nbsp;통해&amp;nbsp;대량의&amp;nbsp;크리에이티브를&amp;nbsp;업데이트하는&amp;nbsp;시간을&amp;nbsp;약&amp;nbsp;30분에서&amp;nbsp;30초로&amp;nbsp;줄였다.&amp;nbsp;또&amp;nbsp;구글&amp;nbsp;광고&amp;nbsp;문구&amp;nbsp;생성&amp;nbsp;워크플로우를&amp;nbsp;만들어,&amp;nbsp;슬래시&amp;nbsp;명령&amp;nbsp;하나로&amp;nbsp;브레인스토밍부터&amp;nbsp;업로드용&amp;nbsp;CSV&amp;nbsp;파일&amp;nbsp;생성까지&amp;nbsp;이어지고,&amp;nbsp;브랜드&amp;nbsp;톤앤매너와&amp;nbsp;제품&amp;nbsp;정확성,&amp;nbsp;광고&amp;nbsp;모범&amp;nbsp;사례까지&amp;nbsp;자동으로&amp;nbsp;검증하도록&amp;nbsp;했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론&amp;nbsp;Austin이&amp;nbsp;처음부터&amp;nbsp;이런&amp;nbsp;도구를&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있었던&amp;nbsp;건&amp;nbsp;아니다.&amp;nbsp;그는&amp;nbsp;Claude가&amp;nbsp;어떻게&amp;nbsp;동작하는지&amp;nbsp;확인하기&amp;nbsp;위해,&amp;nbsp;가장&amp;nbsp;먼저&amp;nbsp;실험&amp;nbsp;삼아&amp;nbsp;간단한&amp;nbsp;계산기&amp;nbsp;앱을&amp;nbsp;만들어봤다고&amp;nbsp;한다.&amp;nbsp;그렇게&amp;nbsp;이전에는&amp;nbsp;개발자에게&amp;nbsp;요청해야&amp;nbsp;했던&amp;nbsp;기술적인&amp;nbsp;작업들을&amp;nbsp;직접&amp;nbsp;도구로&amp;nbsp;만들어&amp;nbsp;해결하면서,&amp;nbsp;'원하는&amp;nbsp;것'과&amp;nbsp;'직접&amp;nbsp;만드는&amp;nbsp;것'&amp;nbsp;사이의&amp;nbsp;격차를&amp;nbsp;획기적으로&amp;nbsp;줄였다.&lt;br /&gt;&lt;br /&gt;내가&amp;nbsp;이&amp;nbsp;사례를&amp;nbsp;가장&amp;nbsp;앞에&amp;nbsp;둔&amp;nbsp;이유는&amp;nbsp;분명하다.&amp;nbsp;&quot;&lt;b&gt;저&amp;nbsp;사람도&amp;nbsp;터미널을&amp;nbsp;못&amp;nbsp;켰는데&amp;nbsp;저렇게까지&amp;nbsp;했네&lt;/b&gt;&quot;라는 느낌, 그게 곧 &quot;&lt;b&gt;나도 할 수 있겠다&lt;/b&gt;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Part&amp;nbsp;2.&amp;nbsp;Claude&amp;nbsp;Desktop&amp;nbsp;사용법&amp;nbsp;&amp;mdash;&amp;nbsp;도구의&amp;nbsp;세&amp;nbsp;가지&amp;nbsp;모드&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;1회차에서&amp;nbsp;가장&amp;nbsp;큰&amp;nbsp;장벽은&amp;nbsp;환경&amp;nbsp;설치였다.&amp;nbsp;설문에서도&amp;nbsp;3명&amp;nbsp;중&amp;nbsp;2명이&amp;nbsp;가장&amp;nbsp;어려웠던&amp;nbsp;부분으로&amp;nbsp;환경&amp;nbsp;설정을&amp;nbsp;꼽았고,&amp;nbsp;&quot;내&amp;nbsp;화면은&amp;nbsp;진행이&amp;nbsp;멈춰&amp;nbsp;있는데&amp;nbsp;설명은&amp;nbsp;계속&amp;nbsp;이어져서&amp;nbsp;혼동이&amp;nbsp;생겼다&quot;는&amp;nbsp;피드백도&amp;nbsp;있었다.&amp;nbsp;그래서&amp;nbsp;이번에는&amp;nbsp;터미널도,&amp;nbsp;Git&amp;nbsp;clone도&amp;nbsp;없이,&amp;nbsp;설치하고&amp;nbsp;로그인만&amp;nbsp;하면&amp;nbsp;바로&amp;nbsp;쓸&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;Claude&amp;nbsp;Desktop으로&amp;nbsp;안내하기로&amp;nbsp;했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude&amp;nbsp;Desktop에는&amp;nbsp;세&amp;nbsp;가지&amp;nbsp;모드가&amp;nbsp;있다.&amp;nbsp;이걸&amp;nbsp;'언제,&amp;nbsp;무엇을&amp;nbsp;쓰는지'로&amp;nbsp;구분해서&amp;nbsp;설명했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;643&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4tm79/dJMcaar511t/L1V41qGnqYNarOlFkIcUj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4tm79/dJMcaar511t/L1V41qGnqYNarOlFkIcUj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4tm79/dJMcaar511t/L1V41qGnqYNarOlFkIcUj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4tm79%2FdJMcaar511t%2FL1V41qGnqYNarOlFkIcUj1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1159&quot; height=&quot;643&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;643&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;Chat&amp;nbsp;&amp;mdash;&amp;nbsp;단발성&amp;nbsp;질문,&amp;nbsp;1회성&amp;nbsp;작업&lt;/li&gt;
&lt;li&gt;Cowork&amp;nbsp;&amp;mdash;&amp;nbsp;같은&amp;nbsp;맥락을&amp;nbsp;이어가는&amp;nbsp;반복&amp;nbsp;작업&amp;nbsp;(ChatGPT의&amp;nbsp;프로젝트&amp;nbsp;폴더&amp;nbsp;같은&amp;nbsp;개념)&lt;/li&gt;
&lt;li&gt;Code&amp;nbsp;&amp;mdash;&amp;nbsp;컴퓨터의&amp;nbsp;파일을&amp;nbsp;직접&amp;nbsp;읽고/쓰고/실행할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;모드&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;권장&amp;nbsp;순서도&amp;nbsp;같이&amp;nbsp;안내했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&quot;처음에는 Chat부터 시작해보세요. 같은 작업이 3번 이상 반복되면 Cowork로, 아예 자동화하고 싶으면 Code로 넘어오시면 됩니다.&quot;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;이&amp;nbsp;순서를&amp;nbsp;명시한&amp;nbsp;건&amp;nbsp;의도가&amp;nbsp;있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1회차 이후&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;어디서부터&amp;nbsp;시작해야&amp;nbsp;할지&amp;nbsp;모르겠다&quot;,&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&quot;우선&amp;nbsp;하나라도&amp;nbsp;부딪혀보는&amp;nbsp;게&amp;nbsp;좋을지,&amp;nbsp;기초부터&amp;nbsp;이해하고&amp;nbsp;시작하는&amp;nbsp;게&amp;nbsp;좋을지&amp;nbsp;모르겠다&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;와 같은 피드백이 여럿 있었기 때문이다. 이번엔 자연스러운 진입 경로를 보여주고 싶었다. &quot;막연한 큰 도구&quot;가 아니라 &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;size18&quot;&gt;&lt;b&gt;Part&amp;nbsp;3.&amp;nbsp;Skill&amp;nbsp;업그레이드&amp;nbsp;라이브&amp;nbsp;시연&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1회차때 함께 만들어보았던 Skill 가져와서, 그 자리에서 기능을 추가하는 모습을 보여줬다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1회차에서 &quot;Skill을 처음부터 만드는 과정&quot; 을 보여줬다면, 2회차에서는 &quot;이미 있는 Skill을 키워가는 과정&quot;을 보여줬다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1275&quot; data-origin-height=&quot;712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c56CIk/dJMcaf7ZoPa/Ri3G1FdHxKKyMpvFW7AN4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c56CIk/dJMcaf7ZoPa/Ri3G1FdHxKKyMpvFW7AN4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c56CIk/dJMcaf7ZoPa/Ri3G1FdHxKKyMpvFW7AN4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc56CIk%2FdJMcaf7ZoPa%2FRi3G1FdHxKKyMpvFW7AN4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1275&quot; height=&quot;712&quot; data-origin-width=&quot;1275&quot; data-origin-height=&quot;712&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이걸 시연으로 넣은 이유는, 0에서 1을 만드는 것보다 1을 2로 만드는 게 사실 더 자주 일어나는 일인데, 사실 이건 하나도 어렵지 않다는 걸 보여주고 싶었기 때문이다. 첫 Skill을 만든 다음에 어떻게 발전시켜 나가는지에 대한 그림이 없으면, 첫 시도가 마지막 시도가 되기 쉽다.&lt;br /&gt;&lt;br /&gt;결과적으로&amp;nbsp;이&amp;nbsp;시연은&amp;nbsp;2회차에서&amp;nbsp;가장&amp;nbsp;반응이&amp;nbsp;좋았던&amp;nbsp;콘텐츠였다.&amp;nbsp;&lt;b&gt;설문에서&amp;nbsp;'가장&amp;nbsp;도움이&amp;nbsp;됐던&amp;nbsp;콘텐츠'로&amp;nbsp;응답자의&amp;nbsp;80%가&amp;nbsp;이&amp;nbsp;라이브&amp;nbsp;시연을&amp;nbsp;꼽았다&lt;/b&gt;.&amp;nbsp;추상적인&amp;nbsp;개념&amp;nbsp;설명보다,&amp;nbsp;눈앞에서&amp;nbsp;Skill이&amp;nbsp;실제로&amp;nbsp;자라나는&amp;nbsp;걸&amp;nbsp;보여주는&amp;nbsp;쪽이&amp;nbsp;훨씬&amp;nbsp;잘&amp;nbsp;전달된&amp;nbsp;것이다.&lt;br /&gt;&lt;br /&gt;다만 한계도 분명했다. 보는 것과 직접 하는 것 사이의 거리는 여전히 컸다. &quot;흐름은 이해했지만 직접 하려면 막막할 것 같다&quot;, &quot;보면서 흥미는 생겼는데 직접 해볼 자신은 아직 없다&quot;는 응답이 있었다. 시연은 동경을 일으키는 데까지는 성공했지만, 그 동경을 '내가 직접 만들 수 있다'는 자신감으로 바꾸려면 결국 직접 손을 움직여보는 실습이 필요하다는 걸 알 수 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Part 4. API Key 안전 수칙 안내&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;이 세미나 이후에 누군가 혼자 Skill을 만들어 볼 수 있는데, 광고주 API를 다루는 작업이라면 사고가 날 수 있다.&amp;nbsp;&lt;br /&gt;&lt;b&gt;키워드&amp;nbsp;추가,&amp;nbsp;입찰가&amp;nbsp;조정,&amp;nbsp;캠페인&amp;nbsp;삭제&lt;/b&gt; 같은 작업은 반드시 확인을 거쳐야 하고, 사실 의도하지 않았더라도 AI가 자체적으로 실행해버릴 수 있다. 그렇기 때문에&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;API Key는 절대 대화창에 붙여넣지 않을 것&lt;/li&gt;
&lt;li&gt;처음에는 테스트 계정이나 일시정지된 캠페인에서 진행할 것&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등의 최소한의 안전 수칙을 공유했다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1158&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ePUf7h/dJMcabEuMcP/p7SiFgy3It7ycMP3jazZKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ePUf7h/dJMcabEuMcP/p7SiFgy3It7ycMP3jazZKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ePUf7h/dJMcabEuMcP/p7SiFgy3It7ycMP3jazZKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FePUf7h%2FdJMcabEuMcP%2Fp7SiFgy3It7ycMP3jazZKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1158&quot; height=&quot;646&quot; data-origin-width=&quot;1158&quot; data-origin-height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Part 5. 도파민 그래프 이야기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&quot;지금은 도파민이 터지는 시점입니다. 0에서 1을 만드는 건 재미있어요. &amp;gt; 근데 1을 2로, 3으로 만들면서 유지하는 건 그렇게 재미있지 않을 수 있습니다. 그때부터는 도파민이 아니라, 이 문제를 진짜 풀고 싶다는 의지가 필요합니다&quot;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1158&quot; data-origin-height=&quot;655&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BGllt/dJMcabRZ8t1/J4vpKGi0OfFw2OKH53SXDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BGllt/dJMcabRZ8t1/J4vpKGi0OfFw2OKH53SXDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BGllt/dJMcabRZ8t1/J4vpKGi0OfFw2OKH53SXDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBGllt%2FdJMcabRZ8t1%2FJ4vpKGi0OfFw2OKH53SXDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1158&quot; height=&quot;655&quot; data-origin-width=&quot;1158&quot; data-origin-height=&quot;655&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Part 6. Claude 사내 스터디 수요조사&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;b&gt;AI 챔피언, AI 히어로, AI 특공대 등&lt;/b&gt; 다양한 이름으로 불리는 AX 조직의 구성원들은 비개발자가 AI 에이전트를 업무에 활용할 수 있도록 돕는 역할을 한다. 이&amp;nbsp;과정에서&amp;nbsp;가장&amp;nbsp;중요한&amp;nbsp;것은&amp;nbsp;&quot;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;온도를&amp;nbsp;맞추는&amp;nbsp;일&lt;/b&gt;&lt;/span&gt;&quot;&amp;nbsp;이라고&amp;nbsp;했다.&amp;nbsp;혼자&amp;nbsp;앞서&amp;nbsp;나가면서&amp;nbsp;이것저것&amp;nbsp;설명해봐야&amp;nbsp;온도가&amp;nbsp;끌어올려지지&amp;nbsp;않은&amp;nbsp;상태에서는&amp;nbsp;아무것도&amp;nbsp;전달&amp;nbsp;할&amp;nbsp;수&amp;nbsp;없다.&lt;/p&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회차 세미나를 진행한 후 받은 피드백을 통해 사람들의 관심도가 꽤 높다는걸 알 수 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2회차 끝나고 나면 같이 시작해볼 온도가 맞춰진 사람이 있을 것 같았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2회차 세미나가 끝나는 시점은 스터디를 진행하기에 아주 적기라고 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스터디를 통해 Claude를 수족처럼 부릴 수 있는 사람이 단 한 명이라도 생긴다면, 정말 많은 문제를 해결할 수 있을 것 같았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 '&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;AI 어쩌구&lt;/b&gt;&lt;/span&gt;'로서 사내 스터디를 기획했고, 홍보하는 시간을 가졌다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;643&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rZ1Sg/dJMcabEuMjy/kDIIMFQMxGnZp7mgO7CO2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rZ1Sg/dJMcabEuMjy/kDIIMFQMxGnZp7mgO7CO2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rZ1Sg/dJMcabEuMjy/kDIIMFQMxGnZp7mgO7CO2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrZ1Sg%2FdJMcabEuMjy%2FkDIIMFQMxGnZp7mgO7CO2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1154&quot; height=&quot;643&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;643&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;2회차 &lt;b&gt;세미나를 완전히 이해한 사람은 0%&lt;/b&gt; 이지만 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;스터디 참여 희망은 100%&lt;/b&gt;&lt;/span&gt;였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 &quot;어려웠다&quot;는 곧 &quot;이탈&quot;로 이어지는데, 이번엔 &quot;어려웠지만 더 배우고 싶다&quot;로 연결됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;준비하는 내내 고민했던 '온도 맞추기'가 통했다는 의미로 느껴졌다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;824&quot; data-origin-height=&quot;381&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQfe9W/dJMcabEx3sj/fOamtugej0uGaavHkXHKFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQfe9W/dJMcabEx3sj/fOamtugej0uGaavHkXHKFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQfe9W/dJMcabEx3sj/fOamtugej0uGaavHkXHKFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQfe9W%2FdJMcabEx3sj%2FfOamtugej0uGaavHkXHKFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;381&quot; data-origin-width=&quot;824&quot; data-origin-height=&quot;381&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&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;b&gt;피드백으로 본 2회차 세미나 결과&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;901&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NfSnv/dJMb9905Aqv/Nat2tApbzpJ9IpbwGJGVbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NfSnv/dJMb9905Aqv/Nat2tApbzpJ9IpbwGJGVbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NfSnv/dJMb9905Aqv/Nat2tApbzpJ9IpbwGJGVbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNfSnv%2FdJMb9905Aqv%2FNat2tApbzpJ9IpbwGJGVbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;743&quot; height=&quot;901&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;901&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이해도부터&amp;nbsp;보면&amp;nbsp;냉정한&amp;nbsp;편이었다.&amp;nbsp;&quot;많이&amp;nbsp;어려웠다&quot;가&amp;nbsp;40%,&amp;nbsp;&quot;흐름은&amp;nbsp;이해했지만&amp;nbsp;직접&amp;nbsp;하려면&amp;nbsp;막막할&amp;nbsp;것&amp;nbsp;같다&quot;가&amp;nbsp;40%,&amp;nbsp;&quot;반&amp;nbsp;정도&amp;nbsp;이해했다&quot;가&amp;nbsp;20%였다.&amp;nbsp;&quot;개발&amp;nbsp;실전에&amp;nbsp;바로&amp;nbsp;투입된&amp;nbsp;느낌&quot;,&amp;nbsp;&quot;cmd라는&amp;nbsp;걸&amp;nbsp;처음&amp;nbsp;접했다&quot;,&amp;nbsp;&quot;기본&amp;nbsp;용어를&amp;nbsp;모르고&amp;nbsp;들어갔다&quot;는&amp;nbsp;피드백이&amp;nbsp;반복적으로&amp;nbsp;나왔다.&amp;nbsp;도구&amp;nbsp;장벽은&amp;nbsp;걷어냈지만,&amp;nbsp;그&amp;nbsp;아래에&amp;nbsp;개념&amp;nbsp;장벽이&amp;nbsp;남아&amp;nbsp;있었던&amp;nbsp;것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 그 어려움이 이탈로 이어지지 않았다. 오히려 참여자 전원(100%)이 다음 스터디에 참여하고 싶다고 답했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콘텐츠별로는&amp;nbsp;반응이&amp;nbsp;갈렸다.&amp;nbsp;가장&amp;nbsp;도움이&amp;nbsp;됐던&amp;nbsp;콘텐츠로는&amp;nbsp;Skill&amp;nbsp;업그레이드&amp;nbsp;라이브&amp;nbsp;시연(80%)이&amp;nbsp;가장&amp;nbsp;많이&amp;nbsp;꼽혔고,&amp;nbsp;Claude&amp;nbsp;Desktop&amp;nbsp;사용법(60%),&amp;nbsp;해외&amp;nbsp;마케터&amp;nbsp;사례(40%)가&amp;nbsp;뒤를&amp;nbsp;이었다.&amp;nbsp;추상적인&amp;nbsp;설명보다,&amp;nbsp;눈앞에서&amp;nbsp;무언가가&amp;nbsp;실제로&amp;nbsp;만들어지고&amp;nbsp;자라나는&amp;nbsp;걸&amp;nbsp;보여주는&amp;nbsp;쪽이&amp;nbsp;잘&amp;nbsp;전달됐다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;414&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZJOLO/dJMcafG0m10/4OQa0VJAwyY3Y8Vd2gDJv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZJOLO/dJMcafG0m10/4OQa0VJAwyY3Y8Vd2gDJv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZJOLO/dJMcafG0m10/4OQa0VJAwyY3Y8Vd2gDJv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZJOLO%2FdJMcafG0m10%2F4OQa0VJAwyY3Y8Vd2gDJv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;772&quot; height=&quot;414&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;414&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히&amp;nbsp;의미&amp;nbsp;있었던&amp;nbsp;건,&amp;nbsp;해외&amp;nbsp;사례가&amp;nbsp;동기&amp;nbsp;부여에&amp;nbsp;실제로&amp;nbsp;작동했다는&amp;nbsp;점이다.&amp;nbsp;한&amp;nbsp;응답자는&amp;nbsp;세션&amp;nbsp;후&amp;nbsp;&quot;전보다&amp;nbsp;훨씬&amp;nbsp;친근하게&amp;nbsp;느껴진다.&amp;nbsp;나도&amp;nbsp;쓸&amp;nbsp;수&amp;nbsp;있을&amp;nbsp;것&amp;nbsp;같다&quot;고&amp;nbsp;답했다.&amp;nbsp;1회차와&amp;nbsp;달리&amp;nbsp;이번에&amp;nbsp;새로&amp;nbsp;넣은&amp;nbsp;Austin&amp;middot;Sarah&amp;middot;Harold의&amp;nbsp;사례가&amp;nbsp;&quot;나도&amp;nbsp;해볼&amp;nbsp;수&amp;nbsp;있겠다&quot;는&amp;nbsp;감각으로&amp;nbsp;이어진&amp;nbsp;것이다.&amp;nbsp;이번&amp;nbsp;세션에서&amp;nbsp;가장&amp;nbsp;만들고&amp;nbsp;싶었던&amp;nbsp;결과가&amp;nbsp;바로&amp;nbsp;이거였다.&lt;br /&gt;&lt;br /&gt;물론&amp;nbsp;한계도&amp;nbsp;분명했다.&amp;nbsp;&quot;직접&amp;nbsp;실습하면서&amp;nbsp;배웠으면&amp;nbsp;더&amp;nbsp;친근했을&amp;nbsp;것&amp;nbsp;같다&quot;,&amp;nbsp;&quot;1부터&amp;nbsp;10까지&amp;nbsp;같이&amp;nbsp;보면서&amp;nbsp;교육받고&amp;nbsp;싶다&quot;,&amp;nbsp;&quot;기초&amp;nbsp;용어를&amp;nbsp;미리&amp;nbsp;알았으면&amp;nbsp;이해도가&amp;nbsp;높았을&amp;nbsp;것&quot;이라는&amp;nbsp;요청이&amp;nbsp;반복됐다.&amp;nbsp;사례와&amp;nbsp;시연으로&amp;nbsp;동경을&amp;nbsp;일으키는&amp;nbsp;데까지는&amp;nbsp;성공했지만,&amp;nbsp;그&amp;nbsp;동경을&amp;nbsp;'내가&amp;nbsp;직접&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있다'는&amp;nbsp;자신감으로&amp;nbsp;바꾸려면&amp;nbsp;결국&amp;nbsp;직접&amp;nbsp;손을&amp;nbsp;움직여보는&amp;nbsp;실습이&amp;nbsp;필요하다는&amp;nbsp;걸&amp;nbsp;다시&amp;nbsp;확인했다.&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;b&gt;1&amp;middot;2회차를&amp;nbsp;모두&amp;nbsp;끝낸&amp;nbsp;시점에서&amp;nbsp;배운&amp;nbsp;것&lt;/b&gt;&lt;b&gt;&lt;/b&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;b&gt;&quot;나도 해볼 수 있겠는데?&quot;라는 감각&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Claude에게 업무를 위임함으로써 정말 집중해야 할 일에 집중하는 작업 방식에 대한 동경&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것이&amp;nbsp;1&amp;middot;2회차를&amp;nbsp;통틀어&amp;nbsp;내가&amp;nbsp;가장&amp;nbsp;만들고&amp;nbsp;싶었던&amp;nbsp;결과였고,&amp;nbsp;이건&amp;nbsp;어느&amp;nbsp;정도&amp;nbsp;만들어낸&amp;nbsp;것&amp;nbsp;같다.&amp;nbsp;그런데&amp;nbsp;실제로&amp;nbsp;사람들이&amp;nbsp;Claude를&amp;nbsp;수족처럼&amp;nbsp;부리며&amp;nbsp;일하게&amp;nbsp;만드는&amp;nbsp;것은,&amp;nbsp;일회성&amp;nbsp;세션으로&amp;nbsp;끝낼&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;일이&amp;nbsp;아니었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 두 번을 다 진행하고 가장 명확하게 알게 된 것이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1회차에서 도구 장벽을 발견했고, 2회차에서 그 도구 장벽을 걷어냈더니 이번엔 개념 장벽이 남아 있었다.&lt;br /&gt;&lt;br /&gt;실제로 2회차 피드백에서도 이게 그대로 드러났다. 도구 장벽을 없앴는데도 세션을 완전히 이해한 사람은 0%였고, &quot;개발 실전에 바로 투입된 느낌&quot;, &quot;기본 용어를 모르고 들어갔다&quot;는 피드백이 있었다. 환경 설치라는 눈에 보이는 장벽 아래에, 용어와 개념이라는 또 다른 층이 있었던 것이다.&lt;br /&gt;&lt;br /&gt;원래는 두 번의 세미나 정도면 어느 정도 혼자서 시작할 수 있을 만큼의 윤곽이 잡힐거라고 막연히 생각했었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;599&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dQ8HdQ/dJMcadI3MD0/BNMcuEkStfVa4dShIix0LK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dQ8HdQ/dJMcadI3MD0/BNMcuEkStfVa4dShIix0LK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dQ8HdQ/dJMcadI3MD0/BNMcuEkStfVa4dShIix0LK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdQ8HdQ%2FdJMcadI3MD0%2FBNMcuEkStfVa4dShIix0LK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;801&quot; height=&quot;599&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;599&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&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;&lt;b&gt;내가 전달해준 마케팅용 Skill 30개에 대해 &quot;이거 어떻게 쓰는지 정리해서 공유해줄 수 있어요?&quot; 라고 질의&lt;/b&gt;&lt;/i&gt; 했다. 이 작업 자체는 어려운 것이 아니다. Claude 를 사용하여 아주 쉽게 요약본을 만들어줄 수 있다.&amp;nbsp;&lt;/p&gt;
&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;내가 만들고 싶었던 건 &quot;이 30개에 대한 정보와 어떻게 사용하는지에 대한 내용도 Claude한테 물어보면 알 수 있다&quot; 는 그 사고방식이었다. Claude 를 사용해서 문제해결을 하는 과정에 대해서.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 그 요약본을 Claude와의 질의를 통해 직접 받아보는 방법에 대해서 직접 보여주고 안내했지만,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;그래도 정리해주시면 좋을 것 같아요&quot; 라는 답이 돌아왔다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 좀 깨달은 것은, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;도구를 알려주는 것과 사고방식을 옮기는 것은 완전히 다른 일이다.&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;그리고 사고방식을 바꾸는건 한두 번의 세미나로 만들어줄 수 있는 게 아니었다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세미나를&amp;nbsp;시작하던&amp;nbsp;시점에는&amp;nbsp;&quot;AI&amp;nbsp;사용법을&amp;nbsp;알려주고&amp;nbsp;싶다&quot;까지였다면,&amp;nbsp;2회차&amp;nbsp;세미나를&amp;nbsp;거치면서&amp;nbsp;그&amp;nbsp;역할과&amp;nbsp;형태가&amp;nbsp;더&amp;nbsp;구체화된&amp;nbsp;것&amp;nbsp;같다.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://feelfreetothink.tistory.com/266&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AWS Summit&lt;/a&gt;에 다녀온 뒤로 전사의 AI 리터러시를 끌어올려야 한다고 대표님께 여러 번 말씀드렸고, 이 부분은 이미 설득이 된 상태였다. 세미나가 진행되면서 예상보다 사람들이 훨씬 관심을 보인다는 걸 회사에서도 느끼고 있었다. 그리고 나도 그 분위기를 느끼고 있었다. 그래서 스터디 진행을 제안하는 건 어렵지 않았다. 조금의 시간과 역할을 주면 책임지고 진행해보겠다고 제안했다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;이건&amp;nbsp;어떻게&amp;nbsp;보면&amp;nbsp;문화를&amp;nbsp;만들어나가는&amp;nbsp;일이라고&amp;nbsp;생각한다.&amp;nbsp;그리고&amp;nbsp;문화는&amp;nbsp;단&amp;nbsp;한&amp;nbsp;번으로&amp;nbsp;만들어지지&amp;nbsp;않는다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지속적으로&amp;nbsp;모이고,&amp;nbsp;막히고,&amp;nbsp;다시&amp;nbsp;풀어가는&amp;nbsp;과정이&amp;nbsp;쌓여야&amp;nbsp;비로소&amp;nbsp;만들어진다.&amp;nbsp;무엇보다&amp;nbsp;문화는&amp;nbsp;개인이&amp;nbsp;혼자&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;게&amp;nbsp;아니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그&amp;nbsp;과정에&amp;nbsp;내가&amp;nbsp;조금이나마&amp;nbsp;기여할&amp;nbsp;수&amp;nbsp;있다고&amp;nbsp;생각하니&amp;nbsp;두근거리기도&amp;nbsp;하고,&amp;nbsp;잘&amp;nbsp;해내고&amp;nbsp;싶다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;자료&lt;/b&gt;&lt;/h4&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://app.notion.com/p/AI-Agent-2-380ecebbc89e8083b697cbe8c0722554&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;notion : AI Agent - 2차 세미나 참고자료 &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;github : &lt;a href=&quot;https://github.com/HAN-SEOHYUN/claude-hands-on-skills&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/HAN-SEOHYUN/claude-hands-on-skills&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>sian han</author>
      <guid isPermaLink="true">https://feelfreetothink.tistory.com/268</guid>
      <comments>https://feelfreetothink.tistory.com/268#entry268comment</comments>
      <pubDate>Mon, 15 Jun 2026 17:46:24 +0900</pubDate>
    </item>
    <item>
      <title>[AX] 비개발자 팀을 위한 첫 Claude Hands-on, 그리고 내가 놓친 것들</title>
      <link>https://feelfreetothink.tistory.com/267</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;AWS Summit 2026&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS Summit Seoul 2026에서 여러 세션들을 들은 후, 팀 전체의 AI 활용 능력을 높이는 것이 현재 가진 많은 문제들을 가장 효과적으로 해결할 수 있는 방법이라는 생각을 했다. 이에 대한 배경은 &lt;a title=&quot;이전글&quot; href=&quot;https://feelfreetothink.tistory.com/266&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;이전글&lt;/a&gt;에서 자세히 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사에 의견을 공유한 후, 전사 대상 2회 세미나를 진행할 기회를 얻었다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;661&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kEZke/dJMcacckz3U/VNyLdsahaobihNKOi0nkLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kEZke/dJMcacckz3U/VNyLdsahaobihNKOi0nkLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kEZke/dJMcacckz3U/VNyLdsahaobihNKOi0nkLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkEZke%2FdJMcacckz3U%2FVNyLdsahaobihNKOi0nkLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;559&quot; height=&quot;661&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;661&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;첫 세미나를 준비하여 나침반이 되어준 글&lt;/b&gt;&lt;/h3&gt;
&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;AX Voyage 2026&quot; href=&quot;https://blog.gangnamunni.com/post/ax-voyage-2026&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AX Voyage 2026&lt;/a&gt; 라는 글이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 조직 전체가AI 를 도입하고 활용해 나가는 과정을 풀어낸다. &lt;b&gt;나의 첫 세미나를 준비하면서 내가 고민했던 거의 모든 결정이 이 글에서 출발했다&lt;/b&gt;. 같은 맥락의 내용을 담은 &lt;a href=&quot;http://youtube.com/watch?v=q60uZq14aoo&amp;amp;t=1s&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;인터뷰 youtube 영상&lt;/a&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;b&gt;세미나의 구성을 결정하기까지&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 이 세미나에서 가장 만들고 싶었던 결과는 두 가지였다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&quot;나도 해볼 수 있겠는데 ?&quot; 라는 감각&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;글에서 &lt;b&gt;&quot;쟤도 했다 = 나도 할 수 있겠다&quot;&lt;/b&gt;의 문법은 어떤 교육보다 강력하다&quot; 라고 설명하는 부분이 있다. 정교한 기술 설명이 아니라, &quot;어, 저 정도면 나도 ?&quot; 하는 &lt;b&gt;심리적 문턱을 낮추는 것&lt;/b&gt;이 무엇보다 중요할거라고 생각했다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AI 를 수족처럼 사용하는 것에 대한 동경&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;&quot;사람들에게 배 만드는 법을 가르치고 싶으면, 배 만드는 매뉴얼을 들이밀지 말고 바다를 동경하게 하라&quot;&amp;nbsp;&lt;/b&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;단순히 Claude 의 사용법 : Skill 이 무엇인지, Chat/Cowork/Code 가 무엇인지 등을 설명하는 것은 첫 세미나에서는 적절하지 않다고 판단했다. 직접 손으로 뭔가를 만들어보고,&lt;b&gt; &quot;아, 이런게 되는구나 ! 나도 충분히 이런걸 만들 수 있구나 !&quot;&lt;/b&gt; 를 느끼는 경험이 가장 빠른 길이라고 봤다. 그래서&amp;nbsp;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Hands-on&amp;nbsp;형식으로&amp;nbsp;기획&lt;/b&gt;&lt;/span&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;b&gt;첫 Hands-on 에서 만들기로 결정한 것&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;세미나에서 진행한 Hands-On 내용은&lt;/span&gt; &lt;a href=&quot;https://github.com/HAN-SEOHYUN/claude-hands-on-skills&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Github 실습 폴더&lt;/a&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;에서 확인해보실 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다같이 만들 것은 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;네이버 파워링크 광고 순위 확인 도구&lt;/b&gt;&lt;/span&gt;로 정했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 도구는 팀에서 이미 필요하다는 이야기가 나왔었지만, 우선순위가 높은 개발 feature 가 잔뜩 쌓여서 미뤄지기만 했던 기능이었다.&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;형식은 Skill 하나를 같이 만들어보는 걸로 정했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 의도가 있었다. &quot;&lt;b&gt;Skill 만드는 게 진짜 어려운 게 아니다&lt;/b&gt;&quot;를 보여주고 싶었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI Agent로 뭔가를 만든다고 하면 거창하게 느껴지지만, 실제로는 마크다운 파일 하나로 시작할 수 있다는 걸 손으로 확인하게 하고 싶었다.&amp;nbsp;그&lt;b&gt;래서&amp;nbsp;Skill을&amp;nbsp;더&amp;nbsp;쉽게&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;도와주는&amp;nbsp;Skill&amp;nbsp;두&amp;nbsp;개를&amp;nbsp;미리&amp;nbsp;준비해뒀다.&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;/sharpen&lt;/b&gt; : 막연한 아이디어를 명확한 요구사항 명세서로 다듬어주는 Skill&lt;/li&gt;
&lt;li&gt;&lt;b&gt;/productify&lt;/b&gt; : 명세서를 받아서 어떤 형태로 만들지(Skill인지, 스크립트인지) 결정해주는 Skill&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건&amp;nbsp;김윤혁님이&amp;nbsp;공유해주신&amp;nbsp;자료에서&amp;nbsp;가져왔다(귀한&amp;nbsp;자료&amp;nbsp;공유해주셔서&amp;nbsp;정말X100&amp;nbsp;감사합니다&amp;nbsp;ㅠㅠ)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용자가&amp;nbsp;요구사항을&amp;nbsp;명확하게&amp;nbsp;정의하는&amp;nbsp;게&amp;nbsp;어렵다는&amp;nbsp;걸&amp;nbsp;알았기&amp;nbsp;때문에,&amp;nbsp;이&amp;nbsp;부분&amp;nbsp;자체를&amp;nbsp;AI가&amp;nbsp;도와주도록&amp;nbsp;설계된&amp;nbsp;Skill이었다.&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;그리고&amp;nbsp;만에&amp;nbsp;하나&amp;nbsp;시간&amp;nbsp;안에&amp;nbsp;완성하지&amp;nbsp;못하는&amp;nbsp;분들을&amp;nbsp;위한&amp;nbsp;대비도&amp;nbsp;했다.&amp;nbsp;&lt;b&gt;Git 저장소에 두 개의 브랜치를 준비해뒀다&lt;/b&gt; (세션의 목표가 &quot;직접 만들어보는 경험&quot;이긴 했지만, 못 만든다고 해서 빈손으로 돌아가게 하고 싶지 않았다)&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;handson 브랜치&lt;/b&gt; : 실습용. 처음부터 같이 만들어 나가는 출발점&lt;/li&gt;
&lt;li&gt;&lt;b&gt;main 브랜치&lt;/b&gt; : 완성본. 실습이 막히더라도 main으로 이동하면 동작하는 결과물을 바로 써볼 수 있게 해둠&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;b&gt;Hands-on 기술 스택 선택 :&amp;nbsp;Claude&amp;nbsp;Code&amp;nbsp;+&amp;nbsp;VS&amp;nbsp;Code&amp;nbsp;+&amp;nbsp;터미널&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 결정이 나중에 가장 큰 실수로 돌아왔다.&lt;br /&gt;나는 Claude Desktop 보다 &lt;b&gt;Claude Code&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;Skill을 만들고 확인하는 게 훨씬 쉽다&lt;/li&gt;
&lt;li&gt;내가 만들어둔 Skill들이 GitHub에 있어서 `git clone`으로 바로 받을 수 있다
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;실습 중 skill 만들기에 실패할 경우 main 브랜치로 이동하여 완성된 skill 을 사용해볼 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;GitHub 중심의 Claude Code 생태계와 잘 맞는다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 그동안 참석했던 개발자 Hands-on 들이 대부분 이런 방식이었다. 미리 준비된 저장소를 clone 받고, 브랜치를 따라가면서 단계별로 실습하는 흐름. 내 입장에서는 이게 가장 따라가기 쉬운 방식이었고, 막혔을 때 다음 브랜치로 넘어가서 계속 진행할 수 있다는 점이 특히 좋았다. 그래서 이번 세션도 자연스럽게 같은 방식으로 설계했다 (빅 미스테잌 ,,)&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;b&gt;Hands-on 구성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션은 크게 세 파트로 나눴고, 발표 자료는 Notion 으로 준비했다.&amp;nbsp;&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;b&gt;Part&amp;nbsp;1.&amp;nbsp;왜&amp;nbsp;AI인가&amp;nbsp;&amp;mdash;&amp;nbsp;기술이&amp;nbsp;아니라&amp;nbsp;태도에&amp;nbsp;대한&amp;nbsp;이야기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두&amp;nbsp;가지를&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를&amp;nbsp;잘&amp;nbsp;활용하는&amp;nbsp;사람은&amp;nbsp;기술을&amp;nbsp;잘&amp;nbsp;아는&amp;nbsp;사람이&amp;nbsp;아니라,&amp;nbsp;문제를&amp;nbsp;잘&amp;nbsp;정의하는&amp;nbsp;사람이다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AI 는 결국 위임이고, 위임을 잘 하려면
&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;/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;AE 분들과 대화하면서 느낀 건, 이미 문제가 뭔지 알고 어떻게 해결해야 할지도 어느 정도 알고 계신다는 것. 그러니 AI 활용법만 조금 더해지면 충분히 효율적으로 일할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;568&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qZYcq/dJMcabxHzYg/uWAbPI6ykMKVIDd2S8hlX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qZYcq/dJMcabxHzYg/uWAbPI6ykMKVIDd2S8hlX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qZYcq/dJMcabxHzYg/uWAbPI6ykMKVIDd2S8hlX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqZYcq%2FdJMcabxHzYg%2FuWAbPI6ykMKVIDd2S8hlX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;887&quot; height=&quot;568&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;568&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;704&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/txZsc/dJMcaicBzAq/wseeYhDLBo40TByrsTNAUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/txZsc/dJMcaicBzAq/wseeYhDLBo40TByrsTNAUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/txZsc/dJMcaicBzAq/wseeYhDLBo40TByrsTNAUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtxZsc%2FdJMcaicBzAq%2FwseeYhDLBo40TByrsTNAUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;984&quot; height=&quot;704&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;704&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;그리고&amp;nbsp;&amp;mdash;&amp;nbsp;&quot;꼭&amp;nbsp;해야&amp;nbsp;한다&quot;고&amp;nbsp;말하고&amp;nbsp;싶지&amp;nbsp;않았다&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;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;AI를 사용하지 않으면 비효율적으로 일하는 거다, &lt;br /&gt;AI를 쓰는 사람과 안 쓰는 사람은 앞으로 더 격차가 벌어질 거다&lt;br /&gt;&amp;mdash; 오늘 이런 얘기는 하지 않겠습니다 !!!&lt;/span&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;어디서든&amp;nbsp;AI&amp;nbsp;관련&amp;nbsp;기술을&amp;nbsp;안&amp;nbsp;쓰면&amp;nbsp;큰일&amp;nbsp;난다는&amp;nbsp;식의&amp;nbsp;이야기가&amp;nbsp;너무&amp;nbsp;많다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;솔직히 나도 그런 메시지에 좀 지쳐 있는 상태였다(AI 라는 단어가 이젠 좀 징그럽기도 하다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션을 준비하면서 가장 경계한 게 이거였다. 나도 싫어하는 말을 말을 굳이 다른 사람에게 하고 싶지 않았다.&lt;/p&gt;
&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;AI 활용이 누군가에게는 빠르게 와닿을 수 있지만, 다른 누군가에게는 조금 더 시간이 필요한 일일 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 톤을 이렇게 잡았다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;오늘은 그냥 가볍게 ! 쟤가 무슨 말 하는지 들어나 보자 ~ &lt;br /&gt;그냥 가볍게 찍먹해 보자, 하는 마음으로 임해주셨으면 좋겠습니다.&lt;/span&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;p data-ke-size=&quot;size16&quot;&gt;이 메시지를 처음에 명확하게 깔아둔 이유는, 압박감을&amp;nbsp;느끼는&amp;nbsp;상태에서는&amp;nbsp;어떤&amp;nbsp;내용도&amp;nbsp;제대로&amp;nbsp;들어오지&amp;nbsp;않는다고&amp;nbsp;생각했기&amp;nbsp;때문이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;지금&amp;nbsp;안&amp;nbsp;하면&amp;nbsp;큰일&amp;nbsp;난다&quot;는&amp;nbsp;분위기에서&amp;nbsp;학습이&amp;nbsp;일어나기는&amp;nbsp;어렵다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그보다는&amp;nbsp;부담을&amp;nbsp;내려놓은&amp;nbsp;상태에서&amp;nbsp;한두&amp;nbsp;가지라도&amp;nbsp;자기&amp;nbsp;것으로&amp;nbsp;가져갈&amp;nbsp;수&amp;nbsp;있다면&amp;nbsp;그게&amp;nbsp;훨씬&amp;nbsp;더&amp;nbsp;가치&amp;nbsp;있다고&amp;nbsp;봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Part 2. 데모 먼저 &amp;mdash; &quot;이게 되는구나&quot;부터 보여주기&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이론을&amp;nbsp;끝낸&amp;nbsp;직후,&amp;nbsp;바로&amp;nbsp;&lt;b&gt;완성된&amp;nbsp;Skill을&amp;nbsp;시연&lt;/b&gt;했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;808&quot; data-origin-height=&quot;459&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqxASb/dJMcagMCGYo/Vhg5KosuAlpN6dKPkipVQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqxASb/dJMcagMCGYo/Vhg5KosuAlpN6dKPkipVQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqxASb/dJMcagMCGYo/Vhg5KosuAlpN6dKPkipVQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqxASb%2FdJMcagMCGYo%2FVhg5KosuAlpN6dKPkipVQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;808&quot; height=&quot;459&quot; data-origin-width=&quot;808&quot; data-origin-height=&quot;459&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1781004154775&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/naver-ad-rank 비염치료기 / 무선 비염치료기, 노즈굿&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;이 한 줄을 입력하면 Claude가 네이버 파워링크 광고 순위를 가져와서 알려주는 모습을 보여줬다.&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;&quot;내가 두 시간 뒤에 완성할 수 있는 것&quot; 을 미리 눈으로 볼 수 있게 했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;b&gt;Part&amp;nbsp;3.&amp;nbsp;환경&amp;nbsp;설정&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Node.js,&amp;nbsp;Git,&amp;nbsp;Claude&amp;nbsp;Code&amp;nbsp;설치&amp;nbsp;및&amp;nbsp;로그인.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;준비한&amp;nbsp;GitHub&amp;nbsp;저장소를&amp;nbsp;clone&amp;nbsp;받고,&amp;nbsp;`handson`&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;브랜치로&amp;nbsp;이동시키는&amp;nbsp;것까지가&amp;nbsp;이&amp;nbsp;단계의&amp;nbsp;목표였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;b&gt;Part&amp;nbsp;4.&amp;nbsp;직접&amp;nbsp;만들기&amp;nbsp;&amp;mdash;&amp;nbsp;Skill을&amp;nbsp;Skill로&amp;nbsp;만든다&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이&amp;nbsp;파트가&amp;nbsp;이번&amp;nbsp;세션에서&amp;nbsp;보여주고&amp;nbsp;싶었던&amp;nbsp;핵심이었다.&amp;nbsp;흐름은&amp;nbsp;이렇게&amp;nbsp;짰다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;1단계.&amp;nbsp;MVP&amp;nbsp;개념&amp;nbsp;공유&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nL14J/dJMcacDrTI3/6n988ySukpMzMTlmMxSPm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nL14J/dJMcacDrTI3/6n988ySukpMzMTlmMxSPm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nL14J/dJMcacDrTI3/6n988ySukpMzMTlmMxSPm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnL14J%2FdJMcacDrTI3%2F6n988ySukpMzMTlmMxSPm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;841&quot; height=&quot;748&quot; data-origin-width=&quot;841&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;&lt;br /&gt;&quot;네이버&amp;nbsp;광고&amp;nbsp;1위를&amp;nbsp;유지한다&quot;는&amp;nbsp;&lt;b&gt;큰&amp;nbsp;목표를&amp;nbsp;그대로&amp;nbsp;만들려고&amp;nbsp;하면&amp;nbsp;끝이&amp;nbsp;없다는&amp;nbsp;걸&amp;nbsp;먼저&amp;nbsp;짚었다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;업무를 작은 단위로 쪼개&lt;/b&gt;고, 작게 시작해서 동작하는 걸 확인하는 게 먼저라는 메세지를 전달하고 싶었다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;2단계. SKILL.md 구조 보여주기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude의 Skill은 .claude/skills/ 폴더 안에 SKILL.md 파일 하나로 만들어진다는 걸 보여줬다. (마크다운 파일 하나면 된다 !)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Skill 이 사실 거창한 게 아니라는 걸 시각적으로 확인하게 하는 게 목표였다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;3단계. /sharpen으로 아이디어 다듬기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서부터가&amp;nbsp;이번&amp;nbsp;세션의&amp;nbsp;가장&amp;nbsp;보여주고&amp;nbsp;싶었던&amp;nbsp;흐름이었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아이디어를 다듬는 것은 /sharpen 스킬과 함께라면 아래와 같이 막연한 한 줄로 시작할 수 있다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1781004512730&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;네이버 파워링크 광고 순위를 확인하고 싶습니다. 
키워드와 내 광고 제목을 입력하면 현재 몇 위인지 알려주는 것을 만들고 싶어요. /sharpen&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;/sharpen이&amp;nbsp;문답으로&amp;nbsp;누가,&amp;nbsp;왜,&amp;nbsp;어떤&amp;nbsp;조건에서,&amp;nbsp;어디까지를&amp;nbsp;묻기&amp;nbsp;시작한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;몇&amp;nbsp;번의&amp;nbsp;대화만으로&amp;nbsp;막연했던&amp;nbsp;아이디어가&amp;nbsp;명확한&amp;nbsp;요구사항&amp;nbsp;명세서로&amp;nbsp;정리되는&amp;nbsp;과정&lt;/b&gt;을 직접 보여주고, 경험할 수 있게 했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;4단계. /productify로 형태 결정하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;/sharpen&lt;/b&gt;이&amp;nbsp;만든&amp;nbsp;명세서를&amp;nbsp;/productify에&amp;nbsp;넘긴다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 skill 은 명세서를 받아서 &quot;이걸 Claude Skill로 만들지, 파이썬 스크립트로 만들지, 단계별 로드맵은 어떻게 가져갈지&quot;를 결정해주는 역할을 한다.&amp;nbsp;&lt;b&gt;가장&amp;nbsp;작은&amp;nbsp;형태로&amp;nbsp;시작할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;범위를&amp;nbsp;잡아준다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;407&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PYPKI/dJMb9901hPA/IIve2GdFsAUfukTTf8T46K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PYPKI/dJMb9901hPA/IIve2GdFsAUfukTTf8T46K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PYPKI/dJMb9901hPA/IIve2GdFsAUfukTTf8T46K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPYPKI%2FdJMb9901hPA%2FIIve2GdFsAUfukTTf8T46K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;631&quot; height=&quot;407&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;407&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;5단계. 실제 Skill 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/productify가&amp;nbsp;결정한&amp;nbsp;형태대로&amp;nbsp;실제&amp;nbsp;SKILL.md가&amp;nbsp;만들어진다.&amp;nbsp;즉,&amp;nbsp;Skill을&amp;nbsp;만드는&amp;nbsp;데&amp;nbsp;Skill을&amp;nbsp;사용하는&amp;nbsp;흐름이었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI Agent로 뭔가를 만든다는 게 거창하게 느껴질 수 있지만, &lt;b&gt;결국 대화 몇 번이면 목표 지점에 도달할 수 있다는 걸 손으로 확인하게 하고 싶었다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;6단계. 만든 Skill 사용해보기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;마지막으로,&amp;nbsp;방금&amp;nbsp;만든&amp;nbsp;Skill을&amp;nbsp;직접&amp;nbsp;실행해보고&amp;nbsp;동작하는지&amp;nbsp;확인한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에&amp;nbsp;보여줬던&amp;nbsp;데모와&amp;nbsp;같은&amp;nbsp;결과가,&amp;nbsp;이번엔&amp;nbsp;본인이&amp;nbsp;만든&amp;nbsp;Skill로&amp;nbsp;나오는&amp;nbsp;순간이&amp;nbsp;이&amp;nbsp;세션의&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;b&gt;진행하고 나서&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;솔직히 말하면, Part 2. 환경 설정에서 무너졌다 !&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음&amp;nbsp;환경&amp;nbsp;설치에만&amp;nbsp;40~50분이&amp;nbsp;걸렸고,&amp;nbsp;진행이&amp;nbsp;막힌&amp;nbsp;분들이&amp;nbsp;있었지만&amp;nbsp;모두&amp;nbsp;해결하고&amp;nbsp;갈&amp;nbsp;수&amp;nbsp;없다고&amp;nbsp;판단되어&amp;nbsp;설명은&amp;nbsp;계속&amp;nbsp;이어졌다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나중에&amp;nbsp;피드백으로&amp;nbsp;들은&amp;nbsp;말이&amp;nbsp;&quot;제가&amp;nbsp;진행하는&amp;nbsp;과정은&amp;nbsp;멈춰있는데&amp;nbsp;설명은&amp;nbsp;이어나가셔서&amp;nbsp;혼동이&amp;nbsp;있었다&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;근본 원인은, 내가 개발자 입장에서 &quot;&lt;i&gt;&lt;b&gt;이 정도면 쉬울 것&quot;이라고 판단한 방식이, 사실은 전혀 쉬운 게 아니었다&lt;/b&gt;&lt;/i&gt;. 미리 준비된 저장소를 clone 받고 브랜치로 이동하는 흐름은 내가 그동안 좋다고 느꼈던 방식이었지만, 그 판단의 기준 자체가 이미 개발자 중심이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비개발자 입장에서는 그 흐름의 어떤 부분도 자연스럽지 않을 수 있다는 걸 처음부터 인지하면 좋았을텐데..&amp;nbsp;&lt;/p&gt;
&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;blockquote data-ke-style=&quot;style2&quot;&gt;그래서 &quot;VS&amp;nbsp;Code랑&amp;nbsp;터미널이&amp;nbsp;어떻게&amp;nbsp;다른&amp;nbsp;건가요?&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;이&amp;nbsp;질문을&amp;nbsp;받은&amp;nbsp;순간&amp;nbsp;좀&amp;nbsp;띵했다.&amp;nbsp;완전히&amp;nbsp;잘못&amp;nbsp;설계했구나&amp;nbsp;싶었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는&amp;nbsp;세션&amp;nbsp;초반에&amp;nbsp;&quot;VS&amp;nbsp;Code는&amp;nbsp;텍스트&amp;nbsp;편집기예요&quot;라고&amp;nbsp;짧게&amp;nbsp;설명하고&amp;nbsp;넘어갔는데,&amp;nbsp;그게&amp;nbsp;전혀&amp;nbsp;와닿지&amp;nbsp;않았던&amp;nbsp;거다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서&amp;nbsp;세션이&amp;nbsp;다&amp;nbsp;끝나고&amp;nbsp;나서야&amp;nbsp;이&amp;nbsp;질문이&amp;nbsp;나온&amp;nbsp;거였고.&lt;/p&gt;
&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;환경 설정도, Skill 만들기도, 결국 어디서 무엇을 하는 건지 명확히 잡히지 않은 상태에서 진행됐던 거다.&lt;/p&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회차부터는 Claude Desktop으로 전환하여 설명하도록 계획을 변경했다.&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;b&gt;피드백으로 보는 1차 Hands-on&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전반적 만족도: 평균 4.7점 / 5점&lt;/li&gt;
&lt;li&gt;어려웠던 부분: 3명 중 2명이 환경 설정, 1명이 &quot;스킬이 뭔지 이해하기&quot;&lt;/li&gt;
&lt;li&gt;다음 세션 참여 의사: 3명 중 2명 &quot;네, 이미 써볼 업무가 떠올랐어요&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;의도한&amp;nbsp;메시지가&amp;nbsp;통했던&amp;nbsp;지점&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;&quot;문답&amp;nbsp;방식의&amp;nbsp;AI만&amp;nbsp;보다가&amp;nbsp;처음&amp;nbsp;보는&amp;nbsp;형식의&amp;nbsp;AI&amp;nbsp;사용&amp;nbsp;방식이&amp;nbsp;신선해서&amp;nbsp;기억에&amp;nbsp;남습니다.&quot;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;이건&amp;nbsp;Part&amp;nbsp;4에서&amp;nbsp;보여주려던&amp;nbsp;흐름이&amp;nbsp;그대로&amp;nbsp;닿았다는&amp;nbsp;신호였다.&amp;nbsp;챗봇처럼&amp;nbsp;묻고&amp;nbsp;답하는&amp;nbsp;게&amp;nbsp;전부가&amp;nbsp;아니라,&amp;nbsp;명령어&amp;nbsp;한&amp;nbsp;줄로&amp;nbsp;동작하는&amp;nbsp;도구를&amp;nbsp;직접&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있다는&amp;nbsp;감각.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&quot;AI가 요구사항을 구체화 하는 과정에서 질문사항의 퀄리티가 높아서 잘 사용하면 업무에 많은 도움이 되겠다라고 생각되었습니다.&quot;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;이 응답이 개인적으로 가장 반가웠다. Part 1에서 &quot;AI를 잘 활용한다는 건 문제를 잘 정의하는 것&quot;이라고 말로 했지만, 그건 사실 말로 해서는 잘 안 와닿는 부분이다. 근데 `/sharpen`이 직접 문답하면서 막연한 요구사항을 다듬어가는 모습을 보면서 그 메시지를 참여자가 직접 체감한 거였다.&amp;nbsp;&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;size18&quot;&gt;&lt;b&gt;의도한&amp;nbsp;메시지가&amp;nbsp;통하지&amp;nbsp;않은&amp;nbsp;지점&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;&quot;오늘&amp;nbsp;가장&amp;nbsp;어려웠던&amp;nbsp;부분:&amp;nbsp;스킬이&amp;nbsp;뭔지&amp;nbsp;이해하기&quot;&lt;/li&gt;
&lt;li&gt;&quot;&lt;b&gt;개발&amp;nbsp;기초&amp;nbsp;지식&lt;/b&gt;이&amp;nbsp;없어&amp;nbsp;스킬이라는&amp;nbsp;자체를&amp;nbsp;어떻게&amp;nbsp;만들어야&amp;nbsp;할지&amp;nbsp;어렵게&amp;nbsp;느껴집니다.&amp;nbsp;다른&amp;nbsp;사람이&amp;nbsp;만든&amp;nbsp;걸&amp;nbsp;복사&amp;nbsp;붙여넣기&amp;nbsp;한다고&amp;nbsp;해도&amp;nbsp;어디를&amp;nbsp;커스텀,&amp;nbsp;수정하면&amp;nbsp;내&amp;nbsp;스킬로&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있을지&amp;nbsp;모르겠습니다.&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 환경 설정 문제보다 더 본질적인 실패였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 세션의 가장 큰 의도가 &quot;Skill 만드는 게 어렵지 않다&quot;를 보여주는 거였는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정작 한 분은 Skill 개념 자체가 손에 잡히지 않은 채로 세션이 끝났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원인을&amp;nbsp;돌이켜보면,&amp;nbsp;&lt;b&gt;환경&amp;nbsp;설정에서&amp;nbsp;시간을&amp;nbsp;너무&amp;nbsp;많이&amp;nbsp;쓴&amp;nbsp;영향이&amp;nbsp;컸다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정작&amp;nbsp;핵심이었던&amp;nbsp;Part&amp;nbsp;4에&amp;nbsp;도달할&amp;nbsp;즈음에는&amp;nbsp;&lt;b&gt;이미&amp;nbsp;집중력이&amp;nbsp;흩어진&amp;nbsp;상태&lt;/b&gt;였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과적으로 Skill을 만드는 과정이 참여자가 따라오는 속도보다 빠르게 흘러갔고, &quot;이게 어떻게 동작하는 건지&quot;를 충분히 짚어주지 못했다.&lt;br /&gt;&lt;br /&gt;준비할 때 가장 보여주고 싶었던 것이 정작 가장 덜 전달된 부분이 됐다는 게 아쉬웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 환경 설정 설치가 오래 걸린 것 보다, 가장 중요한 대목인 Part 4 에 도달할 에너지를 깎아먹은 게 문제였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&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;b&gt;준비하면서&amp;nbsp;배운&amp;nbsp;것&lt;/b&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;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;나한테 당연한 것들이 상대방에겐 전혀 당연하지 않았다. 터미널, 영어 에러 메시지, VS Code와 터미널의 차이. 이걸 처음에 몰랐다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;첫 번째 시도는 언제나 뭔가를 잘못 전제하고 있다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;1회차에서 명확하게 틀린 지점이 드러났다. 이 경험이 없었다면 2회차도 같은 방식으로 갔을 거다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결국 첫 시도가 가지는 가치는 &quot;어디가 안 통하는지&quot;를 알게 되는 거였다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;준비를 10시간이나 했음에도 환경 설정에서 무너진 게 속상하긴 하다..&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇지만 이런건 14시간을 더 써서 시뮬레이션을 돌렸봤어도 혼자서는 알 수 없었을 부분이라고 생각한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제&amp;nbsp;사람을&amp;nbsp;앞에&amp;nbsp;두고&amp;nbsp;진행해봐야만&amp;nbsp;보이는&amp;nbsp;것들이&amp;nbsp;있었다.&lt;/p&gt;
&lt;p data-ke-size=&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;b&gt;앞으로&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2회차에서는 기술 스택을 전부 바꿨다. 터미널과 VS Code, Git을 모두 빼고 &lt;b&gt;Claude Desktop으로 간다 ! &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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>sian han</author>
      <guid isPermaLink="true">https://feelfreetothink.tistory.com/267</guid>
      <comments>https://feelfreetothink.tistory.com/267#entry267comment</comments>
      <pubDate>Tue, 9 Jun 2026 20:58:25 +0900</pubDate>
    </item>
    <item>
      <title>[AX] AWS Summit 2026 참여 후 회사에 제안한 것</title>
      <link>https://feelfreetothink.tistory.com/266</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2206&quot; data-origin-height=&quot;1152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Os7zg/dJMcadPLRak/uc4A852QxhRdtWSYRLIdpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Os7zg/dJMcadPLRak/uc4A852QxhRdtWSYRLIdpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Os7zg/dJMcadPLRak/uc4A852QxhRdtWSYRLIdpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOs7zg%2FdJMcadPLRak%2Fuc4A852QxhRdtWSYRLIdpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2206&quot; height=&quot;1152&quot; data-origin-width=&quot;2206&quot; data-origin-height=&quot;1152&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 사내 AI 세미나 진행 요청&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Summit에서 보니 규모 있는 기업들은 저마다 완성도 높은 AI 에이전트를 선보이고 있었다. 우리 회사도 &lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;내부 업무용 AI 에이전트&lt;/span&gt;&lt;/b&gt;를 개발하고 있는데, 이제 막 &lt;b&gt;v0.0.0.0.0.1&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;AWS Summit 2026 의 다양한 세션에서 우리 회사가 궁극적으로 목표로 하는 AI 에이전트들을 소개했고 그 수준에 도달하기까지 얼마나 많은 시행착오가 있었는지도 엿볼 수 있었다. &lt;br /&gt;&lt;br /&gt;공통적으로&amp;nbsp;강조하는&amp;nbsp;메시지는&amp;nbsp;&lt;b&gt;작은&amp;nbsp;것부터&amp;nbsp;빠르게&amp;nbsp;시작하라는&amp;nbsp;것&lt;/b&gt;이다.&amp;nbsp;크고&amp;nbsp;거창한&amp;nbsp;시스템을&amp;nbsp;구상하기보다,&amp;nbsp;당면한&amp;nbsp;문제를&amp;nbsp;조금이라도&amp;nbsp;해결하는&amp;nbsp;데&amp;nbsp;집중하는&amp;nbsp;것이&amp;nbsp;AI&amp;nbsp;도입의&amp;nbsp;핵심&amp;nbsp;원칙이라고&amp;nbsp;한다.&amp;nbsp;여러&amp;nbsp;연사가&amp;nbsp;공통적으로&amp;nbsp;전한&amp;nbsp;이&amp;nbsp;메시지가&amp;nbsp;가장&amp;nbsp;깊이&amp;nbsp;와닿았다. &lt;br /&gt;&lt;br /&gt;우리 회사에서 개발 중인 AI 에이전트를 점검해봤다. 이제 막 첫발을 뗀 이 에이전트가 지금 당장 해결할 수 있는 문제는 무엇일까. 현재 리소스(개발자 1명 / 경력 2년차) 로 앞서 본 수준의 결과물을 만들어내려면 얼마나 걸릴까.(ㅠㅠ)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;AI&amp;nbsp;에이전트가&amp;nbsp;등장하게&amp;nbsp;된&amp;nbsp;본질을&amp;nbsp;다시&amp;nbsp;떠올려봤다&lt;/b&gt;.&amp;nbsp;애초의&amp;nbsp;목적은&amp;nbsp;마케터들의&amp;nbsp;반복&amp;nbsp;업무를&amp;nbsp;줄여&amp;nbsp;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;인당&amp;nbsp;생산성&lt;/b&gt;&lt;/span&gt;을 높이는 것이었다. 그렇다면 지금 우리는 당장 해결할 수 있는 것에 집중하고 있는가? 아니면 여전히 거창한 미래를 바라보고 있는가? 솔직히 말하면 후자다. &lt;br /&gt;현재의&amp;nbsp;AI&amp;nbsp;에이전트가&amp;nbsp;실제&amp;nbsp;운영&amp;nbsp;가능한&amp;nbsp;수준에&amp;nbsp;이르기까지는&amp;nbsp;아직&amp;nbsp;상당한&amp;nbsp;시간이&amp;nbsp;필요하다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;인당&amp;nbsp;생산성&amp;nbsp;향상&lt;/b&gt;이라는&amp;nbsp;본질에&amp;nbsp;집중해보면,&amp;nbsp;현재&amp;nbsp;이&amp;nbsp;문제를&amp;nbsp;가장&amp;nbsp;효과적으로&amp;nbsp;해결할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;방법은&amp;nbsp;&lt;i&gt;팀원들이&amp;nbsp;AI&amp;nbsp;에이전트를&amp;nbsp;자유자재로&amp;nbsp;활용할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;되는&amp;nbsp;것&lt;/i&gt;이라고 생각했다. AI 에이전트 개발은 계속 이어가되, 그와 동시에 팀 전체의 AI 리터러시를 높이는 것이 필요하다는 결론에 이르렀다. &lt;br /&gt;&lt;br /&gt;사실&amp;nbsp;이런&amp;nbsp;생각은&amp;nbsp;이전부터&amp;nbsp;갖고&amp;nbsp;있었고,&amp;nbsp;이번&amp;nbsp;Summit을&amp;nbsp;다녀오며&amp;nbsp;더욱&amp;nbsp;확고해졌다.&amp;nbsp;그래서&amp;nbsp;이번에도&amp;nbsp;AX&amp;nbsp;관련&amp;nbsp;세션을&amp;nbsp;중심으로&amp;nbsp;선택했다.&amp;nbsp;내가&amp;nbsp;들은&amp;nbsp;세션의&amp;nbsp;기업들은&amp;nbsp;하나같이&amp;nbsp;AX&amp;nbsp;조직을&amp;nbsp;두고&amp;nbsp;있었고,&amp;nbsp;각&amp;nbsp;조직이&amp;nbsp;이&amp;nbsp;문제를&amp;nbsp;어떻게&amp;nbsp;풀어나가고&amp;nbsp;있는지&amp;nbsp;생생한&amp;nbsp;사례를&amp;nbsp;들을&amp;nbsp;수&amp;nbsp;있었다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;AI&amp;nbsp;챔피언,&amp;nbsp;AI&amp;nbsp;히어로,&amp;nbsp;AI&amp;nbsp;특공대&lt;/b&gt;&amp;nbsp;등&amp;nbsp;다양한&amp;nbsp;이름으로&amp;nbsp;불리는&amp;nbsp;AX&amp;nbsp;조직의&amp;nbsp;구성원들은&amp;nbsp;비개발자가&amp;nbsp;AI&amp;nbsp;에이전트를&amp;nbsp;업무에&amp;nbsp;활용할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;돕는&amp;nbsp;역할을&amp;nbsp;한다.&amp;nbsp;이&amp;nbsp;과정에서&amp;nbsp;가장&amp;nbsp;중요한&amp;nbsp;것은&amp;nbsp;&quot;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;온도를&amp;nbsp;맞추는&amp;nbsp;일&lt;/b&gt;&lt;/span&gt;&quot; 이라고 했다. 혼자 앞서 나가면서 이것저것 설명해봐야 온도가 끌어올려지지 않은 상태에서는 아무것도 전달 할 수 없다. 먼저 상대방의 관심과 의욕을 충분히 끌어올린 뒤 지식을 전달하고 스스로 할 수 있도록 이끄는 것이 핵심이라는 것이다. &lt;br /&gt;우리&amp;nbsp;회사에서&amp;nbsp;AI&amp;nbsp;에이전트를&amp;nbsp;일상적으로&amp;nbsp;활용하는&amp;nbsp;사람이&amp;nbsp;나뿐인&amp;nbsp;만큼,&amp;nbsp;내가&amp;nbsp;AI&amp;nbsp;챔피언,&amp;nbsp;AI&amp;nbsp;히어로,&amp;nbsp;AI&amp;nbsp;특공대&amp;nbsp;등의&amp;nbsp;AI&amp;nbsp;어쩌구&amp;nbsp;역할을&amp;nbsp;맡아야겠다는&amp;nbsp;생각이&amp;nbsp;들었다. &lt;br /&gt;&lt;br /&gt;Summit을 다녀온 뒤 대표님께 위 내용을 공유했고, &lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;그 결과 업무 시간 내에 전사를 대상으로 총 2회, 4시간 분량의 세미나를 진행할 기회를 얻었다.&lt;/b&gt;&lt;/span&gt; 별도의 준비 시간은 주어지지 않았지만, AI 에이전트로 업무가 얼마나 편해질 수 있는지 알리고 싶은 마음이 컸기에 개인 시간을 쓰는 것은 기꺼이 감수했다. 다만 준비가 이렇게 오래 걸릴 줄은 몰랐다..  1회차 준비에 10시간, 2회차 준비에 4시간의 준비시간이 있었다. 세미나를 진행하며 기록해두고 싶은 것들이 많은데, 이 부분은 따로 잘 정리해서 추후에 글로 남겨보려 한다.&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;b&gt;2. 모든&amp;nbsp;기능을&amp;nbsp;AI&amp;nbsp;에이전트로&amp;nbsp;구현하자는&amp;nbsp;방향에&amp;nbsp;제동을&amp;nbsp;걸기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;i&gt;마케팅을&amp;nbsp;처음&amp;nbsp;접하는&amp;nbsp;사람도,&amp;nbsp;첫날부터&amp;nbsp;마케팅&amp;nbsp;전문가처럼&amp;nbsp;일할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;한다&lt;/i&gt;&quot;는 아이디어에서 v0.0.0.0.0.1 에이전트는 출발했다. AI 에이전트와 함께라면 어떤 업무든 해낼 수 있도록 한다는 목표 아래, 모든 기능을 AI 에이전트로 구현해내자는 방향성이 자리잡고 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;AI-DLC를 활용한 교육자용 AI 에이전트&quot; 세션에서는 AI Agent 를 개발하고 나면, 현장에서 잘 쓰이고 있는지 측정하고 평가하는 것이 중요하다고 강조했다. 아무리 좋은 도구를 만들더라도 실무에서는 사용하지 않을 수 있는데, &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;Summit&amp;nbsp;다음날,&amp;nbsp;사내&amp;nbsp;실제&amp;nbsp;사용자들에게&amp;nbsp;직접&amp;nbsp;물어봤다.&amp;nbsp;&lt;b&gt;코멘트&amp;nbsp;자동&amp;nbsp;생성&amp;nbsp;기능&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;&quot;바비톡의 AX 여정: 에이전틱 AI로 K-beauty를 바꾸다&quot; 세션에서는 &lt;b&gt;철저히 비즈니스 중심으로 AI를 선택&lt;/b&gt;해야 하며, AI 기술의 홍수에 휩쓸리지 말라고 강조했는데, 이때 우리가 무엇을 놓치고 있었는지 명확히 알 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;AI 에이전트와 함께라면 어떤 업무든 해낼 수 있도록 한다는 기조 아래, 우리는 AI 에이전트라는 기술을 먼저 놓고 비즈니스를 거기에 어떻게 끼워 맞출지를 고민하고 있던건 아닐까 ?&amp;nbsp;&lt;/b&gt;&lt;/i&gt;&lt;/p&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 에이전트 UI/UX로 모든 기능을 구현한다는 방향을 잊어버리고 보니, 사용자 관점의 UX 를 고민할 수 있었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2900&quot; data-origin-height=&quot;1800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hynae/dJMcagltcDt/l0J5mUiR3f5TW398gjOk8K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hynae/dJMcagltcDt/l0J5mUiR3f5TW398gjOk8K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hynae/dJMcagltcDt/l0J5mUiR3f5TW398gjOk8K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHynae%2FdJMcagltcDt%2Fl0J5mUiR3f5TW398gjOk8K%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;731&quot; height=&quot;454&quot; data-origin-width=&quot;2900&quot; data-origin-height=&quot;1800&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금은 다양한 검색 조건을 에이전트에 타이핑해야 한다.&amp;nbsp;&lt;/p&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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 v0로 간단히 만들어본 개선 아이디어이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2512&quot; data-origin-height=&quot;1374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQGLp5/dJMcagsfDkw/iJ2WJtk65k7X2ccWlVxuE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQGLp5/dJMcagsfDkw/iJ2WJtk65k7X2ccWlVxuE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQGLp5/dJMcagsfDkw/iJ2WJtk65k7X2ccWlVxuE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQGLp5%2FdJMcagsfDkw%2FiJ2WJtk65k7X2ccWlVxuE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2512&quot; height=&quot;1374&quot; data-origin-width=&quot;2512&quot; data-origin-height=&quot;1374&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2524&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgxw6Q/dJMcabRYuXf/i975FD7VWTN6eK338wQXok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgxw6Q/dJMcabRYuXf/i975FD7VWTN6eK338wQXok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgxw6Q/dJMcabRYuXf/i975FD7VWTN6eK338wQXok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbgxw6Q%2FdJMcabRYuXf%2Fi975FD7VWTN6eK338wQXok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2524&quot; height=&quot;1026&quot; data-origin-width=&quot;2524&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 사용자에게 필요한 건 해당 기간의 데이터(데이터 자체도 함께 필요하다)에 대한 전문가 수준의 코멘트를 얻는 것이지, 에이전트와 대화하는 과정 그 자체는 아니기 때문이다.&lt;/p&gt;
&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;</description>
      <author>sian han</author>
      <guid isPermaLink="true">https://feelfreetothink.tistory.com/266</guid>
      <comments>https://feelfreetothink.tistory.com/266#entry266comment</comments>
      <pubDate>Mon, 8 Jun 2026 19:54:25 +0900</pubDate>
    </item>
    <item>
      <title>[홈서버] 정전 이후 발생한 DDNS 등록 만료로 인한 서비스 전면 접속 불가</title>
      <link>https://feelfreetothink.tistory.com/265</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;이슈&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;정전 이후 복구 과정에서, 다음 날 새벽 Proxmox pveproxy 일일 재시작 시점에 ipTIME DDNS 등록이 만료되어 외부에서 홈서버 내 운영중인 모든 서비스 접속이 불가한 상태가 발생함&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;프로젝트&amp;nbsp;운영&amp;nbsp;목적으로&amp;nbsp;집에서&amp;nbsp;미니PC&amp;nbsp;1대에&amp;nbsp;Proxmox&amp;nbsp;VE를&amp;nbsp;올려&amp;nbsp;홈서버를&amp;nbsp;운영&amp;nbsp;중이며,&amp;nbsp;해당&amp;nbsp;환경에서&amp;nbsp;발생한&amp;nbsp;이슈이다.&lt;/p&gt;
&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;현재&amp;nbsp;홈서버&amp;nbsp;인프라는&amp;nbsp;미니PC&amp;nbsp;1대에&amp;nbsp;**Proxmox&amp;nbsp;VE**&amp;nbsp;를&amp;nbsp;올려&amp;nbsp;온프레미스&amp;nbsp;가상화&amp;nbsp;환경으로&amp;nbsp;운영&amp;nbsp;중이다.&lt;/li&gt;
&lt;li&gt;외부 접속은 ipTIME 공유기의 DDNS 서비스(`******.iptime.org`)와 포트포워딩을 통해 이루어진다.&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;b&gt;발생 이슈&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 아침, 서비스 접속 시 아래 오류 문구를 확인할 수 있었다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1778749094114&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DNS_PROBE_FINISHED_NXDOMAIN
ERR_NAME_NOT_RESOLVED&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Proxmox&amp;nbsp;웹&amp;nbsp;UI&amp;nbsp;(`******.iptime.org`)&amp;nbsp;접속&amp;nbsp;불가&lt;/li&gt;
&lt;li&gt;홈서버&amp;nbsp;내부&amp;nbsp;서비스&amp;nbsp;(`******.iptime.org`&amp;nbsp;경유)&amp;nbsp;접속&amp;nbsp;불가&lt;/li&gt;
&lt;li&gt;운영&amp;nbsp;서비스&amp;nbsp;전체&amp;nbsp;외부&amp;nbsp;접속&amp;nbsp;불가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 항목에 대한 접근이 불가했다. 단,&lt;u&gt;&lt;b&gt; 홈서버 내부망에서는 모든 서비스 정상 접속 가능했다.&lt;/b&gt;&lt;/u&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;b&gt;점검항목&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Proxmox 내부 접속 : ✅ 정상&lt;/li&gt;
&lt;li&gt;공유기&amp;nbsp;인터넷&amp;nbsp;연결&amp;nbsp;상태&amp;nbsp;:&amp;nbsp;✅&amp;nbsp;정상&lt;/li&gt;
&lt;li&gt;공인&amp;nbsp;IP&amp;nbsp;확인&amp;nbsp;:&amp;nbsp;✅&amp;nbsp;정상&lt;/li&gt;
&lt;li&gt;포트포워딩&amp;nbsp;설정&amp;nbsp;:&amp;nbsp;✅&amp;nbsp;정상&lt;/li&gt;
&lt;li&gt;ipTIME&amp;nbsp;DDNS&amp;nbsp;설정&amp;nbsp;화면&amp;nbsp;상태&amp;nbsp;:&amp;nbsp;✅&amp;nbsp;&quot;정상등록&quot;&amp;nbsp;표시&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C7tVC/dJMcadIHgg2/O26l8I0D69crFolrs8p2i0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C7tVC/dJMcadIHgg2/O26l8I0D69crFolrs8p2i0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C7tVC/dJMcadIHgg2/O26l8I0D69crFolrs8p2i0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC7tVC%2FdJMcadIHgg2%2FO26l8I0D69crFolrs8p2i0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;551&quot; height=&quot;368&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;368&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;그러나&lt;/b&gt;&lt;/span&gt;, &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;nslookup 명령어&lt;/b&gt;&lt;/span&gt;로 DNS 응답 확인 시 Non-existent domain 응답을 받았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(nslookup 은 도메인 이름과 IP 주소 사이의 매핑 정보를 확인하기 위해 사용하는 네트워크 관리 명령어이다)&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;  nslookup으로 DNS 응답 확인 : Non-existent domain&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1778749351012&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;❯ nslookup ******.iptime.org
서버: cns3.bora.net
*** cns3.bora.net이(가) ******.iptime.org을(를) 찾을 수 없습니다. Non-existent domain&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;공유기 화면에서는 &quot;정상등록&quot; 으로 표시되고 있었지만, nslookup 을 통해 직접 확인하니 DNS&amp;nbsp;서버가&amp;nbsp;도메인&amp;nbsp;자체를&amp;nbsp;모르는&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;  DDNS 서버 실제 등록 상태 : 만료됨&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;b&gt;원인&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;5월 10일 정전&lt;/b&gt;&lt;/u&gt;으로 집 공유기와 미니PC가 강제로 꺼졌다. &lt;b&gt;공유기가 재시작되면서 ipTIME DDNS 갱신 타이머가 초기화된 상태&lt;/b&gt;가 됐다. ipTIME DDNS 서버는 일정 시간 갱신 신호를 받지 못하면 등록을 만료 처리하기 때문에 DDNS 서버에서 우리집 호스트 정보가 사라지게 된것이다. 정리하자면 아래와&amp;nbsp; 같다.&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;공유기는 주기적으로 DDNS 에 자신의 정보(외부 IP 주소, 도메인)를 알립니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;정해진 &quot;주기&quot; 이상으로 정보를 알리지 않으면, DDNS 서버에서 호스트를 비활성화 처리합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;우리집 미니 PC 는 강제로 꺼졌다 켜지면서 &quot;주기&quot; 를 계산하는 타이머가 리셋되었습니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;0부터 시작하게된 타이머때문에 정해진 &quot;주기&quot; 를 넘기게 되었습니다.&lt;/li&gt;
&lt;li&gt;따라서 DDNS 서버에서 는 우리 집의 호스트 이름이 삭제되었습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;고정 IP 를 사용하고 있어서, 문제가 없을 것이라고 생각했는데 &lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt; ipTIME DDNS 갱신 타이머가 초기화되어 발생하는 문제는 예상치못했다.&amp;nbsp;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제를 찾는데 시간이 오래 소요된 이유는, 위 사진과 같이 ipTIME DDNS 설정 UI 상에서 정상 등록되었다고 표시되었기 때문이다. 나중에 알아보니, ipTIME 공유기는 마지막으로 성공한 등록 상태를 캐싱하여 화면에 표시한다고 한다..&amp;nbsp;실제 DDNS 서버에서 등록이 만료됐더라도 공유기 입장에서는 &quot;마지막에 등록 성공했다&quot;는 상태를 그대로 보여주기 때문에, 공유기 화면만으로는 문제를 발견하기 어렵다. 이 때문에 nslookup으로 직접 DNS 응답을 확인하기 전까지 원인 파악이 지연됐다.&lt;/p&gt;
&lt;p data-ke-size=&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;b&gt;복구 조치&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ipTIME 관리페이지에서 DDNS 갱신 버튼을 클릭한 것이 전부이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1503&quot; data-origin-height=&quot;182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sNGQ1/dJMcaiwxUhl/Rknz80eqv2inGSHF3iFQ21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sNGQ1/dJMcaiwxUhl/Rknz80eqv2inGSHF3iFQ21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sNGQ1/dJMcaiwxUhl/Rknz80eqv2inGSHF3iFQ21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsNGQ1%2FdJMcaiwxUhl%2FRknz80eqv2inGSHF3iFQ21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1503&quot; height=&quot;182&quot; data-origin-width=&quot;1503&quot; data-origin-height=&quot;182&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;갱신 후 nslookup 재확인&lt;/p&gt;
&lt;pre id=&quot;code_1778750484237&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;❯ nslookup ******.iptime.org
서버: cns3.bora.net
권한 없는 응답:
이름: ******.iptime.org
Address: (공인 IP)  ✅&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 외부 서비스 접속이 정상 복구되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;홈서버 운영중에 집에 정전이 나면 공유기 재시작, 서버 데몬 재시작 등 예상치 못한 타이밍에서 DDNS가 조용히 만료되는 문제가 있다. 복구 후 nslookup 명령어를 통해 외부 DNS 응답 확인을 하자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>sian han</author>
      <guid isPermaLink="true">https://feelfreetothink.tistory.com/265</guid>
      <comments>https://feelfreetothink.tistory.com/265#entry265comment</comments>
      <pubDate>Thu, 14 May 2026 18:31:28 +0900</pubDate>
    </item>
    <item>
      <title>[LangChain] 데이터 인제스천의 3단계 (Loader, Splitter, Embedding)</title>
      <link>https://feelfreetothink.tistory.com/264</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://feelfreetothink.tistory.com/263&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://feelfreetothink.tistory.com/263&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1777372131861&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;[LangChain] 임베딩과 코사인 유사도의 이해&quot; data-og-description=&quot;LLM은 환각(잘못된 정보를 출력하는 현상)을 일으키고 부정확한 정보를 제공할 가능성이 높다.이른 프롬프트를 수정하는 것으로 해결할 수 없으며, 그 이유는 모델의 지식한계로 생기는 문제이&quot; data-og-host=&quot;feelfreetothink.tistory.com&quot; data-og-source-url=&quot;https://feelfreetothink.tistory.com/263&quot; data-og-url=&quot;https://feelfreetothink.tistory.com/263&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/H8Ws5/dJMb8T92AQ9/Byg1xrBI6P4uylmIGhElF0/img.jpg?width=800&amp;amp;height=600&amp;amp;face=0_0_800_600,https://scrap.kakaocdn.net/dn/b5QWVU/dJMb8QepfpK/wLoK06QORoquzzdnFzj9E0/img.jpg?width=800&amp;amp;height=600&amp;amp;face=0_0_800_600,https://scrap.kakaocdn.net/dn/BksN7/dJMb8XR8Nj1/VAcTb9oumcQ7L5QTnLwwiK/img.jpg?width=4032&amp;amp;height=3024&amp;amp;face=0_0_4032_3024&quot;&gt;&lt;a href=&quot;https://feelfreetothink.tistory.com/263&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://feelfreetothink.tistory.com/263&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/H8Ws5/dJMb8T92AQ9/Byg1xrBI6P4uylmIGhElF0/img.jpg?width=800&amp;amp;height=600&amp;amp;face=0_0_800_600,https://scrap.kakaocdn.net/dn/b5QWVU/dJMb8QepfpK/wLoK06QORoquzzdnFzj9E0/img.jpg?width=800&amp;amp;height=600&amp;amp;face=0_0_800_600,https://scrap.kakaocdn.net/dn/BksN7/dJMb8XR8Nj1/VAcTb9oumcQ7L5QTnLwwiK/img.jpg?width=4032&amp;amp;height=3024&amp;amp;face=0_0_4032_3024');&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;[LangChain] 임베딩과 코사인 유사도의 이해&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;LLM은 환각(잘못된 정보를 출력하는 현상)을 일으키고 부정확한 정보를 제공할 가능성이 높다.이른 프롬프트를 수정하는 것으로 해결할 수 없으며, 그 이유는 모델의 지식한계로 생기는 문제이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;feelfreetothink.tistory.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;
&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;을 구성해야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;랭체인은 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;문서 로더 (Document Loader)&lt;/b&gt; &lt;/span&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;b&gt;※ 문서 로더 (Document Loader)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서 로더는 다양한 형식의 원시 데이터를 랭체인이 이해할 수 있는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;표준 객체인 Document 형태&lt;/b&gt;&lt;/span&gt;로 변환해주는 도구이다.&amp;nbsp;&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;b&gt;▶ Document 객체&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Document 객체는 랭체인에서 데이터를 다루는 가장 핵심 단위이다. 어떤 로더를 쓰든 결과물은 항상 이 동일한 규격의 객체에 담겨 나오기 때문에, 이후의 처리 과정이 매우 단순해 진다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 String 으로 넘기지 않고 객체화하는 데는 이유가 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자가 질문했을 때, 답변과 함께 발췌 출처를 띄워주려면 &lt;b&gt;metadata&lt;/b&gt; 에 저장된 정보가 반드시 필요하다&lt;/li&gt;
&lt;li&gt;벡터 데이터베이스에서 검색할때, &lt;b&gt;metadata&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;필터링을 수행할 수 있다 (ex. 2024년에 작성된 문서 중에서만 찾아줘)&lt;/li&gt;
&lt;li&gt;추적성 : 복잡한 인프라나 대규모 프로젝트에서 데이터의 유입 경로를 추적하기 용이하다.&amp;nbsp;&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;size18&quot;&gt;&lt;b&gt;▷ Document 객체의 내부구조&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Document 객체는 딱 두 가지 필드로 구성된 매우 심플한 구조를 가진다.&amp;nbsp;&lt;/p&gt;
&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;page_content (string)&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;특징 : LLM이 직접 읽고 분석하게 될 핵심 본문&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;metadata (dict)&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;nbsp;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;ex ) {&quot;source&quot;: &quot;신규_인프라_설계안.pdf&quot;, &quot;page&quot;: 12, &quot;author&quot;: &quot;한서현&quot;}&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 Document 객체를 코드로 구현하면 아래와 같은 데이터 구조를 갖는다&lt;/p&gt;
&lt;pre id=&quot;code_1777372570762&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from langchain_core.documents import Document

# 수동으로 Document 객체를 생성할 때의 모습
doc = Document(
    page_content=&quot;이 서버의 Bastion 호스트 설정은 22번 포트를 제한합니다.&quot;,
    metadata={
        &quot;category&quot;: &quot;Security&quot;,
        &quot;location&quot;: &quot;Incheon_DC&quot;,
        &quot;priority&quot;: &quot;High&quot;
    }
)

print(doc.page_content)  # 본문 출력
print(doc.metadata[&quot;category&quot;])  # 특정 메타데이터 접근&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자 이제 랭체인의 다양한 문서로더에 대해 알아보자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;▶ 랭체인의 문서 로더 (몇개만..)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;랭체인의 지원 문서 유형은 &lt;a title=&quot;랭체인 홈페이지 &quot; href=&quot;https://docs.langchain.com/oss/python/integrations/providers/overview&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;랭체인 홈페이지&lt;/a&gt; 에서 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. TextLoader&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;.txt 파일이나 일반 텍스트 파일을 읽어온다.&lt;/li&gt;
&lt;li&gt;파일 전체를 하나의 String 으로 읽어 page_content 에 담는다&lt;/li&gt;
&lt;li&gt;간단한 메모, 로그 파일, README 파일 등을 로드할 때 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1777372967692&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from langchain_community.document_loaders import TextLoader

loader = TextLoader('./test.txt', encoding='utf-8')
docs = loader.load()&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;문서에 적합한 로더를 선택한다 (TextLoader)&lt;/li&gt;
&lt;li&gt;해당 로더의 인스턴스(loader)를 생성하고, 설정용 매개변수를 함께 지정한다&lt;/li&gt;
&lt;li&gt;load()를 호출하여 문서를 로드하면, 다음 단계에 전달할 준비가 끝난 문서 목록을 반환한다. (? 어떤 문서라는거지 ? )&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;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. PyPDFLoader&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;PDF 파일을 읽고 페이지별로 문서를 분할해주는 로더이다.&lt;/li&gt;
&lt;li&gt;페이지 번호를 메타데이터로 자동으로 남겨준다. 따라서 나중에 LLM 이 답변할때 출처를 밝히기 좋다&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;size18&quot;&gt;&lt;b&gt;3. CSVLoader&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;.csv 파일의 각 행을 하나의 Document 객체로 변환한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;한 행의 데이터를 열 이름 : 값 형태의 텍스트로 만들어준다.&lt;/li&gt;
&lt;li&gt;표 형식의 데이터, 사용자 리스트, 상품 목록 등을 처리할 때 유용하다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;4. WebBaseLoader&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;특정 URL 주소의 HTML 내용을 긁어와서 텍스트만 추출한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;BeautifulSoup 라이브러리를 내부적으로 사용하여 웹페이지의 불필요한 태그를 걷어내고 본문 위주로 가져온다.&lt;/li&gt;
&lt;li&gt;최신 뉴스 기사, 블로그 포스팅, 공식 문서 웹사이트의 내용을 학습 데이터로 쓸 때 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로더를 선택할 때는 텍스트를 긁어오는 것을 넘어 &quot;&lt;u&gt;&lt;b&gt;메타데이터를 얼마나 풍부하게 남길 수 있는가&lt;/b&gt;&lt;/u&gt;&quot; 를 고려해야한다. 그래야 나중에 관리나 검색이 훨씬 수월해진다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;그러나 !&lt;/b&gt; &lt;/span&gt;여기에 문제가 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;100장의 PDF 를 PyPDFLoader를 사용해 추출하여 Document 객체로 가지고 있다고 가정해보자, 100,000 자를 초과해서 대다수의 LLM 및 임베딩 모델이 제공하는 &lt;u&gt;&lt;b&gt;컨텍스트 윈도에 수용되지 않는다.&amp;nbsp;&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 제한에 대응하기 위해서는, Document 를 관리 가능한 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;텍스트 단위로 분할&lt;/b&gt;&lt;/span&gt;해 추후 임베딩과 의미론적 검색을 할 수 있도록 만들어야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&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;b&gt;※ 텍스트 스플리터(Text Splitter)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의미론적으로 연관된 텍스트 조각끼리 유지하며 텍스트를 여러 조각으로 분할하는 작업은 복잡하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;랭체인에서는 이 역할을 수행하는 도구를 &lt;u&gt;&lt;b&gt;텍스트 스플리터&lt;/b&gt;&lt;/u&gt;라고 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;텍스트 스플리터가 수행하는 작업은 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;청킹&lt;/b&gt;&lt;/span&gt;이다.&amp;nbsp;&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;b&gt;▶ 청킹(Chunking)&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;청킹은 거대한 데이터 덩어리를 LLM 이나 임베딩 모델이 처리하기 좋게 의미 있는 작은 단위로 쪼개는 과정&lt;/b&gt;을 말한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재차 말하지만, 단순히 단어를 쪼개는 것이 아니라, &lt;u&gt;맥락을 보존하면서 효율적으로 분할하는 전략&lt;/u&gt;이다.&amp;nbsp;&lt;/p&gt;
&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;u&gt;&lt;b&gt;청킹을 하는 이유&lt;/b&gt;&lt;/u&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;비용 절감 : 필요한 조각만 모델에게 전달하므로 토큰 사용량을 줄일 수 있다.&amp;nbsp;&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;&lt;b&gt;▷ 랭체인의 텍스트 스플리터&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. RecursiveCharacterTextSplitter&amp;nbsp;&lt;/b&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;문단 구분자 \n\n&lt;/li&gt;
&lt;li&gt;줄 구분자 \n&lt;/li&gt;
&lt;li&gt;단어 구분자 : 공백문자&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;from_language&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;from_language 는 특정 프로그래밍 언어의 문법을 이해한다.&lt;/li&gt;
&lt;li&gt;따라서 하나의 함수나 클래스를 가급적 쪼개지 않고 한 덩어리로 묶어준다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;create_documents&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;리스트를 Document 객체로&lt;/li&gt;
&lt;li&gt;입력값 : 문자열 리스트&amp;nbsp; (List[str])&lt;/li&gt;
&lt;li&gt;출력값 : Document 객체 리스트 ( List[Document] )&lt;/li&gt;
&lt;li&gt;용도 : 메타데이터를 포함한 표준 객체가 필요할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1777375501126&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from langchain_text_splitters import RecursiveCharacterTextSplitter

# 1. 스플리터 설정 (간단히 50자 단위로 설정)
splitter = RecursiveCharacterTextSplitter(chunk_size=50, chunk_overlap=10)

# 2. 여러 개의 원본 데이터 준비
texts = [
    &quot;FastAPI는 파이썬 기반의 현대적이고 빠른 웹 프레임워크입니다.&quot;,
    &quot;PostgreSQL은 강력한 오픈 소스 객체 관계형 데이터베이스 시스템입니다.&quot;
]

# 3. 각 데이터에 대응하는 메타데이터 준비 (리스트 순서가 중요!)
metadatas = [
    {&quot;source&quot;: &quot;fastapi_doc.txt&quot;, &quot;category&quot;: &quot;Web&quot;, &quot;priority&quot;: 1},
    {&quot;source&quot;: &quot;postgres_doc.txt&quot;, &quot;category&quot;: &quot;DB&quot;, &quot;priority&quot;: 2}
]

# 4. create_documents 실행
documents = splitter.create_documents(texts, metadatas=metadatas)

# 5. 결과 확인
for i, doc in enumerate(documents):
    print(f&quot;--- Document {i} ---&quot;)
    print(f&quot;Content: {doc.page_content}&quot;)
    print(f&quot;Metadata: {doc.metadata}&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;위 예시와 같이 create_documents 에서 두 번째 선택 인수를 활용해 메타 데이터 목록을 전달할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 전달된 메타데이터는 반환되는 객체인 Document 의 메타데이터 필드를 채우는 용도로 활용된다.&amp;nbsp;&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;b&gt;※ 텍스트 임베딩 (Embedding)&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;앞전에 &lt;u&gt;&lt;b&gt;문서를 로드&lt;/b&gt;&lt;/u&gt;하고, &lt;u&gt;&lt;b&gt;청킹&lt;/b&gt;&lt;/u&gt;하는 과정에 대해 알아봤다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이제 이 텍스트 조각들을 벡터로 변환하는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Embedding&lt;/b&gt; &lt;/span&gt;단계에 대해 알아보자.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;▶ Embedding 클래스&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;랭체인의 Embedding 클래스는 텍스트 임베딩 모델과 상호작용하여 텍스트의 벡터 표현을 생성한다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해당 클래스는 임베딩 모델인&lt;u&gt;&lt;b&gt; OpenAI, HuggingFace, Cohere&lt;/b&gt;&lt;/u&gt; 등을 동일한 인터페이스로 사용할 수 있게 해주는 &lt;b&gt;추상화 레이어&lt;/b&gt;이다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Embedding 클래스는 아래 2개의 핵심 메서드를 제공한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;문서를 임베딩 하는 메서드 : embed_documents(texts)&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;텍스트 문자열 목록을 입력받는다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;준비된 여러 개의 Chunks 을 한꺼번에 벡터로 변환하여 Vector Store 에 저장할 때 사용한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;입력값 : &lt;span data-path-to-node=&quot;2,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,1,0,0&quot;&gt;&lt;/b&gt;&lt;/span&gt;&lt;span data-path-to-node=&quot;2,1,1,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,1,1,0&quot;&gt;List[str]&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;반환값 : List[List[float]]&amp;nbsp;(2차원&amp;nbsp;리스트)&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;질의를 임베딩 하는 메서드: embed_query(text)&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;단일 텍스트 문자열을 입력받는다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;사용자가 던진 질문 하나를 벡터로 변환할 때 사용한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;질문과 문서의 유사도를 비교하기 위해 질문도 같은 공간의 숫자로 바꿔야 하기 때문이다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;입력값 : &amp;nbsp;&lt;span data-path-to-node=&quot;2,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,2,0,0&quot;&gt;&lt;/b&gt;&lt;/span&gt;&lt;span data-path-to-node=&quot;2,2,1,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,2,1,0&quot;&gt;str&lt;/b&gt; (문자열 하나)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span data-path-to-node=&quot;2,2,1,0&quot;&gt;출력값 : List[float]&amp;nbsp;(1차원&amp;nbsp;리스트)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;두 메서드를 구분하는 이유&lt;/b&gt;는,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;숫자로 변경하는 것의 목적은 같지만, 일부 최신 모델들은 &quot;검색 대상이 되는 문서&quot; 와 &quot;찾으려는 질문&quot;의 특성을 다르게 파악하여 최적화 하기 때문이다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;▷ Embedding 클래스의 입출력&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;앞서 배운 문서 로더와 텍스트 스플리터의 결과물은 Document 객체이다.&lt;/li&gt;
&lt;li&gt;그러나 임베딩 모델은 수학적인 계산을 하는 모델이라서, 메타데이터는 계산할 줄 모른다. 따라서 Embeddings 클래스는 Document 객체를 직접 받지 않는다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1777457658692&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# ❌ 잘못된 방법
documents = splitter.split_documents(raw_docs)
vectors = embeddings_model.embed_documents(documents) # Error! Document 객체는 계산 불가

# ✅ 올바른 방법 (텍스트만 추출해서 전달)
texts = [doc.page_content for doc in documents]
vectors = embeddings_model.embed_documents(texts)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;랭체인은 내부적으로 아래와 같이 동작하는데, 실제 개발할 때는 앞으로 배울 &lt;b&gt;랭체인의 벡터 저장소(Vector Store) 클래스가 이 작업을 대신 해준다.&amp;nbsp;&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;1. Document 객체에서 page_content 를 뽑아낸다&lt;/li&gt;
&lt;li&gt;2. 해당 텍스트를 Embeddings.embed_documents() 에 전달한다.&lt;/li&gt;
&lt;li&gt;3. 반환된 숫자 리스트(벡터)를 다시 메타데이터와 연결하여 벡터 저장소에 저장한다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;임베딩 모델은 동시에 여러 문서를 임베딩 할 수 있으므로, 동시 임베딩하는 편이 더 좋다. 모델 구성상 동시 임베딩이 더 효율적이기 때문이다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p 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;&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;b&gt;문서 로더&lt;/b&gt; : 임의의 문서를 평문으로 변환한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;텍스트 분할기&lt;/b&gt; : 대형 문서를 다수의 소규모 문서로 분할한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;임베딩 모델&lt;/b&gt; : 각 분할 요소의 의미를 수치로 표현한다.&amp;nbsp;&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;문서에서 임베딩을 생성하는 방법을 배웠고, 다음 장에서는 벡터 저장소라는 특별한 DB 에 저장하는 것을 알아보자&lt;/p&gt;</description>
      <author>sian han</author>
      <guid isPermaLink="true">https://feelfreetothink.tistory.com/264</guid>
      <comments>https://feelfreetothink.tistory.com/264#entry264comment</comments>
      <pubDate>Wed, 29 Apr 2026 18:56:16 +0900</pubDate>
    </item>
    <item>
      <title>[LangChain] 임베딩과 코사인 유사도의 이해</title>
      <link>https://feelfreetothink.tistory.com/263</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM은 환각(잘못된 정보를 출력하는 현상)을 일으키고 부정확한 정보를 제공할 가능성이 높다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이른 프롬프트를 수정하는 것으로 해결할 수 없으며, 그 이유는 모델의 지식한계로 생기는 문제이기 때문이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM에 데이터를 제공할 때 가장 문제가 되는 요소는 바로 입력 크기 제한이다. 방대한 텍스트를 LLM 에 전부 전달할 수 없는데, 이때 아래와 같은 의문이 생긴다.&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;LLM이 질문에 답할 때 참고하기에 가장 적합한 텍스트는 어떻게 선정해야할까 ?&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제는 &lt;b&gt;인덱싱&lt;/b&gt;과 &lt;b&gt;검색&lt;/b&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;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;문서를 전처리&lt;/b&gt;&lt;/span&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;/ul&gt;
&lt;/li&gt;
&lt;li&gt;검색 : LLM이 데이터를 바탕으로 정확한 답변을 생성하도록 인덱스에서 외부 데이터를 가져와 컨텍스트로 전달한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱싱에서 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;문서를 전처리&lt;/b&gt; &lt;/span&gt;한다고 했는데, &lt;u&gt;&lt;b&gt;이 과정이 왜 필요할까 ?&amp;nbsp;&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM에 특정 문서를 제공하고, 관련한 질문을 했을때, 이에 대한 답변을 받기 위해서는 네 가지 핵심 단계가 필요하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2632&quot; data-origin-height=&quot;1245&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yCKKd/dJMcafNcGIW/YAhXXGKqBdHQWhy669VA7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yCKKd/dJMcafNcGIW/YAhXXGKqBdHQWhy669VA7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yCKKd/dJMcafNcGIW/YAhXXGKqBdHQWhy669VA7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyCKKd%2FdJMcafNcGIW%2FYAhXXGKqBdHQWhy669VA7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;663&quot; height=&quot;314&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2632&quot; data-origin-height=&quot;1245&quot;/&gt;&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;1. 문서에서 텍스트를 추출한다&lt;/li&gt;
&lt;li&gt;2. 텍스트를 효율적으로 처리할 수 있도록 적절한 단위로 분할한다.&lt;/li&gt;
&lt;li&gt;3. 텍스트를 컴퓨터가 이해할 수 있는 숫자 체계로 변환한다.&lt;/li&gt;
&lt;li&gt;4. 문서에서 주어진 질문에 대한 부분을 손쉽고 신속하게 조회할 수 있도록 텍스트의 숫자 표현을 적절한 위치에 저장한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 과정을 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;인제스천&lt;/b&gt;&lt;/span&gt;이라고 부른다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;인제스천(Ingestion)&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;인제스천은 기본적으로 데이터 엔지니어링의 ETL 구조를 따른다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. Extract 추출 - Document Loaders&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다양한 소스에서 raw 데이터를 긁어온다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;종류 : PDF, CSV, JSON, Notion, SQL DB 등&lt;/li&gt;
&lt;li&gt;역할 : 각기 다른 포맷의 데이터를 랭체인의 공통 규격인 Document 객체로 변환한다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. Transform 변환 - Text Splitters&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;LLM 은 한 번에 읽을 수 있는 양이 정해져 있는데, 그래서 긴 문서를 의미있는 단위로 쪼개야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이때 핵심은 단순히 글자 수로 자르는 게 아니라,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;문맥이 끊기지 않도록 재귀적 분할이나 의미론적 분할 (그니까 암튼 분할을 알잘딱깔센으로 잘한다는 거임) 을 수행한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이때 데이터를 너무 크게 쪼개면 노이즈가 섞이고, 너무 작게 쪼개면 문맥이 사라진다.&lt;/b&gt; Chunk Size 를 최적화 하는 것이 인제스천 설계의 핵심 역량이다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3. Load 적재 - Vector Stores&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;쪼개진 텍스트를 숫자의 형태(&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Embedding&lt;/b&gt;&lt;/span&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;도구 : Chroma, Pinecone, FAISS 등&lt;/li&gt;
&lt;li&gt;목적 : 나중에 사용자가 질문했을 때, 유사한 문맥의 데이터를 빠르게 검색하기 위함이다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;인제스천&lt;/b&gt;&lt;/u&gt;은 &lt;b&gt;문서를 컴퓨터가 이해하고 분석하기 좋은 숫자 데이터로 전환한 뒤, 이를 효율적인 검색 증강 생성을 위해 특화된 데이터베이스에 저장하는 전체 프로세스&lt;/b&gt;를 의미한다. 여기서 숫자 데이터는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;임베딩&lt;/b&gt;&lt;/span&gt;이라고 부르고, 특수한 유형의 데이터베이스를 벡터 저장소라고 부른다. &lt;u&gt;임베딩이 무엇이고 왜 중요한지 알아보자&lt;/u&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;임베딩&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; 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;임베딩은 텍스트를 긴 숫자 시퀀스로 표현한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;이 과정에서 손실이 발생한다.&lt;/li&gt;
&lt;li&gt;숫자 시퀀스에서 원본 텍스트를 복원할 수 없다.&lt;/li&gt;
&lt;li&gt;따라서 보통 원본 텍스트와 해당 숫자 시퀀스를 함께 저장한다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;왜 원본 텍스트를 저장하는데 굳이 숫자 데이터를 따로 만들어야 할까 ?&amp;nbsp;&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;텍스트를 숫자로 변환하면 숫자의 유연함과 강력함을 얻을 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨터는 &lt;i&gt;&quot;&lt;b&gt;사과&lt;/b&gt;&quot;&lt;/i&gt; 라는 글자가 과일인지, 컴퓨터 회사인지 알지 못한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 이를 특정 차원의 숫자로 변환하는 순간, 수학적 공간에서의 관계가 형성된다. &lt;b&gt;텍스트를 숫자로 바꾸면, 단어와 단어 사이의 추상적인 관계를 벡터 산술 연산으로 풀 수 있다&lt;/b&gt;.&amp;nbsp;&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;숫자 데이터(Embedding) : 수백만 개의 데이터 사이에서 가장 관련 있는 것을 0.01 초 만에 찾아내기 위한 색인 용도&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;▶ LLM 이전의 임베딩 : BoW 모델&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 : &lt;a href=&quot;https://www.youtube.com/watch?v=e9U0QAFbfLI&amp;amp;t=182s&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=e9U0QAFbfLI&amp;amp;t=182s&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=e9U0QAFbfLI&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/ek5jQB/dJMb82MF45b/us8F9odzPtvW4gxjO0u2nK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/XRWlT/dJMb8TCcDQF/tki797e48ayemjzhZUnt3K/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;StatQuest with Josh Starmer&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/e9U0QAFbfLI&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;▷ 코사인 유사도&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단어가 얼마나 많이 나타났는지 보다는 어떤 단어들이 공통으로 나타났는지 측정한는 지표이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;▷ 코사인 유사도 계산 절차&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 단어 빈도수 표 작성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비교하려는 두 문장에 나타난 모든 단어의 갯수를 세어 표로 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 hello world 와 hello 라는 구절이 있다면 아래와 같은 표를 만든다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;161&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jj1zt/dJMcajvfnv2/fXou7w3osiSENAJfXLlPvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jj1zt/dJMcajvfnv2/fXou7w3osiSENAJfXLlPvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jj1zt/dJMcajvfnv2/fXou7w3osiSENAJfXLlPvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJj1zt%2FdJMcajvfnv2%2FfXou7w3osiSENAJfXLlPvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;370&quot; height=&quot;161&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;161&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. 벡터의 방향 측정&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;333&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhesAm/dJMcafTW3jo/Yxc2cxB26vaNeVWS5p0YH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhesAm/dJMcafTW3jo/Yxc2cxB26vaNeVWS5p0YH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhesAm/dJMcafTW3jo/Yxc2cxB26vaNeVWS5p0YH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhesAm%2FdJMcafTW3jo%2FYxc2cxB26vaNeVWS5p0YH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;476&quot; height=&quot;207&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;333&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;이 숫자들을 그래프 상의 점으로 찍고 원점에서 그 점까지 선을 긋는다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;이때 &lt;u&gt;&lt;b&gt;코사인 유사도 수식은 이 두 선 사이의 각도를 계산&lt;/b&gt;&lt;/u&gt;한다.&lt;/li&gt;
&lt;li&gt;두 문장이 완전히 같다면 각도는 0도가 되며, 코사인 값은 1이 된다.&lt;/li&gt;
&lt;li&gt;두 문장에 공통된 단어가 하나도 없다면 각도는 90도가 되며, 코사인 값은 0이 된다.&lt;/li&gt;
&lt;li&gt;위의 경우 &amp;nbsp;&quot;hello world&quot; 와 &quot;hello&quot; 는 hello 라는 단어를 공통으로 가지고 있어, 코사인 값은 71도가 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 &lt;i&gt;&lt;b&gt;단어의 빈도만을 따져서 벡터화 하는 전통적인 방식&lt;/b&gt;&lt;/i&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문장의 길이나 단어의 반복횟수에 영향을 받지 않고, 오직 방향(각도) 에만 집중한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이와 같이 단어의 빈도만을 따져서 벡터화 하는 전통적인 방식을 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Bag of Words 모델&lt;/b&gt;&lt;/span&gt;이라고 부른다.&amp;nbsp;&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;b&gt;▶ LLM 기반 임베딩&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM 이전에 벌어진 모든 머신러닝 발전사는 과감히 생략(BoW, 희소 임베딩, 희소 벡터 ..) 하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM 기반의 임베딩 모델을 학습해보자. &lt;b&gt;LLM 은 단어를 다른 단어와 조합하는 방식을 파악하여 텍스트 문맥에서 단어와 문장의 의미를 이해한다&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;size18&quot;&gt;&lt;b&gt;▷ 임베딩 모델&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임베딩 모델은 단순히 단어를 숫자로 치환하는 것이 아니라, Transformer 아키텍쳐 (주로 BERT 계열)을 사용하여 문장 내 단어 간의 관계를 분석한다. 또 그 문장의 의미를 수백~수천개의 숫자로 된 밀집 벡터로 변환한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;ex )&lt;/b&gt;&lt;/span&gt; &quot;배가 맛있다&quot; vs &quot;배를 탄다&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주변 단어들 (맛있다 vs 탄다)을 함께 분석하여 첫번째 배는 광리 공간에, 두번째 배는 탈것 공간에 가깝게 배치한다.&amp;nbsp;&lt;/p&gt;
&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;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt; LLM 기반 임베딩의 핵심 특징&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;b&gt;1. 의미론적 추론 (Semantic Reasoning)&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;BoW 모델과 같은 단순한 키워드 일치가 없이도 검색이 가능하다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;각 단어에는 그와 상응하는 의미론적 임베딩이 나란히 배치된다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20260428_084910440.jpg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dNXpVw/dJMcafTW3HQ/vDNbyMZKOg7dYUn7gI2XT1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dNXpVw/dJMcafTW3HQ/vDNbyMZKOg7dYUn7gI2XT1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dNXpVw/dJMcafTW3HQ/vDNbyMZKOg7dYUn7gI2XT1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdNXpVw%2FdJMcafTW3HQ%2FvDNbyMZKOg7dYUn7gI2XT1%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;472&quot; height=&quot;3024&quot; data-filename=&quot;KakaoTalk_20260428_084910440.jpg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의미 유사성이 높은 단어나&amp;nbsp; 문장을 표현하는 숫자 배열은 관련성이 없는 경우보다 &lt;b&gt;가깝게 구성&lt;/b&gt;된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 각 숫자는 부동소수점 값으로, &lt;b&gt;의미론적 차원(시맨틱 차원)&lt;/b&gt;을 나타낸다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3차원 공간에 모든 벡터를 배치하면 아래와 유사한 형태가 나타난다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20260428_085301936.jpg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uWVop/dJMcajoqjdh/t8UDDJlc2Zw7bih7s5PkQ0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uWVop/dJMcajoqjdh/t8UDDJlc2Zw7bih7s5PkQ0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uWVop/dJMcajoqjdh/t8UDDJlc2Zw7bih7s5PkQ0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuWVop%2FdJMcajoqjdh%2Ft8UDDJlc2Zw7bih7s5PkQ0%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;488&quot; height=&quot;3024&quot; data-filename=&quot;KakaoTalk_20260428_085301936.jpg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;두 벡터 사이의 각도가 작거나 거리가 짧을수록 더욱 유사하다고 판단&lt;/b&gt;&lt;/u&gt;한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 두 벡터간 유사도를 산출하는 효과적은 방법은 위에서 설명한 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;코사인 유사도&lt;/b&gt;&lt;/span&gt;이다.&amp;nbsp;&lt;/p&gt;
&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;2. 다국어 정렬&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최신 LLM 모델들은 여러 언어를 같은 공간에 매핑한다. 따라서 다국어 검색 시스템 구축이 매우 쉬워진다.&amp;nbsp;&lt;/p&gt;
&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;3. 정보 압축&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수만 페이지의 텍스트도 고정된 크기(ex. 1536 개 숫자)의 벡터로 압축된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 벡터 DB 를 통해 고속으로 검색할 수 있는 기반이 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 큰 그림을 이해했으니, 문서 전처리 과정의 첫 단계인 &lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;인덱싱&lt;/b&gt;&lt;/span&gt;을 다시 살펴보도록 하자 ~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>LangChain</category>
      <author>sian han</author>
      <guid isPermaLink="true">https://feelfreetothink.tistory.com/263</guid>
      <comments>https://feelfreetothink.tistory.com/263#entry263comment</comments>
      <pubDate>Tue, 28 Apr 2026 09:18:25 +0900</pubDate>
    </item>
    <item>
      <title>[LangChain] 랭체인의 LCEL 구성 컴파일</title>
      <link>https://feelfreetothink.tistory.com/262</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;※ Runnable 인터페이스&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 글에서 &lt;u&gt;&lt;b&gt;모델&lt;/b&gt;&lt;/u&gt;, &lt;u&gt;&lt;b&gt;프롬프트 템플릿&lt;/b&gt;&lt;/u&gt;, &lt;u&gt;&lt;b&gt;출력 파서&lt;/b&gt;&lt;/u&gt;의 형태에 대해 알아봤다. 이들은 서로 다른 구성 요소를 호출했지만, 유사한 인터페이스와 &lt;b&gt;invoke() 메서드&lt;/b&gt;를 사용했다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Runnable 인터페이스&lt;/b&gt;&lt;/span&gt;&lt;b&gt;는 랭체인의 모든 컴포넌트가 동일한 규격의 입출력 포트를 가지도록 강제하는 표준 프로토콜이다.&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;어떤 랭체인 객체이든 Runnable 인터페이스를 상속받았다면 다음 세가지 메서드를 기본적으로 지원한다.&amp;nbsp;&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;invoke : 하나의 입력을 하나의 출력으로 변환한다.&lt;/li&gt;
&lt;li&gt;batch : 여러 입력을 여러 출력으로 변환한다.&lt;/li&gt;
&lt;li&gt;stream : 하나의 입력이 생성하는 출력 결과를 실시간으로 전달한다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;컴포넌트가 반복 출력을 지원하지 않아 모든 출력을 하나로 모아 구성하는 &lt;span style=&quot;background-color: #ffc9af;&quot;&gt;경우&lt;/span&gt;&lt;/b&gt;도 있는데, 방식은 두가지가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;= 이 상황은 &lt;u&gt;여러 번 호출해서 얻은 데이터를 하나의 Response 로 합쳐야 하는 상황&lt;/u&gt;을 의미한다. LLM 에게 질문을 던졌을 때, 한 번의 호출로 모든 답을 완벽히 얻기 어려울 수 있다.&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;b&gt;명령형&lt;/b&gt; : 직접 model.invoke(...) 를 같은 메서드로 구성 요소를 호출한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;선언형&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; : 랭체인 표현 언어 (LCEL LangChain Expression Language) 를 사용한다.&amp;nbsp;&lt;/span&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;&lt;b&gt;▶ 명령형 구성 (imperative composition) &lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령형 구성은 단지 익숙하게 코드를 작성하는 방식의 다른 이름이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 구성 요소를 함수와 클래스로 결합하는 행위가 명령형 구성이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 예시는 프롬프트와 채팅 모델을 사용해 구성한 챗봇이다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1777283265934&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from langchain_openai import ChatOpenAI
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser

# 1. 컴포넌트들을 각각 독립적으로 준비
model = ChatOpenAI(model=&quot;gpt-4o&quot;)
prompt_template = PromptTemplate.from_template(&quot;{language}의 주요 특징을 한 문장으로 알려줘.&quot;)
parser = StrOutputParser()

# 2. 처리할 데이터 리스트
languages = [&quot;Java&quot;, &quot;Python&quot;, &quot;Golang&quot;]

# 3. 명령형 방식: 개발자가 직접 흐름을 제어 (Iteration &amp;amp; Aggregation)
final_results = []

for lang in languages:
    # 단계 1: 프롬프트 조립 (PromptValue 생성)
    # 랭체인 내부의 f-string 문법이 여기서 동작합니다.
    prompt_value = prompt_template.invoke({&quot;language&quot;: lang})
    
    # 단계 2: 모델 호출 (AIMessage 생성)
    ai_message = model.invoke(prompt_value)
    
    # 단계 3: 출력 파싱 (String 추출)
    parsed_result = parser.invoke(ai_message)
    
    # 단계 4: 결과 모으기
    final_results.append(f&quot;[{lang}]: {parsed_result}&quot;)

# 4. 최종 출력
print(&quot;\n&quot;.join(final_results))&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;b&gt;final_results.append()&lt;/b&gt; 에서 모든 출력을 하나로 모으고 있다. 컴포넌트 자체가 리스트를 한번에 다 처리해서 주는 기능을 지원하지 않더라도, &lt;b&gt;개발자가 외부 변수 (final_result) 를 사용해 출력을 하나하나 수집하여 최종 결과물을 구성&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;예상출력 결과는 아래와 같다&lt;/p&gt;
&lt;pre id=&quot;code_1777283370587&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[Java]: 정적 타이핑과 객체지향 설계를 바탕으로 대규모 엔터프라이즈 시스템 구축에 최적화된 견고한 언어입니다!!!
[Python]: 간결한 문법과 방대한 라이브러리를 통해 데이터 과학부터 백엔드 개발까지 빠른 생산성을 제공하는 언어입니다!!!
[Golang]: 강력한 동시성 제어와 컴파일 속도를 자랑하며 클라우드 네이티브 환경 및 마이크로서비스 구축에 특화된 언어입니다!!!&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;▶ 선언형 구성&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;LCEL (LangChain Expression Language)&lt;/b&gt; &lt;/span&gt;는 선언형 언어를 이용해 랭체인 요소를 구성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;랭체인은 LCEL 구성을 &lt;u&gt;&lt;b&gt;최적화된 실행 계획으로 컴파일&lt;/b&gt;&lt;/u&gt;하며, 자동병렬화, 스트리밍, 추적 및 비동기 지원을 수행한다.&amp;nbsp;&lt;/p&gt;
&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;마치 고수준의 SQL 쿼리를 작성하면, DB 엔진이 가장 빠른 실행계획을 세워 결과를 가져오는 과정같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LCEL은 단순히 코드를 짧게 만들어주는 것이 아니라, 프레임워크 수준의 도구이다.&amp;nbsp;&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;b&gt;명령형 코드&lt;/b&gt; : 절차 중심으로 작성한다
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;ex ) &lt;span style=&quot;letter-spacing: 0px;&quot;&gt; 1단계로 프롬프트를 만들고, 변수를 할당하고, 모델을 부르고, 에러가 나면 재시도하고...&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;선언형 코드 (LCEL)&lt;/b&gt;:&lt;b&gt; chain = prompt | model | parser&lt;/b&gt; (관계 중심)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이와 같이 &lt;b&gt;파이프로 연결하는 순간&lt;/b&gt;, 랭체인은 내부적으로 이 연결 정보를 &lt;b&gt;그래프(Graph) 구조로 저장&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;▷ 랭체인의 LCEL 구성 컴파일&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;작성된 LCEL 체인을 실행하는 순간, 랭체인 엔진은 이 그래프를 분석하여 가장 효율적인 실행 경로를 계산한다. 이것이 랭체인의 컴파일 과정이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 &lt;u&gt;&lt;b&gt;&quot;최적화된 실행 계획으로 컴파일&quot; 한다는 것&lt;/b&gt;&lt;/u&gt;의 상세 예시이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. 병렬 실행 자동화&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 체인 안에 여러개의 독립적인 작업이 있다면, 랭체인은 사용자가 멀티스레딩 코드를 짜지 않아도 &lt;b&gt;알아서 동시에 실행&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;size18&quot;&gt;&lt;b&gt;2. 스트리밍 및 비동기 최적화&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;LCEL 로 구성된 체인은 내부의 모든 컴포넌트가 동일한 인터페이스(Runnable)을 따른다&lt;/b&gt;&lt;/span&gt;. 랭체인의 모든 컴포넌트(프롬프트, 모델, 파서)가 Runnable 이라는 규격을 따르고 있다는 것은, 모든 부품들이 &lt;u&gt;&lt;b&gt;실시간 스트리밍 모드(stream 메서드)&lt;/b&gt;&lt;/u&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;일반적인 명령형 코드에서는 데이터를 다 받을 때까지 기다렸다가 다음 단계로 넘기지만, LCEL은 데이터를 조각 단위로 쪼개서 실시간으로 흘려보낸다. 랭체인은 이를 분석하여, 첫번째 단어가 생성하자마자 파서를 통과시켜 사용자에게 전달하는 최단 거리의 데이터 파이프라인을 구축한다.&amp;nbsp;&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;b&gt;&quot;안녕하세요, 반가워요&quot;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;1. 모델이 &quot;안&quot; 이라는 첫 토큰을 뱉음&lt;/li&gt;
&lt;li&gt;2. &quot;안&quot; 은 Runnable 인터페이스를 타고 즉시 파서로 흐름&lt;/li&gt;
&lt;li&gt;3. 파서는 &quot;안&quot;을 받자마다 가공해서 사용자에게 바로 전달함&lt;/li&gt;
&lt;li&gt;4. 사용자는 모델이 전체 문장을 다 만들기도 전에 화면에서 첫 글자가 나타나는 것을 보게 됨&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;size18&quot;&gt;&lt;b&gt;3. 지연 시간 최소화&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;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;랭체인을 사용해 LLM 애플리케이션을 구축하는 필요한 구성요소는 아래와 같다.&amp;nbsp;&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;LLM 모델: 예측을 수행함&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;LLM 애플리케이션은 위와 같은 구성요소로 체인을 형성한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>LangChain</category>
      <author>sian han</author>
      <guid isPermaLink="true">https://feelfreetothink.tistory.com/262</guid>
      <comments>https://feelfreetothink.tistory.com/262#entry262comment</comments>
      <pubDate>Mon, 27 Apr 2026 19:17:24 +0900</pubDate>
    </item>
    <item>
      <title>[LangChain] LLM 에서 특정 형식의 답변 지정</title>
      <link>https://feelfreetothink.tistory.com/261</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;애플리케이션에서 LLM 이 작업한 결과를 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;구조화된 형식&lt;/b&gt;&lt;/span&gt;으로 전달하면 다른 코드가 처리할 수 있어 매우 유용하다.&amp;nbsp;&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;b&gt;▶ JSON 출력&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSON 출력은 프런트엔드 코드에 전달하거나 DB 에 저장할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1777248132113&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from pydantic import BaseModel, Field

# 1. 응답 구조 정의 (Pydantic 모델)
# 모델이 내보낼 JSON의 '스키마' 역할을 합니다.
class AnswerWithJustification(BaseModel):
    answer: str = Field(description=&quot;사용자의 질문에 대한 핵심 답변&quot;)
    justification: str = Field(description=&quot;답변에 대한 기술적 근거 또는 이유&quot;)

# 2. 모델 설정
llm = ChatOpenAI(model=&quot;gpt-4o&quot;, temperature=0)

# 3. 모델에 구조적 출력 기능 입히기 (핵심!)
# 이 단계를 거치면 llm은 무조건 AnswerWithJustification 형식을 따릅니다.
structured_llm = llm.with_structured_output(AnswerWithJustification)

# 4. 프롬프트 정의
# 여기서는 지구 복잡한 format_instructions를 넣을 필요가 없습니다.
prompt = ChatPromptTemplate.from_messages([
    (&quot;system&quot;, &quot;너는 백엔드 개발 전문가야. 질문에 대해 정확한 답변과 근거를 제공해줘.&quot;),
    (&quot;user&quot;, &quot;{question}&quot;)
])

# 5. 체인 구성 (파서가 필요 없음!)
chain = prompt | structured_llm

# 6. 실행
question_text = &quot;레이어드 아키텍처(Layered Architecture)의 장점은 뭐야?&quot;
response = chain.invoke({&quot;question&quot;: question_text})

# 7. 결과 확인
print(&quot;--- 결과 타입 ---&quot;)
print(type(response))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;with_structured_output&lt;/b&gt;&lt;/u&gt; 메서드는 선언된 스키마 &lt;b&gt;AnswerWithJustification&lt;/b&gt; 를 두가지 용도로 활용한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스키마를 JSONSchema 객체로 변환하해 LLM 에 전송한다. 해당 객체는 JSON 데이터의 구조를 기술한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스키마는 LLM이 변환한 출력물을 반환하기 전에 그 유효성을 검증한다.&amp;nbsp;&lt;/p&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 외에도 CSV나 XML 같은 출력물을 생성하도록 지시할 수 있는데, 이 경우 &lt;b&gt;출력파서&lt;/b&gt;가 유용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;▶ 출력파서&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM 응답을 구조화 하는 클래스다. 출력 파서는 아래 두 가지 기능을 수행한다.&amp;nbsp;&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;b&gt;출력 형식 지정&lt;/b&gt; : 프롬프트에 추가 지시 사항을 삽입해, LLM이 파싱하기 좋은 형식으로 텍스트를 출력하도록 유도한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;출력 검증 및 파싱&lt;/b&gt; : LLM 또는 채팅 모델의 텍스트 출력 겨로가물을 받아 리스트, XML 등의 구조화된 형식으로 가공한다. 불필요한 정보를 제거하고, 불완전한 출력을 수정하며, 파싱한 값을 검증한다.&amp;nbsp;&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;size18&quot;&gt;&lt;b&gt; ▷ CSV 출력 파서 예제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;14&quot; data-path-to-node=&quot;0&quot;&gt;CommaSeparatedListOutputParser &lt;/b&gt;파서는 모델이 내놓은 문자열을 파이썬의 list 객체로 변환해준다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1777248949926&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import CommaSeparatedListOutputParser

# 1. 모델 설정
model = ChatOpenAI(model=&quot;gpt-4o&quot;, temperature=0)

# 2. CSV 출력 파서 설정
output_parser = CommaSeparatedListOutputParser()

# 3. 프롬프트 템플릿 정의
# get_format_instructions()는 &quot;쉼표로 구분된 리스트로 답해라&quot;라는 지시문을 생성합니다.
prompt = ChatPromptTemplate.from_messages([
    (&quot;system&quot;, &quot;너는 IT 기술 트렌드 전문가야. 사용자가 제시한 주제와 관련된 기술 키워드 5개를 뽑아줘.\n{format_instructions}&quot;),
    (&quot;user&quot;, &quot;{subject}&quot;)
])

# 4. LCEL 체인 구성
chain = prompt | model | output_parser

# 5. 실행
# format_instructions를 반드시 입력값으로 넣어줘야 모델이 형식을 지킵니다.
response = chain.invoke({
    &quot;subject&quot;: &quot;MSA(Microservices Architecture)&quot;,
    &quot;format_instructions&quot;: output_parser.get_format_instructions()
})

# 6. 결과 확인
print(&quot;--- 결과 타입 ---&quot;)
print(type(response)) # &amp;lt;class 'list'&amp;gt;

print(&quot;\n--- 파싱된 리스트 ---&quot;)
print(response)&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;이때 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;&lt;b&gt;1. 모델의 원본 응답 (AIMessage)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 모델은 내부적으로 아래와 같은 문자열을 생성한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1777249059124&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;Docker, Kubernetes, Kafka, API Gateway, gRPC&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;b&gt;2. 파서의 처리 (OutputParser)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CommaSeparatedListOutputParser 가 쉼표를 기준으로 문자열을 쪼개고, 각 단어의 앞뒤 불필요한 공백을 제거한다.&amp;nbsp;&lt;/p&gt;
&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;3. 최종결과&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬 코드에서 즉시 사용가능한 리스트 객체가 된다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1777249113508&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;['Docker', 'Kubernetes', 'API Gateway', 'gRPC']&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;랭체인은 CSV, XML 등 다양한 경우에 대응하는 출력 파서를 제공한다.&amp;nbsp;&lt;/p&gt;</description>
      <category>LangChain</category>
      <author>sian han</author>
      <guid isPermaLink="true">https://feelfreetothink.tistory.com/261</guid>
      <comments>https://feelfreetothink.tistory.com/261#entry261comment</comments>
      <pubDate>Mon, 27 Apr 2026 09:22:34 +0900</pubDate>
    </item>
  </channel>
</rss>