<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>온달의 해피클라우드(Happy@Cloud)</title>
    <link>https://happycloud-lee.tistory.com/</link>
    <description>  Cloud와 관련된 비즈니스와 IT 주제들을 공유합니다. 온달이라는 별명처럼 부족한게 많아 항상 배우려는 자세로 세상을 살고 있습니다. [ hiondal@gmail.com ]</description>
    <language>ko</language>
    <pubDate>Fri, 7 Aug 2026 18:14:03 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Happy@Cloud</managingEditor>
    <image>
      <title>온달의 해피클라우드(Happy@Cloud)</title>
      <url>https://tistory1.daumcdn.net/tistory/3221122/attach/7bef0ce09340472b8a5986832a627f95</url>
      <link>https://happycloud-lee.tistory.com</link>
    </image>
    <item>
      <title>DMAP 빌더: 코드 없이 멀티에이전트 플러그인 만들기</title>
      <link>https://happycloud-lee.tistory.com/299</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;DMAP &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;빌더&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;: &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;코드&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;없이&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;멀티에이전트&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;플러그인&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;만들기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;선언형&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;멀티에이전트&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;플러그인의&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;세계로&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;초대합니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h1&gt;&lt;span&gt;멀티에이전트&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;개발&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;지금&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;뭐가&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;불편한가요&lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;오케스트라를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;상상해보세요&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;지휘자가&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;악보&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;없이&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;수십&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;명의&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;연주자에게&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;알아서&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;잘&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;맞춰봐&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;라고&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;한다면&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;어떨까요&lt;/span&gt;&lt;span&gt;? &lt;/span&gt;&lt;span&gt;아마&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;끔찍한&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;소음이&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;나겠죠&lt;/span&gt;&lt;span&gt;. AI &lt;/span&gt;&lt;span&gt;에이전트도&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;마찬가지입니다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;에이전트&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;개일&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;때는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;괜찮습니다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;하지만&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;여러&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;에이전트가&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;협업해야&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;하는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;순간&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;복잡도가&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;폭발적으로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;늘어나요&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;기존&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;방식은&lt;/span&gt;&lt;span&gt; Python SDK&lt;/span&gt;&lt;span&gt;로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;직접&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;코딩하거나&lt;/span&gt;&lt;span&gt;, LangChain, CrewAI, AutoGen &lt;/span&gt;&lt;span&gt;같은&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;프레임워크를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;배워야&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;합니다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;프레임워크마다&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;문법이&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;다르고&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;특정&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;런타임에&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;종속되어&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;버리죠&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;진입장벽은&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;높고&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;유지보수는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;어렵고&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;다른&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;환경으로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;옮기려면&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;처음부터&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;다시&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;만들어야&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;합니다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;저는 그래서 근본적인 질문부터 해봤습니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;에이전트를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;정의하는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;데&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;꼭&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;코드가&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;필요할까&lt;/span&gt;&lt;span&gt;?&quot;&lt;/span&gt;&lt;/p&gt;
&lt;h1&gt;&lt;span&gt;DMAP &lt;/span&gt;&lt;span&gt;빌더란&lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;레고를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;떠올려보세요&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;설명서만&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;보고&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;블록을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;조립하면&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;멋진&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;작품이&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;완성되잖아요&lt;/span&gt;&lt;span&gt;? &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;DMAP &lt;/span&gt;&lt;span&gt;빌더도&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;같은&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;원리입니다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;b&gt;&lt;span&gt;코드&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;한&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;줄&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;없이&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;, Markdown&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;과&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt; YAML &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;파일만&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;작성하면&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;멀티에이전트&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;플러그인이&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;뚝딱&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt; &lt;/span&gt;&lt;/b&gt;&lt;span&gt;만들어집니다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;DMAP&lt;/span&gt;&lt;span&gt;는&lt;/span&gt;&lt;span&gt; &lt;b&gt;&lt;span&gt;Declarative Multi-Agent Plugin&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;의&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;약자입니다&lt;/span&gt;&lt;span&gt;. &quot;&lt;/span&gt;&lt;span&gt;선언형&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;이라는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;말이&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;어렵게&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;느껴질&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;수&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;있는데&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;쉽게&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;말하면&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;어떻게&lt;/span&gt;&lt;span&gt;(HOW)&quot; &lt;/span&gt;&lt;span&gt;대신&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;무엇을&lt;/span&gt;&lt;span&gt;(WHAT)&quot;&lt;/span&gt;&lt;span&gt;만&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;적는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;방식이에요&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;택시&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;기사에게&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;경로를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;일일이&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;지시하는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;대신&lt;/span&gt;&lt;span&gt;, &quot;&lt;/span&gt;&lt;span&gt;강남역이요&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;라고&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;목적지만&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;말하는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;것처럼요&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;DMAP&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;의&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;핵심&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;가치&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;middot;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;선언형&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;명세&lt;/span&gt;&lt;span&gt; &amp;mdash; &lt;/span&gt;&lt;span&gt;코드&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;대신&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;문서로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;에이전트를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;정의합니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;middot;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;런타임&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;중립&lt;/span&gt;&lt;span&gt; &amp;mdash; Claude Code, Codex CLI &lt;/span&gt;&lt;span&gt;등&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;어디서든&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;동작해요&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;middot;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;관심사&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;분리&lt;/span&gt;&lt;span&gt; &amp;mdash; &lt;/span&gt;&lt;span&gt;역할별로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;깔끔하게&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;나뉘어&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;유지보수가&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;쉽습니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;middot;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;비개발자&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;접근성&lt;/span&gt;&lt;span&gt; &amp;mdash; &lt;/span&gt;&lt;span&gt;마크다운만&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;쓸&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;줄&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;알면&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;누구나&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;만들&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;수&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;있어요&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;middot;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;도메인&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;범용&lt;/span&gt;&lt;span&gt; &amp;mdash; &lt;/span&gt;&lt;span&gt;어떤&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;업무&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;영역이든&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;적용&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;가능합니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #d5e8f0;&quot; width=&quot;151&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;구분&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #d5e8f0;&quot; width=&quot;227&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기존&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;프레임워크&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #d5e8f0;&quot; width=&quot;227&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DMAP&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;151&quot;&gt;&lt;span&gt;&lt;span&gt;명세&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;방식&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;227&quot;&gt;&lt;span&gt;&lt;span&gt;Python/TypeScript &lt;/span&gt;&lt;span&gt;코드&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;227&quot;&gt;&lt;span&gt;&lt;span&gt;Markdown + YAML&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;151&quot;&gt;&lt;span&gt;&lt;span&gt;런타임&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;227&quot;&gt;&lt;span&gt;&lt;span&gt;프레임워크&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;전용&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;엔진&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;227&quot;&gt;&lt;span&gt;&lt;span&gt;Claude Code, Codex CLI &lt;/span&gt;&lt;span&gt;등&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;151&quot;&gt;&lt;span&gt;&lt;span&gt;진입장벽&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;227&quot;&gt;&lt;span&gt;&lt;span&gt;코딩&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;필수&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;227&quot;&gt;&lt;span&gt;&lt;span&gt;마크다운&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;작성&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;가능하면&lt;/span&gt;&lt;span&gt; OK&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;151&quot;&gt;&lt;span&gt;&lt;span&gt;도구&lt;span&gt;/&lt;/span&gt;모델&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;교체&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;227&quot;&gt;&lt;span&gt;&lt;span&gt;코드&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;수정&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;필요&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;227&quot;&gt;&lt;span&gt;&lt;span&gt;YAML &lt;/span&gt;&lt;span&gt;한&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;줄&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;변경&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&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;background-color: #e8f0fe;&quot; width=&quot;627&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;현재&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;버전&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;안내&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt; (2026.2&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;월&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;)&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; v1.0.0&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;현재&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; DMAP &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;빌더는&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Claude Code &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;전용&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;으로&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;제공됨&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;br /&gt;DMAP &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;표준&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;자체는&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;런타임&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;중립적으로&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;설계되었으며&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;향후&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; Codex CLI, Gemini CLI &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;등&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;멀티&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;런타임&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지원으로&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;확장&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;예정&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;임&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h1&gt;&lt;span&gt;핵심&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;개념&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;회사에&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;비유하면&lt;/span&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;DMAP&lt;/span&gt;&lt;span&gt;의&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;구조를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;회사&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;조직에&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;비유하면&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;이해하기&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;쉬워요&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;회사에는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;부서장&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;전문가&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;통역사가&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;있잖아요&lt;/span&gt;&lt;span&gt;? DMAP&lt;/span&gt;&lt;span&gt;도&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;비슷한&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;구조입니다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;Skills = &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;부서장&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;스킬은&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;일을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;배분하는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;부서장&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;같은&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;역할이에요&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;사용자의&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;요청을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;받아서&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;어떤&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;에이전트에게&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;어떤&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;일을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;시킬지&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;결정합니다&lt;/span&gt;&lt;span&gt;. SKILL.md &lt;/span&gt;&lt;span&gt;파일&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;하나로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;워크플로우&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;전체를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;선언하죠&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;Agents = &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;전문가&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;에이전트는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;실제&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;일을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;하는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;전문가입니다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;각&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;에이전트는&lt;/span&gt;&lt;span&gt; AGENT.md(&lt;/span&gt;&lt;span&gt;역할&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;정의&lt;/span&gt;&lt;span&gt;), agentcard.yaml(&lt;/span&gt;&lt;span&gt;메타데이터&lt;/span&gt;&lt;span&gt;), tools.yaml(&lt;/span&gt;&lt;span&gt;사용&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;가능한&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;도구&lt;/span&gt;&lt;span&gt;) 3&lt;/span&gt;&lt;span&gt;개&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;파일로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;구성돼요&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;Gateway = &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;통역사&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;게이트웨이는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;추상적인&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;선언을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;구체적인&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;실행&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;환경으로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;번역하는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;통역사입니다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;에이전트가&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;파일&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;검색&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;도구&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;라고&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;선언하면&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;게이트웨이가&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;실제&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;런타임에서&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;어떤&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;도구를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;쓸지&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;매핑해줘요&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;리소스&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;마켓플레이스&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt; = &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;사내&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;공유&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;드라이브&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;가이드&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;템플릿&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;샘플&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;도구를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;모아둔&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;공유&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;저장소입니다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;여러&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;플러그인이&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;함께&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;사용할&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;수&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;있는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;공용&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;자원이에요&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;컴포넌트들은&lt;/span&gt;&lt;span&gt; &lt;b&gt;&lt;span&gt;Clean Architecture &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span&gt;원칙&lt;/span&gt;&lt;/b&gt;&lt;span&gt;을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;따릅니다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Skills &amp;rarr; Agents &amp;rarr; Gateway &lt;/span&gt;&lt;span&gt;순서로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;단방향&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;의존하기&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;때문에&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;각&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;부분을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;독립적으로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;수정하거나&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;교체할&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;수&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;있어요&lt;/span&gt;&lt;span&gt;.&lt;/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;background-color: #e8f0fe;&quot; width=&quot;627&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #3366cc;&quot;&gt;TIP: &lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;선언형이란&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;? &quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;어떻게&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(HOW)&quot; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;대신&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;무엇을&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(WHAT)&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;만&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;적으면&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;됩니다&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;! &lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;SQL&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;처럼&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;원하는&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;결과만&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;말하면&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;실행은&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;엔진이&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;알아서&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해줘요&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&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;936&quot; data-origin-height=&quot;511&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bt14fI/dJMcajgM3Ge/LpQLhSrvfOUq1DXGpiSQOK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bt14fI/dJMcajgM3Ge/LpQLhSrvfOUq1DXGpiSQOK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bt14fI/dJMcajgM3Ge/LpQLhSrvfOUq1DXGpiSQOK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbt14fI%2FdJMcajgM3Ge%2FLpQLhSrvfOUq1DXGpiSQOK%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;624&quot; height=&quot;341&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;511&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span&gt;DMAP &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt;아키텍처&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt; &amp;mdash; Clean Architecture &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt;기반&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt; &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt;컴포넌트&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt; &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt;구성&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;h1&gt;&lt;span&gt;동작&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;원리&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;어떻게&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;돌아갈까요&lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;프롬프트&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;조립&lt;/span&gt;&lt;span&gt; &amp;mdash; &lt;/span&gt;&lt;span&gt;여행&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;가이드북&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;만들기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;해외여행을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;갈&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;때&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;가이드북을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;만든다고&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;생각해보세요&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;기본&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;정보&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;공통&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;규칙&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;에&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;목적지별&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;정보&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;에이전트&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;역할&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;합치고&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;마지막에&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;오늘의&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;일정&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;작업&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;지시&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;추가하면&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;완성되죠&lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;DMAP&lt;/span&gt;&lt;span&gt;도&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;같은&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;방식으로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;프롬프트를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;조립합니다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;먼저&lt;/span&gt;&lt;span&gt; Gateway&lt;/span&gt;&lt;span&gt;의&lt;/span&gt;&lt;span&gt; runtime-mapping&lt;/span&gt;&lt;span&gt;으로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;공통&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;설정을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;로드하고&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;에이전트&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;패키지&lt;/span&gt;&lt;span&gt; 3&lt;/span&gt;&lt;span&gt;개&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;파일&lt;/span&gt;&lt;span&gt;(AGENT.md, agentcard.yaml, tools.yaml)&lt;/span&gt;&lt;span&gt;을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;합친&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;뒤&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;마지막으로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;스킬이&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;전달하는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;동적&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;작업&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;지시를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;붙여서&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;최종&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;프롬프트를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;완성합니다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;497&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOCajL/dJMcafZNq0J/P5N09ItxIs8c3fOzd3xkn0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOCajL/dJMcafZNq0J/P5N09ItxIs8c3fOzd3xkn0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOCajL/dJMcafZNq0J/P5N09ItxIs8c3fOzd3xkn0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOCajL%2FdJMcafZNq0J%2FP5N09ItxIs8c3fOzd3xkn0%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;607&quot; height=&quot;331&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;497&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span&gt;프롬프트&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt; &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt;조립&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt; &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt;과정&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt; &amp;mdash; 3&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt;단계&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt; &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt;레이어&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt; &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt;구성&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;4-Tier &lt;/span&gt;&lt;span&gt;매핑&lt;/span&gt;&lt;span&gt; &amp;mdash; &lt;/span&gt;&lt;span&gt;택시&lt;/span&gt;&lt;span&gt; vs &lt;/span&gt;&lt;span&gt;버스&lt;/span&gt;&lt;span&gt; vs KTX&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;모든&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;일에&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;택시를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;탈&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;필요는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;없잖아요&lt;/span&gt;&lt;span&gt;? &lt;/span&gt;&lt;span&gt;가까운&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;곳은&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;버스로&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;먼&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;곳은&lt;/span&gt;&lt;span&gt; KTX&lt;/span&gt;&lt;span&gt;로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;가면&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;비용도&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;절약되고&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;효율적이죠&lt;/span&gt;&lt;span&gt;. DMAP&lt;/span&gt;&lt;span&gt;의&lt;/span&gt;&lt;span&gt; 4-Tier &lt;/span&gt;&lt;span&gt;매핑도&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;같은&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;원리입니다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;작업의&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;복잡도에&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;따라&lt;/span&gt;&lt;span&gt; HEAVY, HIGH, MEDIUM, LOW 4&lt;/span&gt;&lt;span&gt;단계로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;나누고&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;각&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;단계에&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;적합한&lt;/span&gt;&lt;span&gt; AI &lt;/span&gt;&lt;span&gt;모델을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;배정해요&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;간단한&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;파일&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;검색은&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;가벼운&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;모델&lt;/span&gt;&lt;span&gt;(Haiku)&lt;/span&gt;&lt;span&gt;이&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;복잡한&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;아키텍처&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;설계는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;강력한&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;모델&lt;/span&gt;&lt;span&gt;(Opus)&lt;/span&gt;&lt;span&gt;이&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;담당합니다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;작업&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;중&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;난이도가&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;올라가면&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;자동으로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;상위&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;모델로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;에스컬레이션되기도&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;해요&lt;/span&gt;&lt;span&gt;.&lt;/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;954&quot; data-origin-height=&quot;520&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAlrgM/dJMb99ZCISG/YKkXmyh4qsDXDzD6CJu2lK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAlrgM/dJMb99ZCISG/YKkXmyh4qsDXDzD6CJu2lK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAlrgM/dJMb99ZCISG/YKkXmyh4qsDXDzD6CJu2lK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAlrgM%2FdJMb99ZCISG%2FYKkXmyh4qsDXDzD6CJu2lK%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;636&quot; height=&quot;347&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;520&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span&gt;4-Tier &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt;모델&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt; &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt;매핑&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt; &amp;mdash; &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt;복잡도별&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt; &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt;최적&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt; &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt;모델&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt; &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt;배정&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;스킬&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;활성화&lt;/span&gt;&lt;span&gt; &amp;mdash; 114 &lt;/span&gt;&lt;span&gt;안내교환대&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;예전&lt;/span&gt;&lt;span&gt; 114 &lt;/span&gt;&lt;span&gt;안내교환대를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;기억하시나요&lt;/span&gt;&lt;span&gt;? &quot;&lt;/span&gt;&lt;span&gt;피자집&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;전화번호&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;알려주세요&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;라고&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;하면&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;알아서&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;연결해주었죠&lt;/span&gt;&lt;span&gt;. DMAP&lt;/span&gt;&lt;span&gt;의&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;스킬&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;활성화도&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;비슷합니다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;두&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;가지&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;경로가&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;있어요&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;첫째&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;슬래시&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;명령어로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;직접&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;호출하는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;방법&lt;/span&gt;&lt;span&gt; &amp;mdash; &lt;/span&gt;&lt;span&gt;정확히&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;어떤&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;스킬이&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;필요한지&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;알&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;때&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;사용합니다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;둘째&lt;/span&gt;&lt;span&gt;, Core &lt;/span&gt;&lt;span&gt;스킬을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;경유하는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;방법&lt;/span&gt;&lt;span&gt; &amp;mdash; &lt;/span&gt;&lt;span&gt;모호한&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;요청이&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;들어오면&lt;/span&gt;&lt;span&gt; Core&lt;/span&gt;&lt;span&gt;가&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;의도를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;분석해서&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;적절한&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;스킬로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;라우팅해줘요&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;런타임은&lt;/span&gt;&lt;span&gt; skills/ &lt;/span&gt;&lt;span&gt;디렉토리를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;자동&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;스캔해서&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;사용&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;가능한&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;스킬을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;발견합니다&lt;/span&gt;&lt;span&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;937&quot; data-origin-height=&quot;511&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXavJ1/dJMcajgM3Gf/PcPAHbuPqYq4k4eoUIKGeK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXavJ1/dJMcajgM3Gf/PcPAHbuPqYq4k4eoUIKGeK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXavJ1/dJMcajgM3Gf/PcPAHbuPqYq4k4eoUIKGeK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXavJ1%2FdJMcajgM3Gf%2FPcPAHbuPqYq4k4eoUIKGeK%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;625&quot; height=&quot;341&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;511&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span&gt;스킬&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt; &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt;활성화&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt; &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt;경로&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt; &amp;mdash; &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt;직접&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt; &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt;호출과&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt; Core &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt;경유&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;h1&gt;&lt;span&gt;플러그인&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;개발&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;방법&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;요리&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;레시피&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;따라하기&lt;/span&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;요리를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;할&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;때&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;레시피를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;따라하면&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;누구나&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;맛있는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;음식을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;만들&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;수&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;있잖아요&lt;/span&gt;&lt;span&gt;? DMAP &lt;/span&gt;&lt;span&gt;플러그인&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;개발도&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;마찬가지입니다&lt;/span&gt;&lt;span&gt;. 4&lt;/span&gt;&lt;span&gt;단계&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;레시피만&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;따라가면&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;플러그인이&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;완성돼요&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #d5e8f0;&quot; width=&quot;113&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Phase&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #d5e8f0;&quot; width=&quot;189&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;단계&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #d5e8f0;&quot; width=&quot;302&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;비유&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;189&quot;&gt;&lt;span&gt;&lt;span&gt;요구사항&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;수집&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;302&quot;&gt;&lt;span&gt;&lt;span&gt;어떤&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;요리를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;만들지&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;정하기&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;189&quot;&gt;&lt;span&gt;&lt;span&gt;설계&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;및&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;계획&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;302&quot;&gt;&lt;span&gt;&lt;span&gt;레시피&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;작성하기&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;189&quot;&gt;&lt;span&gt;&lt;span&gt;플러그인&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;개발&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;302&quot;&gt;&lt;span&gt;&lt;span&gt;실제&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;요리하기&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;189&quot;&gt;&lt;span&gt;&lt;span&gt;검증&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;및&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;완료&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;302&quot;&gt;&lt;span&gt;&lt;span&gt;시식하고&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;플레이팅&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;각&lt;/span&gt;&lt;span&gt; Phase&lt;/span&gt;&lt;span&gt;가&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;끝날&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;때마다&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;사용자의&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;확인을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;받습니다&lt;/span&gt;&lt;span&gt;. &quot;&lt;/span&gt;&lt;span&gt;이&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;요리&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;맞죠&lt;/span&gt;&lt;span&gt;?&quot;&lt;/span&gt;&lt;span&gt;라고&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;중간중간&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;물어보는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;셈이에요&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;덕분에&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;엉뚱한&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;결과물이&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;나오는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;걸&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;미리&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;방지할&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;수&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;있습니다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;h1&gt;&lt;span&gt;실전&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;예제&lt;/span&gt;&lt;span&gt;: abra &lt;/span&gt;&lt;span&gt;플러그인&lt;/span&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;백문이&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;불여일견&lt;/span&gt;&lt;span&gt;! &lt;/span&gt;&lt;span&gt;실제로&lt;/span&gt;&lt;span&gt; DMAP&lt;/span&gt;&lt;span&gt;으로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;만든&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;플러그인을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;살펴볼게요&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&quot;abra&quot;&lt;/span&gt;&lt;span&gt;는&lt;/span&gt;&lt;span&gt; Dify &lt;/span&gt;&lt;span&gt;워크플로우&lt;/span&gt;&lt;span&gt; DSL &lt;/span&gt;&lt;span&gt;자동화&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;플러그인입니다&lt;/span&gt;&lt;span&gt;. Dify&lt;/span&gt;&lt;span&gt;라는&lt;/span&gt;&lt;span&gt; AI &lt;/span&gt;&lt;span&gt;워크플로우&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;플랫폼에서&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;사용하는&lt;/span&gt;&lt;span&gt; DSL(Domain Specific Language)&lt;/span&gt;&lt;span&gt;을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;자동으로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;생성하고&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;프로토타이핑까지&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;해주는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;똑똑한&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;플러그인이에요&lt;/span&gt;&lt;span&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;background-color: #e8f0fe;&quot; width=&quot;627&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Abra&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;는 아브라카타브라&lt;span&gt;(Abracadabra: &lt;/span&gt;원하는 것이 모두 이루어지는 마법의 주문&lt;span&gt;)&lt;/span&gt;에서 착안한 이름&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;에이전트&lt;/span&gt;&lt;span&gt; 5&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;명의&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;전문가&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;팀&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;middot;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;scenario-analyst &amp;mdash; &lt;/span&gt;&lt;span&gt;요구사항을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;분석하고&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;시나리오를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;만드는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;기획자&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;middot;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;dsl-architect &amp;mdash; Dify DSL &lt;/span&gt;&lt;span&gt;코드를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;설계하는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;아키텍트&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;middot;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;plan-writer &amp;mdash; &lt;/span&gt;&lt;span&gt;개발계획서를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;작성하는&lt;/span&gt;&lt;span&gt; PM&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;middot;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;prototype-runner &amp;mdash; Dify&lt;/span&gt;&lt;span&gt;에서&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;프로토타이핑을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;실행하는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;테스터&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;middot;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;agent-developer &amp;mdash; &lt;/span&gt;&lt;span&gt;최종&lt;/span&gt;&lt;span&gt; Agent &lt;/span&gt;&lt;span&gt;코드를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;개발하는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;개발자&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;스킬&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt; 8&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;개&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt; &amp;mdash; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;부서장들의&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;업무&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;지시서&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;setup, core, dify-setup, scenario, dsl-generate, prototype, dev-plan, develop &amp;mdash; &lt;/span&gt;&lt;span&gt;각&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;스킬이&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;워크플로우의&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;한&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;단계를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;담당합니다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;사용자&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;입장에서는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;시나리오&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;생성&lt;/span&gt;&lt;span&gt; &amp;rarr; DSL &lt;/span&gt;&lt;span&gt;생성&lt;/span&gt;&lt;span&gt; &amp;rarr; &lt;/span&gt;&lt;span&gt;프로토타이핑&lt;/span&gt;&lt;span&gt; &amp;rarr; &lt;/span&gt;&lt;span&gt;개발계획&lt;/span&gt;&lt;span&gt; &amp;rarr; Agent &lt;/span&gt;&lt;span&gt;개발&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;순서로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;자연스럽게&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;진행돼요&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;복잡한&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;내부&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;구조를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;몰라도&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;됩니다&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&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;955&quot; data-origin-height=&quot;521&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QJNwx/dJMcaioIDIH/7cFEI7gW2ZcMgtWWRWDpsk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QJNwx/dJMcaioIDIH/7cFEI7gW2ZcMgtWWRWDpsk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QJNwx/dJMcaioIDIH/7cFEI7gW2ZcMgtWWRWDpsk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQJNwx%2FdJMcaioIDIH%2F7cFEI7gW2ZcMgtWWRWDpsk%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;637&quot; height=&quot;347&quot; data-origin-width=&quot;955&quot; data-origin-height=&quot;521&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span&gt;abra &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt;플러그인&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt; &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt;구조&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt; &amp;mdash; 5&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt;개&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt; &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt;에이전트와&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt; 8&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt;개&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt; &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt;스킬의&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt; &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span&gt;협업&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;h1&gt;&lt;span&gt;앞으로의&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;로드맵&lt;/span&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;DMAP&lt;/span&gt;&lt;span&gt;는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;계속&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;진화하고&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;있습니다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;앞으로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;어떤&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;모습이&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;될지&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;살짝&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;엿볼게요&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;현재&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;middot;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Claude Code &lt;/span&gt;&lt;span&gt;런타임&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;기반으로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;안정적으로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;동작&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;중&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;단기&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;계획&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;middot;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;다중&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;런타임&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;지원&lt;/span&gt;&lt;span&gt; &amp;mdash; Codex CLI, Gemini CLI &lt;/span&gt;&lt;span&gt;등&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;다양한&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;환경에서&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;실행&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;중기&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;계획&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;middot;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;플러그인&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;마켓플레이스&lt;/span&gt;&lt;span&gt; &amp;mdash; &lt;/span&gt;&lt;span&gt;만든&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;플러그인을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;공유하고&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;다운로드하는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;생태계&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;구축&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;middot;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;커뮤니티&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;생태계&lt;/span&gt;&lt;span&gt; &amp;mdash; &lt;/span&gt;&lt;span&gt;개발자들이&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;함께&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;성장하는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;오픈소스&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;커뮤니티&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;장기&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;비전&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;middot;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;비개발자용&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;시각적&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;플러그인&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;빌더&lt;/span&gt;&lt;span&gt; &amp;mdash; &lt;/span&gt;&lt;span&gt;드래그&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;앤&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;드롭으로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;플러그인을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;만드는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;노코드&lt;/span&gt;&lt;span&gt; UI&lt;/span&gt;&lt;/p&gt;
&lt;h1&gt;&lt;span&gt;지금&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;바로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;시작하기&lt;/span&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;어렵게&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;느껴지셨나요&lt;/span&gt;&lt;span&gt;? &lt;/span&gt;&lt;span&gt;걱정&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;마세요&lt;/span&gt;&lt;span&gt;. 4&lt;/span&gt;&lt;span&gt;단계면&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;시작할&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;수&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;있습니다&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;middot;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Step 1: DMAP &lt;/span&gt;&lt;span&gt;표준&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;문서를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;읽고&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;전체&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;구조를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;파악&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;middot;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Step 2: &lt;/span&gt;&lt;span&gt;플로그인&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;요구사항&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;명세서&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;작성&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;middot;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Step 3: &lt;/span&gt;&lt;span&gt;/dmap:develop-plugin &lt;/span&gt;&lt;span&gt;명령으로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;플러그인&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;개발&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;시작&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;middot;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Step 4: &lt;/span&gt;&lt;span&gt;플러그인 설치 및 테스트&lt;span&gt;(&lt;/span&gt;플러그인의&lt;span&gt; README.md &lt;/span&gt;참조&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;코드&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;한&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;줄&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;없이&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;멀티에이전트&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;플러그인을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;만들&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;수&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;있다는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;걸&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;직접&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;경험해보세요&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;지&lt;/span&gt;&lt;span&gt;금&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;바로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;시작해보세요&lt;/span&gt;&lt;span&gt;!&lt;/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;background-color: #e8f0fe;&quot; width=&quot;627&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #3366cc;&quot;&gt;TIP: &lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DMAP &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;표준&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;문서와&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;샘플은&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; GitHub&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;에서&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;확인하세요&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;: &lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;표준문서&lt;span&gt;: &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;https://github.com/cna-bootcamp/gen-dmap/blob/main/standards/plugin-standard.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/cna-bootcamp/gen-dmap&lt;/a&gt;&lt;/span&gt;&lt;a href=&quot;https://github.com/cna-bootcamp/gen-dmap/blob/main/standards/plugin-standard.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span&gt;/blob/main/standards/plugin-standard.md&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;요구사항 샘플&lt;span&gt;: &lt;a href=&quot;https://github.com/cna-bootcamp/abra/blob/main/putput/requirement.md&quot;&gt;https://github.com/cna-bootcamp/abra/blob/main/output/requirement.md&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>AI/MAS</category>
      <category>#MAS</category>
      <category>agentic ai</category>
      <category>AI</category>
      <category>플러그인</category>
      <author>Happy@Cloud</author>
      <guid isPermaLink="true">https://happycloud-lee.tistory.com/299</guid>
      <comments>https://happycloud-lee.tistory.com/299#entry299comment</comments>
      <pubDate>Tue, 10 Feb 2026 18:09:58 +0900</pubDate>
    </item>
    <item>
      <title>HAProxy 서버 설치</title>
      <link>https://happycloud-lee.tistory.com/298</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이 가이드는 Ubuntu 기준으로 작성되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CentOS 기반의 가이드는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://kubepia.github.io/cloudpak/cp4app/install/infra05.html&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;size16&quot;&gt;1.&amp;nbsp;설치&lt;br /&gt;apt-get&amp;nbsp;install&amp;nbsp;-y&amp;nbsp;haproxy&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.&amp;nbsp;설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 예제를 참조하여 작성하십시오.&amp;nbsp;&lt;br /&gt;sudo&amp;nbsp;cp&amp;nbsp;/etc/haproxy/haproxy.cfg&amp;nbsp;/etc/haproxy/haproxy.cfg.bak&lt;br /&gt;vi&amp;nbsp;/etc/haproxy/haproxy.cfg&lt;/p&gt;
&lt;pre id=&quot;code_1728148906943&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;global
	log /dev/log	local0
	log /dev/log	local1 notice
	chroot /var/lib/haproxy
	stats socket /run/haproxy/admin.sock mode 660 level admin
	stats timeout 30s
	user haproxy
	group haproxy
	daemon

	# Default SSL material locations
	ca-base /etc/ssl/certs
	crt-base /etc/ssl/private

	# See: https://ssl-config.mozilla.org/#server=haproxy&amp;amp;server-version=2.0.3&amp;amp;config=intermediate
        ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
        ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
        ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets

defaults
	log	global
	mode	http
	option	httplog
	option	dontlognull
        timeout connect 5000
        timeout client  50000
        timeout server  50000
	errorfile 400 /etc/haproxy/errors/400.http
	errorfile 403 /etc/haproxy/errors/403.http
	errorfile 408 /etc/haproxy/errors/408.http
	errorfile 500 /etc/haproxy/errors/500.http
	errorfile 502 /etc/haproxy/errors/502.http
	errorfile 503 /etc/haproxy/errors/503.http
	errorfile 504 /etc/haproxy/errors/504.http
	maxconn                 3000

listen stats
    bind :9000
    mode http
    stats enable
    stats uri /
    monitor-uri /healthz

frontend api-server
    bind *:6443
    default_backend api-server
    mode tcp
    option tcplog

backend api-server
    balance source
    mode tcp
    server controlplane controlplane.msa.edutdc.com:6443 check

frontend http-in
    bind *:80
    mode tcp
    option tcplog
    default_backend http-backend

frontend https-in
    bind *:443
    mode tcp
    option tcplog
    default_backend https-backend

backend http-backend
    mode tcp
    server worker1 worker1.msa.edutdc.com:30080
    server worker2 worker2.msa.edutdc.com:30080

backend https-backend
    mode tcp
    server worker1 worker1.msa.edutdc.com:30443
    server worker2 worker2.msa.edutdc.com:30443&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ingress-nginx contrller 서비스 객체를 Node port로 오픈해야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.&amp;nbsp;적용&lt;br /&gt;systemctl&amp;nbsp;restart&amp;nbsp;haproxy&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;Pod에서 haproxy서버 통해 outbound 시 Troubleshooting&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pod내에서 외부 사이트(예: github.com)를 접속할 때 haproxy서버가 설치된 VM을 통해 나가게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http통신이라면 문제가 없지만, https 통신시에는 문제가 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, &lt;a href=&quot;https://github.com으로&quot;&gt;https://github.com으로&lt;/a&gt; 통신을 시도하면 &lt;a href=&quot;http://github.com의&quot;&gt;github.com의&lt;/a&gt; 주소가 실제 외부 IP가 아닌 haproxy 서버의 IP로 해석이 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSL통신을 할 때는 먼저 SSL Handshake라고 해서 대상 서버에서 인증서를 다운로드 하고 그 인증서의 유효성을 체크합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 실제 github.com이 아닌 haproxy서버로 접속하게 되고, haproxy서버로 부터 인증서를 다운로드 하려 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당연히 haproxy서버에는 github.com의 SSL인증서가 없습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;haproxy서버는 이 요청을 ingress 컨트롤러로 proxying하게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 ingress 컨트롤러는 kubernetes의 SSL 인증서를 리턴하게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과적으로 github.com의 SSL 인증서가 아니라 kubernetes의 SSL 인증서가 다운로드 되므로 SSL Handshake는 실패하게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트를 위해 Git Pod를 하나 생성합니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1728751479225&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl run gitpod -it --image bitnami/git -- sh&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성된 파드 안에서 아래 명령으로 실제 주소로 연결되는지 haproxy서버로 연결되는지 테스트 합니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1728751524963&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -v github.com&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 실제로 git repository를 다운로드 해 봅니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1728751560120&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git clone https://github.com/hiondal/subride-front.git&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 아래와 같은 에러가 난다면 솔루션에 따라 조치 합니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1728751606001&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# git clone https://github.com/hiondal/subride-config.git
Cloning into 'subride-config'...
fatal: unable to access 'https://github.com/hiondal/subride-config.git/': SSL certificate problem: self-signed certificate&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&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;솔루션은 github.com의 실제 주소로 연결하도록 DNS에 github.com의 IP를 등록해 주면 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kubernetes Pod의 DNS는 coredns입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;coredns 파드는 ConfigMap 'coredns'에서 정보를 주입 받습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 ocredns 컨피그맵에 github.com의 실제 주소를 지정하고, coredns 파드를 재시작하면 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1728751257778&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl edit cm coredns -n kube-system&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 'ready' 하단에 있는 'hosts' 섹션과 같이 실제 IP를 추가합니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1728750448883&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors
        health {
           lameduck 5s
        }
        ready
        hosts {
            20.205.243.166 github.com
            fallthrough
        }
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
           ttl 30
        }
        prometheus :9153
        forward . /etc/resolv.conf {
           max_concurrent 1000
        }
        cache 30
        loop
        reload
        loadbalance
    }
kind: ConfigMap
metadata:
  creationTimestamp: &quot;2024-09-25T08:31:52Z&quot;
  name: coredns
  namespace: kube-system
  resourceVersion: &quot;4050036&quot;
  uid: c8f8d48b-627b-49f0-8deb-f8ca626b6d65&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;coredns Pod를 재시작합니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1728751338165&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl rollout restart deploy coredns -n kube-system&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;이제 테스트 Git Pod를 삭제하고 재생성한 후 Git clone을 테스트 해 봅니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Cloud/Kubernetes</category>
      <author>Happy@Cloud</author>
      <guid isPermaLink="true">https://happycloud-lee.tistory.com/298</guid>
      <comments>https://happycloud-lee.tistory.com/298#entry298comment</comments>
      <pubDate>Sun, 6 Oct 2024 02:22:34 +0900</pubDate>
    </item>
    <item>
      <title>DNS 서버 설치</title>
      <link>https://happycloud-lee.tistory.com/297</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이 가이드는 Ubuntu 기준으로 작성되어 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CentOS 기반의 가이드는 &lt;a href=&quot;https://kubepia.github.io/cloudpak/cp4app/install/infra04.html&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;size16&quot;&gt;1.&amp;nbsp;DNS설치&lt;br /&gt;&lt;br /&gt;apt-get&amp;nbsp;install&amp;nbsp;-y&amp;nbsp;bind9-utils&amp;nbsp;bind9&lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;DNS설정&lt;br /&gt;설정파일 예시를 참고하여 작성하십시오.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1728148773520&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1) /etc/bind/named.conf.options 
options {
	directory &quot;/var/cache/bind&quot;;
	
	recursion yes;               // 내부 네트워크에만 재귀 쿼리 허용
	allow-recursion { any; };    // 모든 사용자를 허용하려면 { any; }로 설정
	listen-on { any; };          // 모든 인터페이스에서 DNS 쿼리를 수신
	allow-transfer { none; };    // 기본적으로 존 전송을 허용하지 않음

	dnssec-validation auto;

	listen-on-v6 { any; };
};

2) /etc/bind/named.conf.local

zone &quot;msa.edutdc.com&quot; {
    type master;
    file &quot;/etc/bind/zones/db.msa.edutdc.com&quot;;  // 영역 파일의 경로
};

zone &quot;110.10.in-addr.arpa&quot; {
    type master;
    file &quot;/etc/bind/zones/db.10.110&quot;;  // 역방향 영역 파일의 경로
};

3) /etc/bind/zones/db.msa.edutdc.com
$TTL    604800
@       IN      SOA     ns1.msa.edutdc.com. admin.msa.edutdc.com. (
                        3         ; Serial
                        604800    ; Refresh
                        86400     ; Retry
                        2419200   ; Expire
                        604800 )  ; Negative Cache TTL

@       IN      NS      ns1.msa.edutdc.com.
ns1     IN      A       10.110.50.111   ; Primary DNS 서버를 실제 DNS 서버가 설치된 VM의 IP로 설정

bastion       IN      A       10.110.10.124
controlplane  IN      A       10.110.20.65
worker1       IN      A       10.110.30.77
worker2       IN      A       10.110.40.91
infra         IN      A       10.110.50.111
apigw         IN      A       10.110.60.106
cicd          IN      A       10.110.70.239
telemetry     IN      A       10.110.80.10

; Public IP 매핑 (선택 사항)
infra-public     IN      A       18.141.104.160
bastion-public   IN      A       13.215.90.232

4) /etc/bind/zones/db.10.110
$TTL    604800
@       IN      SOA     ns1.msa.edutdc.com. admin.msa.edutdc.com. (
                            3         ; Serial
                            604800    ; Refresh
                            86400     ; Retry
                            2419200   ; Expire
                            604800 )  ; Negative Cache TTL

@       IN      NS      ns1.msa.edutdc.com.
ns1     IN      A       10.110.50.111

; 세 번째와 네 번째 옥텟을 사용하여 PTR 레코드 작성
124.10     IN      PTR     bastion.msa.edutdc.com.
65.20      IN      PTR     controlplane.msa.edutdc.com.
77.30      IN      PTR     worker1.msa.edutdc.com.
91.40      IN      PTR     worker2.msa.edutdc.com.
111.50     IN      PTR     infra.msa.edutdc.com.
106.60     IN      PTR     apigw.msa.edutdc.com.
239.70     IN      PTR     cicd.msa.edutdc.com.
10.80      IN      PTR     telemetry.msa.edutdc.com.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;3.&amp;nbsp;DNS서버&amp;nbsp;재시작&lt;br /&gt;systemctl&amp;nbsp;restart&amp;nbsp;bind9&lt;br /&gt;&lt;br /&gt;4.&amp;nbsp;DNS설정&amp;nbsp;수정&lt;br /&gt;1)&amp;nbsp;/etc/systemd/resolved.conf&lt;br /&gt;[Resolve]&lt;br /&gt;DNS=10.110.50.111&lt;br /&gt;Domains=msa.edutdc.com&lt;br /&gt;&lt;br /&gt;2)&amp;nbsp;적용&lt;br /&gt;systemctl&amp;nbsp;restart&amp;nbsp;systemd-resolved&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5.&amp;nbsp;테스트&lt;br /&gt;1)&amp;nbsp;정방향&amp;nbsp;탐색&lt;br /&gt;nslookup&amp;nbsp;{host}&lt;br /&gt;ex)&amp;nbsp;nslookup&amp;nbsp;bastion.msa.edutdc.com&lt;br /&gt;&lt;br /&gt;2)&amp;nbsp;역뱡향&amp;nbsp;탐색&lt;br /&gt;dig&amp;nbsp;-x&amp;nbsp;10.110.10.124&lt;br /&gt;또는&lt;br /&gt;nslookup&amp;nbsp;10.110.10.124&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Cloud/Kubernetes</category>
      <author>Happy@Cloud</author>
      <guid isPermaLink="true">https://happycloud-lee.tistory.com/297</guid>
      <comments>https://happycloud-lee.tistory.com/297#entry297comment</comments>
      <pubDate>Sun, 6 Oct 2024 02:20:43 +0900</pubDate>
    </item>
    <item>
      <title>Fluent Bit 설치</title>
      <link>https://happycloud-lee.tistory.com/296</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;이 가이드는 k8s 1.30이상에 Elasticsearch 8.x를 설치한 경우 Fluent bit를 설치하는 방법을 안내합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Elasticsearch 8.x 설치 가이드는 아래 글을 참조하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://happycloud-lee.tistory.com/294&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://happycloud-lee.tistory.com/294&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;엘라스틱 서치 헬름 저장소 추가&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래와 같이 엘라스틱 서치 헬름 차트 저장소를 추가 하고 차트 리스트를 업데이트 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728147282176&quot; class=&quot;vim&quot; style=&quot;background-color: #f6f7f8; color: #666666; text-align: start;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[root@osboxes ~]# helm repo add bitnami https://charts.bitnami.com/bitnami
&quot;bitnami&quot; has been added to your repositories
[root@osboxes ~]# helm repo update&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Fluent bit의 헬름 차트명과 버전을 찾습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728147282176&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;ubuntu@bastion:~/install/efk$ helm search repo fluent-bit
NAME              	CHART VERSION	APP VERSION	DESCRIPTION                                       
bitnami/fluent-bit	2.3.21       	3.1.9      	Fluent Bit is a Fast and Lightweight Log Proces..&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;설치 Config파일 작성&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;작업 디렉토리를 만들고 이동 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728147282177&quot; class=&quot;typescript&quot; style=&quot;background-color: #f6f7f8; color: #666666; text-align: start;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[root@osboxes ~]# mkdir -p ~/install/efk &amp;amp;&amp;amp; cd ~/install/efk&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;설치를 위한 환경설정 파일을 만듭니다.  fluentbit.yaml이라는 이름을 만들었다고 가정하고 설명하겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Elasticsearch의 Service 주소과 password는 변경 하셔야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;SSL키를 갖고 있는 Secret이 정확한 지 확인하십시오. 위 Elasticsearch 가이드대로 설치했으면 맞을 겁니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1728147282177&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;daemonset:
  enabled: true

config:
  outputs: |
    [OUTPUT]
        Name           es
        Match          *
        Host           elasticsearch-master-hl.efk.svc.cluster.local
        Port           9200
        Logstash_Format On
        Logstash_Prefix fluent-bit
        Suppress_Type_Name On
        Retry_Limit    False
        tls            On
        tls.verify     On
        tls.ca_file    /opt/bitnami/fluent-bit/certs/ca.crt
        HTTP_User      elastic
        HTTP_Passwd    P@ssw0rd$

existingSecret:
  - name: elasticsearch-master-crt
    keys: 
      tls.crt: tls.crt
      tls.key: tls.key
      ca.crt: ca.crt

extraVolumeMounts:
  - name: elasticsearch-certs
    mountPath: /opt/bitnami/fluent-bit/certs
    readOnly: true

extraVolumes:
  - name: elasticsearch-certs
    secret:
      secretName: elasticsearch-master-crt&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이 설정에서 중요한 부분은 Elasticsearch 연결 정보를 셋팅하는 아래 부분입니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- Host: Elasticsearch의 service객체 주소로서, SSL통신을 하므로 인증서의 SAN(Subject Alternative Name)과 반드시 일치해야 함&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- HTTP_Passwd: elastic 서버 인증 암호. Secret '&lt;span&gt;elasticsearch-master-credentials'에서 구함&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;CA, Cert, Key는 Secret '&lt;/span&gt;&lt;span&gt;elasticsearch-master-crt'에서 마운트 함&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;아래는 SSL인증서(tls.crt)의 SAN값을 확인하는 방법입니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1728147282181&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;kubectl get secret elasticsearch-master-crt -o jsonpath=&quot;{.data['tls\.crt']}&quot; | base64 --decode &amp;gt; elastic-tls.crt

openssl x509 -in elastic-tls.crt -text -noout&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 SAN을 확인할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1728147282181&quot; class=&quot;css&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;...

            X509v3 Subject Alternative Name: 
                DNS:*.elasticsearch-master-hl.efk.svc.cluster.local, DNS:elasticsearch-master-hl.efk.svc.cluster.local, DNS:elasticsearch-master, DNS:127.0.0.1, DNS:localhost


...&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;설치하기&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;namespace를 만들고 이동합니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1728147282181&quot; class=&quot;properties&quot; style=&quot;background-color: #f6f7f8; color: #666666; text-align: start;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;k create ns efk
kubens efk&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;helm 명령으로 설치합니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1728147282181&quot; class=&quot;bash&quot; style=&quot;background-color: #f6f7f8; color: #666666; text-align: start;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;helm upgrade fluentbit -i -f fluentbit.yaml bitnami/fluent-bit&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Pod가 실행될때까지 기다립니다. 아래와 같이 모든 Pod가 실행되어야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;파드는 DaemonSet으로 설치되므로 각 노드 당 1개씩 생성됩니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1728147282182&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;ubuntu@bastion:~/install/efk$ k get po
NAME                                     READY   STATUS    RESTARTS   AGE
elasticsearch-coordinating-0             1/1     Running   0          6h54m
elasticsearch-data-0                     1/1     Running   0          6h54m
elasticsearch-ingest-0                   1/1     Running   0          6h54m
elasticsearch-kibana-6486cc7b88-vq9fd    1/1     Running   0          6h54m
elasticsearch-master-0                   1/1     Running   0          6h54m
elasticsearch-metrics-85c74dfbdf-hb69p   1/1     Running   0          6h54m
fluentbit-fluent-bit-fcsp6               1/1     Running   0          9m17s
fluentbit-fluent-bit-qs4xg               1/1     Running   0          9m17s
fluentbit-fluent-bit-rkgh2               1/1     Running   0          9m17s
fluentbit-fluent-bit-v8gtg               1/1     Running   0          9m17s&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Cloud/Kubernetes</category>
      <author>Happy@Cloud</author>
      <guid isPermaLink="true">https://happycloud-lee.tistory.com/296</guid>
      <comments>https://happycloud-lee.tistory.com/296#entry296comment</comments>
      <pubDate>Sun, 6 Oct 2024 01:55:52 +0900</pubDate>
    </item>
    <item>
      <title>Fluentd설치(k8s 1.30이상에서 Elasticsearch 8.x 연동)</title>
      <link>https://happycloud-lee.tistory.com/295</link>
      <description>&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래 가이드는 제대로 설치 안되어 보다 경량화된 Fluentd인 Fluentbit를 설치할 것을 권고합니다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;a href=&quot;https://happycloud-lee.tistory.com/296&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://happycloud-lee.tistory.com/296&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 가이드는 k8s 1.30이상에 Elasticsearch 8.x를 설치한 경우 Fluentd를 설치하는 방법을 안내합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Elasticsearch 8.x 설치 가이드는 아래 글을 참조하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://happycloud-lee.tistory.com/294&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://happycloud-lee.tistory.com/294&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1727950355539&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;k8s 1.30이상에서 Elasticsearch 8.x 설치&quot; data-og-description=&quot;k8s 1.30으로 업그레이드 되면서 elastic에서 제공하는 helm chart도 많은 변화가 있습니다.이 가이드에서는 최신 버전의 elastic helm chart를 k8s 1.30 클러스터에 설치하는 방법을 다룹니다.&amp;nbsp;엘라스틱 서치&quot; data-og-host=&quot;happycloud-lee.tistory.com&quot; data-og-source-url=&quot;https://happycloud-lee.tistory.com/294&quot; data-og-url=&quot;https://happycloud-lee.tistory.com/294&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cxgMAc/hyXaIO0GYr/dM5k05JKFOiKLD807aDMlk/img.png?width=800&amp;amp;height=404&amp;amp;face=0_0_800_404,https://scrap.kakaocdn.net/dn/5tcUD/hyXd6AGKZb/CTitYgtijixdD3Q8kmj4FK/img.png?width=800&amp;amp;height=404&amp;amp;face=0_0_800_404,https://scrap.kakaocdn.net/dn/dk5UfZ/hyXedT7NoV/2EOaKMofJNONRWBsSnvem0/img.png?width=1188&amp;amp;height=600&amp;amp;face=0_0_1188_600&quot;&gt;&lt;a href=&quot;https://happycloud-lee.tistory.com/294&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://happycloud-lee.tistory.com/294&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cxgMAc/hyXaIO0GYr/dM5k05JKFOiKLD807aDMlk/img.png?width=800&amp;amp;height=404&amp;amp;face=0_0_800_404,https://scrap.kakaocdn.net/dn/5tcUD/hyXd6AGKZb/CTitYgtijixdD3Q8kmj4FK/img.png?width=800&amp;amp;height=404&amp;amp;face=0_0_800_404,https://scrap.kakaocdn.net/dn/dk5UfZ/hyXedT7NoV/2EOaKMofJNONRWBsSnvem0/img.png?width=1188&amp;amp;height=600&amp;amp;face=0_0_1188_600');&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;k8s 1.30이상에서 Elasticsearch 8.x 설치&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;k8s 1.30으로 업그레이드 되면서 elastic에서 제공하는 helm chart도 많은 변화가 있습니다.이 가이드에서는 최신 버전의 elastic helm chart를 k8s 1.30 클러스터에 설치하는 방법을 다룹니다.&amp;nbsp;엘라스틱 서치&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;happycloud-lee.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;h3 style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;엘라스틱 서치 헬름 저장소 추가&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래와 같이 엘라스틱 서치 헬름 차트 저장소를 추가 하고 차트 리스트를 업데이트 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727950172535&quot; class=&quot;bash&quot; style=&quot;background-color: #f6f7f8; color: #666666; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;[root@osboxes ~]# helm repo add bitnami https://charts.bitnami.com/bitnami
&quot;bitnami&quot; has been added to your repositories
[root@osboxes ~]# helm repo update&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Fluentd의 헬름 차트명과 버전을 찾습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727950257292&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ubuntu@bastion:~/install/efk$ helm search repo fluentd
NAME                        	CHART VERSION	APP VERSION	DESCRIPTION                                       
bitnami/fluentd             	6.5.13       	1.17.1     	Fluentd collects events from various data sourc...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;설치 Config파일 작성&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;작업 디렉토리를 만들고 이동 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727950272775&quot; class=&quot;bash&quot; style=&quot;background-color: #f6f7f8; color: #666666; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;[root@osboxes ~]# mkdir -p ~/install/efk &amp;amp;&amp;amp; cd ~/install/efk&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;설치를 위한 환경설정 파일을 만듭니다.  fluentd.yaml이라는 이름을 만들었다고 가정하고 설명하겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Forwarder는 각 노드에 Daemon으로 설치되어 로그를 수집하여 Aggregator로 보냅니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Aggregator는 수집된 로그를 연결된 Elasticsearch로 보냅니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1727950308537&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## Forwarder parameters
forwarder:
  enabled: true
  configMapFiles:
    fluentd.conf: |
      # Ignore fluentd own events
      &amp;lt;match fluent.**&amp;gt;
        @type null
      &amp;lt;/match&amp;gt;

      @include fluentd-inputs.conf
      @include fluentd-output.conf

    fluentd-inputs.conf: |
      # HTTP input for the liveness and readiness probes
      &amp;lt;source&amp;gt;
        @type http
        port 9880
      &amp;lt;/source&amp;gt;
      # Get the logs from the containers running in the node
      &amp;lt;source&amp;gt;
        @type tail
        path /var/log/containers/*.log
        # exclude Fluentd logs
        exclude_path /var/log/containers/*fluentd*.log
        pos_file /opt/bitnami/fluentd/logs/buffers/fluentd-docker.pos
        tag kubernetes.*
        read_from_head true
        &amp;lt;parse&amp;gt;
          @type json
          time_key time
          time_format %Y-%m-%dT%H:%M:%S.%NZ
        &amp;lt;/parse&amp;gt;
      &amp;lt;/source&amp;gt;
      # enrich with kubernetes metadata
      &amp;lt;filter kubernetes.**&amp;gt;
        @type kubernetes_metadata
      &amp;lt;/filter&amp;gt;

    fluentd-output.conf: |
      # Forward all logs to the aggregators
      &amp;lt;match **&amp;gt;
        @type forward
        &amp;lt;server&amp;gt;
          host fluentd-aggregator
          port 24224
        &amp;lt;/server&amp;gt;
      &amp;lt;/match&amp;gt;

## Aggregator parameters
aggregator:
  enabled: true
  replicaCount: 1

  configMapFiles:
    fluentd.conf: |
      # Ignore fluentd own events
      &amp;lt;match fluent.**&amp;gt;
        @type null
      &amp;lt;/match&amp;gt;

      @include fluentd-inputs.conf
      @include fluentd-output.conf

    fluentd-inputs.conf: |
      # HTTP input for the liveness and readiness probes
      &amp;lt;source&amp;gt;
        @type http
        port 9880
      &amp;lt;/source&amp;gt;
      # Receive logs from forwarders
      &amp;lt;source&amp;gt;
        @type forward
        port 24224
      &amp;lt;/source&amp;gt;

    fluentd-output.conf: |
      # Send the logs to Elasticsearch
      &amp;lt;match **&amp;gt;
        @type elasticsearch
        host &quot;elasticsearch-master-hl.efk.svc.cluster.local&quot;
        port 9200
        user &quot;elastic&quot;
        password &quot;P@ssw0rd$&quot;
        scheme https
        ssl_verify true
        ssl_version TLSv1_2
        ca_file /opt/bitnami/fluentd/certs/elasticsearch/ca.crt
        client_cert /opt/bitnami/fluentd/certs/elasticsearch/tls.crt
        client_key /opt/bitnami/fluentd/certs/elasticsearch/tls.key
        index_name fluentd
        type_name fluentd
        logstash_format true
        logstash_prefix fluentd
        reconnect_on_error true
        reload_on_failure true
        &amp;lt;buffer&amp;gt;
          flush_thread_count 8
          flush_interval 5s
          chunk_limit_size 2M
          queue_limit_length 32
          retry_max_interval 30
          retry_forever true
        &amp;lt;/buffer&amp;gt;
      &amp;lt;/match&amp;gt;

  # SSL인증서 mount
  extraVolumes:
    - name: elasticsearch-certs
      secret:
        secretName: elasticsearch-master-crt
  extraVolumeMounts:
    - name: elasticsearch-certs
      mountPath: /opt/bitnami/fluentd/certs/elasticsearch
      readOnly: true

# Disable TLS
tls:
  enabled: false

# Disable metrics for simplicity
metrics:
  enabled: false&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이 설정에서 중요한 부분은 Elasticsearch 연결 정보를 셋팅하는 아래 부분입니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- host: Elasticsearch의 service객체 주소로서, SSL통신을 하므로 인증서의 SAN(Subject Alternative Name)과 반드시 일치해야 함&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- scheme: 반드시 SSL통신을 해야 함&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- password: elastic 서버 인증 암호. Secret '&lt;span&gt;elasticsearch-master-credentials'에서 구함&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- ca_file: SSL인증서를 서명한 CA(Certificate Authority)의 인증서 경로&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- client_cert: SSL 인증서 경로&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- client_key: SSL 인증서의 개인 키 경로&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;CA, Cert, Key는 Secret '&lt;/span&gt;&lt;span&gt;elasticsearch-master-crt'에서 마운트 함&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727950543292&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  aggregator:
    ... 
    fluentd-output.conf: |
      # Send the logs to Elasticsearch
      &amp;lt;match **&amp;gt;
        @type elasticsearch
        host &quot;elasticsearch-master-hl.efk.svc.cluster.local&quot;
        port 9200
        user &quot;elastic&quot;
        password &quot;P@ssw0rd$&quot;
        scheme https
        ssl_verify true
        ssl_version TLSv1_2
        ca_file /opt/bitnami/fluentd/certs/elasticsearch/ca.crt
        client_cert /opt/bitnami/fluentd/certs/elasticsearch/tls.crt
        client_key /opt/bitnami/fluentd/certs/elasticsearch/tls.key&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;아래는 인증서들을 &lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;Secret '&lt;/span&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;elasticsearch-master-crt'에서 마운트 하기 위한 설정입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727950936333&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aggregator:
...
  # SSL인증서 mount
  extraVolumes:
    - name: elasticsearch-certs
      secret:
        secretName: elasticsearch-master-crt
  extraVolumeMounts:
    - name: elasticsearch-certs
      mountPath: /opt/bitnami/fluentd/certs/elasticsearch
      readOnly: true&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;아래는 SSL인증서(tls.crt)의 SAN값을 확인하는 방법입니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1727951043789&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl get secret elasticsearch-master-crt -o jsonpath=&quot;{.data['tls\.crt']}&quot; | base64 --decode &amp;gt; elastic-tls.crt

openssl x509 -in elastic-tls.crt -text -noout&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 SAN을 확인할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1728138517999&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;...

            X509v3 Subject Alternative Name: 
                DNS:*.elasticsearch-master-hl.efk.svc.cluster.local, DNS:elasticsearch-master-hl.efk.svc.cluster.local, DNS:elasticsearch-master, DNS:127.0.0.1, DNS:localhost


...&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;설치하기&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;namespace를 만들고 이동합니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1727951092089&quot; class=&quot;properties&quot; style=&quot;background-color: #f6f7f8; color: #666666; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;k create ns efk
kubens efk&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;helm 명령으로 설치합니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1727951092089&quot; class=&quot;bash&quot; style=&quot;background-color: #f6f7f8; color: #666666; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;helm upgrade fluentd -i -f fluentd.yaml bitnami/fluentd&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Pod가 실행될때까지 기다립니다. 아래와 같이 모든 Pod가 실행되어야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;fluentd-0, fluentd-1이 Aggregator이고, fluentd-xxx 파드들이 Forwarder입니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Forwarder파드는 DaemonSet으로 설치되므로 각 노드 당 1개씩 생성됩니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1727951139338&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ k get po
NAME                     READY   STATUS    RESTARTS      AGE
elasticsearch-master-0   1/1     Running   0             158m
fluentd-0                1/1     Running   0             58m
fluentd-1                1/1     Running   0             57m
fluentd-j8xkr            1/1     Running   1 (57m ago)   58m
fluentd-jv4qq            1/1     Running   1 (58m ago)   58m
fluentd-klh8p            1/1     Running   2 (55m ago)   58m
fluentd-pnj8b            1/1     Running   4 (56m ago)   58m
fluentd-pnk4b            1/1     Running   1 (58m ago)   58m&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;</description>
      <category>Cloud/Kubernetes</category>
      <author>Happy@Cloud</author>
      <guid isPermaLink="true">https://happycloud-lee.tistory.com/295</guid>
      <comments>https://happycloud-lee.tistory.com/295#entry295comment</comments>
      <pubDate>Thu, 3 Oct 2024 19:07:47 +0900</pubDate>
    </item>
    <item>
      <title>k8s 1.30이상에서 Elasticsearch과 Kibana 8.x 설치</title>
      <link>https://happycloud-lee.tistory.com/294</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;k8s 1.30으로 업그레이드 되면서 elastic에서 제공하는 helm chart도 많은 변화가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 가이드에서는 최신 버전(2024.10월 현재 8.15.3)의 Elasticsearch와 Kibana를&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bitnami helm chart를 이용하여&amp;nbsp; k8s 1.30 클러스터에 설치하는 방법을 다룹니다.&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;엘라스틱 서치 헬름 저장소 추가&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래와 같이 Bitnami 헬름 차트 저장소를 추가 하고 차트 리스트를 업데이트 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727938886693&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[root@osboxes ~]# helm repo add bitnami https://charts.bitnami.com/bitnami
&quot;bitnami&quot; has been added to your repositories
[root@osboxes ~]# helm repo update&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;엘라스틱 서치의 헬름 차트명과 버전을 찾습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1728115225634&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ubuntu@bastion:~$ helm search repo elasticsearch
NAME                                              	CHART VERSION	APP VERSION	DESCRIPTION                                       
bitnami/elasticsearch                             	21.3.20      	8.15.2     	Elasticsearch is a distributed search and analy...&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;설치 Config파일 작성&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;작업 디렉토리를 만들고 이동 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727938985897&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[root@osboxes ~]# mkdir -p ~/install/efk &amp;amp;&amp;amp; cd ~/install/efk&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;설치를 위한 환경설정 파일을 만듭니다. elasticsearch.yaml이라는 이름으로 만들었다고 가정하고 설명하겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;아래 sample을 이용하여 본인의 상황에 맞게 적절히 변경하십시오.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;최대한 자세한 주석을 달았으니 참고하십시오.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;아래는 반드시 변경해야 할 설정입니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- storageClass: k get sc 명령어로 확인&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- security.elasticPassword: elastic 유저의 암호를 지정. 이 암호로 초기 암호가 생성됨&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- ingress.hostname: 본인이 원하는 Elasticsearch Host. IP는 지정 불가능함&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- 환경변수 'KIBANA_SERVER_PUBLICBASEURL': 본인이 원하는 Kibana Host. IP는 지정 불가능&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- kibana.elasticsearch.security.auth.kibanaPassword: kibana_system 유저의 암호. 이후 과정에서 이 암호로 지정해야 함&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- kibana.ingress.hostname: &lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;본인이 원하는 Kibana Host로서 위 환경변수 '&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;KIBANA_SERVER_PUBLICBASEURL&lt;/span&gt;'와 동일하게 지정해야 함&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1727940878677&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Elasticsearch 클러스터 이름 설정
clusterName: &quot;elastic&quot;

# 전역 설정
global:
  # Kibana 활성화 여부
  kibanaEnabled: true

# 마스터 노드 설정
master:
  # 마스터 노드 복제본 수
  replicaCount: 1
  # 마스터 노드의 힙 크기 (메모리)
  heapSize: 1048m
  # 마스터 노드의 리소스 요청 및 제한
  resources:
    requests:
      cpu: 1  # CPU 요청량
      memory: 1Gi  # 메모리 요청량
    limits:
      cpu: 2  # CPU 제한량
      memory: 2Gi  # 메모리 제한량
  # 마스터 노드의 영구 저장소 설정
  persistence:
    enabled: true  # 영구 저장소 활성화
    storageClass: &quot;nfs-retain&quot;  # 사용할 스토리지 클래스
    accessModes:
      - ReadWriteOnce  # 접근 모드
    size: 5Gi  # 저장소 크기
  # 마스터 노드를 배치할 노드 선택기
  nodeSelector:
    role: telemetry

# 데이터 노드 설정
  # 데이터 노드의 역할:
  # - 실제 데이터를 저장하고 관리
  # - 인덱싱, 검색, 집계 등의 데이터 관련 작업 수행
  # - 클러스터의 주요 워크로드를 처리
  # 주의: 데이터 노드는 클러스터의 성능과 안정성에 직접적인 영향을 미치므로,
  # 리소스 설정과 복제본 수를 신중히 고려해야 함
data:
  # 데이터 노드 복제본 수
  replicaCount: 1
  # 데이터 노드의 힙 크기 (메모리)
  heapSize: 1024m
  # 데이터 노드의 리소스 요청 및 제한
  resources:
    requests:
      cpu: 1000m
      memory: 2Gi
    limits:
      cpu: 2000m
      memory: 4Gi
  # 데이터 노드의 영구 저장소 설정
  persistence:
    enabled: true
    storageClass: &quot;nfs-retain&quot;
    accessModes:
      - ReadWriteOnce
    size: 10Gi


# 코디네이팅 노드 설정
  # 코디네이팅 노드의 역할:
  # - 클라이언트 요청을 받아 적절한 데이터 노드로 라우팅
  # - 검색 결과의 집계 및 정렬 수행
  # - 클러스터의 부하를 분산시키고 전체적인 성능 향상에 기여
  # 주의: 코디네이팅 노드는 데이터를 저장하지 않으므로 영구 저장소 설정이 불필요함
coordinating:
  # 코디네이팅 노드 복제본 수
  replicaCount: 1
  # 코디네이팅 노드의 힙 크기 (메모리)
  heapSize: 512m
  # 코디네이팅 노드의 리소스 요청 및 제한
  resources:
    requests:
      cpu: 500m
      memory: 1Gi
    limits:
      cpu: 1000m
      memory: 2Gi

# 인제스트 노드 설정
 # 인제스트 노드의 역할:
  # - 데이터 인덱싱 전 전처리 작업 수행 (예: 데이터 변환, 보강)
  # - 복잡한 데이터 처리 파이프라인 실행
  # - 데이터 품질 향상 및 일관성 유지에 기여
  # 주의: 인제스트 노드는 대량의 데이터 처리 시 중요한 역할을 하므로,
  # 데이터 처리량에 따라 리소스와 복제본 수를 적절히 조정해야 함
ingest:
  # 인제스트 노드 활성화 여부
  enabled: true
  # 인제스트 노드 복제본 수
  replicaCount: 1
  # 인제스트 노드의 힙 크기 (메모리)
  heapSize: 512m
  # 인제스트 노드의 리소스 요청 및 제한
  resources:
    requests:
      cpu: 500m
      memory: 1Gi
    limits:
      cpu: 1000m
      memory: 2Gi
  # 인제스트 노드의 영구 저장소 설정
  persistence:
    enabled: true
    storageClass: &quot;nfs-retain&quot;
    accessModes:
      - ReadWriteOnce
    size: 5Gi

# 시스템 설정을 위한 이미지 설정
sysctlImage:
  enabled: true
  # vm.max_map_count 값을 설정하는 명령어
  command: [&quot;sysctl&quot;, &quot;-w&quot;, &quot;vm.max_map_count=262144&quot;]

# 메트릭스 설정
metrics:
  # 메트릭스 수집 활성화
  enabled: true
  serviceMonitor:
    # ServiceMonitor 비활성화 (Prometheus Operator가 없는 경우)
    enabled: false

# 공통 서비스 설정
service:
  type: ClusterIP

# Elasticsearch Ingress 설정
ingress:
  enabled: true
  hostname: es.msa.edutdc.com
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: &quot;letsencrypt-prod&quot;
    # Ingress에서 백엔드로의 통신 프로토콜을 HTTPS로 지정
    # 이는 Ingress 컨트롤러가 Kibana와 통신할 때 HTTPS를 사용하도록 함
    nginx.ingress.kubernetes.io/backend-protocol: &quot;HTTPS&quot;
  tls: true

# 보안 설정
security:
  # 보안 기능 활성화
  enabled: true
  # Elastic 사용자의 비밀번호
  elasticPassword: &quot;P@ssw0rd$&quot;
  tls:
    # TLS 인증서 자동 생성
    autoGenerated: true
    # REST API에 대한 암호화 활성화
    restEncryption: true

# Kibana 설정
kibana:
  # Kibana에 추가할 환경 변수
  extraEnvVars:
    - name: KIBANA_SERVER_PUBLICBASEURL
      value: &quot;https://kibana.msa.edutdc.com&quot;
  
  # Elasticsearch 연결 설정

  elasticsearch:
    # 주의: hosts에는 http(s) 프로토콜과 포트 번호를 제외한 마스터 노드의 서비스 주소만 입력
    # 예: &quot;elasticsearch-master&quot; (서비스 이름)
    # 프로토콜과 포트는 별도로 지정되므로 여기서는 생략해야 함
    hosts:
      - &quot;elasticsearch&quot;
    port: &quot;9200&quot;
    security:
      auth:
        enabled: true
        # kibana_system 사용자의 비밀번호
        # kibana_system 사용자의 비밀번호
        # 주의: 이 비밀번호는 Elasticsearch에서 생성한 실제 kibana_system 사용자의 비밀번호와 일치해야 합니다.
        # 비밀번호 설정 방법:
        # 1. Elasticsearch 클러스터가 실행 중이고 보안이 활성화된 상태에서 다음 명령을 실행합니다:
        #    kubectl exec -it elasticsearch-master-0 -- elasticsearch-setup-passwords interactive -Expack.security.http.ssl.verification_mode=certificate
        # 2. 프롬프트에 따라 각 기본 사용자(elastic, kibana_system 등)의 비밀번호를 설정합니다.
        # 3. kibana_system 사용자의 비밀번호를 메모하고, 아래 kibanaPassword 값으로 사용합니다.
        # 4. 이 값을 변경한 후, Kibana deployment를 재시작하여 새 비밀번호를 적용합니다.
        kibanaPassword: &quot;P@ssw0rd$&quot;
      tls:
        enabled: true
        verificationMode: certificate
        # 기존 TLS 인증서 시크릿 사용
        existingSecret: elasticsearch-master-crt
        usePemCerts: true
  # Kibana Ingress 설정
  ingress:
    enabled: true
    hostname: kibana.msa.edutdc.com
    annotations:
      kubernetes.io/ingress.class: nginx
      cert-manager.io/cluster-issuer: &quot;letsencrypt-prod&quot;
      # Ingress에서 백엔드로의 통신 프로토콜을 HTTPS로 지정
      # 이는 Ingress 컨트롤러가 Kibana와 통신할 때 HTTPS를 사용하도록 함
      nginx.ingress.kubernetes.io/backend-protocol: &quot;HTTPS&quot;
    tls: true
  # Kibana를 배치할 노드 선택기
  nodeSelector:
    role: telemetry
  # Kibana의 리소스 요청 및 제한
  resources:
    requests:
      cpu: &quot;300m&quot;
      memory: &quot;512Mi&quot;
    limits:
      cpu: &quot;500m&quot;
      memory: &quot;1Gi&quot;
  # Kibana 보안 설정
  security:
    enabled: true
  # Kibana TLS 설정
  tls:
    enabled: true
    verificationMode: certificate
    existingSecret: elasticsearch-master-crt
    usePemCerts: true&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;특정 노드에 각 Elasticsearch 노드를 설치하려면 nodeSelector를 지정합니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;node label은 아래와 같이 지정하면 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1728115319326&quot; class=&quot;dockerfile&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# label 추가 
kubectl label nodes node1 role=telemetry
kubectl get nodes --show-label

# label 삭제
kubectl label nodes node1 role-&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;설치하기&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;namespace를 만들고 이동합니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1727941775478&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;k create ns efk
kubens efk&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;helm 명령으로 설치합니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1727941651042&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;helm upgrade elasticsearch -i -f elastic.yaml elastic/elasticsearch&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Pod가 실행될때까지 기다립니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1728115398538&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ubuntu@bastion:~$ k get po
NAME                                     READY   STATUS     RESTARTS       AGE
elasticsearch-coordinating-0             1/1     Running    0              43m
elasticsearch-data-0                     1/1     Running    0              43m
elasticsearch-ingest-0                   1/1     Running    0              43m
elasticsearch-kibana-596f8fdcbc-87bl4    1/1     Running    0              42m
elasticsearch-master-0                   1/1     Running    0              43m
elasticsearch-metrics-85c74dfbdf-mxcr7   1/1     Running    0              95m&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;kibana_system 유저 암호 지정&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;아래 명령으로 Elasticsearch의 기본 유저들의 암호를 지정합니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;특히 kibana_system의 암호는 elasticsearch.yaml에 지정한 kibanaPassword와 반드시 동일해야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;* 일일이 치지 말고 암호를 클립보드에 복사한 후 붙여넣기 하면 편합니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1728115675956&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ubuntu@bastion:~$ kubectl exec -it elasticsearch-master-0 -- elasticsearch-setup-passwords interactive -Expack.security.http.ssl.verification_mode=certificate
...
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user.
You will be prompted to enter passwords as the process progresses.
Please confirm that you would like to continue [y/N]y

Enter password for [elastic]: 
Reenter password for [elastic]: 
Enter password for [apm_system]: 
Reenter password for [apm_system]: 
Enter password for [kibana_system]: 
Reenter password for [kibana_system]: 
Enter password for [logstash_system]: 
Reenter password for [logstash_system]: 
Enter password for [beats_system]: 
Reenter password for [beats_system]: 
Enter password for [remote_monitoring_user]: 
Reenter password for [remote_monitoring_user]: 
Changed password for user [apm_system]
Changed password for user [kibana_system]
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [beats_system]
Changed password for user [remote_monitoring_user]
Changed password for user [elastic]&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;테스트&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;ingress 주소로 Elasticsearch를 로그인 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;id는 elastic이고 암호는 위 elasticsearch.yaml에 지정한 값입니다.&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;1124&quot; data-origin-height=&quot;628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C4ett/btsJWpA3o6P/lo8emRywPxFZIbngLx4T21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C4ett/btsJWpA3o6P/lo8emRywPxFZIbngLx4T21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C4ett/btsJWpA3o6P/lo8emRywPxFZIbngLx4T21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC4ett%2FbtsJWpA3o6P%2Flo8emRywPxFZIbngLx4T21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1124&quot; height=&quot;628&quot; data-origin-width=&quot;1124&quot; data-origin-height=&quot;628&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kibana를 로그인 합니다.&amp;nbsp; ID/PW는 위 Elastic 로그인 id/pw와 동일합니다.&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;2860&quot; data-origin-height=&quot;1718&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxzev1/btsJWQ55Toz/sM1riMIWEESPI2U404lsMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxzev1/btsJWQ55Toz/sM1riMIWEESPI2U404lsMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxzev1/btsJWQ55Toz/sM1riMIWEESPI2U404lsMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcxzev1%2FbtsJWQ55Toz%2FsM1riMIWEESPI2U404lsMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2860&quot; height=&quot;1718&quot; data-origin-width=&quot;2860&quot; data-origin-height=&quot;1718&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Kibana 기본 환경 설정&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Index Pattern 작성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fluent bit가 수집하여 Elasticsearch DB에 저장한 데이터의 index pattern을 생성합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 후 좌측 상단 햄버거 메뉴에서 Management &amp;gt; Stack Management를 클릭하고,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kibana &amp;gt; Data Views를 선택합니다. 그리고 [Create data view]를 누릅니다.&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;652&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d97KGU/btsJWohTYTe/Stu4Sk12PaTIgZQ0fe8F2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d97KGU/btsJWohTYTe/Stu4Sk12PaTIgZQ0fe8F2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d97KGU/btsJWohTYTe/Stu4Sk12PaTIgZQ0fe8F2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd97KGU%2FbtsJWohTYTe%2FStu4Sk12PaTIgZQ0fe8F2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;652&quot; height=&quot;84&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cw8Qxy/btsJVHikEOO/OPBkoJzIUHfUaOUD60r1SK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cw8Qxy/btsJVHikEOO/OPBkoJzIUHfUaOUD60r1SK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cw8Qxy/btsJVHikEOO/OPBkoJzIUHfUaOUD60r1SK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcw8Qxy%2FbtsJVHikEOO%2FOPBkoJzIUHfUaOUD60r1SK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;260&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;518&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Name은 적절히 지정하시고, Index Patten은 우측에 있는 Index sources리스트에 있는 것중 입력합니다.&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;1862&quot; data-origin-height=&quot;766&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/diTeVX/btsJW3EcqbT/dfqF6cCZoSwbpLv0D90Ct0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/diTeVX/btsJW3EcqbT/dfqF6cCZoSwbpLv0D90Ct0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/diTeVX/btsJW3EcqbT/dfqF6cCZoSwbpLv0D90Ct0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdiTeVX%2FbtsJW3EcqbT%2FdfqF6cCZoSwbpLv0D90Ct0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1862&quot; height=&quot;766&quot; data-origin-width=&quot;1862&quot; data-origin-height=&quot;766&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좌측 전체 메뉴에서 'Discover'를 누르면 수집된 로그를 검색하는 화면이 표시됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2518&quot; data-origin-height=&quot;1156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SlKpU/btsJVh5qhGa/9JehecwpbBDY906JGI8e91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SlKpU/btsJVh5qhGa/9JehecwpbBDY906JGI8e91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SlKpU/btsJVh5qhGa/9JehecwpbBDY906JGI8e91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSlKpU%2FbtsJVh5qhGa%2F9JehecwpbBDY906JGI8e91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2518&quot; height=&quot;1156&quot; data-origin-width=&quot;2518&quot; data-origin-height=&quot;1156&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&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;span style=&quot;color: #000000;&quot;&gt;2. 로그 보관 정책과 기간 설정&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;index의 보관 정책 및 기간을 설정합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;엘라스틱 서치의 index Lifecycle은 아래와 같이 4단계로 나눌 수 있으며, Hot과 Delete단계는 필수로 지정해야 합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Hot: 빈번하게 검색 해야할 최신 로그&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Warm: Hot보다 덜 찾는 로그&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Cold: 간헐적으로 찾는 로그&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Delete: 더 이상 필요 없어 삭제할 로그&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;주의&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Index 보관 주기를 바꾸지 않으면 기본 설정대로 90일 후에나 로그가 삭제되므로 저장공간이 모자랄 수 있습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;❶ Data &amp;gt; Index Lifecycle Policies을 클릭하고 ❷ kibana-reporting을 선택 합니다.&lt;/span&gt;&lt;span data-phocus=&quot;https://blog.kakaocdn.net/dn/o8aUz/btrCMMqb7pD/UVRhcBLgYBoxkjkEvLmOpk/img.png&quot; data-url=&quot;https://blog.kakaocdn.net/dn/o8aUz/btrCMMqb7pD/UVRhcBLgYBoxkjkEvLmOpk/img.png&quot;&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;1444&quot; data-origin-height=&quot;866&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U6Jc6/btsJWSQn5Bm/kKN3Jq1eafWv4SMNX2cgC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U6Jc6/btsJWSQn5Bm/kKN3Jq1eafWv4SMNX2cgC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U6Jc6/btsJWSQn5Bm/kKN3Jq1eafWv4SMNX2cgC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU6Jc6%2FbtsJWSQn5Bm%2FkKN3Jq1eafWv4SMNX2cgC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;710&quot; height=&quot;426&quot; data-origin-width=&quot;1444&quot; data-origin-height=&quot;866&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Hot/Warm/Cold/Delete Phase별로 로그 정책과 보관 기간을 설정 합니다.&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;1148&quot; data-origin-height=&quot;792&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/orQzt/btsJWPMXfrG/fFCWEz520mDBCi1tDxHS0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/orQzt/btsJWPMXfrG/fFCWEz520mDBCi1tDxHS0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/orQzt/btsJWPMXfrG/fFCWEz520mDBCi1tDxHS0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2ForQzt%2FbtsJWPMXfrG%2FfFCWEz520mDBCi1tDxHS0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;587&quot; height=&quot;405&quot; data-origin-width=&quot;1148&quot; data-origin-height=&quot;792&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;527&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MAX4w/btsJWyLmhOB/sK8NzEiUNyevHHDTS8pHH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MAX4w/btsJWyLmhOB/sK8NzEiUNyevHHDTS8pHH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MAX4w/btsJWyLmhOB/sK8NzEiUNyevHHDTS8pHH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMAX4w%2FbtsJWyLmhOB%2FsK8NzEiUNyevHHDTS8pHH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;536&quot; height=&quot;221&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;527&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; 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 style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;로그 조회 및 검색 실습&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;헬스체크때 배포한 &amp;lsquo;probe-httpreq&amp;rsquo;파드를 이용하여 로그를 조회해 보겠습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래와 같이 &amp;lsquo;probe-httpreq&amp;rsquo; 파드를 재시작 하십시오.&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot;&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;color: #666666;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #444444; color: #dddddd;&quot;&gt;[root@osboxes efk]# kubens ott&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;background-color: #444444; color: #dddddd;&quot;&gt;Context &quot;kubernetes-admin@kubernetes&quot; modified.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;background-color: #444444; color: #dddddd;&quot;&gt;Active namespace is &quot;ott&quot;.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;background-color: #444444; color: #dddddd;&quot;&gt;[root@osboxes efk]# k rollout restart sts probe-httpreq&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;background-color: #444444; color: #dddddd;&quot;&gt;statefulset.apps/probe-httpreq restarted&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 파드는 &amp;lsquo;member&amp;rsquo;서비스를 시작하면서 여러분이 NFS 서버의 &amp;lsquo;/ data/ott/members.properties&amp;rsquo;파일에 만든 데이터를 콘솔에 표시 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot;&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;color: #666666;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #444444; color: #dddddd;&quot;&gt;[root@osboxes efk]# k logs -f probe-httpreq-0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;background-color: #444444; color: #dddddd;&quot;&gt;&amp;hellip; ondal=온달,남자,hiondal@gmail.com&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;background-color: #444444; color: #dddddd;&quot;&gt;&amp;hellip; user1=유저1,여자,user1@gmail.com&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;background-color: #444444; color: #dddddd;&quot;&gt;&amp;hellip; user2=유저2,여자,user2@gmail.com&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 로그가 플루언트디에 의해 수집되어 엘라스틱 서치 DB에 저장될 것이고 키바나에서 검색할 수 있습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;키바나의 좌측 상단 햄버거 메뉴를 누르고 &amp;lsquo;Discover&amp;rsquo;를 클릭 하십시오.&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;792&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZLAmq/btsJWOtKvQe/J1oKI4CyupmtJir7eEIUJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZLAmq/btsJWOtKvQe/J1oKI4CyupmtJir7eEIUJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZLAmq/btsJWOtKvQe/J1oKI4CyupmtJir7eEIUJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZLAmq%2FbtsJWOtKvQe%2FJ1oKI4CyupmtJir7eEIUJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;189&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;1280&quot; data-origin-height=&quot;583&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d13Sw9/btsJV5wbVQq/PIS1FdLieEZupNySmeITC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d13Sw9/btsJV5wbVQq/PIS1FdLieEZupNySmeITC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d13Sw9/btsJV5wbVQq/PIS1FdLieEZupNySmeITC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd13Sw9%2FbtsJV5wbVQq%2FPIS1FdLieEZupNySmeITC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;602&quot; height=&quot;275&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;583&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;상단의 검색 박스에 &amp;lsquo;kubernetes.pod_name : probe-httpreq and user1&amp;rsquo;이라고 입력하여 검색해 보십시오.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;❶ 아래와 같이 수집된 로그에서 검색하여 결과를 하단에 보여 줍니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&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;1242&quot; data-origin-height=&quot;714&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mbbgc/btsJV8l52f0/eQb7Wya00QQTttTUX4xFp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mbbgc/btsJV8l52f0/eQb7Wya00QQTttTUX4xFp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mbbgc/btsJV8l52f0/eQb7Wya00QQTttTUX4xFp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmbbgc%2FbtsJV8l52f0%2FeQb7Wya00QQTttTUX4xFp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;623&quot; height=&quot;358&quot; data-origin-width=&quot;1242&quot; data-origin-height=&quot;714&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Cloud/Kubernetes</category>
      <author>Happy@Cloud</author>
      <guid isPermaLink="true">https://happycloud-lee.tistory.com/294</guid>
      <comments>https://happycloud-lee.tistory.com/294#entry294comment</comments>
      <pubDate>Thu, 3 Oct 2024 15:58:44 +0900</pubDate>
    </item>
    <item>
      <title>ArgoCD 설치</title>
      <link>https://happycloud-lee.tistory.com/293</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Helm chart로 손쉽게 ArgoCD를 설치하는 방법입니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Helm chart repository 추가&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1722967511104&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;helm repo add argo https://argoproj.github.io/argo-helm&lt;/code&gt;&lt;/pre&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;아래 내용으로 argocd.yaml파일을 만듭니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;global.domain은 ingress host로 사용됩니다. 적절하게 변경하세요.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1722967618486&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## Globally shared configuration
global:
  # -- Default domain used by all components
  ## Used for ingresses, certificates, SSO, notifications, etc.
  ## IP는 외부에서 접근할 수 있는 ks8 node의 Public IP 또는 
  ## ingress-nginx-controller 서비스의 External IP이여야 함
  domain: argo.43.200.12.214.nip.io
  
  # -- 특정 노드에 배포시 지정
  #nodeSelector:
    #agentpool: argocd

server:
  ingress:
    enabled: true
    https: true
    annotations:
      kubernetes.io/ingress.class: nginx
    tls:
      - secretName: argocd-tls-secret
  extraArgs:
    - --insecure  # ArgoCD 서버가 TLS 종료를 Ingress에 위임

configs:
  params:
    server.insecure: true  # Ingress에서 TLS를 처리하므로 ArgoCD 서버는 HTTP로 통신
certificate:
  enabled: false  # 자체 서명 인증서 사용 비활성화 (외부 인증서 사용 시)&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;3. namespace 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ArgoCD를 배포할 네임스페이스를 만들고 이동합니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1722967801358&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl create ns argocd
kubens argocd&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;4. argocd-tls-secret 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ArgoCD는 ssl로 통신하므로 SSL키가 있어야 하고, 이 키를 이용하여 Secret을 만들어야 합니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSL키는 실제 운영시에는 공인인증 기관으로 부터 구매하시면 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서는 테스트 키를 만들어 사용합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 테스트 키를 만들고 Secret까지 작성합니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트 키를 만들때 CN에는 위에서 지정한 global.domain과 동일한 값을 지정해야 합니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1722967759664&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj &quot;/CN=argo.43.200.12.214.nip.io&quot;

kubectl create secret tls argocd-tls-secret \
  --namespace argocd \
  --key tls.key \
  --cert tls.crt&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;5. ArgoCD 설치&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;helm chart로 설치합니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1722967891878&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;helm install argocd -f argocd.yaml argo/argo-cd&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;6. 로그인&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;username은 'admin'이고 최초 비밀번호는 argocd-initial-admin-secret에서 아래와 같이 구합니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1722968089857&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath=&quot;{.data.password}&quot; | base64 -d; echo&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비밀번호는 로그인 후 'User Info'에서 변경할 수 있습니다.&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;2138&quot; data-origin-height=&quot;988&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/de31iZ/btsIVjbX121/N3buj7sK3bYAFBrdSC9810/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/de31iZ/btsIVjbX121/N3buj7sK3bYAFBrdSC9810/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/de31iZ/btsIVjbX121/N3buj7sK3bYAFBrdSC9810/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fde31iZ%2FbtsIVjbX121%2FN3buj7sK3bYAFBrdSC9810%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2138&quot; height=&quot;988&quot; data-origin-width=&quot;2138&quot; data-origin-height=&quot;988&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;7. Manifest repisotory 작성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사전에 manifest repository를 만들어야 합니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 두개 서비스의 manifest를 디렉토리별로 관리하는 repository의 예시입니다.&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;491&quot; data-origin-height=&quot;743&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/br2F5J/btsMmJRflMH/LyNk0LbohIMC4tJm1JqS0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/br2F5J/btsMmJRflMH/LyNk0LbohIMC4tJm1JqS0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/br2F5J/btsMmJRflMH/LyNk0LbohIMC4tJm1JqS0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbr2F5J%2FbtsMmJRflMH%2FLyNk0LbohIMC4tJm1JqS0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;491&quot; height=&quot;743&quot; data-origin-width=&quot;491&quot; data-origin-height=&quot;743&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;8. Project 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 Project를 추가해야 합니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ArgoCD의 애플리케이션들을 논리적으로 그룹핑한 개념으로 Project 단위로&amp;nbsp;소스, 권한, Git과의 Sync방법등을&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리할 수 있습니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1217&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sI88L/btsMm0FePTN/Sw6Z0iwUpbUPAJJiZge8lK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sI88L/btsMm0FePTN/Sw6Z0iwUpbUPAJJiZge8lK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sI88L/btsMm0FePTN/Sw6Z0iwUpbUPAJJiZge8lK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsI88L%2FbtsMm0FePTN%2FSw6Z0iwUpbUPAJJiZge8lK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1217&quot; height=&quot;262&quot; data-origin-width=&quot;1217&quot; data-origin-height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이름과 Manifest 파일이 있는 관리할 Repository 주소를 지정합니다.&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;1481&quot; data-origin-height=&quot;517&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IU85b/btsMkwMVHGh/EZmkAIOxsPthbkbWlgAKO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IU85b/btsMkwMVHGh/EZmkAIOxsPthbkbWlgAKO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IU85b/btsMkwMVHGh/EZmkAIOxsPthbkbWlgAKO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIU85b%2FbtsMkwMVHGh%2FEZmkAIOxsPthbkbWlgAKO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1481&quot; height=&quot;517&quot; data-origin-width=&quot;1481&quot; data-origin-height=&quot;517&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배포 대상 k8s 환경을 지정합니다.&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;1460&quot; data-origin-height=&quot;282&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kZqPs/btsMkWxN61Y/lUvIWqHPZbdzPjADD2kRKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kZqPs/btsMkWxN61Y/lUvIWqHPZbdzPjADD2kRKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kZqPs/btsMkWxN61Y/lUvIWqHPZbdzPjADD2kRKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkZqPs%2FbtsMkWxN61Y%2FlUvIWqHPZbdzPjADD2kRKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1460&quot; height=&quot;282&quot; data-origin-width=&quot;1460&quot; data-origin-height=&quot;282&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;private repository인 경우 Settings &amp;gt; Repositories에서 인증 정보를 입력하여야 합니다.&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Password는 로그인 암호가 아니라 Access Token을 입력해야 합니다.&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;992&quot; data-origin-height=&quot;1184&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rq97x/btsMPO5gZon/UOX9pyqdbAcDWT4na7QKk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rq97x/btsMPO5gZon/UOX9pyqdbAcDWT4na7QKk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rq97x/btsMPO5gZon/UOX9pyqdbAcDWT4na7QKk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frq97x%2FbtsMPO5gZon%2FUOX9pyqdbAcDWT4na7QKk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;992&quot; height=&quot;1184&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;1184&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;10. Application 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 Application을 생성합니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 ArgoCD Project 생성 시 옵션에 대한 설명입니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1722968248043&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## ArgoCD New Application 
- Application name: 동기화할 application 명 
- Project name: ArgoCD의 애플리케이션들을 논리적으로 그룹핑한 개념으로 Project 단위로 
  소스, 권한, Git과의 Sync방법등을 관리할 수 있음
- Sync Policy:  Manual / Automatic
  - Automatic &amp;gt; prune resources: Git에 정의되어 있지 않은 k8s 오브젝틑는 삭제 
  - Automatic &amp;gt; self heal: Git에 정의된 값으로 k8s 오브젝트의 상태를 
    강제 동기화 시킴(예: Pod 수 일치)
  - set Deletion Finalizer: k8s 오브젝트 삭제 시 관련된 다른 object들을 
    먼저 삭제하는 finalizer를 자동으로 추가할 지 여부. 
    불필요한 오브젝트가 남는 걸 막기 위해 체크하는 것이 좋음

- Sync options
  - Skip Schema Validation: Kubernetes 매니페스트의 스키마 유효성 검사를 건너뜀
  - Prune Last: 마지막 동기화에서 생성되었지만 더 이상 Git 저장소에 없는 오브젝트를 제거
  - Respect Ignore Differences: ArgoCD 애플리케이션 리소스에 지정된 무시할 차이점을 고려. 
    Git 리소스 정의 시 spec.ignoreDifferences 필드에 정의한 필드값의 차이는 무시하는 옵션임
  - Auto-Create Namespace: 애플리케이션 배포 시 지정된 네임스페이스가 없으면 자동으로 생성
  - Apply Out of Sync Only: Git 저장소와 클러스터 간에 차이가 있는 경우에만 변경 사항을 적용
  - Server-Side Apply: 쿠버네티스 서버 사이드 적용 기능을 사용하여 리소스를 적용. 
    여러 도구로 동일한 리소스를 관리할 때 필드 수준의 병합을 하여 충돌을 방지할 수 있음
- Prune Propagation Policy
  - foreground: 종속 오브젝트부터 먼저 삭제하고 대상 오브젝트 생성. 일반적으로 권고하는 옵션
  - background: 대상 오브젝트 먼저 삭제하고 종속 오브젝트는 백그라운드에서 삭제. 
    고아 오브젝트가 남을 수 있음
  - orphan: 종속 오브젝트를 삭제하지 않음 

- Replace/Retry: 
  - Replace: 변경된 필드만 부분적으로 변경하는 것이 아닌 기존 오브젝트를 통째로 
    Git에 정의한대로 바꿈
  - Retry: 동기화 실패 시 재 시도함
    - limit: 재시도 최대 횟수
    - durations: 동기화 실패 시 다음 동기화까지의 대기 시간
    - max duration: 동기화 재 시도의 총 수행시간 최대값
    - factor: 다음 동기화까지의 대기 시간을 늘리는 승수
      (예: durations가 5초이고 factor가 2이면 첫 재시도는 5초, 
       2nd 재시도는 10초, 3rd 재시도는 20초후에 수행됨)
- Source(Git)
  - Repository URL: manifest가 있는 Git repository 주소
  - Revision: Branch나 Tag. 'HEAD'는 기본 브랜치에서 가져오는 것을 의미
  - Path: 레포지토리에서 manifest가 있는 디렉토리 경로 
- Source(Helm)
  - Repository URL: HTTP로 접근할 수 있는 helm chart가 있는 주소. 
    예) https://raw.githubusercontent.com/cna-bootcamp/helm-charts/main/stable
  - Charts: 확장자가 tgz인 helm chart 파일의 이름. 
    예) subride-front-1.1.0.tgz이면 subride-front
  - Version: 차트 버전. 예) subride-front-1.1.0.tgz이면 1.1.0
- Destination
  - Cluster URL: API Server 파드를 접근할 수 있는 Service object 주소. 
    예) https://kubernetes.default.svc
  - Namespace: 배포할 namespace명 

- Directory
  - Directory Recurse: 하위 디렉토리 recursive하게 탐색하여 manifest파일을 찾을지 여부
  - Top-level Arguments: 매니페스트 파일 설정을 overriding함. 
    예) spec.template.spec.containers[0].image=docker.io/hiondal/springboot-gradle:1.0.0
  - External Variables: 매니페스트 파일 설정을 외부 환경변수값으로 replace함
    아래 예와 같이 yaml을 만들고 External Varialbes에 IMAGE_TAG=1.0.0으로 입력 
    ```
	apiVersion: apps/v1
	kind: Deployment
	metadata:
	  name: myapp
	spec:
	  template:
	    spec:
	      containers:
	      - name: myapp
	        image: myapp:{{env.IMAGE_TAG}}
    ```
  - Include: 포함할 특정 파일이나 디렉토리
  - Exclude: 제외할 특정 파일이나 디렉토리&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 예시입니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1528&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfF1Z6/btsMlnPi77q/VKN2tl6XCDR9hWmEOP2RW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfF1Z6/btsMlnPi77q/VKN2tl6XCDR9hWmEOP2RW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfF1Z6/btsMlnPi77q/VKN2tl6XCDR9hWmEOP2RW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfF1Z6%2FbtsMlnPi77q%2FVKN2tl6XCDR9hWmEOP2RW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1528&quot; height=&quot;502&quot; data-origin-width=&quot;1528&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Project에 지정한 repository 중 하나여야 합니다.&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;1751&quot; data-origin-height=&quot;510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zNVXa/btsMl9v7lhb/ZEyksh0sQckIw80DOKLRm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zNVXa/btsMl9v7lhb/ZEyksh0sQckIw80DOKLRm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zNVXa/btsMl9v7lhb/ZEyksh0sQckIw80DOKLRm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzNVXa%2FbtsMl9v7lhb%2FZEyksh0sQckIw80DOKLRm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1751&quot; height=&quot;510&quot; data-origin-width=&quot;1751&quot; data-origin-height=&quot;510&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Project에서 정의한 대상 환경과 일치해야 합니다.&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;1469&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzlDM7/btsMkY3okTr/wuWChQHbvmEXjIS0OoJqFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzlDM7/btsMkY3okTr/wuWChQHbvmEXjIS0OoJqFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzlDM7/btsMkY3okTr/wuWChQHbvmEXjIS0OoJqFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzlDM7%2FbtsMkY3okTr%2FwuWChQHbvmEXjIS0OoJqFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1469&quot; height=&quot;362&quot; data-origin-width=&quot;1469&quot; data-origin-height=&quot;362&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;manifest repository가 디렉토리 별로 manifest를 관리하는 구조일 때 Directory Recurse를 체크 합니다.&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;1603&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfXDCt/btsMmISiCAG/5bpy6p0bHdiCR8vBiB6qb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfXDCt/btsMmISiCAG/5bpy6p0bHdiCR8vBiB6qb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfXDCt/btsMmISiCAG/5bpy6p0bHdiCR8vBiB6qb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfXDCt%2FbtsMmISiCAG%2F5bpy6p0bHdiCR8vBiB6qb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1603&quot; height=&quot;476&quot; data-origin-width=&quot;1603&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&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;11. Rollback&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;888&quot; data-origin-height=&quot;324&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BzsBT/btsMnjR5NQ3/yK9rrppQ4F0pPLHmgvHRA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BzsBT/btsMnjR5NQ3/yK9rrppQ4F0pPLHmgvHRA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BzsBT/btsMnjR5NQ3/yK9rrppQ4F0pPLHmgvHRA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBzsBT%2FbtsMnjR5NQ3%2FyK9rrppQ4F0pPLHmgvHRA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;888&quot; height=&quot;324&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;324&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;1666&quot; data-origin-height=&quot;764&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciXky1/btsMmbgrfVl/vtNosDwVPm0NvYgkWEJmR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciXky1/btsMmbgrfVl/vtNosDwVPm0NvYgkWEJmR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciXky1/btsMmbgrfVl/vtNosDwVPm0NvYgkWEJmR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciXky1%2FbtsMmbgrfVl%2FvtNosDwVPm0NvYgkWEJmR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1666&quot; height=&quot;764&quot; data-origin-width=&quot;1666&quot; data-origin-height=&quot;764&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Agile&amp;amp;DevOps/CI, CD 툴 설치</category>
      <author>Happy@Cloud</author>
      <guid isPermaLink="true">https://happycloud-lee.tistory.com/293</guid>
      <comments>https://happycloud-lee.tistory.com/293#entry293comment</comments>
      <pubDate>Wed, 7 Aug 2024 03:18:04 +0900</pubDate>
    </item>
    <item>
      <title>클라우드 네이티브 애플리케이션 부트캠프 알림</title>
      <link>https://happycloud-lee.tistory.com/notice/292</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요 ?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에 러닝스푼즈와 손 잡고 클라우드 네이티브 애플리케이션 부트캠프를 기획했습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관심있는 분들의 많은 참석 바래요^^&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://learningspoons.com/course/detail/cloud-native/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;한국 IBM 출신 아키텍트에게 배우는 클라우드 네이티브 애플리케이션 개발 (learningspoons.com)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1716645333819&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;한국 IBM 출신 아키텍트에게 배우는 클라우드 네이티브 애플리케이션 개발&quot; data-og-description=&quot;국내 유일, 클라우드 환경 기반 서비스 [기획-설계-개발-배포-제품 검증]까지 모두 경험하는 클라우드 네이티브 애플리케이션 개발 강의!&quot; data-og-host=&quot;learningspoons.com&quot; data-og-source-url=&quot;https://learningspoons.com/course/detail/cloud-native/&quot; data-og-url=&quot;https://learningspoons.com/course/detail/cloud-native/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/porPW/hyV9M5Sa80/ivfgre14hieQZsKmpKwOfk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/hw3I2/hyV9VaDAGW/lWcCNyz4KNb0ma8NQNGcBk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/kFKu0/hyV92U9XbO/26ZXtXU8piJ6m2EbkHcgqk/img.png?width=590&amp;amp;height=400&amp;amp;face=0_0_590_400&quot;&gt;&lt;a href=&quot;https://learningspoons.com/course/detail/cloud-native/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://learningspoons.com/course/detail/cloud-native/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/porPW/hyV9M5Sa80/ivfgre14hieQZsKmpKwOfk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/hw3I2/hyV9VaDAGW/lWcCNyz4KNb0ma8NQNGcBk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/kFKu0/hyV92U9XbO/26ZXtXU8piJ6m2EbkHcgqk/img.png?width=590&amp;amp;height=400&amp;amp;face=0_0_590_400');&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;한국 IBM 출신 아키텍트에게 배우는 클라우드 네이티브 애플리케이션 개발&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;국내 유일, 클라우드 환경 기반 서비스 [기획-설계-개발-배포-제품 검증]까지 모두 경험하는 클라우드 네이티브 애플리케이션 개발 강의!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;learningspoons.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>Happy@Cloud</author>
      <guid isPermaLink="true">https://happycloud-lee.tistory.com/notice/292</guid>
      <pubDate>Sat, 25 May 2024 22:56:43 +0900</pubDate>
    </item>
    <item>
      <title>[마이크로서비스패턴 쉽게 개발하기] 전자책 출간</title>
      <link>https://happycloud-lee.tistory.com/notice/291</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요? 온달입니다.&amp;nbsp;&lt;br /&gt;그동안 몇 번 시도하다 포기했던 책내기에 드디어 성공 했습니다.&lt;/p&gt;
&lt;figure data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;023&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/023.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/023.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;책 제목은 &lt;b&gt;'마이크로서비스패턴 쉽게 개발하기'&lt;/b&gt;입니다.&amp;nbsp;&lt;br /&gt;2024년 2월 19일 부터 교보문고, Yes24, 알라딘 등 대형서점을 통해 출간 예정입니다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;&lt;u&gt;3줄 요약&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;이론 보다 동작하는 코드로 마이크로서비스 패턴 익히기&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자연스럽게 배우는 SpringBoot&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비개발자도 따라할 수 있는 자세한 설명&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;판매서점&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;- 교보문고: &lt;a href=&quot;https://ebook-product.kyobobook.co.kr/dig/epd/ebook/E000006541466&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span&gt;https://ebook-product.kyobobook.co.kr/dig/epd/ebook/E000006541466&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;- Yes24: &lt;a href=&quot;https://www.yes24.com/Product/Goods/125032617&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.yes24.com/Product/Goods/125032617&lt;/a&gt;&lt;br /&gt;- 알라딘: &lt;a href=&quot;http://aladin.kr/p/TQyim&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span&gt;http://aladin.kr/p/TQyim&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;- 리디북스: &lt;a href=&quot;https://ridibooks.com/books/1745006808&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span&gt;https://ridibooks.com/books/1745006808&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;마이크로서비스패턴에 대한 관심은 많지만 실제 개발을 안내하는 자료는 온/오프라인에 거의 없더군요.&amp;nbsp;&lt;br /&gt;그래서 이번에 &lt;b&gt;Axon Framework을 이용하여 Saga, Event Sourcing, CQRS, API Composition패턴&lt;/b&gt;을 어떻게 개발하는지&amp;nbsp;&lt;br /&gt;자세한 예제와 함께 책으로 엮어 봤습니다.&amp;nbsp;&lt;br /&gt;원래 블로그에 다 올리려 했는데 이왕 하는 거 '책내기'라는 버킷리스트도 실현하자는 맘으로 책을 내게 됐습니다.&amp;nbsp;&lt;br /&gt;마이크로서비스패턴을 직접 개발해 보고 싶은 개발자나 차별적 역량을 갖고 싶은 취준생분들에게 도움이 되리라 생각합니다.&amp;nbsp;&lt;br /&gt;관심있는 분들의 &lt;b&gt;구매를 살짝 기대하며 주변에도 많은 홍보 부탁&lt;/b&gt; 드립니다.&amp;nbsp;&lt;br /&gt;감사합니다.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <author>Happy@Cloud</author>
      <guid isPermaLink="true">https://happycloud-lee.tistory.com/notice/291</guid>
      <pubDate>Sun, 28 Jan 2024 10:52:10 +0900</pubDate>
    </item>
    <item>
      <title>[마이크로서비스 패턴 쉽게 개발 4] Axon Framework(7): Event Replay로 조회DB 데이터 복구</title>
      <link>https://happycloud-lee.tistory.com/286</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 Axon Framework의 CommandGateway &amp;amp; Event Sourcing, EventGateway, QueryGateway, Snapshot, State Stored Aggregate에 대해서&amp;nbsp;'코끼리 냉장고 넣기'서비스를 개발하면서 배워 봤습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이제 마지막으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Event Replay를 이용하여 조회DB 데이터를 복구&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;하는 방법을 실습해 보겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Event Replay Controller 추가&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;package 'org.axon.controller'에 'ReplayEventsController' class를 추가 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;두개의 API가 추가 됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ReplayEventsController: 지정한 Event Handler에 대해 특정 일시 이후의 Event만 Replay함&amp;nbsp;&lt;/li&gt;
&lt;li&gt;replayEventsAll: Event Replay가 활성화된 모든 Event Handler에 대해 Event Replay를 함&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1705642555155&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package org.axon.controller;
/*
- 목적: Event를 replay하여 최종 상태를 DB에 저장함
*/
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.axonframework.config.Configuration;
import org.axonframework.eventhandling.StreamingEventProcessor;
import org.axonframework.eventhandling.TrackingEventProcessorConfiguration;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.Instant;
import java.util.List;

@Tag(name = &quot;Replay Events API&quot;)
@Slf4j
@RestController
@RequestMapping(&quot;/api/admin&quot;)
class ReplayEventsController {
    private final Configuration configuration;

    public ReplayEventsController(Configuration configuration) {
        this.configuration = configuration;
    }

    //-- 특정 EventHandler class에 대해 특정 날짜 이후의 Event Replay하여 최종 상태 저장
    @GetMapping(&quot;/replay/{processingGroup}/{startDateTime}&quot;)
    @Operation(summary = &quot;지정한 Processing Group의 Event Handler를 지정한 시간 이후 Event만 Replay하면서 수행함&quot;)
    @Parameters({
            @Parameter(name = &quot;processingGroup&quot;, in= ParameterIn.PATH, description = &quot;Processing Groupname&quot;,
                    required = true, example=&quot;elephant&quot;),
            @Parameter(name = &quot;startDateTime&quot;, in= ParameterIn.PATH, description = &quot;시작일시(생략 시 모든 Event Replay)&quot;,
                    allowEmptyValue = true, example = &quot;2024-01-01T00:00:00.00Z&quot;)
    })
    String replayEventFor(
            @PathVariable(name = &quot;processingGroup&quot;) String processingGroupName,
            @PathVariable(name = &quot;startDateTime&quot;) String startDateTime) {

        String startAt = (&quot;&quot;.equals(startDateTime) ? &quot;2000-01-01T00:00:00.00Z&quot; : startDateTime);
        log.info(&quot;Executing replayEventsFor({}) from {}&quot;, processingGroupName, startAt);

        TrackingEventProcessorConfiguration tepConfig = TrackingEventProcessorConfiguration
                .forSingleThreadedProcessing()
                .andInitialTrackingToken(streamableMessageSource -&amp;gt;
                        streamableMessageSource.createTokenAt(Instant.parse(startAt)));

        configuration.eventProcessingConfiguration()
                .eventProcessorByProcessingGroup(processingGroupName, StreamingEventProcessor.class)
                .ifPresentOrElse(streamingEventProcessor -&amp;gt;
                {
                    if(streamingEventProcessor.supportsReset()) {
                        streamingEventProcessor.shutDown();
                        //streamingEventProcessor.resetTokens();    //모든 Event replay 시
                        streamingEventProcessor.resetTokens(tepConfig.getInitialTrackingToken());
                        streamingEventProcessor.start();
                        log.info(&quot;===== Start replay events for &amp;lt;{}&amp;gt; from {}&quot;, processingGroupName, startAt);
                    } else {
                        log.info(&quot;Find &amp;lt;{}&amp;gt;. But, It's not support replay&quot;, processingGroupName);
                    }
                }, () -&amp;gt; log.info(&quot;Can't find &amp;lt;{}&amp;gt;&quot;, processingGroupName));

        return &quot;Replay Events is processed&quot;;
    }

    //-- Event Replay를 허용하는 모든 Event Handler에 대해 전체 Event를 Replay하여 최종 상태 저장
    @GetMapping(&quot;/replayAll&quot;)
    @Operation(summary = &quot;Replay가 가능한 모든 Event Handler를 찾아 Event를 처음부터 Replay하도록 함&quot;)
    String replayEventsAll() {
        log.info(&quot;Executing replayEventsAll&quot;);
        List&amp;lt;StreamingEventProcessor&amp;gt; streamingEventProcessors = configuration.eventProcessingConfiguration()
                .eventProcessors().values().stream()
                .filter(StreamingEventProcessor.class::isInstance)
                .map(StreamingEventProcessor.class::cast)
                .toList();

        streamingEventProcessors.forEach(streamingEventProcessor -&amp;gt; {
            if(streamingEventProcessor.supportsReset()) {
                log.info(&quot;Trigger ResetTriggeredEvent for streamingEventProcessor &amp;lt;{}&amp;gt;&quot;, streamingEventProcessor);
                streamingEventProcessor.shutDown();
                streamingEventProcessor.resetTokens();
                streamingEventProcessor.start();
            }
        });

        return &quot;Replay Events All is Processed&quot;;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&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;EventHandler class에 Event Replay 활성화 및 @ResetHandler 추가&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ElephantEventHandler class에 Event Replay를 활성화하는 어노테이션 '@ AllowReplay'를 추가 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;또한 @ProcessingGroup 어노테이션으로 Process Group명도 추가 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위에서 만든 'ReplayEventsController' API에서 Process Group명을 입력하는데 이 이름을 사용하면 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1705643011511&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Slf4j
@Component
@ProcessingGroup(&quot;elephant&quot;)    //전체 Event Replay시 대상 class를 구별하기 위해 부여
@AllowReplay                    //Event Replay를 활성화 함. 비활성화할 EventHandler에는 @DisallowReplay를 지정
public class ElephantEventHandler {
    @Autowired
...
}&lt;/code&gt;&lt;/pre&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: 100%;&quot;&gt;참고) Event Replay를 허용하지 않을 Event Handler 메소드는 @DisallowReplay 어노테이션을 붙이십시오.&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;Event Replay를 시작 하기 전에 조회DB의 기존 데이터를 모두 삭제하는 Reset Handler를 맨 아래 추가 하십시오.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;enter_count 테이블의 모든 데이터도 삭제해야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1705643148252&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    //===================== 전체 이벤트 Replay하여 DB에 최종 상태 저장 ===========
    @ResetHandler
    private void replayAll() {
        log.info(&quot;[@ResetHandler] Executing replayAll&quot;);
        elephantRepository.deleteAll();
        enterCountRepository.deleteAll();
    }&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;EnterCountRepository를 만들어서 에러를 없앱니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;package 'org.axon.repository' 하위에 작성 합니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1705644507490&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.axon.entity.EnterCount;
import org.springframework.data.jpa.repository.JpaRepository;

public interface EnterCountRepository extends JpaRepository&amp;lt;EnterCount, String&amp;gt; {

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ElephantEventHandler class에 EnterCountRepository의 객체를 생성하는 수행을 추가 합니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1705644627793&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class ElephantEventHandler {
	...
    @Autowired
    private EnterCountRepository enterCountRepository;
    ...
}&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;TIP) 특정 일시부터 현재까지  발생한 Event만 이용하여 데이터 생성이 가능함&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번째 API를 응용하여 정기적으로 다른 조회 DB에 Event Replay를 하여 데이터를 생성할 수 있습니다.&amp;nbsp;&amp;nbsp;&lt;/p&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&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;어플리케이션을 재시작하고 Swagger 페이지를 열어 보십시오.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이제 Event Replay 요청 API가 하단에 표시될겁니다.&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;2202&quot; data-origin-height=&quot;356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEBHF1/btsDEj9qG4j/aKXdVtlr2NQO5D9S1Xmc6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEBHF1/btsDEj9qG4j/aKXdVtlr2NQO5D9S1Xmc6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEBHF1/btsDEj9qG4j/aKXdVtlr2NQO5D9S1Xmc6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEBHF1%2FbtsDEj9qG4j%2FaKXdVtlr2NQO5D9S1Xmc6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2202&quot; height=&quot;356&quot; data-origin-width=&quot;2202&quot; data-origin-height=&quot;356&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- '/api/admin/replayAll' 실행&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;API 실행 후 콘솔의 두번째 줄을 보면 'elephant'라는 Processing group을 찾아서 Event Replay를 실행한 걸 확인할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1705644966030&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  Executing replayEventsAll
   Trigger ResetTriggeredEvent for streamingEventProcessor &amp;lt;elephant&amp;gt;
   Shutdown state set for Processor 'elephant'.
   Processor 'elephant' awaiting termination...
   Released claim
   Worker for segment Segment[0/0] stopped.
   [@ResetHandler] Executing replayAll
   Worker assigned to segment Segment[0/0] for processing
   Using current Thread for last segment worker: TrackingSegmentWorker{processor=elephant, segment=Segment[0/0]}
   Fetched token: ReplayToken{currentToken=ReplayToken{currentToken=null, tokenAtReset=IndexTrackingToken{globalIndex=2}, context=null}, tokenAtReset=IndexTrackingToken{globalIndex=2}, context=null} for segment: Segment[0/0]
   [@EventHandler] CreatedElephantEvent for Id: 664
   [@EventHandler] CreatedElephantEvent for Id: 046
   [@CommandHandler] CreateEnterCountCommand for Id: 664
   [@CommandHandler] CreateEnterCountCommand for Id: 046
   [@EventHandler] CreatedElephantEvent for Id: 143
   [@CommandHandler] CreateEnterCountCommand for Id: 143&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;DBeaver에서 데이터를 확인해 보면 모두 지우고 Event Replay를 한 후 Data가 다시 복원된 걸 확인할 수 있습니다.&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;1042&quot; data-origin-height=&quot;486&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w0cgj/btsDIzpwaaI/aXeeFLg4pRDZpte9UxE0Pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w0cgj/btsDIzpwaaI/aXeeFLg4pRDZpte9UxE0Pk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w0cgj/btsDIzpwaaI/aXeeFLg4pRDZpte9UxE0Pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw0cgj%2FbtsDIzpwaaI%2FaXeeFLg4pRDZpte9UxE0Pk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;748&quot; height=&quot;349&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;486&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;두번째 API를 테스트 해 봅니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;특정 날짜 이후의 Event만 Replay할 수 있습니다. 실행을 하고 DBeaver에서 확인해 보면 데이터가 그대로 복원되었을 겁니다.&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;1432&quot; data-origin-height=&quot;862&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MZuGi/btsDHmcTzJ0/KNV7LunqC3gzM87t0DUwm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MZuGi/btsDHmcTzJ0/KNV7LunqC3gzM87t0DUwm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MZuGi/btsDHmcTzJ0/KNV7LunqC3gzM87t0DUwm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMZuGi%2FbtsDHmcTzJ0%2FKNV7LunqC3gzM87t0DUwm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1432&quot; height=&quot;862&quot; data-origin-width=&quot;1432&quot; data-origin-height=&quot;862&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이번에는 시작 일시를 오늘 날짜 이후로 지정하고 실행해 보십시오.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;데이터가 복원되지 않습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8jZBT/btsDGwgbKff/qxxiEMCeEksowPed6ZrZik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8jZBT/btsDGwgbKff/qxxiEMCeEksowPed6ZrZik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8jZBT/btsDGwgbKff/qxxiEMCeEksowPed6ZrZik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8jZBT%2FbtsDGwgbKff%2FqxxiEMCeEksowPed6ZrZik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;660&quot; height=&quot;278&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;418&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다시 시작일시를 어제 날짜로 지정하고 실행해 봅니다.&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;원본 데이터는 Event Store에 저장되어 있기 때문에 복원이 되는 것입니다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이상으로 총 7개 편으로 나누어 Axon Framework에 대해 실습을 통해 이해 하였습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;u&gt;&lt;a href=&quot;https://happycloud-lee.tistory.com/279&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;코끼리 냉장고에 넣기 프로젝트 시작&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;u&gt;&lt;a href=&quot;https://happycloud-lee.tistory.com/280&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;CommandGateway와 Event Sourcing&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://happycloud-lee.tistory.com/281&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;u&gt;EventGateway&lt;/u&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;a href=&quot;https://happycloud-lee.tistory.com/282&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;u&gt;&lt;span style=&quot;color: #000000;&quot;&gt;QueryGateay&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;u&gt;&lt;a href=&quot;https://happycloud-lee.tistory.com/283&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Snapshot&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;u&gt;&lt;a href=&quot;https://happycloud-lee.tistory.com/285&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;State Stored Aggregate&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;a href=&quot;https://happycloud-lee.tistory.com/286&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;u&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Event Replay로 조회DB 데이터 복구&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Axon Framework은 지금까지 설명한 기능 외에 &lt;b&gt;Saga 패턴을 쉽게 구현할 수 있는 방법도 제공&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://happycloud-lee.tistory.com/275&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;u&gt;마이크로서비스 패턴 이해: Saga, Event Sourcing, API Composition, CQRS 이해&lt;/u&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://happycloud-lee.tistory.com/276&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;u&gt;실습환경 준비&lt;/u&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://happycloud-lee.tistory.com/278&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;u&gt;주문 서비스 테스트&lt;/u&gt;&amp;nbsp;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Axon Framework 이해&amp;nbsp;&lt;/span&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;u&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://happycloud-lee.tistory.com/279&quot;&gt;코끼리 냉장고에 넣기 프로젝트 시작&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;u&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://happycloud-lee.tistory.com/280&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;CommandGateway와 Event Sourcing&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://happycloud-lee.tistory.com/281&quot;&gt;&lt;u&gt;EventGateway&lt;/u&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://happycloud-lee.tistory.com/282&quot;&gt;&lt;u&gt;&lt;span style=&quot;color: #000000;&quot;&gt;QueryGateay&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;u&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://happycloud-lee.tistory.com/283&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Snapshot&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;u&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://happycloud-lee.tistory.com/285&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;State Stored Aggregate&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://happycloud-lee.tistory.com/286&quot;&gt;&lt;u&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Event Replay로 조회DB 데이터 복구&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;아래 주제들은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://happycloud-lee.tistory.com/notice/291&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;'마이크로서비스패턴 쉽게 개발하기'&lt;/a&gt;라는 제 책에서 만나실 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;멀티 모듈 프로젝트 작성&lt;/li&gt;
&lt;li&gt;신규 주문 정상처리 프로세스 구현&amp;nbsp;&lt;/li&gt;
&lt;li&gt;배송 상태 변경 및 재고 증감 처리&lt;/li&gt;
&lt;li&gt;신규 주문 보상처리 프로세스 구현&lt;/li&gt;
&lt;li&gt;주문 수정 정상처리 프로세스 구현&lt;/li&gt;
&lt;li&gt;주문 수정 보상처리 프로세스 구현&lt;/li&gt;
&lt;li&gt;주문 삭제 정상처리 프로세스 구현&lt;/li&gt;
&lt;li&gt;주문 삭제 보상처리 프로세스 구현&lt;/li&gt;
&lt;li&gt;API Composition 패턴과 CQRS 패턴&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&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;구매까지 해 주시면 더욱 감사하겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://happycloud-lee.tistory.com/notice/291&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://happycloud-lee.tistory.com/notice/291&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1710944503256&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;[마이크로서비스패턴 쉽게 개발하기] 전자책 출간&quot; data-og-description=&quot;안녕하세요? 온달입니다. 그동안 몇 번 시도하다 포기했던 책내기에 드디어 성공 했습니다. 책 제목은 '마이크로서비스패턴 쉽게 개발하기'입니다. 2024년 2월 19일 부터 교보문고, Yes24, 알라딘 등&quot; data-og-host=&quot;happycloud-lee.tistory.com&quot; data-og-source-url=&quot;https://happycloud-lee.tistory.com/notice/291&quot; data-og-url=&quot;https://happycloud-lee.tistory.com/notice/291&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bMCTzF/hyVDtLeO9f/gQYRFrhOliyS0gsniTG1l1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/crKQ3Y/hyVAzfgeOc/I4DfKNGIDmLWyHrrrdi2GK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://happycloud-lee.tistory.com/notice/291&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://happycloud-lee.tistory.com/notice/291&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bMCTzF/hyVDtLeO9f/gQYRFrhOliyS0gsniTG1l1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/crKQ3Y/hyVAzfgeOc/I4DfKNGIDmLWyHrrrdi2GK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;[마이크로서비스패턴 쉽게 개발하기] 전자책 출간&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요? 온달입니다. 그동안 몇 번 시도하다 포기했던 책내기에 드디어 성공 했습니다. 책 제목은 '마이크로서비스패턴 쉽게 개발하기'입니다. 2024년 2월 19일 부터 교보문고, Yes24, 알라딘 등&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;happycloud-lee.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;</description>
      <category>Micro Service/mSVC개발</category>
      <author>Happy@Cloud</author>
      <guid isPermaLink="true">https://happycloud-lee.tistory.com/286</guid>
      <comments>https://happycloud-lee.tistory.com/286#entry286comment</comments>
      <pubDate>Fri, 19 Jan 2024 15:47:04 +0900</pubDate>
    </item>
  </channel>
</rss>