<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>리고니</title>
    <link>https://leegonee.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Fri, 15 May 2026 03:17:00 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>리고니</managingEditor>
    <item>
      <title>아키텍처 접근 고찰</title>
      <link>https://leegonee.tistory.com/32</link>
      <description>&lt;h1 data-end=&quot;257&quot; data-start=&quot;216&quot;&gt;  &lt;b&gt;아키텍처 접근을 &amp;lsquo;최소한의 단계&amp;rsquo;로 단순화하면 단 3단계다&lt;/b&gt;&lt;/h1&gt;
&lt;h1 data-end=&quot;291&quot; data-start=&quot;259&quot;&gt;✔ 1단계: &amp;ldquo;나는 무엇이 자주 바뀔까?&amp;rdquo;부터 찾기&lt;/h1&gt;
&lt;h1 data-end=&quot;325&quot; data-start=&quot;292&quot;&gt;✔ 2단계: &amp;ldquo;바뀌는 것을 어떻게 분리하지?&amp;rdquo;를 고민&lt;/h1&gt;
&lt;h1 data-end=&quot;364&quot; data-start=&quot;326&quot;&gt;✔ 3단계: &amp;ldquo;그걸 분리한 뒤 코드가 어떻게 생기지?&amp;rdquo;를 보는 것&lt;/h1&gt;
&lt;p data-end=&quot;419&quot; data-start=&quot;366&quot; data-ke-size=&quot;size16&quot;&gt;단 3단계.&lt;br /&gt;여기서 Clean Architecture나 Hexagonal이 자동으로 떠오름.&lt;/p&gt;
&lt;hr data-end=&quot;424&quot; data-start=&quot;421&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;459&quot; data-start=&quot;426&quot;&gt;  1단계: &quot;자주 바뀌는 것&quot;만 찾으면 70% 끝난다&lt;/h1&gt;
&lt;p data-end=&quot;475&quot; data-start=&quot;461&quot; data-ke-size=&quot;size16&quot;&gt;아키텍처의 본질은 1개야:&lt;/p&gt;
&lt;blockquote data-end=&quot;504&quot; data-start=&quot;477&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;504&quot; data-start=&quot;479&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;변하는 것과 변하지 않는 것을 분리하기&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;528&quot; data-start=&quot;506&quot; data-ke-size=&quot;size16&quot;&gt;실제로 네 MCP Hub 기준으로 보면:&lt;/p&gt;
&lt;h2 data-end=&quot;543&quot; data-start=&quot;530&quot; data-ke-size=&quot;size26&quot;&gt;✔ 자주 바뀌는 것&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;685&quot; data-start=&quot;544&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;580&quot; data-start=&quot;544&quot;&gt;모델 제공자(OpenAI, Anthropic, Groq...)&lt;/li&gt;
&lt;li data-end=&quot;615&quot; data-start=&quot;581&quot;&gt;툴(MCP Tool들: FS, DB, Web, GPU 등)&lt;/li&gt;
&lt;li data-end=&quot;642&quot; data-start=&quot;616&quot;&gt;클라이언트 타입(WebSocket, API)&lt;/li&gt;
&lt;li data-end=&quot;654&quot; data-start=&quot;643&quot;&gt;DB나 캐시 기술&lt;/li&gt;
&lt;li data-end=&quot;668&quot; data-start=&quot;655&quot;&gt;스토리지 경로, 구성&lt;/li&gt;
&lt;li data-end=&quot;677&quot; data-start=&quot;669&quot;&gt;API 스펙&lt;/li&gt;
&lt;li data-end=&quot;685&quot; data-start=&quot;678&quot;&gt;인증 전략&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;708&quot; data-start=&quot;687&quot; data-ke-size=&quot;size26&quot;&gt;✔ 잘 안 바뀌는 것(핵심 로직)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;794&quot; data-start=&quot;709&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;716&quot; data-start=&quot;709&quot;&gt;세션 관리&lt;/li&gt;
&lt;li data-end=&quot;728&quot; data-start=&quot;717&quot;&gt;메시지 라우팅&lt;/li&gt;
&lt;li data-end=&quot;743&quot; data-start=&quot;729&quot;&gt;메시지 이벤트 흐름&lt;/li&gt;
&lt;li data-end=&quot;762&quot; data-start=&quot;744&quot;&gt;모델 호출이라는 개념 자체&lt;/li&gt;
&lt;li data-end=&quot;780&quot; data-start=&quot;763&quot;&gt;Tool 호출이라는 개념&lt;/li&gt;
&lt;li data-end=&quot;794&quot; data-start=&quot;781&quot;&gt;스트림 전달 규칙&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;828&quot; data-start=&quot;796&quot; data-ke-size=&quot;size16&quot;&gt;이걸 찾으면 &amp;ldquo;아키텍처 선택&amp;rdquo;이 이미 끝난 거나 다름없어.&lt;/p&gt;
&lt;p data-end=&quot;834&quot; data-start=&quot;830&quot; data-ke-size=&quot;size16&quot;&gt;왜냐면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;950&quot; data-start=&quot;836&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;877&quot; data-start=&quot;836&quot;&gt;외부 의존성이 자주 바뀜 &amp;rarr; &lt;b&gt;Hexagonal / Clean&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;909&quot; data-start=&quot;878&quot;&gt;내부 규칙 고정 &amp;rarr; &lt;b&gt;Domain 중심 설계&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;950&quot; data-start=&quot;910&quot;&gt;스트림/이벤트 흐름 존재 &amp;rarr; &lt;b&gt;Event-driven 구조 필요&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;992&quot; data-start=&quot;952&quot; data-ke-size=&quot;size16&quot;&gt;너의 프로젝트는 이 특징을 가짐 &amp;rarr; 아키텍처 답이 자동으로 정해지는 것.&lt;/p&gt;
&lt;hr data-end=&quot;997&quot; data-start=&quot;994&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1032&quot; data-start=&quot;999&quot;&gt;  2단계: 바뀌는 것들은 &amp;ldquo;인터페이스로 추상화&amp;rdquo; 한다&lt;/h1&gt;
&lt;p data-end=&quot;1060&quot; data-start=&quot;1034&quot; data-ke-size=&quot;size16&quot;&gt;아키텍처 이름은 어려워도 실제 개념은 한 줄임:&lt;/p&gt;
&lt;blockquote data-end=&quot;1121&quot; data-start=&quot;1062&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1121&quot; data-start=&quot;1064&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;바뀌는 것들은 전부 인터페이스(Port)로 만들고, 실제 구현(Adapter)은 나중에 끼운다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;1127&quot; data-start=&quot;1123&quot; data-ke-size=&quot;size16&quot;&gt;예시로:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;# Port (추상화)&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;class&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;ModelProviderPort&lt;/span&gt;&lt;/span&gt;&lt;span&gt;: async &lt;/span&gt;&lt;span&gt;&lt;span&gt;def&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;stream&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;self&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&lt;span&gt;messages:&lt;/span&gt;&lt;/span&gt;&lt;span&gt; list): ... &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;# Adapter (구현체)&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;class&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;OpenAIProvider&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;ModelProviderPort&lt;/span&gt;&lt;/span&gt;&lt;span&gt;): &lt;/span&gt;&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;def&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;stream&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;&lt;span&gt;): &lt;/span&gt;&lt;span&gt;&lt;span&gt;# openai 호출 코드&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;class&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;GroqProvider&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;ModelProviderPort&lt;/span&gt;&lt;/span&gt;&lt;span&gt;): &lt;/span&gt;&lt;span&gt;&lt;span&gt;async&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;def&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;stream&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;&lt;span&gt;): &lt;/span&gt;&lt;span&gt;&lt;span&gt;# groq 호출 코드&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1453&quot; data-start=&quot;1436&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 구조가 자동으로 분리됨.&lt;/p&gt;
&lt;p data-end=&quot;1518&quot; data-start=&quot;1455&quot; data-ke-size=&quot;size16&quot;&gt;이게 바로 &amp;ldquo;헥사고날 아키텍처&amp;rdquo;고,&lt;br /&gt;Clean Architecture의 핵심 규칙인 &amp;ldquo;의존성 역전 원칙&amp;rdquo;이야.&lt;/p&gt;
&lt;p data-end=&quot;1550&quot; data-start=&quot;1520&quot; data-ke-size=&quot;size16&quot;&gt;어려운 용어를 몰라도 &lt;b&gt;패턴은 그냥 이렇게 생겨&lt;/b&gt;.&lt;/p&gt;
&lt;hr data-end=&quot;1555&quot; data-start=&quot;1552&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1604&quot; data-start=&quot;1557&quot;&gt;  3단계: 실제 폴더 구조에 녹이면 Clean Architecture가 완성됨&lt;/h1&gt;
&lt;p data-end=&quot;1623&quot; data-start=&quot;1606&quot; data-ke-size=&quot;size16&quot;&gt;단순하게 이렇게 나누면 끝이야:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;app/ domain/ &lt;/span&gt;&lt;span&gt;&lt;span&gt;# 규칙(바뀌지 않는 것)&lt;/span&gt;&lt;/span&gt;&lt;span&gt; application/ &lt;/span&gt;&lt;span&gt;&lt;span&gt;# 유즈케이스&lt;/span&gt;&lt;/span&gt;&lt;span&gt; ports/ &lt;/span&gt;&lt;span&gt;&lt;span&gt;# 추상화 인터페이스&lt;/span&gt;&lt;/span&gt;&lt;span&gt; adapters/ &lt;/span&gt;&lt;span&gt;&lt;span&gt;# 실제 구현&lt;/span&gt;&lt;/span&gt;&lt;span&gt; presentation/ &lt;/span&gt;&lt;span&gt;&lt;span&gt;# FastAPI 등 I/O&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1825&quot; data-start=&quot;1783&quot; data-ke-size=&quot;size16&quot;&gt;딱 여기까지만 이해하면 Clean Architecture가 90% 끝난 것.&lt;/p&gt;
&lt;hr data-end=&quot;1830&quot; data-start=&quot;1827&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1863&quot; data-start=&quot;1832&quot;&gt;  비유로 한 번 더 설명해줄게 (완전 쉬운 버전)&lt;/h1&gt;
&lt;h3 data-end=&quot;1888&quot; data-start=&quot;1865&quot; data-ke-size=&quot;size23&quot;&gt;  햄버거 가게를 만든다고 해보자&lt;/h3&gt;
&lt;p data-end=&quot;1896&quot; data-start=&quot;1890&quot; data-ke-size=&quot;size16&quot;&gt;바뀌는 것:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1931&quot; data-start=&quot;1897&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1905&quot; data-start=&quot;1897&quot;&gt;패티 공급자&lt;/li&gt;
&lt;li data-end=&quot;1914&quot; data-start=&quot;1906&quot;&gt;소스 레시피&lt;/li&gt;
&lt;li data-end=&quot;1922&quot; data-start=&quot;1915&quot;&gt;매장 위치&lt;/li&gt;
&lt;li data-end=&quot;1931&quot; data-start=&quot;1923&quot;&gt;POS 장비&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1942&quot; data-start=&quot;1933&quot; data-ke-size=&quot;size16&quot;&gt;바뀌지 않는 것:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1968&quot; data-start=&quot;1943&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1968&quot; data-start=&quot;1943&quot;&gt;햄버거 만드는 규칙 (빵&amp;rarr;패티&amp;rarr;야채&amp;rarr;소스)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1983&quot; data-start=&quot;1970&quot; data-ke-size=&quot;size16&quot;&gt;그럼 어떻게 구조화할까?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2083&quot; data-start=&quot;1985&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2027&quot; data-start=&quot;1985&quot;&gt;&amp;ldquo;패티 공급자&amp;rdquo;는 인터페이스로 만들고 실제 공급업체끼리 교체 가능하게&lt;/li&gt;
&lt;li data-end=&quot;2067&quot; data-start=&quot;2028&quot;&gt;&amp;ldquo;POS 장비&amp;rdquo;는 인터페이스로 만들고 실제 기기는 어댑터로 구성&lt;/li&gt;
&lt;li data-end=&quot;2083&quot; data-start=&quot;2068&quot;&gt;햄버거 조립 로직은 동일&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2117&quot; data-start=&quot;2085&quot; data-ke-size=&quot;size16&quot;&gt;이게 바로 Clean Architecture의 핵심 원리.&lt;/p&gt;
&lt;p data-end=&quot;2158&quot; data-start=&quot;2119&quot; data-ke-size=&quot;size16&quot;&gt;너는 그냥 &amp;ldquo;바뀌는 것들은 자리를 따로 마련해둔다&amp;rdquo;라고만 생각하면 돼.&lt;/p&gt;
&lt;hr data-end=&quot;2163&quot; data-start=&quot;2160&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2189&quot; data-start=&quot;2165&quot;&gt;  그래서 너는 어디서 시작하면 되냐?&lt;/h1&gt;
&lt;h3 data-end=&quot;2228&quot; data-start=&quot;2191&quot; data-ke-size=&quot;size23&quot;&gt;✔ 1) &amp;ldquo;내 프로젝트에서 자주 바뀌는 것 5개&amp;rdquo;만 적어&lt;/h3&gt;
&lt;h3 data-end=&quot;2261&quot; data-start=&quot;2229&quot; data-ke-size=&quot;size23&quot;&gt;✔ 2) 그걸 &amp;ldquo;인터페이스(Port)&amp;rdquo;로 만들자&lt;/h3&gt;
&lt;h3 data-end=&quot;2306&quot; data-start=&quot;2262&quot; data-ke-size=&quot;size23&quot;&gt;✔ 3) 나머지 &amp;ldquo;고정 규칙&amp;rdquo;은 domain/application에 둔다&lt;/h3&gt;
&lt;p data-end=&quot;2310&quot; data-start=&quot;2308&quot; data-ke-size=&quot;size16&quot;&gt;끝.&lt;/p&gt;</description>
      <author>리고니</author>
      <guid isPermaLink="true">https://leegonee.tistory.com/32</guid>
      <comments>https://leegonee.tistory.com/32#entry32comment</comments>
      <pubDate>Wed, 26 Nov 2025 11:45:30 +0900</pubDate>
    </item>
    <item>
      <title>아키텍처 패턴 판단</title>
      <link>https://leegonee.tistory.com/31</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 data-end=&quot;451&quot; data-start=&quot;413&quot;&gt;  &lt;b&gt;디자인 패턴 vs 아키텍처 패턴은 원래 층위가 다르다&lt;/b&gt;&lt;/h1&gt;
&lt;div&gt;
&lt;div&gt;종류예시적용 범위
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;644&quot; data-start=&quot;453&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;644&quot; data-start=&quot;502&quot;&gt;
&lt;tr data-end=&quot;576&quot; data-start=&quot;502&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;516&quot; data-start=&quot;502&quot;&gt;&lt;b&gt;아키텍처 패턴&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;558&quot; data-start=&quot;516&quot; data-col-size=&quot;sm&quot;&gt;Clean, Hexagonal, MSA, Modular Monolith&lt;/td&gt;
&lt;td data-end=&quot;576&quot; data-start=&quot;558&quot; data-col-size=&quot;sm&quot;&gt;&amp;ldquo;애플리케이션 전체&amp;rdquo; 구조&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;644&quot; data-start=&quot;577&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;590&quot; data-start=&quot;577&quot;&gt;&lt;b&gt;디자인 패턴&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;629&quot; data-start=&quot;590&quot; data-col-size=&quot;sm&quot;&gt;Strategy, Adapter, Factory, Observer&lt;/td&gt;
&lt;td data-end=&quot;644&quot; data-start=&quot;629&quot; data-col-size=&quot;sm&quot;&gt;&amp;ldquo;코드 레벨&amp;rdquo; 해결책&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 data-end=&quot;824&quot; data-start=&quot;798&quot;&gt;  &lt;b&gt;아키텍처 패턴 선택 4단계 질문&lt;/b&gt;&lt;/h1&gt;
&lt;hr data-end=&quot;829&quot; data-start=&quot;826&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;862&quot; data-start=&quot;831&quot; data-ke-size=&quot;size26&quot;&gt;⭐ 1) 프로젝트가 얼마나 커지고 복잡해지는가?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;895&quot; data-start=&quot;863&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;872&quot; data-start=&quot;863&quot;&gt;팀원 많다&lt;/li&gt;
&lt;li data-end=&quot;882&quot; data-start=&quot;873&quot;&gt;기능 많다&lt;/li&gt;
&lt;li data-end=&quot;895&quot; data-start=&quot;883&quot;&gt;도메인 복잡하다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;973&quot; data-start=&quot;897&quot; data-ke-size=&quot;size16&quot;&gt;YES &amp;rarr; &lt;b&gt;Clean Architecture, Hexagonal, DDD&lt;/b&gt;&lt;br /&gt;NO &amp;rarr; 간단한 MVC / Lightweight 구조&lt;/p&gt;
&lt;hr data-end=&quot;978&quot; data-start=&quot;975&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1026&quot; data-start=&quot;980&quot; data-ke-size=&quot;size26&quot;&gt;⭐ 2) 외부 의존성이 자주 바뀌는가? (API, DB, 모델, SDK&amp;hellip;)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1086&quot; data-start=&quot;1027&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1037&quot; data-start=&quot;1027&quot;&gt;GPT 바뀜&lt;/li&gt;
&lt;li data-end=&quot;1053&quot; data-start=&quot;1038&quot;&gt;MCP Tool 바뀜&lt;/li&gt;
&lt;li data-end=&quot;1069&quot; data-start=&quot;1054&quot;&gt;DB 교체될 수 있음&lt;/li&gt;
&lt;li data-end=&quot;1086&quot; data-start=&quot;1070&quot;&gt;저장소/네트워크 다양함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1175&quot; data-start=&quot;1088&quot; data-ke-size=&quot;size16&quot;&gt;YES &amp;rarr; &lt;b&gt;Hexagonal Architecture(Ports &amp;amp; Adapters)&lt;/b&gt;&lt;br /&gt;YES &amp;rarr; Clean Architecture (역방향 의존성)&lt;/p&gt;
&lt;hr data-end=&quot;1180&quot; data-start=&quot;1177&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1208&quot; data-start=&quot;1182&quot; data-ke-size=&quot;size26&quot;&gt;⭐ 3) 확장성과 유지보수가 중요한가?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1253&quot; data-start=&quot;1209&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1222&quot; data-start=&quot;1209&quot;&gt;장기 운영 서비스&lt;/li&gt;
&lt;li data-end=&quot;1236&quot; data-start=&quot;1223&quot;&gt;기능이 지속 증가&lt;/li&gt;
&lt;li data-end=&quot;1253&quot; data-start=&quot;1237&quot;&gt;팀 별 책임 분리 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1289&quot; data-start=&quot;1255&quot; data-ke-size=&quot;size16&quot;&gt;YES &amp;rarr; &lt;b&gt;Clean / Modular Monolith&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;1294&quot; data-start=&quot;1291&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1321&quot; data-start=&quot;1296&quot; data-ke-size=&quot;size26&quot;&gt;⭐ 4) 서비스가 분산되어야 하는가?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1366&quot; data-start=&quot;1322&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1337&quot; data-start=&quot;1322&quot;&gt;각 기능을 독립 배포&lt;/li&gt;
&lt;li data-end=&quot;1352&quot; data-start=&quot;1338&quot;&gt;트래픽 편차가 크다&lt;/li&gt;
&lt;li data-end=&quot;1366&quot; data-start=&quot;1353&quot;&gt;장애 격리가 중요&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1408&quot; data-start=&quot;1368&quot; data-ke-size=&quot;size16&quot;&gt;YES &amp;rarr; &lt;b&gt;MSA&lt;/b&gt;&lt;br /&gt;NO &amp;rarr; Modular Monolith 유지&lt;/p&gt;
&lt;hr data-end=&quot;1413&quot; data-start=&quot;1410&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1436&quot; data-start=&quot;1415&quot;&gt;  아키텍처 패턴 선택 기준 요약&lt;/h1&gt;
&lt;div&gt;
&lt;div&gt;필요 조건추천 아키텍처
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1701&quot; data-start=&quot;1438&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1701&quot; data-start=&quot;1487&quot;&gt;
&lt;tr data-end=&quot;1531&quot; data-start=&quot;1487&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1506&quot; data-start=&quot;1487&quot;&gt;내부/외부 의존성 변화가 많음&lt;/td&gt;
&lt;td data-end=&quot;1531&quot; data-start=&quot;1506&quot; data-col-size=&quot;sm&quot;&gt;&lt;b&gt;Hexagonal / Clean&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1584&quot; data-start=&quot;1532&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1558&quot; data-start=&quot;1532&quot;&gt;코드 유지보수 + 명확한 책임 분리가 중요&lt;/td&gt;
&lt;td data-end=&quot;1584&quot; data-start=&quot;1558&quot; data-col-size=&quot;sm&quot;&gt;&lt;b&gt;Clean Architecture&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1622&quot; data-start=&quot;1585&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1598&quot; data-start=&quot;1585&quot;&gt;점진적 확장이 중요&lt;/td&gt;
&lt;td data-end=&quot;1622&quot; data-start=&quot;1598&quot; data-col-size=&quot;sm&quot;&gt;&lt;b&gt;Modular Monolith&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1654&quot; data-start=&quot;1623&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1643&quot; data-start=&quot;1623&quot;&gt;엄청 큰 서비스, 수십 팀 협업&lt;/td&gt;
&lt;td data-end=&quot;1654&quot; data-start=&quot;1643&quot; data-col-size=&quot;sm&quot;&gt;&lt;b&gt;MSA&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1701&quot; data-start=&quot;1655&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1669&quot; data-start=&quot;1655&quot;&gt;스트리밍/이벤트 중심&lt;/td&gt;
&lt;td data-end=&quot;1701&quot; data-start=&quot;1669&quot; data-col-size=&quot;sm&quot;&gt;&lt;b&gt;Event-driven + Hexagonal&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <author>리고니</author>
      <guid isPermaLink="true">https://leegonee.tistory.com/31</guid>
      <comments>https://leegonee.tistory.com/31#entry31comment</comments>
      <pubDate>Wed, 26 Nov 2025 11:44:02 +0900</pubDate>
    </item>
    <item>
      <title>디자인 패턴 판단</title>
      <link>https://leegonee.tistory.com/30</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;디자인 패턴 판단 흐름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제 &amp;rarr; 패턴 &amp;rarr; 이유 &amp;rarr; 적용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 data-end=&quot;317&quot; data-start=&quot;282&quot;&gt;  &lt;b&gt;1단계: 프로젝트가 어떤 성질인지 먼저 파악하기&lt;/b&gt;&lt;/h1&gt;
&lt;p data-end=&quot;341&quot; data-start=&quot;318&quot; data-ke-size=&quot;size16&quot;&gt;패턴을 결정하는 가장 중요한 기준 4가지.&lt;/p&gt;
&lt;h2 data-end=&quot;359&quot; data-start=&quot;343&quot; data-ke-size=&quot;size26&quot;&gt;✔ A. 변화가 많은가?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;423&quot; data-start=&quot;360&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;373&quot; data-start=&quot;360&quot;&gt;API가 자주 바뀜?&lt;/li&gt;
&lt;li data-end=&quot;408&quot; data-start=&quot;374&quot;&gt;모델 공급자(GPT, Anthropic 등) 계속 교체됨?&lt;/li&gt;
&lt;li data-end=&quot;423&quot; data-start=&quot;409&quot;&gt;UI/플랫폼 여러 개?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;482&quot; data-start=&quot;425&quot; data-ke-size=&quot;size16&quot;&gt;▶ &lt;b&gt;전략 패턴, 어댑터 패턴, 퍼사드, 팩토리 패턴&lt;/b&gt;이 강함&lt;br /&gt;(변화의 파도를 흡수하는 패턴들)&lt;/p&gt;
&lt;hr data-end=&quot;487&quot; data-start=&quot;484&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;513&quot; data-start=&quot;489&quot; data-ke-size=&quot;size26&quot;&gt;✔ B. 복잡한 로직/도메인이 많은가?&lt;/h2&gt;
&lt;p data-end=&quot;520&quot; data-start=&quot;514&quot; data-ke-size=&quot;size16&quot;&gt;프로젝트가:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;556&quot; data-start=&quot;521&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;529&quot; data-start=&quot;521&quot;&gt;복잡한 규칙&lt;/li&gt;
&lt;li data-end=&quot;543&quot; data-start=&quot;530&quot;&gt;여러 엔터티 상호작용&lt;/li&gt;
&lt;li data-end=&quot;556&quot; data-start=&quot;544&quot;&gt;추론/검증/상태관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;566&quot; data-start=&quot;558&quot; data-ke-size=&quot;size16&quot;&gt;같이 복잡하면&amp;hellip;&lt;/p&gt;
&lt;p data-end=&quot;627&quot; data-start=&quot;568&quot; data-ke-size=&quot;size16&quot;&gt;▶ &lt;b&gt;DDD, 상태 패턴, 커맨드 패턴, 체인 오브 리스판서빌리티&lt;/b&gt;&lt;br /&gt;도메인 복잡성을 나누는 패턴들.&lt;/p&gt;
&lt;hr data-end=&quot;632&quot; data-start=&quot;629&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;662&quot; data-start=&quot;634&quot; data-ke-size=&quot;size26&quot;&gt;✔ C. 성능, 확장성, 분산 처리 중요한가?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;693&quot; data-start=&quot;663&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;672&quot; data-start=&quot;663&quot;&gt;모델 스트리밍&lt;/li&gt;
&lt;li data-end=&quot;685&quot; data-start=&quot;673&quot;&gt;이벤트 기반 시스템&lt;/li&gt;
&lt;li data-end=&quot;693&quot; data-start=&quot;686&quot;&gt;고속 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;754&quot; data-start=&quot;695&quot; data-ke-size=&quot;size16&quot;&gt;▶ &lt;b&gt;옵저버, 이벤트 버스 패턴, 파이프라인 패턴, 싱글톤(캐시)&lt;/b&gt;&lt;br /&gt;성능&amp;middot;대량 처리를 돕는 패턴들.&lt;/p&gt;
&lt;hr data-end=&quot;759&quot; data-start=&quot;756&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;786&quot; data-start=&quot;761&quot; data-ke-size=&quot;size26&quot;&gt;✔ D. 구성요소를 갈아끼우는 구조인가?&lt;/h2&gt;
&lt;p data-end=&quot;791&quot; data-start=&quot;787&quot; data-ke-size=&quot;size16&quot;&gt;너처럼:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;836&quot; data-start=&quot;792&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;806&quot; data-start=&quot;792&quot;&gt;모델 제공자 바뀌고&lt;/li&gt;
&lt;li data-end=&quot;822&quot; data-start=&quot;807&quot;&gt;MCP 도구 연결되고&lt;/li&gt;
&lt;li data-end=&quot;836&quot; data-start=&quot;823&quot;&gt;GPU 노드 선택되고&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;844&quot; data-start=&quot;838&quot; data-ke-size=&quot;size16&quot;&gt;이런 경우&amp;hellip;&lt;/p&gt;
&lt;p data-end=&quot;904&quot; data-start=&quot;846&quot; data-ke-size=&quot;size16&quot;&gt;▶ &lt;b&gt;어댑터, 전략, 포트/어댑터(헥사고날), DI/IoC&lt;/b&gt;&lt;br /&gt;다른 구현체를 쉽게 갈아끼우게 해줌.&lt;/p&gt;
&lt;hr data-end=&quot;909&quot; data-start=&quot;906&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;939&quot; data-start=&quot;911&quot;&gt;  요약하면 패턴을 선택하는 기준은 딱 4가지&lt;/h1&gt;
&lt;div&gt;
&lt;div&gt;항목내용대표 패턴
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1144&quot; data-start=&quot;941&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1144&quot; data-start=&quot;990&quot;&gt;
&lt;tr data-end=&quot;1036&quot; data-start=&quot;990&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;995&quot; data-start=&quot;990&quot;&gt;변화&lt;/td&gt;
&lt;td data-end=&quot;1020&quot; data-start=&quot;995&quot; data-col-size=&quot;sm&quot;&gt;외부 API, 정책, 구현체가 자주 바뀜&lt;/td&gt;
&lt;td data-end=&quot;1036&quot; data-start=&quot;1020&quot; data-col-size=&quot;sm&quot;&gt;전략, 어댑터, 팩토리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1072&quot; data-start=&quot;1037&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1043&quot; data-start=&quot;1037&quot;&gt;복잡성&lt;/td&gt;
&lt;td data-end=&quot;1056&quot; data-start=&quot;1043&quot; data-col-size=&quot;sm&quot;&gt;도메인/규칙이 많음&lt;/td&gt;
&lt;td data-end=&quot;1072&quot; data-start=&quot;1056&quot; data-col-size=&quot;sm&quot;&gt;DDD, 상태, 커맨드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1107&quot; data-start=&quot;1073&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1078&quot; data-start=&quot;1073&quot;&gt;성능&lt;/td&gt;
&lt;td data-end=&quot;1092&quot; data-start=&quot;1078&quot; data-col-size=&quot;sm&quot;&gt;대량 이벤트&amp;middot;스트리밍&lt;/td&gt;
&lt;td data-end=&quot;1107&quot; data-start=&quot;1092&quot; data-col-size=&quot;sm&quot;&gt;옵저버, 이벤트 버스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1144&quot; data-start=&quot;1108&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1114&quot; data-start=&quot;1108&quot;&gt;확장성&lt;/td&gt;
&lt;td data-end=&quot;1125&quot; data-start=&quot;1114&quot; data-col-size=&quot;sm&quot;&gt;모듈 교체 필요&lt;/td&gt;
&lt;td data-end=&quot;1144&quot; data-start=&quot;1125&quot; data-col-size=&quot;sm&quot;&gt;헥사고날, DI, 인터페이스&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1149&quot; data-start=&quot;1146&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1186&quot; data-start=&quot;1151&quot;&gt;  &lt;b&gt;2단계: 프로젝트에서 문제가 되는 지점을 찾아라&lt;/b&gt;&lt;/h1&gt;
&lt;p data-end=&quot;1234&quot; data-start=&quot;1187&quot; data-ke-size=&quot;size16&quot;&gt;디자인 패턴은 문제를 해결하기 위한 도구이기 때문에&lt;br /&gt;항상 문제부터 출발해야 한다.&lt;/p&gt;
&lt;p data-end=&quot;1242&quot; data-start=&quot;1236&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;- 모델 제공자(API)가 계속 추가/삭제되고 &lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;- 클라이언트/툴 종류가 많고 &lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;- 스트리밍 처리 복잡하고 &lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;- 상태 관리 필요&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1340&quot; data-start=&quot;1328&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 이 문제를 보면&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1433&quot; data-start=&quot;1341&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1363&quot; data-start=&quot;1341&quot;&gt;외부 의존성 변화 &amp;rarr; 전략/어댑터&lt;/li&gt;
&lt;li data-end=&quot;1388&quot; data-start=&quot;1364&quot;&gt;스트리밍 이벤트 &amp;rarr; 옵저버/이벤트버스&lt;/li&gt;
&lt;li data-end=&quot;1412&quot; data-start=&quot;1389&quot;&gt;모델/툴 교체 구조 &amp;rarr; 포트/어댑터&lt;/li&gt;
&lt;li data-end=&quot;1433&quot; data-start=&quot;1413&quot;&gt;로직 복잡 &amp;rarr; DDD-lite&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1445&quot; data-start=&quot;1435&quot; data-ke-size=&quot;size16&quot;&gt;자연스럽게 매핑됨.&lt;/p&gt;
&lt;hr data-end=&quot;1450&quot; data-start=&quot;1447&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1495&quot; data-start=&quot;1452&quot;&gt;  &lt;b&gt;3단계: 디자인 패턴은 32개 &amp;rarr; 실제로 자주 쓰는 건 8개만&lt;/b&gt;&lt;/h1&gt;
&lt;p data-end=&quot;1523&quot; data-start=&quot;1496&quot; data-ke-size=&quot;size16&quot;&gt;현업에서 정말 '계속 쓰는' 패턴은 아래 8개야.&lt;/p&gt;
&lt;h2 data-end=&quot;1551&quot; data-start=&quot;1525&quot; data-ke-size=&quot;size26&quot;&gt;★ 핵심 GoF 패턴 (정말 자주 사용됨)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1709&quot; data-start=&quot;1552&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1571&quot; data-start=&quot;1552&quot;&gt;&lt;b&gt;Strategy (전략)&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1591&quot; data-start=&quot;1572&quot;&gt;&lt;b&gt;Adapter (어댑터)&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1624&quot; data-start=&quot;1592&quot;&gt;&lt;b&gt;Factory / Abstract Factory&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1645&quot; data-start=&quot;1625&quot;&gt;&lt;b&gt;Observer (옵저버)&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1661&quot; data-start=&quot;1646&quot;&gt;&lt;b&gt;Decorator&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1674&quot; data-start=&quot;1662&quot;&gt;&lt;b&gt;Facade&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1688&quot; data-start=&quot;1675&quot;&gt;&lt;b&gt;Command&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1709&quot; data-start=&quot;1689&quot;&gt;&lt;b&gt;Singleton(캐시용)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1733&quot; data-start=&quot;1711&quot; data-ke-size=&quot;size16&quot;&gt;솔직히 이 8개만 마스터하면 충분함.&lt;/p&gt;
&lt;p data-end=&quot;1754&quot; data-start=&quot;1735&quot; data-ke-size=&quot;size16&quot;&gt;나머지는 특별한 상황에서만 필요해.&lt;/p&gt;
&lt;hr data-end=&quot;1759&quot; data-start=&quot;1756&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1797&quot; data-start=&quot;1761&quot;&gt;  &lt;b&gt;4단계: 패턴 선택 체크리스트 (바로 적용 가능)&lt;/b&gt;&lt;/h1&gt;
&lt;p data-end=&quot;1827&quot; data-start=&quot;1799&quot; data-ke-size=&quot;size16&quot;&gt;아래 질문 중 YES가 많을수록 그 패턴은 적합함.&lt;/p&gt;
&lt;hr data-end=&quot;1832&quot; data-start=&quot;1829&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1859&quot; data-start=&quot;1834&quot; data-ke-size=&quot;size26&quot;&gt;✔ Strategy 패턴이 필요한 경우?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1937&quot; data-start=&quot;1860&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1886&quot; data-start=&quot;1860&quot;&gt;알고리즘(또는 선택 로직)을 교체해야 한다.&lt;/li&gt;
&lt;li data-end=&quot;1922&quot; data-start=&quot;1887&quot;&gt;모델 공급자(GPT, Anthropic 등)가 자주 바뀐다.&lt;/li&gt;
&lt;li data-end=&quot;1937&quot; data-start=&quot;1923&quot;&gt;정책이 자주 수정된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1942&quot; data-start=&quot;1939&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1968&quot; data-start=&quot;1944&quot; data-ke-size=&quot;size26&quot;&gt;✔ Adapter 패턴이 필요한 경우?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2027&quot; data-start=&quot;1969&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1998&quot; data-start=&quot;1969&quot;&gt;기존 코드에 새로운 API/SDK 연결해야 한다.&lt;/li&gt;
&lt;li data-end=&quot;2027&quot; data-start=&quot;1999&quot;&gt;동일한 인터페이스로 여러 구현체를 감싸야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2032&quot; data-start=&quot;2029&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2058&quot; data-start=&quot;2034&quot; data-ke-size=&quot;size26&quot;&gt;✔ Factory 패턴이 필요한 경우?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2119&quot; data-start=&quot;2059&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2089&quot; data-start=&quot;2059&quot;&gt;객체 생성 로직이 복잡하거나 환경에 따라 달라진다.&lt;/li&gt;
&lt;li data-end=&quot;2119&quot; data-start=&quot;2090&quot;&gt;여러 종류의 모델/도구를 동적으로 생성해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2124&quot; data-start=&quot;2121&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2162&quot; data-start=&quot;2126&quot; data-ke-size=&quot;size26&quot;&gt;✔ Observer / EventBus 패턴이 필요한 경우?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2214&quot; data-start=&quot;2163&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2196&quot; data-start=&quot;2163&quot;&gt;이벤트 기반 처리 (Tool &amp;rarr; Hub &amp;rarr; Client)&lt;/li&gt;
&lt;li data-end=&quot;2203&quot; data-start=&quot;2197&quot;&gt;스트리밍&lt;/li&gt;
&lt;li data-end=&quot;2214&quot; data-start=&quot;2204&quot;&gt;알림/상태 변경&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2219&quot; data-start=&quot;2216&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2245&quot; data-start=&quot;2221&quot; data-ke-size=&quot;size26&quot;&gt;✔ Command 패턴이 필요한 경우?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2316&quot; data-start=&quot;2246&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2269&quot; data-start=&quot;2246&quot;&gt;&quot;명령&quot; 단위로 작업을 관리하고 싶다.&lt;/li&gt;
&lt;li data-end=&quot;2316&quot; data-start=&quot;2270&quot;&gt;Tool Execution, Model Call 등을 같은 형태로 다루고 싶다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2321&quot; data-start=&quot;2318&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2349&quot; data-start=&quot;2323&quot; data-ke-size=&quot;size26&quot;&gt;✔ Decorator 패턴이 필요한 경우?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2394&quot; data-start=&quot;2350&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2394&quot; data-start=&quot;2350&quot;&gt;기능을 동적으로 증/감하고 싶다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2394&quot; data-start=&quot;2373&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2394&quot; data-start=&quot;2373&quot;&gt;예: 로깅, 인증, 모니터링, 캐싱&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2399&quot; data-start=&quot;2396&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2424&quot; data-start=&quot;2401&quot; data-ke-size=&quot;size26&quot;&gt;✔ Facade 패턴이 필요한 경우?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2476&quot; data-start=&quot;2425&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2450&quot; data-start=&quot;2425&quot;&gt;복잡한 것을 단순한 API로 감싸고 싶다.&lt;/li&gt;
&lt;li data-end=&quot;2476&quot; data-start=&quot;2451&quot;&gt;외부에 &amp;ldquo;간단한 인터페이스&amp;rdquo;만 주고 싶다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2481&quot; data-start=&quot;2478&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2512&quot; data-start=&quot;2483&quot;&gt;  &lt;b&gt;실제로 패턴을 고르는 사고 흐름 예시&lt;/b&gt;&lt;/h1&gt;
&lt;h3 data-end=&quot;2541&quot; data-start=&quot;2514&quot; data-ke-size=&quot;size23&quot;&gt;  당신의 MCP Hub에 적용하면?&lt;/h3&gt;
&lt;p data-end=&quot;2557&quot; data-start=&quot;2542&quot; data-ke-size=&quot;size16&quot;&gt;문제 &amp;rarr; 패턴을 매핑해보면:&lt;/p&gt;
&lt;h3 data-end=&quot;2601&quot; data-start=&quot;2559&quot; data-ke-size=&quot;size23&quot;&gt;● 모델/API 여러 개 &amp;rarr; &lt;b&gt;Strategy + Adapter&lt;/b&gt;&lt;/h3&gt;
&lt;h3 data-end=&quot;2646&quot; data-start=&quot;2602&quot; data-ke-size=&quot;size23&quot;&gt;● MCP Tool 여러 종류 &amp;rarr; &lt;b&gt;Adapter + Factory&lt;/b&gt;&lt;/h3&gt;
&lt;h3 data-end=&quot;2686&quot; data-start=&quot;2647&quot; data-ke-size=&quot;size23&quot;&gt;● 스트리밍 이벤트 &amp;rarr; &lt;b&gt;Observer(EventBus)&lt;/b&gt;&lt;/h3&gt;
&lt;h3 data-end=&quot;2745&quot; data-start=&quot;2687&quot; data-ke-size=&quot;size23&quot;&gt;● Tool 호출/Model 호출 모두 command 단위 &amp;rarr; &lt;b&gt;Command Pattern&lt;/b&gt;&lt;/h3&gt;
&lt;h3 data-end=&quot;2773&quot; data-start=&quot;2746&quot; data-ke-size=&quot;size23&quot;&gt;● 복잡도 증가 &amp;rarr; &lt;b&gt;DDD-lite&lt;/b&gt;&lt;/h3&gt;
&lt;h3 data-end=&quot;2822&quot; data-start=&quot;2774&quot; data-ke-size=&quot;size23&quot;&gt;● 외부와 내부 분리 &amp;rarr; &lt;b&gt;Hexagonal (Ports/Adapters)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2843&quot; data-start=&quot;2824&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 자연스럽게 답이 나오게 됨.&lt;/p&gt;
&lt;hr data-end=&quot;2848&quot; data-start=&quot;2845&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2860&quot; data-start=&quot;2850&quot;&gt;  결론:&lt;/h1&gt;
&lt;p data-end=&quot;2921&quot; data-start=&quot;2861&quot; data-ke-size=&quot;size16&quot;&gt;디자인 패턴 선택은&lt;br /&gt;&lt;b&gt;프로젝트 성질 &amp;rarr; 문제 포인트 &amp;rarr; 패턴의 목적&lt;/b&gt;&lt;br /&gt;이 3개만 연결하면 끝&lt;/p&gt;</description>
      <author>리고니</author>
      <guid isPermaLink="true">https://leegonee.tistory.com/30</guid>
      <comments>https://leegonee.tistory.com/30#entry30comment</comments>
      <pubDate>Wed, 26 Nov 2025 11:28:38 +0900</pubDate>
    </item>
    <item>
      <title>요즘 가장 대세인 소프트웨어 아키텍처 TOP 7</title>
      <link>https://leegonee.tistory.com/29</link>
      <description>&lt;h2 data-end=&quot;193&quot; data-start=&quot;152&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1️⃣ Clean Architecture (클린 아키텍처)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;222&quot; data-start=&quot;194&quot; data-ke-size=&quot;size16&quot;&gt;가장 많이 언급되고 가장 이상적으로 여겨지는 구조.&lt;/p&gt;
&lt;h3 data-end=&quot;232&quot; data-start=&quot;224&quot; data-ke-size=&quot;size23&quot;&gt;✔ 특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;306&quot; data-start=&quot;233&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;269&quot; data-start=&quot;233&quot;&gt;비즈니스 로직(도메인)이 프레임워크, DB에 의존하지 않음&lt;/li&gt;
&lt;li data-end=&quot;280&quot; data-start=&quot;270&quot;&gt;테스트 용이&lt;/li&gt;
&lt;li data-end=&quot;306&quot; data-start=&quot;281&quot;&gt;서비스 규모가 커질수록 유지보수가 편함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;324&quot; data-start=&quot;308&quot; data-ke-size=&quot;size23&quot;&gt;✔ 어디서 많이 쓰나?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;404&quot; data-start=&quot;325&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;346&quot; data-start=&quot;325&quot;&gt;스타트업 ~ 대기업까지 전 범위&lt;/li&gt;
&lt;li data-end=&quot;404&quot; data-start=&quot;347&quot;&gt;Python FastAPI, Node.js NestJS, Java Spring 등 대부분 적용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;409&quot; data-start=&quot;406&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;470&quot; data-start=&quot;411&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2️⃣ Hexagonal Architecture (헥사고날 / Ports &amp;amp; Adapters)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;495&quot; data-start=&quot;471&quot; data-ke-size=&quot;size16&quot;&gt;클린 아키텍처와 비슷하지만 조금 더 실용적.&lt;/p&gt;
&lt;h3 data-end=&quot;505&quot; data-start=&quot;497&quot; data-ke-size=&quot;size23&quot;&gt;✔ 특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;575&quot; data-start=&quot;506&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;546&quot; data-start=&quot;506&quot;&gt;내부 로직 &amp;mdash; 외부 I/O(DB, 메시지 큐, API) 완전 분리&lt;/li&gt;
&lt;li data-end=&quot;575&quot; data-start=&quot;547&quot;&gt;외부 시스템이 바뀌어도 핵심 로직 수정 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;590&quot; data-start=&quot;577&quot; data-ke-size=&quot;size23&quot;&gt;✔ 어디서 쓰나?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;637&quot; data-start=&quot;591&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;607&quot; data-start=&quot;591&quot;&gt;쿠버네티스 기반 MSA&lt;/li&gt;
&lt;li data-end=&quot;637&quot; data-start=&quot;608&quot;&gt;금융권, 물류, 물류 자동화 시스템에서 많이 채택&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;642&quot; data-start=&quot;639&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;704&quot; data-start=&quot;644&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3️⃣ Domain-Driven Design (DDD) + Layered Architecture&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;728&quot; data-start=&quot;705&quot; data-ke-size=&quot;size16&quot;&gt;대기업과 MSA 환경에서 가장 인기 있음.&lt;/p&gt;
&lt;h3 data-end=&quot;738&quot; data-start=&quot;730&quot; data-ke-size=&quot;size23&quot;&gt;✔ 특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;824&quot; data-start=&quot;739&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;770&quot; data-start=&quot;739&quot;&gt;복잡한 도메인을 &lt;b&gt;도메인 모델 중심으로 설계&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;792&quot; data-start=&quot;771&quot;&gt;비즈니스 로직을 중심으로 모듈링&lt;/li&gt;
&lt;li data-end=&quot;824&quot; data-start=&quot;793&quot;&gt;전략 패턴, 어그리게이트, 이벤트 기반 설계와 결합됨&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;836&quot; data-start=&quot;826&quot; data-ke-size=&quot;size23&quot;&gt;✔ 어디서?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;884&quot; data-start=&quot;837&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;857&quot; data-start=&quot;837&quot;&gt;마이크로서비스, 플랫폼 서비스&lt;/li&gt;
&lt;li data-end=&quot;884&quot; data-start=&quot;858&quot;&gt;Java/Spring + DDD가 가장 흔함&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;889&quot; data-start=&quot;886&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;934&quot; data-start=&quot;891&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4️⃣ Microservices Architecture (MSA)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;950&quot; data-start=&quot;935&quot; data-ke-size=&quot;size16&quot;&gt;모놀리스를 쪼개는 아키텍처.&lt;/p&gt;
&lt;h3 data-end=&quot;970&quot; data-start=&quot;952&quot; data-ke-size=&quot;size23&quot;&gt;✔ 2025년 기준 트렌드&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1048&quot; data-start=&quot;971&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;987&quot; data-start=&quot;971&quot;&gt;무분별한 MSA는 퇴조&lt;/li&gt;
&lt;li data-end=&quot;1031&quot; data-start=&quot;988&quot;&gt;&lt;b&gt;핵심 서비스만 MSA, 나머지는 모놀리스 유지(모듈러 모놀리스)&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1048&quot; data-start=&quot;1032&quot;&gt;즉, 선택적 MSA가 대세&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1053&quot; data-start=&quot;1050&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1108&quot; data-start=&quot;1055&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5️⃣ Modular Monolith (모듈러 모놀리스) &amp;mdash; 요즘 가장 현실적 대세&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1132&quot; data-start=&quot;1109&quot; data-ke-size=&quot;size16&quot;&gt;MSA보다 훨씬 현실적이고 유지보수 쉬움.&lt;/p&gt;
&lt;h3 data-end=&quot;1142&quot; data-start=&quot;1134&quot; data-ke-size=&quot;size23&quot;&gt;✔ 장점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1210&quot; data-start=&quot;1143&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1168&quot; data-start=&quot;1143&quot;&gt;모놀리스처럼 쉬움 + MSA처럼 독립성&lt;/li&gt;
&lt;li data-end=&quot;1184&quot; data-start=&quot;1169&quot;&gt;배포/운영 비용 저렴&lt;/li&gt;
&lt;li data-end=&quot;1210&quot; data-start=&quot;1185&quot;&gt;스타트업, 중견 회사에서 &lt;b&gt;리얼 대세&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1215&quot; data-start=&quot;1212&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1259&quot; data-start=&quot;1217&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6️⃣ Event-Driven Architecture (EDA)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1298&quot; data-start=&quot;1260&quot; data-ke-size=&quot;size16&quot;&gt;Kafka, NATS, RabbitMQ 등 기반의 이벤트 중심 구조.&lt;/p&gt;
&lt;h3 data-end=&quot;1311&quot; data-start=&quot;1300&quot; data-ke-size=&quot;size23&quot;&gt;✔ 대세 이유&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1365&quot; data-start=&quot;1312&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1326&quot; data-start=&quot;1312&quot;&gt;실시간 데이터 처리&lt;/li&gt;
&lt;li data-end=&quot;1343&quot; data-start=&quot;1327&quot;&gt;서비스 간 결합도 낮음&lt;/li&gt;
&lt;li data-end=&quot;1365&quot; data-start=&quot;1344&quot;&gt;AI 파이프라인, 분석 시스템 필수&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1370&quot; data-start=&quot;1367&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1405&quot; data-start=&quot;1372&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;7️⃣ Serverless + FaaS 아키텍처&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1437&quot; data-start=&quot;1406&quot; data-ke-size=&quot;size16&quot;&gt;AWS Lambda, Cloud Functions 중심.&lt;/p&gt;
&lt;h3 data-end=&quot;1451&quot; data-start=&quot;1439&quot; data-ke-size=&quot;size23&quot;&gt;✔ 최근 트렌드&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1541&quot; data-start=&quot;1452&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1472&quot; data-start=&quot;1452&quot;&gt;백엔드 전부 서버리스는 힘들다&lt;/li&gt;
&lt;li data-end=&quot;1541&quot; data-start=&quot;1473&quot;&gt;&lt;b&gt;부분적으로 도입&lt;/b&gt;하는 기업이 많음
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1541&quot; data-start=&quot;1501&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1511&quot; data-start=&quot;1501&quot;&gt;이미지 처리&lt;/li&gt;
&lt;li data-end=&quot;1526&quot; data-start=&quot;1514&quot;&gt;파일 파이프라인&lt;/li&gt;
&lt;li data-end=&quot;1541&quot; data-start=&quot;1529&quot;&gt;알림/배치 작업&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>리고니</author>
      <guid isPermaLink="true">https://leegonee.tistory.com/29</guid>
      <comments>https://leegonee.tistory.com/29#entry29comment</comments>
      <pubDate>Wed, 26 Nov 2025 09:32:46 +0900</pubDate>
    </item>
    <item>
      <title>2023-04 1주차, 2주차 AI 로또 번호 예측</title>
      <link>https://leegonee.tistory.com/28</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;2023.04.01 예측 (초기모델)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 예측 : 22 26 31 35 38&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 실제 : 4 24 27 35 37 45 15&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 평가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 정답 35&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 1차이 : 26(27), 38(37)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 2차이 : 22(24)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2023.04.08 예측 (성능 고도화 모델)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 예측 (Train / Val set 다르게 적용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8 14 19 25 31 35 21&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8 15 19 24 30 38 23&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 실제 : 예정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 평가 : 예정&lt;/p&gt;</description>
      <category>기록</category>
      <author>리고니</author>
      <guid isPermaLink="true">https://leegonee.tistory.com/28</guid>
      <comments>https://leegonee.tistory.com/28#entry28comment</comments>
      <pubDate>Thu, 6 Apr 2023 17:36:12 +0900</pubDate>
    </item>
    <item>
      <title>[nifi] nifi SSL인증서 설치 및 portman anonymous authentication has not been configured. 해결</title>
      <link>https://leegonee.tistory.com/22</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;문제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자체 구성한 nifi의 restapi에 curl을 쉽게 날리기 위하여 Postman을 사용하여 진행하고자 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Postman에서 curl을 날렸을 때 nifi api에서&lt;b&gt; certificate exired&lt;/b&gt;가 떠서, SSL인증서를 새롭게 만들어 넣으려 함.&lt;/p&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. certificate nifi에 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nifi home으로 사용할 경로에 nifi-toolkit-[사용할 버전]을 받는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;338&quot; data-origin-height=&quot;28&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biE392/btrJ1X6fnID/k1zkB45zWaLcsifa2sEwY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biE392/btrJ1X6fnID/k1zkB45zWaLcsifa2sEwY0/img.png&quot; data-alt=&quot;nifi toolkit download 받고 압축 푼 후 사진&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biE392/btrJ1X6fnID/k1zkB45zWaLcsifa2sEwY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiE392%2FbtrJ1X6fnID%2Fk1zkB45zWaLcsifa2sEwY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;338&quot; height=&quot;28&quot; data-origin-width=&quot;338&quot; data-origin-height=&quot;28&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;nifi toolkit download 받고 압축 푼 후 사진&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1-1 toolkit download (버전은 자유롭게 바꿔서 받아도 무방)&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;wget https://archive.apache.org/dist/nifi/1.6.12/nifi-toolkit-1.6.12-bin.tar.gz&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1-2 압축 해제&lt;/p&gt;
&lt;pre id=&quot;code_1660817281924&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tar zxvf nifi-toolkit-1.16.2-bin.tar.gz&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1-3 위치 이동&lt;/p&gt;
&lt;pre id=&quot;code_1660817336882&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd $NIFI_HOME/nifi-toolkit-1.16.2/bin&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1-4 toolkit을 사용하여 nifi 인증서를 생성&lt;/p&gt;
&lt;pre id=&quot;code_1660817549543&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;./tls-toolkit.sh standalone -n 'localhost' -C 'CN=cnName, OU=nifi' -O -o $NIFI_HOME/nifi-1.16.2/conf&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1-5 만들어진 conf 폴더 내에 localhost folder가 생성되었을 것&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;23&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dPKUhH/btrJZIPIsYd/3XlB5sZjdzUtKEDmJnmgQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dPKUhH/btrJZIPIsYd/3XlB5sZjdzUtKEDmJnmgQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dPKUhH/btrJZIPIsYd/3XlB5sZjdzUtKEDmJnmgQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdPKUhH%2FbtrJZIPIsYd%2F3XlB5sZjdzUtKEDmJnmgQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;462&quot; height=&quot;23&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;23&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1-6 /nifi-1.16.2/conf에 이미 keystore.jks, truststore.jks, nifi.properties가 있기 때문에 기존에 있던 파일들을 backup한 후에 .jks 파일은 옮기고, nifi.properties는 변경된 부분만 merge한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*nifi.properties에서 아래 부분을 변경하지 않으면 새로운 인증서가 적용되지 않음.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;242&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bY5Pbv/btrJ1JN6ml9/xhPPzYaMvurMrV7rkznu70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bY5Pbv/btrJ1JN6ml9/xhPPzYaMvurMrV7rkznu70/img.png&quot; data-alt=&quot;merge 부분&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bY5Pbv/btrJ1JN6ml9/xhPPzYaMvurMrV7rkznu70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbY5Pbv%2FbtrJ1JN6ml9%2FxhPPzYaMvurMrV7rkznu70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;242&quot; height=&quot;310&quot; data-origin-width=&quot;242&quot; data-origin-height=&quot;310&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;merge 부분&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*nifi.cluster.protocol.is.secure=true도 설정하면 좋음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1-7 추가로 authorizers.xml을 backup 후에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;userGroupProvider : Initial User Identity&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;accessPolicyProvider : Initial Admin Identity에 CN정보와 OU정보를 넣을 것&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1660818407795&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;identifier&amp;gt;file-user-group-provider&amp;lt;/identifier&amp;gt;
...
&amp;lt;property name=&quot;Initial User Identity 1&quot;&amp;gt;CN=cnName, OU=nifi&amp;lt;/property&amp;gt;
...
&amp;lt;identifier&amp;gt;file-access-policy-provider&amp;lt;/identifier&amp;gt;
...
&amp;lt;property name=&quot;Initial Admin Identity&quot;&amp;gt;CN=cnName, OU=nifi&amp;lt;/property&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;1-8 nifi 재기동하면, 정상 적용 확인 가능&lt;/p&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. anonymous authentication has not been configured. 문제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nifi.properties 파일에서 아래 부분 false -&amp;gt; true로 변경&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;28&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LJx4x/btrJYzeqTeT/EWUKsHLS0rd5bORcTeWDq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LJx4x/btrJYzeqTeT/EWUKsHLS0rd5bORcTeWDq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LJx4x/btrJYzeqTeT/EWUKsHLS0rd5bORcTeWDq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLJx4x%2FbtrJYzeqTeT%2FEWUKsHLS0rd5bORcTeWDq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;28&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;28&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. self-signed certificate 때문에 나는 오류&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;415&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r8ZQR/btrJ2pBpf5c/7NgRkStMW9BKWErG7kdukk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r8ZQR/btrJ2pBpf5c/7NgRkStMW9BKWErG7kdukk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r8ZQR/btrJ2pBpf5c/7NgRkStMW9BKWErG7kdukk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr8ZQR%2FbtrJ2pBpf5c%2F7NgRkStMW9BKWErG7kdukk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;415&quot; height=&quot;345&quot; data-origin-width=&quot;415&quot; data-origin-height=&quot;345&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSL certificate verification ON -&amp;gt; OFF로 변경&lt;/p&gt;
&lt;p data-ke-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>nifi</category>
      <category>anonymous</category>
      <category>Authentication</category>
      <category>nifi toolkit</category>
      <category>postman #nifi #anonymous authentication</category>
      <category>restapi</category>
      <category>ssl</category>
      <author>리고니</author>
      <guid isPermaLink="true">https://leegonee.tistory.com/22</guid>
      <comments>https://leegonee.tistory.com/22#entry22comment</comments>
      <pubDate>Thu, 18 Aug 2022 19:38:08 +0900</pubDate>
    </item>
  </channel>
</rss>