<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>허접 웹프로그래머의 자료 모음</title>
    <link>https://koreanred.tistory.com/</link>
    <description>허접한 프로그래머의 허접한 자료를 모아놓은곳이예요. 치명적인 오류는 본인이 알아서 고쳐서 쓰도록 하세요. 저도 다 긁어 모은것이니 책임은 못져요. ㅎㅎ</description>
    <language>ko</language>
    <pubDate>Sat, 8 Aug 2026 06:16:44 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>은둔한량</managingEditor>
    <image>
      <title>허접 웹프로그래머의 자료 모음</title>
      <url>https://t1.daumcdn.net/cfile/tistory/0178D8395121DA7E1F</url>
      <link>https://koreanred.tistory.com</link>
    </image>
    <item>
      <title>AI 크롤러는 당신의 사이트를 정말 읽을 수 있나요?</title>
      <link>https://koreanred.tistory.com/206</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;SSR 없이 렌더링된 페이지, 막혀 있는 &lt;code&gt;GPTBot&lt;/code&gt;, 빠진 JSON-LD. 눈에는 안 보이지만 AI 답변에서 당신을 사라지게 만드는 것들입니다&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;$ segeo scan https://your-site.com

&amp;rarr; fetching raw HTML (no JS execution) ...
✓ SEO   crawl &amp;middot; index &amp;middot; meta &amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot; 82
! GEO   ai-crawler &amp;middot; schema &amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot; 41   # GPTBot disallowed, no JSON-LD
◆ TOTAL weighted score &amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot;&amp;middot; 63

# 77 checks &amp;middot; 8 categories &amp;middot; report saved&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;사람들은 이제 구글에 검색하는 만큼 ChatGPT와 Perplexity에게 묻습니다. 문제는, &lt;b&gt;AI가 답변을 만들 때 참조하는 파이프라인이 우리가 최적화해 온 검색 파이프라인과 다르다&lt;/b&gt;는 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;구글 순위는 잘 나오는데 ChatGPT에 브랜드를 물어보면 전혀 안 나오는 경험, 개발하다 보면 한 번쯤 겪습니다. 버그가 아니라 구조의 문제입니다. 검색엔진 봇과 AI 크롤러는 &lt;b&gt;같은 URL을 열어도 서로 다른 것을 본다&lt;/b&gt;는 전제에서 출발해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;SEGEO_BLOG.png&quot; data-origin-width=&quot;1983&quot; data-origin-height=&quot;793&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WDkeP/dJMcacqqdkI/cWtkJHOlJwKjf4LUNxv0kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WDkeP/dJMcacqqdkI/cWtkJHOlJwKjf4LUNxv0kK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WDkeP/dJMcacqqdkI/cWtkJHOlJwKjf4LUNxv0kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWDkeP%2FdJMcacqqdkI%2FcWtkJHOlJwKjf4LUNxv0kK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1983&quot; height=&quot;793&quot; data-filename=&quot;SEGEO_BLOG.png&quot; data-origin-width=&quot;1983&quot; data-origin-height=&quot;793&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;01. AI 크롤러는 자바스크립트를 실행하지 않는다&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;가장 먼저 걸리는 지점입니다. Googlebot은 렌더링 큐를 거쳐 JS를 실행하지만, 대부분의 &lt;b&gt;AI 크롤러는 원시 HTML만 가져갑니다.&lt;/b&gt; 클라이언트에서 &lt;code&gt;fetch&lt;/code&gt; 후 마운트되는 콘텐츠는 AI 입장에서 존재하지 않는 셈입니다.&lt;/span&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&amp;nbsp;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Googlebot&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;GPTBot &amp;middot; ClaudeBot &amp;middot; PerplexityBot&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;처리 방식&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;크롤 &amp;rarr; 렌더 큐 &amp;rarr; JS 실행 &amp;rarr; 인덱싱&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;원시 HTML만 파싱 (JS 미실행)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;CSR 콘텐츠&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;지연은 있지만 결국 읽힘&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;루트 &lt;code&gt;div&lt;/code&gt;만 보이면 빈 페이지로 처리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;  처방&lt;/b&gt; &amp;mdash; SPA라면 SSR&amp;middot;SSG&amp;middot;프리렌더를 도입하세요. Next.js는 App Router의 서버 컴포넌트, 그 외 프레임워크는 프리렌더링 미들웨어로 최소한 핵심 콘텐츠&amp;middot;메타&amp;middot;JSON-LD를 원시 HTML에 실어 보내야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;02. robots.txt / llms.txt &amp;mdash; 접근을 명시적으로 허용하기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;AI 크롤러 상당수는 &lt;b&gt;차단돼 있으면 그냥 지나갑니다.&lt;/b&gt; 기본값으로 막혀 있거나, 와일드카드 &lt;code&gt;Disallow&lt;/code&gt;에 함께 걸려버린 경우가 흔하죠. 노출을 원한다면 명시적으로 허용해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;# --- AI 크롤러 (허용 시 AI 답변 인용 후보) ---
User-agent: GPTBot          # ChatGPT / OpenAI
User-agent: ClaudeBot       # Claude / Anthropic
User-agent: PerplexityBot   # Perplexity
User-agent: Google-Extended # Gemini 학습&amp;middot;그라운딩 토큰
Allow: /

# --- ChatGPT&amp;middot;Copilot은 Bing 인덱스를 사용 ---
User-agent: Bingbot
Allow: /

# --- 네이버 AI 브리핑 (국내 트래픽의 절반) ---
User-agent: Yeti
Allow: /

Sitemap: https://your-site.com/sitemap.xml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;여기에 더해 &lt;code&gt;/llms.txt&lt;/code&gt;를 두면, AI가 사이트의 핵심 문서를 빠르게 파악하도록 지도를 쥐여줄 수 있습니다. 마크다운 한 장이면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;# Your Company

&amp;gt; 한 줄 소개 &amp;mdash; 무엇을 하는 회사이고 누구를 위한 서비스인지.

## 핵심 문서
- [제품 소개](https://your-site.com/about): 기능 요약
- [자주 묻는 질문](https://your-site.com/faq): 대표 Q&amp;amp;A
- [문의](https://your-site.com/contact): 연락 경로&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;03. 메타 &amp;middot; 스니펫 제어 &amp;mdash; nosnippet 한 줄의 무게&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;구글 AI Overviews는 별도 크롤러가 아니라 &lt;b&gt;일반 Googlebot 색인을 씁니다.&lt;/b&gt; 그래서 스니펫 지시자 하나가 AI 노출 여부를 가릅니다. &lt;code&gt;nosnippet&lt;/code&gt;이 걸려 있으면 순위와 무관하게 AI 개요에서 &lt;b&gt;즉시 제외&lt;/b&gt;됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;!-- 정규 URL 고정: 중복&amp;middot;파라미터 흡수 --&amp;gt;
&amp;lt;link rel=&quot;canonical&quot; href=&quot;https://your-site.com/page&quot; /&amp;gt;

&amp;lt;!-- 스니펫 충분히 허용 (AI 인용 후보로 노출) --&amp;gt;
&amp;lt;meta name=&quot;robots&quot;
      content=&quot;index,follow,max-snippet:-1,max-image-preview:large&quot; /&amp;gt;

&amp;lt;!-- 특정 페이지만 AI/스니펫 제외하고 싶을 때 --&amp;gt;
&amp;lt;meta name=&quot;robots&quot; content=&quot;nosnippet&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;04. 구조화 데이터 &amp;mdash; AI에게 &quot;엔티티&quot;로 인식되기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;AI가 브랜드를 하나의 &lt;b&gt;엔티티(entity)&lt;/b&gt; 로 이해하게 만드는 핵심 신호가 JSON-LD입니다. &lt;code&gt;Organization&lt;/code&gt; + &lt;code&gt;sameAs&lt;/code&gt;로 정체성을 묶고, 콘텐츠는 &lt;code&gt;Article&lt;/code&gt;&amp;middot;&lt;code&gt;FAQPage&lt;/code&gt;로, 지역 비즈니스라면 &lt;code&gt;LocalBusiness&lt;/code&gt;로 명세하세요.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;smalltalk&quot;&gt;&lt;code&gt;&amp;lt;script type=&quot;application/ld+json&quot;&amp;gt;
{
  &quot;@context&quot;: &quot;https://schema.org&quot;,
  &quot;@type&quot;: &quot;Organization&quot;,
  &quot;name&quot;: &quot;Your Company&quot;,
  &quot;url&quot;: &quot;https://your-site.com&quot;,
  &quot;logo&quot;: &quot;https://your-site.com/logo.png&quot;,
  &quot;sameAs&quot;: [
    &quot;https://www.instagram.com/your&quot;,
    &quot;https://blog.naver.com/your&quot;,
    &quot;https://www.linkedin.com/company/your&quot;
  ]
}
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;05. 인용 가능성 &amp;mdash; AI가 복붙할 수 있는 문장 구조&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;기술 설정을 다 맞춰도, 문장 구조가 인용에 부적합하면 소용없습니다. AI는 &lt;b&gt;두괄식 답변, 정의형 문장, 명확한 시맨틱 마크업&lt;/b&gt;을 선호합니다. 질문에 대한 결론을 첫 문장에 두고, &lt;code&gt;&amp;lt;h2&amp;gt;&lt;/code&gt;에 실제 질문을, 그 아래 답을 배치하는 구조가 인용률을 높입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;h2&amp;gt;GEO란 무엇인가요?&amp;lt;/h2&amp;gt;
&amp;lt;p&amp;gt;GEO는 생성형 AI 검색이 답변을 만들 때 내 사이트를
   출처로 인용하도록 콘텐츠&amp;middot;구조를 최적화하는 작업이다.&amp;lt;/p&amp;gt;
&amp;lt;!-- &amp;uarr; 정의를 첫 문장에. AI가 그대로 인용 가능 --&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;06. URL 하나로 8개 카테고리 77개 항목 자동 점검&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;위 항목들을 페이지마다 손으로 확인하기는 번거롭습니다. &lt;b&gt;세지오(SEGEO)&lt;/b&gt; 는 주소만 넣으면 검색엔진 기준과 AI 기준을 동시에 훑고, 무엇이 막혀 있는지 리포트로 돌려줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&amp;nbsp;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;카테고리&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;점검 내용&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;A&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;AI 크롤러 접근성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;GPTBot&amp;middot;ClaudeBot&amp;middot;PerplexityBot&amp;middot;Google-Extended&amp;middot;Yeti의 robots.txt&amp;middot;llms.txt 정책&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;B&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;크롤링 &amp;middot; 인덱싱&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;상태 코드, 리다이렉트 체인, canonical, sitemap, 도메인 정규화&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;C&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;메타 &amp;middot; 스니펫 제어&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;nosnippet&amp;middot;max-snippet 등 AI 개요 노출을 좌우하는 메타 지시자&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;D&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;구조화 데이터&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Organization&amp;middot;sameAs&amp;middot;Article&amp;middot;FAQ JSON-LD 유효성과 엔티티 신호&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;E&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;콘텐츠 인용 가능성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;두괄식&amp;middot;정의형 문장, 통계 밀도, 신선도(freshness)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;F&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;E-E-A-T &amp;middot; 신뢰&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;저자, 발행일, 출처 링크, 소개&amp;middot;연락처 등 신뢰 근거&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;H&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;성능 &amp;middot; 렌더링&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;JS 없이 원시 HTML만으로 콘텐츠가 읽히는지 검증&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;I&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;보안 &amp;middot; 정책&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;HTTPS, 혼합 콘텐츠, 보안 헤더, HTTP/2&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 style=&quot;font-family: 'Noto Serif KR';&quot;&gt;결과는 뭉뚱그린 하나가 아니라 &lt;b&gt;세 축으로 분해&lt;/b&gt;됩니다. 77개 항목마다 영향 축이 태그돼 있어, 지금 SEO가 약한지 GEO가 약한지 바로 구분됩니다.&lt;/span&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;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;SEO 점수&lt;/b&gt; &amp;mdash; 크롤링&amp;middot;인덱싱&amp;middot;메타 등 전통 검색 노출 요인&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;GEO 점수&lt;/b&gt; &amp;mdash; AI 크롤러&amp;middot;구조화&amp;middot;인용 가능성 요인&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;통합 점수&lt;/b&gt; &amp;mdash; 8개 카테고리 가중치 종합 판정&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;  진단 근거&lt;/b&gt; &amp;mdash; 구글 검색센터 공식 문서, llms.txt 표준 스펙, 주요 AI 크롤러의 공개 정책을 기반으로 77개 항목과 가중치를 설계했고, 실제 운영 사이트 실측으로 외부 진단 도구와 교차 검증했습니다. 리포트는 링크로 저장돼 팀&amp;middot;개발자에게 그대로 공유할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;지금 사이트가 어디서 막혀 있는지 확인하세요&lt;/span&gt;&lt;/h2&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;$ segeo scan https://segeo.kr&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;  &lt;a href=&quot;https://segeo.kr/#scan&quot;&gt;URL 하나로 무료 진단하기&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;비로그인 1회/일 &amp;middot; 카카오&amp;middot;구글 로그인 시 무제한 &amp;middot; 카드 불필요&lt;/span&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;2984&quot; data-origin-height=&quot;1664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8jfd9/dJMcadJuc79/YVpFo8fF3Vjk3AqAe2HzyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8jfd9/dJMcadJuc79/YVpFo8fF3Vjk3AqAe2HzyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8jfd9/dJMcadJuc79/YVpFo8fF3Vjk3AqAe2HzyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8jfd9%2FdJMcadJuc79%2FYVpFo8fF3Vjk3AqAe2HzyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2984&quot; height=&quot;1664&quot; data-origin-width=&quot;2984&quot; data-origin-height=&quot;1664&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;i&gt;SEGEO &amp;mdash; 검색엔진과 AI, 두 파이프라인에서 발견되게.&lt;/i&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;2222&quot; data-origin-height=&quot;1518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/myYpy/dJMcagzv0bY/c54ke8k8AxpEiS4ZV64uw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/myYpy/dJMcagzv0bY/c54ke8k8AxpEiS4ZV64uw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/myYpy/dJMcagzv0bY/c54ke8k8AxpEiS4ZV64uw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmyYpy%2FdJMcagzv0bY%2Fc54ke8k8AxpEiS4ZV64uw1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2222&quot; height=&quot;1518&quot; data-origin-width=&quot;2222&quot; data-origin-height=&quot;1518&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2014&quot; data-origin-height=&quot;1586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCKkK6/dJMcaazl872/UemtWJkGGO1GxcYKih97z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCKkK6/dJMcaazl872/UemtWJkGGO1GxcYKih97z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCKkK6/dJMcaazl872/UemtWJkGGO1GxcYKih97z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCKkK6%2FdJMcaazl872%2FUemtWJkGGO1GxcYKih97z0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2014&quot; height=&quot;1586&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2014&quot; data-origin-height=&quot;1586&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2130&quot; data-origin-height=&quot;1700&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNvl1y/dJMcacjx71L/OdtM4UpDc2RoeQs6T7lztK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNvl1y/dJMcacjx71L/OdtM4UpDc2RoeQs6T7lztK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNvl1y/dJMcacjx71L/OdtM4UpDc2RoeQs6T7lztK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNvl1y%2FdJMcacjx71L%2FOdtM4UpDc2RoeQs6T7lztK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2130&quot; height=&quot;1700&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2130&quot; data-origin-height=&quot;1700&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;1254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djrjMw/dJMcahSFyoA/pWogcEyOnqlZxep3TT59f0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djrjMw/dJMcahSFyoA/pWogcEyOnqlZxep3TT59f0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djrjMw/dJMcahSFyoA/pWogcEyOnqlZxep3TT59f0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdjrjMw%2FdJMcahSFyoA%2FpWogcEyOnqlZxep3TT59f0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1254&quot; height=&quot;1254&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;1254&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;a href=&quot;http://segeo.kr&quot;&gt;http://segeo.kr&lt;/a&gt; 쎄지오&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;</description>
      <category>유익한정보</category>
      <category>ai검색최적화</category>
      <category>ChatGPT검색</category>
      <category>Geo</category>
      <category>gptbot</category>
      <category>llms.txt</category>
      <category>robots.txt</category>
      <category>SEGEO</category>
      <category>seo</category>
      <category>구조화데이터</category>
      <category>생성형엔진최적화</category>
      <author>은둔한량</author>
      <guid isPermaLink="true">https://koreanred.tistory.com/206</guid>
      <comments>https://koreanred.tistory.com/206#entry206comment</comments>
      <pubDate>Tue, 21 Jul 2026 11:31:50 +0900</pubDate>
    </item>
    <item>
      <title>DDD (Domain-Driven Design) 완벽 가이드</title>
      <link>https://koreanred.tistory.com/205</link>
      <description>&lt;h1&gt;DDD (Domain-Driven Design) 완벽 가이드&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. DDD란 무엇인가?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DDD(Domain-Driven Design, 도메인 주도 설계)는 &lt;b&gt;복잡한 소프트웨어를 도메인(비즈니스 영역)의 본질에 집중하여 설계하는 방법론&lt;/b&gt;이다. 2003년 Eric Evans가 저서 *&quot;Domain-Driven Design: Tackling Complexity in the Heart of Software&quot;*에서 처음 체계화하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심 철학은 단순하다. &lt;b&gt;소프트웨어의 복잡성은 기술이 아니라 비즈니스 자체에서 온다.&lt;/b&gt; 따라서 개발자와 도메인 전문가가 공통의 언어로 소통하고, 그 언어가 코드에 그대로 반영되어야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. DDD의 핵심 원칙&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1 유비쿼터스 언어 (Ubiquitous Language)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발팀과 비즈니스 전문가가 &lt;b&gt;동일한 용어&lt;/b&gt;를 사용하여 소통하는 것이다. 이 언어는 코드, 문서, 대화 모든 곳에서 일관되게 사용된다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;잘못된 예&lt;/th&gt;
&lt;th&gt;올바른 예&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UserData&lt;/code&gt; 클래스&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Customer&lt;/code&gt; 클래스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;processItem()&lt;/code&gt; 메서드&lt;/td&gt;
&lt;td&gt;&lt;code&gt;placeOrder()&lt;/code&gt; 메서드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;flag&lt;/code&gt; 필드&lt;/td&gt;
&lt;td&gt;&lt;code&gt;isApproved&lt;/code&gt; 필드&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.2 모델 주도 설계 (Model-Driven Design)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도메인 모델이 설계와 구현의 중심이 된다. 모델은 단순한 다이어그램이 아니라 &lt;b&gt;코드로 직접 표현되는 살아있는 설계&lt;/b&gt;이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.3 지식 탐구 (Knowledge Crunching)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자와 도메인 전문가가 반복적인 대화와 협업을 통해 도메인 지식을 정제하고, 이를 모델에 반영하는 과정이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 전략적 설계 (Strategic Design)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전략적 설계는 &lt;b&gt;큰 그림&lt;/b&gt;을 다룬다. 시스템 전체를 어떻게 분리하고 조직할 것인지를 결정한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1 바운디드 컨텍스트 (Bounded Context)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DDD에서 가장 중요한 개념 중 하나이다. 하나의 모델이 유효한 &lt;b&gt;명확한 경계&lt;/b&gt;를 정의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시: 전자상거래 시스템&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;┌─────────────────┐  ┌─────────────────┐  ┌─────────────────┐
│   주문 컨텍스트   │  │  배송 컨텍스트    │  │  결제 컨텍스트    │
│                 │  │                 │  │                 │
│  - Order        │  │  - Shipment     │  │  - Payment      │
│  - OrderItem    │  │  - Delivery     │  │  - Transaction  │
│  - Customer     │  │  - Address      │  │  - Invoice      │
│   (주문자 정보)  │  │  - Customer     │  │  - Customer     │
│                 │  │   (수령인 정보)  │  │   (결제자 정보)  │
└─────────────────┘  └─────────────────┘  └─────────────────┘&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 &lt;code&gt;Customer&lt;/code&gt;라는 용어도 컨텍스트마다 &lt;b&gt;다른 의미와 속성&lt;/b&gt;을 갖는다. 이것이 바운디드 컨텍스트의 핵심이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.2 컨텍스트 맵 (Context Map)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바운디드 컨텍스트 간의 관계를 시각화한 것이다. 주요 관계 패턴은 다음과 같다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;패턴&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;사용 상황&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Shared Kernel&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;두 컨텍스트가 공통 모델을 공유&lt;/td&gt;
&lt;td&gt;밀접하게 협력하는 팀&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Customer-Supplier&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;상류(Supplier)가 하류(Customer)에 데이터 제공&lt;/td&gt;
&lt;td&gt;팀 간 의존 관계가 명확할 때&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Conformist&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;하류가 상류 모델을 그대로 수용&lt;/td&gt;
&lt;td&gt;외부 시스템에 종속될 때&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Anti-Corruption Layer&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;외부 모델을 내부 모델로 변환하는 계층&lt;/td&gt;
&lt;td&gt;레거시 시스템 통합 시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Open Host Service&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;공개 프로토콜/API로 서비스 제공&lt;/td&gt;
&lt;td&gt;다수의 소비자가 있을 때&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Published Language&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;문서화된 공유 언어(JSON Schema 등)&lt;/td&gt;
&lt;td&gt;표준화된 통신이 필요할 때&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Separate Ways&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;관계를 끊고 독립적으로 운영&lt;/td&gt;
&lt;td&gt;통합 비용 &amp;gt; 이익일 때&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.3 서브도메인 (Subdomain)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비즈니스 영역을 분류하여 투자 우선순위를 결정한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Core Domain (핵심 도메인)&lt;/b&gt;: 비즈니스의 핵심 경쟁력. 최고의 개발자를 투입하고 DDD를 적극 적용한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Supporting Subdomain (지원 도메인)&lt;/b&gt;: 핵심은 아니지만 비즈니스에 필요한 영역. 적절한 수준으로 개발한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Generic Subdomain (일반 도메인)&lt;/b&gt;: 범용적인 기능. 기존 솔루션이나 외부 서비스를 활용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 전술적 설계 (Tactical Design)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전술적 설계는 &lt;b&gt;하나의 바운디드 컨텍스트 내부&lt;/b&gt;를 어떻게 구현할 것인지를 다룬다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.1 엔티티 (Entity)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고유한 식별자(ID)를 가지며, 시간이 지나도 &lt;b&gt;동일성(identity)&lt;/b&gt;이 유지되는 객체이다.&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;public class Order {
    private OrderId id;          // 고유 식별자
    private CustomerId customer;
    private List&amp;lt;OrderLine&amp;gt; lines;
    private OrderStatus status;

    public void addItem(Product product, int quantity) {
        // 비즈니스 규칙 검증 후 항목 추가
        if (status != OrderStatus.DRAFT) {
            throw new IllegalStateException(&quot;확정된 주문에는 상품을 추가할 수 없습니다.&quot;);
        }
        lines.add(new OrderLine(product.getId(), quantity, product.getPrice()));
    }

    public Money calculateTotal() {
        return lines.stream()
            .map(OrderLine::subtotal)
            .reduce(Money.ZERO, Money::add);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.2 값 객체 (Value Object)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;식별자가 없으며, &lt;b&gt;속성의 조합으로 동등성&lt;/b&gt;이 결정되는 불변 객체이다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;public record Money(BigDecimal amount, Currency currency) {

    public Money add(Money other) {
        if (!this.currency.equals(other.currency)) {
            throw new IllegalArgumentException(&quot;통화가 다른 금액은 합산할 수 없습니다.&quot;);
        }
        return new Money(this.amount.add(other.amount), this.currency);
    }

    public Money multiply(int quantity) {
        return new Money(this.amount.multiply(BigDecimal.valueOf(quantity)), this.currency);
    }
}

public record Address(String city, String street, String zipCode) {
    // 불변이며 값으로 비교된다
    // new Address(&quot;서울&quot;, &quot;강남대로&quot;, &quot;06000&quot;).equals(new Address(&quot;서울&quot;, &quot;강남대로&quot;, &quot;06000&quot;)) &amp;rarr; true
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.3 애그리거트 (Aggregate)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관련된 엔티티와 값 객체를 하나의 &lt;b&gt;트랜잭션 경계&lt;/b&gt;로 묶은 것이다. 하나의 &lt;b&gt;애그리거트 루트(Aggregate Root)&lt;/b&gt;를 통해서만 내부 객체에 접근할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;┌─── Aggregate: Order ────────────────────────────┐
│                                                  │
│   ┌──────────────┐                               │
│   │  Order (Root) │ &amp;larr; 외부에서 접근하는 유일한 진입점  │
│   └──────┬───────┘                               │
│          │                                       │
│   ┌──────┴───────┐  ┌─────────────┐             │
│   │  OrderLine   │  │  OrderLine  │  (내부 엔티티) │
│   └──────────────┘  └─────────────┘             │
│                                                  │
│   ┌──────────────┐                               │
│   │  Money (VO)  │  (값 객체)                     │
│   └──────────────┘                               │
└──────────────────────────────────────────────────┘&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;애그리거트 설계 규칙:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;애그리거트 루트를 통해서만 내부 상태를 변경한다.&lt;/li&gt;
&lt;li&gt;하나의 트랜잭션에서 하나의 애그리거트만 수정한다.&lt;/li&gt;
&lt;li&gt;다른 애그리거트는 ID로만 참조한다 (직접 객체 참조 금지).&lt;/li&gt;
&lt;li&gt;애그리거트는 가능한 작게 유지한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.4 도메인 이벤트 (Domain Event)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도메인에서 발생한 &lt;b&gt;의미 있는 사건&lt;/b&gt;을 표현하는 객체이다. 과거형으로 명명한다.&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;public record OrderPlacedEvent(
    OrderId orderId,
    CustomerId customerId,
    Money totalAmount,
    LocalDateTime occurredAt
) implements DomainEvent {}

// 사용 예
public class Order {
    public void place() {
        this.status = OrderStatus.PLACED;
        registerEvent(new OrderPlacedEvent(
            this.id, this.customer, calculateTotal(), LocalDateTime.now()
        ));
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도메인 이벤트는 바운디드 컨텍스트 간의 &lt;b&gt;느슨한 결합(loose coupling)&lt;/b&gt;을 실현하는 핵심 도구이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.5 리포지토리 (Repository)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애그리거트의 &lt;b&gt;영속성(저장과 조회)&lt;/b&gt;을 담당하는 인터페이스이다. 도메인 계층에서는 인터페이스만 정의하고, 구현은 인프라 계층에서 한다.&lt;/p&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;// 도메인 계층 - 인터페이스
public interface OrderRepository {
    Order findById(OrderId id);
    void save(Order order);
    List&amp;lt;Order&amp;gt; findByCustomer(CustomerId customerId);
}

// 인프라 계층 - 구현
public class JpaOrderRepository implements OrderRepository {
    @Override
    public Order findById(OrderId id) {
        // JPA를 사용한 구현
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.6 도메인 서비스 (Domain Service)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 엔티티에 속하지 않는 &lt;b&gt;도메인 로직&lt;/b&gt;을 담당한다. 상태를 갖지 않는(Stateless) 객체이다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;public class PricingService {

    public Money calculateDiscountedPrice(Order order, Customer customer) {
        Money total = order.calculateTotal();
        DiscountPolicy policy = resolvePolicy(customer.getGrade());
        return policy.apply(total);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.7 팩토리 (Factory)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복잡한 객체 생성 로직을 캡슐화한다.&lt;/p&gt;
&lt;pre class=&quot;lasso&quot;&gt;&lt;code&gt;public class OrderFactory {

    public Order createOrder(CustomerId customerId, List&amp;lt;CartItem&amp;gt; cartItems) {
        // 재고 확인, 가격 검증 등 복잡한 생성 로직
        Order order = new Order(OrderId.generate(), customerId);
        for (CartItem item : cartItems) {
            order.addItem(item.getProduct(), item.getQuantity());
        }
        return order;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 아키텍처 패턴&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DDD는 특정 아키텍처를 강제하지 않지만, 아래 패턴들과 잘 어울린다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5.1 계층형 아키텍처 (Layered Architecture)&lt;/h3&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;┌─────────────────────────────────┐
│     Presentation Layer          │  &amp;larr; UI, API Controller
├─────────────────────────────────┤
│     Application Layer           │  &amp;larr; 유스케이스 조율, 트랜잭션 관리
├─────────────────────────────────┤
│     Domain Layer                │  &amp;larr; 엔티티, 값 객체, 도메인 서비스
├─────────────────────────────────┤
│     Infrastructure Layer        │  &amp;larr; DB, 메시징, 외부 API
└─────────────────────────────────┘&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5.2 헥사고날 아키텍처 (Hexagonal / Ports &amp;amp; Adapters)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도메인을 중심에 두고, 외부 의존성을 &lt;b&gt;포트(인터페이스)&lt;/b&gt;와 &lt;b&gt;어댑터(구현)&lt;/b&gt;로 분리한다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;                    ┌─── Driving Adapter ───┐
                    │   REST Controller     │
                    │   CLI                 │
                    └───────────┬───────────┘
                                │
                    ┌───────────▼───────────┐
                    │     Input Port        │
                    │  (Use Case Interface) │
                    ├───────────────────────┤
                    │                       │
                    │    Domain Model       │  &amp;larr; 핵심 비즈니스 로직
                    │                       │
                    ├───────────────────────┤
                    │    Output Port        │
                    │  (Repository 등)      │
                    └───────────┬───────────┘
                                │
                    ┌───────────▼───────────┐
                    │  Driven Adapter       │
                    │  JPA, Kafka, Redis    │
                    └───────────────────────┘&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5.3 CQRS (Command Query Responsibility Segregation)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령(쓰기)과 조회(읽기) 모델을 분리한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Command 모델&lt;/b&gt;: 도메인 모델을 통해 상태 변경 처리&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Query 모델&lt;/b&gt;: 조회에 최적화된 별도의 읽기 모델 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5.4 이벤트 소싱 (Event Sourcing)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상태를 직접 저장하는 대신, &lt;b&gt;발생한 이벤트의 시퀀스&lt;/b&gt;를 저장한다. 현재 상태는 이벤트를 순서대로 재생하여 복원한다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;Event Store:
  1. OrderCreated { orderId: &quot;001&quot;, customer: &quot;홍길동&quot; }
  2. ItemAdded { orderId: &quot;001&quot;, product: &quot;노트북&quot;, qty: 1 }
  3. ItemAdded { orderId: &quot;001&quot;, product: &quot;마우스&quot;, qty: 2 }
  4. OrderPlaced { orderId: &quot;001&quot;, total: 1,520,000원 }

&amp;rarr; 현재 상태 복원: 이벤트 1~4를 순서대로 적용&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. DDD의 사용 범위&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.1 DDD가 적합한 경우&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;상황&lt;/th&gt;
&lt;th&gt;이유&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;복잡한 비즈니스 로직이 있는 시스템&lt;/td&gt;
&lt;td&gt;DDD의 핵심 가치가 발휘됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;도메인 전문가와 긴밀한 협업이 가능한 환경&lt;/td&gt;
&lt;td&gt;유비쿼터스 언어의 효과를 극대화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;장기적으로 진화해야 하는 시스템&lt;/td&gt;
&lt;td&gt;바운디드 컨텍스트로 유연한 변경 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;마이크로서비스 아키텍처&lt;/td&gt;
&lt;td&gt;서비스 경계를 바운디드 컨텍스트로 정의&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;레거시 시스템 현대화&lt;/td&gt;
&lt;td&gt;ACL 패턴으로 점진적 마이그레이션&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.2 DDD가 과도한 경우&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;상황&lt;/th&gt;
&lt;th&gt;대안&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;단순 CRUD 애플리케이션&lt;/td&gt;
&lt;td&gt;Active Record 패턴, 트랜잭션 스크립트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;기술 중심 시스템 (파일 변환, ETL 등)&lt;/td&gt;
&lt;td&gt;파이프라인 패턴&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;프로토타입 또는 MVP&lt;/td&gt;
&lt;td&gt;빠른 개발 우선, 필요 시 리팩토링&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;소규모 팀/단기 프로젝트&lt;/td&gt;
&lt;td&gt;오버엔지니어링의 위험&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;도메인 전문가 접근이 불가능한 경우&lt;/td&gt;
&lt;td&gt;DDD의 핵심 전제가 성립하지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.3 산업별 적용 사례&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;금융&lt;/b&gt;: 거래 처리, 리스크 관리, 보험 계약&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이커머스&lt;/b&gt;: 주문 관리, 재고, 가격 정책&lt;/li&gt;
&lt;li&gt;&lt;b&gt;의료&lt;/b&gt;: 환자 기록, 진료 워크플로우&lt;/li&gt;
&lt;li&gt;&lt;b&gt;물류&lt;/b&gt;: 배송 추적, 경로 최적화&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SaaS&lt;/b&gt;: 멀티테넌트 관리, 구독/과금&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 실전 적용 가이드&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7.1 이벤트 스토밍 (Event Storming)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DDD 모델을 도출하는 가장 효과적인 워크숍 기법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;진행 순서:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;도메인 이벤트 도출&lt;/b&gt; &amp;mdash; 비즈니스에서 일어나는 사건을 주황색 포스트잇에 적는다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;커맨드 식별&lt;/b&gt; &amp;mdash; 이벤트를 발생시키는 행위를 파란색 포스트잇에 적는다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;애그리거트 식별&lt;/b&gt; &amp;mdash; 커맨드를 처리하고 이벤트를 발생시키는 주체를 노란색 포스트잇에 적는다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;바운디드 컨텍스트 도출&lt;/b&gt; &amp;mdash; 관련 요소들을 묶어 경계를 설정한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정책 식별&lt;/b&gt; &amp;mdash; 이벤트에 반응하여 자동으로 실행되는 규칙을 라일락색 포스트잇에 적는다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7.2 점진적 도입 전략&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DDD를 한 번에 전체 시스템에 적용하는 것은 위험하다. 아래 단계를 따른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1단계: 유비쿼터스 언어 수립&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;도메인 전문가와 용어 사전 작성&lt;/li&gt;
&lt;li&gt;코드의 클래스명, 메서드명에 반영&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2단계: 바운디드 컨텍스트 식별&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기존 시스템의 경계를 분석&lt;/li&gt;
&lt;li&gt;핵심 도메인을 우선 식별&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3단계: 핵심 도메인에 전술적 패턴 적용&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;애그리거트, 엔티티, 값 객체 설계&lt;/li&gt;
&lt;li&gt;리포지토리 패턴 도입&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4단계: 컨텍스트 간 통합 패턴 적용&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;도메인 이벤트 도입&lt;/li&gt;
&lt;li&gt;ACL 등 통합 패턴 구현&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7.3 흔한 실수와 주의사항&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;실수&lt;/th&gt;
&lt;th&gt;올바른 접근&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;기술 패턴에만 집중&lt;/td&gt;
&lt;td&gt;도메인 이해가 최우선&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;모든 곳에 DDD 적용&lt;/td&gt;
&lt;td&gt;핵심 도메인에 집중&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;애그리거트를 너무 크게 설계&lt;/td&gt;
&lt;td&gt;작은 애그리거트, ID 참조&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;빈혈 도메인 모델 (Anemic Domain Model)&lt;/td&gt;
&lt;td&gt;엔티티에 비즈니스 로직 포함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;유비쿼터스 언어 무시&lt;/td&gt;
&lt;td&gt;코드와 대화에서 동일 용어 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;바운디드 컨텍스트 없이 단일 모델 고집&lt;/td&gt;
&lt;td&gt;컨텍스트별 독립 모델 유지&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. DDD와 관련 기술/방법론&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;기술/방법론&lt;/th&gt;
&lt;th&gt;DDD와의 관계&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;마이크로서비스&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;바운디드 컨텍스트 = 서비스 경계의 근거&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;클린 아키텍처&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;도메인 중심 의존성 방향과 일치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;TDD&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;도메인 모델의 행위를 테스트로 검증&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;BDD&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;유비쿼터스 언어로 시나리오 작성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Event-Driven Architecture&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;도메인 이벤트 기반 비동기 통합&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Kafka / RabbitMQ&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;도메인 이벤트 전달 인프라&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Spring Boot&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;DDD 구현에 널리 사용되는 프레임워크&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 추천 학습 자료&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;필수 도서&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Eric Evans &amp;mdash; &lt;i&gt;Domain-Driven Design: Tackling Complexity in the Heart of Software&lt;/i&gt; (2003)&lt;/li&gt;
&lt;li&gt;Vaughn Vernon &amp;mdash; &lt;i&gt;Implementing Domain-Driven Design&lt;/i&gt; (2013)&lt;/li&gt;
&lt;li&gt;Vaughn Vernon &amp;mdash; &lt;i&gt;Domain-Driven Design Distilled&lt;/i&gt; (2016, 입문용)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;심화 도서&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Scott Millett &amp;amp; Nick Tune &amp;mdash; &lt;i&gt;Patterns, Principles, and Practices of Domain-Driven Design&lt;/i&gt; (2015)&lt;/li&gt;
&lt;li&gt;Alberto Brandolini &amp;mdash; &lt;i&gt;Introducing EventStorming&lt;/i&gt; (이벤트 스토밍 기법)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;10. 요약&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DDD는 단순히 코드 패턴의 집합이 아니라 &lt;b&gt;비즈니스 문제를 소프트웨어로 해결하는 사고 방식&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심을 세 줄로 정리하면 다음과 같다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;전략적 설계&lt;/b&gt;: 바운디드 컨텍스트로 시스템을 나누고, 유비쿼터스 언어로 소통한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;전술적 설계&lt;/b&gt;: 엔티티, 값 객체, 애그리거트 등의 빌딩 블록으로 도메인 모델을 구현한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;지속적 정제&lt;/b&gt;: 도메인 전문가와의 협업을 통해 모델을 끊임없이 발전시킨다.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;소프트웨어의 심장부에 있는 복잡성에 맞서라.&quot; &amp;mdash; Eric Evans&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <category>etc</category>
      <category>1. DDD란 무엇인가?</category>
      <category>ddd</category>
      <category>ddd란?</category>
      <author>은둔한량</author>
      <guid isPermaLink="true">https://koreanred.tistory.com/205</guid>
      <comments>https://koreanred.tistory.com/205#entry205comment</comments>
      <pubDate>Thu, 26 Mar 2026 20:21:39 +0900</pubDate>
    </item>
    <item>
      <title>DDD (Domain-Driven Design) &amp;mdash; 초보자를 위한 완벽 가이드</title>
      <link>https://koreanred.tistory.com/204</link>
      <description>&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Part 1. DDD가 뭔데?&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.1 한 줄 정의&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DDD(Domain-Driven Design, 도메인 주도 설계)는 &lt;b&gt;&quot;비즈니스를 이해하고, 그 이해를 코드에 그대로 녹여내는 소프트웨어 설계 방법&quot;&lt;/b&gt;이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.2 &quot;도메인&quot;이 뭔가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;도메인(Domain)&quot;은 &lt;b&gt;우리가 만드는 소프트웨어가 해결하려는 현실 세계의 문제 영역&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말하면 이렇다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쿠팡을 만든다면 &amp;rarr; 도메인은 &quot;온라인 쇼핑&quot;&lt;/li&gt;
&lt;li&gt;토스를 만든다면 &amp;rarr; 도메인은 &quot;금융/송금&quot;&lt;/li&gt;
&lt;li&gt;배달의민족을 만든다면 &amp;rarr; 도메인은 &quot;음식 배달&quot;&lt;/li&gt;
&lt;li&gt;병원 시스템을 만든다면 &amp;rarr; 도메인은 &quot;의료/진료&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도메인에는 그 분야만의 &lt;b&gt;규칙, 용어, 프로세스&lt;/b&gt;가 있다. 예를 들어 &quot;음식 배달&quot; 도메인에는 &quot;주문&quot;, &quot;배달료&quot;, &quot;배달원 배정&quot;, &quot;예상 도착 시간&quot; 같은 개념이 있고, 이런 것들이 어떻게 작동하는지에 대한 규칙이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DDD는 이런 &lt;b&gt;도메인의 규칙과 개념을 코드의 중심에 놓자&lt;/b&gt;는 것이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.3 왜 이름이 &quot;Domain-Driven&quot;인가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 개발을 하면 기술 중심으로 생각하기 쉽다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;DB 테이블을 어떻게 설계하지?&quot;&lt;br /&gt;&quot;API를 RESTful하게 만들어야 하나?&quot;&lt;br /&gt;&quot;Spring을 쓸까, Express를 쓸까?&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DDD는 이런 기술적 고민보다 &lt;b&gt;도메인(비즈니스)을 먼저 생각하라&lt;/b&gt;고 말한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;고객이 주문을 취소하면 어떤 일이 벌어져야 하지?&quot;&lt;br /&gt;&quot;환불 정책은 뭐지?&quot;&lt;br /&gt;&quot;부분 취소가 가능한가?&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기술이 아니라 비즈니스가 설계를 이끈다(drive)&lt;/b&gt; &amp;mdash; 그래서 &quot;Domain-Driven&quot;이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Part 2. 왜 DDD를 써야 하는가?&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1 DDD 없이 개발하면 생기는 문제들&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 프로젝트가 이런 과정을 겪는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;초기 (1~3개월):&lt;/b&gt;&lt;br /&gt;코드가 단순하고, 기능 추가가 빠르다. 모든 게 잘 돌아가는 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;중기 (6개월~1년):&lt;/b&gt;&lt;br /&gt;기능이 늘어나면서 코드가 점점 복잡해진다. &quot;이 코드 왜 이렇게 됐지?&quot; 하는 부분이 생긴다. 하나를 고치면 다른 데가 깨진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;후기 (1년 이후):&lt;/b&gt;&lt;br /&gt;새 기능 하나 추가하는 데 일주일이 걸린다. 아무도 전체 코드를 이해하지 못한다. &quot;처음부터 다시 만들자&quot;는 이야기가 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것을 &lt;b&gt;Big Ball of Mud(거대한 진흙 덩어리)&lt;/b&gt;라고 부른다. 왜 이렇게 되는 걸까?&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.2 근본적인 원인: 비즈니스와 코드의 괴리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 큰 원인은 &lt;b&gt;비즈니스 로직이 코드 여기저기에 흩어져 있기&lt;/b&gt; 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 DDD 없이 흔히 볼 수 있는 코드이다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;// ❌ 흔한 안 좋은 코드 &amp;mdash; 비즈니스 로직이 Controller에 섞여 있다
@PostMapping(&quot;/orders/{id}/cancel&quot;)
public Response cancelOrder(@PathVariable Long id) {
    Order order = orderRepository.findById(id);

    // 취소 가능한지 확인 &amp;mdash; 이게 비즈니스 규칙인데 Controller에 있다
    if (order.getStatus().equals(&quot;SHIPPED&quot;)) {
        return Response.error(&quot;이미 배송된 주문은 취소할 수 없습니다&quot;);
    }

    // 환불 금액 계산 &amp;mdash; 이것도 비즈니스 규칙이다
    long refundAmount = order.getTotalPrice();
    if (order.getStatus().equals(&quot;PREPARING&quot;)) {
        refundAmount = (long)(order.getTotalPrice() * 0.9); // 준비중이면 90% 환불
    }

    order.setStatus(&quot;CANCELLED&quot;);              // 단순 setter 호출
    order.setRefundAmount(refundAmount);
    orderRepository.save(order);

    paymentService.refund(order.getPaymentId(), refundAmount);
    notificationService.sendCancelNotification(order.getUserId());

    return Response.ok();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드의 문제점은 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 1: 비즈니스 규칙이 숨어 있다.&lt;/b&gt;&lt;br /&gt;&quot;배송 후에는 취소 불가&quot;, &quot;준비중이면 90% 환불&quot; 같은 중요한 규칙이 Controller 코드 사이에 묻혀 있다. 기획자가 &quot;환불 정책이 어떻게 되어 있지?&quot;라고 물으면, 코드를 뒤져야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 2: 같은 규칙이 여러 곳에 복사된다.&lt;/b&gt;&lt;br /&gt;관리자 페이지에서도 주문 취소를 할 수 있다면? 같은 로직을 복사해서 붙여넣는다. 나중에 환불 정책이 바뀌면 두 곳을 다 찾아서 고쳐야 한다. 한 곳을 빼먹으면 버그가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 3: 테스트하기 어렵다.&lt;/b&gt;&lt;br /&gt;이 로직을 테스트하려면 HTTP 요청을 만들어야 한다. 순수한 비즈니스 규칙만 테스트할 수가 없다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.3 DDD가 이 문제를 어떻게 해결하는가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DDD를 적용하면 같은 기능이 이렇게 바뀐다.&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;// ✅ DDD를 적용한 코드 &amp;mdash; 비즈니스 규칙이 Order 안에 있다

// 도메인 모델 &amp;mdash; Order 클래스
public class Order {
    private OrderId id;
    private OrderStatus status;
    private Money totalPrice;

    public void cancel() {
        // 비즈니스 규칙이 Order 안에 명확하게 표현된다
        if (this.status == OrderStatus.SHIPPED) {
            throw new OrderAlreadyShippedException(&quot;이미 배송된 주문은 취소할 수 없습니다&quot;);
        }

        this.status = OrderStatus.CANCELLED;
    }

    public Money calculateRefundAmount() {
        if (this.status == OrderStatus.PREPARING) {
            return this.totalPrice.multiply(0.9);   // 준비중: 90% 환불
        }
        return this.totalPrice;                      // 그 외: 전액 환불
    }
}

// Controller &amp;mdash; 얇고 단순하다
@PostMapping(&quot;/orders/{id}/cancel&quot;)
public Response cancelOrder(@PathVariable Long id) {
    orderCancelService.cancel(OrderId.of(id));   // 유스케이스 호출만
    return Response.ok();
}

// Application Service &amp;mdash; 흐름만 조율한다
public class OrderCancelService {
    public void cancel(OrderId orderId) {
        Order order = orderRepository.findById(orderId);

        order.cancel();                                          // 도메인 모델에게 위임
        Money refund = order.calculateRefundAmount();            // 도메인 모델에게 위임

        orderRepository.save(order);
        paymentService.refund(order.getPaymentId(), refund);
        eventPublisher.publish(new OrderCancelledEvent(order));
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무엇이 달라졌는가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;달라진 점 1: 비즈니스 규칙이 한 곳에 모여 있다.&lt;/b&gt;&lt;br /&gt;&quot;취소 가능 여부&quot;와 &quot;환불 금액 계산&quot;이라는 규칙이 &lt;code&gt;Order&lt;/code&gt; 클래스 안에 있다. 기획자가 &quot;환불 정책이 뭐지?&quot;라고 물으면, &lt;code&gt;Order.calculateRefundAmount()&lt;/code&gt;를 보면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;달라진 점 2: 어디서든 같은 규칙이 적용된다.&lt;/b&gt;&lt;br /&gt;사용자가 취소하든, 관리자가 취소하든, 배치 작업이 취소하든, 항상 &lt;code&gt;order.cancel()&lt;/code&gt;을 호출한다. 규칙이 중복되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;달라진 점 3: 비즈니스 규칙만 따로 테스트할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;livescript&quot;&gt;&lt;code&gt;@Test
void 배송된_주문은_취소할_수_없다() {
    Order order = createOrder(OrderStatus.SHIPPED);
    assertThrows(OrderAlreadyShippedException.class, () -&amp;gt; order.cancel());
}

@Test
void 준비중인_주문은_90퍼센트_환불한다() {
    Order order = createOrder(OrderStatus.PREPARING);
    Money refund = order.calculateRefundAmount();
    assertEquals(Money.of(9000), refund);  // 10,000원의 90%
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP, DB, 프레임워크 없이 순수하게 비즈니스 규칙만 테스트할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.4 한 마디로 정리하는 DDD의 가치&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;문제&lt;/th&gt;
&lt;th&gt;DDD의 해결책&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;비즈니스 규칙이 코드 여기저기 흩어져 있다&lt;/td&gt;
&lt;td&gt;도메인 모델에 규칙을 집중시킨다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;개발자와 기획자가 서로 다른 언어를 쓴다&lt;/td&gt;
&lt;td&gt;유비쿼터스 언어로 통일한다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;시스템이 커질수록 변경이 어렵다&lt;/td&gt;
&lt;td&gt;바운디드 컨텍스트로 경계를 나눈다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;새 팀원이 코드를 이해하기 어렵다&lt;/td&gt;
&lt;td&gt;코드가 비즈니스를 직접 설명한다&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Part 3. DDD의 핵심 개념 &amp;mdash; 쉽게 풀어쓰기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DDD에는 크게 두 가지 영역이 있다. &lt;b&gt;전략적 설계&lt;/b&gt;(큰 그림)와 &lt;b&gt;전술적 설계&lt;/b&gt;(세부 구현)이다. 레스토랑에 비유하면, 전략적 설계는 &quot;주방, 홀, 창고를 어떻게 배치할까&quot;이고, 전술적 설계는 &quot;각 구역 안의 도구와 작업 방식을 어떻게 정할까&quot;이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1 전략적 설계 &amp;mdash; 큰 그림 그리기&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.1.1 유비쿼터스 언어 (Ubiquitous Language)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;한 줄 설명:&lt;/b&gt; 개발팀과 비즈니스팀이 똑같은 단어를 쓰는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;왜 필요한가?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 흔히 일어나는 상황을 보자.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기획자: &quot;고객이 장바구니에서 결제하면 주문이 생성되잖아요.&quot;&lt;br /&gt;개발자: &quot;아, 네. User가 Cart의 Item들을 Payment 처리하면 OrderData가 INSERT 되는 거죠.&quot;&lt;br /&gt;기획자: &quot;...네?&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 이야기를 하고 있는데 용어가 다르다. 이런 상황이 반복되면 커뮤니케이션 비용이 기하급수적으로 늘어난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DDD에서는 이렇게 한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기획자: &quot;고객(Customer)이 주문(Order)을 생성(placeOrder)하면...&quot;&lt;br /&gt;개발자: &quot;네, Customer 객체의 placeOrder 메서드를 호출하면...&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드에서도, 회의에서도, 문서에서도 &lt;b&gt;같은 단어&lt;/b&gt;를 쓴다. 코드가 곧 비즈니스 문서가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실천 방법:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;프로젝트 초기에 팀원들과 &lt;b&gt;용어 사전&lt;/b&gt;을 만든다.&lt;/li&gt;
&lt;li&gt;코드의 클래스명, 메서드명, 변수명에 이 용어를 사용한다.&lt;/li&gt;
&lt;li&gt;기술 용어를 비즈니스 용어로 치환한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;잘못된 예                    올바른 예
────────────────────────    ────────────────────────
UserData                 &amp;rarr;  Customer
processItem()            &amp;rarr;  placeOrder()
updateFlag()             &amp;rarr;  approvePayment()
data1, data2             &amp;rarr;  shippingAddress, billingAddress
handleStuff()            &amp;rarr;  calculateDeliveryFee()&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.1.2 바운디드 컨텍스트 (Bounded Context)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;한 줄 설명:&lt;/b&gt; &quot;이 용어와 규칙이 통하는 범위&quot;의 경계선이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;왜 필요한가?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현실에서 같은 단어가 상황에 따라 다른 뜻을 갖는 것처럼, 소프트웨어에서도 마찬가지다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;상품(Product)&quot;이라는 단어를 생각해 보자.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;상품 카탈로그팀&lt;/b&gt;: 이름, 설명, 이미지, 카테고리가 중요하다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;재고 관리팀&lt;/b&gt;: 수량, 창고 위치, 입출고 이력이 중요하다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주문팀&lt;/b&gt;: 가격, 할인, 주문 수량이 중요하다.&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;code&gt;Product&lt;/code&gt; 클래스를 공유하면 어떻게 될까?&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;// ❌ 모든 팀이 하나의 Product를 공유한 결과
public class Product {
    private String name;          // 카탈로그팀이 씀
    private String description;   // 카탈로그팀이 씀
    private String imageUrl;      // 카탈로그팀이 씀
    private int stockQuantity;    // 재고팀이 씀
    private String warehouseCode; // 재고팀이 씀
    private BigDecimal price;     // 주문팀이 씀
    private BigDecimal discount;  // 주문팀이 씀
    private double weight;        // 배송팀이 씀
    private String packagingType; // 배송팀이 씀
    // ... 필드가 끝없이 늘어난다
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 클래스는 모든 팀의 요구사항을 담다 보니 비대해지고, 한 팀의 변경이 다른 팀에 영향을 준다. 재고팀이 &lt;code&gt;stockQuantity&lt;/code&gt; 관련 로직을 수정했는데, 주문팀 코드가 깨지는 일이 생긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DDD에서는 &lt;b&gt;바운디드 컨텍스트로 경계를 나눈다.&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;erlang-repl&quot;&gt;&lt;code&gt;┌── 카탈로그 컨텍스트 ──┐  ┌── 재고 컨텍스트 ──────┐
│                       │  │                       │
│  Product              │  │  StockItem             │
│  ├ name               │  │  ├ productId (ID만!)   │
│  ├ description         │  │  ├ quantity            │
│  ├ imageUrl           │  │  ├ warehouseCode       │
│  └ category           │  │  └ lastRestockedAt     │
│                       │  │                       │
└───────────────────────┘  └───────────────────────┘

┌── 주문 컨텍스트 ──────┐  ┌── 배송 컨텍스트 ──────┐
│                       │  │                       │
│  OrderItem            │  │  Parcel               │
│  ├ productId (ID만!)  │  │  ├ productId (ID만!)  │
│  ├ unitPrice          │  │  ├ weight              │
│  ├ quantity           │  │  ├ dimensions          │
│  └ discount           │  │  └ packagingType       │
│                       │  │                       │
└───────────────────────┘  └───────────────────────┘&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 컨텍스트는 자기에게 필요한 속성만 가진다. 다른 컨텍스트의 객체는 ID로만 참조한다. 이렇게 하면 각 컨텍스트가 &lt;b&gt;독립적으로 변경&lt;/b&gt;될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;비유:&lt;/b&gt; 바운디드 컨텍스트는 나라의 국경과 같다. 같은 &quot;football&quot;이라는 단어도 미국에서는 미식축구, 영국에서는 축구를 의미한다. 각 나라(컨텍스트) 안에서는 혼동이 없다. 국경(경계)이 있기 때문이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.1.3 컨텍스트 맵 (Context Map)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;한 줄 설명:&lt;/b&gt; 바운디드 컨텍스트들이 서로 어떤 관계인지 그린 지도이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바운디드 컨텍스트들은 완전히 고립되지 않는다. 서로 데이터를 주고받아야 한다. 이 관계를 정리한 것이 컨텍스트 맵이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주요 관계 패턴을 일상 비유로 설명하면 이렇다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Shared Kernel (공유 커널):&lt;/b&gt;&lt;br /&gt;두 팀이 공통으로 쓰는 코드가 있다. 마치 두 가게가 하나의 주차장을 공유하는 것과 같다. 편리하지만 한쪽이 주차장을 바꾸면 다른 쪽도 영향을 받는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Customer-Supplier (고객-공급자):&lt;/b&gt;&lt;br /&gt;한 팀(공급자)이 다른 팀(고객)에게 데이터를 제공한다. 식당(고객)과 식재료 납품업체(공급자)의 관계와 같다. 식당이 필요한 것을 요청하고, 납품업체가 맞춰준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Anti-Corruption Layer (부패 방지 계층):&lt;/b&gt;&lt;br /&gt;외부 시스템의 복잡하고 지저분한 데이터를 우리 시스템에 맞게 변환하는 계층이다. 해외여행 시 환전하는 것과 같다. 외국 화폐(외부 모델)를 우리나라 화폐(내부 모델)로 바꿔서 사용한다.&lt;/p&gt;
&lt;pre class=&quot;axapta&quot;&gt;&lt;code&gt;// Anti-Corruption Layer 예시
// 외부 결제 시스템의 응답을 우리 도메인 모델로 변환한다
public class PaymentGatewayAdapter {

    private final ExternalPaymentAPI externalApi;

    public PaymentResult processPayment(Order order) {
        // 외부 API는 우리와 다른 용어, 다른 구조를 사용한다
        ExternalPaymentResponse response = externalApi.charge(
            order.getTotalPrice().toDouble(),      // 외부: double 사용
            order.getCustomer().getId().toString()  // 외부: String ID
        );

        // 외부 응답을 우리 도메인 모델로 &quot;번역&quot;한다
        return new PaymentResult(
            PaymentId.of(response.getTransactionRef()),
            response.getResultCode().equals(&quot;00&quot;) 
                ? PaymentStatus.APPROVED 
                : PaymentStatus.DECLINED,
            Money.of(response.getChargedAmt())
        );
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.1.4 서브도메인 (Subdomain) &amp;mdash; 모든 곳에 DDD를 쓸 필요는 없다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;한 줄 설명:&lt;/b&gt; 비즈니스 영역을 중요도에 따라 분류하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것은 매우 실용적인 개념이다. &lt;b&gt;모든 코드에 DDD를 적용할 필요가 없다.&lt;/b&gt; 중요한 곳에만 집중하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Core Domain (핵심 도메인)&lt;/b&gt; &amp;mdash; 우리 서비스의 경쟁력&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;배달의민족이라면: &quot;배달원 배정 알고리즘&quot;, &quot;예상 도착 시간 계산&quot;&lt;/li&gt;
&lt;li&gt;넷플릭스라면: &quot;콘텐츠 추천 알고리즘&quot;&lt;/li&gt;
&lt;li&gt;여기에 최고의 개발자를 투입하고, DDD를 적극 적용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Supporting Subdomain (지원 도메인)&lt;/b&gt; &amp;mdash; 핵심은 아니지만 필요한 것&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;배달의민족이라면: &quot;가게 등록/관리&quot;, &quot;메뉴 관리&quot;&lt;/li&gt;
&lt;li&gt;중요하지만 경쟁력의 원천은 아니다. 적절한 수준으로 개발한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Generic Subdomain (일반 도메인)&lt;/b&gt; &amp;mdash; 누구나 필요한 것&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;로그인/회원가입&quot;, &quot;알림 발송&quot;, &quot;파일 업로드&quot;&lt;/li&gt;
&lt;li&gt;이건 직접 만들 필요 없다. 기존 라이브러리나 SaaS를 쓴다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;투자 우선순위:

┌─────────────────────────────────────────────┐
│            Core Domain                       │
│     (DDD 전력 투입, 최고 인력 배치)            │
│     배달원 매칭, 추천 알고리즘 등               │
├─────────────────────────────────────────────┤
│         Supporting Subdomain                 │
│     (적절한 수준의 설계)                       │
│     가게 관리, 메뉴 관리, 리뷰 등              │
├─────────────────────────────────────────────┤
│          Generic Subdomain                   │
│     (구매/외부 서비스 활용)                     │
│     인증, 알림, 결제 연동 등                   │
└─────────────────────────────────────────────┘&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.2 전술적 설계 &amp;mdash; 실제로 코드를 어떻게 짜는가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전략적 설계로 큰 그림을 그렸다면, 이제 각 바운디드 컨텍스트 안에서 &lt;b&gt;어떤 구조로 코드를 짤 것인지&lt;/b&gt;를 정한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.2.1 엔티티 (Entity)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;한 줄 설명:&lt;/b&gt; 고유한 ID가 있어서, 속성이 바뀌어도 같은 것으로 식별되는 객체이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;비유:&lt;/b&gt; 사람은 이름을 바꿔도, 머리를 잘라도, 옷을 바꿔도 같은 사람이다. 주민등록번호(ID)로 식별하기 때문이다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;public class Customer {
    private final CustomerId id;   // 이것으로 식별된다
    private String name;            // 바뀔 수 있다
    private String email;           // 바뀔 수 있다
    private Address address;        // 바뀔 수 있다

    // name이 바뀌어도 같은 Customer이다
    // id가 같으면 동일한 Customer이다
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;엔티티의 핵심 규칙:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;반드시 고유한 식별자(ID)를 가진다.&lt;/li&gt;
&lt;li&gt;라이프사이클이 있다 (생성 &amp;rarr; 변경 &amp;rarr; 삭제).&lt;/li&gt;
&lt;li&gt;속성이 달라져도 ID가 같으면 같은 객체이다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자신의 비즈니스 규칙을 스스로 관리한다&lt;/b&gt; (이것이 핵심이다).&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;// ❌ 나쁜 예: 빈혈 모델 (Anemic Model) &amp;mdash; 엔티티에 로직이 없다
public class Order {
    private Long id;
    private String status;
    private BigDecimal totalPrice;

    // getter, setter만 있다
    public String getStatus() { return status; }
    public void setStatus(String status) { this.status = status; }
}

// 비즈니스 로직이 Service에 흩어져 있다
public class OrderService {
    public void cancelOrder(Long orderId) {
        Order order = repository.findById(orderId);
        if (order.getStatus().equals(&quot;SHIPPED&quot;)) {     // 규칙이 여기에 있다
            throw new RuntimeException(&quot;취소 불가&quot;);
        }
        order.setStatus(&quot;CANCELLED&quot;);                   // 아무나 상태를 바꿀 수 있다
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;// ✅ 좋은 예: 풍부한 모델 (Rich Model) &amp;mdash; 엔티티가 자기 규칙을 안다
public class Order {
    private final OrderId id;
    private OrderStatus status;
    private Money totalPrice;

    // setter가 없다! 상태 변경은 비즈니스 의미가 있는 메서드로만 가능하다
    public void cancel() {
        if (this.status == OrderStatus.SHIPPED) {
            throw new OrderAlreadyShippedException();
        }
        if (this.status == OrderStatus.CANCELLED) {
            throw new OrderAlreadyCancelledException();
        }
        this.status = OrderStatus.CANCELLED;
    }

    public void ship() {
        if (this.status != OrderStatus.PAID) {
            throw new OrderNotPaidException();
        }
        this.status = OrderStatus.SHIPPED;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;setStatus(&quot;CANCELLED&quot;)&lt;/code&gt; 대신 &lt;code&gt;cancel()&lt;/code&gt;이라는 &lt;b&gt;비즈니스 의미가 있는 메서드&lt;/b&gt;를 사용한다. 이 안에 &quot;취소할 수 있는 조건&quot;이라는 비즈니스 규칙이 들어 있다. 이것이 DDD에서 말하는 &lt;b&gt;풍부한 도메인 모델(Rich Domain Model)&lt;/b&gt;이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.2.2 값 객체 (Value Object)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;한 줄 설명:&lt;/b&gt; ID가 없고, 값 자체가 의미인 객체이다. 불변(immutable)이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;비유:&lt;/b&gt; 만원짜리 지폐를 생각해 보자. 내가 가진 만원과 친구가 가진 만원은 &quot;구별&quot;할 필요 없이 같은 가치이다. 우리는 지폐의 일련번호(ID)로 돈을 구분하지 않는다. 금액이라는 값 자체가 중요하다.&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;// 값 객체 예시 1: 돈
public record Money(BigDecimal amount, String currency) {

    // 불변이다 &amp;mdash; 새 객체를 반환한다
    public Money add(Money other) {
        if (!this.currency.equals(other.currency)) {
            throw new CurrencyMismatchException();
        }
        return new Money(this.amount.add(other.amount), this.currency);
    }
}

// 값 객체 예시 2: 주소
public record Address(String city, String district, String detail, String zipCode) {
    // 서울 강남구의 이 주소와 저 주소가 &quot;같은 곳&quot;이면 같은 Address이다
    // ID로 구분하지 않고, 값으로 비교한다
}

// 값 객체 예시 3: 기간
public record DateRange(LocalDate start, LocalDate end) {
    public DateRange {
        if (end.isBefore(start)) {
            throw new IllegalArgumentException(&quot;종료일이 시작일보다 앞설 수 없습니다&quot;);
        }
    }

    public boolean contains(LocalDate date) {
        return !date.isBefore(start) &amp;amp;&amp;amp; !date.isAfter(end);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;왜 그냥 String이나 int를 쓰면 안 되나요?&quot;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;// ❌ 원시 타입 사용 &amp;mdash; 의미가 불명확하고 실수하기 쉽다
public void createOrder(String customerId, int amount, String currency) {
    // customerId 자리에 실수로 상품명을 넣어도 컴파일러가 잡지 못한다!
}
createOrder(&quot;맥북 프로&quot;, 1000, &quot;KRW&quot;);  // 버그! 그런데 컴파일은 된다

// ✅ 값 객체 사용 &amp;mdash; 타입으로 실수를 방지한다
public void createOrder(CustomerId customerId, Money price) {
    // CustomerId 자리에 String을 넣으면 컴파일 에러!
}
createOrder(new CustomerId(&quot;C001&quot;), new Money(1000, &quot;KRW&quot;));  // 명확하다&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;값 객체를 사용하면 &lt;b&gt;타입 시스템이 실수를 잡아준다.&lt;/b&gt; 이것을 &quot;Primitive Obsession(원시 타입 집착)을 피한다&quot;고 한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.2.3 애그리거트 (Aggregate)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;한 줄 설명:&lt;/b&gt; 항상 함께 변경되어야 하는 객체들을 하나로 묶은 단위이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것은 DDD에서 가장 어렵지만 가장 중요한 개념이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;비유:&lt;/b&gt; 주문서를 생각해 보자. 주문서에는 주문 항목들이 있다. &quot;주문 항목 #3&quot;을 따로 다른 주문서로 옮기는 건 말이 안 된다. 주문서와 주문 항목은 항상 함께 존재하고, 함께 변경되어야 한다. 이 &quot;주문서 + 주문 항목들&quot;이 하나의 애그리거트이다.&lt;/p&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;// Order 애그리거트
// Order가 Aggregate Root (유일한 진입점)
public class Order {
    private final OrderId id;
    private final CustomerId customerId;        // 다른 애그리거트는 ID로만 참조!
    private final List&amp;lt;OrderLine&amp;gt; orderLines;   // 내부 객체
    private OrderStatus status;
    private Money totalPrice;

    // 외부에서는 반드시 Order(Root)를 통해서만 OrderLine을 조작한다
    public void addItem(ProductId productId, int quantity, Money unitPrice) {
        if (this.status != OrderStatus.DRAFT) {
            throw new OrderNotModifiableException();
        }
        this.orderLines.add(new OrderLine(productId, quantity, unitPrice));
        recalculateTotal();
    }

    public void removeItem(ProductId productId) {
        this.orderLines.removeIf(line -&amp;gt; line.getProductId().equals(productId));
        recalculateTotal();
    }

    private void recalculateTotal() {
        this.totalPrice = orderLines.stream()
            .map(OrderLine::subtotal)
            .reduce(Money.ZERO, Money::add);
    }
}

// OrderLine은 Order 없이는 존재할 수 없다
public class OrderLine {
    private final ProductId productId;
    private int quantity;
    private Money unitPrice;

    public Money subtotal() {
        return unitPrice.multiply(quantity);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;왜 애그리거트가 필요한가?&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;데이터 일관성 보장:&lt;/b&gt; 주문 항목이 변경되면 총액도 함께 바뀌어야 한다. 애그리거트 안에서 이걸 보장한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;동시성 제어:&lt;/b&gt; 애그리거트 단위로 락(lock)을 잡으면 된다. 두 사람이 동시에 같은 주문을 수정하는 것을 방지할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;트랜잭션 경계:&lt;/b&gt; 하나의 트랜잭션 = 하나의 애그리거트. 명확하고 단순하다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;초보자가 자주 하는 실수: 애그리거트를 너무 크게 만드는 것&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;php&quot;&gt;&lt;code&gt;// ❌ 너무 큰 애그리거트 &amp;mdash; Customer 안에 모든 것을 넣었다
public class Customer {
    private CustomerId id;
    private List&amp;lt;Order&amp;gt; orders;           // 주문 수백 개를 다 로딩?
    private List&amp;lt;Review&amp;gt; reviews;          // 리뷰도?
    private List&amp;lt;Address&amp;gt; addresses;       // 배송지도?
    private ShoppingCart cart;              // 장바구니도?
}
// Customer를 불러올 때마다 수백 개의 주문을 다 읽어야 한다. 성능 재앙!

// ✅ 적절한 크기 &amp;mdash; 각각 독립적인 애그리거트로 분리한다
public class Customer {
    private CustomerId id;
    private String name;
    private String email;
}

public class Order {
    private OrderId id;
    private CustomerId customerId;  // Customer를 ID로만 참조한다!
    private List&amp;lt;OrderLine&amp;gt; lines;
}

public class ShoppingCart {
    private CartId id;
    private CustomerId customerId;  // Customer를 ID로만 참조한다!
    private List&amp;lt;CartItem&amp;gt; items;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;규칙: 다른 애그리거트는 반드시 ID로만 참조한다. 객체를 직접 포함하지 않는다.&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.2.4 도메인 이벤트 (Domain Event)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;한 줄 설명:&lt;/b&gt; &quot;이런 일이 일어났어요&quot;를 알리는 메시지이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;비유:&lt;/b&gt; 회사에서 &quot;김대리가 퇴사했습니다&quot;라는 공지가 나면, 인사팀은 급여를 정리하고, IT팀은 계정을 삭제하고, 총무팀은 장비를 회수한다. 각 팀은 자기 할 일을 알아서 한다. 공지를 보낸 사람이 각 팀에 일일이 지시하지 않는다.&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;// 이벤트 정의 &amp;mdash; 과거형으로 이름 짓는다 (&quot;이런 일이 일어났다&quot;)
public record OrderPlacedEvent(OrderId orderId, CustomerId customerId, Money total) {}
public record OrderCancelledEvent(OrderId orderId, Money refundAmount) {}
public record PaymentCompletedEvent(PaymentId paymentId, OrderId orderId) {}

// 이벤트 발행
public class Order {
    public void place() {
        this.status = OrderStatus.PLACED;
        Events.publish(new OrderPlacedEvent(this.id, this.customerId, this.totalPrice));
    }
}

// 이벤트 처리 &amp;mdash; 각자 자기 할 일을 한다
// 재고 서비스
@EventListener
public void on(OrderPlacedEvent event) {
    stockService.reserve(event.orderId());  // 재고 차감
}

// 알림 서비스
@EventListener  
public void on(OrderPlacedEvent event) {
    notificationService.sendOrderConfirmation(event.customerId());  // 주문 확인 알림
}

// 포인트 서비스
@EventListener
public void on(OrderPlacedEvent event) {
    pointService.earnPoints(event.customerId(), event.total());  // 포인트 적립
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;왜 이벤트를 쓰는가?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트 없이 직접 호출하면 이렇게 된다.&lt;/p&gt;
&lt;pre class=&quot;axapta&quot;&gt;&lt;code&gt;// ❌ 이벤트 없이 &amp;mdash; Order가 모든 후속 작업을 직접 알아야 한다
public class OrderService {
    public void placeOrder(Order order) {
        orderRepository.save(order);
        stockService.reserve(order);                    // 재고
        notificationService.sendConfirmation(order);    // 알림
        pointService.earnPoints(order);                 // 포인트
        analyticsService.trackOrder(order);             // 분석
        // 새로운 후속 작업이 추가될 때마다 여기를 수정해야 한다!
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러면 주문 서비스가 재고, 알림, 포인트, 분석 서비스를 모두 알아야 한다. 결합도가 높아진다. 새로운 후속 작업(예: 쿠폰 발행)이 추가되면 이 코드를 수정해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트를 사용하면 Order는 &quot;주문이 완료되었다&quot;는 사실만 알리고, 나머지는 각 서비스가 알아서 처리한다. &lt;b&gt;느슨한 결합(Loose Coupling)&lt;/b&gt;이 실현된다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.2.5 리포지토리 (Repository)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;한 줄 설명:&lt;/b&gt; 애그리거트를 저장하고 꺼내오는 창구이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;비유:&lt;/b&gt; 도서관의 사서와 같다. 우리는 &quot;이 책 좀 찾아주세요&quot;라고 하면 사서가 서가에서 찾아다 준다. 책이 서가의 어디에 있는지(DB 테이블, SQL 쿼리) 우리가 알 필요 없다.&lt;/p&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;// 도메인 계층 &amp;mdash; &quot;무엇을&quot; 할 수 있는지만 정의한다 (인터페이스)
public interface OrderRepository {
    Order findById(OrderId id);
    void save(Order order);
    List&amp;lt;Order&amp;gt; findByCustomer(CustomerId customerId);
}

// 인프라 계층 &amp;mdash; &quot;어떻게&quot; 하는지를 구현한다
public class JpaOrderRepository implements OrderRepository {

    @Override
    public Order findById(OrderId id) {
        // JPA, MyBatis, 순수 JDBC 등 무엇이든 가능
        // 도메인 코드는 이 구현을 모른다!
        OrderEntity entity = em.find(OrderEntity.class, id.getValue());
        return entity.toDomain();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;왜 인터페이스와 구현을 나누는가?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도메인 모델이 DB 기술에 의존하지 않게 하기 위해서이다. JPA를 MyBatis로 바꾸거나, MySQL을 MongoDB로 바꿔도 도메인 코드는 전혀 수정할 필요 없다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.2.6 도메인 서비스 (Domain Service)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;한 줄 설명:&lt;/b&gt; 하나의 엔티티에 넣기 애매한 비즈니스 로직을 담는 곳이다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;// &quot;할인 금액 계산&quot;은 Order에 넣을까, Customer에 넣을까?
// 둘 다 참여하는 로직이므로 도메인 서비스에 둔다.
public class DiscountCalculator {

    public Money calculateDiscount(Order order, Customer customer) {
        Money discount = Money.ZERO;

        // VIP 고객 할인
        if (customer.getGrade() == Grade.VIP) {
            discount = discount.add(order.getTotal().multiply(0.05));
        }

        // 대량 주문 할인
        if (order.getItemCount() &amp;gt;= 10) {
            discount = discount.add(order.getTotal().multiply(0.03));
        }

        return discount;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주의:&lt;/b&gt; 도메인 서비스를 남용하면 엔티티가 비어버린다(빈혈 모델). 가능하면 엔티티 안에 로직을 넣고, 정말로 여러 엔티티에 걸친 로직만 도메인 서비스로 뺀다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.2.7 애플리케이션 서비스 (Application Service)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;한 줄 설명:&lt;/b&gt; 유스케이스의 흐름을 조율하는 지휘자이다. 비즈니스 로직은 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;비유:&lt;/b&gt; 오케스트라의 지휘자와 같다. 지휘자는 악기를 직접 연주하지 않는다(비즈니스 로직을 직접 수행하지 않는다). 각 연주자(도메인 객체)에게 &quot;자, 이제 당신 차례&quot;라고 신호를 보내고, 전체 흐름을 조율한다.&lt;/p&gt;
&lt;pre class=&quot;axapta&quot;&gt;&lt;code&gt;// Application Service &amp;mdash; 흐름만 조율한다 (비즈니스 로직 없음!)
public class PlaceOrderUseCase {

    private final OrderRepository orderRepository;
    private final CustomerRepository customerRepository;
    private final DiscountCalculator discountCalculator;
    private final EventPublisher eventPublisher;

    @Transactional  // 트랜잭션 관리는 여기서
    public OrderId execute(PlaceOrderCommand command) {
        // 1. 필요한 도메인 객체를 가져온다
        Customer customer = customerRepository.findById(command.customerId());

        // 2. 도메인 객체에게 일을 시킨다
        Order order = Order.create(customer.getId(), command.items());
        Money discount = discountCalculator.calculateDiscount(order, customer);
        order.applyDiscount(discount);
        order.place();

        // 3. 결과를 저장한다
        orderRepository.save(order);

        // 4. 이벤트를 발행한다
        eventPublisher.publish(new OrderPlacedEvent(order.getId()));

        return order.getId();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드를 읽으면 &lt;b&gt;비즈니스 프로세스가 한눈에 보인다:&lt;/b&gt; 고객을 찾고 &amp;rarr; 주문을 만들고 &amp;rarr; 할인을 적용하고 &amp;rarr; 주문을 확정하고 &amp;rarr; 저장하고 &amp;rarr; 알린다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Part 4. 어디에 쓰는가? &amp;mdash; 사용 범위&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.1 DDD를 써야 하는 상황&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;이럴 때 DDD가 빛난다&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상황 1: 비즈니스 규칙이 복잡하다&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보험 가입 심사, 대출 승인, 가격 정책 등&lt;/li&gt;
&lt;li&gt;&lt;code&gt;if-else&lt;/code&gt;가 수십 개 중첩되기 시작하면 DDD를 고려한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상황 2: 여러 팀이 하나의 시스템을 만든다&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;바운디드 컨텍스트로 팀별 경계를 나누면 독립적으로 개발할 수 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상황 3: 시스템이 오래 유지보수될 예정이다&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;3~5년 이상 운영될 시스템이라면 초기 투자 가치가 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상황 4: 마이크로서비스로 가려고 한다&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;바운디드 컨텍스트가 마이크로서비스의 경계가 된다&lt;/li&gt;
&lt;li&gt;DDD 없이 마이크로서비스를 나누면 &quot;분산된 모놀리스&quot;라는 최악의 결과가 나올 수 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상황 5: 도메인 전문가(기획자, 현업)와 협업할 수 있다&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;DDD의 핵심은 도메인 전문가와의 소통이다&lt;/li&gt;
&lt;li&gt;이 전제가 성립하지 않으면 DDD의 효과가 크게 줄어든다&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.2 DDD를 쓰지 않아도 되는 상황&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;이럴 때는 과도하다&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상황 1: 단순 CRUD 앱&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;게시판, 관리자 페이지처럼 데이터를 넣고 빼는 게 전부라면 DDD는 오버엔지니어링이다&lt;/li&gt;
&lt;li&gt;그냥 Controller &amp;rarr; Service &amp;rarr; Repository 구조로 충분하다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상황 2: 프로토타입 / MVP&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;빨리 만들어서 시장 반응을 봐야 하는 단계라면 DDD는 속도를 늦춘다&lt;/li&gt;
&lt;li&gt;먼저 만들고, 성공하면 나중에 리팩토링한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상황 3: 기술 중심 시스템&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;로그 수집, ETL 파이프라인, 파일 변환 도구 등&lt;/li&gt;
&lt;li&gt;비즈니스 규칙보다 기술적 처리가 핵심인 시스템에는 맞지 않는다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상황 4: 혼자 또는 소규모 팀의 단기 프로젝트&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;3개월 안에 끝나는 1~2명의 프로젝트라면 간단한 구조가 낫다&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.3 판단 기준 체크리스트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 질문에 &quot;예&quot;가 3개 이상이면 DDD를 진지하게 고려해볼 만하다.&lt;/p&gt;
&lt;pre class=&quot;lsl&quot;&gt;&lt;code&gt;□ 비즈니스 규칙이 자주 바뀌거나 복잡한가?
□ 도메인 전문가(기획자, 현업)가 프로젝트에 참여하는가?
□ 시스템을 2년 이상 유지보수할 예정인가?
□ 3명 이상의 개발자가 같은 코드베이스에서 일하는가?
□ &quot;이 코드 왜 이렇게 됐지?&quot; 하는 상황이 자주 발생하는가?
□ 새로운 기능을 추가할 때 기존 코드를 많이 수정해야 하는가?
□ 마이크로서비스 아키텍처를 계획하고 있는가?&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Part 5. 아키텍처 &amp;mdash; DDD 코드를 어떤 구조로 정리하는가&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5.1 계층형 아키텍처 (Layered Architecture)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 기본적인 구조이다. 각 계층은 아래 계층만 사용할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;  com.example.order
├──   presentation          &amp;larr; 1. 사용자 인터페이스 계층
│   ├── OrderController.java       사용자 요청을 받고 응답을 돌려준다
│   └── OrderResponse.java         응답 형태를 정의한다
│
├──   application            &amp;larr; 2. 응용 계층 (유스케이스)
│   ├── PlaceOrderUseCase.java     흐름을 조율한다 (비즈니스 로직 없음)
│   └── PlaceOrderCommand.java     입력 데이터를 담는다
│
├──   domain                 &amp;larr; 3. 도메인 계층 (핵심!)
│   ├── Order.java                 엔티티 + 비즈니스 규칙
│   ├── OrderLine.java             내부 엔티티
│   ├── Money.java                 값 객체
│   ├── OrderStatus.java           값 객체 (Enum)
│   ├── OrderRepository.java       리포지토리 인터페이스
│   └── DiscountCalculator.java    도메인 서비스
│
└──   infrastructure         &amp;larr; 4. 인프라 계층
    ├── JpaOrderRepository.java    리포지토리 구현
    ├── OrderJpaEntity.java        DB 매핑용 엔티티
    └── KafkaEventPublisher.java   이벤트 발행 구현&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 &lt;b&gt;의존성 방향&lt;/b&gt;이다. 도메인 계층은 다른 어떤 계층에도 의존하지 않는다. 인프라 계층이 도메인 계층에 의존한다 (화살표가 안쪽을 향한다).&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5.2 헥사고날 아키텍처 (Hexagonal Architecture)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계층형보다 한 단계 진화한 구조이다. 도메인을 중심에 놓고, 외부와의 연결을 &quot;포트&quot;와 &quot;어댑터&quot;로 분리한다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;           외부 세계 (들어오는 쪽)
    ┌─────────────────────────────┐
    │  REST API   │  GraphQL  │  CLI │     &amp;larr; Driving Adapters
    └──────┬──────┴─────┬─────┴──┬──┘        (입력을 받는 것들)
           │            │        │
    ═══════╪════════════╪════════╪═══════
           ▼            ▼        ▼
    ┌─────────────────────────────────┐
    │        Input Ports               │     &amp;larr; 유스케이스 인터페이스
    │  (PlaceOrderUseCase 등)         │
    ├─────────────────────────────────┤
    │                                 │
    │         Domain Model            │     &amp;larr; 핵심 비즈니스 로직
    │    (Order, Customer, Money)      │        (프레임워크 의존성 없음!)
    │                                 │
    ├─────────────────────────────────┤
    │        Output Ports              │     &amp;larr; 리포지토리 인터페이스
    │  (OrderRepository 등)           │
    └──────┬──────┬─────────┬─────────┘
           │      │         │
    ═══════╪══════╪═════════╪════════════
           ▼      ▼         ▼
    ┌──────┴──────┴─────────┴─────────┐
    │  JPA  │  Kafka  │  외부 API      │     &amp;larr; Driven Adapters
    └─────────────────────────────────┘        (외부 시스템 연결)
           외부 세계 (나가는 쪽)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점:&lt;/b&gt; 도메인 모델에 Spring, JPA 같은 프레임워크 의존성이 전혀 없다. 도메인 모델만 따로 테스트할 수 있고, 기술을 바꿔도 도메인은 건드리지 않는다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5.3 CQRS &amp;mdash; 읽기와 쓰기를 분리한다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;왜 분리하는가?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쓰기(명령)와 읽기(조회)는 요구사항이 완전히 다르다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;쓰기&lt;/b&gt;: 비즈니스 규칙 검증이 중요하다. 도메인 모델을 거쳐야 한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;읽기&lt;/b&gt;: 빠르게 화면에 뿌릴 데이터를 가져오는 게 중요하다. 도메인 모델을 거칠 필요가 없다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;┌─────────────────────────────────────────────────┐
│                    Client                        │
└────────┬────────────────────────────┬────────────┘
         │                            │
    ┌────▼─────┐                 ┌────▼─────┐
    │ Command  │                 │  Query   │
    │  Side    │                 │  Side    │
    ├──────────┤                 ├──────────┤
    │ 도메인    │   이벤트로      │ 읽기     │
    │ 모델을   │ ──동기화──▶     │ 전용     │
    │ 통과     │                 │ 모델     │
    ├──────────┤                 ├──────────┤
    │ 정규화된 │                 │ 비정규화  │
    │ DB       │                 │ DB/캐시  │
    └──────────┘                 └──────────┘

    &quot;주문 생성&quot;                   &quot;내 주문 목록 조회&quot;
    &quot;주문 취소&quot;                   &quot;주문 상세 보기&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Part 6. 실전에서 시작하는 방법&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.1 이벤트 스토밍 (Event Storming) &amp;mdash; DDD의 시작점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트 스토밍은 &lt;b&gt;포스트잇을 사용한 워크숍&lt;/b&gt;으로, 개발자와 기획자가 함께 도메인을 탐색하는 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;준비물:&lt;/b&gt; 넓은 벽, 여러 색상의 포스트잇, 마커&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;진행 방법을 음식 배달 서비스로 예시를 들면 이렇다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1단계: 도메인 이벤트 나열하기 (주황색 포스트잇)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;무엇이 일어났는가?&quot;를 과거형으로 적는다&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;[고객이 회원가입했다]  [메뉴를 검색했다]  [장바구니에 담았다]
[주문이 접수되었다]  [가게가 주문을 확인했다]  [조리가 시작되었다]
[조리가 완료되었다]  [배달원이 배정되었다]  [배달이 시작되었다]
[배달이 완료되었다]  [고객이 리뷰를 작성했다]  [환불이 처리되었다]&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이벤트를 발생시킨 행위를 적는다&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;[주문하기] &amp;rarr; [주문이 접수되었다]
[주문 확인하기] &amp;rarr; [가게가 주문을 확인했다]
[배달원 배정하기] &amp;rarr; [배달원이 배정되었다]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3단계: 애그리거트 식별 (노란색 포스트잇)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;커맨드를 처리하는 주체를 적는다&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;scss&quot;&gt;&lt;code&gt;           Order             Delivery          Restaurant
            │                  │                  │
    [주문하기]──▶[주문접수됨]    │                  │
            │          [배달원배정]──▶[배달원배정됨]  │
            │                  │      [주문확인]──▶[주문확인됨]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4단계: 바운디드 컨텍스트 도출&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;관련된 것들을 묶어서 경계를 긋는다&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;┌── 주문 컨텍스트 ──┐  ┌── 배달 컨텍스트 ──┐  ┌── 가게 컨텍스트 ──┐
│ Order            │  │ Delivery          │  │ Restaurant        │
│ OrderItem        │  │ DeliveryDriver    │  │ Menu              │
│ Payment          │  │ Route             │  │ OperatingHours    │
└──────────────────┘  └───────────────────┘  └───────────────────┘&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.2 점진적 도입 &amp;mdash; 한 번에 다 하려고 하지 말 것&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DDD를 처음부터 완벽하게 적용하려고 하면 실패한다. 단계적으로 도입한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1주차: 유비쿼터스 언어만 도입한다&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드의 클래스명, 메서드명을 비즈니스 용어로 바꾼다&lt;/li&gt;
&lt;li&gt;&lt;code&gt;processData()&lt;/code&gt; &amp;rarr; &lt;code&gt;calculateDeliveryFee()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;이것만으로도 코드 가독성이 크게 좋아진다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2~4주차: 값 객체를 도입한다&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;code&gt;String email&lt;/code&gt; &amp;rarr; &lt;code&gt;Email email&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;int price&lt;/code&gt; &amp;rarr; &lt;code&gt;Money price&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;기존 코드를 크게 바꾸지 않아도 적용할 수 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1~2개월차: 핵심 엔티티에 비즈니스 로직을 넣는다&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가장 중요한 도메인 객체부터 시작한다&lt;/li&gt;
&lt;li&gt;Service에 있던 로직을 Entity로 옮긴다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3개월 이후: 바운디드 컨텍스트를 나눈다&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템의 경계를 식별하고 분리한다&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.3 초보자가 가장 많이 하는 실수 TOP 5&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실수 1: 패턴에 집착한다&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;이 클래스는 Value Object인가 Entity인가?&quot; 같은 분류에 시간을 쏟는다&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;실수 2: 모든 곳에 DDD를 적용한다&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;회원가입 페이지에 Aggregate, Domain Event를 적용할 필요 없다&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;실수 3: 빈혈 모델을 만든다 (Anemic Domain Model)&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;Entity에 getter/setter만 있고, 로직은 전부 Service에 있다&lt;/li&gt;
&lt;li&gt;이러면 DDD를 적용했다고 볼 수 없다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실수 4: 기술부터 고민한다&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;Kafka를 쓸까, RabbitMQ를 쓸까?&quot;보다&lt;/li&gt;
&lt;li&gt;&quot;주문 취소 시 재고는 어떻게 되지?&quot;가 먼저이다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실수 5: 애그리거트를 너무 크게 만든다&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 애그리거트에 관련된 모든 것을 넣는다&lt;/li&gt;
&lt;li&gt;애그리거트는 작게, 다른 애그리거트는 ID로만 참조한다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Part 7. 현실 세계 예시 &amp;mdash; 배달 앱 만들기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 배운 개념을 종합해서, 간단한 배달 앱의 DDD 설계를 해보자.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7.1 서브도메인 분류&lt;/h3&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;Core Domain (핵심):
  - 주문 관리: 주문 생성, 상태 관리, 취소/환불
  - 배달원 매칭: 최적의 배달원 배정 알고리즘

Supporting Subdomain (지원):
  - 가게 관리: 가게 등록, 메뉴 관리
  - 리뷰: 평점, 리뷰 작성

Generic Subdomain (일반):
  - 인증: 로그인/회원가입 &amp;rarr; Firebase Auth 사용
  - 결제: PG사 연동 &amp;rarr; 토스페이먼츠 사용
  - 알림: 푸시 알림 &amp;rarr; FCM 사용&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7.2 바운디드 컨텍스트와 도메인 모델&lt;/h3&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 주문 컨텍스트 (Core Domain &amp;mdash; DDD 적극 적용)
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

// 값 객체
public record OrderId(String value) {}
public record Money(int amount) {
    public Money add(Money other) { return new Money(this.amount + other.amount); }
    public Money multiply(int qty) { return new Money(this.amount * qty); }
}
public record DeliveryAddress(String city, String detail, double lat, double lng) {}

// 엔티티 + 애그리거트 루트
public class Order {
    private final OrderId id;
    private final String customerId;
    private final String restaurantId;
    private final List&amp;lt;OrderItem&amp;gt; items;
    private final DeliveryAddress deliveryAddress;
    private OrderStatus status;
    private Money totalPrice;

    // 주문 생성
    public static Order create(String customerId, String restaurantId,
                               List&amp;lt;OrderItem&amp;gt; items, DeliveryAddress address) {
        if (items.isEmpty()) {
            throw new EmptyOrderException(&quot;주문 항목이 비어 있습니다&quot;);
        }
        Order order = new Order(OrderId.generate(), customerId, restaurantId,
                                items, address, OrderStatus.CREATED);
        order.calculateTotal();
        return order;
    }

    // 주문 접수
    public void accept() {
        if (this.status != OrderStatus.CREATED) {
            throw new InvalidOrderStateException(&quot;접수 대기 상태가 아닙니다&quot;);
        }
        this.status = OrderStatus.ACCEPTED;
    }

    // 주문 취소
    public void cancel(String reason) {
        if (this.status.isAfter(OrderStatus.PREPARING)) {
            throw new OrderCannotBeCancelledException(&quot;조리 시작 후에는 취소할 수 없습니다&quot;);
        }
        this.status = OrderStatus.CANCELLED;
    }

    // 환불 금액 계산 &amp;mdash; 비즈니스 규칙이 여기에 있다
    public Money calculateRefundAmount() {
        return switch (this.status) {
            case CREATED, ACCEPTED -&amp;gt; this.totalPrice;                         // 전액 환불
            case PREPARING -&amp;gt; new Money((int)(this.totalPrice.amount() * 0.9)); // 90% 환불
            default -&amp;gt; throw new RefundNotAvailableException();
        };
    }

    private void calculateTotal() {
        this.totalPrice = items.stream()
            .map(item -&amp;gt; item.getPrice().multiply(item.getQuantity()))
            .reduce(Money.ZERO, Money::add);
    }
}

// 도메인 이벤트
public record OrderAcceptedEvent(OrderId orderId, String restaurantId) {}
public record OrderCancelledEvent(OrderId orderId, Money refundAmount) {}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 가게 컨텍스트 (Supporting &amp;mdash; 적절한 수준의 설계)
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

// 여기서는 DDD를 적극적으로 쓰지 않아도 된다
// 간단한 CRUD에 가까우므로 일반적인 구조로 충분하다
public class Restaurant {
    private String id;
    private String name;
    private List&amp;lt;MenuItem&amp;gt; menu;
    private OperatingHours operatingHours;

    public boolean isOpen() {
        return operatingHours.includes(LocalTime.now());
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7.3 컨텍스트 간 통신&lt;/h3&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;┌── 주문 컨텍스트 ──┐          ┌── 배달 컨텍스트 ──┐
│                   │          │                   │
│  Order.accept()   │          │                   │
│       │           │          │                   │
│  OrderAccepted  ──┼── 이벤트 ──▶ DeliveryService │
│    Event          │          │   .assignDriver() │
│                   │          │                   │
└───────────────────┘          └───────────────────┘

┌── 주문 컨텍스트 ──┐          ┌── 결제 컨텍스트 ──┐
│                   │          │                   │
│  Order.cancel()   │          │                   │
│       │           │          │                   │
│  OrderCancelled ──┼── 이벤트 ──▶ PaymentService  │
│    Event          │          │   .refund()       │
│                   │          │                   │
└───────────────────┘          └───────────────────┘&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 컨텍스트는 이벤트를 통해 느슨하게 연결된다. 주문 컨텍스트는 배달이 어떻게 이루어지는지 모르고, 배달 컨텍스트는 주문이 어떻게 만들어지는지 모른다. 각자 자기 일에만 집중한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Part 8. 자주 묻는 질문 (FAQ)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Q: DDD를 배우려면 얼마나 걸리나요?&lt;/b&gt;&lt;br /&gt;기본 개념은 1&lt;/p&gt;
&lt;p&gt;&lt;del&gt;2주면 이해할 수 있다. 하지만 실전에서 능숙하게 적용하려면 6개월&lt;/del&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1년의 경험이 필요하다. 핵심은 &quot;도메인을 이해하려는 태도&quot;이지 &quot;패턴을 외우는 것&quot;이 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Q: DDD와 마이크로서비스는 같은 건가요?&lt;/b&gt;&lt;br /&gt;아니다. DDD는 설계 방법론이고, 마이크로서비스는 아키텍처 스타일이다. 다만 DDD의 바운디드 컨텍스트가 마이크로서비스의 경계를 정하는 데 매우 유용하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Q: 작은 프로젝트에서도 DDD를 써야 하나요?&lt;/b&gt;&lt;br /&gt;전부 적용할 필요는 없다. 유비쿼터스 언어, 값 객체, 풍부한 도메인 모델 정도만 적용해도 코드 품질이 크게 좋아진다. 이것들은 프로젝트 규모와 관계없이 유용하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Q: DDD를 쓰면 코드가 더 많아지지 않나요?&lt;/b&gt;&lt;br /&gt;맞다. 초기 코드량은 늘어난다. 하지만 시간이 지날수록 변경이 쉽고, 버그가 줄어들며, 새 팀원의 온보딩이 빨라진다. 장기적으로는 총 비용이 줄어든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Q: 기존 프로젝트에 DDD를 적용할 수 있나요?&lt;/b&gt;&lt;br /&gt;가능하다. &quot;Strangler Fig Pattern&quot;을 사용하여 기존 시스템을 감싸면서 점진적으로 DDD를 적용할 수 있다. 한꺼번에 바꾸려 하지 말고, 가장 복잡하고 자주 변경되는 부분부터 시작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Q: Spring/JPA 없이도 DDD를 할 수 있나요?&lt;/b&gt;&lt;br /&gt;당연하다. DDD는 특정 프레임워크에 종속되지 않는다. Python, TypeScript, Go, 어떤 언어/프레임워크에서도 적용할 수 있다. 오히려 프레임워크 없이 순수한 도메인 모델을 만드는 것이 DDD의 이상에 더 가깝다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리: DDD의 본질&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DDD의 본질은 패턴이나 아키텍처가 아니다. 본질은 이것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;소프트웨어가 해결하려는 문제를 깊이 이해하고, 그 이해를 코드에 그대로 반영하는 것&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기술은 변한다. Spring이 사라질 수도, JPA 대신 다른 것이 나올 수도 있다. 하지만 비즈니스를 코드로 표현하는 능력은 어떤 기술 스택에서든 가치 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DDD를 처음 배울 때는 어렵게 느껴질 수 있다. 하지만 핵심은 단순하다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;비즈니스를 이해하라.&lt;/li&gt;
&lt;li&gt;비즈니스 용어를 코드에 그대로 사용하라.&lt;/li&gt;
&lt;li&gt;비즈니스 규칙을 도메인 객체에 넣어라.&lt;/li&gt;
&lt;li&gt;경계를 나누어 복잡성을 관리하라.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 네 가지만 기억하면 DDD의 80%를 이해한 것이다.&lt;/p&gt;</description>
      <category>etc</category>
      <category>DDD (Domain-Driven Design)</category>
      <category>DDD 란</category>
      <category>DDD 사용법</category>
      <category>Domain-Driven Design</category>
      <author>은둔한량</author>
      <guid isPermaLink="true">https://koreanred.tistory.com/204</guid>
      <comments>https://koreanred.tistory.com/204#entry204comment</comments>
      <pubDate>Thu, 26 Mar 2026 20:20:05 +0900</pubDate>
    </item>
    <item>
      <title>Get Shit Done (GSD) 완전 가이드</title>
      <link>https://koreanred.tistory.com/203</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GSD는 Claude Code 위에서 동작하는 &lt;b&gt;프로젝트 관리 + 자동 실행 워크플로우 시스템&lt;/b&gt;입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#1-gsd%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80&quot;&gt;GSD란 무엇인가?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0&quot;&gt;설치하기&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3-%ED%95%B5%EC%8B%AC-%EA%B0%9C%EB%85%90-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0&quot;&gt;핵심 개념 이해하기&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#4-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0&quot;&gt;프로젝트 시작하기&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#5-%EC%A0%84%EC%B2%B4-%EC%9B%8C%ED%81%AC%ED%94%8C%EB%A1%9C%EC%9A%B0-%ED%9D%90%EB%A6%84&quot;&gt;전체 워크플로우 흐름&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#6-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%83%81%EC%84%B8-%EA%B0%80%EC%9D%B4%EB%93%9C&quot;&gt;명령어 상세 가이드&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#7-%EC%84%A4%EC%A0%95-%EB%B0%8F-%EC%BB%A4%EC%8A%A4%ED%84%B0%EB%A7%88%EC%9D%B4%EC%A7%95&quot;&gt;설정 및 커스터마이징&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#8-%EC%8B%A4%EC%A0%84-%EC%8B%9C%EB%82%98%EB%A6%AC%EC%98%A4%EB%B3%84-%EC%82%AC%EC%9A%A9%EB%B2%95&quot;&gt;실전 시나리오별 사용법&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#9-%ED%8C%8C%EC%9D%BC-%EA%B5%AC%EC%A1%B0-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0&quot;&gt;파일 구조 이해하기&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#10-%EB%AA%A8%EB%8D%B8-%ED%94%84%EB%A1%9C%ED%95%84-%EC%8B%9C%EC%8A%A4%ED%85%9C&quot;&gt;모델 프로필 시스템&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#11-git-%ED%86%B5%ED%95%A9&quot;&gt;Git 통합&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#12-%ED%8A%B8%EB%9F%AC%EB%B8%94%EC%8A%88%ED%8C%85--faq&quot;&gt;트러블슈팅 &amp;amp; FAQ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#13-%EC%A0%84%EC%B2%B4-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%9A%94%EC%95%BD%ED%91%9C&quot;&gt;전체 명령어 요약표&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. GSD란 무엇인가?&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GitHub 저장소: &lt;a href=&quot;https://github.com/glittercowboy/get-shit-done&quot;&gt;https://github.com/glittercowboy/get-shit-done&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;배경&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code는 강력한 AI 코딩 도구이지만, &lt;b&gt;복잡한 프로젝트&lt;/b&gt;를 진행할 때는 몇 가지 한계가 있습니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대화 컨텍스트가 길어지면 앞부분을 잊어버림&lt;/li&gt;
&lt;li&gt;여러 단계의 작업을 체계적으로 추적하기 어려움&lt;/li&gt;
&lt;li&gt;작업 중간에 세션이 끊기면 맥락을 잃음&lt;/li&gt;
&lt;li&gt;큰 작업을 어떻게 나눌지 판단이 어려움&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GSD(Get Shit Done)&lt;/b&gt;는 이 문제들을 해결합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;GSD가 하는 일&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GSD는 마치 &lt;b&gt;프로젝트 매니저&lt;/b&gt;처럼 동작합니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;프로젝트를 분석&lt;/b&gt;하고 요구사항을 정리합니다&lt;/li&gt;
&lt;li&gt;작업을 &lt;b&gt;마일스톤 &amp;rarr; 페이즈 &amp;rarr; 플랜 &amp;rarr; 태스크&lt;/b&gt; 단위로 쪼갭니다&lt;/li&gt;
&lt;li&gt;각 단계를 &lt;b&gt;전문 AI 에이전트&lt;/b&gt;에게 위임하여 실행합니다&lt;/li&gt;
&lt;li&gt;완료된 작업을 &lt;b&gt;검증&lt;/b&gt;합니다&lt;/li&gt;
&lt;li&gt;모든 진행상황을 &lt;code&gt;.planning/&lt;/code&gt; 폴더에 &lt;b&gt;파일로 기록&lt;/b&gt;하여 세션이 끊겨도 이어갈 수 있습니다&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;비유로 이해하기&lt;/h3&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;일반 Claude Code 사용:
  &quot;이 기능 만들어줘&quot; &amp;rarr; Claude가 직접 코딩 &amp;rarr; 끝

GSD 사용:
  &quot;이 기능 만들어줘&quot;
  &amp;rarr; PM(GSD)이 요구사항 분석
  &amp;rarr; 리서처가 기술 조사
  &amp;rarr; 플래너가 실행 계획 작성
  &amp;rarr; 체커가 계획 검토
  &amp;rarr; 실행자가 코드 작성
  &amp;rarr; 검증자가 결과 확인
  &amp;rarr; 완료 보고&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 설치하기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1. 사전 요구사항&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GSD를 설치하기 전에 다음이 필요합니다:&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;요구사항&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Claude Code&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Anthropic의 공식 CLI 도구 (터미널에서 &lt;code&gt;claude&lt;/code&gt; 명령어로 실행)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Node.js&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;v18 이상 권장 (&lt;code&gt;node -v&lt;/code&gt;로 확인)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;npm / npx&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Node.js와 함께 설치됨 (&lt;code&gt;npx -v&lt;/code&gt;로 확인)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Git&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;버전 관리 (&lt;code&gt;git --version&lt;/code&gt;으로 확인)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Claude Code가 아직 없다면?&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;npm install -g @anthropic-ai/claude-code&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 후 &lt;code&gt;claude&lt;/code&gt; 명령어로 실행할 수 있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.2. GSD 설치&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;방법 1: 글로벌 설치 (추천)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 프로젝트에서 GSD를 사용하고 싶다면:&lt;/p&gt;
&lt;pre class=&quot;dsconfig&quot;&gt;&lt;code&gt;npx -y get-shit-done-cc@latest --claude --global&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 명령은 &lt;code&gt;~/.claude/&lt;/code&gt; 폴더에 GSD를 설치합니다. 어떤 프로젝트에서든 &lt;code&gt;/gsd:*&lt;/code&gt; 명령을 사용할 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;방법 2: 로컬(프로젝트별) 설치&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 프로젝트에서만 GSD를 사용하고 싶다면:&lt;/p&gt;
&lt;pre class=&quot;dsconfig&quot;&gt;&lt;code&gt;npx -y get-shit-done-cc@latest --claude --local&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 디렉토리의 &lt;code&gt;.claude/&lt;/code&gt; 폴더에 설치됩니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;방법 3: npm 글로벌 설치&lt;/h4&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;npm install -g get-shit-done-cc&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.3. 설치 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 완료되면 Claude Code를 실행하고 다음을 입력해봅니다:&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;/gsd:help&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어 목록이 표시되면 설치 성공입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.4. 설치되는 것들&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 시 다음 파일/폴더가 생성됩니다:&lt;/p&gt;
&lt;pre class=&quot;dsconfig&quot;&gt;&lt;code&gt;~/.claude/                         &amp;larr; (글로벌 설치 기준)
├── get-shit-done/                 &amp;larr; GSD 코어 파일
│   ├── bin/                       &amp;larr; 실행 스크립트 &amp;amp; 라이브러리
│   ├── commands/                  &amp;larr; CLI 명령어 정의
│   ├── workflows/                 &amp;larr; 워크플로우 정의 (60+개)
│   ├── references/                &amp;larr; 참조 문서 (17개)
│   ├── templates/                 &amp;larr; 프로젝트 템플릿 (26개)
│   └── VERSION                    &amp;larr; 현재 버전 파일
│
├── agents/                        &amp;larr; GSD 전문 에이전트 (18개)
│   ├── gsd-planner.md
│   ├── gsd-executor.md
│   ├── gsd-verifier.md
│   └── ... (15개 더)
│
├── hooks/                         &amp;larr; 자동 실행 훅
│   ├── gsd-check-update.js        &amp;larr; 세션 시작 시 업데이트 확인
│   ├── gsd-context-monitor.js     &amp;larr; 컨텍스트 사용량 모니터링
│   ├── gsd-prompt-guard.js        &amp;larr; 프롬프트 가드
│   └── gsd-statusline.js          &amp;larr; 상태 표시줄
│
├── gsd-file-manifest.json         &amp;larr; 파일 무결성 검증용 매니페스트
└── settings.json                  &amp;larr; (기존 파일에 훅 설정 추가)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.5. 훅(Hook) 자동 설정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 시 &lt;code&gt;~/.claude/settings.json&lt;/code&gt;에 다음 훅들이 자동으로 등록됩니다:&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;훅&lt;/th&gt;
&lt;th&gt;트리거 시점&lt;/th&gt;
&lt;th&gt;역할&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gsd-check-update.js&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;세션 시작&lt;/td&gt;
&lt;td&gt;새 버전이 있는지 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gsd-context-monitor.js&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;도구 사용 후&lt;/td&gt;
&lt;td&gt;토큰 사용량 추적, 컨텍스트 부족 경고&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gsd-prompt-guard.js&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;파일 쓰기 전&lt;/td&gt;
&lt;td&gt;안전성 검증&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gsd-statusline.js&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;상시&lt;/td&gt;
&lt;td&gt;현재 상태 표시&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.6. 업데이트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GSD를 최신 버전으로 업데이트하려면 Claude Code 안에서:&lt;/p&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;/gsd:update&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 터미널에서 직접:&lt;/p&gt;
&lt;pre class=&quot;dsconfig&quot;&gt;&lt;code&gt;npx -y get-shit-done-cc@latest --claude --global&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;업데이트 시 보존되는 것들:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 만든 커스텀 명령어/에이전트 (gsd- 접두사가 아닌 것)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커스텀 훅&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CLAUDE.md 파일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬에서 수정한 GSD 파일 (&lt;code&gt;gsd-local-patches/&lt;/code&gt;에 백업됨)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.7. 다른 AI CLI에서도 사용 가능&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GSD는 Claude Code 외에도 여러 AI CLI 도구를 지원합니다:&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;런타임&lt;/th&gt;
&lt;th&gt;설치 플래그&lt;/th&gt;
&lt;th&gt;설정 디렉토리&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Claude Code&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--claude&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.claude/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;OpenCode&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--opencode&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.config/opencode/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Gemini CLI&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--gemini&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.gemini/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Codex&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--codex&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$CODEX_HOME/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환경변수로 커스텀 경로도 지정 가능합니다:&lt;/p&gt;
&lt;pre class=&quot;dsconfig&quot;&gt;&lt;code&gt;CLAUDE_CONFIG_DIR=/custom/path npx -y get-shit-done-cc@latest --claude --global&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 핵심 개념 이해하기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;계층 구조&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GSD는 작업을 4단계 계층으로 관리합니다:&lt;/p&gt;
&lt;pre class=&quot;gcode&quot;&gt;&lt;code&gt;프로젝트 (Project)
  └── 마일스톤 (Milestone) &amp;mdash; v1.0, v2.0 같은 큰 릴리즈 단위
        └── 페이즈 (Phase) &amp;mdash; 마일스톤을 이루는 각 단계 (Phase 1, 2, 3...)
              └── 플랜 (Plan) &amp;mdash; 페이즈 안의 구체적 실행 계획
                    └── 태스크 (Task) &amp;mdash; 플랜 안의 개별 작업 항목&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;프로젝트: 온라인 쇼핑몰
  └── 마일스톤 v1.0: MVP 출시
        ├── Phase 1: 사용자 인증 시스템
        │     ├── Plan 1: 데이터베이스 스키마 설계
        │     └── Plan 2: 로그인/회원가입 API 구현
        ├── Phase 2: 상품 관리 기능
        │     ├── Plan 1: 상품 CRUD API
        │     └── Plan 2: 상품 이미지 업로드
        └── Phase 3: 주문/결제 시스템
              └── ...&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주요 문서 파일들&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GSD는 &lt;code&gt;.planning/&lt;/code&gt; 폴더에 여러 문서를 생성합니다:&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;파일&lt;/th&gt;
&lt;th&gt;역할&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PROJECT.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;프로젝트 전체 개요, 목표, 제약조건&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;REQUIREMENTS.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;상세 요구사항 목록&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ROADMAP.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;마일스톤별 페이즈 목록과 진행상태&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;STATE.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;현재 진행 상태 추적 (어디까지 했는지)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CONTEXT.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;페이즈별 설계 결정사항 기록&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PLAN.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;각 페이즈의 구체적 실행 계획&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SUMMARY.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;실행 완료 후 결과 요약&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UAT.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;사용자 수용 테스트 체크리스트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;config.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GSD 설정값&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;전문 에이전트들&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GSD는 작업 종류에 따라 전문화된 AI 에이전트를 사용합니다:&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;에이전트&lt;/th&gt;
&lt;th&gt;역할&lt;/th&gt;
&lt;th&gt;비유&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;gsd-project-researcher&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;프로젝트 초기 조사&lt;/td&gt;
&lt;td&gt;시장조사 담당자&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;gsd-phase-researcher&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;페이즈별 기술 조사&lt;/td&gt;
&lt;td&gt;기술 리서처&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;gsd-planner&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;실행 계획 작성&lt;/td&gt;
&lt;td&gt;프로젝트 매니저&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;gsd-plan-checker&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;계획 품질 검토&lt;/td&gt;
&lt;td&gt;QA 리뷰어&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;gsd-executor&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;실제 코드 작성/실행&lt;/td&gt;
&lt;td&gt;개발자&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;gsd-verifier&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;완료된 작업 검증&lt;/td&gt;
&lt;td&gt;QA 테스터&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;gsd-debugger&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;버그 조사 및 수정&lt;/td&gt;
&lt;td&gt;디버거&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;gsd-codebase-mapper&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;기존 코드 분석&lt;/td&gt;
&lt;td&gt;코드 아키텍트&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 프로젝트 시작하기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.1. 새 프로젝트 초기화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 코드베이스에서 GSD를 처음 사용한다면:&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;/gsd:new-project&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 명령을 실행하면 GSD가 다음을 수행합니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;프로젝트에 대해 질문&lt;/b&gt;합니다 (목표, 범위, 제약조건 등)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;4개의 리서처 에이전트&lt;/b&gt;가 병렬로 코드베이스를 분석합니다&lt;/li&gt;
&lt;li&gt;분석 결과를 종합하여 &lt;b&gt;PROJECT.md&lt;/b&gt;를 생성합니다&lt;/li&gt;
&lt;li&gt;요구사항을 정리하여 &lt;b&gt;REQUIREMENTS.md&lt;/b&gt;를 생성합니다&lt;/li&gt;
&lt;li&gt;로드맵을 만들어 &lt;b&gt;ROADMAP.md&lt;/b&gt;를 생성합니다&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.planning/&lt;/code&gt; 폴더 전체 구조를 세팅합니다&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결과물:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;.planning/
  ├── config.json          &amp;larr; GSD 설정
  ├── PROJECT.md           &amp;larr; 프로젝트 개요
  ├── REQUIREMENTS.md      &amp;larr; 요구사항
  ├── ROADMAP.md           &amp;larr; 로드맵 (페이즈 목록)
  ├── STATE.md             &amp;larr; 진행 상태
  └── research/            &amp;larr; 리서치 결과물
        ├── ARCHITECTURE.md
        ├── FEATURES.md
        ├── PITFALLS.md
        ├── STACK.md
        └── SUMMARY.md&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.2. 기존 코드베이스 분석만 하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트를 시작하지 않고 코드 구조만 파악하고 싶다면:&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;/gsd:map-codebase&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4개의 전문 에이전트가 병렬로 코드를 분석하여 다음을 생성합니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기술 스택 분석 (&lt;code&gt;stack.md&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;아키텍처 분석 (&lt;code&gt;architecture.md&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;코드 품질 분석 (&lt;code&gt;concerns.md&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;코딩 컨벤션 분석 (&lt;code&gt;conventions.md&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 전체 워크플로우 흐름&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;표준 워크플로우 (처음부터 끝까지)&lt;/h3&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;┌─────────────────────────────────────────────────────┐
│  1. /gsd:new-project        프로젝트 초기화           │
│         &amp;darr;                                            │
│  2. /gsd:discuss-phase 1    Phase 1 설계 논의         │
│         &amp;darr;                                            │
│  3. /gsd:plan-phase 1       Phase 1 실행 계획 작성    │
│         &amp;darr;                                            │
│  4. /gsd:execute-phase 1    Phase 1 실행 (코드 작성)  │
│         &amp;darr;                                            │
│  5. /gsd:verify-work 1      Phase 1 결과 검증         │
│         &amp;darr;                                            │
│  6. (Phase 2, 3... 반복)                             │
│         &amp;darr;                                            │ 
│  7. /gsd:complete-milestone  마일스톤 완료           │
└─────────────────────────────────────────────────────┘&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;간단한 흐름 (자동 라우팅)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매번 다음 단계를 기억할 필요 없이:&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;/gsd:progress    &amp;larr; 현재 상태를 보여주고, 다음에 할 일을 알려줌
/gsd:next        &amp;larr; 자동으로 다음 단계를 실행&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자율 실행 (완전 자동)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 페이즈를 한번에 자동 실행하고 싶다면:&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;/gsd:autonomous&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 명령은 남은 모든 페이즈에 대해 &lt;code&gt;discuss &amp;rarr; plan &amp;rarr; execute&lt;/code&gt;를 자동으로 반복합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 명령어 상세 가이드&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.1. &lt;code&gt;/gsd:new-project&lt;/code&gt; &amp;mdash; 프로젝트 초기화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;언제 사용하나요?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GSD를 처음 사용할 때&lt;/li&gt;
&lt;li&gt;새로운 프로젝트를 시작할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;동작 과정:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;프로젝트에 대해 질문 (목표, 기술 스택, 제약조건)&lt;/li&gt;
&lt;li&gt;4개 리서처가 병렬로 조사 (기술, 아키텍처, 주의사항, 기능)&lt;/li&gt;
&lt;li&gt;리서치 결과 종합&lt;/li&gt;
&lt;li&gt;PROJECT.md, REQUIREMENTS.md, ROADMAP.md 생성&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;팁:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;질문에 최대한 구체적으로 답변하면 더 좋은 계획이 나옵니다&lt;/li&gt;
&lt;li&gt;이미 &lt;code&gt;.planning/&lt;/code&gt; 폴더가 있으면 기존 프로젝트로 인식합니다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.2. &lt;code&gt;/gsd:discuss-phase [N]&lt;/code&gt; &amp;mdash; 페이즈 설계 논의&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;언제 사용하나요?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;페이즈를 시작하기 전에 설계 방향을 정하고 싶을 때&lt;/li&gt;
&lt;li&gt;&quot;어떻게 구현할지&quot; 아직 결정하지 못한 부분이 있을 때&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용법:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;/gsd:discuss-phase 1           &amp;larr; Phase 1에 대해 논의
/gsd:discuss-phase 1 --auto    &amp;larr; 질문 없이 Claude가 알아서 결정&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;동작 과정:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;해당 페이즈의 목표와 요구사항을 확인&lt;/li&gt;
&lt;li&gt;&quot;회색 영역&quot; (아직 결정되지 않은 부분)을 찾아냄&lt;/li&gt;
&lt;li&gt;각 영역에 대해 질문하고 사용자의 결정을 기록&lt;/li&gt;
&lt;li&gt;모든 결정사항을 &lt;code&gt;CONTEXT.md&lt;/code&gt;에 저장&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시 질문들:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;인증은 JWT와 세션 중 어느 것을 사용할까요?&quot;&lt;/li&gt;
&lt;li&gt;&quot;파일 업로드는 로컬 저장소와 S3 중 어디를 사용할까요?&quot;&lt;/li&gt;
&lt;li&gt;&quot;API 응답 형식은 어떻게 할까요?&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;code&gt;--auto&lt;/code&gt; 플래그:&lt;/b&gt;&lt;br /&gt;질문에 답하기 귀찮을 때 사용합니다. Claude가 추천 옵션으로 자동 결정합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.3. &lt;code&gt;/gsd:plan-phase [N]&lt;/code&gt; &amp;mdash; 실행 계획 작성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;언제 사용하나요?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;페이즈 설계가 확정된 후 (discuss 이후)&lt;/li&gt;
&lt;li&gt;구체적인 실행 계획이 필요할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용법:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;/gsd:plan-phase 1                &amp;larr; Phase 1 계획 작성
/gsd:plan-phase 1 --research     &amp;larr; 리서치를 먼저 한 후 계획 작성
/gsd:plan-phase 1 --skip-verify  &amp;larr; 계획 검증 건너뛰기
/gsd:plan-phase 1 --gaps         &amp;larr; UAT에서 발견된 갭만 보완
/gsd:plan-phase 1 --prd file.md  &amp;larr; PRD 파일로부터 직접 계획 작성&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;동작 과정:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;리서치&lt;/b&gt; (선택) &amp;mdash; 기술적 조사가 필요하면 리서처 에이전트가 조사&lt;/li&gt;
&lt;li&gt;&lt;b&gt;계획 작성&lt;/b&gt; &amp;mdash; 플래너 에이전트가 PLAN.md 파일 생성&lt;/li&gt;
&lt;li&gt;&lt;b&gt;계획 검증&lt;/b&gt; &amp;mdash; 체커 에이전트가 계획의 완성도를 검토&lt;/li&gt;
&lt;li&gt;&lt;b&gt;수정 루프&lt;/b&gt; &amp;mdash; 문제가 있으면 최대 3번까지 수정&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결과물 예시:&lt;/b&gt; &lt;code&gt;.planning/phases/1/PLAN-1.md&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;---
phase: 1
plan: 1
title: &quot;데이터베이스 스키마 설계&quot;
wave: 1
depends_on: []
files_modified: [&quot;migrations/001_create_users.php&quot;]
---

## Goal
사용자 테이블과 인증 관련 스키마를 설계한다.

## Tasks
- [ ] users 테이블 마이그레이션 생성
- [ ] roles 테이블 마이그레이션 생성
- [ ] 시드 데이터 작성

## Verification
- 마이그레이션이 정상 실행되는지 확인
- 롤백이 정상 동작하는지 확인&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.4. &lt;code&gt;/gsd:execute-phase [N]&lt;/code&gt; &amp;mdash; 페이즈 실행&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;언제 사용하나요?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;계획(PLAN.md)이 완성된 후 실제 코드를 작성할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용법:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;/gsd:execute-phase 1               &amp;larr; Phase 1의 모든 플랜 실행
/gsd:execute-phase 1 --interactive &amp;larr; 메인 대화에서 직접 실행 (서브에이전트 없이)
/gsd:execute-phase 1 --wave 2     &amp;larr; 특정 웨이브만 실행
/gsd:execute-phase 1 --auto       &amp;larr; 확인 없이 자동 진행&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;동작 과정:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;PLAN.md 파일들을 발견하고 웨이브별로 그룹화&lt;/li&gt;
&lt;li&gt;같은 웨이브의 플랜들은 &lt;b&gt;병렬 실행&lt;/b&gt; (독립적인 작업)&lt;/li&gt;
&lt;li&gt;각 플랜마다 &lt;b&gt;gsd-executor 에이전트&lt;/b&gt;가 코드를 작성&lt;/li&gt;
&lt;li&gt;각 태스크 완료 시 &lt;b&gt;atomic commit&lt;/b&gt; (개별 커밋)&lt;/li&gt;
&lt;li&gt;모든 플랜 완료 후 &lt;b&gt;결과 검증&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;SUMMARY.md 생성&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;웨이브(Wave) 시스템:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;Wave 1: [Plan A, Plan B]  &amp;larr; 동시에 실행 (서로 의존성 없음)
         &amp;darr;
Wave 2: [Plan C]           &amp;larr; Wave 1 완료 후 실행 (Plan A, B에 의존)
         &amp;darr;
Wave 3: [Plan D, Plan E]  &amp;larr; 동시에 실행&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;code&gt;--interactive&lt;/code&gt; 플래그:&lt;/b&gt;&lt;br /&gt;서브에이전트 대신 현재 대화에서 직접 실행합니다. 작은 페이즈나 실행 과정을 직접 보고 싶을 때 유용합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.5. &lt;code&gt;/gsd:verify-work [N]&lt;/code&gt; &amp;mdash; 작업 검증 (UAT)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;언제 사용하나요?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;페이즈 실행 완료 후 결과를 테스트할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용법:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;/gsd:verify-work 1    &amp;larr; Phase 1 결과를 검증&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;동작 과정:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;SUMMARY.md에서 테스트 항목을 추출&lt;/li&gt;
&lt;li&gt;&lt;b&gt;UAT.md&lt;/b&gt; 파일 생성 (테스트 체크리스트)&lt;/li&gt;
&lt;li&gt;테스트를 &lt;b&gt;하나씩&lt;/b&gt; 보여주며 결과를 물어봄&lt;/li&gt;
&lt;li&gt;통과/실패/차단 등으로 결과 기록&lt;/li&gt;
&lt;li&gt;실패한 항목은 자동으로 수정 계획 수립&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;대화 예시:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;avrasm&quot;&gt;&lt;code&gt;GSD: &quot;테스트 1: 로그인 페이지가 정상적으로 표시되는지 확인하세요.&quot;
     &quot;브라우저에서 /login에 접속하면 로그인 폼이 보이나요?&quot;

사용자: &quot;네, 잘 보입니다&quot;

GSD: ✅ 통과! 다음 테스트...
     &quot;테스트 2: 잘못된 비밀번호로 로그인 시 에러 메시지가 표시되나요?&quot;

사용자: &quot;에러 메시지가 안 나옵니다&quot;

GSD: ❌ 이슈 발견! 수정 계획을 작성합니다...&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.6. &lt;code&gt;/gsd:quick&lt;/code&gt; &amp;mdash; 빠른 작업 실행&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;언제 사용하나요?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새 프로젝트가 아닌 &lt;b&gt;작은 단일 작업&lt;/b&gt;을 할 때&lt;/li&gt;
&lt;li&gt;전체 페이즈 워크플로우까지는 필요 없는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용법:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;/gsd:quick &quot;로그인 페이지에 비밀번호 재설정 링크 추가&quot;
/gsd:quick &quot;API 응답에 페이지네이션 추가&quot; --full
/gsd:quick &quot;검색 기능 개선&quot; --discuss --research&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;플래그 옵션:&lt;/b&gt;&lt;br /&gt;| 플래그 | 효과 |&lt;br /&gt;|--------|------|&lt;br /&gt;| (없음) | 계획 &amp;rarr; 실행 |&lt;br /&gt;| &lt;code&gt;--discuss&lt;/code&gt; | 논의 &amp;rarr; 계획 &amp;rarr; 실행 |&lt;br /&gt;| &lt;code&gt;--research&lt;/code&gt; | 리서치 &amp;rarr; 계획 &amp;rarr; 실행 |&lt;br /&gt;| &lt;code&gt;--full&lt;/code&gt; | 계획 &amp;rarr; 검증 &amp;rarr; 실행 &amp;rarr; 검증 |&lt;br /&gt;| &lt;code&gt;--discuss --research --full&lt;/code&gt; | 전체 파이프라인 |&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;quick vs fast vs 일반 실행:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;/gsd:fast     &amp;rarr; 3개 이하 파일 수정, 1분 이내 작업 (계획 없음)
/gsd:quick    &amp;rarr; 중간 규모 작업 (간단한 계획 + 실행)
/gsd:plan-phase + /gsd:execute-phase &amp;rarr; 큰 작업 (전체 워크플로우)&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.7. &lt;code&gt;/gsd:fast&lt;/code&gt; &amp;mdash; 초간단 즉시 실행&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;언제 사용하나요?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아주 사소한 수정 (오타 수정, 변수명 변경 등)&lt;/li&gt;
&lt;li&gt;3개 이하 파일만 수정하는 작업&lt;/li&gt;
&lt;li&gt;계획이 필요 없을 만큼 명확한 작업&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용법:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;/gsd:fast &quot;버튼 색상을 파란색에서 초록색으로 변경&quot;
/gsd:fast &quot;console.log 디버그 코드 제거&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;특징:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서브에이전트를 사용하지 않음 (현재 대화에서 바로 실행)&lt;/li&gt;
&lt;li&gt;PLAN.md를 생성하지 않음&lt;/li&gt;
&lt;li&gt;리서치/검증 과정 없음&lt;/li&gt;
&lt;li&gt;가장 빠르고 가벼운 실행 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.8. &lt;code&gt;/gsd:do&lt;/code&gt; &amp;mdash; 자연어 라우터&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;언제 사용하나요?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어떤 GSD 명령어를 써야 할지 모를 때&lt;/li&gt;
&lt;li&gt;자연스러운 문장으로 작업을 설명하고 싶을 때&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용법:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;/gsd:do &quot;로그인이 안 되는 버그 수정해줘&quot;         &amp;rarr; /gsd:debug로 라우팅
/gsd:do &quot;새 프로젝트 시작하자&quot;                    &amp;rarr; /gsd:new-project로 라우팅
/gsd:do &quot;사용자 프로필 페이지 만들어줘&quot;           &amp;rarr; /gsd:quick 또는 /gsd:add-phase로 라우팅
/gsd:do &quot;지금 어디까지 했지?&quot;                     &amp;rarr; /gsd:progress로 라우팅&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;라우팅 규칙:&lt;/b&gt;&lt;br /&gt;| 키워드 | 라우팅 대상 |&lt;br /&gt;|--------|------------|&lt;br /&gt;| 셋업, 시작, 초기화 | &lt;code&gt;/gsd:new-project&lt;/code&gt; |&lt;br /&gt;| 버그, 에러, 크래시 | &lt;code&gt;/gsd:debug&lt;/code&gt; |&lt;br /&gt;| 조사, 리서치 | &lt;code&gt;/gsd:research-phase&lt;/code&gt; |&lt;br /&gt;| 논의, 브레인스토밍 | &lt;code&gt;/gsd:discuss-phase&lt;/code&gt; |&lt;br /&gt;| 복잡한 기능 | &lt;code&gt;/gsd:add-phase&lt;/code&gt; |&lt;br /&gt;| 작은 작업 | &lt;code&gt;/gsd:quick&lt;/code&gt; |&lt;br /&gt;| 리뷰, 품질 | &lt;code&gt;/gsd:verify-work&lt;/code&gt; |&lt;br /&gt;| 상태, 진행 | &lt;code&gt;/gsd:progress&lt;/code&gt; |&lt;br /&gt;| 테스트 | &lt;code&gt;/gsd:add-tests&lt;/code&gt; |&lt;br /&gt;| 완료, 배포 | &lt;code&gt;/gsd:complete-milestone&lt;/code&gt; |&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.9. &lt;code&gt;/gsd:progress&lt;/code&gt; &amp;mdash; 진행 상태 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;언제 사용하나요?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로젝트 진행 상태를 확인하고 싶을 때&lt;/li&gt;
&lt;li&gt;다음에 뭘 해야 할지 모를 때&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용법:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;coq&quot;&gt;&lt;code&gt;/gsd:progress&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;표시 정보:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 마일스톤/페이즈 진행률&lt;/li&gt;
&lt;li&gt;각 페이즈의 상태 (계획됨/실행중/완료)&lt;/li&gt;
&lt;li&gt;미결 이슈나 검증 부채&lt;/li&gt;
&lt;li&gt;&lt;b&gt;다음 행동 추천&lt;/b&gt; (자동으로 적절한 명령어를 제안)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.10. &lt;code&gt;/gsd:debug&lt;/code&gt; &amp;mdash; 체계적 디버깅&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;언제 사용하나요?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;버그를 조사하고 수정할 때&lt;/li&gt;
&lt;li&gt;에러의 근본 원인을 찾고 싶을 때&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용법:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;/gsd:debug &quot;로그인 시 500 에러 발생&quot;
/gsd:debug &quot;파일 업로드 후 썸네일이 생성되지 않음&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;특징:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;과학적 방법론 (가설 &amp;rarr; 검증 &amp;rarr; 결론) 사용&lt;/li&gt;
&lt;li&gt;디버그 상태가 파일로 저장되어 세션이 끊겨도 이어갈 수 있음&lt;/li&gt;
&lt;li&gt;체크포인트 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.11. 페이즈 관리 명령어&lt;/h3&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;/gsd:add-phase           &amp;larr; 마일스톤 끝에 새 페이즈 추가
/gsd:insert-phase        &amp;larr; 기존 페이즈 사이에 긴급 작업 삽입 (소수점 번호, 예: 2.1)
/gsd:remove-phase        &amp;larr; 미래 페이즈 삭제 및 번호 재정렬
/gsd:list-phase-assumptions 1  &amp;larr; Phase 1에 대한 가정(assumption) 목록 확인&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.12. 세션 관리 명령어&lt;/h3&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;/gsd:pause-work      &amp;larr; 작업 중단 시 컨텍스트를 파일로 저장
/gsd:resume-work     &amp;larr; 이전 세션의 컨텍스트를 복원하여 이어서 작업
/gsd:thread          &amp;larr; 영구 컨텍스트 스레드 관리 (크로스 세션)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.13. 리뷰 &amp;amp; 검증 명령어&lt;/h3&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;/gsd:validate-phase 1      &amp;larr; Phase 1의 검증 갭을 찾아서 채움
/gsd:audit-milestone       &amp;larr; 마일스톤 전체를 원래 목표 대비 감사
/gsd:audit-uat             &amp;larr; 모든 페이즈의 미완료 UAT 항목 확인
/gsd:review                &amp;larr; 외부 AI 도구로 교차 리뷰 요청
/gsd:add-tests 1           &amp;larr; Phase 1에 대한 테스트 코드 자동 생성&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.14. Git &amp;amp; 배포 명령어&lt;/h3&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;/gsd:ship             &amp;larr; PR 생성 &amp;rarr; 리뷰 실행 &amp;rarr; 머지 준비
/gsd:pr-branch        &amp;larr; .planning/ 커밋을 제외한 깨끗한 PR 브랜치 생성&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6.15. 아이디어 &amp;amp; 할일 관리&lt;/h3&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;/gsd:add-todo         &amp;larr; 대화 중 떠오른 할일을 기록
/gsd:check-todos      &amp;larr; 기록된 할일 목록 확인 및 선택
/gsd:note             &amp;larr; 간단한 메모 (추가/목록/승격)
/gsd:plant-seed       &amp;larr; 미래에 트리거될 아이디어 심기
/gsd:add-backlog      &amp;larr; 백로그(999.x)에 아이디어 추가
/gsd:review-backlog   &amp;larr; 백로그 항목을 활성 마일스톤으로 승격&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 설정 및 커스터마이징&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7.1. 설정 변경하기&lt;/h3&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;/gsd:settings&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대화형으로 설정을 변경할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7.2. 주요 설정 항목&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;워크플로우 토글&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;설정&lt;/th&gt;
&lt;th&gt;기본값&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;research&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;페이즈 계획 전 리서치 수행 여부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;plan_check&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;계획 작성 후 검증 수행 여부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;verifier&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;실행 후 검증 수행 여부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;auto_advance&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;단계 완료 시 자동으로 다음 단계 진행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nyquist_validation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;작업 샘플링 검증&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;모드&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;설정&lt;/th&gt;
&lt;th&gt;옵션&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mode&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;interactive&lt;/code&gt; / &lt;code&gt;yolo&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;interactive = 확인 요청, yolo = 자동 진행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;discuss_mode&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;discuss&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;페이즈 논의 방식&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;병렬 처리&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;설정&lt;/th&gt;
&lt;th&gt;기본값&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;parallelization.enabled&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;병렬 실행 활성화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;max_concurrent_agents&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;동시 실행 에이전트 수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;plan_level&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;플랜 단위 병렬 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;task_level&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;태스크 단위 병렬 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;게이트 (확인 포인트)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게이트는 중요한 시점에서 사용자 확인을 요청하는 설정입니다:&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;게이트&lt;/th&gt;
&lt;th&gt;기본값&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;confirm_project&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;프로젝트 초기화 전 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;confirm_phases&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;페이즈 목록 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;confirm_roadmap&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;로드맵 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;confirm_plan&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;실행 계획 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;execute_next_plan&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;다음 플랜 실행 전 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;게이트를 &lt;code&gt;false&lt;/code&gt;로 설정하면 확인 없이 자동 진행합니다.&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7.3. 설정 파일 위치&lt;/h3&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;프로젝트별 설정: .planning/config.json
글로벌 기본값:   ~/.gsd/defaults.json (선택사항)&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 실전 시나리오별 사용법&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시나리오 1: 새 기능 하나 추가 (소규모)&lt;/h3&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# 방법 A: 가장 간단하게
/gsd:fast &quot;사용자 목록에 검색 필터 추가&quot;

# 방법 B: 조금 더 체계적으로
/gsd:quick &quot;사용자 목록에 검색 필터 추가&quot;

# 방법 C: 리서치까지 포함
/gsd:quick &quot;사용자 목록에 검색 필터 추가&quot; --research&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시나리오 2: 중간 규모 기능 개발&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;# 1. 논의하기
/gsd:discuss-phase 3

# 2. 계획 세우기
/gsd:plan-phase 3

# 3. 실행하기
/gsd:execute-phase 3

# 4. 검증하기
/gsd:verify-work 3&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시나리오 3: 버그 수정&lt;/h3&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# 체계적 디버깅
/gsd:debug &quot;결제 완료 후 주문 상태가 업데이트되지 않음&quot;

# 또는 간단한 버그라면
/gsd:fast &quot;null 체크 누락으로 인한 500 에러 수정&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시나리오 4: 프로젝트 처음부터 끝까지&lt;/h3&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# 1. 프로젝트 초기화
/gsd:new-project

# 2. 자동으로 모든 페이즈 실행
/gsd:autonomous

# 또는 단계별로 진행하며 다음 행동을 추천받기
/gsd:next&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시나리오 5: 세션이 끊겼을 때&lt;/h3&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# 이전 작업 컨텍스트 복원
/gsd:resume-work

# 또는 현재 상태 확인 후 이어가기
/gsd:progress&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시나리오 6: 작업 중 아이디어가 떠올랐을 때&lt;/h3&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;# 간단한 메모
/gsd:note &quot;나중에 캐싱 레이어 추가하면 좋겠다&quot;

# 할일로 등록
/gsd:add-todo &quot;API 응답 속도 개선 필요&quot;

# 백로그에 추가
/gsd:add-backlog &quot;다국어 지원 기능&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시나리오 7: PR 만들기&lt;/h3&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# .planning/ 파일을 제외한 깨끗한 PR 브랜치 생성
/gsd:pr-branch

# PR 생성 + 리뷰 + 머지 준비까지
/gsd:ship&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 파일 구조 이해하기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;code&gt;.planning/&lt;/code&gt; 디렉토리 전체 구조&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트가 진행되면 다음과 같은 구조가 만들어집니다:&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;.planning/
├── config.json                  &amp;larr; GSD 설정
├── PROJECT.md                   &amp;larr; 프로젝트 개요
├── REQUIREMENTS.md              &amp;larr; 요구사항 정의
├── ROADMAP.md                   &amp;larr; 마일스톤/페이즈 로드맵
├── STATE.md                     &amp;larr; 현재 진행 상태
│
├── research/                    &amp;larr; 프로젝트 초기 리서치 결과
│   ├── ARCHITECTURE.md
│   ├── FEATURES.md
│   ├── PITFALLS.md
│   ├── STACK.md
│   └── SUMMARY.md
│
├── codebase/                    &amp;larr; 코드베이스 분석 결과 (map-codebase)
│   ├── architecture.md
│   ├── conventions.md
│   ├── concerns.md
│   └── stack.md
│
├── phases/                      &amp;larr; 페이즈별 작업 디렉토리
│   ├── 1/                       &amp;larr; Phase 1
│   │   ├── CONTEXT.md           &amp;larr; 설계 결정사항
│   │   ├── RESEARCH.md          &amp;larr; 페이즈별 리서치
│   │   ├── PLAN-1.md            &amp;larr; 실행 계획 1
│   │   ├── PLAN-2.md            &amp;larr; 실행 계획 2
│   │   ├── SUMMARY-1.md         &amp;larr; 실행 결과 1
│   │   ├── SUMMARY-2.md         &amp;larr; 실행 결과 2
│   │   └── UAT.md               &amp;larr; 테스트 체크리스트
│   ├── 2/                       &amp;larr; Phase 2
│   │   └── ...
│   └── 3/                       &amp;larr; Phase 3
│       └── ...
│
├── quick-tasks/                 &amp;larr; quick 명령으로 실행된 작업들
│   └── QT-001/
│       ├── PLAN.md
│       └── SUMMARY.md
│
└── todos/                       &amp;larr; 할일 목록
    └── ...&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주요 파일 설명&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;code&gt;STATE.md&lt;/code&gt; &amp;mdash; 진행 상태 추적&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 파일은 GSD가 자동으로 관리합니다:&lt;/p&gt;
&lt;pre class=&quot;gherkin&quot;&gt;&lt;code&gt;## Current State
- **Milestone:** v1.0
- **Active Phase:** 2
- **Status:** executing

## Phase Progress
| Phase | Status | Plans | Completed |
|-------|--------|-------|-----------|
| 1 | ✅ complete | 3/3 | 3/3 |
| 2 |   executing | 2/2 | 1/2 |
| 3 | ⏳ planned | 0/0 | 0/0 |

## Decisions Log
- Phase 1: JWT 인증 방식 선택 (CONTEXT.md 참조)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;code&gt;ROADMAP.md&lt;/code&gt; &amp;mdash; 로드맵&lt;/h4&gt;
&lt;pre class=&quot;clean&quot;&gt;&lt;code&gt;## Milestone: v1.0

### Phase 1: 사용자 인증 ✅
Goal: 로그인/회원가입 시스템 구현

### Phase 2: 상품 관리  
Goal: 상품 CRUD 및 이미지 업로드

### Phase 3: 주문 시스템 ⏳
Goal: 장바구니, 주문, 결제 연동&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;10. 모델 프로필 시스템&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GSD는 각 에이전트에 다른 Claude 모델을 할당할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;프로필 종류&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;프로필&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;th&gt;비용&lt;/th&gt;
&lt;th&gt;추천 상황&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;quality&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;모든 에이전트에 Opus 사용&lt;/td&gt;
&lt;td&gt;높음&lt;/td&gt;
&lt;td&gt;중요한 프로덕션 작업&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;balanced&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;계획=Opus, 실행=Sonnet&lt;/td&gt;
&lt;td&gt;중간&lt;/td&gt;
&lt;td&gt;&lt;b&gt;기본값&lt;/b&gt;, 대부분의 경우 적합&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;budget&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;작성=Sonnet, 검증=Haiku&lt;/td&gt;
&lt;td&gt;낮음&lt;/td&gt;
&lt;td&gt;비용 절약이 중요할 때&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;inherit&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;현재 세션 모델 사용&lt;/td&gt;
&lt;td&gt;가변&lt;/td&gt;
&lt;td&gt;외부 프로바이더(OpenRouter 등) 사용 시&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;에이전트별 모델 배정&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;에이전트&lt;/th&gt;
&lt;th&gt;quality&lt;/th&gt;
&lt;th&gt;balanced&lt;/th&gt;
&lt;th&gt;budget&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;planner (계획)&lt;/td&gt;
&lt;td&gt;Opus&lt;/td&gt;
&lt;td&gt;Opus&lt;/td&gt;
&lt;td&gt;Sonnet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;roadmapper (로드맵)&lt;/td&gt;
&lt;td&gt;Opus&lt;/td&gt;
&lt;td&gt;Sonnet&lt;/td&gt;
&lt;td&gt;Sonnet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;executor (실행)&lt;/td&gt;
&lt;td&gt;Opus&lt;/td&gt;
&lt;td&gt;Sonnet&lt;/td&gt;
&lt;td&gt;Sonnet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;debugger (디버깅)&lt;/td&gt;
&lt;td&gt;Opus&lt;/td&gt;
&lt;td&gt;Sonnet&lt;/td&gt;
&lt;td&gt;Sonnet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;verifier (검증)&lt;/td&gt;
&lt;td&gt;Sonnet&lt;/td&gt;
&lt;td&gt;Sonnet&lt;/td&gt;
&lt;td&gt;Haiku&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;codebase-mapper (분석)&lt;/td&gt;
&lt;td&gt;Sonnet&lt;/td&gt;
&lt;td&gt;Haiku&lt;/td&gt;
&lt;td&gt;Haiku&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;프로필 변경&lt;/h3&gt;
&lt;pre class=&quot;gams&quot;&gt;&lt;code&gt;/gsd:set-profile quality    &amp;larr; 최고 품질로 변경
/gsd:set-profile budget     &amp;larr; 비용 절약 모드
/gsd:settings               &amp;larr; 대화형으로 변경&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;11. Git 통합&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;브랜칭 전략&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GSD는 3가지 Git 브랜칭 전략을 지원합니다:&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;code&gt;none&lt;/code&gt; (기본값)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 브랜치에서 모든 작업 수행&lt;/li&gt;
&lt;li&gt;별도의 브랜치를 생성하지 않음&lt;/li&gt;
&lt;li&gt;가장 단순한 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;code&gt;phase&lt;/code&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;페이즈마다 새 브랜치 생성&lt;/li&gt;
&lt;li&gt;브랜치명 템플릿: &lt;code&gt;gsd/phase-{phase}-{slug}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;예: &lt;code&gt;gsd/phase-1-user-auth&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;code&gt;milestone&lt;/code&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;마일스톤마다 새 브랜치 생성&lt;/li&gt;
&lt;li&gt;브랜치명 템플릿: &lt;code&gt;gsd/{milestone}-{slug}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;예: &lt;code&gt;gsd/v1.0-mvp-launch&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;커밋 관리&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 태스크 완료 시 &lt;b&gt;atomic commit&lt;/b&gt; 생성&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.planning/&lt;/code&gt; 폴더의 변경도 별도 커밋&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/gsd:pr-branch&lt;/code&gt;로 &lt;code&gt;.planning/&lt;/code&gt; 커밋을 제외한 깨끗한 브랜치 생성 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;code&gt;.planning/&lt;/code&gt;을 Git에 포함할지&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;config.json&lt;/code&gt;의 &lt;code&gt;commit_docs&lt;/code&gt; 설정으로 제어:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;true&lt;/code&gt; (기본값) &amp;mdash; &lt;code&gt;.planning/&lt;/code&gt; 파일도 Git에 커밋 (팀 공유 가능)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;false&lt;/code&gt; &amp;mdash; &lt;code&gt;.planning/&lt;/code&gt;을 &lt;code&gt;.gitignore&lt;/code&gt;에 추가 (로컬에서만 관리)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;12. 트러블슈팅 &amp;amp; FAQ&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q: GSD를 이미 사용 중인 프로젝트에서 시작하려면?&lt;/h3&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;/gsd:new-project&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 실행하세요. 기존 코드를 분석한 후 프로젝트를 초기화합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q: &lt;code&gt;.planning/&lt;/code&gt; 폴더를 실수로 삭제했으면?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;/gsd:health&lt;/code&gt;로 진단하고, 가능하면 Git에서 복구하세요:&lt;/p&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;git checkout -- .planning/&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q: 페이즈 순서를 변경하고 싶으면?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;중간에 삽입: &lt;code&gt;/gsd:insert-phase&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;삭제 및 재정렬: &lt;code&gt;/gsd:remove-phase&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q: 모든 확인을 건너뛰고 자동으로 실행하려면?&lt;/h3&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;/gsd:settings&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에서 게이트를 모두 &lt;code&gt;false&lt;/code&gt;로 설정하거나, &lt;code&gt;/gsd:autonomous&lt;/code&gt;를 사용하세요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q: 작업 도중 대화가 너무 길어져서 컨텍스트가 부족해지면?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GSD는 모든 상태를 파일에 저장하므로 &lt;code&gt;/clear&lt;/code&gt;로 대화를 초기화해도 됩니다:&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;/clear
/gsd:resume-work    &amp;larr; 이전 컨텍스트를 파일에서 복원&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q: 특정 에이전트만 다른 모델로 바꾸고 싶으면?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;/gsd:settings&lt;/code&gt;에서 개별 에이전트의 모델을 오버라이드할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q: GSD 업데이트는?&lt;/h3&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;/gsd:update&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q: 시스템 상태를 점검하려면?&lt;/h3&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;/gsd:health    &amp;larr; .planning/ 디렉토리 건강 상태 진단
/gsd:stats     &amp;larr; 프로젝트 통계 (페이즈, 플랜, 커밋 등)&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;13. 전체 명령어 요약표&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;작업 규모별 추천 명령어&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;작업 규모&lt;/th&gt;
&lt;th&gt;추천 명령어&lt;/th&gt;
&lt;th&gt;예시&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;한 줄 수정&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/gsd:fast&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;오타 수정, 변수명 변경&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;작은 기능&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/gsd:quick&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;API 엔드포인트 하나 추가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;중간 기능&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/gsd:plan-phase&lt;/code&gt; + &lt;code&gt;/gsd:execute-phase&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;검색 기능 구현&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;큰 프로젝트&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/gsd:new-project&lt;/code&gt; + &lt;code&gt;/gsd:autonomous&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;새 서비스 개발&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;버그 수정&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/gsd:debug&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;원인 불명의 에러&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;뭘 해야 할지 모를 때&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/gsd:do&lt;/code&gt; 또는 &lt;code&gt;/gsd:progress&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;아무 때나&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;워크플로우 순서 (외울 필요 없음 &amp;mdash; &lt;code&gt;/gsd:next&lt;/code&gt;가 알아서 안내)&lt;/h3&gt;
&lt;pre class=&quot;smali&quot;&gt;&lt;code&gt;new-project &amp;rarr; discuss-phase &amp;rarr; plan-phase &amp;rarr; execute-phase &amp;rarr; verify-work &amp;rarr; complete-milestone&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;전체 명령어 카테고리별 정리&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;카테고리&lt;/th&gt;
&lt;th&gt;명령어&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;시작&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;new-project&lt;/code&gt;, &lt;code&gt;map-codebase&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;계획&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;discuss-phase&lt;/code&gt;, &lt;code&gt;plan-phase&lt;/code&gt;, &lt;code&gt;add-phase&lt;/code&gt;, &lt;code&gt;insert-phase&lt;/code&gt;, &lt;code&gt;remove-phase&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;실행&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;execute-phase&lt;/code&gt;, &lt;code&gt;quick&lt;/code&gt;, &lt;code&gt;fast&lt;/code&gt;, &lt;code&gt;do&lt;/code&gt;, &lt;code&gt;autonomous&lt;/code&gt;, &lt;code&gt;next&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;검증&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;verify-work&lt;/code&gt;, &lt;code&gt;validate-phase&lt;/code&gt;, &lt;code&gt;audit-milestone&lt;/code&gt;, &lt;code&gt;audit-uat&lt;/code&gt;, &lt;code&gt;add-tests&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;상태&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;progress&lt;/code&gt;, &lt;code&gt;stats&lt;/code&gt;, &lt;code&gt;session-report&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;세션&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pause-work&lt;/code&gt;, &lt;code&gt;resume-work&lt;/code&gt;, &lt;code&gt;thread&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Git&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ship&lt;/code&gt;, &lt;code&gt;pr-branch&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;디버그&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;debug&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;아이디어&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;add-todo&lt;/code&gt;, &lt;code&gt;check-todos&lt;/code&gt;, &lt;code&gt;note&lt;/code&gt;, &lt;code&gt;plant-seed&lt;/code&gt;, &lt;code&gt;add-backlog&lt;/code&gt;, &lt;code&gt;review-backlog&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;설정&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;settings&lt;/code&gt;, &lt;code&gt;set-profile&lt;/code&gt;, &lt;code&gt;health&lt;/code&gt;, &lt;code&gt;cleanup&lt;/code&gt;, &lt;code&gt;update&lt;/code&gt;, &lt;code&gt;help&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;고급&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;workstreams&lt;/code&gt;, &lt;code&gt;new-workspace&lt;/code&gt;, &lt;code&gt;list-workspaces&lt;/code&gt;, &lt;code&gt;remove-workspace&lt;/code&gt;, &lt;code&gt;manager&lt;/code&gt;, &lt;code&gt;review&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심 요약:&lt;/b&gt; 모르겠으면 &lt;code&gt;/gsd:do&lt;/code&gt;에 하고 싶은 말을 적거나, &lt;code&gt;/gsd:progress&lt;/code&gt;로 현재 상태를 확인하세요. GSD가 알아서 안내해줍니다.&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <category>AI</category>
      <category>claude code</category>
      <category>get shit done</category>
      <category>Get Shit Done (GSD) 완전 가이드</category>
      <category>gsd란?</category>
      <category>gsd사용법</category>
      <category>gsd사용하기</category>
      <category>gsd설치방법</category>
      <category>클로드코드</category>
      <category>클로드코드코딩방법</category>
      <author>은둔한량</author>
      <guid isPermaLink="true">https://koreanred.tistory.com/203</guid>
      <comments>https://koreanred.tistory.com/203#entry203comment</comments>
      <pubDate>Thu, 26 Mar 2026 09:56:58 +0900</pubDate>
    </item>
    <item>
      <title>에이전틱 엔지니어링 Agentic Engineering</title>
      <link>https://koreanred.tistory.com/202</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. 에이전틱 엔지니어링 (Agentic Engineering) 이란&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;에이전틱&amp;nbsp;엔지니어링(Agentic&amp;nbsp;Engineering)&lt;/b&gt;은&amp;nbsp;단순한&amp;nbsp;코드&amp;nbsp;생성(바이브&amp;nbsp;코딩)을&amp;nbsp;넘어,&amp;nbsp;인간의&amp;nbsp;감독&amp;nbsp;하에&amp;nbsp;AI&amp;nbsp;에이전트들이&amp;nbsp;스스로&amp;nbsp;목표를&amp;nbsp;계획하고,&amp;nbsp;코드를&amp;nbsp;작성하며,&amp;nbsp;테스트&amp;nbsp;및&amp;nbsp;배포까지&amp;nbsp;자율적으로&amp;nbsp;수행하도록&amp;nbsp;조율(Orchestration)하는&amp;nbsp;차세대&amp;nbsp;소프트웨어&amp;nbsp;개발&amp;nbsp;방식을&amp;nbsp;의미합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 5가지 핵심 개념&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) Agent &amp;amp; Sub-Agent&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; - &lt;b&gt;Agent란 ?&lt;/b&gt; 목표를 해석하고, 계획을 세우고, 도구를 사용해서 자율적으로 실행하는 주체&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 해석(목표이해) &amp;rarr; 계획(전략수립) &amp;rarr; 실행(도구사용) &amp;rarr; 평가 루프(결과검증)&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;900&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pyYxt/dJMcag5Rab5/XjXUapWjptya14HpTEwkfK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pyYxt/dJMcag5Rab5/XjXUapWjptya14HpTEwkfK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pyYxt/dJMcag5Rab5/XjXUapWjptya14HpTEwkfK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/pyYxt/dJMcag5Rab5/XjXUapWjptya14HpTEwkfK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;728&quot; height=&quot;596&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;900&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;멀티 에이전트 오케스트레이터(Multi-Agent Orchestrator)&lt;/b&gt;는 여러 개의 특화된 AI 에이전트를 하나의 시스템 내에서 지능적으로 조율하고 협업시키는 프레임워크 또는 시스템을 의미합니다. 단일 범용 AI 모델의 한계를 넘어, 각기 다른 역할(예: 연구, 요약, 코드 작성)을 가진 에이전트들을 적재적소에 배치하여 복잡한 작업을 수행하도록 돕습니다.&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;1080&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TCYiN/dJMcagENMFf/tzSMJw4OXZY2jXPkrxXbn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TCYiN/dJMcagENMFf/tzSMJw4OXZY2jXPkrxXbn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TCYiN/dJMcagENMFf/tzSMJw4OXZY2jXPkrxXbn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTCYiN%2FdJMcagENMFf%2FtzSMJw4OXZY2jXPkrxXbn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;692&quot; height=&quot;461&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;다중 에이전트 시스템(Multi-Agent System, MAS)&lt;/b&gt;은 여러 자율적인 에이전트들이 상호 작용하며 공동의 문제를 해결하거나 특정 목표를 달성하기 위해 협력하는 시스템이에요. 각 에이전트는 특정 역할이나 전문 분야를 담당하며, 서로 통신하고 조율하면서 문제를 해결합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) Context Engineering &lt;/b&gt;&amp;nbsp;: 에이전트 두뇌 설계, 이제 프롬프트 엔지니어링은 끝났다.&lt;br /&gt;&amp;nbsp;컨텍스트&amp;nbsp;엔지니어링(Context&amp;nbsp;Engineering)은&amp;nbsp;LLM(거대언어모델)이&amp;nbsp;복잡한&amp;nbsp;작업을&amp;nbsp;정확히&amp;nbsp;수행하도록&amp;nbsp;필요한&amp;nbsp;정보(데이터,&amp;nbsp;도구,&amp;nbsp;제약조건&amp;nbsp;등)를&amp;nbsp;실시간으로&amp;nbsp;구성하여&amp;nbsp;문맥을&amp;nbsp;제공하는&amp;nbsp;시스템&amp;nbsp;설계&amp;nbsp;기술입니다.&amp;nbsp;단순히&amp;nbsp;질문을&amp;nbsp;잘하는&amp;nbsp;프롬프트&amp;nbsp;엔지니어링을&amp;nbsp;넘어,&amp;nbsp;데이터&amp;nbsp;큐레이션&amp;nbsp;및&amp;nbsp;외부&amp;nbsp;환경(RAG&amp;nbsp;등)을&amp;nbsp;능동적으로&amp;nbsp;연동하여&amp;nbsp;최적의&amp;nbsp;AI&amp;nbsp;응답을&amp;nbsp;만들어내는&amp;nbsp;기술입니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;System Context&amp;nbsp; &amp;nbsp; -&amp;nbsp; &amp;nbsp; Conversation Context&amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;nbsp; &amp;nbsp; &amp;nbsp;Tool &amp;amp; Environment Context&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - 비용과 지연 폭발&lt;br /&gt;&amp;nbsp; &amp;nbsp; - 신호 약화 (Lost-in-the-Middle)&lt;br /&gt;&amp;nbsp; &amp;nbsp; - 캐시효율성&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; - 필요한 정보만 적시하고 적적한 형태로 제공하라&lt;br /&gt;&lt;br /&gt;CLAUDE.md : &lt;a href=&quot;https://www.builder.io/blog/claude-md-guide&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.builder.io/blog/claude-md-guide&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1773673613728&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;How to Write a Good CLAUDE.md File&quot; data-og-description=&quot;Learn how to create, structure, and maintain CLAUDE.md files for Claude Code. Save hours by documenting project conventions that persist across sessions.&quot; data-og-host=&quot;www.builder.io&quot; data-og-source-url=&quot;https://www.builder.io/blog/claude-md-guide&quot; data-og-url=&quot;https://www.builder.io/blog/claude-md-guide&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dHT1lH/dJMb88eZrVj/9A7y8OLqX8E3cyl7bA7sWK/img.jpg?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675,https://scrap.kakaocdn.net/dn/bcarnf/dJMb88eZrVk/KaI97SCCPoC4ECee8KE7rK/img.jpg?width=2000&amp;amp;height=1125&amp;amp;face=0_0_2000_1125&quot;&gt;&lt;a href=&quot;https://www.builder.io/blog/claude-md-guide&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.builder.io/blog/claude-md-guide&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dHT1lH/dJMb88eZrVj/9A7y8OLqX8E3cyl7bA7sWK/img.jpg?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675,https://scrap.kakaocdn.net/dn/bcarnf/dJMb88eZrVk/KaI97SCCPoC4ECee8KE7rK/img.jpg?width=2000&amp;amp;height=1125&amp;amp;face=0_0_2000_1125');&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;How to Write a Good CLAUDE.md File&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Learn how to create, structure, and maintain CLAUDE.md files for Claude Code. Save hours by documenting project conventions that persist across sessions.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.builder.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1773673631781&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Project: ShopFront

Next.js 14 e-commerce application with App Router, Stripe payments, and Prisma ORM.

## Code Style

- TypeScript strict mode, no `any` types
- Use named exports, not default exports
- CSS: Tailwind utility classes, no custom CSS files

## Commands

- `npm run dev`: Start development server (port 3000)
- `npm run test`: Run Jest tests
- `npm run test:e2e`: Run Playwright end-to-end tests
- `npm run lint`: ESLint check
- `npm run db:migrate`: Run Prisma migrations

## Architecture

- `/app`: Next.js App Router pages and layouts
- `/components/ui`: Reusable UI components
- `/lib`: Utilities and shared logic
- `/prisma`: Database schema and migrations
- `/app/api`: API routes

## Important Notes

- NEVER commit .env files
- The Stripe webhook handler in /app/api/webhooks/stripe must validate signatures
- Product images are stored in Cloudinary, not locally
- See @docs/authentication.md for auth flow details&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) Tool, Plugin &amp;amp; MCP&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 89px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20.3322%; text-align: center; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 8.23919%; text-align: center; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 52.2711%; text-align: center; height: 17px;&quot; colspan=&quot;3&quot;&gt;&lt;b&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Level 3 -&lt;span&gt; MCP - 표준프로토콜, 모든 Tool/Plugin을&lt;br /&gt;표준화된 인터페이스로 연결&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 7.54152%; text-align: center; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 11.495%; text-align: center; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 20.3322%; text-align: center; height: 34px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 68.0518%; text-align: center; height: 34px;&quot; colspan=&quot;5&quot;&gt;&lt;b&gt; Level 2 - Plugin : Tool 묶음, GitHub 플러그인 (PR조회 + 생성 + 리뷰)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 11.495%; text-align: center; height: 34px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 38px;&quot;&gt;
&lt;td style=&quot;width: 99.879%; text-align: center; height: 38px;&quot; colspan=&quot;7&quot;&gt;&lt;b&gt;Level 1 - tool : 개별함수, 파일 읽기, 터미널 실행, 웹검색&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&amp;lt; 3가지 계층 구조 &amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 최소 권한 원칙 : 필요한 Tool만 노출&lt;br /&gt;&amp;nbsp; &amp;nbsp; - 검증 가능성 : Tool 호출 결과를 인간이 쉽게 확인&lt;br /&gt;&amp;nbsp; &amp;nbsp; - 에러 핸들링 내장 : 실패시 대안 경로 선택 가능&lt;br /&gt;&amp;nbsp; &amp;nbsp; - 보안 경계 설정 : 읽기 전용 vs 쓰기 가능 명확 구분&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;4) Hook &amp;amp; Skill&lt;/b&gt; : 에이전트 행동 제어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;* HOOK 4가지 유형&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30.0775%; text-align: center;&quot;&gt;Hook 유형&lt;/td&gt;
&lt;td style=&quot;width: 36.5891%; text-align: center;&quot;&gt;동작 시점&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;실전 예시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30.0775%; text-align: center;&quot;&gt;Pre-action&lt;/td&gt;
&lt;td style=&quot;width: 36.5891%;&quot;&gt;에이전트가 행동하기 전&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;코드 저장 전 Lint 자동 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30.0775%; text-align: center;&quot;&gt;Post-action&lt;/td&gt;
&lt;td style=&quot;width: 36.5891%;&quot;&gt;에이전트가 행동한 후&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;커밋 후 자동 테스트 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30.0775%; text-align: center;&quot;&gt;Validation&lt;/td&gt;
&lt;td style=&quot;width: 36.5891%;&quot;&gt;에이전트 출력의 품질 검증&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;보안 취약점 스캔&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30.0775%; text-align: center;&quot;&gt;Notification&lt;/td&gt;
&lt;td style=&quot;width: 36.5891%;&quot;&gt;특정 조건 충족시 인간에게 알림&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;비용 임계치 초과 경&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;Claude&amp;nbsp;Code&amp;nbsp;Skills&lt;/span&gt;&lt;/b&gt;는&amp;nbsp;skills/&amp;nbsp;폴더에&amp;nbsp;&lt;b&gt;SKILL.md&lt;/b&gt;&amp;nbsp;파일을&amp;nbsp;작성해&amp;nbsp;반복적인&amp;nbsp;개발&amp;nbsp;작업을&amp;nbsp;자동화하는&amp;nbsp;기능입니다.&amp;nbsp;개인(~/.claude/skills)&amp;nbsp;또는&amp;nbsp;프로젝트(프로젝트폴더/.claude/skills)&amp;nbsp;단위로&amp;nbsp;스킬을&amp;nbsp;정의할&amp;nbsp;수&amp;nbsp;있으며,&amp;nbsp;클로드에게&amp;nbsp;자연어로&amp;nbsp;해당&amp;nbsp;스킬을&amp;nbsp;실행하도록&amp;nbsp;요청할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;5) Planning &amp;amp; HITL&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;1500&quot; data-origin-height=&quot;700&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/81YxD/dJMcacWE7zl/fEwLRLgXjdKYav5aG6ABzK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/81YxD/dJMcacWE7zl/fEwLRLgXjdKYav5aG6ABzK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/81YxD/dJMcacWE7zl/fEwLRLgXjdKYav5aG6ABzK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F81YxD%2FdJMcacWE7zl%2FfEwLRLgXjdKYav5aG6ABzK%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;1500&quot; height=&quot;700&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;700&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;b&gt;Planning Loop&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 목표분해 2) 계획수립 3) 도구로 실행 4) 결과 평가 5) 재계획&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Vibe Coding과 Agentic Engineering의 가장 큰 차이는 &lt;span style=&quot;color: #6164c6;&quot;&gt;테스트&lt;/span&gt; 입니다.&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;견고한 테스트 스위트가 있으면 AI 에이전트가 테스트가 통과할 때까지 반복할 수 있고, 결과에 높은 확신을 가질 수 있습니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Agent가 Context를 바탕으로 Plan을 세우고,&amp;nbsp;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Tool/MCP를&amp;nbsp;사용해&amp;nbsp;실행하고,&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Hook과 Skill로 품질을 제어하고,&amp;nbsp;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Human이 감독한다.&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffffff; text-align: start;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffffff; text-align: start;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;</description>
      <category>AI</category>
      <category>agentic engineering</category>
      <category>에이전틱 엔지니어링</category>
      <author>은둔한량</author>
      <guid isPermaLink="true">https://koreanred.tistory.com/202</guid>
      <comments>https://koreanred.tistory.com/202#entry202comment</comments>
      <pubDate>Tue, 17 Mar 2026 00:43:10 +0900</pubDate>
    </item>
    <item>
      <title>MCP 란 ?</title>
      <link>https://koreanred.tistory.com/201</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. MCP 란 ?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대규모&amp;nbsp;언어&amp;nbsp;모델(LLM)은&amp;nbsp;강력하지만&amp;nbsp;두&amp;nbsp;가지&amp;nbsp;주요&amp;nbsp;한계가&amp;nbsp;있습니다.&amp;nbsp;하나는&amp;nbsp;학습&amp;nbsp;시점의&amp;nbsp;지식에&amp;nbsp;고착되어&amp;nbsp;있다는&amp;nbsp;점이고,&amp;nbsp;다른&amp;nbsp;하나는&amp;nbsp;외부&amp;nbsp;세계와&amp;nbsp;상호작용할&amp;nbsp;수&amp;nbsp;없다는&amp;nbsp;점입니다.&amp;nbsp;즉,&amp;nbsp;실시간&amp;nbsp;데이터에&amp;nbsp;액세스하거나&amp;nbsp;회의&amp;nbsp;예약,&amp;nbsp;고객&amp;nbsp;기록&amp;nbsp;업데이트와&amp;nbsp;같은&amp;nbsp;작업을&amp;nbsp;수행할&amp;nbsp;수&amp;nbsp;없습니다.&amp;nbsp; &lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Model &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Context Protocol(MCP)&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;은 이러한 문제를 해결하기 위해 설계된 개방형 표준(&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;오픈 소스 표준 프로토콜&lt;/span&gt;&lt;/b&gt;)입니다&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2024년 11월 Anthropic에서 도입한 MCP는 LLM이 외부 데이터, 애플리케이션 &lt;span style=&quot;color: #000000;&quot;&gt;(GitHub, Google Drive&lt;span&gt;&amp;nbsp;&lt;/span&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; , 서비스와 통신할 수 있는 안전하고 표준화된 '언어'를 제공합니다. AI가 정적 지식을 넘어 현재 정보를 검색하고 조치를 취할 수 있는 동적 에이전트가 되도록 지원하는 브리지 역할을 하여 &lt;span style=&quot;color: #000000;&quot;&gt;AI&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;에이전트가 로컬 파일&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, DB,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;검색 엔진 등의 도구를 자유롭게 사용하여 실시간 작업 및 데이터 조회를 수행하게 해주는&lt;span&gt;&amp;nbsp;&lt;/span&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;&amp;nbsp;&lt;/span&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; AI의 정확성, 유용성, 자동화를 높입니다.&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;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFrOWC/dJMcagkrJ31/suUc2fdZ2JgYVC8RYD94P1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFrOWC/dJMcagkrJ31/suUc2fdZ2JgYVC8RYD94P1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFrOWC/dJMcagkrJ31/suUc2fdZ2JgYVC8RYD94P1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFrOWC%2FdJMcagkrJ31%2FsuUc2fdZ2JgYVC8RYD94P1%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;1280&quot; height=&quot;720&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. MCP 작동 원리&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #5f6368; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;&lt;b&gt;1) 요청 및 도구 탐색:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;LLM은 자체적으로 데이터베이스에 액세스하거나 이메일을 보낼 수 없다는 것을 이해합니다. MCP 클라이언트를 사용하여 사용 가능한 도구를 검색하고, MCP 서버에 등록된 관련 도구 2개(database_query 도구와 email_sender 도구)를 찾습니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;&lt;b&gt;2) 도구 호출:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;LLM이 이러한 도구를 사용하기 위한 구조화된 요청을 생성합니다. 먼저 보고서 이름을 지정하여 database_query 도구를 호출합니다. 그러면 MCP 클라이언트가 이 요청을 적절한 MCP 서버로 보냅니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;&lt;b&gt;3) 외부 작업 및 데이터 반환:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;MCP 서버는 요청을 수신하고 이를 회사의 데이터베이스에 대한 보안 SQL 쿼리로 변환하여 판매 보고서를 검색합니다. 그런 다음 이 데이터를 포맷하여 LLM에 다시 보냅니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;&lt;b&gt;4) 두 번째 작업 및 응답 생성:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;이제 보고서 데이터를 확보한 LLM은 email_sender 도구를 호출하여 관리자의 이메일 주소와 보고서 콘텐츠를 제공합니다. 이메일이 전송된 후 MCP 서버는 작업이 완료되었음을 확인합니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;&lt;b&gt;5) 최종 확인:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;LLM이 최종 응답을 제공합니다. '최신 판매 보고서를 찾아서 관리자에게 이메일로 보냈습니다.'&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. 개발자가 자주 사용하는 MCP&lt;br /&gt;&lt;/span&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;context7&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #334155; text-align: start;&quot;&gt;최신 라이브러리 문서와 정확한 코드 예제를 실시간으로 사용할 수 있는 서버입니다. AI의 가장 큰 약점인 오래되거나 부정확한 정보 문제를 해결할 수 있습니다.&lt;br /&gt;&lt;a href=&quot;https://context7.com/docs/overview&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://context7.com/docs/overview&lt;/a&gt;&lt;/span&gt; &lt;br /&gt;&lt;a href=&quot;https://github.com/upstash/context7&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/upstash/context7&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1773563608851&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - upstash/context7: Context7 Platform -- Up-to-date code documentation for LLMs and AI code editors&quot; data-og-description=&quot;Context7 Platform -- Up-to-date code documentation for LLMs and AI code editors - upstash/context7&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/upstash/context7&quot; data-og-url=&quot;https://github.com/upstash/context7&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c9qkLy/dJMb9iIFMEy/qYergdkyO41HhNIsYzk6P0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/buaDVf/dJMb9c9wxCn/ilbsDTSKCM6OOMeEQKE80k/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/EoIAH/dJMb9iaPOAl/oikKDeGtGhKz3aYe512gfK/img.png?width=3000&amp;amp;height=1000&amp;amp;face=0_0_3000_1000&quot;&gt;&lt;a href=&quot;https://github.com/upstash/context7&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/upstash/context7&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c9qkLy/dJMb9iIFMEy/qYergdkyO41HhNIsYzk6P0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/buaDVf/dJMb9c9wxCn/ilbsDTSKCM6OOMeEQKE80k/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/EoIAH/dJMb9iaPOAl/oikKDeGtGhKz3aYe512gfK/img.png?width=3000&amp;amp;height=1000&amp;amp;face=0_0_3000_1000');&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;GitHub - upstash/context7: Context7 Platform -- Up-to-date code documentation for LLMs and AI code editors&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Context7 Platform -- Up-to-date code documentation for LLMs and AI code editors - upstash/context7&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #1e293b; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;주요 기능&lt;/b&gt;&lt;/h4&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 style=&quot;background-color: #f0f0f0;&quot;&gt;
&lt;td&gt;문서 검색&lt;/td&gt;
&lt;td&gt;최신 공식 문서를 검색하여 정확한 사용법을 가져옵니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;코드 예제 제공&lt;/td&gt;
&lt;td&gt;특정 기능 구현에 필요한 검증된 코드 스니펫을 컨텍스트로 제공합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;background-color: #f0f0f0;&quot;&gt;
&lt;td&gt;API 조회&lt;/td&gt;
&lt;td&gt;특정 함수나 클래스의 파라미터, 반환값, 오류 코드 등 상세 API 명세를 조회합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;버전 맞춤 정보&lt;/td&gt;
&lt;td&gt;구버전 데이터가 아닌 현재 사용 가능한 라이브러리 버전에 맞는 정보를 제공합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #1e293b; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;활용 사례&lt;/b&gt;&lt;/h4&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 style=&quot;background-color: #f0f0f0;&quot;&gt;
&lt;td&gt;코드 작성 지원&lt;/td&gt;
&lt;td&gt;&amp;ldquo;Upstash Redis를 사용하여 Rate Limiting을 구현하는 최신 코드를 알려줘&amp;rdquo;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;오류 수정&lt;/td&gt;
&lt;td&gt;&amp;ldquo;이 코드가 최신 SDK 버전에서도 유효한지 문서를 기반으로 확인해 줘&amp;rdquo;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;background-color: #f0f0f0;&quot;&gt;
&lt;td&gt;API 사용법 확인&lt;/td&gt;
&lt;td&gt;&amp;ldquo;이 API 호출에서 401 에러가 발생하는데 문서 상에서 가능한 원인이 무엇인지 알려줘&amp;rdquo;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;마이그레이션 지원&lt;/td&gt;
&lt;td&gt;&amp;ldquo;Kafka 클라이언트 v1에서 v2로 마이그레이션할 때 주의할 점을 문서에서 찾아줘&amp;rdquo;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Terraform&amp;nbsp;&lt;/b&gt; &lt;br /&gt;클라우드&amp;nbsp;인프라를&amp;nbsp;직접&amp;nbsp;배포하고&amp;nbsp;관리할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;돕는&amp;nbsp;서버입니다.&lt;br /&gt;&lt;a href=&quot;https://developer.hashicorp.com/terraform/mcp-server&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.hashicorp.com/terraform/mcp-server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1773563697436&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;Terraform MCP server overview | Terraform | HashiCorp Developer&quot; data-og-description=&quot;Learn about the Terraform model context protocol (MCP) server and how it can help you write Terraform configuration using AI.&quot; data-og-host=&quot;developer.hashicorp.com&quot; data-og-source-url=&quot;https://developer.hashicorp.com/terraform/mcp-server&quot; data-og-url=&quot;https://developer.hashicorp.com/terraform/mcp-server&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/H9a9n/dJMb9bv0YDT/9YfpCbYSg2kR5Kn346eqMk/img.jpg?width=3200&amp;amp;height=1800&amp;amp;face=0_0_3200_1800,https://scrap.kakaocdn.net/dn/iNpnD/dJMb9b3QJwY/k32mUz4b14ZkRXOfqhI1F1/img.jpg?width=3200&amp;amp;height=1800&amp;amp;face=0_0_3200_1800&quot;&gt;&lt;a href=&quot;https://developer.hashicorp.com/terraform/mcp-server&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.hashicorp.com/terraform/mcp-server&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/H9a9n/dJMb9bv0YDT/9YfpCbYSg2kR5Kn346eqMk/img.jpg?width=3200&amp;amp;height=1800&amp;amp;face=0_0_3200_1800,https://scrap.kakaocdn.net/dn/iNpnD/dJMb9b3QJwY/k32mUz4b14ZkRXOfqhI1F1/img.jpg?width=3200&amp;amp;height=1800&amp;amp;face=0_0_3200_1800');&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;Terraform MCP server overview | Terraform | HashiCorp Developer&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Learn about the Terraform model context protocol (MCP) server and how it can help you write Terraform configuration using AI.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.hashicorp.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #1e293b; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;br /&gt;주요 기능&lt;/b&gt;&lt;/h4&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 style=&quot;background-color: #f0f0f0;&quot;&gt;
&lt;td&gt;문서 검색 및 조회&lt;/td&gt;
&lt;td&gt;리소스, 데이터 소스, 함수 및 설정 가이드 등 포괄적인 프로바이더 문서를 검색하고 상세 내용을 검색하며 최신 버전을 조회합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;모듈 탐색 및 조회&lt;/td&gt;
&lt;td&gt;커뮤니티 및 검증된 모듈을 이름/기능별로 검색하고 입/출력, 예시, 하위 모듈 등 상세 정보 및 최신 버전을 조회합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;background-color: #f0f0f0;&quot;&gt;
&lt;td&gt;정책 검색 및 조회&lt;/td&gt;
&lt;td&gt;거버넌스 및 규정 준수를 위한 Sentinel 정책을 검색하고 구현 세부 정보 및 사용 지침을 조회합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;워크스페이스 관리&lt;/td&gt;
&lt;td&gt;Terraform Cloud/Enterprise 조직, 프로젝트, 워크스페이스를 생성, 조회, 수정, 삭제합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;background-color: #f0f0f0;&quot;&gt;
&lt;td&gt;실행 관리&lt;/td&gt;
&lt;td&gt;워크스페이스 내에서 실행 목록을 조회, 상세 정보를 확인 및 생성하며 실행에 대한 작업을 수행합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;사설 Registry&lt;/td&gt;
&lt;td&gt;조직 내 사설 모듈 및 사설 프로바이더를 검색하고 상세 정보를 조회합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;background-color: #f0f0f0;&quot;&gt;
&lt;td&gt;변수 및 변수 세트 관리&lt;/td&gt;
&lt;td&gt;조직 내 변수 세트를 생성하고 목록을 조회하며 워크스페이스에 연결 및 분리하고, 변수를 생성, 수정, 목록 조회합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;워크스페이스 태깅&lt;/td&gt;
&lt;td&gt;워크스페이스에 태그를 추가 및 조회하여 리소스를 체계적으로 분류하고 정리합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #1e293b; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;활용 사례&lt;/b&gt;&lt;/h4&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 style=&quot;background-color: #f0f0f0;&quot;&gt;
&lt;td&gt;프로바이더 문서 활용&lt;/td&gt;
&lt;td&gt;&amp;ldquo;AWS S3 버킷을 버전 관리 활성화하여 구성하는 방법을 알려줘&amp;rdquo;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;모듈 활용&lt;/td&gt;
&lt;td&gt;&amp;ldquo;AWS에 Kubernetes 클러스터를 배포하기 위한 모듈을 보여줘.&amp;rdquo;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;background-color: #f0f0f0;&quot;&gt;
&lt;td&gt;정책 활용&lt;/td&gt;
&lt;td&gt;&amp;ldquo;보안 모범 사례를 강제하기 위해 사용할 수 있는 Sentinel 정책이 무엇인지 알려줘.&amp;rdquo;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;워크스페이스 관리&lt;/td&gt;
&lt;td&gt;&amp;ldquo;내 조직에 &amp;lsquo;production-app&amp;rsquo;이라는 새 워크스페이스를 생성해 줘&amp;rdquo;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;background-color: #f0f0f0;&quot;&gt;
&lt;td&gt;실행 관리&lt;/td&gt;
&lt;td&gt;&amp;ldquo;staging 워크스페이스에 대한 모든 실행 목록을 보여줘&amp;rdquo;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;사설 모듈 검색&lt;/td&gt;
&lt;td&gt;&amp;ldquo;AWS 관련 사설 모듈을 모두 나열해 줘&amp;rdquo;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;background-color: #f0f0f0;&quot;&gt;
&lt;td&gt;변수 세트 관리&lt;/td&gt;
&lt;td&gt;&amp;ldquo;데이터베이스 구성을 위한 변수 세트를 생성해 줘&amp;rdquo;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;태깅 관리&lt;/td&gt;
&lt;td&gt;&amp;ldquo;개발 환경에 해당하는 모든 워크스페이스에 &amp;lsquo;env:dev&amp;rsquo; 태그를 추가해 줘.&amp;rdquo;&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Notion&lt;/b&gt; &lt;br /&gt;프로젝트&amp;nbsp;관리에서&amp;nbsp;많이&amp;nbsp;쓰이는&amp;nbsp;노션&amp;nbsp;데이터베이스&amp;nbsp;및&amp;nbsp;페이지를&amp;nbsp;검색,&amp;nbsp;수정,&amp;nbsp;생성을&amp;nbsp;하는&amp;nbsp;서버입니다.&lt;br /&gt;&lt;a href=&quot;https://developers.notion.com/guides/mcp/mcp&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developers.notion.com/guides/mcp/mcp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1773563818292&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;Notion MCP - Notion Docs&quot; data-og-description=&quot;Learn how to connect AI agents to your Notion workspace.&quot; data-og-host=&quot;developers.notion.com&quot; data-og-source-url=&quot;https://developers.notion.com/guides/mcp/mcp&quot; data-og-url=&quot;https://developers.notion.com/guides/mcp/mcp&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/rbxmG/dJMb9efcCxq/ER8dlSVpAOVYPzItroLPx0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/d1pV1F/dJMb8RRQze9/4Qcb1Dx4PgDozLxajea25k/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/dsLVHb/dJMb9cBGMHV/kP44okdCrdMXg1tKVrg5KK/img.png?width=1346&amp;amp;height=518&amp;amp;face=0_0_1346_518&quot;&gt;&lt;a href=&quot;https://developers.notion.com/guides/mcp/mcp&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developers.notion.com/guides/mcp/mcp&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/rbxmG/dJMb9efcCxq/ER8dlSVpAOVYPzItroLPx0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/d1pV1F/dJMb8RRQze9/4Qcb1Dx4PgDozLxajea25k/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/dsLVHb/dJMb9cBGMHV/kP44okdCrdMXg1tKVrg5KK/img.png?width=1346&amp;amp;height=518&amp;amp;face=0_0_1346_518');&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;Notion MCP - Notion Docs&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Learn how to connect AI agents to your Notion workspace.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developers.notion.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #1e293b; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;주요 기능&lt;/b&gt;&lt;/h4&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 style=&quot;background-color: #f0f0f0;&quot;&gt;
&lt;td&gt;문서 생성&lt;/td&gt;
&lt;td&gt;단순 페이지 생성뿐만 아니라 새로운 데이터베이스(표, 보드 등)를 설계하여 만들거나 기존 템플릿 페이지를 복제합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;통합 검색&lt;/td&gt;
&lt;td&gt;Notion 워크스페이스는 물론, 연결된 Slack, Google Drive, Jira 등 외부 도구까지 한 번에 검색하여 관련 정보를 찾아냅니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;background-color: #f0f0f0;&quot;&gt;
&lt;td&gt;작업 관리&lt;/td&gt;
&lt;td&gt;페이지나 데이터베이스를 다른 상위 페이지로 이동시켜 워크스페이스 구조를 자동으로 정리하고 페이지의 상태나 날짜 등의 속성을 업데이트합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;협업 및 댓글 관리&lt;/td&gt;
&lt;td&gt;댓글을 남기거나 기존 댓글 스레드를 읽어오고 워크스페이스 내 팀원 정보를 조회합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #1e293b; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;활용 사례&lt;/b&gt;&lt;/h4&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 style=&quot;background-color: #f0f0f0;&quot;&gt;
&lt;td&gt;프로젝트 초기 세팅&lt;/td&gt;
&lt;td&gt;&amp;ldquo;새로운 &amp;lsquo;Q4 프로젝트&amp;rsquo; 데이터베이스를 만들고 담당자, 마감일, 진행 상태 열을 추가해 줘. 그리고 회의록 템플릿을 복사해서 넣어줘.&amp;rdquo;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;통합 정보 검색 및 요약&lt;/td&gt;
&lt;td&gt;&amp;ldquo;Slack과 Notion에서 &amp;lsquo;버그 수정&amp;rsquo;과 관련된 지난주 논의 내용을 모두 검색해서 &amp;lsquo;개발팀&amp;rsquo; 페이지에 요약 보고서로 만들어줘&amp;rdquo;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;background-color: #f0f0f0;&quot;&gt;
&lt;td&gt;워크플로우 자동화&lt;/td&gt;
&lt;td&gt;&amp;ldquo;오늘 날짜가 지난 모든 태스크의 상태를 &amp;lsquo;지연(Overdue)&amp;rsquo;으로 변경하고 담당자에게 확인 요청 코멘트를 달아줘.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;문서 구조 조정&lt;/td&gt;
&lt;td&gt;&amp;ldquo;임시 보관함에 있는 모든 회의록 페이지를 &amp;lsquo;2024년 회의 아카이브&amp;rsquo; 페이지 하위로 이동시켜줘.&amp;rdquo;&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Chrome&amp;nbsp;DevTools &lt;br /&gt;Chrome&amp;nbsp;개발자&amp;nbsp;도구의&amp;nbsp;기능을&amp;nbsp;제공하여&amp;nbsp;웹&amp;nbsp;디버깅&amp;nbsp;및&amp;nbsp;프론트엔드&amp;nbsp;개발&amp;nbsp;자동화에&amp;nbsp;도움이&amp;nbsp;되는&amp;nbsp;서버입니다.&lt;br /&gt;&lt;a href=&quot;https://github.com/ChromeDevTools/chrome-devtools-mcp&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/ChromeDevTools/chrome-devtools-mcp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1773563900260&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - ChromeDevTools/chrome-devtools-mcp: Chrome DevTools for coding agents&quot; data-og-description=&quot;Chrome DevTools for coding agents. Contribute to ChromeDevTools/chrome-devtools-mcp development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/ChromeDevTools/chrome-devtools-mcp&quot; data-og-url=&quot;https://github.com/ChromeDevTools/chrome-devtools-mcp&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/E0Qxv/dJMb8Xkd2Dd/qhMPYwtGEhce4SKo83Ejak/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/ThRSF/dJMb88eZj2c/yv2BdXAUodBxnaXMBmxGLK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/ChromeDevTools/chrome-devtools-mcp&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/ChromeDevTools/chrome-devtools-mcp&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/E0Qxv/dJMb8Xkd2Dd/qhMPYwtGEhce4SKo83Ejak/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/ThRSF/dJMb88eZj2c/yv2BdXAUodBxnaXMBmxGLK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_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;GitHub - ChromeDevTools/chrome-devtools-mcp: Chrome DevTools for coding agents&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Chrome DevTools for coding agents. Contribute to ChromeDevTools/chrome-devtools-mcp development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #1e293b; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;주요 기능&lt;/b&gt;&lt;/h4&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 style=&quot;background-color: #f0f0f0;&quot;&gt;
&lt;td&gt;콘솔 제어&lt;/td&gt;
&lt;td&gt;브라우저 콘솔 로그를 확인하거나 자바스크립트 코드를 실행합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DOM 검사&lt;/td&gt;
&lt;td&gt;현재 웹페이지의 DOM 구조를 탐색하고 특정 요소의 속성을 확인합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;background-color: #f0f0f0;&quot;&gt;
&lt;td&gt;네트워크 분석&lt;/td&gt;
&lt;td&gt;웹페이지 로딩 시 발생하는 네트워크 요청 및 응답 헤더/바디를 캡처하여 분석합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #1e293b; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;활용 사례&lt;/b&gt;&lt;/h4&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 style=&quot;background-color: #f0f0f0;&quot;&gt;
&lt;td&gt;반응형 테스트&lt;/td&gt;
&lt;td&gt;&amp;ldquo;모바일 뷰포트로 변경했을 때 메뉴 바가 정상적으로 보이는지 스크린샷을 찍어줘&amp;rdquo;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;에러 디버깅&lt;/td&gt;
&lt;td&gt;&amp;ldquo;콘솔에 출력된 에러 메시지를 확인하고 원인을 분석해 줘&amp;rdquo;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;background-color: #f0f0f0;&quot;&gt;
&lt;td&gt;UI 테스트&lt;/td&gt;
&lt;td&gt;&amp;ldquo;로그인 버튼의 DOM 요소가 올바르게 렌더링 되었는지 확인해 줘&amp;rdquo;&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;4. 클로드 코드에서 MCP 세팅 및 사용하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Claude&amp;nbsp;Code&lt;/b&gt;&lt;/span&gt;에서&amp;nbsp;MCP(Model&amp;nbsp;Context&amp;nbsp;Protocol)를&amp;nbsp;설정하려면&amp;nbsp;구성&amp;nbsp;파일(mcp.json&amp;nbsp;또는&amp;nbsp;managed-mcp.json)을&amp;nbsp;생성하여&amp;nbsp;MCP&amp;nbsp;서버의&amp;nbsp;실행&amp;nbsp;명령어를&amp;nbsp;명시해야&amp;nbsp;합니다.&amp;nbsp;npm&amp;nbsp;또는&amp;nbsp;npx를&amp;nbsp;사용하여&amp;nbsp;파일을&amp;nbsp;작성한&amp;nbsp;뒤,&amp;nbsp;Claude&amp;nbsp;Code&amp;nbsp;내에서&amp;nbsp;MCP&amp;nbsp;도구를&amp;nbsp;통해&amp;nbsp;외부&amp;nbsp;데이터와&amp;nbsp;기능을&amp;nbsp;연동합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MCP&amp;nbsp;구성&amp;nbsp;파일&amp;nbsp;생성:&amp;nbsp;~/.config/claude-code/&lt;b&gt;mcp.json&lt;/b&gt;&amp;nbsp;파일을&amp;nbsp;생성하여&amp;nbsp;MCP&amp;nbsp;서버를&amp;nbsp;등록합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1773564168066&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;mcpServers&quot;: {
    &quot;example-server&quot;: {
      &quot;command&quot;: &quot;npx&quot;,
      &quot;args&quot;: [&quot;-y&quot;, &quot;@modelcontextprotocol/server-everything&quot;]
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 &amp;gt; .claude 에 mcp 를 검색해 보면 저는 이렇게 쓰고 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1773564607582&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;projects&quot;: {
    &quot;C:/APM/Apache24/htdocs/www&quot;: {
      &quot;allowedTools&quot;: [],
      &quot;mcpContextUris&quot;: [],
      &quot;mcpServers&quot;: {
        &quot;context7&quot;: {
          &quot;type&quot;: &quot;http&quot;,
          &quot;url&quot;: &quot;https://mcp.context7.com/mcp&quot;
        },
        &quot;sequential-thinking&quot;: {
          &quot;command&quot;: &quot;npx&quot;,
          &quot;args&quot;: [
            &quot;-y&quot;,
            &quot;@modelcontextprotocol/server-sequential-thinking&quot;
          ]
        },
        &quot;playwright&quot;: {
          &quot;type&quot;: &quot;stdio&quot;,
          &quot;command&quot;: &quot;npx&quot;,
          &quot;args&quot;: [
            &quot;@playwright/mcp@latest&quot;
          ],
          &quot;env&quot;: {}
        },&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실행&amp;nbsp;및&amp;nbsp;확인&lt;/b&gt;:&amp;nbsp;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Claude&amp;nbsp;Code&lt;/b&gt;&lt;/span&gt;를&amp;nbsp;실행하고&amp;nbsp;&lt;b&gt;/mcp&amp;nbsp;&lt;/b&gt;명령어를&amp;nbsp;사용하여&amp;nbsp;서버가&amp;nbsp;정상적으로&amp;nbsp;로드되었는지&amp;nbsp;확인합니다.&lt;/p&gt;</description>
      <category>AI</category>
      <category>Context7</category>
      <category>mcp 세팅</category>
      <category>MCP란</category>
      <category>model context protocol</category>
      <category>terraform mcp</category>
      <category>개발자가주로사용하는mcp</category>
      <author>은둔한량</author>
      <guid isPermaLink="true">https://koreanred.tistory.com/201</guid>
      <comments>https://koreanred.tistory.com/201#entry201comment</comments>
      <pubDate>Sun, 15 Mar 2026 17:53:07 +0900</pubDate>
    </item>
    <item>
      <title>Claude Code (클로드 코드) 설치 및 사용법</title>
      <link>https://koreanred.tistory.com/200</link>
      <description>&lt;h2 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Claude Code란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code는 Anthropic에서 개발한 생성형 AI 모델 Claude를 기반으로 한 코드 생성&amp;middot;분석 특화 AI 활용 방식을 의미합니다. &lt;br /&gt;쉽게 말해, &amp;ldquo;Claude를 활용해 개발 업무를 자동화&amp;middot;보조하는 개발 워크플로우&amp;rdquo;라고 이해하면 됩니다.&lt;br /&gt;특히&amp;nbsp;최근에는&amp;nbsp;IDE(예:&amp;nbsp;Cursor)나&amp;nbsp;다양한&amp;nbsp;개발&amp;nbsp;환경에서&amp;nbsp;Claude&amp;nbsp;모델을&amp;nbsp;연동해&amp;nbsp;코드&amp;nbsp;작성,&amp;nbsp;리팩토링,&amp;nbsp;디버깅,&amp;nbsp;문서화,&amp;nbsp;테스트&amp;nbsp;코드&amp;nbsp;생성&amp;nbsp;등을&amp;nbsp;수행하는&amp;nbsp;형태로&amp;nbsp;많이&amp;nbsp;사용됩니다.&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Claude Code의 핵심 개념&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude&amp;nbsp;Code는&amp;nbsp;단순한&amp;nbsp;코드&amp;nbsp;자동완성이&amp;nbsp;아닙니다. &lt;br /&gt;다음과 같은 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;&amp;ldquo;맥락 이해 기반 개발 보조&amp;rdquo;&lt;/b&gt;&lt;/span&gt;에 강점이 있습니다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;1) 대규모 코드 컨텍스트 이해 &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Claude는 긴 컨텍스트를 처리할 수 있어: &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 프로젝트 전체 구조 분석 &lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; 여러 파일 간 의존성 이해 &lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; 기존 코드 스타일 유지 &lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; 레거시 코드 리팩토링 &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 등이 가능합니다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp; 2) 자연어 기반 코드 생성 &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 예시:&lt;/p&gt;
&lt;pre id=&quot;code_1772151827287&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;ldquo;CodeIgniter4에서 MariaDB 기반 로그인 세션 처리 로직 만들어줘&amp;rdquo;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; 처럼 설명하면: &lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&amp;nbsp;Controller &lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&amp;nbsp;Model &lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&amp;nbsp;Validation &lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&amp;nbsp;Session 처리 &lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&amp;nbsp;보안 고려사항 &lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; 까지 포함해 코드 초안을 만들어줍니다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;3) 리팩토링 &amp;amp; 코드 개선 &lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&amp;nbsp;성능 개선 &lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&amp;nbsp;보안 취약점 분석 &lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&amp;nbsp;메모리 누수 가능성 점검 &lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&amp;nbsp;비동기 처리 개선 &lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&amp;nbsp;쿼리 최적화 제안 &lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&amp;nbsp;특히 대형 프로젝트에서 강점이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 설치&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) npm 방법 (Node.js 설치가 되어 있으면 이 방법을 선택하세요.)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;npm&amp;nbsp;방법을&amp;nbsp;꼭&amp;nbsp;써야&amp;nbsp;한다면,&amp;nbsp;먼저&amp;nbsp;Node.js를&amp;nbsp;설치해야&amp;nbsp;합니다.&lt;br /&gt;&lt;br /&gt;1 단계: Node.js 설치 &lt;br /&gt;&amp;nbsp; &amp;nbsp;- &lt;a href=&quot;https://nodejs.org&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://nodejs.org&lt;/a&gt;&amp;nbsp;접속 &lt;br /&gt;&amp;nbsp; &amp;nbsp;- LTS 버전 다운로드 및 설치 &lt;br /&gt;&amp;nbsp; &amp;nbsp;- 설치 후 PowerShell을 완전히 닫고 새로 열기 (PATH 갱신)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2 단계: 설치확인&lt;br /&gt;&lt;span&gt;&lt;span&gt;node &lt;/span&gt;&lt;span style=&quot;color: #eaecf0;&quot;&gt;--&lt;/span&gt;&lt;span&gt;version &lt;/span&gt;&lt;span style=&quot;color: #818898;&quot;&gt;# v18.x.x 이상이어야 함&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;npm &lt;/span&gt;&lt;span style=&quot;color: #eaecf0;&quot;&gt;--&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;version&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;3 단계 설치&amp;nbsp;&lt;br /&gt;npm&amp;nbsp;install&amp;nbsp;-g&amp;nbsp;@anthropic-ai/claude-code&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772152165885&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install -g @anthropic-ai/claude-code&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bp2BSd/dJMcacPJQPc/Qc7WPDrPbjtiE54lEkt6gK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bp2BSd/dJMcacPJQPc/Qc7WPDrPbjtiE54lEkt6gK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bp2BSd/dJMcacPJQPc/Qc7WPDrPbjtiE54lEkt6gK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbp2BSd%2FdJMcacPJQPc%2FQc7WPDrPbjtiE54lEkt6gK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;852&quot; height=&quot;320&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;320&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;npm install -g @anthropic-ai/claude-code&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 컴퓨터 윈도우 OS 에서 claude를 설치 하려고 했더니 에러가 났다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1139&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QBXW9/dJMcafTiLjB/GwBDdTO53Mi8EUy2NgGm11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QBXW9/dJMcafTiLjB/GwBDdTO53Mi8EUy2NgGm11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QBXW9/dJMcafTiLjB/GwBDdTO53Mi8EUy2NgGm11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQBXW9%2FdJMcafTiLjB%2FGwBDdTO53Mi8EUy2NgGm11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1139&quot; height=&quot;222&quot; data-origin-width=&quot;1139&quot; data-origin-height=&quot;222&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NPM을 찾을 수 없다는 오류입니다. &lt;b&gt;Node.js가 설치되어 있지 않아서&lt;/b&gt; 발생하는 문제입니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2)&amp;nbsp; 네이티브 설치 (&lt;span style=&quot;color: #ee2323;&quot;&gt;권장&lt;/span&gt; &amp;mdash; Node.js 불필요) &lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Windows에서 Claude Code를 설치하는 방법중&amp;nbsp; 현재 &lt;b&gt;가장 쉬운 방법(네이티브 설치)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://code.claude.com/docs/ko/overview&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://code.claude.com/docs/ko/overview&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Windows CMD:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772816217230&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -fsSL https://claude.ai/install.cmd -o install.cmd &amp;amp;&amp;amp; install.cmd &amp;amp;&amp;amp; del install.cmd&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1252&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Bx3bF/dJMcahKmBrK/iKUcojAqIUHocGzGwX6ZKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Bx3bF/dJMcahKmBrK/iKUcojAqIUHocGzGwX6ZKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Bx3bF/dJMcahKmBrK/iKUcojAqIUHocGzGwX6ZKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBx3bF%2FdJMcahKmBrK%2FiKUcojAqIUHocGzGwX6ZKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1252&quot; height=&quot;116&quot; data-origin-width=&quot;1252&quot; data-origin-height=&quot;116&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치시 git-bash error가 나면 git for windows가 설치 안되어서 에러가 나는겁니다. 아래 링크에서 설치 !!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://git-scm.com/install/windows&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://git-scm.com/install/windows&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1772817670069&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;Git - Install for Windows&quot; data-og-description=&quot;Click here to download the latest (2.53.0) x64 version of Git for Windows. This is the most recent maintained build. It was released on 2026-02-02. Other Git for Windows downloads Standalone Installer Git for Windows/x64 Setup. Git for Windows/ARM64 Setup.&quot; data-og-host=&quot;git-scm.com&quot; data-og-source-url=&quot;https://git-scm.com/install/windows&quot; data-og-url=&quot;https://git-scm.com/install/windows&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://git-scm.com/install/windows&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://git-scm.com/install/windows&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&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;Git - Install for Windows&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Click here to download the latest (2.53.0) x64 version of Git for Windows. This is the most recent maintained build. It was released on 2026-02-02. Other Git for Windows downloads Standalone Installer Git for Windows/x64 Setup. Git for Windows/ARM64 Setup.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;git-scm.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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Y1anr/dJMcacChjkZ/hw96kFlh3S1dRE4CqXCDA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Y1anr/dJMcacChjkZ/hw96kFlh3S1dRE4CqXCDA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Y1anr/dJMcacChjkZ/hw96kFlh3S1dRE4CqXCDA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FY1anr%2FdJMcacChjkZ%2Fhw96kFlh3S1dRE4CqXCDA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;595&quot; height=&quot;460&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;460&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git 설치후 다시 명령어를 치면 클로드코드가 설치 완료됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMqlEL/dJMb99ZSeGL/59br7Zm0X2ZaTGPlRv0yBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMqlEL/dJMb99ZSeGL/59br7Zm0X2ZaTGPlRv0yBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMqlEL/dJMb99ZSeGL/59br7Zm0X2ZaTGPlRv0yBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMqlEL%2FdJMb99ZSeGL%2F59br7Zm0X2ZaTGPlRv0yBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1254&quot; height=&quot;380&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;380&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 설치 확인&lt;/p&gt;
&lt;pre id=&quot;code_1772817941573&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;claude --version&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;341&quot; data-origin-height=&quot;66&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FQroN/dJMcafMyrKa/d5mAuYpdDLYUD9ufIF0vGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FQroN/dJMcafMyrKa/d5mAuYpdDLYUD9ufIF0vGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FQroN/dJMcafMyrKa/d5mAuYpdDLYUD9ufIF0vGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFQroN%2FdJMcafMyrKa%2Fd5mAuYpdDLYUD9ufIF0vGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;341&quot; height=&quot;66&quot; data-origin-width=&quot;341&quot; data-origin-height=&quot;66&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. claude code 실행&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널에서 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;claude&lt;/b&gt;&lt;/span&gt; 만 치면 클로드코드가 실행이 됩니다. (커서, vs code 등 terminal 에서 치면 됩니다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;718&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w5jk2/dJMcaiiaSt0/hjtR6XMtftt9GcAE5eeGZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w5jk2/dJMcaiiaSt0/hjtR6XMtftt9GcAE5eeGZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w5jk2/dJMcaiiaSt0/hjtR6XMtftt9GcAE5eeGZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw5jk2%2FdJMcaiiaSt0%2FhjtR6XMtftt9GcAE5eeGZk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;776&quot; height=&quot;718&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;718&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;529&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lh7LG/dJMcagklW4I/2VPs3HW3BmZoA0jzyKaOb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lh7LG/dJMcagklW4I/2VPs3HW3BmZoA0jzyKaOb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lh7LG/dJMcagklW4I/2VPs3HW3BmZoA0jzyKaOb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flh7LG%2FdJMcagklW4I%2F2VPs3HW3BmZoA0jzyKaOb0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;524&quot; height=&quot;529&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;529&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 회사에서 결제를 해줘서 사용하고 있습니다. 계정을 연결하고 유료 요금제를 선택해야 사용을 하실 수가 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V12wK/dJMcacChjoW/2Ktp3GigVr9z2V0PMemsC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V12wK/dJMcacChjoW/2Ktp3GigVr9z2V0PMemsC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V12wK/dJMcacChjoW/2Ktp3GigVr9z2V0PMemsC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV12wK%2FdJMcacChjoW%2F2Ktp3GigVr9z2V0PMemsC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;418&quot; height=&quot;128&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;128&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O6Hrw/dJMcaiCob0h/McV62JqZvhAXXNVkd2J6nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O6Hrw/dJMcaiCob0h/McV62JqZvhAXXNVkd2J6nk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O6Hrw/dJMcaiCob0h/McV62JqZvhAXXNVkd2J6nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO6Hrw%2FdJMcaiCob0h%2FMcV62JqZvhAXXNVkd2J6nk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1290&quot; height=&quot;302&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;302&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1540&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sn9fF/dJMcaivBWId/QI7eoWbmIEHUMqXpTrkkP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sn9fF/dJMcaivBWId/QI7eoWbmIEHUMqXpTrkkP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sn9fF/dJMcaivBWId/QI7eoWbmIEHUMqXpTrkkP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsn9fF%2FdJMcaivBWId%2FQI7eoWbmIEHUMqXpTrkkP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1540&quot; height=&quot;325&quot; data-origin-width=&quot;1540&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FKbXr/dJMcabpQT29/RbbL97bBj8Rgl0pUEDmWc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FKbXr/dJMcabpQT29/RbbL97bBj8Rgl0pUEDmWc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FKbXr/dJMcabpQT29/RbbL97bBj8Rgl0pUEDmWc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFKbXr%2FdJMcabpQT29%2FRbbL97bBj8Rgl0pUEDmWc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;906&quot; height=&quot;406&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;406&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뭘 좀 사용하다보면 사용량 한도가 금방 차지합니다. 월 $100 짜리인데 조금 쓰다 보면 5시간 사용량 한도가 차더라구요&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;살살 써야겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLA8HD/dJMcajg2Ikt/egOVMFAx7xNWnsmhoMAQjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLA8HD/dJMcajg2Ikt/egOVMFAx7xNWnsmhoMAQjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLA8HD/dJMcajg2Ikt/egOVMFAx7xNWnsmhoMAQjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLA8HD%2FdJMcajg2Ikt%2FegOVMFAx7xNWnsmhoMAQjK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1216&quot; height=&quot;616&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* mcp 추가 - 제가 추가한 mcp 입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;573&quot; data-origin-height=&quot;210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgK5fG/dJMcadOz1do/oFp5A9KYfk2JrDYbgraItk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgK5fG/dJMcadOz1do/oFp5A9KYfk2JrDYbgraItk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgK5fG/dJMcadOz1do/oFp5A9KYfk2JrDYbgraItk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgK5fG%2FdJMcadOz1do%2FoFp5A9KYfk2JrDYbgraItk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;573&quot; height=&quot;210&quot; data-origin-width=&quot;573&quot; data-origin-height=&quot;210&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;* Claude Code Dangerous Mode (--dangerously-skip-permissions)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 Claude Code는 파일 수정, 명령어 실행 등 &lt;b&gt;모든 작업마다 사용자 승인을 요청&lt;/b&gt;합니다.&lt;br /&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;Dangerous mode는 이 승인 과정을 &lt;/span&gt;&lt;b&gt;전부 건너뜀&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772818808779&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;claude --dangerously-skip-permissions&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언제 쓰나?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자동화 스크립트 / CI-CD 파이프라인에서 무인(unattended) 실행&lt;/li&gt;
&lt;li&gt;승인 없이 대량 파일 작업을 빠르게 처리할 때&lt;/li&gt;
&lt;li&gt;Docker 등 &lt;b&gt;격리된 환경&lt;/b&gt;에서 실행할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;4. Claude Code의 장점 &lt;br /&gt;&lt;br /&gt;&amp;nbsp; - 대형 코드베이스 이해 능력&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; -&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; 논리적이고 정돈된 코드 출력&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; -&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; 긴 문맥 유지&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; -&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; 기술&amp;nbsp;문서&amp;nbsp;자동화&amp;nbsp;능력&amp;nbsp;우수 &lt;br /&gt;&lt;br /&gt;5. 한계점 &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; -&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; 매우&amp;nbsp;최신&amp;nbsp;라이브러리&amp;nbsp;정보는&amp;nbsp;제한적일&amp;nbsp;수&amp;nbsp;있음 &lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; -&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; 실행&amp;nbsp;테스트는&amp;nbsp;직접&amp;nbsp;필요 &lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; -&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;b&gt;프롬프트&amp;nbsp;설계&amp;nbsp;능력에&amp;nbsp;따라&amp;nbsp;결과&amp;nbsp;품질&amp;nbsp;차이&amp;nbsp;발생&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;6. 결론 &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Claude&amp;nbsp;Code는&amp;nbsp;단순한&amp;nbsp;&amp;ldquo;코드&amp;nbsp;자동&amp;nbsp;완성&amp;nbsp;AI&amp;rdquo;가&amp;nbsp;아니라, &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;ldquo;프로젝트&amp;nbsp;전체를&amp;nbsp;이해하고&amp;nbsp;함께&amp;nbsp;설계하는&amp;nbsp;AI&amp;nbsp;개발&amp;nbsp;파트너&amp;rdquo; &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;에&amp;nbsp;가까운&amp;nbsp;개념입니다. &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;특히&amp;nbsp;대규모&amp;nbsp;서비스,&amp;nbsp;백엔드&amp;nbsp;구조&amp;nbsp;설계,&amp;nbsp;리팩토링,&amp;nbsp;코드&amp;nbsp;리뷰&amp;nbsp;자동화&amp;nbsp;분야에서&amp;nbsp;강력한&amp;nbsp;생산성&amp;nbsp;향상을&amp;nbsp;기대할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>AI</category>
      <category>Claude Code 사용법</category>
      <category>Claude Code 설치</category>
      <category>바이브코딩</category>
      <category>클로드코드 윈도우 설치</category>
      <category>클로드코드란 ?</category>
      <category>클로드코드이용하기</category>
      <author>은둔한량</author>
      <guid isPermaLink="true">https://koreanred.tistory.com/200</guid>
      <comments>https://koreanred.tistory.com/200#entry200comment</comments>
      <pubDate>Sat, 7 Mar 2026 02:42:44 +0900</pubDate>
    </item>
    <item>
      <title>클로드 코드 다른 계정으로 로그인 하는 방법</title>
      <link>https://koreanred.tistory.com/199</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;클로드 코드가 갑자기 회사에서 여러사람이 쓰다 보니 짤렸다. ㅠㅠ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 ....!!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;930&quot; data-origin-height=&quot;560&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMgJfb/dJMcadVpxYz/NayAbRAj3kBDdQVsaBU0K1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMgJfb/dJMcadVpxYz/NayAbRAj3kBDdQVsaBU0K1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMgJfb/dJMcadVpxYz/NayAbRAj3kBDdQVsaBU0K1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMgJfb%2FdJMcadVpxYz%2FNayAbRAj3kBDdQVsaBU0K1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;512&quot; height=&quot;308&quot; data-origin-width=&quot;930&quot; data-origin-height=&quot;560&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 다른 계정으로 급하게 교체를 하려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** 이건 공통으로 사용을 하다보니 limit가 도달을 했다고 또 메시지가 떴다.&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;421&quot; data-origin-height=&quot;52&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DYEOs/dJMcajnMu1p/jGnCtkGEKTxh6erkp6MKaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DYEOs/dJMcajnMu1p/jGnCtkGEKTxh6erkp6MKaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DYEOs/dJMcajnMu1p/jGnCtkGEKTxh6erkp6MKaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDYEOs%2FdJMcajnMu1p%2FjGnCtkGEKTxh6erkp6MKaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;421&quot; height=&quot;52&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;52&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 되어 있는 클로드 계정 정보 확인&lt;/p&gt;
&lt;pre id=&quot;code_1772672570220&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;claude auth status&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;188&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o6DCb/dJMcafyZpbY/m8KmJiWukNkKz6cjWZkxb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o6DCb/dJMcafyZpbY/m8KmJiWukNkKz6cjWZkxb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o6DCb/dJMcafyZpbY/m8KmJiWukNkKz6cjWZkxb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo6DCb%2FdJMcafyZpbY%2Fm8KmJiWukNkKz6cjWZkxb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;488&quot; height=&quot;200&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;188&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그아웃&lt;/p&gt;
&lt;pre id=&quot;code_1772672729988&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;claude auth logout

Successfully logged out from your Anthropic account.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 계정으로 다시 로그인&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1772672854952&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/login&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;443&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kOQz3/dJMcagLqK4Q/UrTFgGeS1mLBTNfbveALNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kOQz3/dJMcagLqK4Q/UrTFgGeS1mLBTNfbveALNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kOQz3/dJMcagLqK4Q/UrTFgGeS1mLBTNfbveALNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkOQz3%2FdJMcagLqK4Q%2FUrTFgGeS1mLBTNfbveALNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;616&quot; height=&quot;343&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;443&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;claude.ai 가 뜨고 로그아웃 후 다른 계정으로 로그인을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번 enter&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;983&quot; data-origin-height=&quot;698&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xcCGp/dJMcaiPWUa6/B2ShfFzhDyGFO7kttHzCkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xcCGp/dJMcaiPWUa6/B2ShfFzhDyGFO7kttHzCkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xcCGp/dJMcaiPWUa6/B2ShfFzhDyGFO7kttHzCkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxcCGp%2FdJMcaiPWUa6%2FB2ShfFzhDyGFO7kttHzCkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;429&quot; height=&quot;305&quot; data-origin-width=&quot;983&quot; data-origin-height=&quot;698&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1267&quot; data-origin-height=&quot;414&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djV3J8/dJMcagLqLgs/nKVlQcPKSg7XpNthTn2KR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djV3J8/dJMcagLqLgs/nKVlQcPKSg7XpNthTn2KR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djV3J8/dJMcagLqLgs/nKVlQcPKSg7XpNthTn2KR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdjV3J8%2FdJMcagLqLgs%2FnKVlQcPKSg7XpNthTn2KR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1267&quot; height=&quot;414&quot; data-origin-width=&quot;1267&quot; data-origin-height=&quot;414&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 아래 링크를 연결하면&amp;nbsp; 연결을 요청했습니다라는 창이 뜨고 승인을 누르면&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;930&quot; data-origin-height=&quot;1107&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/utkcZ/dJMcafyZprf/SPf1111fwkpK11dKgYhuok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/utkcZ/dJMcafyZprf/SPf1111fwkpK11dKgYhuok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/utkcZ/dJMcafyZprf/SPf1111fwkpK11dKgYhuok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FutkcZ%2FdJMcafyZprf%2FSPf1111fwkpK11dKgYhuok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;451&quot; height=&quot;537&quot; data-origin-width=&quot;930&quot; data-origin-height=&quot;1107&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Authentication Code 가 나오는데 이걸 카피해서 넣어주면 끝....&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1363&quot; data-origin-height=&quot;614&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVmasN/dJMcabDlDzj/nwAXXPVAJAKNUyuKJq4PS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVmasN/dJMcabDlDzj/nwAXXPVAJAKNUyuKJq4PS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVmasN/dJMcabDlDzj/nwAXXPVAJAKNUyuKJq4PS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVmasN%2FdJMcabDlDzj%2FnwAXXPVAJAKNUyuKJq4PS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;248&quot; data-origin-width=&quot;1363&quot; data-origin-height=&quot;614&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;319&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zGgSi/dJMcadOC3vs/Om121jx2jUNY72NrGoRQkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zGgSi/dJMcadOC3vs/Om121jx2jUNY72NrGoRQkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zGgSi/dJMcadOC3vs/Om121jx2jUNY72NrGoRQkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzGgSi%2FdJMcadOC3vs%2FOm121jx2jUNY72NrGoRQkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;319&quot; height=&quot;150&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;319&quot; data-origin-height=&quot;150&quot;/&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>AI</category>
      <category>claudecode계정교체</category>
      <category>클로드코드계정바꾸기</category>
      <category>클로드코드사용법</category>
      <author>은둔한량</author>
      <guid isPermaLink="true">https://koreanred.tistory.com/199</guid>
      <comments>https://koreanred.tistory.com/199#entry199comment</comments>
      <pubDate>Thu, 5 Mar 2026 10:41:29 +0900</pubDate>
    </item>
    <item>
      <title>[Git] 브랜치와 커밋 메시지에서 사용하는 prefix</title>
      <link>https://koreanred.tistory.com/198</link>
      <description>&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;브랜치와 커밋 메시지에서 사용할 수 있는 다양한 prefix가 있다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;각 prefix는 특정한 변경 유형을 나타내고, 팀이나 프로젝트에 따라 다를 수 있다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;일반적으로 많이 사용되는 prefix는 다음과 같다.&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1. Branch prefix&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;브랜치는 주로 작업의 유형을 나타내는 이름으로 구성된다.&lt;/p&gt;
&lt;table style=&quot;background-color: #ffffff; color: #666666; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; width=&quot;749&quot; data-ke-style=&quot;style12&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef; color: #ffffff; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;프리픽스&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #efefef; color: #ffffff; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;형식&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #efefef; color: #ffffff; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #efefef; color: #ffffff; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;예시&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #dcdddd; color: #666666;&quot;&gt;&lt;b&gt;Feature&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666;&quot;&gt;feature/&amp;lt;이름&amp;gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666;&quot;&gt;새로운 기능 개발&lt;/td&gt;
&lt;td style=&quot;color: #666666;&quot;&gt;feature/user-authentication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #dcdddd; color: #666666;&quot;&gt;&lt;b&gt;Bugfix&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f0f0f0; color: #666666;&quot;&gt;bugfix/&amp;lt;이름&amp;gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f0f0f0; color: #666666;&quot;&gt;버그 수정&lt;/td&gt;
&lt;td style=&quot;background-color: #f0f0f0; color: #666666;&quot;&gt;bugfix/fix-login-error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #dcdddd; color: #666666;&quot;&gt;&lt;b&gt;Hotfix&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666;&quot;&gt;hotfix/&amp;lt;이름&amp;gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666;&quot;&gt;긴급 버그 수정&lt;/td&gt;
&lt;td style=&quot;color: #666666;&quot;&gt;hotfix/urgent-security-fix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #dcdddd; color: #666666;&quot;&gt;&lt;b&gt;Release&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f0f0f0; color: #666666;&quot;&gt;release/&amp;lt;버전&amp;gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f0f0f0; color: #666666;&quot;&gt;배포 준비 완료&lt;/td&gt;
&lt;td style=&quot;background-color: #f0f0f0; color: #666666;&quot;&gt;release/v1.0.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #dcdddd; color: #666666;&quot;&gt;&lt;b&gt;Chore&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666;&quot;&gt;chore/&amp;lt;이름&amp;gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666;&quot;&gt;잡무나 유지보수 작업&lt;/td&gt;
&lt;td style=&quot;color: #666666;&quot;&gt;chore/update-dependencies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #dcdddd; color: #666666;&quot;&gt;&lt;b&gt;Docs&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f0f0f0; color: #666666;&quot;&gt;docs/&amp;lt;이름&amp;gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f0f0f0; color: #666666;&quot;&gt;문서 관련 작업&lt;/td&gt;
&lt;td style=&quot;background-color: #f0f0f0; color: #666666;&quot;&gt;docs/update-readme&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #dcdddd; color: #666666;&quot;&gt;&lt;b&gt;Style&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666;&quot;&gt;style/&amp;lt;이름&amp;gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666;&quot;&gt;코드 스타일 변경&lt;/td&gt;
&lt;td style=&quot;color: #666666;&quot;&gt;style/improve-code-formatting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #dcdddd; color: #666666;&quot;&gt;&lt;b&gt;Refactor&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f0f0f0; color: #666666;&quot;&gt;refactor/&amp;lt;이름&amp;gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f0f0f0; color: #666666;&quot;&gt;코드 구조 개선&lt;/td&gt;
&lt;td style=&quot;background-color: #f0f0f0; color: #666666;&quot;&gt;refactor/optimize-query-performance&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; 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;2. Commit message prefix&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;커밋 메시지 제목은 변경 사항의 유형을 나타내는데 prefix가 사용된다.&lt;/p&gt;
&lt;table style=&quot;background-color: #ffffff; color: #666666; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef; color: #ffffff; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;프리픽&lt;/b&gt;&lt;b&gt;스&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #efefef; color: #ffffff; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #efefef; color: #ffffff; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;예시&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #dcdddd; color: #666666;&quot;&gt;&lt;b&gt;feat&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666;&quot;&gt;새로운 기능 추가&lt;/td&gt;
&lt;td style=&quot;color: #666666;&quot;&gt;feat: 사용자 로그인 기능 추가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #dcdddd; color: #666666;&quot;&gt;&lt;b&gt;fix&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f0f0f0; color: #666666;&quot;&gt;버그 수정&lt;/td&gt;
&lt;td style=&quot;background-color: #f0f0f0; color: #666666;&quot;&gt;fix: 로그인 예외 처리 버그 수정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #dcdddd; color: #666666;&quot;&gt;&lt;b&gt;hotfix&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666;&quot;&gt;긴급 버그 수정&lt;/td&gt;
&lt;td style=&quot;color: #666666;&quot;&gt;hotfix: 긴급 보안 패치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #dcdddd; color: #666666;&quot;&gt;&lt;b&gt;release&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f0f0f0; color: #666666;&quot;&gt;배포 준비 완료&lt;/td&gt;
&lt;td style=&quot;background-color: #f0f0f0; color: #666666;&quot;&gt;release: 버전 1.0.0 배포&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #dcdddd; color: #666666;&quot;&gt;&lt;b&gt;chore&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666;&quot;&gt;잡무나 유지보수 작업&lt;/td&gt;
&lt;td style=&quot;color: #666666;&quot;&gt;chore: 라이브러리 업데이트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #dcdddd; color: #666666;&quot;&gt;&lt;b&gt;docs&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f0f0f0; color: #666666;&quot;&gt;문서 수정&lt;/td&gt;
&lt;td style=&quot;background-color: #f0f0f0; color: #666666;&quot;&gt;docs: README 업데이트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #dcdddd; color: #666666;&quot;&gt;&lt;b&gt;style&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666;&quot;&gt;코드 스타일 수정&lt;/td&gt;
&lt;td style=&quot;color: #666666;&quot;&gt;style: 코드 포맷팅 수정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #dcdddd; color: #666666;&quot;&gt;&lt;b&gt;refactor&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f0f0f0; color: #666666;&quot;&gt;코드 구조 개선&lt;/td&gt;
&lt;td style=&quot;background-color: #f0f0f0; color: #666666;&quot;&gt;refactor: 쿼리 최적화&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>etc</category>
      <category>git commit prefix</category>
      <category>Git message</category>
      <category>git prefix</category>
      <category>git 커밋 프리픽스</category>
      <category>git 프리픽스</category>
      <author>은둔한량</author>
      <guid isPermaLink="true">https://koreanred.tistory.com/198</guid>
      <comments>https://koreanred.tistory.com/198#entry198comment</comments>
      <pubDate>Fri, 11 Jul 2025 12:28:34 +0900</pubDate>
    </item>
    <item>
      <title>Ubuntu | ubuntu ffmpeg install, 우분투 ffmpeg 설치하기</title>
      <link>https://koreanred.tistory.com/197</link>
      <description>&lt;h3 id=&quot;1.%20apt%20update-1&quot; style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;a style=&quot;color: #353638;&quot; href=&quot;https://iambeginnerdeveloper.tistory.com/309#1.%20apt%20update-1&quot;&gt;1. apt update&lt;/a&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1751004505883&quot; class=&quot;ebnf&quot; style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;sudo apt update&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;2.%20ffmpeg%20%EC%84%A4%EC%B9%98-1&quot; style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;a style=&quot;color: #353638;&quot; href=&quot;https://iambeginnerdeveloper.tistory.com/309#2.%20ffmpeg%20%EC%84%A4%EC%B9%98-1&quot;&gt;2. ffmpeg 설치&lt;/a&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1751004505883&quot; class=&quot;cmake&quot; style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;sudo apt install ffmpeg&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;3.%20%EC%84%A4%EC%B9%98%20%ED%99%95%EC%9D%B8-1&quot; style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;a style=&quot;color: #353638;&quot; href=&quot;https://iambeginnerdeveloper.tistory.com/309#3.%20%EC%84%A4%EC%B9%98%20%ED%99%95%EC%9D%B8-1&quot;&gt;3. 설치 확인&lt;/a&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1751004505884&quot; class=&quot;applescript&quot; style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;ffmpeg -version&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;4.%20incoder%2C%20decoder%20%ED%99%95%EC%9D%B8-1&quot; style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;a style=&quot;color: #353638;&quot; href=&quot;https://iambeginnerdeveloper.tistory.com/309#4.%20incoder%2C%20decoder%20%ED%99%95%EC%9D%B8-1&quot;&gt;4. incoder, decoder 확인&lt;/a&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1751004505884&quot; class=&quot;properties&quot; style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;ffmpeg -encoders
ffmpeg -decoders&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>서버 Server</category>
      <category>ffmpeg</category>
      <category>ffmpeg 설치</category>
      <category>ubuntu ffmpeg 설치</category>
      <author>은둔한량</author>
      <guid isPermaLink="true">https://koreanred.tistory.com/197</guid>
      <comments>https://koreanred.tistory.com/197#entry197comment</comments>
      <pubDate>Fri, 27 Jun 2025 15:13:12 +0900</pubDate>
    </item>
  </channel>
</rss>