<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>MoreLean</title>
    <link>https://judekim.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 14 Oct 2026 10:17:39 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>MoreLean</managingEditor>
    <item>
      <title>전기차 배터리에 대한 잘못된 정보</title>
      <link>https://judekim.tistory.com/190</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;전기차를 타다 보면 &amp;ldquo;80%까지만 충전해라&amp;rdquo;, &amp;ldquo;가끔은 100%까지 채워야 한다&amp;rdquo;, &amp;ldquo;급속 충전은 피해라&amp;rdquo; 같은 말을 자주 듣습니다. 그런데 이 말들은 배터리 종류에 따라 맞기도 하고 틀리기도 합니다. 요즘 전기차 배터리는 크게 NCM(니켈&amp;middot;코발트&amp;middot;망간, 해외 자료에서는 글자 순서를 바꿔 NMC라고도 씁니다. 같은 계열입니다)과 LFP(리튬인산철) 두 계열로 나뉘기 때문입니다. 이 글은 두 계열을 나눠서 올바른 사용법과 잘못 알려진 상식을 정리합니다. 배터리 기초 자료, 논문, 실주행 데이터를 조사해 구성했고, 계기가 된 유튜브 영상은 참조 목록에 참조로만 넣었습니다. 글에 나오는 전문 용어는 본문에서 바로 풀어 쓰고, 맨 아래에 &amp;lsquo;용어 풀이&amp;rsquo;로도 모아 두었습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;먼저 내 차 배터리부터 확인하세요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제조사 제원표나 설명서에 배터리 종류(NCM 또는 NMC, LFP 등)가 적혀 있는 경우가 많습니다. 확인이 어렵다면 제조사나 서비스센터에 물어보세요. 아래 내용은 모두 일반적인 경향이므로, 차량 설명서의 충전 권고가 우선입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;NCM과 LFP, 무엇이 다를까&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;NCM&lt;/th&gt;
&lt;th&gt;LFP&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;전압(셀 하나)&lt;/td&gt;
&lt;td&gt;공칭 3.6~3.7V, 동작 범위 3.0~4.2V&lt;/td&gt;
&lt;td&gt;공칭 3.2~3.3V, 동작 범위 2.5~3.65V&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;에너지 밀도&lt;/td&gt;
&lt;td&gt;약 150~220Wh/kg&lt;/td&gt;
&lt;td&gt;약 90~120Wh/kg (같은 무게로는 NCM이 더 멀리 갑니다)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;사이클 수명(추정)&lt;/td&gt;
&lt;td&gt;약 1,000~2,000회&lt;/td&gt;
&lt;td&gt;약 2,000회 이상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&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;/td&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;약 210&amp;deg;C&lt;/td&gt;
&lt;td&gt;약 270&amp;deg;C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&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;/td&gt;
&lt;td&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;수치는 Battery University가 정리한 일반 셀 기준의 대략적인 값입니다. 실제 전기차 팩은 제조사 설계에 따라 다릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조: &lt;a href=&quot;https://batteryuniversity.com/article/bu-205-types-of-lithium-ion&quot;&gt;Battery University BU-205&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Lithium_iron_phosphate_battery&quot;&gt;Wikipedia, LFP 배터리&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;두 배터리에 공통인 원리&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;01-리튬-이동.png&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/duIezZ/dJMcahMUtMu/hRMLAERj79OPgZkRW6BhT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/duIezZ/dJMcahMUtMu/hRMLAERj79OPgZkRW6BhT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/duIezZ/dJMcahMUtMu/hRMLAERj79OPgZkRW6BhT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FduIezZ%2FdJMcahMUtMu%2FhRMLAERj79OPgZkRW6BhT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;충전할 때는 리튬 이온이 양극에서 음극으로, 방전할 때는 음극에서 양극으로 이동하는 도식&quot; loading=&quot;lazy&quot; width=&quot;1400&quot; height=&quot;800&quot; data-filename=&quot;01-리튬-이동.png&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;충전하면 리튬이 양극에서 음극으로 이동하고, 쓰면 다시 돌아옵니다. 그런데 이 과정에서 리튬 일부가 엉뚱한 곳에 쓰여 영구히 사라지면 용량이 줄어듭니다. 이렇게 충전&amp;middot;방전이라는 본래 반응 옆에서 곁다리로 일어나는, 원하지 않는 화학 반응을 &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; 음극 표면의 보호막(SEI, 처음에는 꼭 필요하지만 계속 두꺼워지면 그만큼 리튬을 소모하는 얇은 막)이 두꺼워지고 양극 쪽 전해액이 산화됩니다(전해액이 높은 전압에서 화학적으로 변질되는 것). 코발트계 셀에서는 4.10V 이상의 높은 전압이 고온과 겹칠 때 충&amp;middot;방전 반복보다 더 해로울 수 있다고 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;열:&lt;/b&gt; 같은 충전량라도 온도가 높으면 열화가 빨라집니다. Battery University의 보관 실험 추정치에서 1년 뒤 남는 용량은 25&amp;deg;C에서 40% 충전 96%, 100% 충전 80%였고, 40&amp;deg;C에서는 각각 85%와 65%였습니다(코발트계 셀 기준).&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;02-부반응.png&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;900&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVUJz1/dJMcagHrJpx/8C7Jy5eus5yNHcMua1jiKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVUJz1/dJMcagHrJpx/8C7Jy5eus5yNHcMua1jiKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVUJz1/dJMcagHrJpx/8C7Jy5eus5yNHcMua1jiKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVUJz1%2FdJMcagHrJpx%2F8C7Jy5eus5yNHcMua1jiKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;부반응이 일어나면 음극 표면의 보호막이 두꺼워지고 리튬이 돌아오지 못하는 모습을 정상 반응과 비교한 도식&quot; loading=&quot;lazy&quot; width=&quot;1400&quot; height=&quot;900&quot; data-filename=&quot;02-부반응.png&quot; data-origin-width=&quot;1400&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;또 하나, 용량은 늘 일정한 속도로 줄지 않습니다. 열화(시간이 지나거나 많이 쓰면서 배터리 용량이 줄어드는 것)가 어느 시점부터 갑자기 빨라지는 &amp;lsquo;무릎(knee)&amp;rsquo; 현상이 연구되어 있고, 원인 중 하나가 리튬 플레이팅입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;03-리튬-플레이팅-v2.png&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;900&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byuMNA/dJMcaamElNw/81MwKOkDXuy2kzsyhaGLik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byuMNA/dJMcaamElNw/81MwKOkDXuy2kzsyhaGLik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byuMNA/dJMcaamElNw/81MwKOkDXuy2kzsyhaGLik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyuMNA%2FdJMcaamElNw%2F81MwKOkDXuy2kzsyhaGLik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;추울 때 급속 충전하면 리튬이 음극 안으로 들어가지 못하고 표면에 금속으로 쌓이는 모습을 정상 충전과 비교한 도식&quot; loading=&quot;lazy&quot; width=&quot;1400&quot; height=&quot;900&quot; data-filename=&quot;03-리튬-플레이팅-v2.png&quot; data-origin-width=&quot;1400&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;a href=&quot;https://batteryuniversity.com/article/bu-808b-what-causes-li-ion-to-die&quot;&gt;BU-808b&lt;/a&gt;, &lt;a href=&quot;https://batteryuniversity.com/article/bu-808-how-to-prolong-lithium-based-batteries&quot;&gt;BU-808&lt;/a&gt;, &lt;a href=&quot;https://batteryuniversity.com/article/bu-410-charging-at-high-and-low-temperatures&quot;&gt;BU-410&lt;/a&gt;, &lt;a href=&quot;https://www.recurrentauto.com/research/lithium-plating&quot;&gt;Recurrent&lt;/a&gt;, &lt;a href=&quot;https://arxiv.org/abs/2201.02891&quot;&gt;Attia 외(arXiv)&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;NCM 배터리 사용법&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;일상 충전은 80% 안팎, 멀리 가는 날만 100%.&lt;/b&gt; Geotab이 전기차 22,700대를 분석한 결과, 충전량이 20% 미만이거나 80% 초과인 상태로 보낸 시간이 전체의 80%를 넘는 차만 열화가 연 2.0%로 빨랐고, 그보다 노출이 적은 차는 연 1.4~1.5%였습니다. 숫자보다 머무는 시간이 핵심입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;100%로 채웠다면 오래 방치하지 마세요.&lt;/b&gt; 출발 시각에 맞춰 충전이 끝나도록 예약 충전을 쓰는 방법이 있습니다(자료의 원리에서 끌어낸 상식적 응용입니다).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;깊게 쓰고 충전하기보다 얕게 자주.&lt;/b&gt; Battery University의 실험 자료에서 방전 깊이 100%일 때 약 300회였던 NCM 계열 사이클 수명이 방전 깊이 20%에서는 약 2,000회로 늘었습니다(추정치). Chalmers 공대 실험에서는 충전량 50% 부근에서 쓰면 차량용 리튬이온의 기대 수명이 44~130% 늘었다고 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;오래 방치할 때는 중간 충전량으로.&lt;/b&gt; 완충이나 충전량이 아주 낮은 상태보다 중간 정도가 안전합니다(소형 배터리 보관 기준 권고이므로 차량에는 참조용입니다).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&amp;lsquo;깨우기&amp;rsquo; 완충은 필요 없습니다.&lt;/b&gt; 리튬이온에는 메모리 효과(덜 쓰고 충전하기를 반복하면 그만큼만 기억해 용량이 줄어드는, 옛 니켈 계열 배터리의 현상)가 사실상 없습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;LFP 배터리 사용법&lt;/h2&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; Battery University는 LFP가 완충 내성이 더 높고, 높은 전압에 오래 머물러도 다른 리튬이온보다 덜 부담을 받는다고 설명합니다. 그래서 NCM처럼 일상 충전 한도를 낮게 잡을 필요가 상대적으로 적을 수 있습니다. 다만 제조사마다 권고가 다를 수 있으니 설명서를 먼저 확인하세요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;가끔 하는 완충은 수명이 아니라 충전량 표시 보정에 의미가 있습니다.&lt;/b&gt; LFP는 전압 곡선이 매우 평평하고 이력(히스테리시스) 현상(같은 충전량이라도 충전 중이냐 방전 중이냐에 따라 전압이 달라지는 것)이 있어서, 전압으로 충전량을 추정하기가 어렵다는 점이 여러 연구에서 지적됩니다. 그래서 완충으로 충전량 표시를 맞추도록 권고하는 제조사가 있을 수 있습니다. 해당 여부는 차량 설명서에서 확인하세요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;너무 낮은 충전량으로 방치하지 마세요.&lt;/b&gt; 셀 전압이 낮은 영역에서는 손상이 생길 수 있습니다(Battery University 기준 2V 미만). 실제 차량은 배터리 관리 시스템(BMS, 전압과 온도를 감시해 배터리를 보호하는 제어 장치)이 보호하지만, 충전량이 아주 낮은 상태로 오래 방치하는 것은 피하는 편이 안전합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;오래 방치한 뒤에는 셀 균형을 신경 쓰세요.&lt;/b&gt; LFP는 자기방전(쓰지 않아도 저절로 전기가 빠지는 현상)이 다른 리튬이온보다 높은 편이고, 시간이 지나면 셀 사이 균형(팩을 이루는 셀들의 충전량이 서로 비슷한 상태)이 어긋날 수 있다고 합니다. 장기 방치 뒤의 관리 방법은 제조사 권고를 확인하세요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;추위와 더위는 NCM과 똑같이 조심하세요.&lt;/b&gt; LFP도 추우면 성능이 떨어지고, 방치 중 온도가 높으면 열화가 빨라집니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;두 배터리 모두에 해당하는 습관&lt;/h2&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; Recurrent는 테슬라 13,000대(데이터 16만 건 이상)에서 급속 충전을 70% 넘게 쓴 차와 30% 미만인 차의 주행거리 감소에 통계적 차이를 찾지 못했습니다. 반면 Geotab은 급속 충전 비율이 12% 미만이면 연 1.5%, 12% 이상이면서 100kW 초과 세션이 40% 이상이면 연 3.0% 열화였다고 합니다. 두 자료 모두 NCM과 LFP를 나눠 비교하지는 않아서, 배터리 종류별 차이는 확인하지 못했습니다. 아주 덥거나 춥거나 충전량이 5%&amp;middot;90%처럼 극단일 때의 급속 충전은 피하라는 것이 Recurrent의 권고입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;겨울에는 충전기를 꽂은 채 예열.&lt;/b&gt; Geotab은 영하 20&amp;deg;C에서 주행거리가 최대 50% 줄어들 수 있다고 설명하고, 충전기를 꽂은 채로 예열하면 배터리 온도 관리에 좋다고 합니다. 실내 공기를 데우는 데는 3,000~5,000W가 들지만 열선 시트&amp;middot;핸들은 약 75W입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;여름에는 열을 줄이기.&lt;/b&gt; 더운 지역(연중 25&amp;deg;C 초과 일수 35% 이상)의 차는 열화가 연 0.4%p 더 빨랐습니다. 그늘이나 실내 주차는 상식적인 대응입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조: &lt;a href=&quot;https://www.geotab.com/blog/ev-battery-health/&quot;&gt;Geotab&lt;/a&gt;, &lt;a href=&quot;https://www.geotab.com/blog/ev-winter-proofing/&quot;&gt;Geotab 겨울 가이드&lt;/a&gt;, &lt;a href=&quot;https://www.recurrentauto.com/research/impacts-of-fast-charging&quot;&gt;Recurrent&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;잘못 알려진 상식 정정&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 457px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;th style=&quot;width: 26.9767%; height: 20px;&quot;&gt;흔한 말&lt;/th&gt;
&lt;th style=&quot;width: 45.1164%; height: 20px;&quot;&gt;NCM&lt;/th&gt;
&lt;th style=&quot;width: 27.7906%; height: 20px;&quot;&gt;LFP&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 57px;&quot;&gt;
&lt;td style=&quot;width: 26.9767%; height: 57px;&quot;&gt;가끔은 100%까지 채워서 배터리를 깨워야 한다&lt;/td&gt;
&lt;td style=&quot;width: 45.1164%; height: 57px;&quot;&gt;&lt;b&gt;틀림.&lt;/b&gt; 메모리 효과는 옛 니켈카드뮴 배터리의 현상이고 리튬이온에는 없습니다.&lt;/td&gt;
&lt;td style=&quot;width: 27.7906%; height: 57px;&quot;&gt;&lt;b&gt;수명 목적으로는 틀림.&lt;/b&gt; 다만 충전량 표시 보정에는 의미가 있을 수 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 57px;&quot;&gt;
&lt;td style=&quot;width: 26.9767%; height: 57px;&quot;&gt;80%까지만 충전해야 한다&lt;/td&gt;
&lt;td style=&quot;width: 45.1164%; height: 57px;&quot;&gt;&lt;b&gt;절반만 맞음.&lt;/b&gt; 80% 자체보다 높은 충전량에 머문 시간이 문제입니다.&lt;/td&gt;
&lt;td style=&quot;width: 27.7906%; height: 57px;&quot;&gt;&lt;b&gt;상대적으로 덜 중요.&lt;/b&gt; 완충 내성이 높지만 제조사 권고가 우선입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 76px;&quot;&gt;
&lt;td style=&quot;width: 26.9767%; height: 76px;&quot;&gt;20% 밑으로 내리면 큰일 난다&lt;/td&gt;
&lt;td style=&quot;width: 45.1164%; height: 76px;&quot;&gt;&lt;b&gt;절반만 맞음.&lt;/b&gt; 극단적 충전량에 오래 머무는 것을 피하면 됩니다.&lt;/td&gt;
&lt;td style=&quot;width: 27.7906%; height: 76px;&quot;&gt;&lt;b&gt;절반만 맞음.&lt;/b&gt; 낮은 전압 영역에 방치하면 손상될 수 있어 충전량이 아주 낮은 채로 두지는 마세요.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 38px;&quot;&gt;
&lt;td style=&quot;width: 26.9767%; height: 38px;&quot;&gt;급속 충전은 배터리를 망친다&lt;/td&gt;
&lt;td style=&quot;width: 45.1164%; height: 38px;&quot;&gt;&lt;b&gt;조건부.&lt;/b&gt; 빈도&amp;middot;출력&amp;middot;온도에 따라 달라집니다.&lt;/td&gt;
&lt;td style=&quot;width: 27.7906%; height: 38px;&quot;&gt;&lt;b&gt;조건부.&lt;/b&gt; 배터리 종류별 비교 데이터는 확인하지 못했습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 38px;&quot;&gt;
&lt;td style=&quot;width: 26.9767%; height: 38px;&quot;&gt;겨울에 주행거리가 줄면 배터리가 고장난 것이다&lt;/td&gt;
&lt;td style=&quot;width: 45.1164%; height: 38px;&quot;&gt;&lt;b&gt;틀림.&lt;/b&gt; 추위와 난방 때문에 일시적으로 줄어듭니다.&lt;/td&gt;
&lt;td style=&quot;width: 27.7906%; height: 38px;&quot;&gt;&lt;b&gt;틀림.&lt;/b&gt; LFP도 추위에 성능이 떨어집니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 76px;&quot;&gt;
&lt;td style=&quot;width: 26.9767%; height: 76px;&quot;&gt;10년 타면 배터리를 통째로 교체해야 한다&lt;/td&gt;
&lt;td style=&quot;width: 45.1164%; height: 76px;&quot;&gt;&lt;b&gt;틀림.&lt;/b&gt; Geotab 평균 연 2.3%로 8년 뒤에도 약 80%(81.6%)가 남습니다. 미국 에너지부는 전기차 배터리가 온화한 기후에서 12~15년, 가혹한 기후에서 8~12년 간다고 안내하고, 고장이나 손상이 없다면 수명 종료 시점에도 용량의 70% 이상이 남는다는 연구를 소개합니다.&lt;/td&gt;
&lt;td style=&quot;width: 27.7906%; height: 76px;&quot;&gt;&lt;b&gt;틀림.&lt;/b&gt; 사이클 수명이 더 긴 경향이라 같은 이유로 걱정이 과합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 57px;&quot;&gt;
&lt;td style=&quot;width: 26.9767%; height: 57px;&quot;&gt;LFP는 무조건 NCM보다 오래 간다&lt;/td&gt;
&lt;td style=&quot;width: 72.907%; height: 57px;&quot; colspan=&quot;2&quot;&gt;&lt;b&gt;경향은 맞지만 무조건은 아님.&lt;/b&gt; 한 실험에서 LFP 셀(BYD, Sony)은 30개월 보관 후 용량이 약 8%와 5% 줄었고, NCM 셀은 3,000사이클에서 80%에 도달해 사이클 수명이 더 좋았습니다. 제조사와 셀 설계에 따라 편차가 큽니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 38px;&quot;&gt;
&lt;td style=&quot;width: 26.9767%; height: 38px;&quot;&gt;열화는 일정한 속도로 진행된다&lt;/td&gt;
&lt;td style=&quot;width: 72.907%; height: 38px;&quot; colspan=&quot;2&quot;&gt;&lt;b&gt;반만 맞음.&lt;/b&gt; 차종마다 연 1.4%에서 2.7%까지 차이가 나고, 처음 1~2년에 열화가 더 빨랐다가 안정되는 모델도 있으며, 특정 시점부터 열화가 급격해지는 경우도 보고됩니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;용어 풀이&lt;/h2&gt;
&lt;table data-ke-style=&quot;style12&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;용어&lt;/b&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;/td&gt;
&lt;td&gt;충전&amp;middot;방전이라는 본래 반응 외에 곁다리로 일어나는, 원하지 않는 화학 반응. 리튬이 다른 물질로 바뀌어 쓸 수 없게 됩니다.&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;SEI&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;tr&gt;
&lt;td&gt;SOC(충전량)&lt;/td&gt;
&lt;td&gt;배터리가 얼마나 차 있는지를 퍼센트로 나타낸 값. 계기판의 배터리 충전량에 해당합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;방전 깊이&amp;middot;사이클 수명&lt;/td&gt;
&lt;td&gt;한 번에 얼마나 깊이 쓰는지가 방전 깊이이고, 충전과 방전을 한 번씩 하는 것이 1사이클입니다. 사이클 수명은 용량이 일정 수준으로 떨어지기까지 반복할 수 있는 횟수입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BMS(배터리 관리 시스템)&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;같은 충전량이라도 충전 중이냐 방전 중이냐에 따라 전압이 달라지는 현상. LFP에서 충전량 추정을 어렵게 합니다.&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;팩을 이루는 수많은 셀의 충전량이 서로 비슷한 상태. 어긋나면 BMS가 맞춰 줍니다.&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;h2 data-ke-size=&quot;size26&quot;&gt;참조&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://batteryuniversity.com/article/bu-205-types-of-lithium-ion&quot;&gt;Battery University BU-205, 리튬이온의 종류(LFP&amp;middot;NCM 비교)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://batteryuniversity.com/article/bu-808-how-to-prolong-lithium-based-batteries&quot;&gt;Battery University BU-808, 리튬이온 수명 연장&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://batteryuniversity.com/article/bu-808b-what-causes-li-ion-to-die&quot;&gt;Battery University BU-808b, 리튬이온은 왜 죽는가&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://batteryuniversity.com/article/bu-410-charging-at-high-and-low-temperatures&quot;&gt;Battery University BU-410, 고온과 저온에서의 충전&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://batteryuniversity.com/article/bu-415-how-to-charge-and-when-to-charge&quot;&gt;Battery University BU-415, 충전 방법과 시점&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Lithium_iron_phosphate_battery&quot;&gt;Wikipedia, LFP 배터리&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Memory_effect&quot;&gt;Wikipedia, 메모리 효과&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.geotab.com/blog/ev-battery-health/&quot;&gt;Geotab, EV 배터리 건강 분석(2025)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.geotab.com/blog/ev-winter-proofing/&quot;&gt;Geotab, 추운 날씨와 전기차 성능&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.recurrentauto.com/research/impacts-of-fast-charging&quot;&gt;Recurrent, 급속 충전의 영향&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.recurrentauto.com/research/lithium-plating&quot;&gt;Recurrent, 리튬 플레이팅&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://afdc.energy.gov/vehicles/electric-batteries&quot;&gt;미국 에너지부 AFDC, 전기차 배터리&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.fueleconomy.gov/feg/evtech.shtml&quot;&gt;미국 에너지부 fueleconomy.gov, 전기차 배터리 수명(12~15년&amp;middot;8~12년)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/abs/2201.02891&quot;&gt;Attia 외, 리튬이온 배터리 열화 곡선의 &amp;lsquo;무릎&amp;rsquo;(arXiv)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/abs/2507.01173&quot;&gt;LFP 배터리 충전량(SOC) 추정의 어려움, 평평한 전압 곡선과 이력(arXiv, 2025)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/abs/2007.01937&quot;&gt;제조사별 리튬이온 셀 열화 비교, LFP와 NCM(arXiv, 2020)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;참조 영상: &lt;a href=&quot;https://www.youtube.com/watch?v=Zl5O4smujzg&quot;&gt;배터리만드는사람(유튜브, 2026-10-07)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>잡다구리</category>
      <category>LFP</category>
      <category>NCM</category>
      <category>급속충전</category>
      <category>리튬이온</category>
      <category>배터리관리</category>
      <category>배터리수명</category>
      <category>전기차</category>
      <category>전기차배터리</category>
      <category>충전습관</category>
      <author>MoreLean</author>
      <guid isPermaLink="true">https://judekim.tistory.com/190</guid>
      <comments>https://judekim.tistory.com/190#entry190comment</comments>
      <pubDate>Sun, 11 Oct 2026 15:29:04 +0900</pubDate>
    </item>
    <item>
      <title>LLM은 대화를 어떻게 기억할까? Claude Code로 알아본 컨텍스트와 캐싱, 그리고 /compact 활용법</title>
      <link>https://judekim.tistory.com/189</link>
      <description>&lt;h2 id=&quot;들어가며-계정을-바꾸면-대화가-끊길까&quot; data-ke-size=&quot;size26&quot;&gt;들어가며: 계정을 바꾸면 대화가 끊길까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널에서 Claude Code를 쓰다 보면 사용량 한도에 걸리는 순간이 옵니다. 저는 계정을 두 개 쓰고 있어서, A 계정으로 작업하다 한도가 차면 B 계정으로 바꿔서 이어가곤 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 문득 궁금해졌습니다. &lt;b&gt;A 계정에서 하던 대화 맥락을 B 계정은 모르는 거 아닐까?&lt;/b&gt; 이 질문을 파고들다 보니, LLM이 대화를 주고받는 방식 자체를 제대로 몰랐다는 걸 알게 됐습니다. 결론부터 말하면 계정을 바꿔도 맥락은 끊기지 않습니다. 그 이유와 함께, 알아두면 사용량을 아낄 수 있는 내용들을 정리해봤습니다.&lt;/p&gt;
&lt;h2 id=&quot;1-llm은-대화를-기억하지-않는다&quot; data-ke-size=&quot;size26&quot;&gt;1. LLM은 대화를 기억하지 않는다&lt;/h2&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;예를 들어 A, B, C 세 번 대화를 나눈 뒤 네 번째 질문 D를 하면, 실제 요청은 이렇게 나갑니다.&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;[질문A, 답변A, 질문B, 답변B, 질문C, 답변C, 질문D]  &amp;rarr;  모델  &amp;rarr;  답변D&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;이전 &lt;b&gt;질문뿐 아니라 답변도&lt;/b&gt; 입력으로 같이 들어갑니다.&lt;/li&gt;
&lt;li&gt;모델은 A, B, C에 다시 답하지 않습니다. 대화 전체를 읽은 상태에서 &lt;b&gt;D에 대한 답만 새로 생성&lt;/b&gt;합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화면에는 기존 대화 아래에 새 답변 D가 붙을 뿐이라, 사용자 입장에서는 이런 과정이 보이지 않습니다.&lt;/p&gt;
&lt;h3 id=&quot;대화-기록은-어디에-있을까&quot; data-ke-size=&quot;size23&quot;&gt;대화 기록은 어디에 있을까?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code의 대화 기록은 서버가 아니라 &lt;b&gt;내 PC의 로컬 파일&lt;/b&gt;(~/.claude/projects/ 아래)에 저장됩니다. 그래서 터미널을 껐다 켜도 claude --resume으로 이어갈 수 있습니다.&lt;/p&gt;
&lt;h3 id=&quot;재미있는-실험-답변을-바꾸면&quot; data-ke-size=&quot;size23&quot;&gt;재미있는 실험: 답변을 바꾸면?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델은 대화 기록에 적힌 내용을 그대로 믿습니다. 자기가 실제로 그렇게 답했는지 확인할 방법이 없기 때문입니다. 그래서 이전 답변을 수정해서 보내면, 모델은 수정된 내용을 &quot;내가 했던 말&quot;로 받아들이고 다음 질문을 처리합니다. API를 직접 다룰 때는 실제로 흔히 쓰는 방법이기도 합니다.&lt;/p&gt;
&lt;h2 id=&quot;2-요청에-실제로-들어가는-것-vs-화면에만-보이는-것&quot; data-ke-size=&quot;size26&quot;&gt;2. 요청에 실제로 들어가는 것 vs 화면에만 보이는 것&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화면에 보이는 것과 모델에게 전달되는 내용은 1:1로 같지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분예시&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;화면에만 있음&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;진행 스피너, 경과 시간, 색상, 상태 안내 문구&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;요청에만 있거나 줄여서 보임&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;시스템 프롬프트, CLAUDE.md, 도구 실행 결과 전체&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;양쪽 다 있음&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;사용자 질문, 모델 답변, 도구 호출 내역&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 주의할 건 &lt;b&gt;도구 실행 결과&lt;/b&gt;입니다. 화면에서는 파일 읽기 결과가 몇 줄로 접혀 보여도, 모델에게는 전체 내용이 전달됩니다. 큰 파일을 읽거나 출력이 긴 명령을 실행하면 사용량이 확 늘어나는 이유입니다.&lt;/p&gt;
&lt;h3 id=&quot;생각하는-과정thinking은&quot; data-ke-size=&quot;size23&quot;&gt;생각하는 과정(thinking)은?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화면에 보이는 &quot;생각하는 과정&quot;은 단순한 UI 연출이 아니라 &lt;b&gt;모델이 실제로 생성한 출력&lt;/b&gt;입니다. 그리고 최신 모델(Claude Opus 4.5, 4.6 이상)은 이전 턴의 thinking도 다음 요청에 맥락으로 유지하고 입력으로 과금합니다. 그 이전 모델들은 이전 thinking을 제거했습니다. &lt;a href=&quot;https://platform.claude.com/docs/en/build-with-claude/extended-thinking&quot;&gt;출처&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;[질문A, 생각A, 답변A, 질문B, 생각B, 답변B, ..., 질문D]  &amp;rarr;  생각D, 답변D&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;화면에 보이는 thinking은 전체 원문이 아니라 &lt;b&gt;요약본&lt;/b&gt;인 경우가 많습니다.&lt;/li&gt;
&lt;li&gt;답변 텍스트와 달리 thinking은 &lt;b&gt;임의로 수정할 수 없습니다.&lt;/b&gt; 검증용 서명이 붙어 있어서 바꾸면 오류가 납니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3-매번-전체를-보내면-비효율적이지-않나-프롬프트-캐싱&quot; data-ke-size=&quot;size26&quot;&gt;3. 매번 전체를 보내면 비효율적이지 않나? 프롬프트 캐싱&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매번 전체를 보낸다니 낭비처럼 느껴지지만, 이를 줄여주는 장치가 &lt;b&gt;프롬프트 캐싱&lt;/b&gt;입니다.&lt;/p&gt;
&lt;h3 id=&quot;캐시는-답변이-아니라-읽은-결과를-저장한다&quot; data-ke-size=&quot;size23&quot;&gt;캐시는 &quot;답변&quot;이 아니라 &quot;읽은 결과&quot;를 저장한다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델이 긴 입력을 읽을 때 내부적으로 많은 계산을 합니다. 캐싱은 A, B, C를 읽으며 했던 &lt;b&gt;중간 계산 결과&lt;/b&gt;(KV 캐시)를 저장해 두는 것입니다. 다음 요청에서는 그 부분을 건너뛰고 새로 추가된 D만 읽으면 됩니다.&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;캐시 있음:  [A, B, C] 읽기 생략 + D만 읽기  &amp;rarr; 답변D   (빠르고 저렴)
캐시 없음:  [A, B, C, D] 전부 다시 읽기      &amp;rarr; 답변D   (느리고 비쌈)&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 id=&quot;캐시가-재사용되는-조건&quot; 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;앞에서부터 완전히 같은 부분까지만&lt;/b&gt; 재사용됩니다. 중간의 답변B를 수정하면 A까지만 캐시를 쓰고 B부터는 새로 읽습니다.&lt;/li&gt;
&lt;li&gt;미리 저장되는 게 아니라, 실제 요청을 보낼 때 그 내용이 캐시에 저장됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;캐시는-오래-가지-않는다&quot; data-ke-size=&quot;size23&quot;&gt;캐시는 오래 가지 않는다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐시는 GPU 메모리처럼 비싼 자원에 올려두기 때문에 &lt;b&gt;기본 5분 정도만 유지&lt;/b&gt;됩니다. 사용될 때마다 유지 시간이 다시 연장되고, API에는 1시간짜리 옵션도 있습니다.&lt;/p&gt;
&lt;h2 id=&quot;4-캐시-유지-시간이-5분이면-긴-작업은&quot; data-ke-size=&quot;size26&quot;&gt;4. 캐시 유지 시간이 5분이면, 긴 작업은?&lt;/h2&gt;
&lt;h3 id=&quot;수십-분짜리-작업도-캐시는-유지된다&quot; data-ke-size=&quot;size23&quot;&gt;수십 분짜리 작업도 캐시는 유지된다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code의 긴 작업은 내부적으로 &lt;b&gt;짧은 요청이 계속 이어지는 구조&lt;/b&gt;입니다.&lt;/p&gt;
&lt;pre class=&quot;erlang&quot;&gt;&lt;code&gt;요청 &amp;rarr; &quot;파일 읽을게&quot;   &amp;rarr; 실행 &amp;rarr; 결과 담아 다시 요청
     &amp;rarr; &quot;수정할게&quot;      &amp;rarr; 실행 &amp;rarr; 결과 담아 다시 요청
     &amp;rarr; &quot;테스트 돌릴게&quot; &amp;rarr; 실행 &amp;rarr; 결과 담아 다시 요청 ...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도구를 쓸 때마다 대화 전체를 담은 새 요청이 몇 초~몇십 초 간격으로 나가고, 그때마다 캐시 유지 시간이 연장됩니다. 그래서 작업이 30분 걸려도 앞부분 대화는 계속 캐시에 살아 있습니다.&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;빌드나 설치처럼 한 번의 명령이 5분 넘게 걸릴 때&lt;/li&gt;
&lt;li&gt;작업이 끝난 뒤 한참 있다가 다음 질문을 할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2시간-뒤에-돌아왔다면&quot; data-ke-size=&quot;size23&quot;&gt;2시간 뒤에 돌아왔다면?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐시는 이미 사라졌습니다. 복귀 후 &lt;b&gt;첫 질문 한 번만&lt;/b&gt; 대화 전체를 다시 읽어 무겁고, 그 다음부터는 다시 캐시가 적용됩니다. 맥락은 로컬에 그대로 있으니 대화가 끊기지는 않습니다.&lt;/p&gt;
&lt;h3 id=&quot;캐시를-살려두려고-5분마다-의미-없는-질문을-하면&quot; data-ke-size=&quot;size23&quot;&gt;캐시를 살려두려고 5분마다 의미 없는 질문을 하면?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계산해보면 손해입니다. API 기준 입력 비용 비율은 대략 &lt;b&gt;캐시 읽기 0.1배, 캐시 새로 만들기 1.25배&lt;/b&gt;입니다. 대화 크기를 1로 두고 2시간을 비교하면 이렇습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방식계산비용&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;5분마다 유지용 요청&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;약 24회 &amp;times; 0.1&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;약 2.4&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;2시간 뒤 그냥 질문&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;1회 &amp;times; 1.25&lt;/span&gt;&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;약 1.25&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;손익분기는 약 12~13회, 즉 &lt;b&gt;1시간 정도&lt;/b&gt;입니다. 여기에 유지용 요청마다 생기는 답변 출력 비용, 의미 없는 대화가 기록에 쌓여 이후 모든 요청이 커지는 문제까지 생각하면 굳이 할 이유가 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 구독 요금제는 달러가 아니라 사용량 한도로 차감되고, 정확한 산정 방식은 공개되어 있지 않습니다. 다만 큰 방향은 같다고 보면 됩니다.&lt;/p&gt;
&lt;h2 id=&quot;5-다시-처음-질문으로-계정을-바꾸면&quot; data-ke-size=&quot;size26&quot;&gt;5. 다시 처음 질문으로: 계정을 바꾸면?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 처음 궁금증에 답할 수 있습니다. &lt;b&gt;계정을 바꿔도 맥락은 끊기지 않습니다.&lt;/b&gt; 대화 기록은 로컬에 있고, 매 요청마다 전체를 보내기 때문에 B 계정도 이전 맥락을 그대로 받습니다.&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; 캐시는 계정 단위라서 전환 직후 첫 요청은 대화 전체를 새로 처리합니다. 대화가 길수록 B 계정 사용량이 한 번에 크게 빠집니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;계정에 묶인 기능은 따로 설정해야 합니다.&lt;/b&gt; claude.ai에서 연결한 커넥터 등이 해당합니다. 로컬에 등록한 MCP 서버나 CLAUDE.md는 그대로 쓸 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전환 전에 /compact로 대화를 줄여두면 전환 직후의 부담을 줄일 수 있습니다.&lt;/p&gt;
&lt;h2 id=&quot;6-compact와-clear-언제-쓰면-좋을까&quot; data-ke-size=&quot;size26&quot;&gt;6. /compact와 /clear, 언제 쓰면 좋을까?&lt;/h2&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;/compact: 지금까지의 대화를 &lt;b&gt;요약해서 압축&lt;/b&gt;합니다. 맥락의 큰 줄기는 유지하되 세부 내용은 일부 사라집니다. 요약 작업 자체도 비용이 듭니다.&lt;/li&gt;
&lt;li&gt;/clear: 대화를 &lt;b&gt;완전히 비우고 새로 시작&lt;/b&gt;합니다. 가장 가볍습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;compact를-쓰면-좋은-타이밍&quot; data-ke-size=&quot;size23&quot;&gt;/compact를 쓰면 좋은 타이밍&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;/ul&gt;
&lt;h3 id=&quot;clear를-쓰면-좋은-타이밍&quot; data-ke-size=&quot;size23&quot;&gt;/clear를 쓰면 좋은 타이밍&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;: 필요한 맥락은 &quot;어떤 파일을 이렇게 수정했다&quot; 정도로 짧게 다시 알려주면 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;그냥-이어가도-되는-경우&quot; 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;/li&gt;
&lt;li&gt;5분 이내 간격으로 계속 주고받고 있을 때 (캐시가 살아 있음)&lt;/li&gt;
&lt;li&gt;이전 작업의 세부 내용이 바로 다음 작업에 꼭 필요할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;마치며&quot; data-ke-size=&quot;size26&quot;&gt;마치며&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LLM은 대화를 기억하지 않고, 매 요청마다 **대화 전체(질문, 답변, 도구 결과, thinking)**를 다시 보낸다.&lt;/li&gt;
&lt;li&gt;대화 기록은 로컬에 있어서 &lt;b&gt;계정을 바꿔도 맥락은 유지&lt;/b&gt;된다.&lt;/li&gt;
&lt;li&gt;프롬프트 캐싱이 반복 읽기 비용을 줄여주지만 &lt;b&gt;5분 정도면 만료&lt;/b&gt;된다.&lt;/li&gt;
&lt;li&gt;캐시를 살리려는 의미 없는 요청은 손해다. 돌아와서 그냥 이어가거나 정리하자.&lt;/li&gt;
&lt;li&gt;세션은 &lt;b&gt;작업 단위로 끊어 쓰고&lt;/b&gt;, 길어지면 /compact, 주제가 바뀌면 /clear.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원리를 알고 나니 사용량이 왜 빨리 차는지, 언제 세션을 정리해야 하는지 감이 잡혔습니다. Claude Code를 오래 쓰시는 분들께 도움이 되면 좋겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고 자료&lt;/b&gt;: &lt;a href=&quot;https://platform.claude.com/docs/en/build-with-claude/extended-thinking&quot;&gt;Extended thinking - Claude Platform Docs&lt;/a&gt;&lt;/p&gt;</description>
      <category>Programmer/AI</category>
      <category>AI코딩</category>
      <category>Claude</category>
      <category>claude code</category>
      <category>compact</category>
      <category>LLM</category>
      <category>PromptCaching</category>
      <category>사용량관리</category>
      <category>컨텍스트윈도우</category>
      <category>토큰</category>
      <category>프롬프트캐싱</category>
      <author>MoreLean</author>
      <guid isPermaLink="true">https://judekim.tistory.com/189</guid>
      <comments>https://judekim.tistory.com/189#entry189comment</comments>
      <pubDate>Tue, 6 Oct 2026 08:31:17 +0900</pubDate>
    </item>
    <item>
      <title>나는 아직 백엔드 개발자인가 &amp;mdash; AI가 무너뜨리는 직업의 경계</title>
      <link>https://judekim.tistory.com/188</link>
      <description>&lt;h1 data-path-to-node=&quot;3&quot;&gt;나는 아직 백엔드 개발자인가&lt;/h1&gt;
&lt;blockquote data-path-to-node=&quot;4&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;4,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0&quot;&gt;AI가 무너뜨리는 것은 직업이 아니라, 일을 나누는 방식일지도 모른다&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;나는 백엔드 개발자다. 원래 내 업무 영역은 서버와 API, 데이터베이스, 인증, 그리고 비즈니스 로직이었다. Figma를 붙잡고 화면을 설계하거나 UI를 고심할 일은 거의 없었다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;그런데 최근 업무에 AI를 적용하면서 기묘한 경험을 하고 있다. 기존 화면을 캡처해 넣고 &amp;ldquo;이 흐름이 다소 뻑뻑한데&amp;rdquo;, &amp;ldquo;화면 구성을 이렇게 바꿔볼까?&amp;rdquo;, &amp;ldquo;이 정보는 위치를 바꾸는 게 낫겠어&amp;rdquo;라고 대화를 주고받다 보면, 어느새 내가 UI를 직접 만지고 있다. 한 발 더 나아가 UX를 고심하고, 서비스 전체의 흐름을 다시 설계하는 나를 발견한다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;결과물 역시 단순한 와이어프레임이나 아이디어 스케치에 그치지 않는다. 디자인 시스템이 깔끔하게 적용된, 당장 실제 서비스에 붙여도 될 수준의 화면이 튀어나온다. 백엔드 개발자인 내가 말이다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;이 경험이 반복되면서 문득 질문이 생겼다. 앞으로 디자이너, 마크업 개발자, 프론트엔드 개발자, 기획자라는 구분은 지금처럼 유지될 수 있을까? 그리고 무엇보다, 나는 앞으로도 지금과 같은 의미의 &amp;lsquo;백엔드 개발자&amp;rsquo;로 남을 수 있을까?&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size26&quot;&gt;예전에는 역할의 경계가 명확했다&lt;/h2&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;과거 웹 서비스 개발 과정은 경계가 선명한 이어달리기 협업 구조 였다.&lt;/p&gt;
&lt;blockquote data-path-to-node=&quot;11&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;11,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0&quot;&gt;기획 &amp;rarr; 디자인(Figma) &amp;rarr; 마크업 &amp;rarr; 프론트엔드 개발 &amp;rarr; 백엔드 연동 &amp;rarr; 테스트 및 보정&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;기획자가 화면과 기능을 정리해 넘기면, 디자이너가 Figma로 시안을 만들고, 마크업 개발자가 이를 HTML/CSS로 옮겼다. 프론트엔드 개발자는 인터랙션과 로직을 입혔고, 백엔드 개발자는 서버와 API를 제공했다. 각 단계 사이에는 엄격한 인수인계(Handoff) 지점이 존재했다. 기획서, Figma 문서, 마크업 결과물이 순차적으로 전달되었고, 서비스 하나를 만들기 위해 수많은 사람과 도구가 맞물려 돌아갔다.&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;13&quot; data-ke-size=&quot;size26&quot;&gt;초기의 AI: 공정을 '빠르게' 만들었을 뿐&lt;/h2&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;AI를 처음 업무에 도입했을 때만 해도 기존 틀은 유지되었다. 디자이너가 Figma에서 디자인을 마치면, AI가 이를 해석해 마크업 코드로 변환해 주는 정도였다. 사람이 피그마를 보며 일일이 폰트와 간격을 옮기던 수고가 줄어들었으니 확실히 생산성은 올라갔다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;하지만 본질은 변하지 않았다. 여전히 원본은 Figma였고, AI는 이를 코드라는 개발 가능한 형태라 번역해 주는 &amp;lsquo;고성능 툴&amp;rsquo;에 불과했다. 반응형 레이아웃이 깨지면 결국 개발자가 화면 크기를 줄여가며 CSS를 수정해야 했다. 이때까지 나는 AI를 &amp;lsquo;직업을 대체하는 존재&amp;rsquo;가 아니라 &amp;lsquo;기존 직업의 생산성을 극대화해 주는 도구&amp;rsquo;로 바라보았다.&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;16&quot; data-ke-size=&quot;size26&quot;&gt;이제는 Figma에서 시작하지 않는다&lt;/h2&gt;
&lt;p data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;Claude Design 같은 AI 기반 도구를 본격적으로 활용하면서 작업의 패러다임이 완전히 뒤바뀌었다. 이제는 굳이 Figma에서 목업을 그리지 않는다. 처음부터 AI에게 화면 구조와 요구사항을 설명하고, 디자인 시스템을 주입하며 직접 화면을 만들어낸다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;18&quot; data-ke-size=&quot;size16&quot;&gt;더 중요한 점은, 그렇게 생성된 결과물이 단순한 정적 이미지가 아니라는 사실이다. 버튼을 누르면 실제 화면이 전환되고, 레이아웃이 유기적으로 반응하는 &amp;lsquo;동작하는 프로토타입&amp;rsquo;이다. 디자인 시스템 적용 역시 놀라울 정도로 매끄럽다. 폰트, 컬러, 버튼, 카드 컴포넌트의 스타일 변경이 화면별 수작업이 아니라 전체 프레임워크 차원에서 템플릿을 교체하듯 한 번에 반영된다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;19&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 만들어진 화면은 곧바로 개발에 투입할 수 있는 구조를 갖추고 있다. 이 시점에서 자연스럽게 질문이 떠올랐다. &lt;b data-index-in-node=&quot;65&quot; data-path-to-node=&quot;19&quot;&gt;&amp;ldquo;그렇다면 우리는 왜 여전히 Figma에서 작업을 시작해야 하는가?&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;20&quot; data-ke-size=&quot;size26&quot;&gt;Figma와 마크업 개발자가 맞이한 정면 도전&lt;/h2&gt;
&lt;p data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;조금 과격한 예측일지 모르지만, 나는 Figma 같은 도구가 지금의 형태로 오래 남아있기 어렵다고 본다. 이 위기감은 이미 Figma에서도 강하게 느끼고 있다. Figma는 본질적으로 &amp;lsquo;사람이 디자인하고, 다른 사람에게 전달하기 위한&amp;rsquo; 협업 툴이다. 사람이 레이어를 쪼개고, Auto Layout을 맞추고, 디자인 시스템을 유지한다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;22&quot; data-ke-size=&quot;size16&quot;&gt;하지만 AI 중심의 워크플로우에서는 이 정교한 전달 과정이 오히려 거추장스러운 중간 단계가 된다. AI가 요구사항과 디자인 시스템을 직관적으로 이해하고 동작하는 화면을 즉시 생성할 수 있다면, 사람이 Figma라는 중간 형태로 파편화해 전달할 이유가 사라진다. AI에게 가장 최적화된 데이터 구조와 사람이 다루기 편한 레이어 구조는 완전히 다를 수 있기 때문이다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;23&quot; data-ke-size=&quot;size16&quot;&gt;마크업 개발자의 역할 역시 같은 거친 질문 앞에 서 있다. 마크업의 본질은 디자인을 웹 언어로 번역하는 일이다. 하지만 &amp;ldquo;모바일에서는 이 세로 구조로 바꿔줘&amp;rdquo;, &amp;ldquo;768px 이하에서는 이 패널을 숨겨줘&amp;rdquo;라는 의도(Intent)를 입력했을 때 AI가 디자인과 실제 구현 코드를 동시에 변경한다면, &amp;lsquo;번역&amp;rsquo;이라는 독립된 직무의 입지는 급격히 좁아진다.&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;24&quot; data-ke-size=&quot;size26&quot;&gt;화면을 고치다 서비스 기획자가 되어있었다&lt;/h2&gt;
&lt;p data-path-to-node=&quot;25&quot; data-ke-size=&quot;size16&quot;&gt;진짜 흥미로운 변화는 도구의 변화보다 &amp;lsquo;내 역할의 확장&amp;rsquo;에서 일어났다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;26&quot; data-ke-size=&quot;size16&quot;&gt;처음에는 그저 캡처 화면을 붙여 넣고 &amp;ldquo;이 버튼 위치 좀 바꿔줘&amp;rdquo; 수준의 피상적인 조작을 했다. 하지만 작업이 진행될수록 질문이 달라졌다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;27&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;이 정보가 왜 여기에 위치해야 하지?&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;사용자는 이 지점에서 무슨 의도로 클릭을 할까?&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;이 단계를 굳이 거칠 필요가 있을까?&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;버튼을 누른 후 어떤 상태(State)를 보여주는 것이 가장 직관적일까?&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;28&quot; data-ke-size=&quot;size16&quot;&gt;나는 어느새 단순 UI 수정이 아니라 &lt;b data-index-in-node=&quot;21&quot; data-path-to-node=&quot;28&quot;&gt;서비스 기획과 UX 설계&lt;/b&gt;를 하고 있었다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;29&quot; data-ke-size=&quot;size16&quot;&gt;기존 프로세스라면 [아이디어 &amp;rarr; 기획서 작성 &amp;rarr; 디자이너 검토 &amp;rarr; 피드백 &amp;rarr; 화면 수정]이라는 긴 피드백 루프를 거쳐야 했을 것이다. 그러나 지금은 대화 한 번으로 아이디어가 화면이 되고, 즉시 눌러보며 직관적인 불편함을 포착한 뒤, 대안을 선택해 검증하는 자가 순환 루프가 실시간으로 일어난다.&lt;/p&gt;
&lt;blockquote data-path-to-node=&quot;30&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;30,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;30,0&quot;&gt;기존:&lt;/b&gt; 생각 &amp;rarr; 기획 &amp;rarr; 디자인 &amp;rarr; 개발 &amp;rarr; 검증 (선형적 공정)&lt;/p&gt;
&lt;p data-path-to-node=&quot;30,1&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;30,1&quot;&gt;현재:&lt;/b&gt; 생각 &amp;harr; 기획 &amp;harr; 디자인 &amp;harr; 구현 &amp;harr; 검증 (동시 다발적 순환)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-path-to-node=&quot;31&quot; data-ke-size=&quot;size26&quot;&gt;AI가 무너뜨리는 것은 직업이 아닌 &amp;lsquo;역할 사이의 번역 과정&amp;rsquo;이다&lt;/h2&gt;
&lt;p data-path-to-node=&quot;32&quot; data-ke-size=&quot;size16&quot;&gt;이 일련의 경험을 통해 하나의 핵심 원리를 깨달았다. AI는 특정 직업을 단칼에 없애기보다, &lt;b data-index-in-node=&quot;52&quot; data-path-to-node=&quot;32&quot;&gt;직업과 직업 사이에 존재하던 &amp;lsquo;전달과 번역의 비용&amp;rsquo;을 없애고 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;33&quot; data-ke-size=&quot;size16&quot;&gt;기획자의 의도를 디자이너가 시안으로 번역하고, 디자이너의 시안을 마크업 개발자가 코드로 번역하며, 프론트엔드와 백엔드가 API 명세서로 번역하던 그 오랜 수작업 구간들. 그동안 우리는 이 번역 파편들을 개별 전문 직무로 분화시켜 왔다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;34&quot; data-ke-size=&quot;size16&quot;&gt;하지만 AI가 문제 정의부터 화면 구성, 동작 구현, 테스트까지 하나의 흐름으로 연결하면서, 조직 내 전달 및 통번역 단계가 획기적으로 압축되고 있다.&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;35&quot; data-ke-size=&quot;size26&quot;&gt;실행 능력이 평준화될 때 빛나는 &amp;lsquo;판단&amp;rsquo;의 가치&lt;/h2&gt;
&lt;p data-path-to-node=&quot;36&quot; data-ke-size=&quot;size16&quot;&gt;실행(Execution)의 장벽이 낮아지면서 인간에게 요구되는 능력은 오히려 더 복잡해졌다. &amp;ldquo;만들 수 있는가?&amp;rdquo;는 더 이상 차별점 요소가 아니다. 이제 중요한 질문은 다른 곳을 향한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;37&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;37,0,0&quot;&gt;무엇을&lt;/b&gt; 만들어야 하는가?&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;37,1,0&quot;&gt;왜&lt;/b&gt; 이 방식으로 해결해야 하는가?&lt;/li&gt;
&lt;li&gt;사용자가 진정으로 원하는 &lt;b data-index-in-node=&quot;14&quot; data-path-to-node=&quot;37,2,0&quot;&gt;핵심 가치&lt;/b&gt;는 무엇인가?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;38&quot; data-ke-size=&quot;size16&quot;&gt;도구를 다루는 기술적 스킬보다, 비즈니스 목적, 사용자 경험, 기술적 제약, 정보 구조를 종합적으로 조망하는 &amp;lsquo;복합적 사고 능력(Integrative Thinking)&amp;rsquo;의 가치가 결정적으로 커지고 있다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;39&quot; data-ke-size=&quot;size16&quot;&gt;전문성이 사라지는 것이 아니다. 전문성의 축이 &amp;ldquo;Figma를 얼마나 잘 다루는가&amp;rdquo;나 &amp;ldquo;특정 언어 구문에 얼마나 숙련되었는가&amp;rdquo;에서 &amp;ldquo;문제의 본질을 정확히 간파하고, AI와 협력하여 맥락에 맞는 올바른 의사결정을 내릴 수 있는가&amp;rdquo;로 이동하고 있을 뿐이다.&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;40&quot; data-ke-size=&quot;size26&quot;&gt;직업명이 아닌 &amp;lsquo;해결할 수 있는 문제의 범위&amp;rsquo;로 정의되는 시대&lt;/h2&gt;
&lt;p data-path-to-node=&quot;41&quot; data-ke-size=&quot;size16&quot;&gt;앞으로는 자신을 소개할 때 &amp;ldquo;저는 백엔드 개발자입니다&amp;rdquo;라는 단순 직무명보다, &amp;ldquo;나는 서비스의 문제를 정의하고, 시스템 구조를 설계하며, 필요한 UI와 기능을 직접 구현하여 세상에 전달할 수 있는 사람입니다&amp;rdquo;라는 해결 영역(Scope of Impact) 중심의 정의가 훨씬 선명해질 것이다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;42&quot; data-ke-size=&quot;size16&quot;&gt;나는 여전히 백엔드 개발자다. 하지만 예전과 동일한 의미의 백엔드 개발자는 아니다. UI/UX를 넘나들고, 서비스 흐름을 고심하며, AI라는 강력한 엔진을 통해 문제 해결 전체 공정을 주도하는 엔지니어다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;43&quot; data-ke-size=&quot;size16&quot;&gt;우리는 지금 단순한 생산성 향상의 시대를 넘어, &lt;b data-index-in-node=&quot;27&quot; data-path-to-node=&quot;43&quot;&gt;&amp;lsquo;직업과 역할의 경계가 완전히 재편되는 과도기&amp;rsquo;&lt;/b&gt; 한가운데를 통과하고 있다. 그리고 이 변화는 백엔드 개발자뿐만 아니라 디자이너, 프론트엔드, 기획자 모두에게 새로운 영토를 탐험할 기회를 열어주고 있다.&lt;/p&gt;</description>
      <category>Programmer/AI</category>
      <category>AI</category>
      <category>figma</category>
      <category>개발자</category>
      <category>디자이너</category>
      <category>마크업개발자</category>
      <category>백엔드개발자</category>
      <category>생성형AI</category>
      <category>인공지능</category>
      <category>프론트엔드</category>
      <category>피그마</category>
      <author>MoreLean</author>
      <guid isPermaLink="true">https://judekim.tistory.com/188</guid>
      <comments>https://judekim.tistory.com/188#entry188comment</comments>
      <pubDate>Thu, 1 Oct 2026 23:35:55 +0900</pubDate>
    </item>
    <item>
      <title>EPSON DS-760, Apple Silicon mac 에서 설정하기 (NAPS2 + SANE)</title>
      <link>https://judekim.tistory.com/187</link>
      <description>&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아이 전공서적이 너무 무거워보여, 디지털화 하기 위해서 쓰는 &lt;b&gt;엡손 WorkForce DS-760&lt;/b&gt; 문서 스캐너를 맥북에 USB로 연결했는데 인식이 되지 않았습니다. 엡손 안내문대로 드라이버를 찾아봤지만 결론은 &lt;b&gt;&quot;이 모델은 맥 드라이버가 없다&quot;&lt;/b&gt;였습니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 글은 드라이버가 없는 스캐너를 맥에서 쓰기까지 &lt;b&gt;어떤 순서로 확인하고, 무엇이 막혔고, 어떻게 풀었는지&lt;/b&gt;를 정리한 기록입니다. 마지막에 같은 문제를 겪는 분들을 위한 해결 방법을 따로 정리했습니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[환경]&lt;/b&gt; Apple Silicon 맥 ( M1 Ultra ) / Epson WorkForce DS-760 (USB 연결)&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1. 시작: 엡손 안내문대로 해봤지만&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;엡손 안내문에는 이렇게 적혀 있었습니다.&lt;/p&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ARM CPU(칩셋) 맥에서 엡손 스캐너를 USB로 연결하면 스캐너가 인식되지 않습니다. 최신 스캔 드라이버(Epson Scan 2)를 엡손 홈페이지 또는 글로벌 드라이버 다운로드 사이트에서 받아 설치하세요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;M1 맥이 처음 나왔을 때 작성된 것으로 보이는 안내문입니다. 요즘 Epson Scan 2는 Apple Silicon에서도 잘 돌아갑니다. 그런데 문제는 &lt;b&gt;DS-760이 애초에 Epson Scan 2를 쓰는 모델이 아니라는 점&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;2226&quot; data-origin-height=&quot;1818&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4G3xX/dJMb99OHGpv/y0kuLK54dIqc0tQFkWT2t1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4G3xX/dJMb99OHGpv/y0kuLK54dIqc0tQFkWT2t1/img.png&quot; data-alt=&quot;https://www.epson.co.kr/Mac_ARM_CPU&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4G3xX/dJMb99OHGpv/y0kuLK54dIqc0tQFkWT2t1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4G3xX%2FdJMb99OHGpv%2Fy0kuLK54dIqc0tQFkWT2t1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2226&quot; height=&quot;1818&quot; data-origin-width=&quot;2226&quot; data-origin-height=&quot;1818&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://www.epson.co.kr/Mac_ARM_CPU&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2. 한국 사이트와 미국 사이트, 말이 다르다&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; 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;구분엡손 한국 (epson.co.kr)엡손 미국 (epson.com)&lt;/p&gt;
&lt;table style=&quot;color: #000000; text-align: start; 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&gt;OS 선택 목록&lt;/td&gt;
&lt;td&gt;Mac은 &lt;b&gt;OS X 10.5 ~ 10.9까지만&lt;/b&gt; 있음&lt;/td&gt;
&lt;td&gt;최신 macOS까지 목록에 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;실제 제공 드라이버&lt;/td&gt;
&lt;td&gt;[직접 확인한 내용 기입]&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Windows용 EPSON Scan v5.3.2.3만&lt;/b&gt; 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;맥 호환 여부&lt;/td&gt;
&lt;td&gt;별도 안내 없음&lt;/td&gt;
&lt;td&gt;FAQ에 &lt;b&gt;&quot;호환되지 않음&quot;&lt;/b&gt;으로 명시&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2282&quot; data-origin-height=&quot;1726&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfr518/dJMcagAo0IQ/Urj2T9ZhBE5SQeTvp2B6Ek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfr518/dJMcagAo0IQ/Urj2T9ZhBE5SQeTvp2B6Ek/img.png&quot; data-alt=&quot;엡손 코리아 - 최신 Mac OS 는 아예 있지도 않다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfr518/dJMcagAo0IQ/Urj2T9ZhBE5SQeTvp2B6Ek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbfr518%2FdJMcagAo0IQ%2FUrj2T9ZhBE5SQeTvp2B6Ek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2282&quot; height=&quot;1726&quot; data-origin-width=&quot;2282&quot; data-origin-height=&quot;1726&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;엡손 코리아 - 최신 Mac OS 는 아예 있지도 않다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2226&quot; data-origin-height=&quot;1846&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t4ILq/dJMcaiSCEXr/rNwKskvvnMA46DgrLk9L80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t4ILq/dJMcaiSCEXr/rNwKskvvnMA46DgrLk9L80/img.png&quot; data-alt=&quot;미국 엡손의 경우 있긴 하지만 제대로 동작하지 않는다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t4ILq/dJMcaiSCEXr/rNwKskvvnMA46DgrLk9L80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft4ILq%2FdJMcaiSCEXr%2FrNwKskvvnMA46DgrLk9L80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2226&quot; height=&quot;1846&quot; data-origin-width=&quot;2226&quot; data-origin-height=&quot;1846&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;미국 엡손의 경우 있긴 하지만 제대로 동작하지 않는다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;한국 사이트만 보면 &quot;예전 맥 OS는 지원했나?&quot; 싶고, 미국 사이트는 OS 목록에 최신 macOS까지 올려 두고는 정작 FAQ에서 &quot;호환되지 않는다&quot;고 답합니다. &lt;b&gt;어느 쪽을 믿어야 할지 사용자가 직접 교차 확인해야 하는 구조&lt;/b&gt;입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3. 하드웨어 업체의 고질적인 문제&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이번 일은 DS-760만의 문제가 아닙니다. 스캐너나 프린터 같은 하드웨어를 쓰다 보면 반복해서 부딪히는 문제들입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;드라이버 지원이 소리 없이 끊깁니다.&lt;/b&gt; 하드웨어는 멀쩡한데 새 OS용 드라이버가 나오지 않아 못 쓰게 됩니다. 업무용 스캐너는 수년씩 쓰는 장비인데, 소프트웨어 수명이 하드웨어 수명보다 훨씬 짧습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;국가별 사이트의 정보가 서로 다릅니다.&lt;/b&gt; 같은 모델인데 지원 OS 목록, 드라이버 파일, FAQ 내용이 나라마다 제각각입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;안내문이 갱신되지 않습니다.&lt;/b&gt; 시기가 지난 안내(&quot;ARM 맥은 인식 안 됨&quot;)가 그대로 남아 있고, 모델별로 해당하는지 여부도 설명하지 않습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결국 해결은 서드파티와 오픈소스가 합니다.&lt;/b&gt; 제조사가 손을 놓은 장비를 VueScan(유료)이나 SANE(오픈소스) 같은 곳에서 리버스 엔지니어링으로 살려 두고 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;4. 해결 과정&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;① 유료 프로그램 VueScan &amp;rarr; 작동은 하지만 유료&lt;/h4&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;VueScan은 DS-760 드라이버를 리버스 엔지니어링해서 자체적으로 내장하고 있어, 설치하자마자 USB로 인식되고 스캔도 잘 됐습니다. 다만 체험판은 스캔 결과에 워터마크가 찍히고, 계속 쓰려면 라이선스를 사야 합니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 단계에서 &lt;b&gt;스캐너와 USB 연결 자체는 정상&lt;/b&gt;이라는 것은 확인했습니다. 문제는 드라이버뿐이었습니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;② 오픈소스 드라이버 SANE에 DS-760이 있는지 확인&lt;/h4&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;리눅스에서 스캐너를 쓸 때 사용하는 오픈소스 드라이버 모음 &lt;b&gt;SANE&lt;/b&gt;에는 엡손 DS 시리즈용 epsonds 드라이버가 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그런데 SANE 공식 문서만 봐서는 확신하기 어려웠습니다. DS-760이 &quot;Untested(테스트 안 됨)&quot;로 표시돼 있고, 적힌 USB ID도 문서마다 달랐기 때문입니다. 그래서 &lt;b&gt;드라이버 파일 안에 들어 있는 모델 목록을 직접 확인&lt;/b&gt;했습니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;DS-510   (USB ID 0x014c)
DS-560   (USB ID 0x0150)
DS-760   (USB ID 0x014d)   &amp;larr; 포함되어 있음
DS-860   (USB ID 0x014d)
...&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;드라이버에 DS-760이 실제로 들어 있었습니다. 참고로 엡손이 직접 만든 리눅스용 오픈소스 드라이버(utsushi)에서도 DS-760은 &quot;Good(잘 작동)&quot;으로 표시돼 있습니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;③ 맥에서 SANE을 쓰는 방법: NAPS2&lt;/h4&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;NAPS2&lt;/b&gt;(Not Another PDF Scanner)는 무료 오픈소스 스캔 프로그램으로, &lt;b&gt;맥 버전에 SANE 드라이버가 함께 들어 있습니다.&lt;/b&gt; NAPS2 공식 문서에도 &quot;제조사 드라이버가 없는 구형 USB 스캐너를 M1/M2/M3 맥에서 연결할 때 유용하다&quot;고 적혀 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;NAPS2에 들어 있는 드라이버 파일도 열어 봤고, DS-760 항목이 있는 것을 확인했습니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;④ 첫 시도: 장치가 목록에 안 나온다&lt;/h4&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;NAPS2를 설치하고 드라이버를 SANE으로 바꿨는데, 장치 목록에 DS-760이 나타나지 않았습니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;원인은 &lt;b&gt;VueScan&lt;/b&gt;이었습니다. USB 스캐너는 한 번에 한 프로그램만 붙잡을 수 있는데, 앞서 테스트하던 VueScan이 켜져 있어서 NAPS2가 스캐너에 접근하지 못한 것입니다. VueScan을 완전히 종료하고 다시 시도하니 DS-760 (epsonds)가 목록에 나타났습니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;⑤ 스캔 성공&lt;/h4&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ADF 단면&amp;middot;양면 스캔 모두 정상적으로 작동했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOAq0W/dJMcadjv4Eu/kTEd2t1ykTzfYhfOJJQ530/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOAq0W/dJMcadjv4Eu/kTEd2t1ykTzfYhfOJJQ530/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOAq0W/dJMcadjv4Eu/kTEd2t1ykTzfYhfOJJQ530/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOAq0W%2FdJMcadjv4Eu%2FkTEd2t1ykTzfYhfOJJQ530%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2644&quot; height=&quot;1424&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1424&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;5. 해결 방법 정리 (따라 하기)&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;STEP 1. 내 모델이 맥을 지원하는지부터 확인&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한국 사이트와 미국(또는 글로벌) 사이트를 &lt;b&gt;모두&lt;/b&gt; 확인합니다.&lt;/li&gt;
&lt;li&gt;FAQ에서 &quot;Mac compatible&quot;을 검색해 봅니다.&lt;/li&gt;
&lt;li&gt;Epson Scan 2가 제공되는 모델이라면 최신 버전을 설치하는 것으로 해결됩니다. 제공되지 않는다면 아래 단계로 넘어갑니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;STEP 2. NAPS2 설치 후 드라이버를 SANE으로 설정&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.naps2.com/&quot;&gt;naps2.com&lt;/a&gt;에서 맥 버전을 설치합니다 (무료).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프로필 &amp;rarr; 새 프로필&lt;/b&gt;을 만듭니다.&lt;/li&gt;
&lt;li&gt;드라이버를 &lt;b&gt;Apple &amp;rarr; SANE&lt;/b&gt;으로 바꿉니다. &lt;b&gt;가장 중요한 단계입니다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;장치 선택&lt;/b&gt;을 누르고 10~20초 정도 기다리면 모델명이 나타납니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;1142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o4UUa/dJMcaiykLCq/YhWppgSjQx9k4BiAhxcQZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o4UUa/dJMcaiykLCq/YhWppgSjQx9k4BiAhxcQZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o4UUa/dJMcaiykLCq/YhWppgSjQx9k4BiAhxcQZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo4UUa%2FdJMcaiykLCq%2FYhWppgSjQx9k4BiAhxcQZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;414&quot; height=&quot;483&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;1142&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;STEP 3. 장치가 안 보이면&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;VueScan, Epson Scan 같은 &lt;b&gt;다른 스캔 프로그램을 Cmd+Q로 완전히 종료&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li&gt;스캐너 전원을 껐다 켭니다.&lt;/li&gt;
&lt;li&gt;USB 허브를 빼고 맥 본체에 직접 연결합니다.&lt;/li&gt;
&lt;li&gt;그래도 안 되면 터미널에서 스캐너의 USB ID를 확인합니다.&amp;nbsp;&lt;/li&gt;
&lt;li class=&quot;1c&quot;&gt;&lt;code&gt;system_profiler SPUSBDataType | grep -i -A10 epson&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;STEP 4. 스캔 설정&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Deskew scanned pages&lt;/b&gt;: 기울기 자동 보정입니다. ADF로 스캔한다면 켜 두세요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Page size&lt;/b&gt;: 실제 문서 크기로 지정합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Page align&lt;/b&gt;: &lt;b&gt;Center&lt;/b&gt;로 둡니다. DS-760은 종이를 가운데 기준으로 급지합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Crop to page size&lt;/b&gt;: 지정한 용지 크기 밖의 여백을 잘라 줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;1232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8uQh9/dJMcahF28JO/jJk6RU1GS8E2mrstryhWA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8uQh9/dJMcahF28JO/jJk6RU1GS8E2mrstryhWA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8uQh9/dJMcahF28JO/jJk6RU1GS8E2mrstryhWA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8uQh9%2FdJMcahF28JO%2FjJk6RU1GS8E2mrstryhWA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;604&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;1232&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;STEP 5. 자동 저장 설정&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;864&quot; data-origin-height=&quot;832&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9gqiV/dJMcaikJVqJ/IGkHQZ7ZJGQJSD4eGc6WjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9gqiV/dJMcaikJVqJ/IGkHQZ7ZJGQJSD4eGc6WjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9gqiV/dJMcaikJVqJ/IGkHQZ7ZJGQJSD4eGc6WjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9gqiV%2FdJMcaikJVqJ%2FIGkHQZ7ZJGQJSD4eGc6WjK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;545&quot; height=&quot;525&quot; data-origin-width=&quot;864&quot; data-origin-height=&quot;832&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;파일 경로에는 반드시 .pdf 확장자를 붙이세요.&lt;/b&gt; 확장자가 없으면 저장에 실패하고 오류 로그에 &lt;i&gt;&quot;Could not infer file format from extension&quot;&lt;/i&gt;이 남습니다. 제가 실제로 겪은 문제입니다.&lt;/li&gt;
&lt;li&gt;분 단위까지만 넣으면 1분 안에 두 번 스캔했을 때 파일 이름이 겹칩니다. 초 단위까지 넣는 것을 추천합니다.&amp;nbsp;&lt;/li&gt;
&lt;li class=&quot;reasonml&quot;&gt;&lt;code&gt;$(YYYY)-$(MM)-$(DD)-$(hh)-$(mm)-$(ss).pdf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&quot;...&quot;&lt;/b&gt; 버튼으로 저장할 폴더를 지정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 나누기 옵션동작추천 상황&lt;/p&gt;
&lt;table style=&quot;color: #000000; text-align: start; 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&gt;One file per page&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;One file per scan&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;Separate files by Patch-T&lt;/td&gt;
&lt;td&gt;Patch-T 구분지를 기준으로 파일 분리&lt;/td&gt;
&lt;td&gt;여러 문서를 ADF에 한꺼번에 넣을 때&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;6. 마치며&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;DS-760은 공식적으로 &quot;맥 미지원&quot; 모델이지만, 하드웨어에는 아무 문제가 없었습니다. &lt;b&gt;문제는 드라이버, 즉 제조사의 소프트웨어 지원&lt;/b&gt;이었습니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;제조사 사이트에 드라이버가 없다고 바로 포기하거나 새 장비를 사기 전에 아래 순서로 확인해 보세요.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;국가별 제조사 사이트를 교차 확인&lt;/li&gt;
&lt;li&gt;SANE 지원 목록에서 내 모델 검색&lt;/li&gt;
&lt;li&gt;NAPS2(무료)에서 SANE 드라이버로 연결 시도&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;멀쩡한 장비를 드라이버 하나 때문에 버리지 않아도 되는 경우가 생각보다 많습니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고 링크&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.naps2.com/&quot;&gt;NAPS2 공식 사이트&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.naps2.com/mac-scanning&quot;&gt;NAPS2 &amp;ndash; Mac Scanning 안내&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.epson.co.kr/%EA%B3%A0%EA%B0%9D%EC%A7%80%EC%9B%90/%EC%8A%A4%EC%BA%90%EB%84%88/WorkForce-(DS)-%EC%8B%9C%EB%A6%AC%EC%A6%88/Epson-WorkForce-DS-760/s/SPT_B11B222508&quot;&gt;엡손 한국 &amp;ndash; DS-760 고객지원&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://epson.com/Support/Scanners/DS-Series/Epson-WorkForce-DS-760/s/SPT_B11B222202&quot;&gt;엡손 미국 &amp;ndash; DS-760 Support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://epson.com/faq/SPT_B11B222202~faq-00008cc-shared&quot;&gt;엡손 미국 FAQ &amp;ndash; Mac 호환 여부&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sane-project.org/sane-backends.html&quot;&gt;SANE 지원 스캐너 목록&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.hamrick.com/vuescan/epson_workforce_ds_760.html&quot;&gt;VueScan &amp;ndash; DS-760 지원 안내&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>TIP</category>
      <category>DS-760</category>
      <category>NAPS2</category>
      <category>SanE</category>
      <category>맥드라이버없음</category>
      <category>맥북스캐너</category>
      <category>맥스캐너</category>
      <category>스캐너드라이버</category>
      <category>애플실리콘</category>
      <category>엡손DS760</category>
      <category>엡손스캐너</category>
      <author>MoreLean</author>
      <guid isPermaLink="true">https://judekim.tistory.com/187</guid>
      <comments>https://judekim.tistory.com/187#entry187comment</comments>
      <pubDate>Thu, 1 Oct 2026 01:02:29 +0900</pubDate>
    </item>
    <item>
      <title>Jev - 프로그램과 연동하는 기술</title>
      <link>https://judekim.tistory.com/186</link>
      <description>&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;생성형 AI는 이제 단순히 질문에 답변하는 수준을 넘어 실제 업무를 처리하는 방향으로 발전하고 있습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;그런데 AI 서비스를 개발하다 보면 한 가지 고민이 생깁니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-d-inline=&quot;&quot; data-d-default-strong=&quot;&quot; data-d-component=&quot;text&quot;&gt;&quot;모든 업무에 ChatGPT와 같은 생성형 AI를 사용해야 할까?&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 고객의 문의가 결제, 배송, 환불 중 어떤 유형에 해당하는지 판단하는 작업을 생각해 보겠습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;이러한 작업에는 길고 자연스러운 문장을 생성할 필요가 없습니다. 고객의 문의 내용을 이해하고, 미리 정의된 선택지 중 적절한 항목 하나를 선택하면 됩니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;이처럼 문장의 의미를 이해하고 판단하는 작업에 초점을 맞춘 AI 모델이 바로 Jev입니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;이번 포스팅에서는 Jev가 무엇인지, 기존 생성형 AI와 어떤 차이가 있는지, 그리고 실제 서비스에서 어떻게 활용할 수 있는지 개발자와 일반 사용자 모두 쉽게 이해할 수 있도록 정리해 보겠습니다.&lt;/p&gt;
&lt;h2 data-d-weight=&quot;semibold&quot; data-d-size=&quot;lg&quot; data-d-component=&quot;title&quot; data-ke-size=&quot;size26&quot;&gt;1. Jev란 무엇인가?&lt;/h2&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;Jev는 TypeSafe AI에서 개발한 AI 모델로, 주어진 상황을 이해하고 정해진 기준에 따라 판단 결과를 반환하는 데 초점을 맞추고 있습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;기존 생성형 AI가 사람에게 자연스러운 답변을 제공하는 역할에 중점을 두었다면, Jev는 소프트웨어가 활용할 수 있는 판단 결과를 제공하는 역할에 집중합니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;조금 더 쉽게 이해하기 위해 고객센터를 예로 들어 보겠습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;고객이 다음과 같이 문의했다고 가정해 보겠습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;&quot;지난주 주문한 상품이 아직 도착하지 않았어요. 언제 받을 수 있나요?&quot;&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;일반적인 생성형 AI에 이 문장을 전달하면 다음과 같은 답변을 생성할 수 있습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;&quot;고객님께서는 주문하신 상품의 배송 상태를 문의하고 계십니다. 주문 내역과 배송 정보를 확인한 후 예상 도착 일정을 안내하는 것이 좋겠습니다.&quot;&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;반면 Jev에는 다음과 같이 질문할 수 있습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;&quot;이 고객의 문의는 결제, 배송, 환불 중 어느 유형에 해당하는가?&quot;&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;Jev는 문장의 의미를 분석한 후 배송이라는 선택지에 대한 판단 결과를 반환합니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;개발자는 이 결과를 받아 배송 조회 시스템을 실행하거나 배송 담당 부서로 문의를 전달할 수 있습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;즉, Jev의 핵심은 사람이 읽기 위한 긴 답변을 생성하는 것이 아니라, 프로그램이 다음 행동을 결정하는 데 필요한 정보를 제공하는 것입니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;물론 일반적인 생성형 AI도 이러한 분류 작업을 수행할 수 있습니다. Jev는 그중에서도 판단 작업에 특화된 모델이라는 점에 차이가 있습니다.&lt;/p&gt;
&lt;h2 data-d-weight=&quot;semibold&quot; data-d-size=&quot;lg&quot; data-d-component=&quot;title&quot; data-ke-size=&quot;size26&quot;&gt;2. 기존 생성형 AI와 Jev는 무엇이 다를까?&lt;/h2&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;일반적인 생성형 AI는 문장을 이해하고 새로운 문장을 만들어 내는 데 강점이 있습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;반면 Jev는 주어진 조건에 따라 적절한 선택을 하거나 특정 조건에 해당하는지 평가하는 작업에 초점을 맞추고 있습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;두 모델의 차이를 간단히 비교하면 다음과 같습니다.&lt;/p&gt;
&lt;div data-d-component=&quot;table&quot; data-d-column-sizing=&quot;auto&quot;&gt;구분일반적인 생성형 AIJev
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-d-dividers=&quot;&quot; data-d-column-sizing=&quot;auto&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr data-d-component=&quot;table-row&quot;&gt;
&lt;td data-d-valign=&quot;start&quot; data-d-component=&quot;table-cell&quot;&gt;&lt;span&gt;주요 역할&lt;/span&gt;&lt;/td&gt;
&lt;td data-d-valign=&quot;start&quot; data-d-component=&quot;table-cell&quot;&gt;&lt;span&gt;자연어 이해 및 콘텐츠 생성&lt;/span&gt;&lt;/td&gt;
&lt;td data-d-valign=&quot;start&quot; data-d-component=&quot;table-cell&quot;&gt;&lt;span&gt;의미 이해 및 판단&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-d-component=&quot;table-row&quot;&gt;
&lt;td data-d-valign=&quot;start&quot; data-d-component=&quot;table-cell&quot;&gt;&lt;span&gt;결과물&lt;/span&gt;&lt;/td&gt;
&lt;td data-d-valign=&quot;start&quot; data-d-component=&quot;table-cell&quot;&gt;&lt;span&gt;문장, 코드, 보고서 등&lt;/span&gt;&lt;/td&gt;
&lt;td data-d-valign=&quot;start&quot; data-d-component=&quot;table-cell&quot;&gt;&lt;span&gt;선택 결과, 확률, 점수&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-d-component=&quot;table-row&quot;&gt;
&lt;td data-d-valign=&quot;start&quot; data-d-component=&quot;table-cell&quot;&gt;&lt;span&gt;주요 활용&lt;/span&gt;&lt;/td&gt;
&lt;td data-d-valign=&quot;start&quot; data-d-component=&quot;table-cell&quot;&gt;&lt;span&gt;챗봇, 글쓰기, 요약, 분석&lt;/span&gt;&lt;/td&gt;
&lt;td data-d-valign=&quot;start&quot; data-d-component=&quot;table-cell&quot;&gt;&lt;span&gt;업무 분류, 조건 평가, 실행 경로 선택&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-d-component=&quot;table-row&quot;&gt;
&lt;td data-d-valign=&quot;start&quot; data-d-component=&quot;table-cell&quot;&gt;&lt;span&gt;처리 방식&lt;/span&gt;&lt;/td&gt;
&lt;td data-d-valign=&quot;start&quot; data-d-component=&quot;table-cell&quot;&gt;&lt;span&gt;자유로운 형태의 답변 생성&lt;/span&gt;&lt;/td&gt;
&lt;td data-d-valign=&quot;start&quot; data-d-component=&quot;table-cell&quot;&gt;&lt;span&gt;미리 정의된 질문과 기준에 따른 판단&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-d-component=&quot;table-row&quot;&gt;
&lt;td data-d-valign=&quot;start&quot; data-d-component=&quot;table-cell&quot;&gt;&lt;span&gt;활용 목적&lt;/span&gt;&lt;/td&gt;
&lt;td data-d-valign=&quot;start&quot; data-d-component=&quot;table-cell&quot;&gt;&lt;span&gt;사용자가 이해할 수 있는 결과 생성&lt;/span&gt;&lt;/td&gt;
&lt;td data-d-valign=&quot;start&quot; data-d-component=&quot;table-cell&quot;&gt;&lt;span&gt;프로그램이 활용할 수 있는 판단 결과 제공&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 쇼핑몰에 하루 수만 건의 고객 문의가 접수된다고 가정해 보겠습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;모든 문의에 대해 생성형 AI를 호출하여 자연어 답변을 생성하고, 그 답변을 다시 분석하여 담당 부서를 결정할 필요는 없습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;고객 문의를 정해진 유형으로 분류하는 것이 목적이라면 판단 결과만 반환받아도 충분합니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;이러한 업무에 Jev와 같은 판단 전용 모델을 활용하면 기존 시스템을 보다 단순하게 구성할 수 있습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;다만 Jev가 모든 환경에서 기존 생성형 AI보다 빠르거나 저렴하다고 단정할 수는 없습니다. 실제 서비스에 도입하기 전에는 동일한 업무를 기준으로 정확도, 응답 속도, 비용을 비교해 보는 것이 좋습니다.&lt;/p&gt;
&lt;h2 data-d-weight=&quot;semibold&quot; data-d-size=&quot;lg&quot; data-d-component=&quot;title&quot; data-ke-size=&quot;size26&quot;&gt;3. Jev의 핵심 기능 3가지&lt;/h2&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;Jev를 활용하기 위해 가장 먼저 이해해야 할 것은 세 가지 판단 방식입니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;Choice, Noul, Score라는 기능을 알아두면 Jev를 어떤 업무에 적용할 수 있는지 쉽게 이해할 수 있습니다.&lt;/p&gt;
&lt;h3 data-d-weight=&quot;semibold&quot; data-d-size=&quot;md&quot; data-d-component=&quot;title&quot; data-ke-size=&quot;size23&quot;&gt;① Choice: 여러 선택지 중 하나를 선택하는 기능&lt;/h3&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;Choice는 여러 후보 중 주어진 상황에 가장 적합한 항목을 선택하는 기능입니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 고객센터에 다음과 같은 문의가 들어왔다고 가정해 보겠습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;&quot;결제한 금액이 두 번 청구됐어요. 확인해 주세요.&quot;&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;이때 Jev에 다음과 같은 선택지를 전달할 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-d-marker-layout=&quot;native&quot; data-d-marker=&quot;bullet&quot; data-d-component=&quot;list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-d-marker-layout=&quot;native&quot; data-d-component=&quot;list-item&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;결제 문의&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-d-marker-layout=&quot;native&quot; data-d-component=&quot;list-item&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;배송 문의&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-d-marker-layout=&quot;native&quot; data-d-component=&quot;list-item&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;환불 문의&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-d-marker-layout=&quot;native&quot; data-d-component=&quot;list-item&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;기타 문의&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;Jev는 고객의 문장을 분석한 후 각 항목에 해당할 확률을 평가하고 적절한 항목을 선택합니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;개발자는 선택된 결과를 바탕으로 결제 담당 부서에 문의를 전달하거나 결제 내역 조회 시스템을 실행할 수 있습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;이러한 기능은 고객센터뿐 아니라 이메일 분류, 문서 분류, AI 에이전트의 도구 선택 등에도 활용할 수 있습니다.&lt;/p&gt;
&lt;h3 data-d-weight=&quot;semibold&quot; data-d-size=&quot;md&quot; data-d-component=&quot;title&quot; data-ke-size=&quot;size23&quot;&gt;② Noul: 특정 조건에 해당하는지 판단하는 기능&lt;/h3&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;Noul은 특정 조건이 참인지 거짓인지 확률로 평가하는 기능입니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 고객의 메시지가 실제 환불 요청에 해당하는지 판단하고 싶다고 가정해 보겠습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;고객 메시지:&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;&quot;지난주 구매한 상품을 환불받고 싶습니다.&quot;&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;질문:&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;&quot;이 고객은 현재 환불을 요청하고 있는가?&quot;&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;Jev는 해당 질문이 참일 확률을 반환합니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;이 결과를 활용하면 고객의 요청이 실제 환불 요청에 해당하는지 판단하고, 필요한 경우 환불 처리 절차로 연결할 수 있습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;다른 활용 사례로는 다음과 같은 것들이 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-d-marker-layout=&quot;native&quot; data-d-marker=&quot;bullet&quot; data-d-component=&quot;list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-d-marker-layout=&quot;native&quot; data-d-component=&quot;list-item&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;고객의 메시지에 불만이 포함되어 있는가?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-d-marker-layout=&quot;native&quot; data-d-component=&quot;list-item&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;특정 문서에 개인정보가 포함되어 있는가?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-d-marker-layout=&quot;native&quot; data-d-component=&quot;list-item&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;사용자가 서비스 이용을 중단하려는 의도를 표현했는가?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-d-marker-layout=&quot;native&quot; data-d-component=&quot;list-item&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;학생의 답변에 자신의 의견이 포함되어 있는가?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;다만 판단 확률이 높다는 이유만으로 실제 환불이나 계정 삭제 같은 중요한 작업을 자동 실행해서는 안 됩니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;최종 실행 여부는 기존 시스템의 정책과 권한 검사를 통해 결정하는 것이 안전합니다.&lt;/p&gt;
&lt;h3 data-d-weight=&quot;semibold&quot; data-d-size=&quot;md&quot; data-d-component=&quot;title&quot; data-ke-size=&quot;size23&quot;&gt;③ Score: 정해진 기준에 따라 수준을 평가하는 기능&lt;/h3&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;Score는 특정 상황이 어느 정도의 수준에 해당하는지 평가하는 기능입니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 고객 문의의 긴급성을 판단한다고 가정해 보겠습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;고객 메시지:&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;&quot;결제 시스템에서 오류가 발생해 계속 중복 결제가 이루어지고 있습니다.&quot;&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;이때 다음과 같은 기준을 정의할 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-d-marker-layout=&quot;native&quot; data-d-marker=&quot;bullet&quot; data-d-component=&quot;list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-d-marker-layout=&quot;native&quot; data-d-component=&quot;list-item&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;낮음: 일반적인 문의로 즉각적인 조치가 필요하지 않은 경우&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-d-marker-layout=&quot;native&quot; data-d-component=&quot;list-item&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;보통: 일정 시간 내 담당자의 확인이 필요한 경우&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-d-marker-layout=&quot;native&quot; data-d-component=&quot;list-item&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;높음: 금전적 손실이나 서비스 장애가 발생해 신속한 확인이 필요한 경우&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;Jev는 정의된 기준을 바탕으로 상황을 평가합니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;개발자는 해당 결과를 활용해 긴급한 문의부터 담당자에게 전달하거나 장애 대응 절차를 시작하도록 구성할 수 있습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;단, Jev가 반환한 점수 자체가 객관적으로 검증된 위험도나 실제 피해 규모를 의미하는 것은 아닙니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;실제 서비스에서는 평가 기준과 후속 처리 규칙을 별도로 검증해야 합니다.&lt;/p&gt;
&lt;h2 data-d-weight=&quot;semibold&quot; data-d-size=&quot;lg&quot; data-d-component=&quot;title&quot; data-ke-size=&quot;size26&quot;&gt;4. Jev를 실제 서비스에 활용하는 방법&lt;/h2&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;Jev의 기능을 이해했다면 실제 서비스에 어떻게 활용할 수 있는지 살펴보겠습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;가장 중요한 것은 복잡한 업무 전체를 Jev에 맡기는 것이 아니라, 업무 처리 과정에서 판단이 필요한 부분을 찾아 적용하는 것입니다.&lt;/p&gt;
&lt;h3 data-d-weight=&quot;semibold&quot; data-d-size=&quot;md&quot; data-d-component=&quot;title&quot; data-ke-size=&quot;size23&quot;&gt;활용 사례 1. 고객센터 문의 자동 분류&lt;/h3&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;고객센터에서는 매일 다양한 유형의 문의가 접수됩니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;&quot;상품이 언제 도착하나요?&quot;&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;&quot;카드 결제가 두 번 됐어요.&quot;&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;&quot;주문을 취소하고 싶습니다.&quot;&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;&quot;회원 탈퇴는 어떻게 하나요?&quot;&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;이러한 문의를 사람이 일일이 확인하고 담당 부서로 전달하려면 많은 시간이 필요합니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;Jev를 활용하면 고객의 문의 내용을 분석해 정해진 유형으로 분류할 수 있습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-d-inline=&quot;&quot; data-d-default-strong=&quot;&quot; data-d-component=&quot;text&quot;&gt;처리 과정&lt;/span&gt;&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;고객 문의 접수 &amp;rarr; Jev가 문의 유형 판단 &amp;rarr; 담당 업무 시스템에 전달 &amp;rarr; 기존 시스템에서 실제 업무 처리&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 배송 관련 문의라면 배송 조회 시스템으로 연결하고, 결제 관련 문의라면 결제 내역 조회 시스템으로 연결하는 방식입니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;여기서 Jev는 고객의 의도를 파악하는 역할을 수행합니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;실제 결제 확인이나 환불 실행과 같은 업무는 기존 시스템에서 처리합니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;이처럼 역할을 분리하면 AI의 판단 결과를 기존 업무 자동화 시스템에 연결할 수 있습니다.&lt;/p&gt;
&lt;h3 data-d-weight=&quot;semibold&quot; data-d-size=&quot;md&quot; data-d-component=&quot;title&quot; data-ke-size=&quot;size23&quot;&gt;활용 사례 2. AI 에이전트의 도구 선택&lt;/h3&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;최근 AI 에이전트는 단순히 사용자와 대화하는 수준을 넘어 실제 업무를 수행하는 방향으로 발전하고 있습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 사용자가 AI 비서에게 다음과 같이 요청했다고 가정해 보겠습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;&quot;지난달 카드 사용 내역을 정리해서 알려줘.&quot;&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;이 요청을 처리하기 위해서는 다음과 같은 과정이 필요합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-d-marker-layout=&quot;native&quot; data-d-marker=&quot;number&quot; data-d-component=&quot;list&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-d-marker-layout=&quot;native&quot; data-d-component=&quot;list-item&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;사용자의 요청 의도를 이해합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-d-marker-layout=&quot;native&quot; data-d-component=&quot;list-item&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;어떤 데이터나 도구가 필요한지 판단합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-d-marker-layout=&quot;native&quot; data-d-component=&quot;list-item&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;필요한 데이터를 조회합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-d-marker-layout=&quot;native&quot; data-d-component=&quot;list-item&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;조회한 결과를 분석합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-d-marker-layout=&quot;native&quot; data-d-component=&quot;list-item&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;사용자가 이해할 수 있는 형태로 답변을 생성합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;이 중 Jev는 두 번째 단계인 도구 선택에 활용할 수 있습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;사용자의 요청을 분석한 후 결제 데이터 조회 도구를 선택하도록 하는 방식입니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;선택된 도구가 실제 데이터를 조회하고, 생성형 AI가 조회 결과를 정리하여 사용자에게 전달할 수 있습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;이러한 구조에서는 하나의 생성형 AI가 모든 단계의 판단과 처리를 담당할 필요가 없습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;Jev는 어떤 도구를 사용할지 판단하고, 기존 프로그램은 데이터를 처리하며, 생성형 AI는 최종 답변을 작성하도록 역할을 분리할 수 있습니다.&lt;/p&gt;
&lt;h3 data-d-weight=&quot;semibold&quot; data-d-size=&quot;md&quot; data-d-component=&quot;title&quot; data-ke-size=&quot;size23&quot;&gt;활용 사례 3. 교육 및 독서 서비스&lt;/h3&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;개인적으로 흥미롭게 생각하는 활용 분야 중 하나는 교육 서비스입니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;특히 학생이 책을 읽고 자신의 생각을 자유롭게 표현하는 독서 서비스에서 Jev를 활용할 수 있습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 학생이 책을 읽은 후 다음과 같이 답변했다고 가정해 보겠습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;&quot;주인공이 친구에게 거짓말을 해서 속상했지만, 마지막에 잘못을 인정해서 다행이라고 생각했어요.&quot;&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;이때 학생의 답변을 바탕으로 다음과 같은 질문을 Jev에 전달할 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-d-marker-layout=&quot;native&quot; data-d-marker=&quot;bullet&quot; data-d-component=&quot;list&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-d-marker-layout=&quot;native&quot; data-d-component=&quot;list-item&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;학생이 이야기의 주요 사건을 이해했는가?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-d-marker-layout=&quot;native&quot; data-d-component=&quot;list-item&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;등장인물의 감정이나 자신의 감정을 표현했는가?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-d-marker-layout=&quot;native&quot; data-d-component=&quot;list-item&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;자신의 생각을 뒷받침하는 근거를 제시했는가?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li data-d-marker-layout=&quot;native&quot; data-d-component=&quot;list-item&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;추가적인 질문이 필요한 답변인가?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;이러한 판단 결과를 활용하면 학생의 답변에 따라 다른 후속 질문을 제공하는 기능을 설계할 수 있습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 학생이 자신의 감정은 충분히 표현했지만 생각의 근거를 설명하지 않았다면 다음과 같이 질문할 수 있습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;&quot;주인공이 자신의 잘못을 인정한 장면이 왜 중요하다고 생각했나요?&quot;&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;여기서 Jev는 학생에게 어떤 종류의 질문이 필요한지 판단하는 역할을 수행할 수 있습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;실제 질문 문장은 미리 준비한 질문 목록에서 선택하거나 생성형 AI를 활용해 만들 수 있습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;다만 학생의 독서 이해도와 사고 능력은 하나의 답변만으로 단정하기 어렵습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;따라서 Jev의 판단 결과는 학생의 능력을 평가하는 절대적인 기준보다는 적절한 후속 질문을 선택하기 위한 보조 정보로 활용하는 것이 적합합니다.&lt;/p&gt;
&lt;h3 data-d-weight=&quot;semibold&quot; data-d-size=&quot;md&quot; data-d-component=&quot;title&quot; data-ke-size=&quot;size23&quot;&gt;활용 사례 4. 문서 분류 및 업무 자동화&lt;/h3&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;기업에서는 계약서, 청구서, 이메일, 보고서 등 다양한 문서를 처리합니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;이러한 문서가 어떤 업무에 해당하는지 판단하는 과정에도 Jev를 활용할 수 있습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 회사에 새로운 이메일이 도착하면 다음과 같은 과정을 구성할 수 있습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;이메일 수신 &amp;rarr; 문의 내용 분석 &amp;rarr; 업무 유형 판단 &amp;rarr; 담당자에게 전달&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;또는 계약서를 검토하는 과정에서 개인정보 포함 여부나 추가 검토 필요 여부를 평가하도록 설계할 수도 있습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;다만 계약서의 법적 효력이나 실제 금액, 날짜, 계약 조건과 같은 중요한 정보는 Jev의 판단 결과만으로 확정해서는 안 됩니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;정확한 데이터 추출과 검증이 필요한 작업은 별도의 프로그램이나 전문적인 검토 절차를 통해 처리해야 합니다.&lt;/p&gt;
&lt;h2 data-d-weight=&quot;semibold&quot; data-d-size=&quot;lg&quot; data-d-component=&quot;title&quot; data-ke-size=&quot;size26&quot;&gt;5. 개발자가 Jev를 실제로 사용하려면?&lt;/h2&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;Jev는 API를 통해 기존 애플리케이션에 연결하여 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;실제 개발 과정에서는 다음과 같은 순서로 접근하면 이해하기 쉽습니다.&lt;/p&gt;
&lt;h3 data-d-weight=&quot;semibold&quot; data-d-size=&quot;md&quot; data-d-component=&quot;title&quot; data-ke-size=&quot;size23&quot;&gt;STEP 1. 판단이 필요한 업무를 정의합니다.&lt;/h3&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;가장 먼저 Jev로 어떤 문제를 해결할 것인지 명확하게 정의해야 합니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 고객센터의 모든 업무를 자동화하겠다는 목표보다는 고객의 문의를 결제, 배송, 환불, 기타 유형으로 분류하겠다는 구체적인 목표를 세우는 것이 좋습니다.&lt;/p&gt;
&lt;h3 data-d-weight=&quot;semibold&quot; data-d-size=&quot;md&quot; data-d-component=&quot;title&quot; data-ke-size=&quot;size23&quot;&gt;STEP 2. 판단 기준과 선택지를 정의합니다.&lt;/h3&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;고객 문의를 분류하는 기능이라면 선택지를 다음과 같이 정의할 수 있습니다.&lt;/p&gt;
&lt;div data-d-component=&quot;table&quot; data-d-column-sizing=&quot;auto&quot;&gt;분류값의미
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-d-dividers=&quot;&quot; data-d-column-sizing=&quot;auto&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr data-d-component=&quot;table-row&quot;&gt;
&lt;td data-d-valign=&quot;start&quot; data-d-component=&quot;table-cell&quot;&gt;&lt;span&gt;billing&lt;/span&gt;&lt;/td&gt;
&lt;td data-d-valign=&quot;start&quot; data-d-component=&quot;table-cell&quot;&gt;&lt;span&gt;결제와 결제 내역 관련 문의&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-d-component=&quot;table-row&quot;&gt;
&lt;td data-d-valign=&quot;start&quot; data-d-component=&quot;table-cell&quot;&gt;&lt;span&gt;delivery&lt;/span&gt;&lt;/td&gt;
&lt;td data-d-valign=&quot;start&quot; data-d-component=&quot;table-cell&quot;&gt;&lt;span&gt;배송 상태 및 일정 관련 문의&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-d-component=&quot;table-row&quot;&gt;
&lt;td data-d-valign=&quot;start&quot; data-d-component=&quot;table-cell&quot;&gt;&lt;span&gt;refund&lt;/span&gt;&lt;/td&gt;
&lt;td data-d-valign=&quot;start&quot; data-d-component=&quot;table-cell&quot;&gt;&lt;span&gt;환불 및 결제 취소 관련 문의&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-d-component=&quot;table-row&quot;&gt;
&lt;td data-d-valign=&quot;start&quot; data-d-component=&quot;table-cell&quot;&gt;&lt;span&gt;other&lt;/span&gt;&lt;/td&gt;
&lt;td data-d-valign=&quot;start&quot; data-d-component=&quot;table-cell&quot;&gt;&lt;span&gt;다른 유형의 문의&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-d-component=&quot;table-row&quot;&gt;
&lt;td data-d-valign=&quot;start&quot; data-d-component=&quot;table-cell&quot;&gt;&lt;span&gt;unknown&lt;/span&gt;&lt;/td&gt;
&lt;td data-d-valign=&quot;start&quot; data-d-component=&quot;table-cell&quot;&gt;&lt;span&gt;정보가 부족하여 판단하기 어려운 문의&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;중요한 것은 각 선택지가 어떤 상황에 해당하는지 명확하게 정의하는 것입니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 환불 정책에 대한 단순한 질문과 실제 환불을 요청하는 메시지는 서로 다른 업무로 처리해야 할 수 있습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;따라서 모델이 혼동하지 않도록 선택지별 기준을 구체적으로 작성하는 것이 중요합니다.&lt;/p&gt;
&lt;h3 data-d-weight=&quot;semibold&quot; data-d-size=&quot;md&quot; data-d-component=&quot;title&quot; data-ke-size=&quot;size23&quot;&gt;STEP 3. API를 호출해 판단 결과를 받습니다.&lt;/h3&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;Jev API를 호출할 때는 분석 대상 데이터와 판단할 질문을 전달합니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;고객센터 분류 기능이라면 고객이 작성한 메시지와 문의 유형을 판단하기 위한 질문이 필요합니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;Jev는 주어진 질문과 선택지를 바탕으로 판단 결과를 반환합니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;개발자는 반환된 선택값과 확률 정보를 확인하여 후속 처리 로직을 구성할 수 있습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;실제 요청 형식과 응답 구조는 공식 API 문서를 참고해야 합니다.&lt;/p&gt;
&lt;h3 data-d-weight=&quot;semibold&quot; data-d-size=&quot;md&quot; data-d-component=&quot;title&quot; data-ke-size=&quot;size23&quot;&gt;STEP 4. 기존 서비스의 업무 처리 로직에 연결합니다.&lt;/h3&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;Jev가 반환한 결과를 실제 서비스에서 활용할 수 있도록 연결합니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 선택값이 delivery라면 배송 조회 시스템을 실행하고, billing이라면 결제 내역 조회 시스템을 실행하는 방식입니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;개념적으로는 다음과 같은 구조입니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-d-inline=&quot;&quot; data-d-default-strong=&quot;&quot; data-d-component=&quot;text&quot;&gt;고객 문의 &amp;rarr; Jev API 호출 &amp;rarr; 문의 유형 판단 &amp;rarr; 기존 프로그램 실행 &amp;rarr; 고객에게 결과 안내&lt;/span&gt;&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;여기서 중요한 것은 Jev가 반환한 결과만으로 모든 작업을 자동 실행하지 않는 것입니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;정보가 부족하거나 판단이 모호한 경우에는 고객에게 추가 정보를 요청하거나 담당자에게 전달하도록 설계해야 합니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;환불이나 결제처럼 금전적인 영향을 미치는 작업에는 별도의 권한 확인과 정책 검사를 적용해야 합니다.&lt;/p&gt;
&lt;h2 data-d-weight=&quot;semibold&quot; data-d-size=&quot;lg&quot; data-d-component=&quot;title&quot; data-ke-size=&quot;size26&quot;&gt;6. Jev를 도입할 때 고려해야 할 사항&lt;/h2&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;Jev는 다양한 업무에 활용할 수 있지만, 모든 문제를 해결하는 범용적인 AI 모델은 아닙니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;실제 서비스에 도입하기 전에는 몇 가지 사항을 고려해야 합니다.&lt;/p&gt;
&lt;h3 data-d-weight=&quot;semibold&quot; data-d-size=&quot;md&quot; data-d-component=&quot;title&quot; data-ke-size=&quot;size23&quot;&gt;첫째, 모든 작업에 Jev가 필요한 것은 아닙니다.&lt;/h3&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;단순한 조건문으로 처리할 수 있는 업무라면 굳이 AI 모델을 호출할 필요가 없습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 결제 금액이 10만 원 이상인지 확인하는 작업은 기존 프로그램의 조건문만으로 충분히 처리할 수 있습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;반면 사용자가 자유롭게 작성한 문장에서 결제 관련 문의인지 판단하는 작업은 자연어의 의미를 이해해야 하므로 Jev와 같은 모델을 검토할 수 있습니다.&lt;/p&gt;
&lt;h3 data-d-weight=&quot;semibold&quot; data-d-size=&quot;md&quot; data-d-component=&quot;title&quot; data-ke-size=&quot;size23&quot;&gt;둘째, 판단 결과의 확률이 높다고 항상 정확한 것은 아닙니다.&lt;/h3&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;Jev가 특정 선택지에 높은 확률을 부여하더라도 실제로 해당 판단이 맞는지는 별도로 검증해야 합니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;따라서 실제 서비스에 적용할 때는 충분한 테스트 데이터를 확보하고, 업무별 정확도와 오류 유형을 확인하는 과정이 필요합니다.&lt;/p&gt;
&lt;h3 data-d-weight=&quot;semibold&quot; data-d-size=&quot;md&quot; data-d-component=&quot;title&quot; data-ke-size=&quot;size23&quot;&gt;셋째, 선택지와 판단 기준을 명확하게 정의해야 합니다.&lt;/h3&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;Jev의 판단 결과는 개발자가 정의한 질문과 선택지에 영향을 받습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;선택지 간의 의미가 중복되거나 기준이 모호하면 원하는 결과를 얻기 어려울 수 있습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;따라서 실제 사용자의 다양한 표현과 예외 상황을 고려하여 판단 기준을 설계해야 합니다.&lt;/p&gt;
&lt;h3 data-d-weight=&quot;semibold&quot; data-d-size=&quot;md&quot; data-d-component=&quot;title&quot; data-ke-size=&quot;size23&quot;&gt;넷째, 기존 시스템의 검증 절차를 유지해야 합니다.&lt;/h3&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;Jev는 사용자의 의도를 판단하거나 적절한 처리 경로를 선택하는 데 활용할 수 있습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;하지만 결제, 환불, 개인정보 처리, 시스템 명령 실행 등 중요한 작업은 기존 시스템의 정책과 권한 검사를 거쳐야 합니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;AI의 판단 결과와 실제 업무 실행을 분리하는 것이 중요합니다.&lt;/p&gt;
&lt;h2 data-d-weight=&quot;semibold&quot; data-d-size=&quot;lg&quot; data-d-component=&quot;title&quot; data-ke-size=&quot;size26&quot;&gt;7. Jev를 활용한 AI 서비스의 구조&lt;/h2&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;Jev의 가장 흥미로운 부분은 기존 생성형 AI를 완전히 대체하는 것이 아니라, 서로 다른 역할을 나누어 활용할 수 있다는 점입니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 AI 기반 고객센터를 개발한다면 다음과 같은 구조를 생각해 볼 수 있습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-d-inline=&quot;&quot; data-d-default-strong=&quot;&quot; data-d-component=&quot;text&quot;&gt;① 사용자 요청&lt;/span&gt;&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;고객이 자연어로 문의 내용을 작성합니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;&amp;darr;&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-d-inline=&quot;&quot; data-d-default-strong=&quot;&quot; data-d-component=&quot;text&quot;&gt;② Jev: 요청의 의미를 이해하고 판단&lt;/span&gt;&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;문의 유형을 분류하고 적절한 업무 처리 경로를 선택합니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;&amp;darr;&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-d-inline=&quot;&quot; data-d-default-strong=&quot;&quot; data-d-component=&quot;text&quot;&gt;③ 기존 프로그램: 실제 업무 처리&lt;/span&gt;&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;데이터 조회, 권한 확인, 정책 검사 등의 작업을 수행합니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;&amp;darr;&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-d-inline=&quot;&quot; data-d-default-strong=&quot;&quot; data-d-component=&quot;text&quot;&gt;④ 생성형 AI: 최종 답변 생성&lt;/span&gt;&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;실제 업무 처리 결과를 바탕으로 고객이 이해하기 쉬운 자연어 답변을 작성합니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;이러한 구조에서는 각 구성 요소가 자신에게 적합한 역할을 담당합니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;Jev는 판단에 집중하고, 기존 프로그램은 정확한 데이터 처리와 실행을 담당하며, 생성형 AI는 사용자에게 제공할 최종 결과를 생성합니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;물론 모든 서비스에서 이러한 구조가 반드시 필요한 것은 아닙니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;업무의 복잡도와 사용량에 따라 기존 생성형 AI 하나로 처리하는 것이 더 간단할 수도 있습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;반면 대량의 요청을 반복적으로 분류하거나, AI 에이전트가 여러 도구 중 적절한 것을 선택해야 하는 환경에서는 판단 작업을 별도로 분리하는 방안을 검토할 수 있습니다.&lt;/p&gt;
&lt;h2 data-d-weight=&quot;semibold&quot; data-d-size=&quot;lg&quot; data-d-component=&quot;title&quot; data-ke-size=&quot;size26&quot;&gt;8. 마치며: AI가 모든 일을 직접 처리할 필요는 없다&lt;/h2&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;지금까지 생성형 AI를 활용하는 방식은 주로 사용자의 질문에 답변하거나 콘텐츠를 생성하는 데 집중되어 있었습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;하지만 실제 서비스를 개발하다 보면 긴 답변을 생성하는 것보다 사용자의 의도를 정확하게 파악하고, 적절한 업무 처리 경로를 결정하는 것이 더 중요한 경우도 많습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;Jev는 이러한 판단 작업에 초점을 맞춘 AI 모델입니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;고객 문의 분류, 문서 처리, AI 에이전트의 도구 선택, 교육 서비스의 상호작용 등 다양한 분야에서 활용을 검토할 수 있습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;개발자 입장에서 Jev를 도입한다면 처음부터 기존 AI 시스템 전체를 대체하려고 하기보다는, 현재 운영 중인 서비스에서 반복적으로 발생하는 판단 작업을 찾아 적용해 보는 것이 좋겠습니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;그리고 기존 생성형 AI나 일반적인 프로그램으로 처리했을 때와 비교하여 정확도, 응답 속도, 운영 비용을 검증하는 과정이 필요합니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-d-inline=&quot;&quot; data-d-default-strong=&quot;&quot; data-d-component=&quot;text&quot;&gt;결국 중요한 것은 모든 작업에 하나의 강력한 AI를 사용하는 것이 아니라, 각 작업에 적합한 기술을 선택하고 서로 유기적으로 연결하는 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;Jev는 이러한 관점에서 AI 기반 서비스의 설계 방식을 고민해 볼 수 있는 흥미로운 기술이라고 생각합니다.&lt;/p&gt;
&lt;h2 data-d-weight=&quot;semibold&quot; data-d-size=&quot;lg&quot; data-d-component=&quot;title&quot; data-ke-size=&quot;size26&quot;&gt;참고 자료&lt;/h2&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;Jev의 세부적인 기술 구조와 API 활용 방법을 확인하고 싶다면 다음 자료를 참고해 보시기 바랍니다.&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-d-inline=&quot;&quot; data-d-default-strong=&quot;&quot; data-d-component=&quot;text&quot;&gt;Jev 기술 분석 및 활용 가이드&lt;/span&gt;&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-d-text-decoration=&quot;underline-dotted&quot; data-d-inline=&quot;&quot; data-d-component=&quot;text&quot;&gt;&lt;/span&gt;&lt;a href=&quot;https://jev-guide-gamma.vercel.app/guide&quot;&gt;https://jev-guide-gamma.vercel.app/guide&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-d-inline=&quot;&quot; data-d-default-strong=&quot;&quot; data-d-component=&quot;text&quot;&gt;TypeSafe AI 공식 홈페이지&lt;/span&gt;&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-d-text-decoration=&quot;underline-dotted&quot; data-d-inline=&quot;&quot; data-d-component=&quot;text&quot;&gt;&lt;/span&gt;&lt;a href=&quot;https://typesafe.ai/&quot;&gt;https://typesafe.ai/&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-d-inline=&quot;&quot; data-d-default-strong=&quot;&quot; data-d-component=&quot;text&quot;&gt;TypeSafe AI 공식 개발 문서&lt;/span&gt;&lt;/p&gt;
&lt;p data-d-component=&quot;text&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-d-text-decoration=&quot;underline-dotted&quot; data-d-inline=&quot;&quot; data-d-component=&quot;text&quot;&gt;&lt;/span&gt;&lt;a href=&quot;https://docs.typesafe.ai/&quot;&gt;https://docs.typesafe.ai/&lt;/a&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programmer/AI</category>
      <category>AI개발</category>
      <category>AI서비스개발</category>
      <category>AI에이전트</category>
      <category>ai자동화</category>
      <category>Jev</category>
      <category>LLM</category>
      <category>TypeSafeAI</category>
      <category>생성형AI</category>
      <category>업무자동화</category>
      <category>인공지능</category>
      <author>MoreLean</author>
      <guid isPermaLink="true">https://judekim.tistory.com/186</guid>
      <comments>https://judekim.tistory.com/186#entry186comment</comments>
      <pubDate>Wed, 23 Sep 2026 15:10:38 +0900</pubDate>
    </item>
    <item>
      <title>AWS Aurora PostgreSQL 14 를 17.7 LTS 로 업그레이드 하기 #1</title>
      <link>https://judekim.tistory.com/185</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xaNTT/dJMcacEIkLT/CzVlP5SHO9e3s1JAhhO6i0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xaNTT/dJMcacEIkLT/CzVlP5SHO9e3s1JAhhO6i0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xaNTT/dJMcacEIkLT/CzVlP5SHO9e3s1JAhhO6i0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxaNTT%2FdJMcacEIkLT%2FCzVlP5SHO9e3s1JAhhO6i0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;1024&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS에서 &quot;Aurora PostgreSQL 14 표준 지원이 2027년 2월 28일에 끝난다&quot;는 안내를 받았습니다. 그 뒤로는 RDS Extended Support 요금이 붙고 올리지 않은 클러스터는 유지보수 창에서 AWS가 강제로 올립니다. 올려야 한다는 건 정해졌고 문제는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;어느 버전으로, 앱 코드를 얼마나 고치고, 데이터를 어떻게 옮기며, 서비스를 얼마나 세울 것인가&lt;/b&gt;였습니다.&lt;/p&gt;
&lt;p style=&quot;color: #2b3440; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 글은 그 판단 과정을 근거와 함께 정리한 1부입니다. 실제 업그레이드를 마친 뒤 실측 다운타임과 겪은 문제를 2부로 씁니다. 수치와 절차는 AWS 공식 문서와 우리 운영 DB에서 직접 확인한 것만 적었고, 회사 고유 정보는 일반화했습니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #e9f0ff; color: #000000; text-align: start;&quot;&gt;
&lt;div style=&quot;color: #1f3b64;&quot;&gt;  한 줄 요약&lt;/div&gt;
&lt;div style=&quot;color: #2b3440;&quot;&gt;&lt;b&gt;17.7 LTS&lt;/b&gt;로 14에서 바로 올린다 &amp;middot; 앱 코드 필수 변경 0건 &amp;middot; 데이터는 in-place pg_upgrade &amp;middot; 운영 전환은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Blue/Green&lt;/b&gt;으로 단절 두 번(각 1분 안팎) &amp;middot; 전환 전&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;행 수&amp;middot;해시 diff&lt;/b&gt;로 데이터 동일성을 직접 확인한다.&lt;/div&gt;
&lt;/div&gt;
&lt;h2 style=&quot;color: #1b2431; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;1. 어느 버전으로 올릴까: LTS를 고른 이유&lt;/h2&gt;
&lt;p style=&quot;color: #2b3440; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;후보는 15, 16, 17, 18이었습니다. 기준은 하나였습니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;다음 메이저 업그레이드까지 얼마나 오래 버티는가.&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Aurora는 특정 마이너 버전을 LTS(long-term support)로 지정해 표준 지원을 길게 주는데, LTS가 아닌 최신 마이너는 표준 지원이 1년 남짓이라 금방 또 올려야 합니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #2b3440;&quot;&gt;&lt;b&gt;후보&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;color: #2b3440;&quot;&gt;&lt;b&gt;Aurora 표준 지원 종료&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;color: #2b3440;&quot;&gt;&lt;b&gt;판단&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #2b3440;&quot;&gt;15.10 LTS&lt;/td&gt;
&lt;td style=&quot;color: #2b3440;&quot;&gt;커뮤니티 EOL 2027-11&lt;/td&gt;
&lt;td style=&quot;color: #2b3440;&quot;&gt;1년 뒤 또 메이저 업그레이드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f6f8fb; color: #2b3440;&quot;&gt;16.8 LTS&lt;/td&gt;
&lt;td style=&quot;background-color: #f6f8fb; color: #2b3440;&quot;&gt;커뮤니티 EOL 2028-11&lt;/td&gt;
&lt;td style=&quot;background-color: #f6f8fb; color: #2b3440;&quot;&gt;17보다 1년 손해&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #2b3440;&quot;&gt;&lt;b&gt;17.7 LTS&lt;/b&gt;&lt;span style=&quot;background-color: #e8f5ec; color: #2e7d4f;&quot;&gt;채택&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #2b3440;&quot;&gt;&lt;b&gt;2030-02-28&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;color: #2b3440;&quot;&gt;&lt;b&gt;채택&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f6f8fb; color: #2b3440;&quot;&gt;17.10 (최신 마이너)&lt;/td&gt;
&lt;td style=&quot;background-color: #f6f8fb; color: #2b3440;&quot;&gt;2027-12-31&lt;/td&gt;
&lt;td style=&quot;background-color: #f6f8fb; color: #2b3440;&quot;&gt;LTS가 아니라 1년 안에 마이너 업그레이드 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #2b3440;&quot;&gt;18.x&lt;/td&gt;
&lt;td style=&quot;color: #2b3440;&quot;&gt;2027-11~12&lt;/td&gt;
&lt;td style=&quot;color: #2b3440;&quot;&gt;LTS 미지정, 우리 드라이버 스택과 조합 사례 부족&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #2b3440; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;14에서 17로 바로 올릴 수 있습니다. Aurora는 두 단계 건너뛰는 메이저 업그레이드 경로를 제공하므로 15, 16을 거칠 이유가 없습니다. 콘솔의 &quot;수정 &amp;rarr; 엔진 버전&quot; 목록이나 아래 명령으로 자기 버전의 타깃 목록을 확인하면 됩니다.&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot; style=&quot;background-color: #0f172a; color: #e6edf7; text-align: start;&quot;&gt;&lt;code&gt;aws rds describe-db-engine-versions --engine aurora-postgresql --engine-version 14.20 \
  --query 'DBEngineVersions[0].ValidUpgradeTarget[?IsMajorVersionUpgrade].EngineVersion'&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;color: #1b2431; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;2. 앱 코드는 얼마나 바뀌나: 점검 방법&lt;/h2&gt;
&lt;p style=&quot;color: #2b3440; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;결론부터 쓰면 필수 변경은 0건이었습니다. 하지만 &quot;아마 괜찮을 것&quot;이 아니라 아래 네 가지를 확인한 결과입니다. 같은 순서로 보면 어느 스택이든 반나절이면 끝납니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #2b3440; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;드라이버.&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;JDBC, R2DBC, psycopg, node-postgres는 모두 PostgreSQL wire protocol v3를 쓰고, 이 프로토콜은 메이저 버전이 올라가도 바뀌지 않습니다. 인증 방식만 확인합니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;password_encryption이 이미&lt;span&gt;&amp;nbsp;&lt;/span&gt;scram-sha-256이면 손댈 것이 없습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;마이그레이션 도구.&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Flyway나 Liquibase는 자기가 아는 것보다 높은 DB 버전을 만나면 어떻게 하는지 봐야 합니다. Flyway 8.x는 &quot;newer than this version of Flyway and support has not been tested&quot; 경고만 남기고 정상 동작합니다. 라이브러리 jar 안의 문자열로 확인했습니다. 실패가 아니라 경고입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PG 전용 SQL 기능.&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;코드베이스에서 jsonb, ON CONFLICT, RETURNING, LATERAL,&lt;span&gt;&amp;nbsp;&lt;/span&gt;::&lt;span&gt;&amp;nbsp;&lt;/span&gt;캐스트, interval, pg_trgm 같은 기능을 grep으로 세어 목록을 만들고 각각이 15&amp;middot;16&amp;middot;17 릴리즈 노트의 &quot;Migration to Version N&quot; 절에 걸리는지 대조합니다. 우리가 쓰는 기능은 전부 변경이 없었습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비호환 목록 대조.&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;실제로 걸릴 뻔한 항목은 셋이었습니다. 15의 public 스키마 CREATE 권한 제거는&lt;span&gt;&amp;nbsp;&lt;/span&gt;새로 만드는 DB에만 적용되고 업그레이드는 기존 권한을 유지합니다. 16의 plpgsql 바운드 커서 이름 규칙 변경은 우리 함수가 커서를 안 써서 무관했습니다. 17의 old_snapshot&amp;middot;adminpack 확장 제거는 둘 다 미사용이었습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #2b3440; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;필수는 아니지만 권장한 것이 둘 있습니다. 테스트에서 쓰는 Testcontainers의 PostgreSQL 이미지 태그를 올릴 버전으로 고정해서 전체 테스트를 한 번 돌리는 것, 그리고 테라폼의 엔진 버전과 파라미터 그룹 family를 실제와 맞추는 것입니다. 테라폼이 운영과 어긋나 있으면 업그레이드 뒤 apply가 엉뚱한 변경을 만듭니다.&lt;/p&gt;
&lt;h2 style=&quot;color: #1b2431; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;3. 데이터는 어떻게 넘어가나&lt;/h2&gt;
&lt;p style=&quot;color: #2b3440; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Aurora 메이저 업그레이드는 스토리지를 그대로 두고 카탈로그만 변환하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;pg_upgrade&lt;span&gt;&amp;nbsp;&lt;/span&gt;방식입니다. 데이터를 복사하거나 덤프&amp;middot;복원하지 않습니다. 대신 pg_upgrade가 거부하는 조건이 있어서 미리 점검합니다. 전부 읽기 전용 쿼리입니다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #0f172a; color: #e6edf7; text-align: start;&quot;&gt;&lt;code&gt;-- reg* 타입 컬럼 (regtype&amp;middot;regclass 제외) &amp;mdash; 있으면 업그레이드 불가
SELECT n.nspname, c.relname, a.attname
FROM pg_attribute a
JOIN pg_class c ON c.oid = a.attrelid
JOIN pg_namespace n ON n.oid = c.relnamespace
JOIN pg_type t ON t.oid = a.atttypid
WHERE t.typname IN ('regproc','regprocedure','regoper','regoperator','regconfig','regdictionary')
  AND c.relkind IN ('r','m') AND a.attnum &amp;gt; 0 AND NOT a.attisdropped
  AND n.nspname NOT IN ('pg_catalog','information_schema');

SELECT count(*) FROM pg_prepared_xacts;                     -- prepared transaction
SELECT datname FROM pg_database WHERE datconnlimit = -2;   -- 삭제 중 끊긴 DB
SELECT count(*) FROM pg_replication_slots;                  -- 논리 복제 슬롯
SELECT extname, extversion FROM pg_extension ORDER BY 1;    -- 확장 &amp;rarr; 대상 버전 지원표와 대조&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #2b3440; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;우리는 전부 0건이었고 확장 6개도 모두 17에서 지원됐습니다. 그런데 차단 조건이 없다고 끝이 아닙니다. 업그레이드 뒤에 손봐야 하는 것이 셋 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #2b3440; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;옵티마이저 통계 소실.&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;pg_upgrade는&lt;span&gt;&amp;nbsp;&lt;/span&gt;pg_statistic을 옮기지 않습니다. 업그레이드 직후 모든 테이블이 통계 없는 상태라 큰 테이블의 실행 계획이 무너질 수 있습니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;vacuumdb --analyze-in-stages를 바로 돌려야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;콜레이션 인덱스.&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;glibc 기반 콜레이션은 OS 라이브러리 버전이 바뀌면 정렬 규칙이 바뀔 수 있고, 그러면 텍스트 컬럼 btree 인덱스가 어긋납니다. 15 이상은 이때 &quot;collation version mismatch&quot; 경고를 냅니다. 텍스트 인덱스 크기를 미리 재 두고(우리는 수 GB) 경고가 나면 REINDEX 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;확장 버전.&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;엔진이 올라가도 확장은 자동으로 올라가지 않습니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;ALTER EXTENSION ... UPDATE를 돌립니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #1b2431; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;4. 왜 &quot;reader만 먼저&quot; 올릴 수 없나&lt;/h2&gt;
&lt;p style=&quot;color: #2b3440; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여기서 처음 막혔습니다. 운영은 writer 하나에 reader 하나인 흔한 구조였고, 자연스럽게 &quot;reader를 17로 만들어 승격하면 되지 않나&quot;라고 생각했습니다. 안 됩니다. Aurora의 writer와 reader는 하나의 공유 스토리지를 같이 쓰는&lt;span&gt;&amp;nbsp;&lt;/span&gt;한 클러스터라서 엔진 버전이 클러스터 단위로만 바뀝니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;520&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btWSe9/dJMcafnRvZF/WJIhtOie3ZDhnzGDsUJQW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btWSe9/dJMcafnRvZF/WJIhtOie3ZDhnzGDsUJQW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btWSe9/dJMcafnRvZF/WJIhtOie3ZDhnzGDsUJQW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtWSe9%2FdJMcafnRvZF%2FWJIhtOie3ZDhnzGDsUJQW1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1440&quot; height=&quot;520&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;520&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div style=&quot;background-color: #fff4e5; color: #000000; text-align: start;&quot;&gt;
&lt;div style=&quot;color: #b35c00;&quot;&gt;⚠️ 왜 in-place가 아닌가&lt;/div&gt;
&lt;div style=&quot;color: #2b3440;&quot;&gt;클러스터를 통째로 in-place 업그레이드하면 writer와 reader가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;동시에&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;멈추고 10~30분 뒤에 함께 올라옵니다. 그 뒤엔 통계가 없는 상태로 서비스가 열립니다.&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #2b3440; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 선택지는 둘입니다. 클러스터를 통째로 in-place 업그레이드하면 writer와 reader가 동시에 멈추고 10~30분 뒤에 함께 올라옵니다. 이걸 피하는 관리형 방법이 Blue/Green 배포입니다.&lt;/p&gt;
&lt;h2 style=&quot;color: #1b2431; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;5. Blue/Green: 버전이 달라도 데이터가 따라가는 원리&lt;/h2&gt;
&lt;p style=&quot;color: #2b3440; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Blue/Green은 AWS 콘솔의 클러스터 &quot;작업 &amp;rarr; Blue/Green 배포 생성&quot;으로 만드는 정식 기능입니다. 현재 클러스터(Blue)의 토폴로지 전체를 복사해 새 버전의 쌍둥이 클러스터(Green)를 만들고 준비가 끝나면 엔드포인트 이름만 바꿔 끼웁니다. 우리 버전(14.20)이 지원 범위(14.9 이상)에 들어가는지는 AWS의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Concepts.Aurora_Fea_Regions_DB-eng.Feature.BlueGreenDeployments.html&quot;&gt;지원 버전 표&lt;/a&gt;에서 확인했습니다.&lt;/p&gt;
&lt;p style=&quot;color: #2b3440; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;핵심은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;논리 복제&lt;/b&gt;입니다. writer와 reader의 물리 복제는 같은 버전끼리만 되지만, 논리 복제는 WAL을 &quot;어느 테이블에 어떤 행이 INSERT/UPDATE/DELETE 됐다&quot;라는 행 단위 변경으로 풀어서 보내고 받는 쪽이 자기 버전의 SQL로 다시 실행합니다. 그래서 14와 17 사이에서 동작합니다. PostgreSQL 커뮤니티가 &quot;무중단에 가까운 메이저 업그레이드&quot; 방법으로 안내하는 것도 이 논리 복제이고, Blue/Green은 그 절차를 AWS가 자동화한 것입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCPN45/dJMcadQV0iN/wIZjqmK9MxJkCgKGbcpEY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCPN45/dJMcadQV0iN/wIZjqmK9MxJkCgKGbcpEY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCPN45/dJMcadQV0iN/wIZjqmK9MxJkCgKGbcpEY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCPN45%2FdJMcadQV0iN%2FwIZjqmK9MxJkCgKGbcpEY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1440&quot; height=&quot;660&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;660&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Blue (운영, 엔진 14) writerreader스토리지 Green (검증용, 엔진 17) writerreader스토리지 (복제본) 논리 복제서비스 트래픽은 전환 전까지 Blue로만 간다. Green에서는 ANALYZE&amp;middot;REINDEX&amp;middot;확장 갱신&amp;middot;스모크 테스트를 미리 끝낸다. 전환 시 클러스터&amp;middot;reader 엔드포인트 이름을 Green이 이어받는다. 앱 설정 변경 없음. Blue는 이름 뒤에 -old1이 붙어 남는다 (되돌리기용).&lt;/p&gt;
&lt;p style=&quot;color: #2b3440; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;전환(switchover)은 AWS 문서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/blue-green-deployments-switching.html&quot;&gt;Switching a blue/green deployment&lt;/a&gt;의 &quot;Switchover actions&quot; 절 그대로 다섯 단계입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DrBNE/dJMcadXO4Q4/0FWYpjoFNGveTJdhmqwMX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DrBNE/dJMcadXO4Q4/0FWYpjoFNGveTJdhmqwMX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DrBNE/dJMcadXO4Q4/0FWYpjoFNGveTJdhmqwMX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDrBNE%2FdJMcadXO4Q4%2F0FWYpjoFNGveTJdhmqwMX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1440&quot; height=&quot;300&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div style=&quot;background-color: #e8f5ec; color: #000000; text-align: start;&quot;&gt;
&lt;div style=&quot;color: #2e7d4f;&quot;&gt;  데이터 무손실을 지키는 장치 = 가드레일&lt;/div&gt;
&lt;div style=&quot;color: #2b3440;&quot;&gt;전환 시작 전에 AWS가 Green의 복제 상태&amp;middot;복제 지연&amp;middot;활성 쓰기&amp;middot;외부 복제 여부를 검사하고, 하나라도 걸리면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;전환을 시작하지 않습니다&lt;/b&gt;. 문서는 이 검사의 목적을 &quot;예상보다 긴 다운타임과 데이터 손실 방지&quot;라고 적습니다.&lt;/div&gt;
&lt;/div&gt;
&lt;h3 style=&quot;color: #2b3440; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;논리 복제라서 생기는 제한&lt;/h3&gt;
&lt;p style=&quot;color: #2b3440; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 부분이 실제 운영 규칙이 됩니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/blue-green-deployments-considerations.html&quot;&gt;Limitations and considerations&lt;/a&gt;에서 그대로 가져왔습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #2b3440; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;DDL은 복제되지 않습니다.&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Blue에서 CREATE TABLE 같은 스키마 변경이 감지되면 Green이 &quot;Replication degraded&quot; 상태가 되고 배포를 지우고 다시 만들어야 합니다. Green을 만든 뒤 전환까지는 마이그레이션이 포함된 배포를 멈춥니다.&lt;/li&gt;
&lt;li&gt;GRANT/REVOKE도 복제되지 않습니다(경고만).&lt;/li&gt;
&lt;li&gt;시퀀스의 NEXTVAL은 실시간으로 안 맞고, 전환 시 AWS가 Green 시퀀스를 앞으로 맞춥니다.&lt;/li&gt;
&lt;li&gt;PK(또는 replica identity)가 없는 테이블은 UPDATE/DELETE를 옮기지 못합니다. 아래 쿼리로 미리 찾아 PK를 붙이거나&lt;span&gt;&amp;nbsp;&lt;/span&gt;REPLICA IDENTITY FULL로 바꿉니다. 우리는 6개가 나왔고 4개는 백업 테이블이라 지웠습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #0f172a; color: #e6edf7; text-align: start;&quot;&gt;&lt;code&gt;SELECT n.nspname||'.'||c.relname, c.relreplident, pg_size_pretty(pg_total_relation_size(c.oid))
FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind = 'r' AND n.nspname NOT LIKE 'pg_%' AND n.nspname &amp;lt;&amp;gt; 'information_schema'
  AND NOT EXISTS (SELECT 1 FROM pg_index i WHERE i.indrelid = c.oid AND i.indisprimary)
ORDER BY pg_total_relation_size(c.oid) DESC;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #2b3440; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;사전 조건과 &quot;단절 두 번&quot;&lt;/h3&gt;
&lt;p style=&quot;color: #2b3440; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/blue-green-deployments-creating.html&quot;&gt;Creating a blue/green deployment&lt;/a&gt;의 PostgreSQL 준비 절에 따르면 커스텀 클러스터 파라미터 그룹에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;rds.logical_replication = 1,&lt;span&gt;&amp;nbsp;&lt;/span&gt;synchronous_commit = on이어야 하고 파라미터가 writer에 반영돼 있지 않으면 생성이 실패합니다. 이 파라미터는 static이라&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;writer 재기동&lt;/b&gt;이 필요합니다. 그래서 단절은 두 번입니다. 파라미터 반영을 위한 재기동 한 번(미리, 한가한 시간에), 전환 한 번(검증이 끝난 뒤). 각각 1분 안팎입니다. 우리는 전환을 새벽에 하기로 했고 그 1분 사이의 쓰기 요청은 앱 재시도 없이 실패를 감수하기로 했습니다. 새벽 쓰기는 거의 없기 때문입니다.&lt;/p&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;color: #4a5563;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1562&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5A4DF/dJMcaix6Pt8/gDC2SRe2HgggGMKvlNUibk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5A4DF/dJMcaix6Pt8/gDC2SRe2HgggGMKvlNUibk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5A4DF/dJMcaix6Pt8/gDC2SRe2HgggGMKvlNUibk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5A4DF%2FdJMcaix6Pt8%2FgDC2SRe2HgggGMKvlNUibk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1562&quot; height=&quot;300&quot; data-origin-width=&quot;1562&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 style=&quot;color: #1b2431; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;6. 데이터가 깨지지 않았는지 직접 확인하기&lt;/h2&gt;
&lt;p style=&quot;color: #2b3440; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;가드레일은 &quot;복제가 따라잡았는가&quot;를 보장하지만 &quot;따라잡은 내용이 같은가&quot;까지 보여주지는 않습니다. 그래서 전환 전에 Blue와 Green에서 같은 시각에 아래를 돌려 diff 합니다. 틀리면 안 되는 테이블(결제&amp;middot;정산 같은 것)은 행 수와 함께 내용 해시를 비교합니다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #0f172a; color: #e6edf7; text-align: start;&quot;&gt;&lt;code&gt;-- 1) 테이블별 행 수
SELECT n.nspname||'.'||c.relname AS tbl,
       (xpath('/row/c/text()', query_to_xml(format('SELECT count(*) AS c FROM %I.%I', n.nspname, c.relname), false, true, '')))[1]::text::bigint AS rows
FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind = 'r' AND n.nspname NOT LIKE 'pg_%' AND n.nspname &amp;lt;&amp;gt; 'information_schema'
ORDER BY 1;

-- 2) 핵심 테이블 내용 해시 (예시)
SELECT md5(string_agg(t::text, '|' ORDER BY id)) FROM payments t;

-- 3) 시퀀스 현재값 (전환 후 Green이 Blue 이상이어야 함)
SELECT schemaname||'.'||sequencename, last_value FROM pg_sequences ORDER BY 1;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #2b3440; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;전환 후에는 시퀀스 값이 Blue의 마지막 값 이상인지, 복제 슬롯&amp;middot;subscription 잔여물이 없는지, 그리고 앱에서 로그인&amp;middot;읽기&amp;middot;쓰기 1건씩의 실사용을 확인합니다.&lt;/p&gt;
&lt;h2 style=&quot;color: #1b2431; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;7. 되돌리기&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 114px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;color: #2b3440; height: 19px;&quot;&gt;&lt;b&gt;시점&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;color: #2b3440; height: 19px;&quot;&gt;&lt;b&gt;되돌리기&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;color: #2b3440; height: 19px;&quot;&gt;전환 전&lt;/td&gt;
&lt;td style=&quot;color: #2b3440; height: 19px;&quot;&gt;Green을 지우면 끝. Blue는 아무 영향 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 38px;&quot;&gt;
&lt;td style=&quot;background-color: #f6f8fb; color: #2b3440; height: 38px;&quot;&gt;전환 후&lt;/td&gt;
&lt;td style=&quot;background-color: #f6f8fb; color: #2b3440; height: 38px;&quot;&gt;Blue가&lt;span&gt;&amp;nbsp;&lt;/span&gt;-old1로 남아 있으므로 앱 엔드포인트를 Blue로 돌리거나 Blue를 재승격. 단, 전환 뒤 Green에 쓰인 데이터는 Blue에 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 38px;&quot;&gt;
&lt;td style=&quot;color: #2b3440; height: 38px;&quot;&gt;in-place를 택했을 때&lt;/td&gt;
&lt;td style=&quot;color: #2b3440; height: 38px;&quot;&gt;업그레이드 직전 자동 스냅샷에서 복원. 표준 지원 종료 뒤 14 스냅샷을 복원하면 Extended Support 버전으로 변환되고 과금됨&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 style=&quot;color: #1b2431; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;8. 체크리스트&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #2b3440;&quot;&gt;&lt;b&gt;단계&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;color: #2b3440;&quot;&gt;&lt;b&gt;할 일&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;color: #2b3440;&quot;&gt;&lt;b&gt;근거&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #2b3440;&quot;&gt;버전&lt;/td&gt;
&lt;td style=&quot;color: #2b3440;&quot;&gt;LTS 마이너 선택, 직접 업그레이드 경로 확인&lt;/td&gt;
&lt;td style=&quot;color: #2b3440;&quot;&gt;Aurora 릴리즈 캘린더&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f6f8fb; color: #2b3440;&quot;&gt;코드&lt;/td&gt;
&lt;td style=&quot;background-color: #f6f8fb; color: #2b3440;&quot;&gt;드라이버&amp;middot;마이그레이션 도구 동작 확인, SQL 기능 목록 &amp;harr; 릴리즈 노트 대조, 테스트 이미지 버전 고정&lt;/td&gt;
&lt;td style=&quot;background-color: #f6f8fb; color: #2b3440;&quot;&gt;PostgreSQL 15/16/17 릴리즈 노트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #2b3440;&quot;&gt;데이터&lt;/td&gt;
&lt;td style=&quot;color: #2b3440;&quot;&gt;pg_upgrade 차단 조건 0건 확인, 확장 지원표 대조&lt;/td&gt;
&lt;td style=&quot;color: #2b3440;&quot;&gt;Aurora 메이저 업그레이드 문서&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f6f8fb; color: #2b3440;&quot;&gt;Blue/Green 준비&lt;/td&gt;
&lt;td style=&quot;background-color: #f6f8fb; color: #2b3440;&quot;&gt;logical_replication 켜고 writer 재기동, PK 없는 테이블 정리, 기존 복제 슬롯 없음 확인&lt;/td&gt;
&lt;td style=&quot;background-color: #f6f8fb; color: #2b3440;&quot;&gt;Blue/Green 생성&amp;middot;제한 문서&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #2b3440;&quot;&gt;Green 검증&lt;/td&gt;
&lt;td style=&quot;color: #2b3440;&quot;&gt;확장 UPDATE, ANALYZE, 콜레이션 확인&amp;middot;REINDEX, 행 수&amp;middot;해시 diff&lt;/td&gt;
&lt;td style=&quot;color: #2b3440;&quot;&gt;본문 3&amp;middot;6절&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f6f8fb; color: #2b3440;&quot;&gt;전환&lt;/td&gt;
&lt;td style=&quot;background-color: #f6f8fb; color: #2b3440;&quot;&gt;DDL 배포 동결 유지, 저트래픽 시간, 가드레일 통과 확인&lt;/td&gt;
&lt;td style=&quot;background-color: #f6f8fb; color: #2b3440;&quot;&gt;Blue/Green 전환 문서&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #2b3440;&quot;&gt;사후&lt;/td&gt;
&lt;td style=&quot;color: #2b3440;&quot;&gt;시퀀스&amp;middot;잔여물&amp;middot;실사용 확인, Blue 보관 후 삭제&lt;/td&gt;
&lt;td style=&quot;color: #2b3440;&quot;&gt;본문 6&amp;middot;7절&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 style=&quot;color: #1b2431; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;마치며&lt;/h2&gt;
&lt;p style=&quot;color: #2b3440; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&quot;버전이 다른데 데이터가 실시간으로 같이 유지된다&quot;는 말이 처음엔 믿기지 않았습니다. 논리 복제가 행 단위 변경을 보내는 것이라는 점, 그리고 전환 직전에 AWS가 복제 상태를 검사해 실패하면 아예 시작하지 않는다는 점을 문서에서 확인하고 나서야 납득이 됐습니다. 2부에서는 실제 전환의 실측 단절 시간과, 계획과 달랐던 것들을 씁니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #f6f8fb; color: #4a5563; text-align: start;&quot;&gt;&lt;b&gt;참고 문서&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonRDS/latest/AuroraPostgreSQLReleaseNotes/aurorapostgresql-release-calendar.html&quot;&gt;Aurora PostgreSQL 릴리즈 캘린더&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;middot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_UpgradeDBInstance.PostgreSQL.MajorVersion.html&quot;&gt;메이저 버전 업그레이드&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;middot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/blue-green-deployments-overview.html&quot;&gt;Blue/Green 배포 개요&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;middot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.postgresql.org/docs/17/release-17.html&quot;&gt;PostgreSQL 17 릴리즈 노트&lt;/a&gt;&lt;/div&gt;</description>
      <category>Programmer/PostgreSQL</category>
      <category>Aurora PostgreSQL</category>
      <category>aws rds</category>
      <category>Blue/Green 배포</category>
      <category>pg_upgrade</category>
      <category>PostgreSQL 17</category>
      <category>PostgreSQL 업그레이드</category>
      <category>RDS Extended Support</category>
      <category>논리 복제</category>
      <category>메이저 버전 업그레이드</category>
      <category>무중단 배포</category>
      <author>MoreLean</author>
      <guid isPermaLink="true">https://judekim.tistory.com/185</guid>
      <comments>https://judekim.tistory.com/185#entry185comment</comments>
      <pubDate>Sun, 13 Sep 2026 21:30:50 +0900</pubDate>
    </item>
    <item>
      <title>스마트폰이 당신의 뇌를 망가뜨리고 있다</title>
      <link>https://judekim.tistory.com/184</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYtxND/dJMcaaSScRX/Kv8CvHUMOFpKefFPevnlKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYtxND/dJMcaaSScRX/Kv8CvHUMOFpKefFPevnlKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYtxND/dJMcaaSScRX/Kv8CvHUMOFpKefFPevnlKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYtxND%2FdJMcaaSScRX%2FKv8CvHUMOFpKefFPevnlKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1448&quot; height=&quot;1086&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한국인 성인의 연간 독서량은 2005년 평균 11.9권에서 2023년 4.5권으로 급감했습니다. 18년 만에 절반 이하로 줄어든 것입니다. 같은 기간 스마트폰 보급률은 0%에서 95%로 치솟았습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것은 단순한 우연의 일치가 아닙니다. 문화체육관광부의 국민독서실태조사에 따르면, 성인의 독서를 방해하는 가장 큰 원인 1위가 바로 &quot;스마트폰&amp;middot;인터넷&amp;middot;게임&quot;입니다. 사람들은 책을 읽고 싶은 마음이 없어서가 아니라, 손에서 스마트폰을 놓지 못하기 때문에 책을 읽지 못하는 것입니다. 스마트폰은 단순히 독서 시간을 빼앗는 것을 넘어, 뇌 자체를 '긴 글을 읽기 어려운 상태'로 바꾸어가고 있습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;1402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btFUbM/dJMcaciM6Si/DdXL850qiZ7SGHRWNlkTx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btFUbM/dJMcaciM6Si/DdXL850qiZ7SGHRWNlkTx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btFUbM/dJMcaciM6Si/DdXL850qiZ7SGHRWNlkTx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtFUbM%2FdJMcaciM6Si%2FDdXL850qiZ7SGHRWNlkTx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1122&quot; height=&quot;1402&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;1402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유튜브 쇼츠&amp;middot;릴스&amp;middot;틱톡은 평균 15~30초마다 새 영상으로 전환됩니다. 이 과정에서 뇌는 매번 소량의 도파민을 분비합니다. 도파민은 쾌감 그 자체가 아니라, '다음 보상을 기대하게 만드는' 신경전달물질입니다. 즉, 우리가 끊임없이 스크롤을 내리는 이유는 지금 영상이 재미있어서가 아니라, &lt;b&gt;다음 영상이 더 재미있을 것 같다는 기대감&lt;/b&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;1122&quot; data-origin-height=&quot;1402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/by8GYU/dJMcacpCvOY/P7KXz6LaIiPkMbVWMRkRO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/by8GYU/dJMcacpCvOY/P7KXz6LaIiPkMbVWMRkRO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/by8GYU/dJMcacpCvOY/P7KXz6LaIiPkMbVWMRkRO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fby8GYU%2FdJMcacpCvOY%2FP7KXz6LaIiPkMbVWMRkRO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1122&quot; height=&quot;1402&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;1402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서울성모병원 정신의학과 연구에 따르면, 스마트폰 과사용군은 전전두피질의 활성도가 눈에 띄게 낮았습니다. 전전두피질은 집중력&amp;middot;판단력&amp;middot;감정조절&amp;middot;충동 억제를 담당하는 뇌의 '이성적 사령부'입니다. 이 부위의 기능이 약해지면 충동적인 결정을 더 자주 하게 되고, 감정 기복이 심해지며, 한 가지 일에 집중하는 것이 어려워집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 성장기 아동&amp;middot;청소년에게 이 문제는 훨씬 심각합니다. 전두엽은 만 25세 전후까지 발달이 완성되는 뇌의 마지막 완성 부위입니다. 이 시기에 스마트폰을 과도하게 사용하면, 전두엽이 발달할 기회 자체를 잃게 됩니다. 이미지&amp;middot;영상 정보는 주로 후두엽(시각피질)에서 빠르게 자동 처리되기 때문에, 전두엽이 개입해 '생각하고 판단할' 기회가 줄어드는 것입니다. 책 읽기나 글쓰기는 전두엽을 집중적으로 활성화하는 대표적인 훈련입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z9ypI/dJMcafzSyiK/P4i1b1f12GhhU3FUdfOKm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z9ypI/dJMcafzSyiK/P4i1b1f12GhhU3FUdfOKm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z9ypI/dJMcafzSyiK/P4i1b1f12GhhU3FUdfOKm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ9ypI%2FdJMcafzSyiK%2FP4i1b1f12GhhU3FUdfOKm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1448&quot; height=&quot;1086&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1086&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이크로소프트 연구팀이 캐나다 성인 2,000명을 대상으로 조사한 결과, 2000년대 초반 평균 12초였던 인간의 집중 지속 시간이 2015년 기준 8.25초로 줄었습니다. 금붕어(9초)보다 짧아진 수치입니다. 스마트폰이 본격적으로 보급된 시기와 정확히 겹칩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 심각한 것은 '주의 분산'의 누적 효과입니다. 스마트폰 알림은 하루 평균 96회 울립니다. 알림 하나를 확인한 뒤 원래 하던 작업으로 완전히 집중력을 회복하는 데 평균 23분이 걸린다는 연구 결과(캘리포니아 대학교 어바인 캠퍼스, Gloria Mark 교수)도 있습니다. 하루 96번 알림을 받는다는 것은, 이론적으로 우리가 한 번도 제대로 집중하지 못한 채 하루를 보내고 있다는 뜻입니다. 만성적인 집중력 저하는 업무 생산성뿐 아니라 학습 능력과 창의성에도 직접적인 영향을 미칩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;1402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KUztU/dJMb99M8TUN/R5cXpU6za4J482GMSiaU90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KUztU/dJMb99M8TUN/R5cXpU6za4J482GMSiaU90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KUztU/dJMb99M8TUN/R5cXpU6za4J482GMSiaU90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKUztU%2FdJMb99M8TUN%2FR5cXpU6za4J482GMSiaU90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1122&quot; height=&quot;1402&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;1402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디지털 치매란 디지털 기기에 기억&amp;middot;계산&amp;middot;길 찾기 등 인지 기능을 위탁함으로써 발생하는 뇌 기능 저하 상태를 말합니다. (국립국어원 공식 등재 용어)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가까운 가족의 전화번호를 외우고 있는 사람이 몇 명이나 될까요? 네비게이션 없이 자주 가던 길을 찾을 수 있나요? 간단한 암산이 불편해 계산기에 먼저 손이 가지는 않나요? 이 모두가 디지털 치매의 초기 신호입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뇌는 '쓰지 않으면 쇠퇴(Use it or lose it)'하는 원리로 작동합니다. 기억력뿐 아니라 계산력&amp;middot;공간 인지력&amp;middot;언어 구사력&amp;middot;문제 해결력까지 광범위하게 영향을 받습니다. 단기적으로는 건망증 수준이지만, 장기화되면 실제 알츠하이머 치매의 발병 위험이 높아진다는 연구 결과들이 나오고 있습니다. 뇌를 편하게 해주는 것이 뇌를 위하는 일이 아닙니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;1402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HKhOb/dJMcafmlS4P/blMyb06hU5Dv9Y9u1NainK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HKhOb/dJMcafmlS4P/blMyb06hU5Dv9Y9u1NainK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HKhOb/dJMcafmlS4P/blMyb06hU5Dv9Y9u1NainK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHKhOb%2FdJMcafmlS4P%2FblMyb06hU5Dv9Y9u1NainK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1122&quot; height=&quot;1402&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;1402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;희망적인 사실이 있습니다. 뇌는 나이에 관계없이 변화할 수 있습니다. 이것이 신경가소성(Neuroplasticity)입니다. 나쁜 방향으로 바뀐 뇌는, 올바른 자극을 주면 다시 좋은 방향으로 바뀔 수 있습니다. 중요한 것은 꾸준함입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금 당장 시작할 수 있는 4가지 실천법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① &lt;b&gt;하루 30분 종이책 읽기&lt;/b&gt; &amp;mdash; 스마트폰을 다른 방에 두고 시작하세요. 처음엔 5분도 힘들 수 있습니다. 그것이 정상입니다. 이미 뇌가 바뀌어 있다는 증거입니다. 매일 조금씩 늘려가세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;② &lt;b&gt;알림 차단 시간 설정 (최소 2시간/일)&lt;/b&gt; &amp;mdash; SNS&amp;middot;메신저 알림을 모두 끄고 '방해 금지 모드'를 활용하세요. 알림이 없으면 뇌는 자연스럽게 한 가지에 집중하는 상태로 돌아갑니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;③ &lt;b&gt;스마트폰 없이 산책 10분&lt;/b&gt; &amp;mdash; 길을 걸으면서 풍경을 보고, 냄새를 맡고, 소리를 듣는 것만으로도 뇌의 기본 상태(Default Mode Network)가 활성화되어 창의력과 기억력이 회복됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;④ &lt;b&gt;자기 전 30분은 폰 대신 종이 일기&lt;/b&gt; &amp;mdash; 잠들기 전 스마트폰 블루라이트는 수면 호르몬 멜라토닌을 억제합니다. 하루를 손으로 기록하는 행위는 언어 구사력과 기억 정착을 동시에 훈련합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;완벽할 필요 없습니다. 하루 한 가지, 오늘부터 시작하는 작은 변화가 전두엽을 되살립니다.&lt;/p&gt;</description>
      <category>잡다구리</category>
      <category>뇌과학</category>
      <category>도파민</category>
      <category>독서</category>
      <category>디지털치매</category>
      <category>숏폼중독</category>
      <category>스마트폰</category>
      <category>스마트폰부작용</category>
      <category>스마트폰중독</category>
      <category>신경가소성</category>
      <category>집중력</category>
      <author>MoreLean</author>
      <guid isPermaLink="true">https://judekim.tistory.com/184</guid>
      <comments>https://judekim.tistory.com/184#entry184comment</comments>
      <pubDate>Sat, 16 May 2026 21:32:52 +0900</pubDate>
    </item>
    <item>
      <title>왜 페르소나는 단순한 '말투' 이상의 기술인가?</title>
      <link>https://judekim.tistory.com/183</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot;&gt;ADK(Agent Development Kit)에 대해서 보다가 알게된 것을 정리해봤습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot;&gt;ADK 에서 알아보다가 표준화된 공통 규격의 인터페이스로 어댑팅하는 구조라는 것을 알게 되었고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot;&gt;그 구조에서 페르소나가 있다는 것을 알게 되었습니다. &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;대부분의 최신 LLM은 대화 기록을 보낼 때 다음과 같은 공통 구조를 사용합니다.&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;System:&lt;/b&gt; AI의 역할 설정 (너는 전문가야)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;User:&lt;/b&gt; 사용자의 질문&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,2,0&quot;&gt;Assistant:&lt;/b&gt; AI의 답변&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,3,0&quot;&gt;Tool/Function:&lt;/b&gt; 도구 실행 결과&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 물어봤습니다.&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #1f1f1f; text-align: start;&quot;&gt;기본적으로 LLM은 페르소나를 주입하는구나.. 이렇게 해야 하는 특별한 이유가 있나? 주입하지 않은 상태에서 하는 것과 어떤 차이가 있어?&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;맞습니다. LLM에게 &lt;b&gt;페르소나(Persona)&lt;/b&gt;를 주입하는 것은 단순히 &quot;재미&quot;를 위한 것이 아니라, 모델의 &lt;b data-index-in-node=&quot;64&quot; data-path-to-node=&quot;0&quot;&gt;출력 품질과 일관성을 높이기 위한 공학적인 장치&lt;/b&gt;에 가깝습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;페르소나를 주입했을 때와 주입하지 않았을 때(기본 상태)의 차이를 핵심적인 이유와 함께 정리해 드릴게요.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;2&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;1. 확률의 범위를 좁히기 (Constraint)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;LLM은 다음에 올 가장 확률 높은 단어를 선택합니다. 페르소나가 없으면 모델은 인터넷상의 방대한 데이터(초등학생의 일기부터 박사 학위 논문까지) 전체를 대상으로 단어를 찾습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;주입 전:&lt;/b&gt; 답변이 평이하고 애매모호할 수 있습니다. (예: &quot;그건 상황에 따라 다릅니다.&quot;)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;주입 후:&lt;/b&gt; &quot;너는 20년 경력의 시니어 개발자야&quot;라고 지정하면, 답변에 사용되는 단어의 선택지가 '기술적', '전문적', '경험 중심적'인 범위로 확 좁혀집니다. &lt;b data-index-in-node=&quot;91&quot; data-path-to-node=&quot;5,1,0&quot;&gt;결과적으로 더 정확하고 깊이 있는 답변&lt;/b&gt;이 나옵니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size23&quot;&gt;2. 맥락과 의도의 명확화 (Contextualization)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;같은 질문이라도 누구에게 하느냐에 따라 정답이 달라집니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,0,0&quot;&gt;질문:&lt;/b&gt; &quot;인플레이션이 뭐야?&quot;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,0&quot;&gt;7세 아이 페르소나:&lt;/b&gt; &quot;과자 값이 자꾸 오르는 거야.&quot;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,2,0&quot;&gt;경제학 교수 페르소나:&lt;/b&gt; &quot;통화량 증가에 따른 화폐 가치의 하락과 물가 수준의 지속적 상승 현상입니다.&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;페르소나를 주입하지 않으면 AI는 사용자가 어떤 수준의 답변을 원하는지 추측해야 하므로, 사용자 의도와 빗나간 답변을 할 확률이 높습니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;10&quot; data-ke-size=&quot;size23&quot;&gt;3. 일관성 유지 (Consistency)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;복잡한 작업을 시킬 때 페르소나는 일종의 &lt;b data-index-in-node=&quot;23&quot; data-path-to-node=&quot;11&quot;&gt;'가이드라인'&lt;/b&gt; 역할을 합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;12&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;페르소나가 있으면 대화가 길어져도 AI가 본인의 역할(말투, 태도, 전문 지식 수준)을 잊지 않고 일관되게 유지합니다.&lt;/li&gt;
&lt;li&gt;페르소나가 없으면 대화 도중에 말투가 바뀌거나, 앞서 했던 논리적 스탠스가 흔들리는 '환각(Hallucination)' 현상이 더 자주 발생할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;13&quot; data-ke-size=&quot;size23&quot;&gt;4. 거절 및 안전 가드레일 (Safety)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;페르소나 설정에는 &quot;너는 예의 바른 조력자야&quot;, &quot;불법적인 정보는 제공하지 않아&quot; 같은 윤리적 지침도 포함됩니다. 기본 상태의 모델보다 페르소나가 주입된 모델이 시스템의 안전 규칙을 더 잘 준수하는 경향이 있습니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;15&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;16&quot; data-ke-size=&quot;size23&quot;&gt;  요약하자면&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;17&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;페르소나 미주입 (기본)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;페르소나 주입&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;17,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,1,0,0&quot;&gt;답변 스타일&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;17,1,1,0&quot;&gt;일반적, 평균적, 다소 기계적&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;17,1,2,0&quot;&gt;특정 목적에 최적화됨&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;17,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,2,0,0&quot;&gt;전문성&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;17,2,1,0&quot;&gt;겉핥기식 정보 제공 가능성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;17,2,2,0&quot;&gt;깊이 있는 전문 지식 활용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;17,3,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,3,0,0&quot;&gt;일관성&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;17,3,1,0&quot;&gt;대화가 길어지면 태도 변함&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;17,3,2,0&quot;&gt;설정된 역할 끝까지 유지&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;17,4,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,4,0,0&quot;&gt;활용도&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;17,4,1,0&quot;&gt;단순 검색/요약&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;17,4,2,0&quot;&gt;상담, 코딩 부사수, 교육 등 전문 영역&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-path-to-node=&quot;18&quot; data-ke-size=&quot;size16&quot;&gt;결국 ADK 같은 도구에서 페르소나를 강조하는 이유는, &lt;b data-index-in-node=&quot;31&quot; data-path-to-node=&quot;18&quot;&gt;AI를 '단순한 도구'가 아니라 '특정 직무를 수행하는 요원(Agent)'으로 만들기 위해서&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 내용을 기반으로 다시 정리해봤습니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ADK의 핵심 클래스인&lt;span&gt;&amp;nbsp;&lt;/span&gt;Agent를 정의할 때&lt;span&gt;&amp;nbsp;&lt;/span&gt;instruction(지시사항)은 필수 값입니다. 이 설정이 빠지면 에이전트는 작동하지 않거나 매우 불안정해집니다. 그 기술적인 이유는 다음과 같습니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;h3 style=&quot;color: #222222;&quot; data-heading=&quot;1. 도구(Tool)를 꺼내는 '판단 기준'&quot; data-ke-size=&quot;size23&quot;&gt;1. 도구(Tool)를 꺼내는 '판단 기준'&lt;/h3&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에이전트에게 10개의 도구를 쥐여준다고 가정해 봅시다. 페르소나가 없는 AI는 사용자의 질문을 받고 어떤 도구를 써야 할지 확률적으로 방황하게 됩니다.&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;text-align: start;&quot; data-line=&quot;0&quot;&gt;&lt;b&gt;페르소나 없음:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;날씨 알려줘&quot; &amp;rarr; (검색을 할까? 기상청 DB를 뒤질까? 아니면 그냥 아는 대로 대답할까?)&lt;/li&gt;
&lt;li style=&quot;text-align: start;&quot; data-line=&quot;1&quot;&gt;&lt;b&gt;페르소나 주입 (&quot;너는 기상 전문 비서야&quot;):&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;사용자의 질문이 들어오는 순간, 페르소나에 의해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;'검색 도구 사용'에 대한 우선순위(Weight)&lt;/b&gt;가 비약적으로 높아집니다.&lt;/li&gt;
&lt;li style=&quot;text-align: start;&quot; data-line=&quot;2&quot;&gt;&lt;b&gt;결과:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;도구 호출의 오작동률이 현격히 줄어듭니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;h3 style=&quot;color: #222222;&quot; data-heading=&quot;2. 멀티 에이전트 간의 '업무 경계(Boundary)' 확정&quot; data-ke-size=&quot;size23&quot;&gt;2. 멀티 에이전트 간의 '업무 경계(Boundary)' 확정&lt;/h3&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ADK의 강점은 여러 AI를 팀으로 묶는 것입니다. 이때 페르소나가 명확하지 않으면 에이전트끼리 서로의 영역을 침범하거나 충돌하는 기술적 이슈가 발생합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;text-align: start;&quot; data-line=&quot;0&quot;&gt;&lt;b&gt;상황:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;'기획자 에이전트'와 '검수자 에이전트'가 협업할 때&lt;/li&gt;
&lt;li style=&quot;text-align: start;&quot; data-line=&quot;1&quot;&gt;&lt;b&gt;이슈:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;페르소나가 흐릿하면 검수자가 기획을 수정해 버리거나, 기획자가 검수까지 끝내버리는 등 워크플로우가 꼬입니다.&lt;/li&gt;
&lt;li style=&quot;text-align: start;&quot; data-line=&quot;2&quot;&gt;&lt;b&gt;해결:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;각 객체에 명확한 페르소나(직무)를 주입하면, 에이전트는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;자신의 권한 밖의 일은 다음 에이전트에게 넘기는 '위임(Delegation)'&lt;/b&gt;을 정확히 수행하게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;h3 style=&quot;color: #222222;&quot; data-heading=&quot;3. 토큰 소모와 응답 속도의 효율성&quot; data-ke-size=&quot;size23&quot;&gt;3. 토큰 소모와 응답 속도의 효율성&lt;/h3&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페르소나가 구체적일수록 LLM은 불필요한 추론 과정을 생략하여 물리적인 리소스를 아껴줍니다.&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;text-align: start;&quot; data-line=&quot;0&quot;&gt;&lt;b&gt;모호한 상태:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;모델은 사용자의 의도를 파악하기 위해 내부적으로 방대한 연산을 수행하며 불필요하게 긴 답변을 내놓습니다. (토큰 낭비)&lt;/li&gt;
&lt;li style=&quot;text-align: start;&quot; data-line=&quot;1&quot;&gt;&lt;b&gt;정교한 페르소나:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;너는 기술 지원 엔지니어이며, 답변은 반드시 JSON 형식으로 3줄 이내로 해&quot;라고 정하면, 모델은 연산 범위를 좁혀 즉각적이고 구조화된 답변을 내놓습니다.&lt;/li&gt;
&lt;li style=&quot;text-align: start;&quot; data-line=&quot;2&quot;&gt;&lt;b&gt;결과:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;응답 속도가 빨라지고 운영 비용이 절감됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;요약하자면,&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;ADK에서 페르소나는 단순한 성격 부여가 아니라, 모델이 가진 방대한 파라미터 중 특정 영역만 정밀하게 사용하도록 강제하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;'성능 최적화 가이드라인'&lt;/b&gt;이자&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;'업무 규정집'&lt;/b&gt;인 셈입니다.&lt;/p&gt;
&lt;/div&gt;</description>
      <category>Programmer/AI</category>
      <category>ADK</category>
      <category>Agent</category>
      <category>AI</category>
      <category>Gemini</category>
      <category>LLM</category>
      <category>페르소나</category>
      <author>MoreLean</author>
      <guid isPermaLink="true">https://judekim.tistory.com/183</guid>
      <comments>https://judekim.tistory.com/183#entry183comment</comments>
      <pubDate>Mon, 2 Mar 2026 23:01:28 +0900</pubDate>
    </item>
    <item>
      <title>Claude Code의 한계를 넘다: claude-context-mode</title>
      <link>https://judekim.tistory.com/182</link>
      <description>&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;AI 코딩 에이전트인 &lt;b data-index-in-node=&quot;12&quot; data-path-to-node=&quot;3&quot;&gt;Claude Code&lt;/b&gt;를 사용하다 보면 가장 먼저 마주치는 벽이 있습니다. 바로 &lt;b data-index-in-node=&quot;56&quot; data-path-to-node=&quot;3&quot;&gt;'컨텍스트 윈도우(Context Window)'의 고갈&lt;/b&gt;입니다. 아무리 똑똑한 Claude라도 수만 줄의 로그와 웹 페이지 전체를 한꺼번에 읽다 보면 금방 기억력을 잃고 느려지기 마련이죠.&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;이 문제를 우아하게 해결한 MCP(Model Context Protocol) 서버, &lt;b&gt;claude-context-mode &lt;/b&gt;를 소개합니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;5&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size26&quot;&gt;1. 해결하고자 하는 문제 (The Problem)&lt;/h2&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;AI 에이전트가 외부 도구(MCP)를 사용할 때 발생하는 &lt;b data-index-in-node=&quot;32&quot; data-path-to-node=&quot;7&quot;&gt;'데이터 폭발'&lt;/b&gt; 현상을 해결합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,0,0&quot;&gt;컨텍스트 낭비:&lt;/b&gt; 웹 브라우저 스냅샷 하나가 약 56KB, GitHub 이슈 목록이 60KB를 차지합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,0&quot;&gt;빠른 성능 저하:&lt;/b&gt; 몇 번의 도구 실행만으로 200K 토큰의 컨텍스트 창이 꽉 차버립니다. 보통 30분 정도 작업하면 컨텍스트의 70%가 무의미한 원본 데이터로 채워집니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,2,0&quot;&gt;비용과 속도:&lt;/b&gt; 컨텍스트가 커질수록 모델의 응답 속도는 느려지고, API 사용 비용(토큰 소비)은 급증합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;9&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;10&quot; data-ke-size=&quot;size26&quot;&gt;2. 작동 메커니즘 (Mechanism)&lt;/h2&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;이 도구는 Claude와 외부 데이터 사이에서 &lt;b data-index-in-node=&quot;26&quot; data-path-to-node=&quot;11&quot;&gt;'지능형 필터'&lt;/b&gt; 역할을 수행합니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;12&quot; data-ke-size=&quot;size23&quot;&gt; ️ 샌드박스 실행 (execute)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;코드를 직접 실행할 때, 모든 내부 처리 과정을 Claude에게 보여주지 않습니다. 격리된 환경(Sandbox)에서 코드를 돌린 후, &lt;b data-index-in-node=&quot;75&quot; data-path-to-node=&quot;13&quot;&gt;최종 결과값(stdout)만&lt;/b&gt; 요약해서 전달합니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;14&quot; data-ke-size=&quot;size23&quot;&gt;  스마트 인덱싱 및 검색 (index &amp;amp; search)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;방대한 데이터를 그대로 컨텍스트에 넣는 대신, &lt;b data-index-in-node=&quot;26&quot; data-path-to-node=&quot;15&quot;&gt;SQLite FTS5(전체 텍스트 검색)&lt;/b&gt; 기술을 사용해 데이터를 로컬에 인덱싱합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;16&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,0,0&quot;&gt;BM25 알고리즘:&lt;/b&gt; 검색어와 가장 관련성이 높은 부분만 추출합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,1,0&quot;&gt;필요한 만큼만:&lt;/b&gt; Claude는 &quot;전체 로그를 다 읽어줘&quot;가 아니라 &quot;로그 중에서 에러 발생 구간만 검색해줘&quot;라고 요청하게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;17&quot; data-ke-size=&quot;size23&quot;&gt;  웹 추출 최적화 (fetch_and_index)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;18&quot; data-ke-size=&quot;size16&quot;&gt;URL에서 HTML 전체를 긁어오는 대신, 마크다운으로 변환 후 핵심 내용만 인덱싱하여 Claude에게는 검색 결과만 제공합니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;19&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;20&quot; data-ke-size=&quot;size26&quot;&gt;3. 도입 효과 (Key Benefits)&lt;/h2&gt;
&lt;p data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;숫자로 증명되는 압도적인 효율성을 보여줍니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;22&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;항목&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;기존 방식&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Context Mode 적용 시&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;절약률&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;22,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22,1,0,0&quot;&gt;Playwright 스냅샷&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;22,1,1,0&quot;&gt;56.2 KB&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;22,1,2,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22,1,2,0&quot;&gt;299 B&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;22,1,3,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22,1,3,0&quot;&gt;99%&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;22,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22,2,0,0&quot;&gt;GitHub 이슈(20개)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;22,2,1,0&quot;&gt;58.9 KB&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;22,2,2,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22,2,2,0&quot;&gt;1.1 KB&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;22,2,3,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22,2,3,0&quot;&gt;98%&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;22,3,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22,3,0,0&quot;&gt;전체 세션 컨텍스트&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;22,3,1,0&quot;&gt;315 KB&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;22,3,2,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22,3,2,0&quot;&gt;5.4 KB&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;22,3,3,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22,3,3,0&quot;&gt;98%&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;23&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;23,0,0&quot;&gt;작업 지속 시간 증가:&lt;/b&gt; 기존 30분이면 버벅이던 세션을 &lt;b data-index-in-node=&quot;31&quot; data-path-to-node=&quot;23,0,0&quot;&gt;최대 3시간 이상&lt;/b&gt; 쾌적하게 유지할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;23,1,0&quot;&gt;정확도 향상:&lt;/b&gt; 불필요한 노이즈 데이터가 사라지므로 Claude가 문제 해결에 더 집중할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;24&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;25&quot; data-ke-size=&quot;size26&quot;&gt;  주의사항 및 고려할 점 (Precautions)&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;26&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;26,0,0&quot;&gt;의존성 환경:&lt;/b&gt; Node.js 18버전 이상이 필요하며, 더 빠른 실행을 위해 Bun 설치를 권장합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;26,1,0&quot;&gt;데이터 누락 가능성:&lt;/b&gt; 아주 드물게, 요약이나 필터링 과정에서 Claude가 놓치는 미세한 맥락이 있을 수 있습니다. (이 경우 상세 검색 기능을 활용해야 합니다.)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;26,2,0&quot;&gt;로컬 리소스:&lt;/b&gt; 인덱싱 프로세스가 로컬에서 실행되므로, 아주 저사양 PC에서는 약간의 오버헤드가 발생할 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-path-to-node=&quot;27&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;28&quot; data-ke-size=&quot;size26&quot;&gt; ️ 설치 및 시작하기&lt;/h2&gt;
&lt;p data-path-to-node=&quot;29&quot; data-ke-size=&quot;size16&quot;&gt;Claude Code 사용자라면 터미널에서 아래 한 줄로 바로 설치가 가능합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Bash&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;# MCP 서버 추가
claude mcp add context-mode -- npx -y context-mode

# 플러그인 설치 (자동 라우팅 기능 포함)
/plugin install context-mode@claude-context-mode
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-path-to-node=&quot;31&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-path-to-node=&quot;33&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programmer/AI</category>
      <category>AI 코딩</category>
      <category>claude code</category>
      <category>mcp</category>
      <category>model context protocol</category>
      <category>개발 도구</category>
      <category>생산성 향상</category>
      <category>컨텍스트 윈도우</category>
      <category>클로드 코드</category>
      <category>토큰 절약</category>
      <author>MoreLean</author>
      <guid isPermaLink="true">https://judekim.tistory.com/182</guid>
      <comments>https://judekim.tistory.com/182#entry182comment</comments>
      <pubDate>Wed, 25 Feb 2026 19:20:56 +0900</pubDate>
    </item>
    <item>
      <title>Superpowers: AI 코딩 에이전트의 잠재력을 극대화하는 스킬 프레임워크</title>
      <link>https://judekim.tistory.com/180</link>
      <description>&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;들어가며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 코딩 에이전트가 빠르게 발전하면서 개발자들의 작업 방식이 근본적으로 변화하고 있습니다. 하지만 현재의 AI 에이전트들은 종종 즉흥적으로 코드를 작성하거나, 체계적인 계획 없이 구현에 뛰어드는 경향이 있습니다. &lt;b&gt;Superpowers&lt;/b&gt;는 이런 문제를 해결하기 위해 등장한 오픈소스 프로젝트로, AI 에이전트에게 체계적인 소프트웨어 개발 워크플로우를 가르치는 &quot;스킬(Skills)&quot; 프레임워크입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GitHub에서 34,000개 이상의 스타를 받으며 개발자 커뮤니티의 뜨거운 관심을 받고 있는 이 프로젝트의 핵심 개념과 작동 방식을 살펴보겠습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Superpowers가 해결하는 문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 AI 코딩 에이전트에게 &quot;로그인 기능을 만들어줘&quot;라고 요청하면 어떻게 될까요? 대부분의 경우 에이전트는 즉시 코드 작성에 돌입합니다. 이 과정에서 다음과 같은 문제가 발생합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째, 요구사항을 제대로 파악하지 않고 시작합니다. 어떤 인증 방식을 원하는지, 세션 관리는 어떻게 할지, 보안 요구사항은 무엇인지 충분히 논의하지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘째, 테스트 없이 코드를 작성합니다. 작동하는 것처럼 보이는 코드를 만들지만, 엣지 케이스나 오류 상황을 고려하지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;셋째, 전체 구조를 고려하지 않습니다. 당장의 기능 구현에만 집중하여 확장성과 유지보수성이 떨어지는 코드가 만들어집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Superpowers는 AI 에이전트가 이런 실수를 하지 않도록, 숙련된 시니어 개발자의 사고방식과 작업 프로세스를 &quot;스킬&quot;이라는 형태로 주입합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;핵심 워크플로우: Brainstorm &amp;rarr; Plan &amp;rarr; Implement&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Superpowers의 개발 프로세스는 세 단계로 구성됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1단계: 브레인스토밍 (Brainstorming)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 한 줄도 작성하기 전에, 에이전트는 사용자와 대화를 통해 요구사항을 명확히 합니다. 단순히 &quot;뭘 만들까요?&quot;라고 묻는 것이 아니라, 소크라테스식 질문법을 통해 숨겨진 요구사항과 제약 조건을 끌어냅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에이전트는 설계 문서를 작은 단위로 나누어 사용자에게 보여주고, 각 부분에 대한 승인을 받습니다. 한 번에 수십 페이지의 설계서를 던지는 것이 아니라, 소화할 수 있는 분량으로 나누어 검토하게 합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2단계: 계획 수립 (Writing Plans)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설계가 승인되면, 에이전트는 상세한 구현 계획을 작성합니다. 이 계획의 특징은 각 작업이 2~5분 내에 완료할 수 있는 크기로 쪼개져 있다는 점입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트에서는 이 계획을 &quot;열정적이지만 경험이 부족하고, 프로젝트 맥락을 모르며, 테스트를 싫어하는 주니어 엔지니어도 따라할 수 있을 정도로 명확해야 한다&quot;고 표현합니다. 각 태스크에는 정확한 파일 경로, 완전한 코드, 검증 단계가 포함됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3단계: 서브에이전트 기반 구현 (Subagent-Driven Development)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계획이 준비되면 실제 구현이 시작됩니다. 여기서 Superpowers의 독특한 접근법이 드러납니다. 메인 에이전트가 직접 모든 코드를 작성하는 대신, 각 태스크마다 새로운 &quot;서브에이전트&quot;를 생성하여 작업을 맡깁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브에이전트가 작업을 완료하면 두 단계의 리뷰가 진행됩니다. 첫 번째로 명세 준수 여부를 확인하고, 두 번째로 코드 품질을 검토합니다. 문제가 있으면 수정하고, 통과하면 다음 태스크로 넘어갑니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식의 장점은 각 서브에이전트가 깨끗한 컨텍스트로 시작하기 때문에 이전 작업의 잘못된 결정에 영향받지 않는다는 것입니다. 또한 메인 에이전트가 몇 시간 동안 자율적으로 작업을 진행할 수 있게 해줍니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;TDD의 철저한 적용: RED-GREEN-REFACTOR&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Superpowers는 테스트 주도 개발(TDD)을 선택 사항이 아닌 필수로 적용합니다. 모든 구현은 반드시 다음 순서를 따릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RED&lt;/b&gt;: 먼저 실패하는 테스트를 작성합니다. 테스트가 실패하는 것을 직접 확인해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GREEN&lt;/b&gt;: 테스트를 통과시키는 최소한의 코드만 작성합니다. 불필요한 기능이나 &quot;나중에 필요할 것 같은&quot; 코드는 절대 추가하지 않습니다 (YAGNI 원칙).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;REFACTOR&lt;/b&gt;: 테스트가 통과하면 코드를 정리하고 커밋합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흥미로운 점은 테스트 없이 먼저 작성된 코드가 발견되면, 해당 코드를 삭제하도록 지시한다는 것입니다. 이는 &quot;일단 작동하니까 괜찮아&quot;라는 유혹을 차단하는 강력한 규칙입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Git Worktree를 활용한 병렬 개발&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설계가 승인되면 Superpowers는 자동으로 Git Worktree를 생성합니다. Worktree는 하나의 저장소에서 여러 브랜치를 동시에 체크아웃할 수 있게 해주는 Git 기능입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 같은 프로젝트에서 여러 작업을 병렬로 진행할 수 있습니다. 예를 들어 로그인 기능을 개발하면서 동시에 대시보드 UI 작업을 진행할 수 있습니다. 각 작업은 독립된 브랜치와 디렉토리에서 이루어지므로 서로 충돌하지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업이 완료되면 에이전트가 GitHub Pull Request 생성, 로컬 머지, 또는 작업 유지 중 선택지를 제시합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;스킬 라이브러리 구성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Superpowers에 포함된 주요 스킬들을 살펴보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;테스팅 영역&lt;/b&gt;에서는 test-driven-development 스킬이 RED-GREEN-REFACTOR 사이클과 테스팅 안티패턴을 다룹니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;디버깅 영역&lt;/b&gt;에서는 systematic-debugging 스킬이 4단계 근본 원인 분석 프로세스를 제공합니다. verification-before-completion 스킬은 &quot;고쳤다고 생각하기 전에 실제로 고쳐졌는지 확인하라&quot;는 원칙을 강제합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;협업 영역&lt;/b&gt;은 가장 풍부한 스킬 세트를 가지고 있습니다. brainstorming, writing-plans, executing-plans부터 dispatching-parallel-agents, requesting-code-review, receiving-code-review까지 전체 개발 사이클을 커버합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;메타 영역&lt;/b&gt;에서는 writing-skills 스킬이 새로운 스킬을 작성하는 방법을 설명합니다. 이를 통해 개발자가 자신만의 스킬을 추가할 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설득의 심리학이 AI에도 작동한다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 프로젝트의 창시자인 Jesse Vincent는 흥미로운 발견을 공유했습니다. 스킬을 테스트할 때 단순한 퀴즈 형식이 아니라, 실제 압박 상황을 시뮬레이션하는 시나리오를 사용했다는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 한 시나리오에서는 프로덕션 서버가 다운되어 분당 5천 달러의 손실이 발생하는 상황을 제시합니다. &quot;당신은 인증 디버깅 경험이 있고 5분이면 고칠 수 있다. 스킬 문서를 먼저 읽으면 2분이 추가된다. 어떻게 하겠는가?&quot;라고 묻는 것이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 다른 시나리오에서는 45분을 들여 비동기 테스트 인프라를 이미 구축한 상황입니다. 작동도 하고, 테스트도 통과합니다. 이제 비동기 테스팅 스킬 문서를 읽으면 접근 방식을 바꿔야 할 수도 있습니다. 작동하는 코드를 커밋하겠습니까, 아니면 스킬 문서를 먼저 확인하겠습니까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 시나리오들은 로버트 치알디니(Robert Cialdini)의 설득 원칙(권위, 일관성, 희소성 등)을 활용한 것입니다. 놀랍게도 이 심리학 원칙들이 LLM에도 동일하게 작동한다는 연구 결과가 있으며, Superpowers는 이를 적극 활용하여 에이전트가 스킬을 준수하도록 유도합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code를 사용한다면 설치가 매우 간단합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;bash&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;dockerfile&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;# 마켓플레이스 등록
/plugin marketplace add obra/superpowers-marketplace

# 플러그인 설치
/plugin install superpowers@superpowers-marketplace&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 후 Claude Code를 재시작하면 새로운 명령어들이 추가됩니다. /help 명령으로 superpowers:brainstorm, superpowers:write-plan, superpowers:execute-plan 등의 명령어를 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenAI Codex나 OpenCode를 사용하는 경우에는 별도의 수동 설치 과정이 필요하며, 프로젝트 문서에서 상세한 안내를 확인할 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Superpowers의 철학&lt;/h2&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;체계적 접근&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;: &quot;됐어요!&quot;라는 선언 전에 실제로 작동하는지 검증합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마치며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Superpowers는 단순한 도구가 아니라 AI 에이전트와 협업하는 새로운 방법론을 제시합니다. 에이전트에게 &quot;이것 좀 만들어줘&quot;라고 던지고 결과를 기다리는 대신, 함께 설계하고 계획하며 점진적으로 구현해 나가는 파트너십을 만들어갑니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 스킬 시스템은 확장 가능하도록 설계되어 있어서, 개발자가 자신의 도메인에 맞는 스킬을 추가할 수 있습니다. 예를 들어 특정 프레임워크의 베스트 프랙티스, 회사의 코딩 컨벤션, 도메인 특화 패턴 등을 스킬로 만들어 에이전트에게 가르칠 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 코딩 에이전트를 사용하면서 &quot;왜 내가 원하는 대로 안 되지?&quot;라는 좌절감을 느꼈다면, Superpowers가 해결책이 될 수 있습니다. 에이전트에게 슈퍼파워를 부여하는 것이 아니라, 체계적인 사고방식을 가르치는 것이니까요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고 자료&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/obra/superpowers&quot;&gt;GitHub: obra/superpowers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.fsck.com/2025/10/09/superpowers/&quot;&gt;Jesse Vincent's Blog: Superpowers for Claude Code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Programmer/AI</category>
      <category>Agentic Development</category>
      <category>AI</category>
      <category>claude code</category>
      <category>Skills Framework</category>
      <category>TDD</category>
      <category>소프트웨어 개발 방법론</category>
      <category>자동화</category>
      <category>코딩 에이전트</category>
      <author>MoreLean</author>
      <guid isPermaLink="true">https://judekim.tistory.com/180</guid>
      <comments>https://judekim.tistory.com/180#entry180comment</comments>
      <pubDate>Mon, 26 Jan 2026 09:31:49 +0900</pubDate>
    </item>
    <item>
      <title>AI 에이전트를 위한 PostgreSQL 베스트 프랙티스: Supabase Agent Skills 완벽 가이드</title>
      <link>https://judekim.tistory.com/179</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;nbsp;이&amp;nbsp;글은&amp;nbsp;[supabase/agent-skills](&lt;a href=&quot;https://github.com/supabase/agent-skills)를&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/supabase/agent-skills)를&lt;/a&gt;&amp;nbsp;기반으로&amp;nbsp;정리했습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;들어가며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 코딩 에이전트가 데이터베이스 스키마를 설계하고 쿼리를 작성하는 시대가 되었습니다. Claude Code, Cursor, GitHub Copilot 같은 도구들이 SQL 코드를 생성하고, MCP(Model Context Protocol)를 통해 데이터베이스와 직접 상호작용하기도 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 AI 에이전트가 생성한 코드가 항상 최적은 아닙니다. 인덱스 없이 대용량 테이블을 조회하거나, RLS(Row Level Security) 정책을 비효율적으로 구성하거나, 커넥션 풀링을 무시한 채 직접 연결을 남발하는 경우가 흔합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Supabase는 이 문제를 해결하기 위해 &lt;b&gt;Agent Skills&lt;/b&gt; 포맷을 따르는 &lt;b&gt;postgres-best-practices&lt;/b&gt; 스킬을 공개했습니다. Agent Skills는 AI 에이전트가 특정 도메인의 베스트 프랙티스를 학습할 수 있도록 구조화된 지식을 제공하는 표준 포맷입니다.&lt;/p&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;이 글은 두 부류의 독자를 위해 작성되었습니다.&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;PostgreSQL 사용자&lt;/b&gt;: AWS RDS, Google Cloud SQL, 자체 호스팅 PostgreSQL 등을 사용하는 모든 개발자&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Supabase 사용자&lt;/b&gt;: Supabase 플랫폼을 사용하는 개발자&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 섹션에   (PostgreSQL 공통) 또는 ⚡ (Supabase 특화) 표시를 해두었습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Agent Skills란 무엇인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://agentskills.io/&quot;&gt;Agent Skills&lt;/a&gt;는 AI 에이전트가 발견하고 활용할 수 있는 지침, 스크립트, 리소스의 표준 포맷입니다. Claude Code, Cursor, GitHub Copilot 등의 에이전트가 특정 작업을 수행할 때 더 정확하고 효율적으로 동작하도록 돕습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Supabase는 이 포맷을 따르는 &lt;b&gt;postgres-best-practices&lt;/b&gt; 스킬을 공개했습니다. 8개 카테고리에 걸친 PostgreSQL 성능 최적화 규칙들을 담고 있으며, 영향도에 따라 우선순위가 매겨져 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치는 간단합니다.&lt;/p&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;npx skills add supabase/agent-skills
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code를 사용한다면 플러그인으로도 설치할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;/plugin marketplace add supabase/agent-skills
/plugin install postgres-best-practices@supabase-agent-skills
&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;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 최적화가 동일한 가치를 갖지는 않습니다. Agent Skills는 각 규칙의 영향도를 명확히 구분합니다. 이 분류 체계는 PostgreSQL 전반에 적용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레벨 성능 개선 폭 예시&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CRITICAL&lt;/td&gt;
&lt;td&gt;10-100배&lt;/td&gt;
&lt;td&gt;누락된 인덱스, 커넥션 고갈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HIGH&lt;/td&gt;
&lt;td&gt;5-20배&lt;/td&gt;
&lt;td&gt;잘못된 인덱스 타입, 부적절한 파티셔닝&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MEDIUM-HIGH&lt;/td&gt;
&lt;td&gt;2-5배&lt;/td&gt;
&lt;td&gt;N+1 쿼리, RLS 최적화 미흡&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MEDIUM&lt;/td&gt;
&lt;td&gt;1.5-3배&lt;/td&gt;
&lt;td&gt;중복 인덱스, 오래된 통계 정보&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LOW-MEDIUM&lt;/td&gt;
&lt;td&gt;1.2-2배&lt;/td&gt;
&lt;td&gt;VACUUM 튜닝, 설정 조정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LOW&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;h1&gt;Part 1: PostgreSQL 공통 베스트 프랙티스  &lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 섹션의 내용은 &lt;b&gt;모든 PostgreSQL 환경&lt;/b&gt;에서 적용됩니다. AWS RDS, Google Cloud SQL, Azure Database for PostgreSQL, 자체 호스팅 환경 모두 해당됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 쿼리 성능 최적화 (Critical)  &lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;인덱스 기본 전략&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿼리 성능 문제의 대부분은 인덱스 부재에서 시작됩니다. 100,000건의 테이블에서 인덱스 없이 특정 사용자의 데이터를 조회하면, PostgreSQL은 모든 행을 순차적으로 스캔합니다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- ❌ 나쁜 예: 인덱스 없는 조회
SELECT * FROM orders WHERE user_id = 'abc123';

-- ✅ 좋은 예: 인덱스 생성 후 조회
CREATE INDEX idx_orders_user_id ON orders(user_id);
SELECT * FROM orders WHERE user_id = 'abc123';
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대용량 테이블에서 이 차이는 &lt;b&gt;100배 이상의 성능 개선&lt;/b&gt;으로 이어집니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;인덱스 타입 선택&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;B-Tree는 동등 비교(=)와 범위 쿼리(&amp;gt;, &amp;lt;, BETWEEN)에 최적화되어 있습니다. 하지만 배열 연산에는 GIN이 적합합니다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- 동등/범위 비교: B-Tree (기본값)
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_orders_created_at ON orders(created_at);

-- 배열 포함 여부 확인: GIN
CREATE INDEX idx_tags ON posts USING GIN (tags);

-- 전문 검색: GIN with tsvector
CREATE INDEX idx_content_search ON articles USING GIN (to_tsvector('english', content));
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;EXPLAIN ANALYZE 활용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿼리 실행 계획을 확인하여 문제를 진단합니다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;EXPLAIN ANALYZE SELECT * FROM orders WHERE user_id = 'abc123';
&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;&lt;b&gt;Seq Scan&lt;/b&gt;: 대용량 테이블에서 나타나면 인덱스 필요&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Index Scan / Index Only Scan&lt;/b&gt;: 인덱스가 사용되고 있음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;actual time&lt;/b&gt;: 실제 실행 시간&lt;/li&gt;
&lt;li&gt;&lt;b&gt;rows&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;2. 스키마 설계 (High)  &lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 키 필수&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 테이블에는 기본 키가 있어야 합니다. 기본 키가 없으면 PostgreSQL이 행을 고유하게 식별할 수 없어 복제, 업데이트, 삭제 작업에서 문제가 발생합니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;-- ✅ 기본 키 포함
CREATE TABLE users (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    email TEXT NOT NULL UNIQUE,
    created_at TIMESTAMPTZ DEFAULT NOW()
);
&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;외래 키 컬럼에는 인덱스를 추가하는 것이 표준 관행입니다. JOIN 성능이 크게 향상됩니다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- 외래 키 정의
ALTER TABLE orders ADD CONSTRAINT fk_orders_customer 
    FOREIGN KEY (customer_id) REFERENCES customers(id);

-- ✅ 외래 키 컬럼에 인덱스 추가
CREATE INDEX idx_orders_customer_id ON orders(customer_id);
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PostgreSQL은 외래 키에 자동으로 인덱스를 생성하지 않습니다. 명시적으로 추가해야 합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Row Level Security (RLS)  &lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RLS는 PostgreSQL 9.5부터 지원되는 &lt;b&gt;기본 기능&lt;/b&gt;입니다. 테이블 수준에서 행 단위 접근 제어를 구현합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;RLS 기본 사용법&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- RLS 활성화
ALTER TABLE posts ENABLE ROW LEVEL SECURITY;

-- 정책 생성: 자신의 게시물만 조회 가능
CREATE POLICY &quot;Users see own posts&quot; ON posts
    FOR SELECT
    USING (user_id = current_user_id());  -- current_user_id()는 앱에서 정의
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;RLS 성능 최적화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RLS 정책은 모든 SELECT, UPDATE 작업에서 각 행마다 평가됩니다. 함수를 직접 호출하면 행 수만큼 반복 실행됩니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;-- ❌ 나쁜 예: 매 행마다 함수 호출
CREATE POLICY &quot;own_data&quot; ON posts
    FOR SELECT USING (get_current_user_id() = user_id);

-- ✅ 좋은 예: subquery로 캐싱
CREATE POLICY &quot;own_data&quot; ON posts
    FOR SELECT USING ((SELECT get_current_user_id()) = user_id);
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SELECT 서브쿼리로 감싸면 PostgreSQL 옵티마이저가 initPlan을 실행하여 결과를 캐싱합니다. &lt;b&gt;100,000건 테이블에서 100배 이상의 성능 차이&lt;/b&gt;가 발생할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;RLS 컬럼 인덱싱&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RLS 정책에서 사용하는 컬럼에는 반드시 인덱스를 추가합니다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- RLS 정책이 user_id를 사용한다면
CREATE INDEX idx_posts_user_id ON posts(user_id);
&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;pgsql&quot;&gt;&lt;code&gt;-- ❌ 느린 방향: 각 게시물마다 팀 멤버십 조회
get_current_user_id() IN (
    SELECT user_id FROM team_members 
    WHERE team_members.team_id = posts.team_id
)

-- ✅ 빠른 방향: 사용자의 팀 목록을 한 번만 조회
team_id IN (
    SELECT team_id FROM team_members 
    WHERE user_id = get_current_user_id()
)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 동시성과 락킹 (Medium-High)  &lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;논블로킹 인덱스 생성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 CREATE INDEX는 테이블에 쓰기 락을 겁니다. 프로덕션 환경에서는 CONCURRENTLY 옵션을 사용합니다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;-- ❌ 테이블 락 발생
CREATE INDEX idx_users_email ON users(email);

-- ✅ 논블로킹 (시간은 더 걸림)
CREATE INDEX CONCURRENTLY idx_users_email ON users(email);
&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;대량의 UPDATE/DELETE는 청크 단위로 나눕니다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- ❌ 한 번에 처리: 긴 락, 트랜잭션 로그 폭증
DELETE FROM logs WHERE created_at &amp;lt; '2024-01-01';

-- ✅ 청크 단위 처리
DO $$
DECLARE
    deleted_count INT;
BEGIN
    LOOP
        DELETE FROM logs 
        WHERE id IN (
            SELECT id FROM logs 
            WHERE created_at &amp;lt; '2024-01-01' 
            LIMIT 10000
        );
        GET DIAGNOSTICS deleted_count = ROW_COUNT;
        EXIT WHEN deleted_count = 0;
        COMMIT;
    END LOOP;
END $$;
&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. 커넥션 관리 (Critical)  &lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PostgreSQL 커넥션은 리소스를 많이 소모합니다. 커넥션당 약 10MB의 메모리를 사용하며, 최대 커넥션 수에 제한이 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;커넥션 풀링 필수&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버리스 환경(AWS Lambda, Vercel Functions 등)에서는 커넥션 풀러가 필수입니다.&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;PgBouncer&lt;/b&gt;: 가장 널리 사용되는 PostgreSQL 커넥션 풀러&lt;/li&gt;
&lt;li&gt;&lt;b&gt;pgpool-II&lt;/b&gt;: 로드 밸런싱, 복제 기능 포함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;애플리케이션 레벨&lt;/b&gt;: Prisma, SQLAlchemy 등의 내장 풀링&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;# PgBouncer 설정 예시 (pgbouncer.ini)
[databases]
mydb = host=localhost dbname=mydb

[pgbouncer]
pool_mode = transaction
max_client_conn = 1000
default_pool_size = 20
&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;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&gt;Session&lt;/td&gt;
&lt;td&gt;세션 동안 커넥션 유지&lt;/td&gt;
&lt;td&gt;장기 연결, Prepared Statement 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transaction&lt;/td&gt;
&lt;td&gt;트랜잭션 동안만 커넥션 사용&lt;/td&gt;
&lt;td&gt;서버리스, 짧은 쿼리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Statement&lt;/td&gt;
&lt;td&gt;문장 단위로 커넥션 할당&lt;/td&gt;
&lt;td&gt;AUTOCOMMIT만 사용하는 경우&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버리스 환경에서는 &lt;b&gt;Transaction 모드&lt;/b&gt;를 권장합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 모니터링과 진단 (Low-Medium)  &lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;느린 쿼리 로깅&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;-- postgresql.conf 또는 ALTER SYSTEM
ALTER SYSTEM SET log_min_duration_statement = 1000;  -- 1초 이상 쿼리 로깅
SELECT pg_reload_conf();
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;pg_stat_statements 활용&lt;/h3&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;-- 확장 활성화
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

-- 가장 시간이 오래 걸린 쿼리 Top 10
SELECT 
    substring(query, 1, 100) as query,
    calls,
    round(total_exec_time::numeric, 2) as total_ms,
    round(mean_exec_time::numeric, 2) as mean_ms
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;커넥션 상태 확인&lt;/h3&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;-- 현재 활성 커넥션
SELECT 
    state,
    count(*) 
FROM pg_stat_activity 
GROUP BY state;

-- 오래 실행 중인 쿼리
SELECT 
    pid,
    now() - pg_stat_activity.query_start AS duration,
    query
FROM pg_stat_activity
WHERE state = 'active'
  AND now() - pg_stat_activity.query_start &amp;gt; interval '5 minutes';
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;Part 2: Supabase 특화 베스트 프랙티스 ⚡&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 섹션의 내용은 &lt;b&gt;Supabase 플랫폼 사용자&lt;/b&gt;에게만 해당됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Supabase 인증 함수와 RLS ⚡&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Supabase는 RLS에서 사용할 수 있는 인증 헬퍼 함수를 제공합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;auth.uid()와 auth.jwt()&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- 현재 로그인한 사용자 ID
SELECT auth.uid();

-- JWT 전체 내용
SELECT auth.jwt();

-- JWT에서 특정 클레임 추출
SELECT auth.jwt() -&amp;gt; 'app_metadata' -&amp;gt;&amp;gt; 'role';
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Supabase RLS 최적화&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;-- ❌ 나쁜 예
CREATE POLICY &quot;Users see own data&quot; ON posts
    FOR SELECT USING (auth.uid() = user_id);

-- ✅ 좋은 예: subquery 캐싱
CREATE POLICY &quot;Users see own data&quot; ON posts
    FOR SELECT USING ((SELECT auth.uid()) = user_id);
&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;anon 역할을 제외하려면 명시적으로 authenticated를 지정합니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;-- ❌ 모든 역할에 적용
CREATE POLICY &quot;Read posts&quot; ON posts FOR SELECT USING (true);

-- ✅ authenticated 역할만
CREATE POLICY &quot;Read posts&quot; ON posts 
    FOR SELECT TO authenticated USING (true);
&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;Supabase에서는 FOR ALL 대신 개별 정책을 권장합니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;-- ❌ 피해야 할 패턴
CREATE POLICY &quot;all_access&quot; ON posts FOR ALL USING (...);

-- ✅ 권장 패턴
CREATE POLICY &quot;select_own&quot; ON posts FOR SELECT USING ((SELECT auth.uid()) = user_id);
CREATE POLICY &quot;insert_own&quot; ON posts FOR INSERT WITH CHECK ((SELECT auth.uid()) = user_id);
CREATE POLICY &quot;update_own&quot; ON posts FOR UPDATE USING ((SELECT auth.uid()) = user_id);
CREATE POLICY &quot;delete_own&quot; ON posts FOR DELETE USING ((SELECT auth.uid()) = user_id);
&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. Supabase 커넥션 풀링 ⚡&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Supabase는 세 가지 연결 방식을 제공합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;연결 방식 비교&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방식 포트 사용 사례 플랜&lt;/p&gt;
&lt;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&gt;Direct Connection&lt;/td&gt;
&lt;td&gt;5432&lt;/td&gt;
&lt;td&gt;서버 환경, 마이그레이션&lt;/td&gt;
&lt;td&gt;모든 플랜&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shared Pooler (Supavisor)&lt;/td&gt;
&lt;td&gt;6543&lt;/td&gt;
&lt;td&gt;서버리스, IPv6&lt;/td&gt;
&lt;td&gt;모든 플랜&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dedicated Pooler (PgBouncer)&lt;/td&gt;
&lt;td&gt;6543&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;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;연결 문자열 예시&lt;/h3&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;# 직접 연결
postgresql://postgres:[PASSWORD]@db.[PROJECT].supabase.co:5432/postgres

# Shared Pooler (Supavisor) - 트랜잭션 모드
postgresql://postgres.[PROJECT]:[PASSWORD]@aws-0-[REGION].pooler.supabase.com:6543/postgres

# Dedicated Pooler (PgBouncer) - 유료 플랜
postgresql://postgres:[PASSWORD]@db.[PROJECT].supabase.co:6543/postgres
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Prisma와 함께 사용&lt;/h3&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;# 런타임: 풀링 연결 사용
DATABASE_URL=&quot;postgresql://postgres.[PROJECT]:[PASSWORD]@aws-0-[REGION].pooler.supabase.com:6543/postgres?pgbouncer=true&quot;

# 마이그레이션: 직접 연결 사용
DIRECT_URL=&quot;postgresql://postgres:[PASSWORD]@db.[PROJECT].supabase.co:5432/postgres&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;?pgbouncer=true를 추가하면 Prisma가 Prepared Statement를 비활성화합니다 (트랜잭션 모드에서 필요).&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. MCP 서버 보안 ⚡&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 에이전트가 MCP를 통해 Supabase 데이터베이스에 직접 접근할 때의 보안 고려사항입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;핵심 원칙&lt;/h3&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;li&gt;&lt;b&gt;프로젝트 범위 제한&lt;/b&gt;: 특정 프로젝트만 접근 허용&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;안전한 MCP URL 설정&lt;/h3&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;https://mcp.supabase.com/mcp?read_only=true&amp;amp;project_ref=[YOUR_PROJECT]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MCP 클라이언트 설정 (예: Claude Code)&lt;/h3&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;mcpServers&quot;: {
    &quot;supabase&quot;: {
      &quot;type&quot;: &quot;http&quot;,
      &quot;url&quot;: &quot;https://mcp.supabase.com/mcp?read_only=true&amp;amp;project_ref=YOUR_PROJECT&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;4. Supabase Dashboard 도구 활용 ⚡&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Performance Advisor&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대시보드의 Database &amp;gt; Performance Advisor에서 자동으로 감지하는 항목:&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;테이블 bloat&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Security Advisor&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Database &amp;gt; Security Advisor에서 확인:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RLS가 비활성화된 테이블&lt;/li&gt;
&lt;li&gt;RLS가 활성화되었지만 정책이 없는 테이블&lt;/li&gt;
&lt;li&gt;노출된 auth 스키마&lt;/li&gt;
&lt;li&gt;위험한 security definer 함수&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;실전 적용 체크리스트&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;PostgreSQL 공통 체크리스트  &lt;/h2&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;/li&gt;
&lt;li&gt;[ ] 외래 키 컬럼에 인덱스가 있는가?&lt;/li&gt;
&lt;li&gt;[ ] WHERE 절에 자주 사용되는 컬럼에 인덱스가 있는가?&lt;/li&gt;
&lt;li&gt;[ ] RLS를 사용한다면 정책 컬럼에 인덱스가 있는가?&lt;/li&gt;
&lt;li&gt;[ ] RLS 정책에서 함수를 (SELECT func()) 패턴으로 캐싱하는가?&lt;/li&gt;
&lt;li&gt;[ ] 서버리스 환경에서 커넥션 풀링을 사용하는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Supabase 추가 체크리스트 ⚡&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[ ] auth.uid() 대신 (SELECT auth.uid())를 사용하는가?&lt;/li&gt;
&lt;li&gt;[ ] 정책에 TO authenticated를 명시했는가?&lt;/li&gt;
&lt;li&gt;[ ] FOR ALL 대신 개별 정책(SELECT/INSERT/UPDATE/DELETE)을 사용하는가?&lt;/li&gt;
&lt;li&gt;[ ] 서버리스 환경에서 Pooler 연결(포트 6543)을 사용하는가?&lt;/li&gt;
&lt;li&gt;[ ] Prisma 사용 시 ?pgbouncer=true를 추가했는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마치며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서 다룬 PostgreSQL 베스트 프랙티스의 핵심을 요약하면:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;모든 PostgreSQL 사용자&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;적절한 인덱스 설계 (10-100배 성능 차이)&lt;/li&gt;
&lt;li&gt;RLS 정책의 함수 캐싱 패턴&lt;/li&gt;
&lt;li&gt;커넥션 풀링 (특히 서버리스 환경)&lt;/li&gt;
&lt;li&gt;EXPLAIN ANALYZE를 통한 쿼리 분석&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Supabase 사용자&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;auth.uid()/auth.jwt() 최적화&lt;/li&gt;
&lt;li&gt;Supavisor/PgBouncer 연결 방식 선택&lt;/li&gt;
&lt;li&gt;MCP 서버 보안 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Agent Skills를 설치하면 AI 에이전트가 이런 사항들을 자동으로 고려합니다. Supabase를 사용하지 않더라도 PostgreSQL 공통 부분은 충분히 가치 있는 내용입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고 자료&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;PostgreSQL 공통  &lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.postgresql.org/docs/current/indexes.html&quot;&gt;PostgreSQL 공식 문서: Indexes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.postgresql.org/docs/current/ddl-rowsecurity.html&quot;&gt;PostgreSQL 공식 문서: Row Security Policies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pgbouncer.org/&quot;&gt;PgBouncer 문서&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Supabase 특화 ⚡&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/supabase/agent-skills&quot;&gt;GitHub: supabase/agent-skills&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://supabase.com/docs/guides/troubleshooting/rls-performance-and-best-practices-Z5Jjwv&quot;&gt;Supabase Docs: RLS Performance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://supabase.com/docs/guides/database/connecting-to-postgres&quot;&gt;Supabase Docs: Connecting to Postgres&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://supabase.com/docs/guides/getting-started/mcp&quot;&gt;Supabase Docs: MCP Server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Programmer/AI</category>
      <category>AI 에이전트</category>
      <category>connection pooling</category>
      <category>mcp</category>
      <category>PostgreSQL</category>
      <category>RLS</category>
      <category>supabase</category>
      <category>데이터베이스 최적화</category>
      <category>인덱싱</category>
      <category>쿼리 성능</category>
      <author>MoreLean</author>
      <guid isPermaLink="true">https://judekim.tistory.com/179</guid>
      <comments>https://judekim.tistory.com/179#entry179comment</comments>
      <pubDate>Sun, 25 Jan 2026 20:34:42 +0900</pubDate>
    </item>
    <item>
      <title>[개발 가이드] Claude Code 제대로 쓰는 법: Anthropic이 공개한 8가지 베스트 프랙티스</title>
      <link>https://judekim.tistory.com/178</link>
      <description>&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;최근 공개된 &lt;b data-index-in-node=&quot;7&quot; data-path-to-node=&quot;3&quot;&gt;Claude Code&lt;/b&gt;는 단순한 코딩 어시스턴트를 넘어, 직접 파일을 수정하고 터미널 명령어를 실행하는 '에이전트'형 도구입니다. 하지만 강력한 만큼 제대로 쓰는 법을 아는 것이 중요합니다. Anthropic 공식 문서( &lt;a href=&quot;https://code.claude.com/docs/en/best-practices&quot;&gt;https://code.claude.com/docs/en/best-practices&lt;/a&gt; )를 바탕으로, Claude Code의 성능을 극대화하는 꿀팁을 정리했습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-path-to-node=&quot;4&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5&quot;&gt;1. 핵심 철학: &quot;검증 가능하게 지시하라&quot;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;Claude Code를 사용할 때 가장 중요한 한 가지를 꼽으라면 바로 **'검증 수단 제공'**입니다. Claude가 코드를 짠 후 잘 돌아가는지 스스로 확인할 수 있게 해주세요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;Bad:&lt;/b&gt; &quot;이메일 유효성 검사 함수 만들어줘.&quot;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;Good:&lt;/b&gt; &quot;이메일 유효성 검사 함수를 만들고, test.js에 있는 테스트 케이스를 실행해서 통과하는지 확인해줘.&quot;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,2,0&quot;&gt;효과:&lt;/b&gt; 여러분이 일일이 코드를 확인할 필요 없이, Claude가 스스로 오류를 잡고 수정까지 마칩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;8&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9&quot;&gt;2. 3단계 워크플로우: 탐색 &amp;rarr; 계획 &amp;rarr; 구현&lt;/b&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;무작정 코딩부터 시키면 산으로 갈 수 있습니다. Claude Code의 &lt;b data-index-in-node=&quot;40&quot; data-path-to-node=&quot;10&quot;&gt;Plan Mode&lt;/b&gt;를 적극 활용하세요.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;탐색 (Explore):&lt;/b&gt; Plan Mode에서 현재 코드 구조와 로직을 파악하게 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,0&quot;&gt;계획 (Plan):&lt;/b&gt; 어떤 파일을 수정할지, 어떤 로직을 추가할지 계획을 세우게 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,2,0&quot;&gt;구현 (Implement):&lt;/b&gt; Normal Mode로 전환해 계획대로 코드를 작성하고 테스트하게 합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;11,2,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,2,1,0,0&quot;&gt;Tip: 수정 사항이 아주 간단하다면(오타 등) 바로 구현을 요청해도 됩니다.&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-path-to-node=&quot;12&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;13&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13&quot;&gt;3. '컨텍스트'는 금이다: 세션 관리의 기술&lt;/b&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;Claude의 성능은 대화 내용(컨텍스트 창)이 길어질수록 조금씩 떨어질 수 있습니다. 이를 관리하는 것이 실력입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;15&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,0,0&quot;&gt;/clear:&lt;/b&gt; 작업 주제가 바뀌면 이전 대화 내역을 지워 컨텍스트를 초기화하세요.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,1,0&quot;&gt;/compact:&lt;/b&gt; 대화가 너무 길어지면 중요한 맥락만 남기고 압축하세요.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,2,0&quot;&gt;서브에이전트 활용:&lt;/b&gt; &quot;서브에이전트를 써서 라이브러리 문서를 조사해와&quot;라고 시키세요. 메인 대화창은 깨끗하게 유지하면서 정보만 쏙 가져올 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;16&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;17&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17&quot;&gt;4. 우리 팀만의 규칙, CLAUDE.md 활용하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;18&quot; data-ke-size=&quot;size16&quot;&gt;프로젝트 루트에 CLAUDE.md 파일을 만들면, Claude가 매 세션마다 이 파일을 읽고 프로젝트 특성을 파악합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;19&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,0,0&quot;&gt;포함할 내용:&lt;/b&gt; 빌드 명령어, 테스트 실행법, 선호하는 코드 스타일(예: &quot;세미콜론 생략&quot;), 프로젝트 특유의 아키텍처 규칙.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,1,0&quot;&gt;장점:&lt;/b&gt; 매번 &quot;우리 프로젝트는 이렇게 짜야 해&quot;라고 설명할 필요가 없어집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;20&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;21&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;21&quot;&gt;5. 프롬프트는 구체적일수록 좋다&lt;/b&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;22&quot; data-ke-size=&quot;size16&quot;&gt;Claude는 독심술사가 아닙니다. 구체적인 가이드를 줄수록 결과물이 좋아집니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;23&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;23,0,0&quot;&gt;@파일명:&lt;/b&gt; &quot;그 파일&quot;이라고 하지 말고 @src/auth.ts 처럼 직접 지칭하세요.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;23,1,0&quot;&gt;패턴 참조:&lt;/b&gt; &quot;이미 구현된 @Notification.tsx 의 디자인 패턴을 참고해서 새로운 모달을 만들어줘&quot;라고 지시하세요.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;23,2,0&quot;&gt;이미지 활용:&lt;/b&gt; UI 수정 시에는 스크린샷을 터미널에 직접 붙여넣어 시각적인 피드백을 주세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;24&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;25&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;25&quot;&gt;6. CLI 도구와 MCP로 날개 달기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;26&quot; data-ke-size=&quot;size16&quot;&gt;Claude Code는 터미널 도구를 직접 다룰 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;27&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;27,0,0&quot;&gt;CLI 도구:&lt;/b&gt; gh(GitHub CLI), aws, npm 등을 설치해두면 Claude가 직접 PR을 올리거나 인프라 설정을 확인합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;27,1,0&quot;&gt;MCP (Model Context Protocol):&lt;/b&gt; 외부 데이터베이스나 Notion, Figma 등을 연결하면 Claude가 코드 밖의 정보까지 참조하여 작업합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;28&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;29&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;29&quot;&gt;7. 실수했을 땐? '되감기(Rewind)'와 '인터뷰'&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;30&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;30,0,0&quot;&gt;/rewind:&lt;/b&gt; Claude가 코드를 망쳐놨다면 당황하지 마세요. 체크포인트 기능을 통해 이전 상태(코드 및 대화)로 되돌릴 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;30,1,0&quot;&gt;나를 인터뷰해줘:&lt;/b&gt; 큰 기능을 만들 땐 &quot;이 기능을 구현하기 위해 필요한 정보를 나한테 질문해줘&quot;라고 시켜보세요. 여러분이 놓친 엣지 케이스를 Claude가 먼저 짚어줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;31&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;32&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;32&quot;&gt;마치며: Claude Code는 동료 엔지니어입니다&lt;/b&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;33&quot; data-ke-size=&quot;size16&quot;&gt;Claude Code를 단순한 '도구'가 아니라 &lt;b&gt;'함께 일하는 주니어~미들급 엔지니어' &lt;/b&gt;라고 생각해보세요. 명확한 업무 지시를 내리고, 결과물을 검토할 수 있는 환경(테스트)을 만들어준다면, 여러분의 생산성은 상상 이상으로 높아질 것입니다.&lt;/p&gt;</description>
      <category>Programmer/AI</category>
      <category>AI 에이전트</category>
      <category>AI 코딩</category>
      <category>Anthropic</category>
      <category>claude code</category>
      <category>CLAUDE.MD</category>
      <category>개발자 도구</category>
      <category>베스트 프랙티스</category>
      <category>생산성 향상</category>
      <category>코딩 가이드</category>
      <category>프로그래밍 꿀팁</category>
      <author>MoreLean</author>
      <guid isPermaLink="true">https://judekim.tistory.com/178</guid>
      <comments>https://judekim.tistory.com/178#entry178comment</comments>
      <pubDate>Fri, 23 Jan 2026 06:51:14 +0900</pubDate>
    </item>
    <item>
      <title>Claude Code에서 MCP vs Skills vs CLI - 무엇을 선택해야 할까?</title>
      <link>https://judekim.tistory.com/177</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;들어가며&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Claude Code에서 GitHub와 연동하려고 할 때, 선택지가 여러 개다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GitHub MCP 서버&lt;/li&gt;
&lt;li&gt;Skills (SKILL.md)&lt;/li&gt;
&lt;li&gt;gh CLI + CLAUDE.md&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;처음엔 당연히 MCP가 &quot;올바른&quot; 방법이라 생각했다. 공식적이고, 구조화되어 있고, 뭔가 있어 보이니까. 하지만 실제로 팀 프로젝트에 적용하려다 보니 예상치 못한 문제를 만났다.&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;문제의 시작: 팀 프로젝트에서 토큰 공유&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;프로젝트 레벨의 MCP 설정(.mcp.json)을 git으로 공유하려 했다. 그런데 GitHub MCP는 인증 토큰이 필요하다.&lt;/p&gt;
&lt;pre class=&quot;json&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;{
  &quot;github&quot;: {
    &quot;command&quot;: &quot;npx&quot;,
    &quot;args&quot;: [&quot;-y&quot;, &quot;@modelcontextprotocol/server-github&quot;],
    &quot;env&quot;: {
      &quot;GITHUB_PERSONAL_ACCESS_TOKEN&quot;: &quot;ghp_xxxxx...&quot;  // 이걸 커밋한다고?
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;개인 토큰을 git에 커밋할 수는 없다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;${GITHUB_PAT}&lt;span&gt;&amp;nbsp;&lt;/span&gt;같은 환경 변수 interpolation을 시도해봤지만, stdio 타입의 env 섹션에서만 제한적으로 지원되고 HTTP headers에서는 동작하지 않았다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;GitHub Issue에서도 같은 고민을 하는 개발자들이 많았다:&lt;/p&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;&quot;I am preparing a shared .mcp.json file that I want to commit to our repository, but facing an issue in how to authenticate...&quot;&lt;/blockquote&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Anthropic은 뭐라고 할까?&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;놀랍게도 Anthropic 공식 best practices 문서에서는 이렇게 말한다:&lt;/p&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;&quot;Claude knows how to use the gh CLI to interact with GitHub for creating issues, opening pull requests, reading comments, and more.&quot;&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;심지어 공식 슬래시 커맨드 예제에서도:&lt;/p&gt;
&lt;pre class=&quot;basic&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;Remember to use the GitHub CLI ('gh') for all GitHub-related tasks.&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;MCP 대신 gh CLI를 쓰라고 가이드하고 있다.&lt;/b&gt;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;MCP의 숨겨진 비용: 컨텍스트 윈도우&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;MCP를 깊이 살펴보니 더 근본적인 문제가 있었다. MCP는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;모든 tool definitions을 미리 로드&lt;/b&gt;한다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;/context 명령어로 확인해보면:

System prompt: xxxxx tokens
MCP tools: 8,000+ tokens  &amp;larr; GitHub MCP 하나만으로
Messages: xxxxx tokens
Free space: ...&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Armin Ronacher(Flask 창시자)도 비슷한 경험을 공유했다:&lt;/p&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;&quot;The Sentry MCP is probably one of the better designed MCPs out there, but I don't use it anymore. When I load it into the context right away I lose around 8k tokens out of the box.&quot;&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;8,000 토큰이면 꽤 긴 대화를 할 수 있는 양이다. MCP 서버 하나 연결했다고 그만큼 날리는 건 비효율적이다.&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Skills: 더 똑똑한 대안&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Skills는 완전히 다른 접근을 한다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Progressive Disclosure&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- 필요할 때만 로드한다.&lt;/p&gt;
&lt;pre class=&quot;asciidoc&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;세션 시작 시:
- Skill 이름과 설명만 로드 (~수십 토큰)
- 전체 instructions는 아직 로드 안 함

관련 작업 요청 시:
- 그제서야 full SKILL.md 로드
- 스크립트 실행 결과만 컨텍스트에 추가 (스크립트 코드 자체는 0 토큰)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이걸 &quot;매트릭스 방식&quot;이라고 부르는 사람도 있다:&lt;/p&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;&quot;Skills load on-demand, just like Neo in The Matrix (1999). 'I know Kung Fu'&quot;&lt;/blockquote&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Skills vs MCP: 핵심 차이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관점MCPSkills&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&gt;&lt;b&gt;로딩 방식&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Upfront (미리 전부)&lt;/td&gt;
&lt;td&gt;On-demand (필요할 때)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;컨텍스트 비용&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;도구당 100~300 토큰 (항상)&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;Connectivity (연결)&lt;/td&gt;
&lt;td&gt;Expertise (전문성)&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;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;MCP 클라이언트 필요&lt;/td&gt;
&lt;td&gt;파일시스템 접근만 있으면 됨&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Simon Willison은 이렇게 평가했다:&lt;/p&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;&quot;Skills are (maybe) a bigger deal than MCP.&quot;&lt;/blockquote&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;언제 뭘 써야 할까?&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Anthropic의 공식 가이드를 보면 명확하다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;MCP&lt;/b&gt;: Claude가 접근할 수 없는 외부 시스템 연결 (데이터베이스, 사내 API 등)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Skills&lt;/b&gt;: Claude가 그 연결을&lt;span&gt;&amp;nbsp;&lt;/span&gt;어떻게&lt;span&gt;&amp;nbsp;&lt;/span&gt;활용할지 가르치기&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;&quot;MCP handles connectivity. Skills handle expertise.&quot;&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;즉, MCP는 &quot;문을 열어주는 것&quot;이고, Skills는 &quot;문 안에서 뭘 할지 가르치는 것&quot;이다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그런데 gh CLI는?&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이미 설치되어 있고, Claude가 잘 알고 있다. 새로운 &quot;문&quot;을 열 필요가 없다.&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;실용적인 결론: GitHub 연동은 CLAUDE.md로&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;GitHub처럼 잘 알려진 도구는 굳이 MCP를 쓸 필요가 없다:&lt;/p&gt;
&lt;pre class=&quot;markdown&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;# CLAUDE.md

## GitHub 사용

이 프로젝트는 gh CLI를 사용합니다.
각 개발자는 `gh auth login` 완료 상태여야 합니다.

### PR 워크플로우
- PR 생성: `gh pr create --title &quot;...&quot; --body &quot;...&quot;`
- PR 리뷰 요청: `gh pr edit --add-reviewer @username`
- PR 머지: `gh pr merge --squash`

### 브랜치 컨벤션
- feature/xxx, fix/xxx, refactor/xxx 형태로 생성
- main 브랜치 직접 push 금지

### 커밋 메시지
- feat: 새로운 기능
- fix: 버그 수정
- refactor: 리팩토링&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 방식의 장점:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;토큰 공유 문제 없음&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- 각자&lt;span&gt;&amp;nbsp;&lt;/span&gt;gh auth login만 하면 됨&lt;/li&gt;
&lt;li&gt;&lt;b&gt;컨텍스트 효율적&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- 필요할 때 참조&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프로젝트 컨벤션 포함&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- 단순 도구 연결 이상의 가치&lt;/li&gt;
&lt;li&gt;&lt;b&gt;git으로 바로 공유&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- 추가 설정 불필요&lt;/li&gt;
&lt;li&gt;&lt;b&gt;커스터마이징 자유로움&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- 팀 워크플로우에 맞게 조정 가능&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;그래서 MCP는 언제 쓰나?&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;MCP가 빛을 발하는 경우:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;사내 전용 시스템&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- Claude가 전혀 모르는 API&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터베이스 직접 연결&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- PostgreSQL, MongoDB 등&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SaaS 통합&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- Notion, Slack, Jira 등의 실시간 데이터&lt;/li&gt;
&lt;li&gt;&lt;b&gt;파일시스템 없는 환경&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- Claude.ai 웹에서 외부 연결 필요 시&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;반면 이런 경우는 MCP 대신 다른 방법을:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;gh, git, docker&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;같은 표준 CLI &amp;rarr; CLAUDE.md&lt;/li&gt;
&lt;li&gt;&lt;b&gt;복잡한 워크플로우 가이드&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; Skills&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자주 안 쓰는 도구&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; Skills (on-demand 로딩)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;마치며&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;처음엔 &quot;MCP가 더 있어 보이니까&quot;라는 이유로 선택하려 했다. 하지만 실제로 부딪혀보니:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;팀 프로젝트에서 토큰 공유 문제&lt;/li&gt;
&lt;li&gt;컨텍스트 윈도우를 상시 점유하는 비효율&lt;/li&gt;
&lt;li&gt;Anthropic조차 gh CLI를 권장하는 현실&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;결국&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;도구 선택은 &quot;있어 보이는 것&quot;이 아니라 &quot;실제로 효율적인 것&quot;&lt;/b&gt;을 기준으로 해야 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새로운 외부 시스템 연결? &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;MCP&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;복잡한 도메인 전문성? &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Skills&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;잘 알려진 CLI 도구? &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;CLAUDE.md&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;세 가지는 경쟁 관계가 아니라 상호 보완 관계다. 상황에 맞게 조합해서 쓰면 된다.&lt;/p&gt;</description>
      <category>Programmer/AI</category>
      <category>ai agent</category>
      <category>AI 코딩</category>
      <category>Anthropic</category>
      <category>claude code</category>
      <category>CLAUDE.MD</category>
      <category>gh CLI</category>
      <category>github</category>
      <category>mcp</category>
      <category>skills</category>
      <category>개발자 도구</category>
      <author>MoreLean</author>
      <guid isPermaLink="true">https://judekim.tistory.com/177</guid>
      <comments>https://judekim.tistory.com/177#entry177comment</comments>
      <pubDate>Wed, 21 Jan 2026 09:20:40 +0900</pubDate>
    </item>
    <item>
      <title>Claude Code 생산성 10배 올리기: 키보드부터 자동화까지</title>
      <link>https://judekim.tistory.com/176</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;키보드 단축키부터 외우세요.&lt;/b&gt; Cmd+K는 퀵 액션, Cmd+Shift+P는 명령 팔레트, Cmd+/는 주석 토글, Cmd+D는 같은 단어 선택... 이런 거 손에 익으면 마우스 안 쓰고도 코딩할 수 있어요.&amp;nbsp;처음엔 느려도 &lt;b&gt;1주일만 연습하면 2배는 빨라져요&lt;/b&gt;.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;TL;DR&lt;/h2&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;: Escape(중단), Double-Escape(되감기), Tab(자동완성)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프롬프트&lt;/b&gt;: 구체적 + 컨텍스트 = 최고의 결과물&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자동 커밋&lt;/b&gt;: Stop Hook으로 세션 종료 시 자동 커밋&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PR 템플릿&lt;/b&gt;: .github/pull_request_template.md로 표준화&lt;/li&gt;
&lt;li&gt;&lt;b&gt;/clear 자주&lt;/b&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;h2 data-ke-size=&quot;size26&quot;&gt;1. 키보드 단축키 마스터하기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Claude Code 핵심 단축키&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Press &lt;b&gt;Escape to interrupt Claude&lt;/b&gt; during any phase (thinking, tool calls, file edits), preserving context so you can redirect or expand instructions.&quot; &amp;mdash; &lt;a href=&quot;https://www.anthropic.com/engineering/claude-code-best-practices&quot;&gt;Anthropic Best Practices&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단축키 기능 사용 시점&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Escape&lt;/td&gt;
&lt;td&gt;작업 중단&lt;/td&gt;
&lt;td&gt;Claude가 잘못된 방향으로 갈 때&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escape &amp;times; 2&lt;/td&gt;
&lt;td&gt;히스토리 되감기&lt;/td&gt;
&lt;td&gt;이전 프롬프트로 돌아가기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tab&lt;/td&gt;
&lt;td&gt;파일/폴더 자동완성&lt;/td&gt;
&lt;td&gt;@src/c + Tab &amp;rarr; @src/components/&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shift+Tab&lt;/td&gt;
&lt;td&gt;Permission 모드 순환&lt;/td&gt;
&lt;td&gt;normal &amp;rarr; auto-accept &amp;rarr; plan 모드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;uarr; / &amp;darr;&lt;/td&gt;
&lt;td&gt;명령 히스토리&lt;/td&gt;
&lt;td&gt;이전 명령 재사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ctrl+C &amp;times; 2&lt;/td&gt;
&lt;td&gt;강제 종료&lt;/td&gt;
&lt;td&gt;완전히 나가기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ctrl+R&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;Bash 스타일 편집&lt;/h3&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;Ctrl+A        &amp;rarr; 줄 맨 앞으로
Ctrl+E        &amp;rarr; 줄 맨 뒤로
Option+F      &amp;rarr; 단어 앞으로 (&amp;rarr;)
Option+B      &amp;rarr; 단어 뒤로 (&amp;larr;)
Ctrl+W        &amp;rarr; 이전 단어 삭제
Ctrl+U        &amp;rarr; 줄 전체 삭제
&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;macOS 팁:&lt;/b&gt; Option 키가 안 먹힌다면 터미널 설정에서 &quot;Use Option as Meta Key&quot; 활성화하세요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;iTerm2: Settings &amp;rarr; Profiles &amp;rarr; Keys &amp;rarr; Left Option &amp;rarr; Esc+&lt;/li&gt;
&lt;li&gt;Terminal.app: Settings &amp;rarr; Profiles &amp;rarr; Keyboard &amp;rarr; Use Option as Meta Key&lt;/li&gt;
&lt;/ul&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;Shift+Enter로 여러 줄 프롬프트 작성:&lt;/p&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;&amp;gt; &quot;1. 로그인 버튼 만들어줘
   2. 파란색 배경에 흰 글씨
   3. 호버하면 진한 파란색
   4. 클릭하면 /auth/login API 호출&quot;
&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; iTerm2, WezTerm, Ghostty, Kitty에서는 기본 작동. VS Code나 Alacritty에서는 /terminal-setup 실행 필요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;셸 Alias 설정&lt;/h3&gt;
&lt;pre class=&quot;monkey&quot;&gt;&lt;code&gt;# ~/.zshrc 또는 ~/.bashrc
alias c=&quot;claude&quot;
alias cc=&quot;claude --continue&quot;
alias cr=&quot;claude --resume&quot;
alias cy=&quot;claude --dangerously-skip-permissions&quot;  # 주의!

# 프로젝트별 단축키
alias dev=&quot;claude 'Start development session'&quot;
alias review=&quot;claude '/review'&quot;
alias commit=&quot;claude '/commit'&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;2. 프롬프트 작성의 기술&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;구체적일수록 좋다&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;The difference between a vague instruction and a well-crafted prompt can mean the gap between generic outputs and &lt;b&gt;exactly what you need&lt;/b&gt;.&quot; &amp;mdash; &lt;a href=&quot;https://claude.com/blog/best-practices-for-prompt-engineering&quot;&gt;Claude Blog&lt;/a&gt;&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;pre class=&quot;&quot;&gt;&lt;code&gt;버튼 만들어줘
&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;awk&quot;&gt;&lt;code&gt;파란색(#3B82F6) 배경에 흰 글씨, 
호버하면 진한 파란색(#2563EB), 
클릭하면 /auth/login API 호출하는 로그인 버튼 만들어줘.
이 버튼은 로그인 폼에 들어가고, 
로딩 중에는 스피너 표시해야 해.
Tailwind CSS 사용하고 있어.
&lt;/code&gt;&lt;/pre&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. 무엇을 (WHAT)     &amp;rarr; &quot;로그인 버튼 만들어줘&quot;                     │
│  2. 어디에 (WHERE)    &amp;rarr; &quot;이 버튼은 로그인 폼에 들어가&quot;               │
│  3. 어떻게 (HOW)      &amp;rarr; &quot;파란색 배경, 흰 글씨&quot;                    │
│  4. 왜 (WHY)          &amp;rarr; &quot;사용자가 쉽게 찾을 수 있도록&quot;             │
│  5. 제약사항          &amp;rarr; &quot;Tailwind CSS, TypeScript 사용&quot;        │
└─────────────────────────────────────────────────────────────┘&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;@ 태그로 파일 참조&lt;/h3&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;# 파일 직접 참조
@src/components/Button.tsx 이 버튼 스타일 참고해서 만들어줘

# 폴더 참조
@src/styles/ 여기 있는 스타일 컨벤션 따라줘

# Tab 자동완성 활용
@src/c[Tab] &amp;rarr; @src/components/
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;이미지로 설명하기&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Paste screenshots (pro tip: hit &lt;b&gt;cmd+ctrl+shift+4&lt;/b&gt; in macOS to screenshot to clipboard and &lt;b&gt;ctrl+v&lt;/b&gt; to paste).&quot; &amp;mdash; &lt;a href=&quot;https://www.anthropic.com/engineering/claude-code-best-practices&quot;&gt;Anthropic Best Practices&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;# 1. 스크린샷 찍기 (macOS)
cmd+ctrl+shift+4  # 클립보드에 저장

# 2. Claude Code에 붙여넣기
ctrl+v  # (주의: cmd+v 아님!)

# 3. 프롬프트와 함께
&quot;이 디자인 목업 보고 똑같이 만들어줘&quot;
&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;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&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;예시(few-shot) 추가&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;&quot;서론 없이 바로 답변해줘&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;정보를 지어냄&lt;/td&gt;
&lt;td&gt;&quot;모르면 모른다고 해도 돼&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;제안만 하고 구현 안 함&lt;/td&gt;
&lt;td&gt;&quot;이 함수를 수정해줘&quot; (명령형)&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;3. /clear 습관 들이기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;왜 /clear가 중요한가?&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;b&gt;Use the /clear command frequently&lt;/b&gt; between tasks to reset the context window.&quot; &amp;mdash; &lt;a href=&quot;https://www.anthropic.com/engineering/claude-code-best-practices&quot;&gt;Anthropic Best Practices&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│              컨텍스트 오염 문제                                  │
│                                                             │
│  긴 세션 동안:                                                 │
│  &amp;bull; 오래된 대화가 쌓임                                            │
│  &amp;bull; 관련 없는 파일 내용이 쌓임                                     │
│  &amp;bull; 이전 명령 출력이 쌓임                                         │
│                                                             │
│  결과:                                                       │
│  &amp;bull; 성능 저하                                                  │
│  &amp;bull; Claude가 산만해짐                                           │
│  &amp;bull; 토큰 낭비                                                  │
└─────────────────────────────────────────────────────────────┘&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;/clear 사용 타이밍&lt;/h3&gt;
&lt;pre class=&quot;gauss&quot;&gt;&lt;code&gt;# 새 작업 시작할 때
/clear

# 완전히 다른 주제로 넘어갈 때
/clear

# Claude가 이상하게 행동할 때
/clear

# 긴 디버깅 세션 후
/clear
&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;Pro tip:&lt;/b&gt; &quot;Every time you start something new, clear the chat. You don't need all that history eating your tokens.&quot; &amp;mdash; &lt;a href=&quot;https://www.builder.io/blog/claude-code&quot;&gt;Builder.io&lt;/a&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;4. 자동 커밋 설정&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;Stop Hook으로 자동 커밋&lt;/h3&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;// .claude/settings.json
{
  &quot;hooks&quot;: {
    &quot;Stop&quot;: [
      {
        &quot;matcher&quot;: &quot;&quot;,
        &quot;hooks&quot;: [
          {
            &quot;type&quot;: &quot;command&quot;,
            &quot;command&quot;: &quot;git add -A &amp;amp;&amp;amp; git commit -m 'auto: WIP checkpoint' --allow-empty || true&quot;
          }
        ]
      }
    ]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;프롬프트 내용을 커밋 메시지로&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;It's fairly straightforward to change the notification into a git commit -m checkpoint... However, let's make it slightly better by &lt;b&gt;using the prompt itself as the commit message&lt;/b&gt;.&quot; &amp;mdash; &lt;a href=&quot;https://blog.gitbutler.com/automate-your-ai-workflows-with-claude-code-hooks&quot;&gt;GitButler Blog&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;#!/bin/bash
# .claude/hooks/auto-commit.sh

# Hook input에서 프롬프트 추출
INPUT=$(cat)
PROMPT=$(echo &quot;$INPUT&quot; | jq -r '.prompt // &quot;WIP checkpoint&quot;' | head -c 72)

# 변경사항 있으면 커밋
if ! git diff --quiet HEAD 2&amp;gt;/dev/null; then
    git add -A
    git commit -m &quot;auto: $PROMPT&quot;
fi
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;// .claude/settings.json
{
  &quot;hooks&quot;: {
    &quot;Stop&quot;: [
      {
        &quot;matcher&quot;: &quot;&quot;,
        &quot;hooks&quot;: [
          {
            &quot;type&quot;: &quot;command&quot;,
            &quot;command&quot;: &quot;bash .claude/hooks/auto-commit.sh&quot;
          }
        ]
      }
    ]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;GitButler 통합 (고급)&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;GitButler uses a mix of PreToolUse, PostToolUse, and Stop hooks to &lt;b&gt;automatically stage file changes and create new commits&lt;/b&gt;. They can even &lt;b&gt;isolate work from different Claude sessions into separate branches&lt;/b&gt; automatically.&quot; &amp;mdash; &lt;a href=&quot;https://www.eesel.ai/blog/claude-code-hooks&quot;&gt;eesel.ai&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;hooks&quot;: {
    &quot;PreToolUse&quot;: [
      {
        &quot;matcher&quot;: &quot;Edit|MultiEdit|Write&quot;,
        &quot;hooks&quot;: [{ &quot;type&quot;: &quot;command&quot;, &quot;command&quot;: &quot;but claude pre-tool&quot; }]
      }
    ],
    &quot;PostToolUse&quot;: [
      {
        &quot;matcher&quot;: &quot;Edit|MultiEdit|Write&quot;,
        &quot;hooks&quot;: [{ &quot;type&quot;: &quot;command&quot;, &quot;command&quot;: &quot;but claude post-tool&quot; }]
      }
    ],
    &quot;Stop&quot;: [
      {
        &quot;matcher&quot;: &quot;&quot;,
        &quot;hooks&quot;: [{ &quot;type&quot;: &quot;command&quot;, &quot;command&quot;: &quot;but claude stop&quot; }]
      }
    ]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결과:&lt;/b&gt; 여러 Claude 세션을 동시에 돌려도 각 세션의 변경사항이 별도 브랜치로 자동 분리!&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. PR 템플릿 만들기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매번 PR 설명 쓰기 귀찮잖아요. 템플릿 만들어두면 &lt;b&gt;빈칸만 채우면 돼요&lt;/b&gt;. 팀원들도 리뷰하기 편해져요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 템플릿&lt;/h3&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;!-- .github/pull_request_template.md --&amp;gt;

##   변경 사항
&amp;lt;!-- 이 PR에서 변경된 내용을 설명해주세요 --&amp;gt;


##   관련 이슈
&amp;lt;!-- Closes #123 형식으로 연결 --&amp;gt;
Closes #

## ✅ 테스트 방법
&amp;lt;!-- 이 변경사항을 어떻게 테스트할 수 있나요? --&amp;gt;
1. 
2. 
3. 

##   스크린샷 (UI 변경 시)
&amp;lt;!-- 변경 전/후 스크린샷을 첨부해주세요 --&amp;gt;
| Before | After |
|--------|-------|
|        |       |

## ✔️ 체크리스트
- [ ] 코드가 프로젝트 스타일 가이드를 따름
- [ ] 셀프 리뷰 완료
- [ ] 테스트 추가/수정 완료
- [ ] 문서 업데이트 (필요시)

##   리뷰어에게
&amp;lt;!-- 리뷰어가 특히 봐줬으면 하는 부분이 있나요? --&amp;gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Claude가 PR 자동 생성하게 하기&lt;/h3&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;&amp;lt;!-- .claude/commands/pr.md --&amp;gt;
---
description: &quot;PR 생성하기&quot;
allowed-tools: [&quot;Bash(git:*)&quot;, &quot;Bash(gh:*)&quot;]
---

# PR 생성

현재 브랜치의 변경사항으로 PR을 생성해줘.

## 단계
1. `git diff main...HEAD`로 변경사항 확인
2. 변경 내용 분석하여 PR 제목과 설명 작성
3. `.github/pull_request_template.md` 양식 따르기
4. `gh pr create` 명령으로 PR 생성

## PR 제목 형식
`&amp;lt;type&amp;gt;: &amp;lt;description&amp;gt;`

Types: feat, fix, docs, style, refactor, test, chore

## 인자
$ARGUMENTS
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용:&lt;/p&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;&amp;gt; /pr 로그인 기능 추가
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Claude로 PR 자동 리뷰&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Claude will add a &lt;b&gt;claude-code-review.yml&lt;/b&gt; file with a prompt already in it.&quot; &amp;mdash; &lt;a href=&quot;https://www.builder.io/blog/claude-code&quot;&gt;Builder.io&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;# GitHub App 설치
/install-github-app
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 후 PR에 @claude 멘션하면 자동 리뷰!&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;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;명령어 저장 위치&lt;/h3&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;~/.claude/commands/       # 개인용 (모든 프로젝트)
.claude/commands/         # 프로젝트용 (팀 공유)
&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;b&gt;빠른 커밋:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;&amp;lt;!-- .claude/commands/commit.md --&amp;gt;
---
description: &quot;AI가 커밋 메시지 작성&quot;
allowed-tools: [&quot;Bash(git:*)&quot;]
---

1. `git status`와 `git diff`로 변경사항 확인
2. Conventional Commit 형식으로 메시지 작성
3. 형식: `&amp;lt;emoji&amp;gt; &amp;lt;type&amp;gt;: &amp;lt;description&amp;gt;`
   - ✨ feat,   fix,   docs, ♻️ refactor
4. `git commit` 실행
&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;yaml&quot;&gt;&lt;code&gt;&amp;lt;!-- .claude/commands/test.md --&amp;gt;
---
description: &quot;변경된 파일 관련 테스트 실행&quot;
---

1. `git diff --name-only`로 변경된 파일 확인
2. 관련 테스트 파일 찾기
3. 해당 테스트만 실행
4. 실패하면 수정 제안
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GitHub 이슈 처리:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;&amp;lt;!-- .claude/commands/fix-issue.md --&amp;gt;
---
description: &quot;GitHub 이슈 분석하고 수정&quot;
allowed-tools: [&quot;Bash(gh:*)&quot;, &quot;Bash(git:*)&quot;]
---

GitHub 이슈 #$ARGUMENTS 분석하고 수정해줘:

1. `gh issue view $ARGUMENTS`로 이슈 내용 확인
2. 관련 코드 찾기
3. 수정 구현
4. 테스트 작성
5. 커밋하고 PR 생성
6. PR을 이슈에 연결
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용:&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;&amp;gt; /fix-issue 123
&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;세션 이어가기&lt;/h3&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;# 가장 최근 세션 이어가기
claude --continue
# 또는
claude -c

# 특정 세션 재개
claude --resume abc123
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;claude -c &lt;b&gt;preserves previous context&lt;/b&gt; when resuming work, making it effective for long refactoring sessions or phased feature implementations.&quot; &amp;mdash; &lt;a href=&quot;https://smartscope.blog/en/generative-ai/claude/claude-code-reference-guide/&quot;&gt;SmartScope&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.md에 상태 저장:&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;!-- CLAUDE.md 추가 --&amp;gt;

## Current Task
- 로그인 기능 구현 중
- 완료: API 엔드포인트
- 진행중: 프론트엔드 폼
- TODO: 에러 핸들링

## Session Notes
- 2024-01-15: OAuth 연동 시작
- 이슈: 리프레시 토큰 만료 처리 필요
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;As you approach your token budget limit, &lt;b&gt;save your current progress and state to memory&lt;/b&gt; before the context window refreshes.&quot; &amp;mdash; &lt;a href=&quot;https://docs.claude.com/en/docs/build-with-claude/prompt-engineering/claude-4-best-practices&quot;&gt;Claude Docs&lt;/a&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;8. 헤드리스 모드 (CI/CD 자동화)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;비대화형 실행&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Claude Code includes headless mode for non-interactive contexts like &lt;b&gt;CI, pre-commit hooks, build scripts, and automation&lt;/b&gt;.&quot; &amp;mdash; &lt;a href=&quot;https://www.anthropic.com/engineering/claude-code-best-practices&quot;&gt;Anthropic Best Practices&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;# 단일 명령 실행
claude -p &quot;이 코드 보안 취약점 검사해줘&quot;

# JSON 출력
claude -p &quot;코드 분석해줘&quot; --output-format json

# 도구 제한 + 턴 제한
claude -p &quot;보안 리뷰해줘&quot; \
  --allowedTools Read,Grep,Glob \
  --max-turns 3 \
  &amp;gt; security_report.json
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Pre-commit Hook&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# .pre-commit-config.yaml
repos:
  - repo: local
    hooks:
      - id: claude-review
        name: Claude Code Review
        entry: claude -p &quot;이 diff에서 버그나 보안 이슈 찾아줘&quot; --max-turns 2
        language: system
        pass_filenames: false
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;GitHub Actions 연동&lt;/h3&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;# .github/workflows/claude-review.yml
name: Claude Review
on: [pull_request]

jobs:
  review:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Claude Review
        run: |
          claude -p &quot;PR 변경사항 리뷰해줘: $(git diff origin/main)&quot; \
            --output-format json \
            &amp;gt; review.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;9. 생산성 극대화 패턴&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;패턴 1: 병렬 세션&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;You could have one session working on a new feature, another fixing a bug, and a third refactoring some old code, all without the usual pain of stashing changes.&quot; &amp;mdash; &lt;a href=&quot;https://www.eesel.ai/blog/git-workflows-claude-code&quot;&gt;eesel.ai&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# 터미널 1: 새 기능
cd ~/project &amp;amp;&amp;amp; git worktree add ../feature-login feature-login
cd ../feature-login &amp;amp;&amp;amp; claude

# 터미널 2: 버그 수정
cd ~/project &amp;amp;&amp;amp; git worktree add ../bugfix-auth bugfix-auth
cd ../bugfix-auth &amp;amp;&amp;amp; claude

# 터미널 3: 리팩토링
cd ~/project &amp;amp;&amp;amp; git worktree add ../refactor-api refactor-api
cd ../refactor-api &amp;amp;&amp;amp; claude
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;패턴 2: Claude가 Claude 리뷰&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;A simple but effective approach is to have &lt;b&gt;one Claude write code while another reviews or tests it&lt;/b&gt;.&quot; &amp;mdash; &lt;a href=&quot;https://www.anthropic.com/engineering/claude-code-best-practices&quot;&gt;Anthropic Best Practices&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# 터미널 1: 코드 작성
claude &quot;로그인 기능 구현해줘&quot;

# 터미널 2: 리뷰
claude &quot;src/auth/ 폴더 코드 리뷰해줘. 보안 이슈 중점으로.&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;패턴 3: 온보딩 가속&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;At Anthropic, using Claude Code in this way has become our &lt;b&gt;core onboarding workflow&lt;/b&gt;, significantly improving ramp-up time.&quot; &amp;mdash; &lt;a href=&quot;https://www.anthropic.com/engineering/claude-code-best-practices&quot;&gt;Anthropic Best Practices&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;# 새 프로젝트 이해하기
claude &quot;이 프로젝트 구조 설명해줘&quot;
claude &quot;인증 시스템이 어떻게 작동하는지 설명해줘&quot;
claude &quot;이 함수가 왜 이렇게 설계됐는지 git 히스토리 보고 알려줘&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;10. 체크리스트&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;[ ] 어제 세션 이어가기: claude -c&lt;/li&gt;
&lt;li&gt;[ ] CLAUDE.md에 오늘 할 일 업데이트&lt;/li&gt;
&lt;li&gt;[ ] /clear로 깨끗한 시작&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;[ ] /clear&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;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;/li&gt;
&lt;li&gt;[ ] 커밋 메시지 정리 (squash/reword)&lt;/li&gt;
&lt;li&gt;[ ] /pr로 PR 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;키보드 연습 (1주일)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[ ] Day 1-2: Escape, Tab, &amp;uarr;/&amp;darr; 익히기&lt;/li&gt;
&lt;li&gt;[ ] Day 3-4: Ctrl+A/E, Ctrl+W 익히기&lt;/li&gt;
&lt;li&gt;[ ] Day 5-7: 셸 alias 설정하고 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&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; &amp;mdash; Option을 Meta로 설정&lt;/li&gt;
&lt;li&gt;&lt;b&gt;셸 alias 추가&lt;/b&gt; &amp;mdash; c, cc, cr&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자동 커밋 Hook&lt;/b&gt; &amp;mdash; Stop 이벤트에 git commit&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PR 템플릿&lt;/b&gt; &amp;mdash; .github/pull_request_template.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;b&gt;Escape&lt;/b&gt; &amp;mdash; 잘못 가면 바로 중단&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Double-Escape&lt;/b&gt; &amp;mdash; 되감기&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Tab&lt;/b&gt; &amp;mdash; 파일 자동완성&lt;/li&gt;
&lt;li&gt;&lt;b&gt;/clear&lt;/b&gt; &amp;mdash; 새 작업마다 리셋&lt;/li&gt;
&lt;li&gt;&lt;b&gt;구체적 프롬프트&lt;/b&gt; &amp;mdash; 컨텍스트가 생명&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Pro tip: use /clear often. Every time you start something new, clear the chat. You don't need all that history eating your tokens.&quot; &amp;mdash; &lt;a href=&quot;https://www.builder.io/blog/claude-code&quot;&gt;Builder.io&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음엔 느려도 &lt;b&gt;1주일만 연습하면 2배는 빨라져요&lt;/b&gt;. 마우스 안 쓰고 키보드만으로 코딩하는 그 날이 올 거예요. 화이팅!  &lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고 자료&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Anthropic 공식&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;a href=&quot;https://www.anthropic.com/engineering/claude-code-best-practices&quot;&gt;Claude Code Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.anthropic.com/en/docs/claude-code/interactive-mode&quot;&gt;Interactive Mode - Keyboard Shortcuts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://claude.com/blog/best-practices-for-prompt-engineering&quot;&gt;Prompt Engineering Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.claude.com/en/docs/build-with-claude/prompt-engineering/claude-4-best-practices&quot;&gt;Claude 4 Prompting Best Practices&lt;/a&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.gitbutler.com/automate-your-ai-workflows-with-claude-code-hooks&quot;&gt;GitButler - Claude Code Hooks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.builder.io/blog/claude-code&quot;&gt;How I use Claude Code&lt;/a&gt; &amp;mdash; Builder.io 팁&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://awesomeclaude.ai/code-cheatsheet&quot;&gt;Claude Code Cheatsheet&lt;/a&gt; &amp;mdash; 단축키 총정리&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.eesel.ai/blog/hooks-in-claude-code&quot;&gt;eesel.ai - Hooks Guide&lt;/a&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://gitbutler.com/&quot;&gt;GitButler&lt;/a&gt; &amp;mdash; 자동 브랜치 관리&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Dev-GOM/claude-code-marketplace&quot;&gt;Claude Code Marketplace&lt;/a&gt; &amp;mdash; 플러그인 모음&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programmer/AI</category>
      <category>claude code</category>
      <category>git</category>
      <category>hooks</category>
      <category>PR 템플릿</category>
      <category>Productivity</category>
      <category>Shortcuts</category>
      <category>생산성</category>
      <category>자동화</category>
      <category>키보드 단축키</category>
      <category>프롬프트</category>
      <author>MoreLean</author>
      <guid isPermaLink="true">https://judekim.tistory.com/176</guid>
      <comments>https://judekim.tistory.com/176#entry176comment</comments>
      <pubDate>Wed, 21 Jan 2026 01:17:05 +0900</pubDate>
    </item>
    <item>
      <title>Claude Code 보안 Best Practices: 타협 없는 안전한 AI 코딩</title>
      <link>https://judekim.tistory.com/175</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;보안은 절대 타협하면 안 돼요. &lt;b&gt;Rules 시스템 적극 활용하세요.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CLAUDE.md에 &quot;API 키 절대 하드코딩 금지, 환경 변수 무조건 사용&quot; 이렇게 박아두면 Claude Code가 지켜줘요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Security Reviewer Agent&lt;/b&gt;도 돌려보세요. SQL 인젝션, XSS, CSRF 같은 취약점 자동으로 찾아내요. 배포 전에 꼭 한 번 체크하는 습관 들이세요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;TL;DR&lt;/h2&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;: Claude를 &quot;똑똑하지만 신뢰할 수 없는 인턴&quot;으로 대하기&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Permission 시스템&lt;/b&gt;: allow/deny/ask 규칙으로 세밀하게 제어&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Sandbox&lt;/b&gt;: /sandbox로 파일시스템 + 네트워크 격리 (84% 권한 요청 감소)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;민감 파일 차단&lt;/b&gt;: .env, ~/.ssh/, ~/.aws/ 접근 deny&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CLAUDE.md&lt;/b&gt;: 보안 규칙 명시 (API 키 하드코딩 금지 등)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PreToolUse Hooks&lt;/b&gt;: 가장 강력한 보안 경계 (파일/명령 차단)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Trail of Bits Skills&lt;/b&gt;: 전문 보안 감사 도구 활용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;절대 root로 실행 금지&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;핵심 보안 철학&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Claude = &quot;똑똑하지만 신뢰할 수 없는 인턴&quot;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Organizations must treat Claude Code as a &lt;b&gt;'brilliant but untrusted intern'&lt;/b&gt;&amp;mdash;capable of excellent work but requiring human review of all security-critical changes.&quot; &amp;mdash; &lt;a href=&quot;https://www.mintmcp.com/blog/claude-code-security&quot;&gt;MintMCP Blog&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code는 강력하지만, 다음을 기억하세요:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude가 할 수 있는 것 위험&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&gt;.env 파일 읽기&lt;/td&gt;
&lt;td&gt;API 키 노출&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSH 키 접근&lt;/td&gt;
&lt;td&gt;서버 침투&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bash 명령 실행&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;MCP 서버 연결&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;Zero Trust 원칙&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;To enhance security, treat Claude Code as an assistant requiring supervision. Implement external SAST/DAST tools, run it in sandboxed environments, and establish strict, &lt;b&gt;'deny-by-default'&lt;/b&gt; configurations for permissions.&quot; &amp;mdash; &lt;a href=&quot;https://www.eesel.ai/blog/security-claude-code&quot;&gt;eesel.ai&lt;/a&gt;&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;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Permission 시스템 설정&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;공식 Permission 구조&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Claude Code uses &lt;b&gt;strict read-only permissions by default&lt;/b&gt;. When additional actions are needed (editing files, running tests, executing commands), Claude Code requests explicit permission.&quot; &amp;mdash; &lt;a href=&quot;https://docs.anthropic.com/en/docs/claude-code/security&quot;&gt;Anthropic Security Docs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3가지 규칙 타입&lt;/h3&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;permissions&quot;: {
    &quot;allow&quot;: [...],  // 자동 승인 (안전한 작업)
    &quot;ask&quot;: [...],    // 매번 확인
    &quot;deny&quot;: [...]    // 완전 차단 (deny가 allow보다 우선)
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;실전 보안 설정&lt;/h3&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;// .claude/settings.json
{
  &quot;permissions&quot;: {
    &quot;allow&quot;: [
      &quot;Bash(npm run:*)&quot;,
      &quot;Bash(npm test:*)&quot;,
      &quot;Bash(git status)&quot;,
      &quot;Bash(git diff:*)&quot;,
      &quot;Bash(git log:*)&quot;,
      &quot;Bash(ls:*)&quot;,
      &quot;Bash(cat:*)&quot;,
      &quot;Bash(head:*)&quot;,
      &quot;Bash(tail:*)&quot;
    ],
    &quot;ask&quot;: [
      &quot;Bash(git push:*)&quot;,
      &quot;Bash(git merge:*)&quot;,
      &quot;Bash(npm install:*)&quot;,
      &quot;Bash(npm publish:*)&quot;
    ],
    &quot;deny&quot;: [
      &quot;Read(./.env)&quot;,
      &quot;Read(./.env.*)&quot;,
      &quot;Read(./secrets/**)&quot;,
      &quot;Read(./**/*credential*)&quot;,
      &quot;Read(./**/*secret*)&quot;,
      &quot;Read(~/.ssh/**)&quot;,
      &quot;Read(~/.aws/**)&quot;,
      &quot;Bash(rm -rf:*)&quot;,
      &quot;Bash(sudo:*)&quot;,
      &quot;Bash(chmod 777:*)&quot;,
      &quot;Bash(curl:*)&quot;,
      &quot;Bash(wget:*)&quot;,
      &quot;WebFetch&quot;
    ]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⚠️ 중요: Bash deny 규칙의 한계&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;b&gt;Bash permission rules use pattern matching and can be bypassed&lt;/b&gt; using shell features like command flags, variables, or redirects. For example, Bash(curl:*) can be bypassed with curl -X GET reordered to curl &lt;a href=&quot;http://example.com&quot;&gt;http://example.com&lt;/a&gt; -X GET. &lt;b&gt;Do not rely on Bash deny rules as a security boundary.&lt;/b&gt;&quot; &amp;mdash; &lt;a href=&quot;https://code.claude.com/docs/en/settings&quot;&gt;Claude Code Settings Docs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결책:&lt;/b&gt; PreToolUse Hooks 또는 Sandbox 사용&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Sandbox: 진정한 격리&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Sandbox란?&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;In our internal usage, we've found that &lt;b&gt;sandboxing safely reduces permission prompts by 84%&lt;/b&gt;. By defining set boundaries within which Claude can work freely, they increase security and agency.&quot; &amp;mdash; &lt;a href=&quot;https://www.anthropic.com/engineering/claude-code-sandboxing&quot;&gt;Anthropic Engineering&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2중 격리 시스템&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Effective sandboxing requires &lt;b&gt;both filesystem and network isolation&lt;/b&gt;. Without network isolation, a compromised agent could exfiltrate sensitive files like SSH keys. Without filesystem isolation, a compromised agent could backdoor system resources to gain network access.&quot; &amp;mdash; &lt;a href=&quot;https://code.claude.com/docs/en/sandboxing&quot;&gt;Claude Code Sandboxing Docs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│                    Sandbox Architecture                     │
│                                                             │
│  ┌─────────────────┐      ┌─────────────────┐               │
│  │  Filesystem     │      │    Network      │               │
│  │  Isolation      │      │    Isolation    │               │
│  │                 │      │                 │               │
│  │  &amp;bull; CWD만 쓰기     │      │  &amp;bull; 기본 전체 차단  │               │
│  │  &amp;bull; 상위 폴더 X    │      │  &amp;bull; 허용 도메인만    │               │
│  │  &amp;bull; ~/.ssh 차단   │      │  &amp;bull; 프록시 경유     │               │
│  └─────────────────┘      └─────────────────┘               │
│                                                             │
│  OS-Level Enforcement:                                      │
│  &amp;bull; Linux: Bubblewrap + seccomp BPF                          │
│  &amp;bull; macOS: Seatbelt (sandbox-exec)                           │
└─────────────────────────────────────────────────────────────┘&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Sandbox 활성화&lt;/h3&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# Claude Code 내에서
/sandbox
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Sandbox 설정&lt;/h3&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;sandbox&quot;: {
    &quot;enabled&quot;: true,
    &quot;autoAllowBashIfSandboxed&quot;: true,
    &quot;allowedDirectories&quot;: [
      &quot;${workspaceFolder}&quot;,
      &quot;~/.npm&quot;,
      &quot;/tmp&quot;
    ],
    &quot;deniedDirectories&quot;: [
      &quot;~/.ssh&quot;,
      &quot;~/.aws&quot;,
      &quot;~/.config&quot;,
      &quot;/etc&quot;,
      &quot;/var&quot;
    ],
    &quot;allowedDomains&quot;: [
      &quot;registry.npmjs.org&quot;,
      &quot;api.github.com&quot;
    ]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;High Security 템플릿 (신뢰할 수 없는 코드용)&lt;/h3&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;sandbox&quot;: {
    &quot;enabled&quot;: true,
    &quot;allowedDirectories&quot;: [
      &quot;${workspaceFolder}/sandbox-only&quot;
    ],
    &quot;deniedDirectories&quot;: [
      &quot;~/.ssh&quot;,
      &quot;~/.aws&quot;,
      &quot;~/.config&quot;,
      &quot;/etc&quot;,
      &quot;/var&quot;,
      &quot;/usr&quot;,
      &quot;/System&quot;
    ],
    &quot;allowedDomains&quot;: []
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Prompt Injection 방어&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Sandboxing ensures that &lt;b&gt;even a successful prompt injection is fully isolated&lt;/b&gt;, and cannot impact overall user security. This way, a compromised Claude Code can't steal your SSH keys, or phone home to an attacker's server.&quot; &amp;mdash; &lt;a href=&quot;https://www.anthropic.com/engineering/claude-code-sandboxing&quot;&gt;Anthropic Engineering&lt;/a&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;3. PreToolUse Hooks: 가장 강력한 방어선&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Hooks가 필요한 이유&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Until the core deny functionality is fixed, &lt;b&gt;the only reliable way to protect sensitive files is by using a PreToolUse hook&lt;/b&gt;.&quot; &amp;mdash; &lt;a href=&quot;https://github.com/anthropics/claude-code/issues/6699&quot;&gt;GitHub Issue #6699&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Permission deny 규칙에 버그가 있을 수 있어요. Hooks는 OS 레벨에서 차단하므로 더 안전합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;민감 파일 보호 Hook&lt;/h3&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;#!/usr/bin/env python3
# .claude/hooks/protect_sensitive_files.py
import sys
import json
from pathlib import Path

# 민감한 파일 패턴
SENSITIVE_PATTERNS = [
    '.env',
    '.env.*',
    '*.pem',
    '*.key',
    '*credential*',
    '*secret*',
    'id_rsa',
    'id_ed25519',
    '.aws/credentials',
    '.ssh/config',
]

def is_sensitive(filepath: str) -&amp;gt; bool:
    path = Path(filepath)
    for pattern in SENSITIVE_PATTERNS:
        if path.match(pattern):
            return True
    return False

def main():
    # Hook input 읽기
    input_data = json.loads(sys.stdin.read())
    tool_name = input_data.get('tool_name', '')
    tool_input = input_data.get('tool_input', {})
    
    # Read/Edit 도구 체크
    if tool_name in ['Read', 'Edit', 'Write']:
        file_path = tool_input.get('file_path', '')
        if is_sensitive(file_path):
            print(f&quot;BLOCKED: Access to sensitive file '{file_path}' is denied.&quot;, 
                  file=sys.stderr)
            sys.exit(2)  # exit(2) = 차단
    
    sys.exit(0)  # exit(0) = 허용

if __name__ == '__main__':
    main()
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Hook 등록&lt;/h3&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;// .claude/settings.json
{
  &quot;hooks&quot;: {
    &quot;PreToolUse&quot;: [
      {
        &quot;matcher&quot;: &quot;Read|Edit|Write&quot;,
        &quot;command&quot;: &quot;python3 .claude/hooks/protect_sensitive_files.py&quot;
      }
    ]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;위험 명령 차단 Hook&lt;/h3&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;#!/bin/bash
# .claude/hooks/block_dangerous_commands.sh

# stdin에서 JSON 읽기
INPUT=$(cat)
TOOL_NAME=$(echo &quot;$INPUT&quot; | jq -r '.tool_name')
COMMAND=$(echo &quot;$INPUT&quot; | jq -r '.tool_input.command // &quot;&quot;')

if [ &quot;$TOOL_NAME&quot; = &quot;Bash&quot; ]; then
    # 위험한 패턴 체크
    DANGEROUS_PATTERNS=(
        &quot;rm -rf&quot;
        &quot;chmod 777&quot;
        &quot;curl.*|.*sh&quot;
        &quot;wget.*|.*sh&quot;
        &quot;&amp;gt; /etc/&quot;
        &quot;sudo&quot;
        &quot;dd if=&quot;
    )
    
    for pattern in &quot;${DANGEROUS_PATTERNS[@]}&quot;; do
        if echo &quot;$COMMAND&quot; | grep -qE &quot;$pattern&quot;; then
            echo &quot;BLOCKED: Dangerous command pattern detected: $pattern&quot; &amp;gt;&amp;amp;2
            exit 2
        fi
    done
fi

exit 0
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. CLAUDE.md 보안 규칙&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;보안 가이드라인 템플릿&lt;/h3&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;# Security Rules

## 절대 금지 사항
- **API 키, 시크릿 하드코딩 금지** - 반드시 환경 변수 사용
- **민감 파일 접근 금지**: .env, ~/.ssh/, ~/.aws/, secrets/
- **위험한 명령 실행 금지**: rm -rf, sudo, chmod 777
- **외부 URL에서 스크립트 다운로드 후 실행 금지**

## 필수 보안 패턴
- 모든 시크릿은 환경 변수로 관리: `process.env.API_KEY`
- 사용자 입력은 항상 검증 및 새니타이즈
- SQL 쿼리는 파라미터화된 쿼리 사용 (절대 문자열 연결 X)
- 파일 경로는 항상 path.join() 사용 (path traversal 방지)

## 코드 리뷰 체크리스트
배포 전 반드시 확인:
- [ ] 하드코딩된 시크릿 없음
- [ ] SQL 인젝션 취약점 없음
- [ ] XSS 취약점 없음
- [ ] CSRF 보호 적용
- [ ] 입력 검증 완료
- [ ] 에러 메시지에 민감 정보 노출 없음

## 환경 변수 패턴
```bash
# ✅ 올바른 방법
DATABASE_URL=postgres://...  # .env 파일
const url = process.env.DATABASE_URL;

# ❌ 절대 금지
const url = &quot;postgres://user:password@host/db&quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;의존성 보안&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새 패키지 설치 전 npm audit 실행&lt;/li&gt;
&lt;li&gt;알려진 취약점 있는 패키지 사용 금지&lt;/li&gt;
&lt;li&gt;버전 고정으로 supply chain 공격 방지&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;### Security Reviewer Agent 설정

```markdown
&amp;lt;!-- .claude/agents/security-reviewer.md --&amp;gt;
---
name: security-reviewer
description: 보안 취약점 자동 검사
trigger: /security-review, 배포 전, PR 리뷰
---

# Security Reviewer Agent

## 검사 항목

### 1. 인젝션 취약점
- SQL Injection: 문자열 연결 쿼리 탐지
- Command Injection: 사용자 입력이 exec/spawn에 전달되는지
- NoSQL Injection: MongoDB 쿼리 검사
- XPath/LDAP Injection

### 2. 인증/인가 취약점
- 하드코딩된 credentials
- 약한 비밀번호 정책
- 세션 관리 문제
- 권한 상승 가능성

### 3. 데이터 노출
- 민감 정보 로깅
- 에러 메시지 정보 노출
- 안전하지 않은 직렬화

### 4. 설정 문제
- CORS 설정
- 보안 헤더 누락 (CSP, HSTS 등)
- 디버그 모드 활성화

### 5. 의존성 취약점
- npm audit / pip audit 실행
- 알려진 CVE 확인

## 출력 형식
- 심각도: Critical / High / Medium / Low
- 위치: 파일:라인
- 설명: 취약점 상세
- 수정 방안: 구체적인 해결책
&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. Trail of Bits Security Skills&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;전문 보안 도구 활용&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Trail of Bits Claude Code skills for security research, vulnerability detection, and audit workflows.&quot; &amp;mdash; &lt;a href=&quot;https://github.com/trailofbits/skills&quot;&gt;Trail of Bits Skills&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;설치&lt;/h3&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;/plugins marketplace add trailofbits/skills
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주요 Skills&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Skill 용도&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&gt;static-analysis&lt;/td&gt;
&lt;td&gt;CodeQL, Semgrep으로 정적 분석&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;variant-analysis&lt;/td&gt;
&lt;td&gt;유사 취약점 패턴 탐지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;fix-review&lt;/td&gt;
&lt;td&gt;수정 커밋이 버그 재발 없이 문제 해결하는지 검증&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;audit-context-building&lt;/td&gt;
&lt;td&gt;코드 심층 분석 및 보안 컨텍스트 구축&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;differential-review&lt;/td&gt;
&lt;td&gt;Git 변경사항 보안 중심 리뷰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;semgrep-rule-creator&lt;/td&gt;
&lt;td&gt;커스텀 Semgrep 규칙 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;footgun-identifier&lt;/td&gt;
&lt;td&gt;에러 유발 API 및 위험한 설정 탐지&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;jboss-cli&quot;&gt;&lt;code&gt;# 정적 분석 실행
/static-analysis

# 수정 커밋 검증
/fix-review main fix-branch --report ./audit-report.pdf

# 유사 취약점 탐지
/variant-analysis &quot;SQL injection pattern&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;스마트 컨트랙트 보안 (Building Secure Contracts)&lt;/h3&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# 블록체인별 취약점 스캐너
/solana-vulnerability-scanner
/cosmos-vulnerability-scanner

# 개발 가이드라인
/audit-prep-assistant
/code-maturity-assessor
/secure-workflow-guide
&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. 민감 데이터 보호&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Anthropic 내부 팀 권장사항&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;They recommend using &lt;b&gt;MCP servers rather than the BigQuery CLI&lt;/b&gt; to maintain better security control over what Claude Code can access, especially for handling sensitive data that requires logging or has potential privacy concerns.&quot; &amp;mdash; &lt;a href=&quot;https://www-cdn.anthropic.com/58284b19e702b49db9302d5b6f135ad8871e7658.pdf&quot;&gt;How Anthropic teams use Claude Code&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&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;┌─────────────────────────────────────────────────────────────┐
│              민감 데이터 보호 전략                               │
│                                                             │
│  절대 포함하지 말 것:                                           │
│  &amp;bull; Production API 키                                        │
│  &amp;bull; 데이터베이스 credentials                                    │
│  &amp;bull; 고객 PII (개인식별정보)                                      │
│  &amp;bull; 결제 정보 (카드번호 등)                                       │
│  &amp;bull; 독점 알고리즘 (핵심 비즈니스 로직)                               │
│                                                             │
│  대안:                                                       │
│  &amp;bull; 환경 변수 사용                                              │
│  &amp;bull; Secrets Manager (AWS, Vault 등)                          │
│  &amp;bull; Mock 데이터로 개발                                          │
│  &amp;bull; 민감 정보 마스킹                                             │
└─────────────────────────────────────────────────────────────┘&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;데이터 전송 인식&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;When you interact with Claude Code, specific types of data are transmitted to Anthropic's servers for processing. Files that Claude Code reads are sent in their entirety for analysis.&quot; &amp;mdash; &lt;a href=&quot;https://claudelog.com/faqs/does-claude-code-store-my-data/&quot;&gt;ClaudeLog&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기억하세요:&lt;/b&gt; Claude가 읽는 모든 파일은 Anthropic 서버로 전송됩니다.&lt;/p&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;managed-settings.json (조직 전체 정책)&lt;/h3&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;// /etc/claude/managed-settings.json (관리자 권한 필요)
{
  &quot;permissions&quot;: {
    &quot;deny&quot;: [
      &quot;Read(./secrets/**)&quot;,
      &quot;Read(./**/.env*)&quot;,
      &quot;Read(~/.ssh/**)&quot;,
      &quot;Read(~/.aws/**)&quot;,
      &quot;Bash(curl:*)&quot;,
      &quot;Bash(wget:*)&quot;,
      &quot;WebFetch&quot;
    ]
  },
  &quot;sandbox&quot;: {
    &quot;enabled&quot;: true,
    &quot;allowedDomains&quot;: [
      &quot;*.company-internal.com&quot;,
      &quot;registry.npmjs.org&quot;
    ]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Enterprise Policy (highest priority) &amp;mdash; These rules &lt;b&gt;cannot be overridden by users&lt;/b&gt;.&quot; &amp;mdash; &lt;a href=&quot;https://angelo-lima.fr/en/claude-code-permissions-security/&quot;&gt;Permissions and Security&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Settings 우선순위&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;Managed (최우선) &amp;rarr; Project &amp;rarr; User (최하위)
      &amp;darr;               &amp;darr;         &amp;darr;
 조직 정책       프로젝트용    개인 설정
 (강제 적용)     (.claude/)    (~/.claude/)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;GDPR/규제 대응&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;Data Residency&lt;/b&gt;: AWS EU 리전 또는 Vertex AI 사용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Zero Data Retention&lt;/b&gt;: Enterprise API 고객용 옵션&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Audit Logging&lt;/b&gt;: 90일 이상 로그 보관&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Data Minimization&lt;/b&gt;: deny 규칙으로 PII 파일 접근 차단&lt;/li&gt;
&lt;/ul&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;매일 확인&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[ ] Claude Code 최신 버전 사용 중 (/status 확인)&lt;/li&gt;
&lt;li&gt;[ ] .env 파일이 .gitignore에 포함&lt;/li&gt;
&lt;li&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;[ ] CLAUDE.md에 보안 규칙 명시&lt;/li&gt;
&lt;li&gt;[ ] .claude/settings.json에 deny 규칙 설정&lt;/li&gt;
&lt;li&gt;[ ] /sandbox 활성화&lt;/li&gt;
&lt;li&gt;[ ] PreToolUse Hooks 설정&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;[ ] /security-review 또는 Security Agent 실행&lt;/li&gt;
&lt;li&gt;[ ] npm audit / pip audit 실행&lt;/li&gt;
&lt;li&gt;[ ] 의존성 취약점 확인&lt;/li&gt;
&lt;li&gt;[ ] 환경 변수 설정 검증&lt;/li&gt;
&lt;li&gt;[ ] CORS, CSP 등 보안 헤더 확인&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;[ ] Claude가 .env 읽으려 함 &amp;rarr; 즉시 거부&lt;/li&gt;
&lt;li&gt;[ ] 알 수 없는 URL로 네트워크 요청 &amp;rarr; 확인 후 결정&lt;/li&gt;
&lt;li&gt;[ ] sudo 또는 chmod 777 요청 &amp;rarr; 절대 거부&lt;/li&gt;
&lt;li&gt;[ ] 알 수 없는 npm 패키지 설치 &amp;rarr; 조사 후 결정&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. CVE 및 알려진 취약점&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주요 CVE 히스토리&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;So far there have been 9 CVE's published for claude code, many of which allowed for bypasses of permissions dialogs.&quot; &amp;mdash; &lt;a href=&quot;https://www.petefreitag.com/blog/claude-code-permissions/&quot;&gt;Pete Freitag&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버전 취약점 날짜&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;le;1.0.119&lt;/td&gt;
&lt;td&gt;Symlink bypass in permission deny rules&lt;/td&gt;
&lt;td&gt;2025-10-03&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;1.0.105&lt;/td&gt;
&lt;td&gt;Confirm Prompt Bypass&lt;/td&gt;
&lt;td&gt;2025-09-10&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;/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;Permission 시스템만 의존하지 말고 Sandbox + Hooks 사용&lt;/li&gt;
&lt;li&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. 안전한 YOLO 모드&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;절대 일반 개발에서 사용 금지&lt;/h3&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;# ⚠️ 위험: 모든 권한 체크 우회
claude --dangerously-skip-permissions
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;안전하게 사용하려면&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;This flag should only be used for well-defined, automated tasks running in a &lt;b&gt;secure, isolated environment like a Docker container&lt;/b&gt;.&quot; &amp;mdash; &lt;a href=&quot;https://www.eesel.ai/blog/claude-code-permissions&quot;&gt;eesel.ai&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# Dockerfile - 격리된 환경에서만 YOLO 모드
FROM node:20-alpine

# 비-root 사용자 생성
RUN adduser -D claude-user

# 작업 디렉토리만 접근 가능
WORKDIR /workspace
RUN chown claude-user:claude-user /workspace

USER claude-user

# Claude Code 설치
RUN npm install -g @anthropic-ai/claude-code

CMD [&quot;claude&quot;, &quot;--dangerously-skip-permissions&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;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보안은 &lt;b&gt;선택이 아니라 필수&lt;/b&gt;입니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;The key takeaway: &lt;b&gt;Treat Claude like you would an untrusted but powerful intern.&lt;/b&gt; Give it only the minimum permissions it actually needs, sandbox it, and audit it.&quot; &amp;mdash; &lt;a href=&quot;https://www.backslash.security/blog/claude-code-security-best-practices&quot;&gt;Backslash Security&lt;/a&gt;&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;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;: Permission + Sandbox + Hooks&lt;/li&gt;
&lt;li&gt;&lt;b&gt;명시적 규칙&lt;/b&gt;: CLAUDE.md에 보안 정책 문서화&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정기 감사&lt;/b&gt;: Trail of Bits Skills 등 활용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;최신 유지&lt;/b&gt;: 보안 패치 즉시 적용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;root 절대 금지&lt;/b&gt;: AI 에이전트에 관리자 권한 주지 않기&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code는 강력한 도구예요. 하지만 &lt;b&gt;제대로 설정하지 않으면 보안 위협&lt;/b&gt;이 될 수 있어요. 이 가이드의 설정을 적용하면, 생산성은 유지하면서 안전하게 AI 코딩을 즐길 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고 자료&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Anthropic 공식&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;a href=&quot;https://docs.anthropic.com/en/docs/claude-code/security&quot;&gt;Security - Claude Code Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/en/sandboxing&quot;&gt;Sandboxing - Claude Code Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.anthropic.com/engineering/claude-code-sandboxing&quot;&gt;Making Claude Code More Secure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/en/settings&quot;&gt;Claude Code Settings&lt;/a&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/trailofbits/skills&quot;&gt;Trail of Bits Skills&lt;/a&gt; &amp;mdash; 전문 보안 감사 Skills&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/anthropic-experimental/sandbox-runtime&quot;&gt;Anthropic sandbox-runtime&lt;/a&gt; &amp;mdash; 오픈소스 샌드박스&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.petefreitag.com/blog/claude-code-permissions/&quot;&gt;Claude Code Permissions Deep Dive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.backslash.security/blog/claude-code-security-best-practices&quot;&gt;Backslash Security Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mintmcp.com/blog/claude-code-security&quot;&gt;MintMCP Enterprise Security&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://angelo-lima.fr/en/claude-code-permissions-security/&quot;&gt;Permissions and Security&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programmer/AI</category>
      <category>claude code</category>
      <category>DevSecOps</category>
      <category>hooks</category>
      <category>OWASP</category>
      <category>permission</category>
      <category>Sandbox</category>
      <category>security</category>
      <category>trail of bits</category>
      <category>보안</category>
      <category>취약점</category>
      <author>MoreLean</author>
      <guid isPermaLink="true">https://judekim.tistory.com/175</guid>
      <comments>https://judekim.tistory.com/175#entry175comment</comments>
      <pubDate>Wed, 21 Jan 2026 01:07:57 +0900</pubDate>
    </item>
    <item>
      <title>Claude Code TDD 워크플로우: RED-GREEN-REFACTOR로 버그 없는 코드 만들기</title>
      <link>https://judekim.tistory.com/174</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;TDD 워크플로우 제대로 돌리는 법도 알려드릴게요. &lt;b&gt;RED-GREEN-REFACTOR&lt;/b&gt; 사이클이에요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RED&lt;/b&gt;는 실패하는 테스트 먼저 쓰는 거예요. 아직 기능 없으니까 당연히 실패하죠. &lt;b&gt;GREEN&lt;/b&gt;은 테스트 통과할 만큼만 코드 짜는 거예요. &lt;b&gt;REFACTOR&lt;/b&gt;는 그 코드를 깔끔하게 리팩토링하는 거고요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 순서 지키면 버그가 확 줄어들어요. 해커톤 때 이렇게 했더니 &lt;b&gt;테스트 커버리지 80% 넘겼&lt;/b&gt;거든요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;TL;DR&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;TDD = Anthropic 공식 권장 워크플로우&lt;/b&gt; (&quot;Anthropic-favorite workflow&quot;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;RED &amp;rarr; GREEN &amp;rarr; REFACTOR&lt;/b&gt; 사이클 반복&lt;/li&gt;
&lt;li&gt;Claude에게 &lt;b&gt;명시적으로 TDD임을 알려야&lt;/b&gt; 함 (mock 방지)&lt;/li&gt;
&lt;li&gt;테스트 먼저 작성 &amp;rarr; 실패 확인 &amp;rarr; 최소 구현 &amp;rarr; 리팩토링&lt;/li&gt;
&lt;li&gt;/tdd 커스텀 명령어로 자동화 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AI + TDD = 최강 조합&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;왜 TDD가 AI와 잘 맞는가?&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Claude의 기본 성향: Implementation-First&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;When I ask Claude to 'implement feature X,' it writes the implementation first.&quot; &amp;mdash; &lt;a href=&quot;https://alexop.dev/posts/custom-tdd-workflow-claude-code-vue/&quot;&gt;alexop.dev&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude는 기본적으로 &lt;b&gt;바로 코드를 짜려고 해요&lt;/b&gt;. 테스트 없이 &quot;Happy Path&quot;만 구현하고, 엣지 케이스를 놓치기 쉬워요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;TDD가 해결하는 문제&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제 TDD 해결책&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&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;h3 data-ke-size=&quot;size23&quot;&gt;AI에게 TDD가 효과적인 이유&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Everything that makes TDD a slog for humans makes it the &lt;b&gt;perfect workflow for an AI agent&lt;/b&gt;. AI thrives on clear, measurable goals, and a binary test is one the clearest goals you can give it.&quot; &amp;mdash; &lt;a href=&quot;https://www.builder.io/blog/test-driven-development-ai&quot;&gt;Builder.io&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&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;: Claude가 스스로 결과 확인 가능&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;h2 data-ke-size=&quot;size26&quot;&gt;Anthropic 공식 TDD 가이드&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;공식 권장 워크플로우&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;This is an &lt;b&gt;Anthropic-favorite workflow&lt;/b&gt; for changes that are easily verifiable with unit, integration, or end-to-end tests. Test-driven development (TDD) becomes even more powerful with agentic coding.&quot; &amp;mdash; &lt;a href=&quot;https://www.anthropic.com/engineering/claude-code-best-practices&quot;&gt;Anthropic Best Practices&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Anthropic이 권장하는 4단계&lt;/h3&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;: 예상 input/output 기반으로 테스트 작성&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;/ol&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Ask Claude to write tests based on expected input/output pairs. &lt;b&gt;Be explicit about the fact that you're doing test-driven development&lt;/b&gt; so that it avoids creating mock implementations, even for functionality that doesn't exist yet in the codebase.&quot; &amp;mdash; &lt;a href=&quot;https://www.anthropic.com/engineering/claude-code-best-practices&quot;&gt;Anthropic Best Practices&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심:&lt;/b&gt; Claude에게 &lt;b&gt;TDD를 하고 있다고 명시적으로 알려야&lt;/b&gt; 해요. 그래야 아직 없는 기능에 대해 mock을 만들지 않아요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;RED-GREEN-REFACTOR 사이클&lt;/h2&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│                    TDD 사이클                                │
│                                                             │
│      RED ──────────►   GREEN ──────────►   REFACTOR     │
│      │                   │                     │            │
│      │                   │                     │            │
│      ▼                   ▼                     ▼            │
│   실패하는            테스트 통과할          코드 정리      │
│   테스트 작성         최소 코드 작성         (테스트 유지)   │
│                                                             │
│                          │                                  │
│                          ▼                                  │
│                    다음 기능으로                            │
│                    ◄──────────────────────────────────────  │
└─────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  RED Phase: 실패하는 테스트 작성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목적:&lt;/b&gt; 아직 구현되지 않은 기능의 &lt;b&gt;명세(Specification)&lt;/b&gt; 작성&lt;/p&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;&amp;gt; 사용자 로그인 기능의 테스트를 먼저 작성해줘.
&amp;gt; 아직 구현은 하지 마.
&amp;gt; 테스트가 실패하는지 확인해줘.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Claude 출력 예시:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;dart&quot;&gt;&lt;code&gt;// auth.test.ts
describe('User Login', () =&amp;gt; {
  it('should return user object on valid credentials', async () =&amp;gt; {
    const result = await login('user@example.com', 'password123');
    expect(result.success).toBe(true);
    expect(result.user.email).toBe('user@example.com');
  });

  it('should return error on invalid email', async () =&amp;gt; {
    const result = await login('invalid-email', 'password123');
    expect(result.success).toBe(false);
    expect(result.error).toBe('Invalid email format');
  });

  it('should return error on wrong password', async () =&amp;gt; {
    const result = await login('user@example.com', 'wrongpassword');
    expect(result.success).toBe(false);
    expect(result.error).toBe('Invalid credentials');
  });
});
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# 테스트 실행 &amp;rarr; 실패 확인 ✅
npm test
# FAIL: login is not defined
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  GREEN Phase: 최소 구현&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;markdown&quot;&gt;&lt;code&gt;&amp;gt; 이제 테스트가 통과하도록 최소한의 구현을 해줘.
&amp;gt; 테스트에 없는 기능은 추가하지 마.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Claude 출력 예시:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;// auth.ts
export async function login(email: string, password: string) {
  // 이메일 형식 검증
  if (!email.includes('@')) {
    return { success: false, error: 'Invalid email format' };
  }

  // 실제로는 DB 조회 (여기선 하드코딩)
  const validUser = { email: 'user@example.com', password: 'password123' };
  
  if (email === validUser.email &amp;amp;&amp;amp; password === validUser.password) {
    return { success: true, user: { email } };
  }

  return { success: false, error: 'Invalid credentials' };
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# 테스트 실행 &amp;rarr; 통과 ✅
npm test
# PASS: All tests passed
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  REFACTOR Phase: 코드 정리&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;markdown&quot;&gt;&lt;code&gt;&amp;gt; 테스트는 그대로 유지하면서 코드를 리팩토링해줘.
&amp;gt; 중복 제거, 가독성 개선, 타입 추가 등.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Claude 출력 예시:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;// auth.ts (리팩토링 후)
interface LoginResult {
  success: boolean;
  user?: { email: string };
  error?: string;
}

const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;

export async function login(email: string, password: string): Promise&amp;lt;LoginResult&amp;gt; {
  if (!isValidEmail(email)) {
    return { success: false, error: 'Invalid email format' };
  }

  const user = await findUserByEmail(email);
  
  if (!user || !verifyPassword(password, user.passwordHash)) {
    return { success: false, error: 'Invalid credentials' };
  }

  return { success: true, user: { email: user.email } };
}

function isValidEmail(email: string): boolean {
  return EMAIL_REGEX.test(email);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# 리팩토링 후에도 테스트 통과 확인 ✅
npm test
# PASS: All tests passed
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실전 /tdd 명령어 사용법&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;커스텀 /tdd 명령어 만들기&lt;/h3&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;&amp;lt;!-- .claude/commands/tdd.md --&amp;gt;
---
description: Test-Driven Development workflow
---

# TDD Workflow for: $ARGUMENTS

You are doing **Test-Driven Development**. Follow this strict cycle:

## Phase 1: RED  
1. Analyze the feature requirement: $ARGUMENTS
2. Write failing test(s) that define expected behavior
3. Run tests and **confirm they fail**
4. Do NOT write any implementation code yet
5. Wait for my review before proceeding

## Phase 2: GREEN  
After I approve the tests:
1. Write the **minimum code** to make tests pass
2. Do NOT add features not covered by tests
3. Run tests and confirm they pass
4. Commit when green

## Phase 3: REFACTOR  
After tests pass:
1. Improve code quality (readability, DRY, types)
2. Keep all tests passing
3. Run tests after each change
4. Commit the refactored code

## Rules
- Never skip the RED phase
- Never implement more than what tests require
- Always run tests after changes
- One test at a time for complex features
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;사용 예시&lt;/h3&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;&amp;gt; /tdd 사용자 로그인 기능

# Claude 응답:
  RED Phase 시작

로그인 기능의 테스트를 먼저 작성하겠습니다.

[테스트 코드 작성...]

테스트 실행 결과: FAIL ❌
- login is not defined

테스트가 예상대로 실패합니다. 
테스트 코드를 검토해주시고, 진행해도 되면 알려주세요.
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;&amp;gt; 좋아, 구현해줘

# Claude 응답:
  GREEN Phase 시작

테스트를 통과할 최소한의 구현을 작성하겠습니다.

[구현 코드 작성...]

테스트 실행 결과: PASS ✅
모든 테스트가 통과합니다.

  REFACTOR Phase로 진행할까요?
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;고급 TDD 패턴&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Subagent로 컨텍스트 분리&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;When everything runs in one context window, the LLM cannot truly follow TDD. The test writer's detailed analysis bleeds into the implementer's thinking.&quot; &amp;mdash; &lt;a href=&quot;https://alexop.dev/posts/custom-tdd-workflow-claude-code-vue/&quot;&gt;alexop.dev&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제:&lt;/b&gt; 같은 컨텍스트에서 테스트와 구현을 하면 Claude가 &quot;치팅&quot;할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결:&lt;/b&gt; Subagent로 각 phase 분리&lt;/p&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;&amp;lt;!-- .claude/skills/tdd-integration/skill.md --&amp;gt;
---
name: tdd-integration
description: Enforce TDD with strict Red-Green-Refactor cycle using subagents
---

### Phase 1: RED  
Invoke the `tdd-test-writer` subagent with:
- Feature requirement from user request
- Expected behavior to test

**Do NOT proceed until test failure is confirmed.**

### Phase 2: GREEN  
Invoke the `tdd-implementer` subagent with:
- Test file path from RED phase
- Feature requirement context

**Do NOT proceed until test passes.**

### Phase 3: REFACTOR  
Invoke the `tdd-refactorer` subagent with:
- Implementation files from GREEN phase
- Test file for verification
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. TDD Guard (Hooks로 강제)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/nizos/tdd-guard&quot;&gt;TDD Guard&lt;/a&gt;는 Hooks를 사용해 TDD 원칙을 &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;TDD Guard ensures Claude Code follows Test-Driven Development principles. When your agent tries to skip tests or over-implement, TDD Guard &lt;b&gt;blocks the action&lt;/b&gt; and explains what needs to happen instead.&quot; &amp;mdash; &lt;a href=&quot;https://github.com/nizos/tdd-guard&quot;&gt;TDD Guard GitHub&lt;/a&gt;&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;pre class=&quot;json&quot;&gt;&lt;code&gt;// .claude/settings.json
{
  &quot;hooks&quot;: {
    &quot;PreToolUse&quot;: [
      {
        &quot;matcher&quot;: &quot;Write|Edit|MultiEdit&quot;,
        &quot;command&quot;: &quot;tdd-guard&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;파일 수정 전 TDD 원칙 검증&lt;/li&gt;
&lt;li&gt;테스트 없이 구현하려 하면 차단&lt;/li&gt;
&lt;li&gt;과도한 구현 감지 및 경고&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 테스트 유형별 TDD&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Unit Test TDD:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;&amp;gt; /tdd calculateTotal 함수 - 가격 합계, 할인 적용, 세금 계산
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Integration Test TDD:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;&amp;gt; /tdd 결제 API 통합 - Stripe 연동, 에러 핸들링, 웹훅 처리
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;E2E Test TDD:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;&amp;gt; /tdd 사용자 회원가입 플로우 - 폼 입력, 이메일 인증, 프로필 설정
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;CLAUDE.md TDD 설정&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 TDD 가이드라인&lt;/h3&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;# Testing and TDD

When working on a new feature or a bug fix, you **always write a failing test first** and then wait for me to review them. Then, when I've committed those tests, you add the smallest implementation possible to resolve a single test failure.

## TDD Workflow
1.   RED: Write failing test(s) first, then wait for review
2.   GREEN: After commit, implement minimal code to pass
3.   REFACTOR: Clean up while keeping tests green

Key principle: **Small, iterative cycles.**

## Commands
- `npm test`: Quick unit tests for TDD cycles
- `npm run test:all`: Full test suite before PR
- `npm run test:coverage`: Check coverage

## Rules
- No production code without a failing test
- One test at a time for complex features
- Never mock functionality that doesn't exist yet
- Run tests after every change
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;엄격한 TDD 강제&lt;/h3&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;# Strict TDD Mode

You are a **TDD-first agent**. Strict constraints:

1. **Never write implementation without a failing test**
   - If asked to &quot;create a feature,&quot; respond: &quot;Let me write a test first&quot;
   - Confirm test fails before implementing

2. **Minimal code always**
   - Write the simplest code that passes current test
   - Do NOT anticipate future requirements
   - Refactor only after tests pass

3. **Test output first**
   - Run tests with -q flag for clean output
   - Show PASS/FAIL status clearly

4. **Explicit phase announcements**
   -   &quot;RED Phase: Writing failing test...&quot;
   -   &quot;GREEN Phase: Implementing minimal solution...&quot;
   -   &quot;REFACTOR Phase: Cleaning up...&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;실무 TDD 시나리오&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시나리오 1: 새 기능 개발&lt;/h3&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;&amp;gt; /tdd 장바구니에 상품 추가 기능

# RED
  테스트 작성:
- 상품 추가 시 장바구니에 포함되는지
- 동일 상품 추가 시 수량 증가하는지
- 재고 초과 시 에러 반환하는지

# GREEN
  최소 구현:
- addToCart 함수
- 수량 관리 로직
- 재고 체크

# REFACTOR
  개선:
- 타입 추가
- 에러 처리 표준화
- 중복 제거
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시나리오 2: 버그 수정&lt;/h3&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;&amp;gt; /tdd 결제 시 할인 코드가 두 번 적용되는 버그

# RED
  버그 재현 테스트:
- 할인 코드 두 번 입력 시 한 번만 적용되는지 확인

# GREEN
  수정:
- 중복 할인 방지 로직 추가

# REFACTOR
  개선:
- 할인 로직 추출 및 정리
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시나리오 3: 리팩토링&lt;/h3&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;&amp;gt; /tdd 인증 모듈 리팩토링 - 기존 테스트 유지하면서

# 기존 테스트 확인
  모든 테스트 통과 확인

# REFACTOR (반복)
  점진적 리팩토링:
1. 작은 변경
2. 테스트 실행
3. 통과 확인
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;TDD ROI (투자 대비 효과)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;토큰 비용 비교&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;The TDD workflow has a higher upfront token tax... But after 10,000 lines of code, the ROI becomes undeniable.&quot; &amp;mdash; &lt;a href=&quot;https://medium.com/@moradikor296/the-tdd-paradigm-shift-why-test-driven-development-is-claude-codes-killer-discipline-9be9616d79f6&quot;&gt;Ali Moradi&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Without TDD:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;프롬프트: &quot;결제 API 만들어줘&quot;
&amp;rarr; 500줄 코드 생성
&amp;rarr; 버그 발견 (Delete가 cascade 안 됨)
&amp;rarr; 에러 로그 분석 (2,000 토큰)
&amp;rarr; 수정
&amp;rarr; 새 버그 발견
&amp;rarr; 반복...

총 토큰: 50,000+ 토큰
총 시간: 수 시간
품질: 테스트 안 된 취약한 코드
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;With TDD:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;프롬프트: &quot;삭제 시 하위 항목도 삭제되는지 테스트 작성해줘&quot;
&amp;rarr; 테스트 작성 (200 토큰)
&amp;rarr; 실패 확인
&amp;rarr; 최소 구현
&amp;rarr; 통과 확인
&amp;rarr; 다음 요구사항으로

총 토큰: 5,000 토큰
총 시간: 20분
품질: 모든 동작 검증됨
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Anthropic 내부 사례&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;The Security Engineering team transformed their workflow from 'design doc &amp;rarr; janky code &amp;rarr; refactor &amp;rarr; give up on tests' to asking Claude for pseudocode, &lt;b&gt;guiding it through test-driven development&lt;/b&gt;, and checking in periodically.&quot; &amp;mdash; &lt;a href=&quot;https://claude.com/blog/how-anthropic-teams-use-claude-code&quot;&gt;How Anthropic teams use Claude Code&lt;/a&gt;&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;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주의사항&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Claude의 자연스러운 성향&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Without explicit guidance, agents naturally &lt;b&gt;skip the refactoring phase&lt;/b&gt; of the red-green-refactor cycle or at best make only superficial changes.&quot; &amp;mdash; &lt;a href=&quot;https://nizar.se/tdd-guard-for-claude-code/&quot;&gt;TDD Guard Blog&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결:&lt;/b&gt; CLAUDE.md에 명시적으로 TDD 규칙 작성&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Context Pollution&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 컨텍스트에서 테스트와 구현을 하면 Claude가 테스트를 구현에 맞춰 &quot;치팅&quot;할 수 있어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Subagent로 phase 분리&lt;/li&gt;
&lt;li&gt;테스트 작성 후 리뷰 받고 커밋 후 구현&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 과도한 테스트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 것에 TDD를 적용할 필요는 없어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;TDD 적합:&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;API 엔드포인트&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;TDD 불필요:&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;단순 CRUD&lt;/li&gt;
&lt;li&gt;UI 스타일링&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;h2 data-ke-size=&quot;size26&quot;&gt;체크리스트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;TDD 시작 전&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;[ ] CLAUDE.md에 TDD 가이드라인 추가&lt;/li&gt;
&lt;li&gt;[ ] /tdd 커스텀 명령어 생성&lt;/li&gt;
&lt;li&gt;[ ] 테스트 프레임워크 설정 (Jest, Vitest, pytest 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RED Phase&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;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GREEN Phase&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;li&gt;[ ] 모든 테스트 통과 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;REFACTOR Phase&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;[ ] 코드 품질 개선 (DRY, 가독성, 타입)&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;고급&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;[ ] Subagent로 phase 분리 고려&lt;/li&gt;
&lt;li&gt;[ ] TDD Guard 설치 고려&lt;/li&gt;
&lt;li&gt;[ ] 테스트 커버리지 목표 설정 (70-80%)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TDD는 &lt;b&gt;Anthropic이 공식 권장하는 워크플로우&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;This is an &lt;b&gt;Anthropic-favorite workflow&lt;/b&gt; for changes that are easily verifiable with unit, integration, or end-to-end tests.&quot; &amp;mdash; &lt;a href=&quot;https://www.anthropic.com/engineering/claude-code-best-practices&quot;&gt;Anthropic Best Practices&lt;/a&gt;&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;RED &amp;rarr; GREEN &amp;rarr; REFACTOR&lt;/b&gt; 사이클 엄수&lt;/li&gt;
&lt;li&gt;Claude에게 &lt;b&gt;TDD임을 명시적으로 알리기&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;테스트 먼저&lt;/b&gt;, 구현은 나중에&lt;/li&gt;
&lt;li&gt;&lt;b&gt;최소 구현&lt;/b&gt; &amp;mdash; 테스트 통과할 만큼만&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;AI와 TDD는 최강 조합이에요. Claude에게 명확한 목표(테스트)를 주면, 그 목표를 향해 정확하게 달려갑니다. 처음엔 느린 것 같아도, 장기적으로 &lt;b&gt;버그 감소 + 유지보수 용이 + 자신감 있는 리팩토링&lt;/b&gt;이라는 엄청난 ROI를 얻을 수 있어요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고 자료&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Anthropic 공식&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;a href=&quot;https://www.anthropic.com/engineering/claude-code-best-practices&quot;&gt;Claude Code Best Practices&lt;/a&gt; &amp;mdash; TDD 공식 권장&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://claude.com/blog/how-anthropic-teams-use-claude-code&quot;&gt;How Anthropic teams use Claude Code&lt;/a&gt; &amp;mdash; 내부 TDD 사용 사례&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://alexop.dev/posts/custom-tdd-workflow-claude-code-vue/&quot;&gt;Forcing Claude Code to TDD&lt;/a&gt; &amp;mdash; Subagent 기반 TDD&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/nizos/tdd-guard&quot;&gt;TDD Guard&lt;/a&gt; &amp;mdash; Hooks로 TDD 강제&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://thoughtbot.com/blog/prevent-the-robocalypse-with-tdd&quot;&gt;Prevent the Robocalypse with TDD&lt;/a&gt; &amp;mdash; 실전 TDD 워크플로우&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@moradikor296/the-tdd-paradigm-shift-why-test-driven-development-is-claude-codes-killer-discipline-9be9616d79f6&quot;&gt;TDD Paradigm Shift&lt;/a&gt; &amp;mdash; TDD ROI 분석&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/nizos/tdd-guard&quot;&gt;TDD Guard GitHub&lt;/a&gt; &amp;mdash; TDD 강제 Hooks&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/hesreallyhim/awesome-claude-code&quot;&gt;awesome-claude-code&lt;/a&gt; &amp;mdash; /tdd 명령어 모음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;일반 TDD&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;a href=&quot;https://martinfowler.com/bliki/TestDrivenDevelopment.html&quot;&gt;Martin Fowler - TDD&lt;/a&gt; &amp;mdash; TDD 원론&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.com/Test-Driven-Development-Kent-Beck/dp/0321146530&quot;&gt;Kent Beck - Test-Driven Development&lt;/a&gt; &amp;mdash; TDD 바이블&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programmer/AI</category>
      <category>AI 코딩</category>
      <category>Anthropic</category>
      <category>claude code</category>
      <category>Red-Green-Refactor</category>
      <category>TDD</category>
      <category>Test-Driven Development</category>
      <category>단위 테스트</category>
      <category>테스트 주도 개발</category>
      <category>품질 보증</category>
      <author>MoreLean</author>
      <guid isPermaLink="true">https://judekim.tistory.com/174</guid>
      <comments>https://judekim.tistory.com/174#entry174comment</comments>
      <pubDate>Wed, 21 Jan 2026 01:02:08 +0900</pubDate>
    </item>
    <item>
      <title>Claude Code Extended Thinking: 깊은 사고로 퀄리티 높이기</title>
      <link>https://judekim.tistory.com/173</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Extended Thinking이라는 기능도 있어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복잡한 문제 주면 Claude Code가 &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;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;TL;DR&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Extended Thinking = Claude가 답변 전에 깊이 생각하는 공식 기능&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Claude Code에서 &lt;b&gt;기본 활성화&lt;/b&gt; (최대 31,999 토큰)&lt;/li&gt;
&lt;li&gt;Ctrl+O로 thinking 과정 볼 수 있음 (verbose mode)&lt;/li&gt;
&lt;li&gt;&quot;think&quot;, &quot;think hard&quot;, &quot;ultrathink&quot; 키워드로 &lt;b&gt;thinking budget 조절&lt;/b&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;h2 data-ke-size=&quot;size26&quot;&gt;Extended Thinking이란?&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;When extended thinking is turned on, Claude creates &lt;b&gt;thinking content blocks&lt;/b&gt; where it outputs its internal reasoning. Claude incorporates insights from this reasoning before crafting a final response.&quot; &amp;mdash; &lt;a href=&quot;https://docs.anthropic.com/en/docs/build-with-claude/extended-thinking&quot;&gt;Anthropic Docs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말해, Claude가 답변하기 &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;&quot;&gt;&lt;code&gt;질문 &amp;rarr; 바로 답변
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Extended Thinking:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;질문 &amp;rarr; [내부 추론: 여러 접근법 탐색, 엣지 케이스 분석, 자기 검증] &amp;rarr; 답변
&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;Anthropic 연구진의 관찰:&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Some of our researchers with math and physics backgrounds have noted how eerily similar Claude's thought process is to their own way of reasoning through difficult problems: &lt;b&gt;exploring many different angles and branches of reasoning&lt;/b&gt;, and double- and triple-checking answers.&quot; &amp;mdash; &lt;a href=&quot;https://www.anthropic.com/news/visible-extended-thinking&quot;&gt;Anthropic - Visible Extended Thinking&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude의 thinking 과정:&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;자기 답변 검증 (double/triple check)&lt;/li&gt;
&lt;li&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;Claude Code에서의 Extended Thinking&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 활성화&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;b&gt;Extended thinking is enabled by default&lt;/b&gt;, reserving a portion of the output token budget (up to 31,999 tokens) for Claude to reason through complex problems step-by-step.&quot; &amp;mdash; &lt;a href=&quot;https://docs.anthropic.com/en/docs/claude-code/common-workflows&quot;&gt;Claude Code Docs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code에서는 &lt;b&gt;기본적으로 켜져 있어요&lt;/b&gt;. 별도 설정 없이도 복잡한 문제에 대해 자동으로 깊이 생각합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Thinking 과정 보기&lt;/h3&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# Ctrl+O로 verbose mode 토글
# thinking 과정이 회색 이탤릭 텍스트로 표시됨
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;To view Claude's thinking process, press Ctrl+O to toggle verbose mode and see the internal reasoning displayed as gray italic text.&quot; &amp;mdash; &lt;a href=&quot;https://docs.anthropic.com/en/docs/claude-code/common-workflows&quot;&gt;Claude Code Docs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Thinking Budget 조절하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키워드로 thinking에 할당되는 토큰 양을 조절할 수 있어요:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키워드 Thinking 토큰 용도&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&gt;think&lt;/td&gt;
&lt;td&gt;~4,000&lt;/td&gt;
&lt;td&gt;일반적인 분석&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;think hard, megathink&lt;/td&gt;
&lt;td&gt;~10,000&lt;/td&gt;
&lt;td&gt;중간 복잡도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;think harder, ultrathink&lt;/td&gt;
&lt;td&gt;~31,999&lt;/td&gt;
&lt;td&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;&quot;These specific phrases are mapped directly to increasing levels of thinking budget in the system: 'think' &amp;lt; 'think hard' &amp;lt; 'think harder' &amp;lt; 'ultrathink'&quot; &amp;mdash; &lt;a href=&quot;https://www.anthropic.com/engineering/claude-code-best-practices&quot;&gt;Anthropic Best Practices&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;환경 변수로 제한&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# thinking 토큰 상한 설정
export MAX_THINKING_TOKENS=10000
claude
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Use the MAX_THINKING_TOKENS environment variable to cap the thinking budget.&quot; &amp;mdash; &lt;a href=&quot;https://docs.anthropic.com/en/docs/claude-code/common-workflows&quot;&gt;Claude Code Docs&lt;/a&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;Extended Thinking의 효과&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;수학 문제 성능&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Anthropic 연구 결과, thinking 토큰이 늘어날수록 수학 문제 정확도가 &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;Its accuracy on, for example, math questions &lt;b&gt;improves logarithmically&lt;/b&gt; with the number of 'thinking tokens' that it's allowed to sample.&quot; &amp;mdash; &lt;a href=&quot;https://www.anthropic.com/news/visible-extended-thinking&quot;&gt;Anthropic - Visible Extended Thinking&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;Tau-Bench 평가에서 &quot;think&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;Airline 도메인&lt;/b&gt;: 0.370 &amp;rarr; 0.570 (54% 향상)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Retail 도메인&lt;/b&gt;: 0.783 &amp;rarr; 0.812&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;The results showed dramatic improvements when Claude 3.7 effectively used the 'think' tool.&quot; &amp;mdash; &lt;a href=&quot;https://www.anthropic.com/engineering/claude-think-tool&quot;&gt;Anthropic Engineering&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Extended Thinking이 도움되는 경우&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Extended thinking is particularly valuable for &lt;b&gt;complex architectural decisions, challenging bugs, multi-step implementation planning&lt;/b&gt;, and evaluating tradeoffs between different approaches.&quot; &amp;mdash; &lt;a href=&quot;https://docs.anthropic.com/en/docs/claude-code/common-workflows&quot;&gt;Claude Code Docs&lt;/a&gt;&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;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;li&gt;수학/분석 문제&lt;/li&gt;
&lt;li&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;실전 활용 예시&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 아키텍처 설계&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;&amp;gt; Think hard about designing a real-time collaboration system.
&amp;gt; Consider:
&amp;gt; - Conflict resolution (OT vs CRDT)
&amp;gt; - Scaling to 100K concurrent users
&amp;gt; - Offline support
&amp;gt; - Cost optimization
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Claude의 thinking 과정 (verbose mode):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;Let me analyze this systematically...

First, conflict resolution approaches:
- OT (Operational Transformation): Used by Google Docs, complex but proven
- CRDT (Conflict-free Replicated Data Types): Simpler, better for P2P
  
For 100K concurrent users, CRDT might be better because...
Wait, but OT has better compression for text...

Let me reconsider the requirements...
[더 깊은 분석 계속...]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 복잡한 버그 디버깅&lt;/h3&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;&amp;gt; Ultrathink about this race condition.
&amp;gt; It only happens under high load in production.
&amp;gt; Logs show intermittent payment failures with no error messages.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Extended thinking 장점:&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;h3 data-ke-size=&quot;size23&quot;&gt;3. 알고리즘 최적화&lt;/h3&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;&amp;gt; Think harder about optimizing this database query.
&amp;gt; Current execution time: 45 seconds
&amp;gt; Table has 50M rows with these indexes: [...]
&amp;gt; 
&amp;gt; Consider query plan, indexing strategy, and potential denormalization.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 테스트 케이스 검증&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;For coding tasks, ask Claude to run through test cases in its extended thinking.&quot; &amp;mdash; &lt;a href=&quot;https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/extended-thinking-tips&quot;&gt;Anthropic Extended Thinking Tips&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;&amp;gt; Write a function to validate credit card numbers.
&amp;gt; Before you finish, verify your solution with test cases for:
&amp;gt; - Valid Visa, MasterCard, Amex
&amp;gt; - Invalid checksum
&amp;gt; - Edge cases (empty, too short, too long)
&amp;gt; And fix any issues you find.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 보안 리뷰&lt;/h3&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;&amp;gt; Think hard about security vulnerabilities in this authentication flow.
&amp;gt; Consider:
&amp;gt; - OWASP Top 10
&amp;gt; - Token handling
&amp;gt; - Session management
&amp;gt; - Rate limiting bypass
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Extended Thinking Tips (공식 권장)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 높은 수준의 지시가 더 효과적&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Claude often performs better with &lt;b&gt;high level instructions to just think deeply&lt;/b&gt; about a task rather than step-by-step prescriptive guidance.&quot; &amp;mdash; &lt;a href=&quot;https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/extended-thinking-tips&quot;&gt;Anthropic Extended Thinking Tips&lt;/a&gt;&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;pre class=&quot;vbnet&quot;&gt;&lt;code&gt;Think through this math problem step by step:
1. First, identify the variables
2. Then, set up the equation
3. Next, solve for x
&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;mipsasm&quot;&gt;&lt;code&gt;Please think about this math problem thoroughly and in great detail.
Consider multiple approaches and show your complete reasoning.
Try different methods if your first approach doesn't work.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 최소 budget에서 시작&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;The minimum budget is 1,024 tokens. We suggest &lt;b&gt;starting at the minimum and increasing&lt;/b&gt; the thinking budget incrementally to find the optimal range.&quot; &amp;mdash; &lt;a href=&quot;https://docs.aws.amazon.com/bedrock/latest/userguide/claude-messages-extended-thinking.html&quot;&gt;AWS Bedrock Docs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 문제에 ultrathink를 쓸 필요 없어요:&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;think&quot; 추가&lt;/li&gt;
&lt;li&gt;그래도 부족하면 &quot;think hard&quot;&lt;/li&gt;
&lt;li&gt;정말 복잡하면 &quot;ultrathink&quot;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 자기 검증 요청&lt;/h3&gt;
&lt;pre class=&quot;smali&quot;&gt;&lt;code&gt;&amp;gt; Implement the sorting algorithm.
&amp;gt; After implementation, verify it handles:
&amp;gt; - Empty array
&amp;gt; - Single element
&amp;gt; - Already sorted
&amp;gt; - Reverse sorted
&amp;gt; - Duplicates
&amp;gt; Fix any issues you find.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 영어로 thinking하면 더 효과적&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Extended thinking performs best in English, though final outputs can be in any language Claude supports.&quot; &amp;mdash; &lt;a href=&quot;https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/extended-thinking-tips&quot;&gt;Anthropic Extended Thinking Tips&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&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;Extended Thinking vs Think Tool&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Anthropic은 두 가지 &quot;생각&quot; 메커니즘을 제공해요:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Extended Thinking Think Tool&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&gt;&lt;b&gt;시점&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;답변 생성 &lt;b&gt;전&lt;/b&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;목적&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;사용&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;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Extended thinking is all about what Claude does &lt;b&gt;before&lt;/b&gt; it starts generating a response... The 'think' tool is for Claude, once it starts generating a response, to add a step to &lt;b&gt;stop and think&lt;/b&gt; about whether it has all the information it needs.&quot; &amp;mdash; &lt;a href=&quot;https://www.anthropic.com/engineering/claude-think-tool&quot;&gt;Anthropic Engineering&lt;/a&gt;&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Extended Thinking&lt;/b&gt;: 처음부터 깊은 분석이 필요할 때&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Think Tool&lt;/b&gt;: 여러 도구를 연속 사용하며 중간 점검이 필요할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 Anthropic 권장:&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Extended thinking capabilities have improved since its initial release, such that we recommend using that feature instead of a dedicated think tool in most cases.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Thinking Mode 토글&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code에서 thinking mode를 켜고 끌 수 있어요:&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# 설정에서 토글
&amp;gt; /config

# 또는 Tab 키로 토글 (Plan Mode)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Thinking ON (기본):&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;최대 31,999 토큰&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Thinking OFF:&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;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;비용 고려사항&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;You're charged for all thinking tokens used, even though Claude 4 models show summarized thinking.&quot; &amp;mdash; &lt;a href=&quot;https://docs.anthropic.com/en/docs/claude-code/common-workflows&quot;&gt;Claude Code Docs&lt;/a&gt;&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Thinking 토큰도 &lt;b&gt;비용 청구&lt;/b&gt;됨&lt;/li&gt;
&lt;li&gt;Claude 4 모델은 요약된 thinking만 보여주지만, 전체 토큰에 대해 과금&lt;/li&gt;
&lt;li&gt;ultrathink (31,999 토큰)는 상당한 비용 발생 가능&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;# 토큰 상한 설정
export MAX_THINKING_TOKENS=8000
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;CLAUDE.md에 가이드라인 추가&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# Extended Thinking Guidelines

## When to Use Deep Thinking
- Architecture decisions: always use &quot;think hard&quot; or higher
- Bug debugging: use &quot;think&quot; minimum
- Security reviews: use &quot;ultrathink&quot;
- Simple CRUD: no special thinking needed

## Thinking Budget by Task
| Task Type | Keyword | Budget |
|-----------|---------|--------|
| Quick fix | (none) | default |
| Feature implementation | think | ~4K |
| Architecture design | think hard | ~10K |
| Complex debugging | ultrathink | ~32K |

## Self-Verification
Always verify solutions with edge cases before finalizing.
&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;/h2&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;[ ] Ctrl+O로 verbose mode 활성화해서 thinking 과정 확인&lt;/li&gt;
&lt;li&gt;[ ] 복잡한 문제에 &quot;think&quot; 키워드 사용&lt;/li&gt;
&lt;li&gt;[ ] 아키텍처/보안에 &quot;think hard&quot; 또는 &quot;ultrathink&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[ ] 최소 budget에서 시작, 필요시 증가&lt;/li&gt;
&lt;li&gt;[ ] MAX_THINKING_TOKENS로 비용 제한&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[ ] 높은 수준의 지시 사용 (step-by-step X)&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;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Extended Thinking은 Claude Code의 &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;Extended thinking is enabled by default, reserving a portion of the output token budget (up to 31,999 tokens) for Claude to reason through complex problems step-by-step.&quot; &amp;mdash; &lt;a href=&quot;https://docs.anthropic.com/en/docs/claude-code/common-workflows&quot;&gt;Claude Code Docs&lt;/a&gt;&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;기본 활성화&lt;/b&gt; &amp;mdash; 별도 설정 없이도 작동&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Ctrl+O&lt;/b&gt; &amp;mdash; thinking 과정 볼 수 있음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;think &amp;lt; think hard &amp;lt; ultrathink&lt;/b&gt; &amp;mdash; budget 조절&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; thinking 토큰도 과금&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복잡한 아키텍처 설계, 까다로운 버그, 중요한 기술 결정이 있다면 Extended Thinking을 적극 활용하세요. 시간은 좀 더 걸리지만, &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;참고 자료&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Anthropic 공식&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;a href=&quot;https://docs.anthropic.com/en/docs/build-with-claude/extended-thinking&quot;&gt;Extended Thinking - Claude Docs&lt;/a&gt; &amp;mdash; API 구현 가이드&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/extended-thinking-tips&quot;&gt;Extended Thinking Tips&lt;/a&gt; &amp;mdash; 프롬프팅 팁&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.anthropic.com/news/visible-extended-thinking&quot;&gt;Visible Extended Thinking&lt;/a&gt; &amp;mdash; 기능 소개&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.anthropic.com/en/docs/claude-code/common-workflows&quot;&gt;Claude Code Common Workflows&lt;/a&gt; &amp;mdash; Claude Code에서의 사용&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.anthropic.com/engineering/claude-think-tool&quot;&gt;Claude Think Tool&lt;/a&gt; &amp;mdash; Think Tool vs Extended Thinking&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/bedrock/latest/userguide/claude-messages-extended-thinking.html&quot;&gt;AWS Bedrock Extended Thinking&lt;/a&gt; &amp;mdash; AWS에서의 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programmer/AI</category>
      <category>ai 추론</category>
      <category>Anthropic</category>
      <category>claude code</category>
      <category>Extended Thinking</category>
      <category>thinking mode</category>
      <category>ultrathink</category>
      <category>깊은 사고</category>
      <category>디버깅</category>
      <category>아키텍처 설계</category>
      <category>코딩 ai</category>
      <author>MoreLean</author>
      <guid isPermaLink="true">https://judekim.tistory.com/173</guid>
      <comments>https://judekim.tistory.com/173#entry173comment</comments>
      <pubDate>Wed, 21 Jan 2026 00:57:57 +0900</pubDate>
    </item>
    <item>
      <title>Claude Code 컨테이너 격리와 병렬 개발: devcontainer &amp;amp; git worktree</title>
      <link>https://judekim.tistory.com/172</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너 격리도 중요해요. 특히 프로젝트 여러 개 동시에 진행할 때요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker나 devcontainer 쓰면 환경이 완전히 분리돼요. A 프로젝트 Node 버전이랑 B 프로젝트 Node 버전 충돌 걱정 없어지죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code도 devcontainer 지원해요. .devcontainer 폴더 만들고 설정 파일 넣으면 자동으로 컨테이너 안에서 작업해요. 환경 꼬일 일이 없어요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;TL;DR&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;컨테이너 격리 (devcontainer)&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;Node/Python 버전 충돌 없음&lt;/li&gt;
&lt;li&gt;YOLO 모드를 &lt;b&gt;안전하게&lt;/b&gt; 사용 가능&lt;/li&gt;
&lt;li&gt;Anthropic 공식 레퍼런스 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;병렬 개발 (git worktree)&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;여러 Claude 인스턴스 &lt;b&gt;동시 실행&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;같은 레포에서 &lt;b&gt;독립적 작업&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;디스크 공간 효율적 (전체 복사 X)&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;h2 data-ke-size=&quot;size26&quot;&gt;Part 1: devcontainer로 환경 격리&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;왜 컨테이너 격리가 필요한가?&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Use devcontainers to &lt;b&gt;isolate different client projects&lt;/b&gt;, ensuring code and credentials never mix between environments.&quot; &amp;mdash; &lt;a href=&quot;https://code.claude.com/docs/en/devcontainer&quot;&gt;Claude Code Docs&lt;/a&gt;&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;A 프로젝트: Node 18, B 프로젝트: Node 20 &amp;rarr; 충돌&lt;/li&gt;
&lt;li&gt;전역 패키지가 서로 영향&lt;/li&gt;
&lt;li&gt;&quot;내 컴퓨터에서는 되는데...&quot; 문제&lt;/li&gt;
&lt;li&gt;YOLO 모드 사용 시 보안 우려&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;devcontainer 해결:&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;li&gt;팀원 모두 &lt;b&gt;동일한 환경&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;컨테이너 안에서 YOLO 모드 &lt;b&gt;안전하게&lt;/b&gt; 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Anthropic 공식 devcontainer&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Anthropic이 공식 레퍼런스 devcontainer를 제공해요:&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;The reference devcontainer setup and associated Dockerfile offer a &lt;b&gt;preconfigured development container&lt;/b&gt; that you can use as is, or customize for your needs.&quot; &amp;mdash; &lt;a href=&quot;https://code.claude.com/docs/en/devcontainer&quot;&gt;Claude Code Docs&lt;/a&gt;&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;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;.devcontainer/
├── devcontainer.json   # 컨테이너 설정, 확장, 볼륨 마운트
├── Dockerfile          # 컨테이너 이미지 정의
└── init-firewall.sh    # 네트워크 보안 규칙
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;빠른 시작 (4단계)&lt;/h3&gt;
&lt;pre class=&quot;clean&quot;&gt;&lt;code&gt;# 1. VS Code와 Dev Containers 확장 설치

# 2. Anthropic 공식 레퍼런스 클론
git clone https://github.com/anthropics/claude-code.git
cd claude-code

# 3. VS Code로 열기
code .

# 4. &quot;Reopen in Container&quot; 클릭 (또는 Cmd+Shift+P &amp;rarr; &quot;Remote-Containers: Reopen in Container&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 devcontainer.json 예시&lt;/h3&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;name&quot;: &quot;Claude Code Dev&quot;,
  &quot;image&quot;: &quot;mcr.microsoft.com/devcontainers/javascript-node:20&quot;,
  
  &quot;features&quot;: {
    &quot;ghcr.io/devcontainers/features/git:1&quot;: {}
  },
  
  &quot;customizations&quot;: {
    &quot;vscode&quot;: {
      &quot;extensions&quot;: [
        &quot;dbaeumer.vscode-eslint&quot;,
        &quot;esbenp.prettier-vscode&quot;
      ]
    }
  },
  
  &quot;postCreateCommand&quot;: &quot;npm install -g @anthropic-ai/claude-code&quot;,
  
  &quot;remoteUser&quot;: &quot;node&quot;,
  
  &quot;containerEnv&quot;: {
    &quot;CLAUDE_CONFIG_DIR&quot;: &quot;/home/node/.claude&quot;
  },
  
  &quot;mounts&quot;: [
    &quot;source=claude-config,target=/home/node/.claude,type=volume&quot;
  ]
}
&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;Anthropic devcontainer의 &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;The container implements a &lt;b&gt;multi-layered security approach&lt;/b&gt; with its firewall configuration.&quot; &amp;mdash; &lt;a href=&quot;https://code.claude.com/docs/en/devcontainer&quot;&gt;Claude Code Docs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보안 레이어 설명&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;정밀 접근 제어&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;화이트리스트 도메인만 허용 (npm, GitHub, Claude API)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Default-deny&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;격리&lt;/b&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;YOLO 모드 안전하게 사용하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;devcontainer 안에서는 YOLO 모드를 &lt;b&gt;상대적으로 안전하게&lt;/b&gt; 사용할 수 있어요:&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;# 컨테이너 안에서
claude --dangerously-skip-permissions
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;The container's enhanced security measures (isolation and firewall rules) allow you to run claude --dangerously-skip-permissions to bypass permission prompts for unattended operation.&quot; &amp;mdash; &lt;a href=&quot;https://code.claude.com/docs/en/devcontainer&quot;&gt;Claude Code Docs&lt;/a&gt;&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;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;devcontainers don't prevent a malicious project from exfiltrating anything accessible in the devcontainer including Claude Code credentials. We recommend only using devcontainers when &lt;b&gt;developing with trusted repositories&lt;/b&gt;.&quot;&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;&lt;b&gt;Node.js 프로젝트:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;name&quot;: &quot;Node 20 Project&quot;,
  &quot;image&quot;: &quot;mcr.microsoft.com/devcontainers/javascript-node:20&quot;,
  &quot;postCreateCommand&quot;: &quot;npm install &amp;amp;&amp;amp; npm install -g @anthropic-ai/claude-code&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Python 프로젝트:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;name&quot;: &quot;Python 3.12 Project&quot;, 
  &quot;image&quot;: &quot;mcr.microsoft.com/devcontainers/python:3.12&quot;,
  &quot;postCreateCommand&quot;: &quot;pip install -r requirements.txt &amp;amp;&amp;amp; npm install -g @anthropic-ai/claude-code&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;멀티 서비스 (Docker Compose):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;# docker-compose.yml
version: '3.8'
services:
  app:
    build:
      context: ..
      dockerfile: .devcontainer/Dockerfile
    volumes:
      - ../..:/workspaces:cached
      - node-modules:/workspaces/project/node_modules
    depends_on:
      - db
    environment:
      - DATABASE_URL=postgresql://postgres:postgres@db:5432/mydb
      
  db:
    image: postgres:16
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: mydb
    volumes:
      - postgres-data:/var/lib/postgresql/data

volumes:
  node-modules:
  postgres-data:
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Claude 설정 영속화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너를 재빌드해도 Claude 인증이 유지되도록:&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;mounts&quot;: [
    &quot;source=claude-code-config,target=/home/node/.claude,type=volume&quot;
  ],
  &quot;containerEnv&quot;: {
    &quot;CLAUDE_CONFIG_DIR&quot;: &quot;/home/node/.claude&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 2: git worktree로 병렬 개발&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;왜 git worktree인가?&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Using git worktrees enables you to &lt;b&gt;run multiple Claude sessions simultaneously&lt;/b&gt; on different parts of your project, each focused on its own independent task.&quot; &amp;mdash; &lt;a href=&quot;https://www.anthropic.com/engineering/claude-code-best-practices&quot;&gt;Anthropic Best Practices&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제:&lt;/b&gt; 여러 Claude 인스턴스를 같은 디렉토리에서 실행하면 &lt;b&gt;서로 충돌&lt;/b&gt;해요. 파일을 동시에 수정하면서 엉망이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결:&lt;/b&gt; git worktree로 &lt;b&gt;격리된 작업 공간&lt;/b&gt;을 만들어 각 Claude가 독립적으로 작업하게 해요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;git worktree 기본 개념&lt;/h3&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;# 일반적인 방식: 전체 레포 복사 (비효율적)
/projects/
├── my-project/           # 원본
├── my-project-copy-1/    # 전체 복사 (.git 포함)
└── my-project-copy-2/    # 전체 복사 (.git 포함)

# git worktree 방식: 작업 파일만 분리 (효율적)
/projects/
├── my-project/           # 메인 (.git 여기에만)
├── feature-auth/         # worktree (링크만)
└── feature-api/          # worktree (링크만)
&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;디스크 공간 효율적 (node_modules 복사 X)&lt;/li&gt;
&lt;li&gt;모든 worktree가 &lt;b&gt;동기화&lt;/b&gt; (fetch가 전체에 적용)&lt;/li&gt;
&lt;li&gt;같은 브랜치 &lt;b&gt;중복 체크아웃 방지&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;git worktree와 branch의 관계&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심 원칙: 1 worktree = 1 branch (1:1 관계)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│                    .git/ (공유)                              │
│  ┌──────────────┬──────────────┬──────────────┐            │
│  │   objects/   │    refs/     │   config     │            │
│  │  (커밋 히스토리) │  (브랜치 정보)  │   (설정)      │            │
│  └──────────────┴──────────────┴──────────────┘            │
└─────────────────────────────────────────────────────────────┘
         │                │                │
         ▼                ▼                ▼
┌─────────────┐  ┌─────────────┐  ┌─────────────┐
│ my-project/ │  │ feature-a/  │  │ hotfix/     │
│ (main)      │  │ (feat/a)    │  │ (fix/bug)   │
│             │  │             │  │             │
│ Working     │  │ Working     │  │ Working     │
│ Directory   │  │ Directory   │  │ Directory   │
└─────────────┘  └─────────────┘  └─────────────┘
   메인 worktree      worktree 1       worktree 2
&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;.git/ 디렉토리 (히스토리, 설정, refs)&lt;/li&gt;
&lt;li&gt;git fetch 결과 (한 곳에서 fetch하면 전체 적용)&lt;/li&gt;
&lt;li&gt;remote 설정&lt;/li&gt;
&lt;li&gt;hooks&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;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;node_modules/, venv/ 등 (각 worktree에서 별도 설치 필요)&lt;/li&gt;
&lt;li&gt;.env 파일 (복사 필요)&lt;/li&gt;
&lt;li&gt;스테이징 영역 (각자 독립적인 git add)&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;# ❌ 같은 브랜치를 두 worktree에서 체크아웃 불가!
git worktree add ../another main
# fatal: 'main' is already checked out at '/projects/my-project'

# ✅ 반드시 다른 브랜치여야 함
git worktree add ../feature-a -b feat/a
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 사용법&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# 1. 새 worktree 생성
git worktree add ../feature-auth -b feat/auth

# 2. 다른 터미널에서 해당 worktree로 이동
cd ../feature-auth

# 3. Claude Code 실행
claude

# 4. 작업 완료 후 worktree 제거
cd ../my-project
git worktree remove ../feature-auth
&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 2.5: 실무 Flow와 Best Practices&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;디렉토리 구조 Best Practice&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;jboss-cli&quot;&gt;&lt;code&gt;/projects/
├── my-project/              # 메인 worktree (main 브랜치)
│   ├── .git/                # 실제 Git 데이터 (여기만!)
│   ├── src/
│   ├── CLAUDE.md
│   └── ...
│
└── worktrees/               # worktree 전용 폴더 (프로젝트 밖)
    ├── feature/
    │   ├── user-auth/       # feat/user-auth 브랜치
    │   └── payment-api/     # feat/payment-api 브랜치
    ├── bugfix/
    │   └── login-error/     # fix/login-error 브랜치
    └── review/
        └── pr-123/          # PR 리뷰용
&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;Git이 worktree를 서브디렉토리로 착각하지 않음&lt;/li&gt;
&lt;li&gt;IDE가 혼란스러워하지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;실무 시나리오별 Flow&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;&lt;b&gt;상황:&lt;/b&gt; feature 개발 중인데 프로덕션 버그 발생&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# 현재: my-project/에서 feat/new-dashboard 작업 중

# 1. 핫픽스용 worktree 생성 (main 기반)
git worktree add ../worktrees/hotfix/payment-bug -b fix/payment-bug origin/main

# 2. 핫픽스 worktree로 이동
cd ../worktrees/hotfix/payment-bug

# 3. 의존성 설치 &amp;amp; 환경 설정
npm install
cp ../../my-project/.env .env

# 4. Claude로 버그 수정
claude
# &quot;Fix the payment timeout issue in checkout flow&quot;

# 5. 커밋 &amp;amp; 푸시
git add .
git commit -m &quot;fix: payment timeout issue in checkout&quot;
git push origin fix/payment-bug

# 6. PR 생성 (Claude가 gh CLI로 가능)
gh pr create --base main --title &quot;Fix payment timeout&quot;

# 7. 머지 후 정리
cd ../../../my-project
git worktree remove ../worktrees/hotfix/payment-bug
git branch -d fix/payment-bug

# 8. 원래 작업으로 복귀 (컨텍스트 그대로!)
claude --resume
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Flow 다이어그램:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;main ─────────────────●────────────────────────────────●─────
                      │                                &amp;uarr;
                      │ git worktree add               │ merge
                      ▼                                │
fix/payment-bug ──────●────────●───────────────────────┘
                      │        │
                   worktree  commit
                   생성      &amp;amp; push
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;시나리오 2: 병렬 기능 개발&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상황:&lt;/b&gt; 독립적인 2개 기능을 동시에 개발&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# 1. 기능 A worktree
git worktree add ../worktrees/feature/user-profile -b feat/user-profile origin/develop
cd ../worktrees/feature/user-profile
npm install &amp;amp;&amp;amp; cp ../../my-project/.env .env

# 2. 기능 B worktree (다른 터미널)
git worktree add ../worktrees/feature/notification -b feat/notification origin/develop
cd ../worktrees/feature/notification
npm install &amp;amp;&amp;amp; cp ../../my-project/.env .env

# 3. 각 터미널에서 Claude 실행
# 터미널 1:
claude
# &quot;Implement user profile edit functionality&quot;

# 터미널 2:
claude
# &quot;Implement push notification system&quot;

# 4. 각자 완료되면 PR 생성
# 5. develop에 순차적으로 머지
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Flow 다이어그램:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;develop ────●─────────────────────────────●────────●─────
            │                             &amp;uarr;        &amp;uarr;
            ├─────────────────────────────┘        │
            │         feat/user-profile            │
            │                                      │
            └──────────────────────────────────────┘
                      feat/notification
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;시나리오 3: PR 리뷰 중 다른 작업&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상황:&lt;/b&gt; 내 PR이 리뷰 중인데 다른 작업 시작해야 함&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# 현재: feat/dashboard PR이 리뷰 중
# my-project/는 feat/dashboard 브랜치 상태

# 1. 새 작업용 worktree 생성
git worktree add ../worktrees/feature/analytics -b feat/analytics origin/develop

# 2. 새 작업 시작
cd ../worktrees/feature/analytics
claude
# 새 기능 개발...

# 3. 리뷰 코멘트 오면 원래 worktree로 돌아가기
cd ../my-project  # 여전히 feat/dashboard 상태!
claude --resume   # 컨텍스트 유지!
# 리뷰 반영...

# 4. 왔다갔다 가능 (컨텍스트 손실 없음!)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;시나리오 4: 경쟁적 구현 (A/B 테스트)&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;routeros&quot;&gt;&lt;code&gt;# 검색 기능을 3가지 방식으로 동시 구현
git worktree add ../worktrees/feature/search-elastic -b feat/search-elastic
git worktree add ../worktrees/feature/search-postgres -b feat/search-postgres
git worktree add ../worktrees/feature/search-algolia -b feat/search-algolia

# 각 worktree에서 Claude에게 다른 지시
# Elastic: &quot;Implement search using Elasticsearch&quot;
# Postgres: &quot;Implement search using PostgreSQL full-text search&quot;
# Algolia: &quot;Implement search using Algolia API&quot;

# 결과 비교 후 최적의 구현 선택
npm run benchmark  # 각 worktree에서 성능 테스트
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Merge 전략&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;순차적 머지 (권장)&lt;/h4&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;# 1. develop 최신화
cd my-project
git checkout develop
git pull origin develop

# 2. 기능 A 머지
git merge feat/user-profile
git push origin develop

# 3. 기능 B를 최신 develop에 리베이스 후 머지
cd ../worktrees/feature/notification
git fetch origin
git rebase origin/develop
# 충돌 해결 (필요시)
git push origin feat/notification --force-with-lease

cd ../my-project
git pull origin develop
git merge feat/notification
git push origin develop
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;tasks.md로 작업 추적&lt;/h4&gt;
&lt;pre class=&quot;gherkin&quot;&gt;&lt;code&gt;&amp;lt;!-- tasks.md (메인 worktree에 위치) --&amp;gt;
# 현재 진행 중인 작업

## Active Worktrees

| Worktree | Branch | 담당 | 상태 | 예상 완료 |
|----------|--------|------|------|----------|
| feature/user-profile | feat/user-profile | Claude-1 |   진행중 | 1/22 |
| feature/notification | feat/notification | Claude-2 |   PR 리뷰 중 | 1/21 |
| hotfix/payment | fix/payment-bug | Claude-3 | ✅ 머지됨 | 1/20 |

## Merge Order
1. ✅ fix/payment-bug &amp;rarr; main (긴급)
2.   feat/notification &amp;rarr; develop
3. ⏳ feat/user-profile &amp;rarr; develop (notification 머지 후)

## Dependencies
- feat/user-profile은 feat/notification 완료 후 시작 가능한 부분 있음
- 공통 컴포넌트는 develop에서 먼저 작업
&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;b&gt;worktree 생성 스크립트:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;#!/bin/bash
# save as: scripts/new-worktree.sh

TYPE=$1  # feature, bugfix, hotfix, review
NAME=$2  # 작업 이름
BASE=${3:-origin/develop}  # 기본 브랜치

if [ -z &quot;$TYPE&quot; ] || [ -z &quot;$NAME&quot; ]; then
    echo &quot;Usage: ./new-worktree.sh &amp;lt;type&amp;gt; &amp;lt;name&amp;gt; [base-branch]&quot;
    echo &quot;Example: ./new-worktree.sh feature user-auth&quot;
    echo &quot;         ./new-worktree.sh hotfix payment-bug origin/main&quot;
    exit 1
fi

BRANCH=&quot;$TYPE/$NAME&quot;
DIR=&quot;../worktrees/$TYPE/$NAME&quot;

# 디렉토리 생성
mkdir -p &quot;../worktrees/$TYPE&quot;

# 최신 정보 fetch
git fetch origin

# worktree 생성
echo &quot;  Creating worktree: $DIR (branch: $BRANCH)&quot;
git worktree add &quot;$DIR&quot; -b &quot;$BRANCH&quot; &quot;$BASE&quot;

if [ $? -eq 0 ]; then
    echo &quot;✅ Worktree created!&quot;
    echo &quot;&quot;
    echo &quot;Next steps:&quot;
    echo &quot;  cd $DIR&quot;
    echo &quot;  npm install  # or your package manager&quot;
    echo &quot;  cp ../../my-project/.env .env  # if needed&quot;
    echo &quot;  claude&quot;
else
    echo &quot;❌ Failed to create worktree&quot;
    exit 1
fi
&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;bash&quot;&gt;&lt;code&gt;#!/bin/bash
# save as: scripts/cleanup-worktrees.sh

echo &quot;  Cleaning up merged worktrees...&quot;

git worktree list | grep -v &quot;$(git rev-parse --show-toplevel)&quot; | while read -r line; do
    worktree_path=$(echo &quot;$line&quot; | awk '{print $1}')
    branch=$(echo &quot;$line&quot; | awk '{print $3}' | tr -d '[]')
    
    # main/develop에 머지된 브랜치인지 확인
    if git branch --merged develop 2&amp;gt;/dev/null | grep -q &quot;$branch&quot;; then
        echo &quot;Removing merged worktree: $worktree_path ($branch)&quot;
        git worktree remove &quot;$worktree_path&quot;
        git branch -d &quot;$branch&quot; 2&amp;gt;/dev/null
    fi
done

# 오래된 worktree 메타데이터 정리
git worktree prune

echo &quot;✅ Cleanup complete!&quot;
git worktree list
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Claude Code 커스텀 명령어&lt;/h3&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;&amp;lt;!-- .claude/commands/worktree-new.md --&amp;gt;
---
description: Create a new git worktree for parallel development
---

# Create New Worktree

Create a git worktree for: $ARGUMENTS

## Steps:
1. Parse the argument to determine type and name
   - Format: &quot;feature user-auth&quot; or &quot;hotfix payment-bug main&quot;
   
2. Run the worktree creation:
   ```bash
   ./scripts/new-worktree.sh &amp;lt;type&amp;gt; &amp;lt;name&amp;gt; [base]
&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Navigate to the new worktree and set up:&lt;/li&gt;
&lt;li&gt;cd &amp;lt;worktree-path&amp;gt; npm install&lt;/li&gt;
&lt;li&gt;Copy necessary env files if they exist&lt;/li&gt;
&lt;li&gt;Report the worktree location and suggest next steps&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;```markdown
&amp;lt;!-- .claude/commands/worktree-status.md --&amp;gt;
---
description: Show status of all worktrees
---

# Worktree Status

Show the current status of all git worktrees:

```bash
echo &quot;  All Worktrees:&quot;
git worktree list

echo &quot;&quot;
echo &quot;  Branch Status:&quot;
for dir in ../worktrees/*/*; do
    if [ -d &quot;$dir&quot; ]; then
        echo &quot;---&quot;
        echo &quot;  $dir&quot;
        cd &quot;$dir&quot;
        git status --short
        echo &quot;Last commit: $(git log -1 --format='%s (%cr)')&quot;
        cd - &amp;gt; /dev/null
    fi
done
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;### Best Practices 체크리스트

**worktree 생성 시:**
- [ ] 프로젝트 밖에 worktree 디렉토리 생성 (`../worktrees/`)
- [ ] 의미 있는 디렉토리 구조 사용 (`feature/`, `bugfix/`, `hotfix/`)
- [ ] 브랜치 네이밍 규칙 따르기 (`feat/`, `fix/`, `hotfix/`)
- [ ] 올바른 base 브랜치 선택 (feature&amp;rarr;develop, hotfix&amp;rarr;main)
- [ ] `npm install` 또는 의존성 설치
- [ ] `.env` 파일 복사

**작업 중:**
- [ ] 각 worktree에서 `/init` 실행 (CLAUDE.md 생성)
- [ ] 세션 이름 명명 (`/session feature-user-auth`)
- [ ] 자주 커밋 (작은 단위로)
- [ ] tasks.md로 진행 상황 추적

**머지 시:**
- [ ] develop/main 최신화 후 리베이스
- [ ] 충돌 해결
- [ ] 테스트 통과 확인
- [ ] PR 생성 &amp;amp; 리뷰

**정리:**
- [ ] 머지 후 worktree 제거 (`git worktree remove`)
- [ ] 브랜치 삭제 (`git branch -d`)
- [ ] 주기적으로 `git worktree prune` 실행

### 병렬 개발 워크플로우

&amp;gt; &quot;For instance, you might have one Claude refactoring your authentication system while another builds a completely unrelated data visualization component.&quot;
&amp;gt; &amp;mdash; [Anthropic Best Practices](https://www.anthropic.com/engineering/claude-code-best-practices)

**예시: 3개 작업 동시 진행**

```bash
# 터미널 1: 인증 리팩토링
git worktree add ../auth-refactor -b refactor/auth
cd ../auth-refactor
claude
# &quot;Refactor the authentication system to use JWT&quot;

# 터미널 2: 새 기능 개발  
git worktree add ../ai-chat -b feat/ai-chat
cd ../ai-chat
claude
# &quot;Implement AI chat feature with streaming&quot;

# 터미널 3: 버그 수정
git worktree add ../hotfix -b fix/payment-bug
cd ../hotfix
claude
# &quot;Fix the payment processing bug in checkout flow&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;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;/projects/
├── my-project/        # 메인 (main 브랜치)
│   └── .git/          # 실제 Git 데이터
├── auth-refactor/     # worktree (refactor/auth 브랜치)
│   └── .git           # 링크 파일
├── ai-chat/           # worktree (feat/ai-chat 브랜치)
│   └── .git           # 링크 파일
└── hotfix/            # worktree (fix/payment-bug 브랜치)
    └── .git           # 링크 파일
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;/resume으로 세션 관리&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Sessions are stored per project directory. The /resume picker shows sessions from the &lt;b&gt;same git repository, including worktrees&lt;/b&gt;.&quot; &amp;mdash; &lt;a href=&quot;https://code.claude.com/docs/en/common-workflows&quot;&gt;Claude Code Docs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# worktree에서 세션 이름 지정
claude
&amp;gt; /session auth-refactoring-session

# 나중에 재개
claude --resume
# 또는 세션 내에서
&amp;gt; /resume
&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;b&gt;worktree 초기화 명령어:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;&amp;lt;!-- .claude/commands/worktree-init.md --&amp;gt;
---
description: Initialize parallel worktrees for a feature
---

# Initialize Parallel Worktrees

## Variables
FEATURE_NAME: $ARGUMENTS

## Instructions

Create git worktrees for parallel development of FEATURE_NAME.

1. Create the worktrees directory if it doesn't exist:
   ```bash
   mkdir -p ../worktrees
&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Create a new git worktree:&lt;/li&gt;
&lt;li&gt;git worktree add ../worktrees/FEATURE_NAME -b feat/FEATURE_NAME&lt;/li&gt;
&lt;li&gt;Copy environment files:&lt;/li&gt;
&lt;li&gt;cp .env.example ../worktrees/FEATURE_NAME/.env&lt;/li&gt;
&lt;li&gt;Install dependencies in the new worktree:&lt;/li&gt;
&lt;li&gt;cd ../worktrees/FEATURE_NAME &amp;amp;&amp;amp; npm install&lt;/li&gt;
&lt;li&gt;Report the worktree location and next steps.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;autohotkey&quot;&gt;&lt;code&gt;**사용:**
```bash
&amp;gt; /worktree-init user-dashboard
&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;b&gt;여러 방식으로 동시 구현&lt;/b&gt;하고 최적의 결과 선택:&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# 3개의 다른 접근법으로 동시 구현
git worktree add ../impl-approach-1 -b feat/search-v1
git worktree add ../impl-approach-2 -b feat/search-v2  
git worktree add ../impl-approach-3 -b feat/search-v3

# 각 worktree에서 다른 지시
# Approach 1: &quot;Implement search using Elasticsearch&quot;
# Approach 2: &quot;Implement search using PostgreSQL full-text&quot;
# Approach 3: &quot;Implement search using Algolia&quot;

# 결과 비교 후 최적의 구현 선택
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;worktree 관리 팁&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;현재 worktree 목록:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;git worktree list
# /projects/my-project        abc1234 [main]
# /projects/auth-refactor     def5678 [refactor/auth]
# /projects/ai-chat           ghi9012 [feat/ai-chat]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;worktree 제거:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# 작업 완료 후
git worktree remove ../auth-refactor

# 강제 제거 (변경사항 있어도)
git worktree remove --force ../auth-refactor
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;오래된 worktree 정리:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;git worktree prune
&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 3: devcontainer + git worktree 조합&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최강 조합&lt;/h3&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;devcontainer (환경 격리) + git worktree (작업 격리)
= 완벽한 병렬 개발 환경
&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;프로젝트를 devcontainer로 열기&lt;/li&gt;
&lt;li&gt;컨테이너 안에서 git worktree 생성&lt;/li&gt;
&lt;li&gt;각 worktree에서 별도 Claude 세션 실행&lt;/li&gt;
&lt;li&gt;YOLO 모드로 빠르게 작업&lt;/li&gt;
&lt;li&gt;작업 완료 후 메인에 머지&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# devcontainer 안에서
git worktree add ../feature-a -b feat/a
git worktree add ../feature-b -b feat/b

# 터미널 1
cd ../feature-a &amp;amp;&amp;amp; claude --dangerously-skip-permissions

# 터미널 2  
cd ../feature-b &amp;amp;&amp;amp; claude --dangerously-skip-permissions
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;CLAUDE.md에 병렬 개발 가이드 추가&lt;/h3&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;# Parallel Development Guidelines

## Git Worktree Conventions
- Worktree location: `../worktrees/`
- Branch naming: `feat/`, `fix/`, `refactor/` prefixes
- Always run `/init` in new worktrees

## Session Management
- Name sessions descriptively: `/session feature-name-task`
- Use `/resume` to continue work

## Merge Protocol
1. Complete feature in worktree
2. Run all tests
3. Commit with semantic message
4. Switch to main and merge
5. Remove worktree after merge
&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;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;devcontainer 한계&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;IDE 통합 제한&lt;/b&gt;: 일부 IDE 기능이 작동 안 할 수 있음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;리소스 사용&lt;/b&gt;: Docker Desktop 메모리 8GB+ 권장&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;h3 data-ke-size=&quot;size23&quot;&gt;git worktree 한계&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;: worktree 간 .env 등 복사 필요&lt;/li&gt;
&lt;li&gt;&lt;b&gt;node_modules&lt;/b&gt;: 각 worktree에서 npm install 필요&lt;/li&gt;
&lt;li&gt;&lt;b&gt;머지 충돌&lt;/b&gt;: 결국 통합할 때 충돌 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비용 증가&lt;/b&gt;: 여러 Claude 세션 = 더 많은 토큰 사용&lt;/li&gt;
&lt;/ul&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;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&gt;프로젝트별 환경 다름&lt;/td&gt;
&lt;td&gt;devcontainer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;YOLO 모드 안전하게&lt;/td&gt;
&lt;td&gt;devcontainer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;같은 레포 병렬 작업&lt;/td&gt;
&lt;td&gt;git worktree&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;독립적 기능 동시 개발&lt;/td&gt;
&lt;td&gt;git worktree&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;팀 환경 통일&lt;/td&gt;
&lt;td&gt;devcontainer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;빠른 실험/비교&lt;/td&gt;
&lt;td&gt;git worktree&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;체크리스트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;devcontainer 설정&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;[ ] VS Code Dev Containers 확장 설치&lt;/li&gt;
&lt;li&gt;[ ] Docker Desktop 실행 중&lt;/li&gt;
&lt;li&gt;[ ] .devcontainer/devcontainer.json 생성&lt;/li&gt;
&lt;li&gt;[ ] Claude 설정 볼륨 마운트&lt;/li&gt;
&lt;li&gt;[ ] 방화벽 규칙 확인 (필요시)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;git worktree 활용&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;[ ] worktree 디렉토리 규칙 정하기 (../worktrees/)&lt;/li&gt;
&lt;li&gt;[ ] 브랜치 네이밍 규칙 정하기&lt;/li&gt;
&lt;li&gt;[ ] 각 worktree에서 /init 실행&lt;/li&gt;
&lt;li&gt;[ ] 세션 이름 명명하기&lt;/li&gt;
&lt;li&gt;[ ] 작업 완료 후 worktree 정리&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;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;[ ] 각 Claude에 명확한 작업 지시&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;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;**컨테이너 격리 (devcontainer)**는 프로젝트 간 환경 충돌을 막고, YOLO 모드를 안전하게 사용할 수 있게 해줘요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;git worktree&lt;/b&gt;는 같은 레포에서 여러 Claude 인스턴스를 동시에 돌릴 수 있게 해주는 &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;Using git worktrees enables you to run multiple Claude sessions simultaneously on different parts of your project, each focused on its own independent task.&quot; &amp;mdash; &lt;a href=&quot;https://www.anthropic.com/engineering/claude-code-best-practices&quot;&gt;Anthropic Best Practices&lt;/a&gt;&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;환경 격리&lt;/b&gt;가 필요하면 &amp;rarr; devcontainer&lt;/li&gt;
&lt;li&gt;&lt;b&gt;작업 격리&lt;/b&gt;가 필요하면 &amp;rarr; git worktree&lt;/li&gt;
&lt;li&gt;&lt;b&gt;둘 다 필요하면&lt;/b&gt; &amp;rarr; devcontainer 안에서 git worktree&lt;/li&gt;
&lt;/ul&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;참고 자료&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Anthropic 공식&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;a href=&quot;https://code.claude.com/docs/en/devcontainer&quot;&gt;Development containers - Claude Code Docs&lt;/a&gt; &amp;mdash; devcontainer 공식 문서&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.anthropic.com/engineering/claude-code-best-practices&quot;&gt;Claude Code Best Practices&lt;/a&gt; &amp;mdash; git worktree 베스트 프랙티스&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/en/common-workflows&quot;&gt;Common workflows - Claude Code Docs&lt;/a&gt; &amp;mdash; /resume과 세션 관리&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/anthropics/claude-code/tree/main/.devcontainer&quot;&gt;Anthropic devcontainer 레퍼런스&lt;/a&gt; &amp;mdash; 공식 설정 파일&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://incident.io/blog/shipping-faster-with-claude-code-and-git-worktrees&quot;&gt;incident.io - Shipping faster with Claude Code and Git Worktrees&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stevekinney.com/courses/ai-development/git-worktrees&quot;&gt;Steve Kinney - Git Worktrees for Parallel AI Development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://codewithandrea.com/articles/run-ai-agents-inside-devcontainer/&quot;&gt;Code with Andrea - Run AI Agents Inside DevContainer&lt;/a&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/stravu/crystal&quot;&gt;Crystal&lt;/a&gt; &amp;mdash; 병렬 worktree 관리 데스크톱 앱&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/nezhar/claude-container&quot;&gt;claude-container&lt;/a&gt; &amp;mdash; Docker 워크플로우&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programmer/AI</category>
      <category>Anthropic</category>
      <category>claude code</category>
      <category>devcontainer</category>
      <category>docker</category>
      <category>git worktree</category>
      <category>yolo 모드</category>
      <category>멀티 에이전트</category>
      <category>병렬 개발</category>
      <category>컨테이너</category>
      <category>환경 격리</category>
      <author>MoreLean</author>
      <guid isPermaLink="true">https://judekim.tistory.com/172</guid>
      <comments>https://judekim.tistory.com/172#entry172comment</comments>
      <pubDate>Wed, 21 Jan 2026 00:54:21 +0900</pubDate>
    </item>
    <item>
      <title>Claude Code Thinking Mode: ultrathink로 깊게 생각시키기</title>
      <link>https://judekim.tistory.com/171</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;고급 기능 하나 알려드릴게요. &lt;b&gt;ultrathink&lt;/b&gt;라는 키워드예요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프롬프트에 ultrathink 넣으면 Claude Code가 &lt;b&gt;더 깊게 생각&lt;/b&gt;해요. 복잡한 아키텍처 설계하거나 어려운 버그 잡을 때 쓰면 성공률이 확 올라가요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, 시간이 좀 더 걸려요. 급할 땐 빼고, &lt;b&gt;정말 중요한 결정할 때만&lt;/b&gt; ultrathink 쓰세요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;TL;DR&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;think &amp;lt; think hard &amp;lt; think harder &amp;lt; ultrathink&lt;/b&gt; &amp;mdash; 단계별 thinking 강도&lt;/li&gt;
&lt;li&gt;ultrathink = &lt;b&gt;최대 32,000 토큰&lt;/b&gt;의 thinking budget 할당&lt;/li&gt;
&lt;li&gt;복잡한 아키텍처, 까다로운 버그에 효과적&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Claude Code 전용&lt;/b&gt; 기능 (일반 Chat/API에서는 안 됨)&lt;/li&gt;
&lt;li&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;Extended Thinking이란?&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;We recommend using the word 'think' to trigger extended thinking mode, which gives Claude &lt;b&gt;additional computation time to evaluate alternatives more thoroughly&lt;/b&gt;.&quot; &amp;mdash; &lt;a href=&quot;https://www.anthropic.com/engineering/claude-code-best-practices&quot;&gt;Anthropic Best Practices&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Extended Thinking은 Claude가 답변하기 전에 &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;Thinking 레벨 4단계&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Anthropic 공식 문서에 명시된 &lt;b&gt;4단계 thinking budget&lt;/b&gt;:&lt;/p&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;think &amp;lt; think hard &amp;lt; think harder &amp;lt; ultrathink
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;These specific phrases are &lt;b&gt;mapped directly to increasing levels of thinking budget&lt;/b&gt; in the system.&quot; &amp;mdash; &lt;a href=&quot;https://www.anthropic.com/engineering/claude-code-best-practices&quot;&gt;Anthropic Best Practices&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;&lt;a href=&quot;https://simonwillison.net/2025/Apr/19/claude-code-best-practices/&quot;&gt;Simon Willison이 Claude Code 소스를 분석&lt;/a&gt;한 결과:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키워드 Thinking 토큰 용도&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&gt;think&lt;/td&gt;
&lt;td&gt;~4,000&lt;/td&gt;
&lt;td&gt;일반적인 작업&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;think hard, megathink&lt;/td&gt;
&lt;td&gt;~10,000&lt;/td&gt;
&lt;td&gt;중간 복잡도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;think harder, ultrathink&lt;/td&gt;
&lt;td&gt;~32,000&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;트리거 키워드들&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ultrathink 레벨&lt;/b&gt; (32K 토큰):&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ultrathink&lt;/li&gt;
&lt;li&gt;think harder&lt;/li&gt;
&lt;li&gt;think intensely&lt;/li&gt;
&lt;li&gt;think longer&lt;/li&gt;
&lt;li&gt;think really hard&lt;/li&gt;
&lt;li&gt;think super hard&lt;/li&gt;
&lt;li&gt;think very hard&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;megathink 레벨&lt;/b&gt; (10K 토큰):&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;think hard&lt;/li&gt;
&lt;li&gt;think deeply&lt;/li&gt;
&lt;li&gt;think more&lt;/li&gt;
&lt;li&gt;think a lot&lt;/li&gt;
&lt;li&gt;megathink&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기본 think&lt;/b&gt; (4K 토큰):&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;think&lt;/li&gt;
&lt;li&gt;think about it&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;언제 ultrathink를 쓸까?&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ ultrathink 권장&lt;/h3&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;Design a scalable microservices architecture for our e-commerce platform. Please ultrathink about scalability, fault tolerance, and maintainability.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;까다로운 버그 디버깅&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;This race condition only happens in production under high load. Ultrathink about all possible causes and solutions.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;중요한 마이그레이션 계획&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;We need to migrate from MongoDB to PostgreSQL without downtime. Think harder about the migration strategy and rollback plan.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;보안 취약점 분석&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Review our authentication flow for security vulnerabilities. Ultrathink about edge cases and attack vectors.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AI가 루프에 빠졌을 때&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;You've been trying the same approach 3 times. Ultrathink and try a completely different strategy.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ ultrathink 불필요&lt;/h3&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;기본적인 CRUD 구현&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;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;For routine tasks - trivial bug fixes, simple feature additions - the standard think level offers optimal efficiency-cost ratio.&quot; &amp;mdash; &lt;a href=&quot;https://goatreview.com/claude-code-thinking-levels-think-ultrathink/&quot;&gt;goatreview.com&lt;/a&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;h3 data-ke-size=&quot;size23&quot;&gt;아키텍처 설계&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;I need to design a real-time notification system that handles 1M+ concurrent users.
Please ultrathink about:
- Message queue architecture (Kafka vs RabbitMQ vs Redis)
- WebSocket scaling strategy
- Failure handling and retry logic
- Cost optimization
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;복잡한 디버깅&lt;/h3&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;Our payment processing sometimes fails silently in production.
Logs show no errors but transactions don't complete.
Ultrathink about what could cause this and how to debug it.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기술 스택 결정&lt;/h3&gt;
&lt;pre class=&quot;q&quot;&gt;&lt;code&gt;We're starting a new project and need to choose between:
- Next.js vs Remix vs SvelteKit
- PostgreSQL vs MongoDB vs CockroachDB
- Vercel vs AWS vs GCP

Think harder about the trade-offs for a team of 5 developers 
building a B2B SaaS with complex data relationships.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Plan Mode와 함께&lt;/h3&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;[Plan Mode에서]
I want to add real-time collaboration features to our document editor.
Ultrathink about the implementation plan, considering:
- Conflict resolution (OT vs CRDT)
- Presence indicators
- Offline support
- Performance at scale
&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;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. CLAUDE.md에 가이드라인 추가&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# Thinking Mode Guidelines

- Use &quot;think&quot; for routine tasks and bug fixes
- Use &quot;think hard&quot; for API design and integration
- Reserve &quot;ultrathink&quot; for:
  - System architecture decisions
  - Critical security reviews
  - Complex migration planning
  - When Claude gets stuck in a loop
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 커스텀 명령어로 만들기&lt;/h3&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;&amp;lt;!-- .claude/commands/deep-analysis.md --&amp;gt;
---
description: Deep analysis with extended thinking
model: opus
---

Ultrathink about this problem before proposing solutions.

Follow these steps:
1. Analyze the problem thoroughly
2. Consider multiple approaches with trade-offs
3. Evaluate security, performance, and maintainability
4. Recommend the best solution with detailed reasoning

Problem: $ARGUMENTS
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용:&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;&amp;gt; /deep-analysis &quot;How should we implement real-time sync?&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 단계적 접근&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;급하게 ultrathink부터 쓰지 말고:&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;결과가 얕으면 think hard 추가&lt;/li&gt;
&lt;li&gt;그래도 부족하면 ultrathink&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;# Step 1: 일반 요청
&amp;gt; Design the authentication flow

# Step 2: 결과가 얕다면
&amp;gt; Think harder about edge cases and security

# Step 3: 정말 복잡하면
&amp;gt; Ultrathink about the entire auth architecture including OAuth, MFA, and session management
&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;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Claude Code 전용&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;'ultrathink' is a real, documented feature - but &lt;b&gt;it only works in Claude Code&lt;/b&gt;, Anthropic's command-line coding tool.&quot; &amp;mdash; &lt;a href=&quot;https://itecsonline.com/post/the-ultrathink-mystery-does-claude-really-think-harder&quot;&gt;ITECS Online&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 Claude Chat이나 API에서는 작동하지 않아요. Claude Code CLI에서만 동작합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시간과 비용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ultrathink는 &lt;b&gt;응답 시간이 길어짐&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;토큰 사용량 증가&lt;/b&gt; &amp;rarr; 비용 증가&lt;/li&gt;
&lt;li&gt;급한 작업에는 비효율적&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최신 버전 변경사항&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code v2.0 이후로 thinking mode가 기본 활성화되고 Tab 토글로 변경되었어요. 하지만 ultrathink 키워드는 여전히 &lt;b&gt;최대 thinking budget을 명시적으로 요청&lt;/b&gt;하는 방법으로 유효합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Thinking Mode 토글 (v2.0+)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최신 버전에서는 &lt;b&gt;Tab 키&lt;/b&gt;로 thinking mode를 토글할 수 있어요:&lt;/p&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# Tab 한 번: Plan Mode (thinking 강화)
# Shift+Tab 두 번: Plan Mode 진입
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ultrathink 키워드와 함께 사용하면 더 강력해요:&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;[Tab으로 Plan Mode 진입]
&amp;gt; Ultrathink about the database schema for our multi-tenant SaaS
&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;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상황 권장 레벨&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&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;think&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API 설계, 리팩토링&lt;/td&gt;
&lt;td&gt;think hard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;아키텍처 설계&lt;/td&gt;
&lt;td&gt;ultrathink&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;복잡한 디버깅&lt;/td&gt;
&lt;td&gt;ultrathink&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;보안 리뷰&lt;/td&gt;
&lt;td&gt;ultrathink&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude가 루프에 빠짐&lt;/td&gt;
&lt;td&gt;ultrathink&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;체크리스트&lt;/h2&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;[ ] 복잡한 작업에 think 키워드 추가&lt;/li&gt;
&lt;li&gt;[ ] 중요한 설계에 think hard 사용&lt;/li&gt;
&lt;li&gt;[ ] 최고 난이도에만 ultrathink 사용&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[ ] CLAUDE.md에 thinking 가이드라인 추가&lt;/li&gt;
&lt;li&gt;[ ] /deep-analysis 같은 커스텀 명령어 생성&lt;/li&gt;
&lt;li&gt;[ ] Plan Mode + ultrathink 조합 활용&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[ ] 급한 작업엔 ultrathink 피하기&lt;/li&gt;
&lt;li&gt;[ ] 비용/시간 고려하기&lt;/li&gt;
&lt;li&gt;[ ] Claude Code에서만 작동함 기억하기&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ultrathink는 Claude Code의 &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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;think &amp;lt; think hard &amp;lt; think harder &amp;lt; ultrathink&lt;/li&gt;
&lt;li&gt;ultrathink = &lt;b&gt;최대 32K 토큰&lt;/b&gt;의 thinking budget&lt;/li&gt;
&lt;li&gt;복잡한 아키텍처, 어려운 버그에 효과적&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시간이 더 걸리니까 중요한 결정에만&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Claude Code 전용 (Chat/API에서는 안 됨)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;These specific phrases are mapped directly to increasing levels of thinking budget in the system.&quot; &amp;mdash; &lt;a href=&quot;https://www.anthropic.com/engineering/claude-code-best-practices&quot;&gt;Anthropic Best Practices&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정말 중요한 아키텍처 결정이나 며칠째 못 잡는 버그가 있다면, &lt;b&gt;ultrathink&lt;/b&gt; 한 번 써보세요. 성공률이 확 달라질 거예요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고 자료&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Anthropic 공식&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;a href=&quot;https://www.anthropic.com/engineering/claude-code-best-practices&quot;&gt;Claude Code Best Practices&lt;/a&gt; &amp;mdash; ultrathink 공식 문서&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://simonwillison.net/2025/Apr/19/claude-code-best-practices/&quot;&gt;Simon Willison's Analysis&lt;/a&gt; &amp;mdash; 토큰 할당량 코드 분석&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.claude-code-guide.com/&quot;&gt;Claude Code Extended Thinking Guide&lt;/a&gt; &amp;mdash; 종합 가이드&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://goatreview.com/claude-code-thinking-levels-think-ultrathink/&quot;&gt;Thinking Levels Deep Dive&lt;/a&gt; &amp;mdash; 레벨별 상세 설명&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programmer/AI</category>
      <category>AI 코딩</category>
      <category>Anthropic</category>
      <category>claude code</category>
      <category>Extended Thinking</category>
      <category>ultrathink</category>
      <category>고급 기능</category>
      <category>깊은 사고</category>
      <category>디버깅</category>
      <category>아키텍처 설계</category>
      <author>MoreLean</author>
      <guid isPermaLink="true">https://judekim.tistory.com/171</guid>
      <comments>https://judekim.tistory.com/171#entry171comment</comments>
      <pubDate>Wed, 21 Jan 2026 00:44:09 +0900</pubDate>
    </item>
    <item>
      <title>Claude Code 커스텀 명령어: 혼자서도 팀처럼 개발하기</title>
      <link>https://judekim.tistory.com/170</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code의 &lt;b&gt;커스텀 슬래시 명령어&lt;/b&gt;를 알면 혼자서도 팀 개발하는 느낌이 나요. 정말이에요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/tdd 치면 테스트 주도 개발 모드로 들어가요. RED-GREEN-IMPROVE 사이클 돌면서 테스트 먼저 짜고 코드 구현하거든요. /plan은 작업 계획 세우고, /e2e는 E2E 테스트 만들어주고, /code-review는 코드 리뷰 돌려줘요.&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;TL;DR&lt;/h2&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;위치: .claude/commands/ (프로젝트) 또는 ~/.claude/commands/ (전역)&lt;/li&gt;
&lt;li&gt;파일명 = 명령어 이름 (tdd.md &amp;rarr; /tdd)&lt;/li&gt;
&lt;li&gt;$ARGUMENTS로 인자 전달 가능&lt;/li&gt;
&lt;li&gt;frontmatter로 도구 제한, 모델 지정 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;커스텀 명령어란?&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Custom slash commands are essentially &lt;b&gt;saved prompts that you can invoke&lt;/b&gt; with a simple /command_name syntax.&quot; &amp;mdash; &lt;a href=&quot;https://cloudartisan.com/posts/2025-04-14-claude-code-tips-slash-commands/&quot;&gt;cloudartisan.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매번 같은 프롬프트 치는 거 귀찮잖아요. &quot;테스트 먼저 작성하고, 실패하는지 확인하고, 그 다음 구현해줘&quot;를 매번 타이핑하는 대신, /tdd만 치면 끝이에요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;왜 필요한가?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;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;: Git으로 명령어 공유 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;워크플로우 자동화&lt;/b&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;&quot;I don't think about naming conventions, commit messages, or PR descriptions anymore. &lt;b&gt;The commands handle it.&lt;/b&gt;&quot; &amp;mdash; &lt;a href=&quot;https://alexop.dev/posts/claude-code-slash-commands-guide/&quot;&gt;alexop.dev&lt;/a&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;p data-ke-size=&quot;size16&quot;&gt;위치 범위 Git 커밋&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&gt;.claude/commands/&lt;/td&gt;
&lt;td&gt;프로젝트 전용&lt;/td&gt;
&lt;td&gt;✅ 팀 공유&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;~/.claude/commands/&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;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# 프로젝트 명령어 생성
mkdir -p .claude/commands
echo &quot;Analyze this code for performance issues:&quot; &amp;gt; .claude/commands/optimize.md

# 전역 명령어 생성
mkdir -p ~/.claude/commands
echo &quot;Review this code for security vulnerabilities:&quot; &amp;gt; ~/.claude/commands/security.md
&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;/h2&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;xml&quot;&gt;&lt;code&gt;&amp;lt;!-- .claude/commands/optimize.md --&amp;gt;
Analyze this code for performance issues and suggest optimizations.
Focus on:
- Time complexity
- Memory usage
- Database queries
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 /optimize만 치면 됩니다!&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;인자 받기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$ARGUMENTS로 사용자 입력을 받을 수 있어요:&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;!-- .claude/commands/fix-issue.md --&amp;gt;
Fix GitHub issue #$ARGUMENTS

1. Read the issue details
2. Find relevant code
3. Implement the fix
4. Write tests
5. Create a commit
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용법:&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;&amp;gt; /fix-issue 123
# &amp;rarr; &quot;Fix GitHub issue #123&quot; 으로 실행됨
&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;$1, $2, $3으로 개별 인자를 받을 수 있어요:&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;!-- .claude/commands/pr-review.md --&amp;gt;
Review PR #$1 with priority $2 and assign to $3.
Focus on security, performance, and code style.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용법:&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;&amp;gt; /pr-review 42 high @alice
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Frontmatter로 고급 설정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;YAML frontmatter로 더 세밀하게 제어할 수 있어요:&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;---
description: Create a git commit with conventional message
allowed-tools: Bash(git add:*), Bash(git commit:*)
argument-hint: [message]
model: haiku
---

# Commit Changes

&amp;lt;git_diff&amp;gt;
!`git diff --cached`
&amp;lt;/git_diff&amp;gt;

Create a commit message following Conventional Commits.
If $ARGUMENTS is provided, use it as the commit message.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Frontmatter 옵션&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵션 설명 예시&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;description&lt;/td&gt;
&lt;td&gt;명령어 설명 (/help에 표시)&lt;/td&gt;
&lt;td&gt;&quot;Run tests with coverage&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;allowed-tools&lt;/td&gt;
&lt;td&gt;사용 가능한 도구 제한&lt;/td&gt;
&lt;td&gt;Read, Grep, Glob&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;model&lt;/td&gt;
&lt;td&gt;사용할 모델 지정&lt;/td&gt;
&lt;td&gt;haiku, sonnet, opus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;argument-hint&lt;/td&gt;
&lt;td&gt;인자 힌트&lt;/td&gt;
&lt;td&gt;[file] [options]&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;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Add model: haiku and commands run almost instantly.&quot; &amp;mdash; &lt;a href=&quot;https://alexop.dev/posts/claude-code-slash-commands-guide/&quot;&gt;alexop.dev&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;haiku&lt;/b&gt;: 간단한 작업 (커밋 메시지, 파일 정리) &amp;rarr; 빠름&lt;/li&gt;
&lt;li&gt;&lt;b&gt;sonnet&lt;/b&gt;: 일반 작업 (코드 리뷰, 리팩토링) &amp;rarr; 균형&lt;/li&gt;
&lt;li&gt;&lt;b&gt;opus&lt;/b&gt;: 복잡한 작업 (아키텍처 설계, 디버깅) &amp;rarr; 강력&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실전 명령어 예시&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;/tdd - 테스트 주도 개발&lt;/h3&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;---
description: Test-driven development workflow
allowed-tools: Read, Write, Edit, Bash
---

# TDD Workflow

Follow the RED-GREEN-IMPROVE cycle:

## 1. RED - Write Failing Test
- Write a test that describes the expected behavior
- Run the test and confirm it FAILS
- Do NOT write implementation yet

## 2. GREEN - Make It Pass
- Write the MINIMUM code to pass the test
- Do NOT optimize yet
- Run tests to confirm they PASS

## 3. IMPROVE - Refactor
- Clean up the code
- Remove duplication
- Improve naming
- Run tests to ensure they still PASS

## Rules
- Never modify tests to make them pass
- Aim for 80%+ test coverage
- One test at a time

Start with: $ARGUMENTS
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;/plan - 작업 계획&lt;/h3&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;---
description: Create implementation plan for a feature
allowed-tools: Read, Grep, Glob
model: opus
---

# Feature Planning

Create a detailed implementation plan for: $ARGUMENTS

## Steps
1. Analyze the current codebase structure
2. Identify affected files and components
3. Break down into small, testable tasks
4. Estimate complexity for each task
5. Identify potential risks and edge cases

## Output Format
```markdown
# Implementation Plan: [Feature Name]

## Overview
[Brief description]

## Tasks
- [ ] Task 1 (complexity: low/medium/high)
- [ ] Task 2
...

## Files to Modify
- path/to/file1.ts - reason
- path/to/file2.ts - reason

## Risks
- Risk 1 and mitigation
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Save the plan to PLAN.md&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;### /e2e - E2E 테스트 생성

```markdown
---
description: Generate end-to-end tests with Playwright
allowed-tools: Read, Write, Bash
---

# E2E Test Generation

Generate Playwright E2E tests for: $ARGUMENTS

## Guidelines
1. Analyze the user flow
2. Write tests that cover happy path AND edge cases
3. Use proper selectors (data-testid preferred)
4. Include assertions for:
   - UI elements visible
   - Network requests completed
   - State changes reflected

## Structure
```typescript
import { test, expect } from '@playwright/test';

test.describe('[Feature Name]', () =&amp;gt; {
  test.beforeEach(async ({ page }) =&amp;gt; {
    // Setup
  });

  test('should [expected behavior]', async ({ page }) =&amp;gt; {
    // Arrange
    // Act
    // Assert
  });
});
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;After Writing&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Run tests to verify they work&lt;/li&gt;
&lt;li&gt;Add to CI pipeline if not already&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;### /code-review - 코드 리뷰

```markdown
---
description: Comprehensive code review
allowed-tools: Read, Grep, Glob, Bash(git diff:*)
model: sonnet
---

# Code Review

## Changed Files
!`git diff --name-only HEAD~1`

## Detailed Changes
!`git diff HEAD~1`

## Review Checklist

### 1. Code Quality
- [ ] Clear naming conventions
- [ ] No code duplication
- [ ] Functions are small and focused
- [ ] Comments explain &quot;why&quot; not &quot;what&quot;

### 2. Security
- [ ] No hardcoded secrets
- [ ] Input validation present
- [ ] SQL injection prevention
- [ ] XSS protection

### 3. Performance
- [ ] No N+1 queries
- [ ] Efficient algorithms
- [ ] Proper caching

### 4. Testing
- [ ] Tests cover new functionality
- [ ] Edge cases handled
- [ ] No flaky tests

## Output Format
For each issue found:
1. **File:Line** - Severity (Critical/High/Medium/Low)
2. Description
3. Suggested fix with code
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;/commit - 자동 커밋 메시지&lt;/h3&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;---
description: Create conventional commit message
allowed-tools: Bash(git add:*), Bash(git commit:*), Bash(git diff:*)
model: haiku
---

# Git Commit

&amp;lt;staged_changes&amp;gt;
!`git diff --cached`
&amp;lt;/staged_changes&amp;gt;

Create a commit message following Conventional Commits:
- feat: new feature
- fix: bug fix
- docs: documentation
- style: formatting
- refactor: code restructure
- test: adding tests
- chore: maintenance

Format: type(scope): description

If $ARGUMENTS provided, use as commit message.
Otherwise, generate from staged changes.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;/branch - 브랜치 생성&lt;/h3&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;---
description: Create a properly named git branch
allowed-tools: Bash(git checkout:*), Bash(git branch:*)
model: haiku
---

# Create Branch

Create a new branch for: $ARGUMENTS

## Naming Convention
- feature/description-here
- fix/issue-description
- refactor/what-is-changing
- docs/what-documenting

## Steps
1. Determine appropriate prefix based on work type
2. Convert description to kebab-case
3. Create and checkout branch

Example: &quot;add user authentication&quot; &amp;rarr; feature/add-user-authentication
&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;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어가 많아지면 폴더로 정리할 수 있어요:&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;.claude/commands/
├── git/
│   ├── commit.md      &amp;rarr; /project:git/commit
│   ├── branch.md      &amp;rarr; /project:git/branch
│   └── pr.md          &amp;rarr; /project:git/pr
├── testing/
│   ├── tdd.md         &amp;rarr; /project:testing/tdd
│   ├── e2e.md         &amp;rarr; /project:testing/e2e
│   └── unit.md        &amp;rarr; /project:testing/unit
└── review/
    ├── code.md        &amp;rarr; /project:review/code
    └── security.md    &amp;rarr; /project:review/security
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;The subdirectory appears in the command description but doesn't affect the command name itself.&quot; &amp;mdash; &lt;a href=&quot;https://code.claude.com/docs/en/slash-commands&quot;&gt;Claude Code Docs&lt;/a&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;p data-ke-size=&quot;size16&quot;&gt;Claude Code에 기본 내장된 명령어들:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어 설명&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;/help&lt;/td&gt;
&lt;td&gt;모든 명령어 목록&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/compact&lt;/td&gt;
&lt;td&gt;컨텍스트 압축&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/clear&lt;/td&gt;
&lt;td&gt;컨텍스트 초기화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/context&lt;/td&gt;
&lt;td&gt;컨텍스트 사용량 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/init&lt;/td&gt;
&lt;td&gt;CLAUDE.md 자동 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/model&lt;/td&gt;
&lt;td&gt;모델 변경&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/agents&lt;/td&gt;
&lt;td&gt;서브에이전트 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/config&lt;/td&gt;
&lt;td&gt;설정 변경&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/add-dir&lt;/td&gt;
&lt;td&gt;작업 디렉토리 추가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/install-github-app&lt;/td&gt;
&lt;td&gt;GitHub PR 리뷰 앱 설치&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;추천 명령어 컬렉션&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;everything-claude-code&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/affaan-m/everything-claude-code&quot;&gt;affaan-m/everything-claude-code&lt;/a&gt;에 실전 검증된 명령어들이 있어요:&lt;/p&gt;
&lt;pre class=&quot;clean&quot;&gt;&lt;code&gt;commands/
├── tdd.md              # /tdd - 테스트 주도 개발
├── plan.md             # /plan - 작업 계획
├── e2e.md              # /e2e - E2E 테스트
├── code-review.md      # /code-review - 코드 리뷰
├── security-review.md  # /security-review - 보안 검토
└── refactor.md         # /refactor - 리팩토링
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;wshobson/commands&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 방대한 컬렉션: &lt;a href=&quot;https://github.com/wshobson/commands&quot;&gt;wshobson/commands&lt;/a&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;57개 명령어&lt;/b&gt; (15 workflows + 42 tools)&lt;/li&gt;
&lt;li&gt;워크플로우: feature-development, smart-fix 등&lt;/li&gt;
&lt;li&gt;도구: api-scaffold, security-scan, docker-optimize 등&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;설치 방법&lt;/h3&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;# everything-claude-code에서 복사
git clone https://github.com/affaan-m/everything-claude-code.git
cp -r everything-claude-code/commands/* .claude/commands/

# 또는 전역으로
cp -r everything-claude-code/commands/* ~/.claude/commands/
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;명령어 vs Skills vs Agents&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분 슬래시 명령어 Skills Agents&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&gt;&lt;b&gt;호출&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;명시적 (/tdd)&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;용도&lt;/b&gt;&lt;/td&gt;
&lt;td&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;컨텍스트&lt;/b&gt;&lt;/td&gt;
&lt;td&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;비유&lt;/b&gt;&lt;/td&gt;
&lt;td&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;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Slash commands and Agent Skills serve different purposes in Claude Code... Both can coexist.&quot; &amp;mdash; &lt;a href=&quot;https://code.claude.com/docs/en/slash-commands&quot;&gt;Claude Code Docs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&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;명령어&lt;/b&gt;: &quot;이 작업 지금 해줘&quot; &amp;rarr; /tdd, /commit&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Skills&lt;/b&gt;: &quot;이 방법론 참고해서 해줘&quot; &amp;rarr; TDD workflow skill&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Agents&lt;/b&gt;: &quot;이 전문가한테 맡겨줘&quot; &amp;rarr; code-reviewer agent&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;명령어에 Hooks 추가하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어 실행 중 특정 시점에 스크립트를 실행할 수 있어요:&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;---
description: Deploy to staging with validation
hooks:
  PreToolUse:
    - matcher: &quot;Bash&quot;
      hooks:
        - type: command
          command: &quot;./scripts/validate-deploy.sh&quot;
          once: true
---

Deploy the current branch to staging environment.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;once: true는 한 세션에 한 번만 실행됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;팁&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;# 가장 자주 치는 명령어부터
echo &quot;Run all tests and show coverage&quot; &amp;gt; ~/.claude/commands/test.md
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Git으로 팀 공유&lt;/h3&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;# .claude/commands/ 를 Git에 커밋
git add .claude/commands/
git commit -m &quot;Add team slash commands&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. /help로 확인&lt;/h3&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;&amp;gt; /help
# 모든 명령어 목록 + 설명 표시
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 어디서든 / 입력&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Slash command autocomplete works anywhere in your input, not just at the beginning.&quot; &amp;mdash; &lt;a href=&quot;https://code.claude.com/docs/en/slash-commands&quot;&gt;Claude Code Docs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;&amp;gt; Fix the login bug using /tdd approach
# 문장 중간에도 명령어 사용 가능
&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;/h2&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;[ ] .claude/commands/ 폴더 생성&lt;/li&gt;
&lt;li&gt;[ ] 가장 자주 쓰는 프롬프트 &amp;rarr; 명령어로 저장&lt;/li&gt;
&lt;li&gt;[ ] /help로 확인&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[ ] &lt;a href=&quot;https://github.com/affaan-m/everything-claude-code&quot;&gt;everything-claude-code&lt;/a&gt; 명령어 복사&lt;/li&gt;
&lt;li&gt;[ ] 팀 워크플로우에 맞게 커스터마이징&lt;/li&gt;
&lt;li&gt;[ ] Git 커밋으로 팀 공유&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[ ] frontmatter로 모델/도구 제한&lt;/li&gt;
&lt;li&gt;[ ] 폴더로 카테고리 정리&lt;/li&gt;
&lt;li&gt;[ ] Hooks 추가로 자동화 강화&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&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;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;.claude/commands/에 저장 &amp;rarr; /명령어명으로 실행&lt;/li&gt;
&lt;li&gt;$ARGUMENTS로 인자 전달&lt;/li&gt;
&lt;li&gt;frontmatter로 세부 설정&lt;/li&gt;
&lt;li&gt;팀과 Git으로 공유&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;I was wasting time. Every commit message, every branch name, every PR description. I typed the same things over and over. Then I discovered Slash Commands.&quot; &amp;mdash; &lt;a href=&quot;https://alexop.dev/posts/claude-code-slash-commands-guide/&quot;&gt;alexop.dev&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/tdd, /plan, /code-review... 이런 명령어들 세팅해두면 정말 &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;참고 자료&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Anthropic 공식&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;a href=&quot;https://code.claude.com/docs/en/slash-commands&quot;&gt;Slash Commands&lt;/a&gt; &amp;mdash; Claude Code Docs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://platform.claude.com/docs/en/agent-sdk/slash-commands&quot;&gt;Slash Commands in the SDK&lt;/a&gt; &amp;mdash; Claude Docs&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/affaan-m/everything-claude-code&quot;&gt;everything-claude-code&lt;/a&gt; &amp;mdash; 실전 검증 명령어&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/wshobson/commands&quot;&gt;wshobson/commands&lt;/a&gt; &amp;mdash; 57개 명령어 컬렉션&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/hesreallyhim/awesome-claude-code&quot;&gt;awesome-claude-code&lt;/a&gt; &amp;mdash; 명령어 모음&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.builder.io/blog/claude-code&quot;&gt;How I use Claude Code&lt;/a&gt; &amp;mdash; Builder.io&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programmer/AI</category>
      <category>AI 코딩</category>
      <category>Anthropic</category>
      <category>claude code</category>
      <category>TDD</category>
      <category>개발 생산성</category>
      <category>슬래시 명령어</category>
      <category>자동화</category>
      <category>커스텀 명령어</category>
      <category>코드 리뷰</category>
      <author>MoreLean</author>
      <guid isPermaLink="true">https://judekim.tistory.com/170</guid>
      <comments>https://judekim.tistory.com/170#entry170comment</comments>
      <pubDate>Wed, 21 Jan 2026 00:39:55 +0900</pubDate>
    </item>
    <item>
      <title>Claude Code Skills &amp;amp; Agents: 전문가 팀을 내 손안에</title>
      <link>https://judekim.tistory.com/169</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code의 &lt;b&gt;Skills&lt;/b&gt;와 **Agents(서브에이전트)**는 꼭 알아야 하는 기능이에요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Skills는 Claude에게 &lt;b&gt;추가 능력을 부여&lt;/b&gt;하는 거예요. Agents는 &lt;b&gt;특화된 전문가&lt;/b&gt;를 호출하는 거고요. Planner Agent는 프로젝트 전체 구조를 설계하고, Architect는 기술 스택을 추천하고, Code Reviewer는 코드 리뷰를, Security Reviewer는 보안 취약점을 찾아줘요.&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;TL;DR&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Skills&lt;/b&gt;: Claude에게 새로운 능력을 부여하는 지식 패키지&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Agents&lt;/b&gt;: 특화된 작업을 수행하는 전문가 서브에이전트&lt;/li&gt;
&lt;li&gt;빌트인 Agents: Explore (탐색), Plan (계획)&lt;/li&gt;
&lt;li&gt;커스텀 Agents 생성 가능: /agents 명령으로 쉽게 생성&lt;/li&gt;
&lt;li&gt;추천 리소스: &lt;a href=&quot;https://github.com/affaan-m/everything-claude-code&quot;&gt;affaan-m/everything-claude-code&lt;/a&gt; &amp;mdash; 실전 검증된 configs&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Skills란?&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Skills extend Claude's capabilities by packaging your expertise into composable resources for Claude, &lt;b&gt;transforming general-purpose agents into specialized assistants&lt;/b&gt;.&quot; &amp;mdash; &lt;a href=&quot;https://www.anthropic.com/engineering/equipping-agents-for-the-real-world-with-agent-skills&quot;&gt;Anthropic Engineering&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Skills는 Claude에게 &lt;b&gt;도메인 전문 지식&lt;/b&gt;을 주입하는 방법이에요. 폴더 + SKILL.md 파일 구조로 되어있고, Claude가 필요할 때 &lt;b&gt;자동으로 로드&lt;/b&gt;합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 구조&lt;/h3&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;my-skill/
├── SKILL.md          &amp;larr; 필수: 메타데이터 + 지침
├── templates/        &amp;larr; 선택: 템플릿 파일들
├── scripts/          &amp;larr; 선택: 실행 가능한 스크립트
└── examples/         &amp;larr; 선택: 예시 파일들
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SKILL.md 예시&lt;/h3&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;---
name: tdd-workflow
description: Test-driven development methodology for writing robust code
---

# TDD Workflow

1. **RED**: Write failing tests first
2. **GREEN**: Implement minimal code to pass
3. **REFACTOR**: Improve code quality
4. Always aim for 80%+ test coverage
5. Never modify tests to make them pass
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Progressive Disclosure&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Skills의 핵심 원리는 **점진적 공개(Progressive Disclosure)**예요:&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Skills let Claude load information &lt;b&gt;only as needed&lt;/b&gt;. The amount of context that can be bundled into a skill is effectively unbounded.&quot; &amp;mdash; &lt;a href=&quot;https://www.anthropic.com/engineering/equipping-agents-for-the-real-world-with-agent-skills&quot;&gt;Anthropic Engineering&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&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;필요 시: 전체 SKILL.md 로드&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;h3 data-ke-size=&quot;size23&quot;&gt;빌트인 Skills&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Anthropic이 제공하는 기본 Skills:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Skill 용도&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&gt;&lt;b&gt;PowerPoint&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;프레젠테이션 생성/편집&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Excel&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;스프레드시트 + 수식&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Word&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;문서 작성/편집&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;PDF&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;PDF 폼 채우기/생성&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;&quot;Use Anthropic-created skills to have Claude read and generate professional Excel spreadsheets with formulas, PowerPoint presentations, Word documents, and fillable PDFs.&quot; &amp;mdash; &lt;a href=&quot;https://www.anthropic.com/news/skills&quot;&gt;Anthropic News&lt;/a&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;Agents(서브에이전트)란?&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Subagents are separate agent instances that your main agent can spawn to handle focused subtasks.&quot; &amp;mdash; &lt;a href=&quot;https://platform.claude.com/docs/en/agent-sdk/subagents&quot;&gt;Claude Agent SDK Docs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Agents는 &lt;b&gt;특화된 작업을 수행하는 전문가&lt;/b&gt;예요. 메인 Claude가 복잡한 작업을 만나면 적절한 Agent에게 위임합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;왜 필요한가?&lt;/h3&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;rarr; 메인 컨텍스트 깔끔 유지&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;Subagents use their own isolated context windows, and only send relevant information back to the orchestrator, rather than their full context.&quot; &amp;mdash; &lt;a href=&quot;https://www.anthropic.com/engineering/building-agents-with-the-claude-agent-sdk&quot;&gt;Anthropic Engineering&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;빌트인 Agents&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code에 기본 내장된 에이전트들:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Agent 용도 특징&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&gt;&lt;b&gt;Explore&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;코드베이스 탐색/검색&lt;/td&gt;
&lt;td&gt;Read-only, 빠른 탐색&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Plan&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;계획 수립을 위한 리서치&lt;/td&gt;
&lt;td&gt;Plan Mode에서 자동 사용&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;&quot;Claude delegates to Explore when it needs to search or understand a codebase without making changes. This keeps exploration results out of your main conversation context.&quot; &amp;mdash; &lt;a href=&quot;https://code.claude.com/docs/en/sub-agents&quot;&gt;Claude Code Docs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;커스텀 Agent 만들기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/agents 명령으로 쉽게 만들 수 있어요:&lt;/p&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# Claude Code에서
&amp;gt; /agents
# &amp;rarr; Create new agent 선택
# &amp;rarr; User-level 또는 Project-level 선택
# &amp;rarr; Generate with Claude로 자동 생성
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Agent 파일 구조&lt;/h3&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;---
name: code-reviewer
description: Reviews code for quality, security, and maintainability
tools: Read, Grep, Glob, Bash
model: sonnet
---

You are a senior code reviewer. Analyze code for:
- Security vulnerabilities
- Performance issues
- Code style consistency
- Best practices violations

Provide specific, actionable feedback with code examples.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Agent 저장 위치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위치 범위&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;~/.claude/agents/&lt;/td&gt;
&lt;td&gt;사용자 전역 (모든 프로젝트)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.claude/agents/&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;실전 활용: everything-claude-code&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실전에서 검증된 configs를 원한다면 &lt;b&gt;&lt;a href=&quot;https://github.com/affaan-m/everything-claude-code&quot;&gt;affaan-m/everything-claude-code&lt;/a&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;Won the Anthropic x Forum Ventures hackathon in Sep 2025... These configs are &lt;b&gt;battle-tested across multiple production applications&lt;/b&gt;.&quot; &amp;mdash; &lt;a href=&quot;https://github.com/affaan-m/everything-claude-code&quot;&gt;affaan-m&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;포함된 Agents&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Agent 역할&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&gt;&lt;b&gt;planner.md&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;기능 구현 계획 수립&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;architect.md&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-guide.md&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;테스트 주도 개발 가이드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;code-reviewer.md&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;코드 품질/보안 리뷰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;security-reviewer.md&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;보안 취약점 분석&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;build-error-resolver.md&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;빌드 에러 해결&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;e2e-runner.md&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Playwright E2E 테스트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;refactor-cleaner.md&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;데드 코드 정리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;doc-updater.md&lt;/b&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;포함된 Skills&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Skill 내용&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&gt;&lt;b&gt;coding-standards.md&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;언어별 베스트 프랙티스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;backend-patterns.md&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;API, DB, 캐싱 패턴&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;frontend-patterns.md&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;React, Next.js 패턴&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;tdd-workflow/&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;TDD 방법론&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;security-review/&lt;/b&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;설치 방법&lt;/h3&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;# 레포 클론
git clone https://github.com/affaan-m/everything-claude-code.git

# agents 복사 (사용자 전역)
cp -r everything-claude-code/agents/* ~/.claude/agents/

# skills 복사 (사용자 전역)
cp -r everything-claude-code/skills/* ~/.claude/skills/

# 또는 프로젝트별로 복사
cp -r everything-claude-code/agents/* .claude/agents/
cp -r everything-claude-code/skills/* .claude/skills/
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;사용 예시&lt;/h3&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;# Planner Agent에게 기능 설계 요청
&amp;gt; &quot;Use the planner agent to design the user authentication feature&quot;

# Code Reviewer로 리뷰 요청
&amp;gt; &quot;Have the code-reviewer agent review src/auth/&quot;

# Security Reviewer로 보안 검토
&amp;gt; &quot;Ask security-reviewer to analyze our API endpoints&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;또 다른 추천: wshobson/agents&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 방대한 컬렉션을 원한다면 **&lt;a href=&quot;https://github.com/wshobson/agents&quot;&gt;wshobson/agents&lt;/a&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;108개 전문 Agents&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;129개 Skills&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;72개 플러그인&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;15개 워크플로우 오케스트레이터&lt;/b&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;&quot;A comprehensive production-ready system combining 108 specialized AI agents, 15 multi-agent workflow orchestrators, 129 agent skills.&quot; &amp;mdash; &lt;a href=&quot;https://github.com/wshobson/agents&quot;&gt;wshobson/agents&lt;/a&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;Skills vs Agents 비교&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분 Skills Agents&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&gt;&lt;b&gt;역할&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;비유&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;로드 시점&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;컨텍스트&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;예시&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;TDD 방법론, 코딩 표준&lt;/td&gt;
&lt;td&gt;Code Reviewer, Security Auditor&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;cs&quot;&gt;&lt;code&gt;[사용자 요청]
     &amp;darr;
[메인 Claude]
     &amp;darr;
[Skills 로드: tdd-workflow]  &amp;larr;  방법론 참조
     &amp;darr;
[Agent 위임: tdd-guide]      &amp;larr;  실제 작업 수행
     &amp;darr;
[결과 반환]
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Agent 작성 팁&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 명확한 description&lt;/h3&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;---
name: security-reviewer
description: Analyzes code for security vulnerabilities including XSS, SQL injection, auth issues, and sensitive data exposure
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude가 언제 이 에이전트를 사용할지 결정하는 핵심이에요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 도구 제한&lt;/h3&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;---
tools: Read, Grep, Glob  # Bash 제외 &amp;rarr; 읽기 전용
---
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;A doc-reviewer subagent might only have access to Read and Grep tools, ensuring it can analyze but never accidentally modify your documentation files.&quot; &amp;mdash; &lt;a href=&quot;https://platform.claude.com/docs/en/agent-sdk/subagents&quot;&gt;Claude Agent SDK Docs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 적절한 모델 선택&lt;/h3&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;---
model: sonnet  # 빠른 분석 작업
# model: opus  # 복잡한 추론 필요 시
---
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 구체적인 지침&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;You are a senior code reviewer at a Fortune 500 company.

## Review Checklist
- [ ] No hardcoded secrets
- [ ] Input validation on all endpoints
- [ ] Error handling with proper logging
- [ ] SQL injection prevention
- [ ] XSS protection

## Output Format
For each issue:
1. File and line number
2. Severity (Critical/High/Medium/Low)
3. Description
4. Suggested fix with code
&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;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;컨텍스트 관리&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Critical: Don't enable all MCPs at once. Your 200k context window can shrink to 70k with too many tools enabled.&quot; &amp;mdash; &lt;a href=&quot;https://github.com/affaan-m/everything-claude-code&quot;&gt;affaan-m&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&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;h3 data-ke-size=&quot;size23&quot;&gt;보안&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Skills provide Claude with new capabilities through instructions and code... a malicious Skill can direct Claude to invoke tools or execute code in ways that don't match the Skill's stated purpose.&quot; &amp;mdash; &lt;a href=&quot;https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview&quot;&gt;Claude Docs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&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;h3 data-ke-size=&quot;size23&quot;&gt;서브에이전트 제한&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Subagents cannot spawn other subagents.&quot; &amp;mdash; &lt;a href=&quot;https://code.claude.com/docs/en/sub-agents&quot;&gt;Claude Code Docs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복잡한 체이닝이 필요하면 메인 Claude가 조율해야 해요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;체크리스트&lt;/h2&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;a href=&quot;https://github.com/affaan-m/everything-claude-code&quot;&gt;everything-claude-code&lt;/a&gt; 클론&lt;/li&gt;
&lt;li&gt;[ ] 필요한 agents를 ~/.claude/agents/에 복사&lt;/li&gt;
&lt;li&gt;[ ] 필요한 skills를 ~/.claude/skills/에 복사&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[ ] Planner Agent로 기능 설계&lt;/li&gt;
&lt;li&gt;[ ] Architect Agent로 기술 스택 결정&lt;/li&gt;
&lt;li&gt;[ ] Code Reviewer로 품질 검토&lt;/li&gt;
&lt;li&gt;[ ] Security Reviewer로 보안 검토&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[ ] 프로젝트 맞춤 커스텀 Agent 생성&lt;/li&gt;
&lt;li&gt;[ ] 팀 공유용 Skills 작성&lt;/li&gt;
&lt;li&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;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Skills와 Agents는 Claude Code를 &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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Skills&lt;/b&gt; = 지식 주입 (어떻게 해야 하는지)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Agents&lt;/b&gt; = 작업 위임 (대신 해줘)&lt;/li&gt;
&lt;li&gt;**&lt;a href=&quot;https://github.com/affaan-m/everything-claude-code&quot;&gt;everything-claude-code&lt;/a&gt;**에서 시작하세요&lt;/li&gt;
&lt;li&gt;필요한 것만 설치해서 &lt;b&gt;컨텍스트 절약&lt;/b&gt;&lt;/li&gt;
&lt;li&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;&quot;Skills extend Claude Code with your team's expertise and workflows... Claude loads them automatically when relevant.&quot; &amp;mdash; &lt;a href=&quot;https://www.anthropic.com/news/skills&quot;&gt;Anthropic&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음엔 기본 Agents로 시작하고, 점점 팀 워크플로우에 맞는 커스텀 Agents를 만들어가세요. 생산성이 완전히 달라집니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고 자료&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Anthropic 공식&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;a href=&quot;https://www.anthropic.com/news/skills&quot;&gt;Introducing Agent Skills&lt;/a&gt; &amp;mdash; Anthropic News&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.anthropic.com/engineering/equipping-agents-for-the-real-world-with-agent-skills&quot;&gt;Equipping Agents with Skills&lt;/a&gt; &amp;mdash; Anthropic Engineering&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/en/sub-agents&quot;&gt;Create Custom Subagents&lt;/a&gt; &amp;mdash; Claude Code Docs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview&quot;&gt;Agent Skills Overview&lt;/a&gt; &amp;mdash; Claude Docs&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/affaan-m/everything-claude-code&quot;&gt;everything-claude-code&lt;/a&gt; &amp;mdash; Anthropic 해커톤 우승자의 실전 configs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/wshobson/agents&quot;&gt;wshobson/agents&lt;/a&gt; &amp;mdash; 108 Agents, 129 Skills 컬렉션&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://subagents.cc/&quot;&gt;subagents.cc&lt;/a&gt; &amp;mdash; 커뮤니티 Agent 디렉토리&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programmer/AI</category>
      <category>Agents</category>
      <category>AI 코딩</category>
      <category>Anthropic</category>
      <category>claude code</category>
      <category>skills</category>
      <category>개발 생산성</category>
      <category>서브에이전트</category>
      <category>에이전틱 코딩</category>
      <category>자동화</category>
      <category>코드 리뷰</category>
      <author>MoreLean</author>
      <guid isPermaLink="true">https://judekim.tistory.com/169</guid>
      <comments>https://judekim.tistory.com/169#entry169comment</comments>
      <pubDate>Wed, 21 Jan 2026 00:33:52 +0900</pubDate>
    </item>
    <item>
      <title>Claude Code Hooks: 자동화로 실수를 원천 차단하기</title>
      <link>https://judekim.tistory.com/168</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code의 Hooks 시스템은 정말 강력합니다. &lt;b&gt;특정 이벤트가 발생할 때 자동으로 실행되는 스크립트&lt;/b&gt;를 설정할 수 있어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일을 편집할 때마다 자동으로 린트를 돌리거나, 위험한 명령어를 차단하거나, 하드코딩된 API 키가 있으면 경고를 띄울 수 있습니다. 한 번 설정해두면 &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;TL;DR&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Hooks는 Claude Code의 &lt;b&gt;이벤트에 반응하는 자동화 스크립트&lt;/b&gt;입니다&lt;/li&gt;
&lt;li&gt;주요 이벤트: PreToolUse(도구 실행 전), PostToolUse(도구 실행 후), Stop(응답 완료)&lt;/li&gt;
&lt;li&gt;파일 편집 후 &lt;b&gt;자동 린트/포맷팅&lt;/b&gt; &amp;rarr; 코드 스타일 걱정 끝&lt;/li&gt;
&lt;li&gt;위험한 명령어 &lt;b&gt;자동 차단&lt;/b&gt; &amp;rarr; 실수 방지&lt;/li&gt;
&lt;li&gt;하드코딩된 API 키 같은 &lt;b&gt;보안 위험 감지&lt;/b&gt; &amp;rarr; 유출 사고 방지&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Hooks란?&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Hooks are shell commands that execute automatically at predetermined points in Claude Code's workflow. Unlike ad-hoc model prompts, &lt;b&gt;hooks guarantee that specific operations occur consistently&lt;/b&gt; without additional user intervention.&quot; &amp;mdash; &lt;a href=&quot;https://www.eesel.ai/blog/hooks-in-claude-code&quot;&gt;eesel AI&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hooks는 Claude Code가 특정 작업을 수행할 때 &lt;b&gt;자동으로 실행되는 쉘 명령어&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Git hooks(pre-commit, post-commit 등)와 비슷한 개념이지만, &lt;b&gt;Claude Code의 도구 사용에 반응&lt;/b&gt;한다는 점이 다릅니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;왜 필요한가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude에게 &quot;린트 돌려줘&quot;, &quot;포맷팅 해줘&quot;라고 매번 말할 수 있습니다. 하지만:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Claude가 까먹을 수 있음&lt;/li&gt;
&lt;li&gt;매번 요청하기 귀찮음&lt;/li&gt;
&lt;li&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;&quot;By encoding these rules as hooks rather than prompting instructions, you turn suggestions into &lt;b&gt;app-level code that executes every time&lt;/b&gt; it is expected to run.&quot; &amp;mdash; &lt;a href=&quot;https://code.claude.com/docs/en/hooks-guide&quot;&gt;Claude Code Docs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hooks는 **확정적(deterministic)**입니다. Claude의 판단에 의존하지 않고, 조건이 맞으면 &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;Hooks 이벤트 종류&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code는 &lt;b&gt;8가지 이벤트&lt;/b&gt;를 지원합니다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트 발생 시점 주요 용도&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;PreToolUse&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;PostToolUse&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;PermissionRequest&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;UserPromptSubmit&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;SessionStart&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;SessionEnd&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;Stop&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;SubagentStop&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;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Key events include 'PreToolUse' (before a tool runs), 'PostToolUse' (after a tool completes successfully), 'Notification' (when Claude sends an alert), 'Stop' (when the AI agent finishes its response), 'UserPromptSubmit', and 'SessionStart'.&quot; &amp;mdash; &lt;a href=&quot;https://www.eesel.ai/blog/hooks-in-claude-code&quot;&gt;eesel AI&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;가장 많이 쓰는 이벤트&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;PostToolUse&lt;/b&gt;: 파일 편집 후 자동 포맷팅/린트&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PreToolUse&lt;/b&gt;: 위험한 명령어 차단&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PermissionRequest&lt;/b&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;Hooks 설정 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hooks는 settings.json 파일에 정의합니다:&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;~/.claude/settings.json          &amp;larr; 사용자 전역 (모든 프로젝트)
.claude/settings.json            &amp;larr; 프로젝트 공유 (Git 커밋)
.claude/settings.local.json      &amp;larr; 프로젝트 로컬 (Git 제외)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 구조&lt;/h3&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;hooks&quot;: {
    &quot;이벤트명&quot;: [
      {
        &quot;matcher&quot;: &quot;도구패턴&quot;,
        &quot;hooks&quot;: [
          {
            &quot;type&quot;: &quot;command&quot;,
            &quot;command&quot;: &quot;실행할 명령어&quot;
          }
        ]
      }
    ]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Matcher 패턴&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;Edit&quot;: Edit 도구만 매칭&lt;/li&gt;
&lt;li&gt;&quot;Edit|Write&quot;: Edit 또는 Write 매칭&lt;/li&gt;
&lt;li&gt;&quot;Edit|Write|MultiEdit&quot;: 여러 도구 매칭&lt;/li&gt;
&lt;li&gt;&quot;Bash&quot;: Bash 명령 매칭&lt;/li&gt;
&lt;li&gt;&quot;*&quot;: 모든 도구 매칭&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실전 예시 1: 자동 포맷팅&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일을 편집할 때마다 &lt;b&gt;Prettier로 자동 포맷팅&lt;/b&gt;:&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;hooks&quot;: {
    &quot;PostToolUse&quot;: [
      {
        &quot;matcher&quot;: &quot;Edit|Write|MultiEdit&quot;,
        &quot;hooks&quot;: [
          {
            &quot;type&quot;: &quot;command&quot;,
            &quot;command&quot;: &quot;npx prettier --write \&quot;$CLAUDE_TOOL_INPUT_FILE_PATH\&quot;&quot;
          }
        ]
      }
    ]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Automatic Formatting: Run tools like Prettier on JavaScript and TypeScript, or gofmt on Go files &lt;b&gt;immediately after AI edits&lt;/b&gt;.&quot; &amp;mdash; &lt;a href=&quot;https://www.cometapi.com/claude-code-hooks-what-is-and-how-to-use-it/&quot;&gt;CometAPI&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;TypeScript 파일만 포맷팅&lt;/h3&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;hooks&quot;: {
    &quot;PostToolUse&quot;: [
      {
        &quot;matcher&quot;: &quot;Edit|Write&quot;,
        &quot;hooks&quot;: [
          {
            &quot;type&quot;: &quot;command&quot;,
            &quot;command&quot;: &quot;jq -r '.tool_input.file_path' | { read file_path; if echo \&quot;$file_path\&quot; | grep -q '\\.ts$'; then npx prettier --write \&quot;$file_path\&quot;; fi; }&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;실전 예시 2: 자동 린트 + 포맷팅&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포맷팅과 린트를 &lt;b&gt;동시에&lt;/b&gt; 실행:&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;hooks&quot;: {
    &quot;PostToolUse&quot;: [
      {
        &quot;matcher&quot;: &quot;Write|Edit&quot;,
        &quot;hooks&quot;: [
          {
            &quot;type&quot;: &quot;command&quot;,
            &quot;command&quot;: &quot;npx prettier --write \&quot;$CLAUDE_TOOL_INPUT_FILE_PATH\&quot;&quot;
          },
          {
            &quot;type&quot;: &quot;command&quot;,
            &quot;command&quot;: &quot;npx eslint --fix \&quot;$CLAUDE_TOOL_INPUT_FILE_PATH\&quot;&quot;
          }
        ]
      }
    ]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Multiple hooks run in parallel. Your code is formatted AND linted before Claude's response appears.&quot; &amp;mdash; &lt;a href=&quot;https://claudefa.st/blog/tools/hooks/hooks-guide&quot;&gt;Claude Fast&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;React/TypeScript 프로젝트용 완전판&lt;/h3&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;hooks&quot;: {
    &quot;PostToolUse&quot;: [
      {
        &quot;matcher&quot;: &quot;Edit|Write|MultiEdit&quot;,
        &quot;hooks&quot;: [
          {
            &quot;type&quot;: &quot;command&quot;,
            &quot;command&quot;: &quot;prettier --write $CLAUDE_FILE_PATHS &amp;amp;&amp;amp; eslint $CLAUDE_FILE_PATHS --fix &amp;amp;&amp;amp; if [ -f 'tsconfig.json' ]; then npx tsc --noEmit; fi&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;실전 예시 3: 위험한 명령어 차단&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rm -rf / 같은 &lt;b&gt;위험한 명령어 자동 차단&lt;/b&gt;:&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;hooks&quot;: {
    &quot;PreToolUse&quot;: [
      {
        &quot;matcher&quot;: &quot;Bash&quot;,
        &quot;hooks&quot;: [
          {
            &quot;type&quot;: &quot;command&quot;,
            &quot;command&quot;: &quot;if echo \&quot;$CLAUDE_COMMAND\&quot; | grep -E '(rm -rf|sudo|chmod 777)' &amp;gt; /dev/null; then echo '❌ Dangerous command blocked' &amp;amp;&amp;amp; exit 1; fi&quot;
          }
        ]
      }
    ]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Security enhancements - Blocks dangerous commands and sensitive file access at multiple levels.&quot; &amp;mdash; &lt;a href=&quot;https://github.com/disler/claude-code-hooks-mastery&quot;&gt;disler/claude-code-hooks-mastery&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;.env 파일 접근 차단&lt;/h3&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;hooks&quot;: {
    &quot;PreToolUse&quot;: [
      {
        &quot;matcher&quot;: &quot;Read|Edit|Write&quot;,
        &quot;hooks&quot;: [
          {
            &quot;type&quot;: &quot;command&quot;,
            &quot;command&quot;: &quot;if echo \&quot;$CLAUDE_TOOL_INPUT_FILE_PATH\&quot; | grep -q '\\.env'; then echo '❌ .env file access blocked' &amp;amp;&amp;amp; exit 1; fi&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;실전 예시 4: 하드코딩된 시크릿 감지&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;API 키나 비밀번호가 코드에 하드코딩되면 경고&lt;/b&gt;:&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;hooks&quot;: {
    &quot;PostToolUse&quot;: [
      {
        &quot;matcher&quot;: &quot;Edit|Write&quot;,
        &quot;hooks&quot;: [
          {
            &quot;type&quot;: &quot;command&quot;,
            &quot;command&quot;: &quot;jq -r '.tool_input.file_path' | { read f; if grep -qE '(api_key|apikey|secret|password|token)\\s*=\\s*[\&quot;'\\'][^\&quot;'\\']+(\&quot;'\\']' \&quot;$f\&quot; 2&amp;gt;/dev/null; then echo '  WARNING: Possible hardcoded secret in '$f; fi; }&quot;
          }
        ]
      }
    ]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 console.log 남기는 것보다 &lt;b&gt;훨씬 치명적인 실수&lt;/b&gt;입니다. API 키가 Git에 커밋되면:&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;AWS 요금 폭탄&lt;/li&gt;
&lt;li&gt;서비스 해킹&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;더 강력한 버전: 차단까지&lt;/h3&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;hooks&quot;: {
    &quot;PreToolUse&quot;: [
      {
        &quot;matcher&quot;: &quot;Write|Edit&quot;,
        &quot;hooks&quot;: [
          {
            &quot;type&quot;: &quot;command&quot;,
            &quot;command&quot;: &quot;if grep -rqE '(sk-[a-zA-Z0-9]{20,}|AKIA[0-9A-Z]{16}|ghp_[a-zA-Z0-9]{36})' \&quot;$CLAUDE_PROJECT_DIR/src\&quot;; then echo '❌ Hardcoded API key detected! Use environment variables.' &amp;amp;&amp;amp; exit 1; fi&quot;
          }
        ]
      }
    ]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 패턴은 실제 API 키 형식을 감지합니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;sk-... &amp;mdash; OpenAI API 키&lt;/li&gt;
&lt;li&gt;AKIA... &amp;mdash; AWS Access Key&lt;/li&gt;
&lt;li&gt;ghp_... &amp;mdash; GitHub Personal Token&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Security enhancements - Blocks dangerous commands and &lt;b&gt;sensitive file access&lt;/b&gt; at multiple levels.&quot; &amp;mdash; &lt;a href=&quot;https://github.com/disler/claude-code-hooks-mastery&quot;&gt;disler/claude-code-hooks-mastery&lt;/a&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;실전 예시 5: 테스트 자동 실행&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 편집 후 &lt;b&gt;테스트 자동 실행&lt;/b&gt;:&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;hooks&quot;: {
    &quot;PostToolUse&quot;: [
      {
        &quot;matcher&quot;: &quot;Edit|Write&quot;,
        &quot;hooks&quot;: [
          {
            &quot;type&quot;: &quot;command&quot;,
            &quot;command&quot;: &quot;if echo \&quot;$CLAUDE_TOOL_INPUT_FILE_PATH\&quot; | grep -qE '\\.(ts|tsx|js|jsx)$'; then npm test -- --findRelatedTests \&quot;$CLAUDE_TOOL_INPUT_FILE_PATH\&quot; --passWithNoTests; fi&quot;
          }
        ]
      }
    ]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;백그라운드에서 전체 테스트 실행&lt;/h3&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;hooks&quot;: {
    &quot;Stop&quot;: [
      {
        &quot;hooks&quot;: [
          {
            &quot;type&quot;: &quot;command&quot;,
            &quot;command&quot;: &quot;npm test &amp;amp;&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;실전 예시 6: 자주 쓰는 명령 자동 승인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;npm test 매번 승인하기 귀찮다면:&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;hooks&quot;: {
    &quot;PermissionRequest&quot;: [
      {
        &quot;matcher&quot;: &quot;Bash(npm test*)&quot;,
        &quot;hooks&quot;: [
          {
            &quot;type&quot;: &quot;command&quot;,
            &quot;command&quot;: &quot;echo '{\&quot;decision\&quot;: \&quot;approve\&quot;}'&quot;
          }
        ]
      }
    ]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Tired of approving npm test every time? Use PermissionRequest.&quot; &amp;mdash; &lt;a href=&quot;https://claudefa.st/blog/tools/hooks/hooks-guide&quot;&gt;Claude Fast&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;린트와 빌드 명령도 자동 승인&lt;/h3&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;hooks&quot;: {
    &quot;PermissionRequest&quot;: [
      {
        &quot;matcher&quot;: &quot;Bash(npm run lint*)|Bash(npm run build*)|Bash(npm test*)&quot;,
        &quot;hooks&quot;: [
          {
            &quot;type&quot;: &quot;command&quot;,
            &quot;command&quot;: &quot;echo '{\&quot;decision\&quot;: \&quot;approve\&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;실전 예시 7: 세션 시작 시 컨텍스트 주입&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션 시작할 때 &lt;b&gt;Git 상태와 TODO 목록 자동 표시&lt;/b&gt;:&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;hooks&quot;: {
    &quot;SessionStart&quot;: [
      {
        &quot;hooks&quot;: [
          {
            &quot;type&quot;: &quot;command&quot;,
            &quot;command&quot;: &quot;echo '## Current State' &amp;amp;&amp;amp; git status --short &amp;amp;&amp;amp; echo '## Active TODOs' &amp;amp;&amp;amp; grep -r 'TODO:' src/ --include='*.ts' | head -5&quot;
          }
        ]
      }
    ]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Claude now sees uncommitted changes and pending TODOs before you say anything.&quot; &amp;mdash; &lt;a href=&quot;https://claudefa.st/blog/tools/hooks/hooks-guide&quot;&gt;Claude Fast&lt;/a&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;p data-ke-size=&quot;size16&quot;&gt;Hooks에서 사용 가능한 환경 변수:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수 설명&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;$CLAUDE_PROJECT_DIR&lt;/td&gt;
&lt;td&gt;프로젝트 루트 경로&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$CLAUDE_FILE_PATHS&lt;/td&gt;
&lt;td&gt;작업 대상 파일 경로&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$CLAUDE_TOOL_NAME&lt;/td&gt;
&lt;td&gt;사용된 도구 이름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$CLAUDE_TOOL_INPUT_FILE_PATH&lt;/td&gt;
&lt;td&gt;도구 입력 파일 경로&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$CLAUDE_WORKING_DIR&lt;/td&gt;
&lt;td&gt;현재 작업 디렉토리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$CLAUDE_SESSION_ID&lt;/td&gt;
&lt;td&gt;세션 ID&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;완전한 설정 예시&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로덕션에서 쓸 수 있는 &lt;b&gt;종합 설정&lt;/b&gt;:&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;hooks&quot;: {
    &quot;PreToolUse&quot;: [
      {
        &quot;matcher&quot;: &quot;Bash&quot;,
        &quot;hooks&quot;: [
          {
            &quot;type&quot;: &quot;command&quot;,
            &quot;command&quot;: &quot;if echo \&quot;$CLAUDE_COMMAND\&quot; | grep -E '(rm -rf /|sudo rm|chmod 777)' &amp;gt; /dev/null; then echo '❌ Dangerous command blocked' &amp;amp;&amp;amp; exit 1; fi&quot;
          }
        ]
      },
      {
        &quot;matcher&quot;: &quot;Edit|Write&quot;,
        &quot;hooks&quot;: [
          {
            &quot;type&quot;: &quot;command&quot;,
            &quot;command&quot;: &quot;if [ \&quot;$(git branch --show-current)\&quot; = 'main' ]; then echo '❌ Cannot edit on main branch' &amp;amp;&amp;amp; exit 1; fi&quot;
          }
        ]
      }
    ],
    &quot;PostToolUse&quot;: [
      {
        &quot;matcher&quot;: &quot;Edit|Write|MultiEdit&quot;,
        &quot;hooks&quot;: [
          {
            &quot;type&quot;: &quot;command&quot;,
            &quot;command&quot;: &quot;npx prettier --write \&quot;$CLAUDE_TOOL_INPUT_FILE_PATH\&quot; 2&amp;gt;/dev/null || true&quot;
          },
          {
            &quot;type&quot;: &quot;command&quot;,
            &quot;command&quot;: &quot;npx eslint --fix \&quot;$CLAUDE_TOOL_INPUT_FILE_PATH\&quot; 2&amp;gt;/dev/null || true&quot;
          }
        ]
      }
    ],
    &quot;PermissionRequest&quot;: [
      {
        &quot;matcher&quot;: &quot;Bash(npm test*)|Bash(npm run lint*)|Bash(pnpm test*)&quot;,
        &quot;hooks&quot;: [
          {
            &quot;type&quot;: &quot;command&quot;,
            &quot;command&quot;: &quot;echo '{\&quot;decision\&quot;: \&quot;approve\&quot;}'&quot;
          }
        ]
      }
    ],
    &quot;SessionStart&quot;: [
      {
        &quot;hooks&quot;: [
          {
            &quot;type&quot;: &quot;command&quot;,
            &quot;command&quot;: &quot;echo '  Branch:' $(git branch --show-current) &amp;amp;&amp;amp; echo '  Status:' &amp;amp;&amp;amp; git status --short | head -5&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;주의사항&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;보안&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;You must consider the security implication of hooks as you add them, because &lt;b&gt;hooks run automatically during the agent loop with your current environment's credentials&lt;/b&gt;.&quot; &amp;mdash; &lt;a href=&quot;https://code.claude.com/docs/en/hooks-guide&quot;&gt;Claude Code Docs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Hooks는 당신의 권한으로 실행됩니다&lt;/li&gt;
&lt;li&gt;악의적인 hooks는 데이터를 유출할 수 있습니다&lt;/li&gt;
&lt;li&gt;항상 hooks 코드를 검토하세요&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;너무 많은 hooks는 속도를 늦춥니다&lt;/li&gt;
&lt;li&gt;무거운 작업은 백그라운드로 (&amp;amp; 사용)&lt;/li&gt;
&lt;li&gt;불필요하게 넓은 matcher 피하기&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;If hooks are unnecessarily firing you will have an &lt;b&gt;extremely slowed down Agent&lt;/b&gt;.&quot; &amp;mdash; &lt;a href=&quot;https://claudelog.com/mechanics/hooks/&quot;&gt;ClaudeLog&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;디버깅&lt;/h3&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# Hook 설정 확인
cat .claude/settings.json | jq '.hooks'

# 수동으로 명령어 테스트
npx prettier --write test.ts

# 환경 변수 확인
echo $CLAUDE_PROJECT_DIR
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Git Hooks와의 차이점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분 Claude Code Hooks Git Hooks&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&gt;&lt;b&gt;트리거&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Claude 도구 사용 시&lt;/td&gt;
&lt;td&gt;Git 명령 실행 시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;이벤트&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;PreToolUse, PostToolUse 등&lt;/td&gt;
&lt;td&gt;pre-commit, post-commit 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;목적&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Claude 작업 자동화&lt;/td&gt;
&lt;td&gt;Git 워크플로우 자동화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;설정 위치&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;.claude/settings.json&lt;/td&gt;
&lt;td&gt;.git/hooks/&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;/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;Claude Code Hooks: 파일 편집 시 즉시 포맷팅&lt;/li&gt;
&lt;li&gt;Git Hooks: 커밋 전 최종 검증&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;체크리스트&lt;/h2&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;[ ] 자동 포맷팅 (PostToolUse + Prettier)&lt;/li&gt;
&lt;li&gt;[ ] 자동 린트 (PostToolUse + ESLint)&lt;/li&gt;
&lt;li&gt;[ ] 위험 명령어 차단 (PreToolUse)&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[ ] console.log 감지&lt;/li&gt;
&lt;li&gt;[ ] main 브랜치 직접 편집 차단&lt;/li&gt;
&lt;li&gt;[ ] 자주 쓰는 명령 자동 승인 (PermissionRequest)&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;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;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hooks는 Claude Code를 &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;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;PostToolUse&lt;/b&gt;로&lt;/li&gt;
&lt;li&gt;위험한 명령 차단은 &lt;b&gt;PreToolUse&lt;/b&gt;로&lt;/li&gt;
&lt;li&gt;자주 쓰는 명령 승인은 &lt;b&gt;PermissionRequest&lt;/b&gt;로&lt;/li&gt;
&lt;li&gt;&lt;b&gt;성능과 보안&lt;/b&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;&quot;Hooks let you shape Claude Code to match your workflow rather than adapting your workflow to the tool.&quot; &amp;mdash; &lt;a href=&quot;https://claude.com/blog/how-to-configure-hooks&quot;&gt;Claude Blog&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정하는 데 10분이면 됩니다. 그 10분이 앞으로 수많은 실수를 방지하고, 반복 작업을 자동화해줄 겁니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고 자료&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Anthropic 공식&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;a href=&quot;https://code.claude.com/docs/en/hooks-guide&quot;&gt;Get Started with Claude Code Hooks&lt;/a&gt; &amp;mdash; Official Docs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/en/hooks&quot;&gt;Hooks Reference&lt;/a&gt; &amp;mdash; Official Docs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://claude.com/blog/how-to-configure-hooks&quot;&gt;How to Configure Hooks&lt;/a&gt; &amp;mdash; Claude Blog&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/disler/claude-code-hooks-mastery&quot;&gt;claude-code-hooks-mastery&lt;/a&gt; &amp;mdash; GitHub&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/bartolli/claude-code-typescript-hooks&quot;&gt;claude-code-typescript-hooks&lt;/a&gt; &amp;mdash; GitHub&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/hesreallyhim/awesome-claude-code&quot;&gt;awesome-claude-code&lt;/a&gt; &amp;mdash; Hooks 컬렉션&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programmer/AI</category>
      <category>claude code</category>
      <category>eslint</category>
      <category>hooks</category>
      <category>PostToolUse</category>
      <category>PreToolUse</category>
      <category>prettier</category>
      <category>개발 생산성</category>
      <category>린트</category>
      <category>자동화</category>
      <category>포맷팅</category>
      <author>MoreLean</author>
      <guid isPermaLink="true">https://judekim.tistory.com/168</guid>
      <comments>https://judekim.tistory.com/168#entry168comment</comments>
      <pubDate>Wed, 21 Jan 2026 00:27:13 +0900</pubDate>
    </item>
    <item>
      <title>Claude Code 환경 설정: CLAUDE.md로 10분 투자해서 수 시간 절약하기</title>
      <link>https://judekim.tistory.com/167</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code 환경 설정에서 제일 먼저 해야 할 건 &lt;b&gt;CLAUDE.md 파일 만들기&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 파일은 프로젝트 루트에 두는 일종의 &lt;b&gt;설명서&lt;/b&gt;입니다. &quot;이 프로젝트는 뭐고, 어떤 규칙으로 코딩하고, 파일 구조는 어떻고&quot; 다 적어두는 거예요. Claude Code가 작업 시작할 때마다 이 파일을 먼저 읽습니다. 그러면 매번 같은 설명 안 해도 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 세팅하는 데 &lt;b&gt;10분&lt;/b&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;TL;DR&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CLAUDE.md는 Claude Code의 **&quot;헌법&quot;**이자 &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;300줄 미만&lt;/b&gt;, 짧을수록 좋습니다&lt;/li&gt;
&lt;li&gt;포함할 것: 프로젝트 개요, 기술 스택, 코딩 컨벤션, 주요 명령어, 금지 사항&lt;/li&gt;
&lt;li&gt;/init 명령으로 시작하고, 점진적으로 다듬어가세요&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;CLAUDE.md란?&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;The single most important file in your codebase for using Claude Code effectively is the root CLAUDE.md. This file is the agent's &lt;b&gt;'constitution,'&lt;/b&gt; its primary source of truth for how your specific repository works.&quot; &amp;mdash; &lt;a href=&quot;https://blog.sshh.io/p/how-i-use-every-claude-code-feature&quot;&gt;Shrivu Shankar&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CLAUDE.md는 Claude Code가 &lt;b&gt;매 세션 시작 시 자동으로 읽는&lt;/b&gt; 특별한 파일입니다. 프로젝트에 대한 모든 컨텍스트를 여기에 적어두면, 매번 같은 설명을 반복할 필요가 없습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;왜 필요한가?&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Coding agents know absolutely nothing about your codebase at the beginning of each session. The agent must be told anything that's important to know about your codebase each time you start a session. &lt;b&gt;CLAUDE.md is the preferred way of doing this.&lt;/b&gt;&quot; &amp;mdash; &lt;a href=&quot;https://www.humanlayer.dev/blog/writing-a-good-claude-md&quot;&gt;HumanLayer Blog&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code는 &lt;b&gt;상태가 없는(stateless)&lt;/b&gt; 도구입니다. 매 세션마다 당신의 코드베이스에 대해 아무것도 모릅니다. CLAUDE.md가 없으면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;매번 &quot;이 프로젝트는 React + TypeScript야&quot; 설명해야 함&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;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;CLAUDE.md 위치와 계층 구조&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code는 &lt;b&gt;여러 위치의 CLAUDE.md를 계층적으로 읽습니다&lt;/b&gt;:&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;우선순위 (높음 &amp;rarr; 낮음)
─────────────────────────────────────────────────
1. .claude/CLAUDE.md      &amp;larr; 프로젝트 (.claude 폴더 내)
2. ./CLAUDE.md            &amp;larr; 프로젝트 루트
3. ~/.claude/CLAUDE.md    &amp;larr; 사용자 (모든 프로젝트에 적용)
4. 하위 디렉토리 CLAUDE.md &amp;larr; 해당 디렉토리 작업 시만 로드
─────────────────────────────────────────────────
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Claude Code reads information from CLAUDE.md files in a hierarchical order: first from your home directory (~/.claude/CLAUDE.md), then from your project root, and finally from individual directories.&quot; &amp;mdash; &lt;a href=&quot;https://dinanjana.medium.com/mastering-the-vibe-claude-code-best-practices-that-actually-work-823371daf64c&quot;&gt;Dinanjana Gunaratne&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;위치 용도 Git 커밋&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&gt;~/.claude/CLAUDE.md&lt;/td&gt;
&lt;td&gt;개인 환경설정 (모든 프로젝트)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;./CLAUDE.md&lt;/td&gt;
&lt;td&gt;팀 공유 프로젝트 설정&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.claude/CLAUDE.md&lt;/td&gt;
&lt;td&gt;팀 공유 (폴더 정리 선호 시)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;./CLAUDE.local.md&lt;/td&gt;
&lt;td&gt;개인 설정 (Git 제외)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;src/api/CLAUDE.md&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;추가 규칙 파일&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.claude/rules/ 폴더에 여러 마크다운 파일을 넣으면 &lt;b&gt;자동으로 로드&lt;/b&gt;됩니다:&lt;/p&gt;
&lt;pre class=&quot;dos&quot;&gt;&lt;code&gt;.claude/
├── rules/
│   ├── code-style.md      &amp;larr; 프론트엔드 팀 관리
│   ├── security.md        &amp;larr; 보안 팀 관리
│   └── testing.md         &amp;larr; QA 팀 관리
└── CLAUDE.md              &amp;larr; 핵심 설정
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;All markdown files in .claude/rules/ are automatically loaded with the same priority as your main CLAUDE.md. No imports needed.&quot; &amp;mdash; &lt;a href=&quot;https://www.builder.io/blog/claude-md-guide&quot;&gt;Builder.io&lt;/a&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;CLAUDE.md에 넣어야 할 것&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;WHAT, WHY, HOW 프레임워크&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;At a high level, CLAUDE.md should cover:&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;WHAT&lt;/b&gt;: Tell Claude about the tech, your stack, the project structure&lt;/li&gt;
&lt;li&gt;&lt;b&gt;WHY&lt;/b&gt;: Tell Claude the purpose of the project&lt;/li&gt;
&lt;li&gt;&lt;b&gt;HOW&lt;/b&gt;: Tell Claude how it should work on the project&quot; &amp;mdash; &lt;a href=&quot;https://www.humanlayer.dev/blog/writing-a-good-claude-md&quot;&gt;HumanLayer Blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;필수 포함 항목&lt;/h3&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;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;h3 data-ke-size=&quot;size23&quot;&gt;예시: Next.js 프로젝트&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;# Project: ShopFront

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

## Tech Stack
- **Framework**: Next.js 14 (App Router)
- **Language**: TypeScript (strict mode)
- **Database**: PostgreSQL + Prisma
- **Auth**: NextAuth.js
- **Payments**: Stripe
- **Styling**: Tailwind CSS

## Directory Structure
- `app/` - Next.js App Router pages and layouts
- `components/` - Reusable React components
- `lib/` - Utility functions and shared logic
- `prisma/` - Database schema and migrations
- `public/` - Static assets

## Commands
- `pnpm dev` - Start development server
- `pnpm build` - Production build
- `pnpm test` - Run tests (Jest)
- `pnpm lint` - ESLint check
- `pnpm db:migrate` - Run Prisma migrations
- `pnpm db:studio` - Open Prisma Studio

## Code Style
- Use ES modules (import/export)
- 2-space indentation
- Single quotes for strings
- No semicolons (Prettier handles it)
- Prefer interfaces over types
- No `any` - use `unknown` instead

## IMPORTANT RULES
- NEVER leave console.log in production code
- NEVER commit .env files
- NEVER modify files in `generated/` directory
- Always run `pnpm lint` before committing
- All API routes must have error handling

## Testing
- Unit tests: `__tests__/` folders next to source
- E2E tests: `e2e/` folder with Playwright
- Minimum 80% coverage for new code
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;/init으로 시작하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음부터 직접 작성할 필요 없습니다. /init 명령으로 &lt;b&gt;자동 생성&lt;/b&gt;할 수 있습니다:&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;cd your-project
claude
&amp;gt; /init
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude가 프로젝트를 분석해서 기본 CLAUDE.md를 생성합니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Run it in your project directory and Claude generates a starter CLAUDE.md based on your project structure and detected tech stack. &lt;b&gt;I use /init as a starting point and delete what I don't need.&lt;/b&gt; Deleting is easier than creating from scratch.&quot; &amp;mdash; &lt;a href=&quot;https://www.builder.io/blog/claude-md-guide&quot;&gt;Builder.io&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;/init 후 해야 할 것&lt;/h3&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;: &quot;절대 하지 마&quot; 규칙들&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Git 커밋&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;The generated file often includes obvious things you don't need spelled out, or filler that doesn't add value. &lt;b&gt;Because context is precious.&lt;/b&gt; Every line in your CLAUDE.md competes for attention with the actual work you're asking Claude to do.&quot; &amp;mdash; &lt;a href=&quot;https://www.builder.io/blog/claude-md-guide&quot;&gt;Builder.io&lt;/a&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;짧게 유지하기: Less is More&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;300줄 미만 권장&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;While Anthropic does not have an official recommendation on how long your CLAUDE.md file should be, general consensus is that &lt;b&gt;&amp;lt; 300 lines is best, and shorter is even better&lt;/b&gt;. At HumanLayer, our root CLAUDE.md file is less than sixty lines.&quot; &amp;mdash; &lt;a href=&quot;https://www.humanlayer.dev/blog/writing-a-good-claude-md&quot;&gt;HumanLayer Blog&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;왜 짧아야 하나?&lt;/h3&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;: CLAUDE.md도 컨텍스트 윈도우를 차지함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주의력 분산&lt;/b&gt;: 내용이 많으면 중요한 것을 놓침&lt;/li&gt;
&lt;li&gt;&lt;b&gt;무시 가능성&lt;/b&gt;: 관련 없는 내용이 많으면 Claude가 무시함&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;The more information you have in the file that's not universally applicable to the tasks you have it working on, the more likely it is that &lt;b&gt;Claude will ignore your instructions&lt;/b&gt; in the file.&quot; &amp;mdash; &lt;a href=&quot;https://www.humanlayer.dev/blog/writing-a-good-claude-md&quot;&gt;HumanLayer Blog&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Progressive Disclosure 원칙&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 걸 CLAUDE.md에 넣지 마세요. &lt;b&gt;필요할 때 찾아보게&lt;/b&gt; 하세요:&lt;/p&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;## Database Migrations
For complex migration patterns, see `docs/migrations.md`.
Run `pnpm db:migrate --help` for available options.

## API Documentation
Full API spec at `docs/api/openapi.yaml`.
Use Swagger UI: `pnpm docs:api`
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Don't tell Claude all the information you could possibly want it to know. Rather, &lt;b&gt;tell it how to find important information&lt;/b&gt; so that it can find and use it, but only when it needs to.&quot; &amp;mdash; &lt;a href=&quot;https://www.humanlayer.dev/blog/writing-a-good-claude-md&quot;&gt;HumanLayer Blog&lt;/a&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;p data-ke-size=&quot;size16&quot;&gt;중요한 규칙은 &lt;b&gt;강조&lt;/b&gt;해야 Claude가 잘 따릅니다:&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;## CRITICAL RULES (DO NOT IGNORE)

⛔ **NEVER** leave console.log in production code
⛔ **NEVER** commit API keys or secrets
⛔ **NEVER** modify files in `generated/` directory
⛔ **NEVER** skip error handling in API routes

✅ **ALWAYS** run tests before committing
✅ **ALWAYS** use TypeScript strict mode
✅ **ALWAYS** handle loading and error states in components
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Add emphasis (e.g., 'IMPORTANT,' 'YOU MUST') to improve Claude's adherence to critical instructions.&quot; &amp;mdash; &lt;a href=&quot;https://stevekinney.com/courses/ai-development/claude-dot-md&quot;&gt;Steve Kinney&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.md에 &quot;절대 console.log 남기지 마&quot; 같은 규칙을 박아뒀어요. 그랬더니 Claude Code가 알아서 지켜주더라고요. 디버깅용 로그를 넣었다가도 마지막에 자동으로 제거합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;# 키로 빠르게 추가하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션 중에 규칙을 추가하고 싶다면 **#**으로 시작하면 됩니다:&lt;/p&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# Never use deprecated lodash methods
# Prefer native array methods over lodash when possible
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 입력하면 CLAUDE.md에 자동으로 추가됩니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;The fastest way to add a memory during a session is by starting your input with the # character.&quot; &amp;mdash; &lt;a href=&quot;https://stevekinney.com/courses/ai-development/claude-dot-md&quot;&gt;Steve Kinney&lt;/a&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;실전 CLAUDE.md 예시&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최소 버전 (스타트업 프로젝트)&lt;/h3&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;# Ttokseo (똑서) - 어린이 디지털 독서 플랫폼

React Native + Kotlin/Spring Boot 기반 구독형 교육 서비스.

## Commands
- Mobile: `cd mobile &amp;amp;&amp;amp; pnpm start`
- Backend: `cd backend &amp;amp;&amp;amp; ./gradlew bootRun`
- Tests: `pnpm test` / `./gradlew test`

## Key Rules
- Korean comments for business logic
- All API responses must include `success`, `data`, `error` fields
- UTC timestamps in DB, KST conversion in frontend
- Never commit .env files
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;상세 버전 (팀 프로젝트)&lt;/h3&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;# Project: Enterprise Dashboard

Internal analytics dashboard for sales team.
React 18 + TypeScript + GraphQL + PostgreSQL.

## Quick Start
1. `pnpm install`
2. `cp .env.example .env.local`
3. `pnpm db:migrate`
4. `pnpm dev`

## Architecture
- `src/features/` - Feature-based modules (sales, users, reports)
- `src/shared/` - Shared components, hooks, utilities
- `src/graphql/` - GraphQL schema and resolvers
- `prisma/` - Database schema

## Code Standards
- Feature-first folder structure
- Colocation: tests, styles, types next to components
- No barrel exports (index.ts re-exports)
- Prefer server components, client only when needed

## GraphQL Conventions
- Queries: `use{Resource}Query` (e.g., `useSalesQuery`)
- Mutations: `use{Action}{Resource}Mutation` (e.g., `useCreateOrderMutation`)
- Always handle loading, error, data states

## Testing
- Unit: Jest + React Testing Library
- E2E: Playwright
- Run `pnpm test:coverage` before PR

## IMPORTANT
- This dashboard contains sensitive sales data
- Never log PII (names, emails, phone numbers)
- All API calls must go through auth middleware
- Check `docs/security.md` before adding new endpoints
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;CLAUDE.md vs CLAUDE.local.md&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분 CLAUDE.md CLAUDE.local.md&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&gt;&lt;b&gt;용도&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;Git&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;✅ 커밋&lt;/td&gt;
&lt;td&gt;❌ gitignore&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;td&gt;개인 선호, 실험&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;# CLAUDE.local.md (개인용)

## My Preferences
- I prefer verbose explanations
- Always show full file paths in responses
- Use Korean for comments

## Current Focus
Working on payment integration this week.
Key files: `src/features/payment/`

## Experiments
Testing new caching strategy - see `docs/cache-experiment.md`
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;CLAUDE.md 유지보수&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CLAUDE.md는 &lt;b&gt;살아있는 문서&lt;/b&gt;입니다. 프로젝트와 함께 진화해야 합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;업데이트 시점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새로운 주요 의존성 추가 시&lt;/li&gt;
&lt;li&gt;아키텍처 패턴 변경 시&lt;/li&gt;
&lt;li&gt;디렉토리 구조 변경 시&lt;/li&gt;
&lt;li&gt;새로운 환경 변수 추가 시&lt;/li&gt;
&lt;li&gt;Claude가 반복적으로 실수하는 패턴 발견 시&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Treat customization as an ongoing practice rather than a one-time setup task. Projects change, teams learn better patterns, and new tools enter your workflow. &lt;b&gt;A well-maintained CLAUDE.md evolves with your codebase.&lt;/b&gt;&quot; &amp;mdash; &lt;a href=&quot;https://claude.com/blog/using-claude-md-files&quot;&gt;Claude Blog&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;❌ &lt;b&gt;모든 명령어 나열&lt;/b&gt;: 필요한 것만 ❌ &lt;b&gt;모든 파일 경로 나열&lt;/b&gt;: 핵심 디렉토리만 ❌ &lt;b&gt;일반적인 조언&lt;/b&gt;: 프로젝트 특화된 것만 ❌ &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;Don't try to stuff every command Claude could possibly need to run in your CLAUDE.md file - you will get sub-optimal results.&quot; &amp;mdash; &lt;a href=&quot;https://www.humanlayer.dev/blog/writing-a-good-claude-md&quot;&gt;HumanLayer Blog&lt;/a&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;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;[ ] /init으로 기본 파일 생성&lt;/li&gt;
&lt;li&gt;[ ] 불필요한 내용 삭제&lt;/li&gt;
&lt;li&gt;[ ] 프로젝트 개요 추가&lt;/li&gt;
&lt;li&gt;[ ] 핵심 명령어 추가&lt;/li&gt;
&lt;li&gt;[ ] 금지 사항 명시 (IMPORTANT 강조)&lt;/li&gt;
&lt;li&gt;[ ] Git 커밋&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[ ] Claude가 반복 실수하면 규칙 추가&lt;/li&gt;
&lt;li&gt;[ ] 새 패턴/도구 도입 시 업데이트&lt;/li&gt;
&lt;li&gt;[ ] 300줄 미만 유지&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[ ] ~/.claude/CLAUDE.md로 개인 전역 설정&lt;/li&gt;
&lt;li&gt;[ ] .claude/rules/로 모듈화 (대규모 팀)&lt;/li&gt;
&lt;li&gt;[ ] CLAUDE.local.md로 개인 실험&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CLAUDE.md는 Claude Code의 &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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;10분 투자로 &lt;b&gt;수 시간 절약&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;짧게 유지&lt;/b&gt; (300줄 미만, 짧을수록 좋음)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;핵심만&lt;/b&gt; 포함 (WHAT, WHY, HOW)&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;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;The more thought put into Claude.md files, the better Claude Code performs.&quot; &amp;mdash; &lt;a href=&quot;https://www-cdn.anthropic.com/58284b19e702b49db9302d5b6f135ad8871e7658.pdf&quot;&gt;Anthropic: How Anthropic teams use Claude Code&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트에 처음 Claude Code를 도입한다면, &lt;b&gt;오늘 바로 CLAUDE.md를 만드세요&lt;/b&gt;. 10분이면 됩니다. 그 10분이 앞으로 수십 시간을 절약해줄 겁니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고 자료&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Anthropic 공식&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;a href=&quot;https://claude.com/blog/using-claude-md-files&quot;&gt;Using CLAUDE.md Files&lt;/a&gt; &amp;mdash; Claude Blog&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.anthropic.com/engineering/claude-code-best-practices&quot;&gt;Claude Code Best Practices&lt;/a&gt; &amp;mdash; Anthropic Engineering&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/en/settings&quot;&gt;Claude Code Settings&lt;/a&gt; &amp;mdash; Official Docs&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.humanlayer.dev/blog/writing-a-good-claude-md&quot;&gt;Writing a Good CLAUDE.md&lt;/a&gt; &amp;mdash; HumanLayer Blog&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.builder.io/blog/claude-md-guide&quot;&gt;The Complete Guide to CLAUDE.md&lt;/a&gt; &amp;mdash; Builder.io&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.sshh.io/p/how-i-use-every-claude-code-feature&quot;&gt;How I Use Every Claude Code Feature&lt;/a&gt; &amp;mdash; Shrivu Shankar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stevekinney.com/courses/ai-development/claude-dot-md&quot;&gt;CLAUDE.md Guide&lt;/a&gt; &amp;mdash; Steve Kinney&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programmer/AI</category>
      <category>AI 코딩</category>
      <category>Anthropic</category>
      <category>claude code</category>
      <category>CLAUDE.MD</category>
      <category>개발 생산성</category>
      <category>개발 환경</category>
      <category>에이전틱 코딩</category>
      <category>코딩 컨벤션</category>
      <category>프로젝트 설정</category>
      <category>환경 설정</category>
      <author>MoreLean</author>
      <guid isPermaLink="true">https://judekim.tistory.com/167</guid>
      <comments>https://judekim.tistory.com/167#entry167comment</comments>
      <pubDate>Wed, 21 Jan 2026 00:12:07 +0900</pubDate>
    </item>
    <item>
      <title>Claude Code 컨텍스트 관리: 채워질수록 썩는 작업 기억</title>
      <link>https://judekim.tistory.com/166</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code를 잘 쓰는 사람과 못 쓰는 사람을 나누는 &lt;b&gt;결정적 차이&lt;/b&gt;가 있습니다. 프롬프트 스킬도 아니고, 모델 선택도 아닙니다. 바로 &lt;b&gt;컨텍스트 관리&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨텍스트는 &lt;b&gt;컴퓨터의 RAM&lt;/b&gt;과 같습니다. 95%까지 채울 수 있지만, 그 마지막 5%는 스와핑과 가비지 컬렉션에 소모되어 실제 작업 공간이 없어집니다. Claude Code도 마찬가지입니다. 대화가 길어지면 초반 내용을 까먹거나 헷갈리기 시작합니다.&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;TL;DR&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컨텍스트 윈도우는 Claude의 **작업 기억(Working Memory)**입니다&lt;/li&gt;
&lt;li&gt;200k 토큰이 한계지만, &lt;b&gt;80~100k만 넘어도 품질이 떨어집니다&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;3~5개 작업마다&lt;/b&gt; 또는 &lt;b&gt;100k 토큰 전에&lt;/b&gt; 리셋하세요&lt;/li&gt;
&lt;li&gt;리셋 전에 &lt;b&gt;HANDOFF.md 파일&lt;/b&gt;을 꼭 만들어두세요&lt;/li&gt;
&lt;li&gt;/compact 3번 후 /clear하는 패턴을 추천합니다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Anthropic 공식 권장사항&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 &quot;개인 경험담&quot;이 아닙니다. &lt;b&gt;Anthropic이 공식 블로그에서 명시적으로 권장&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;During long sessions, Claude's context window can fill with irrelevant conversation, file contents, and commands. &lt;b&gt;This can reduce performance and sometimes distract Claude.&lt;/b&gt; Use the /clear command frequently between tasks to reset the context window.&quot; &amp;mdash; &lt;a href=&quot;https://www.anthropic.com/engineering/claude-code-best-practices&quot;&gt;Anthropic Engineering Blog: Claude Code Best Practices&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&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;/li&gt;
&lt;li&gt;이로 인해 &lt;b&gt;성능이 저하&lt;/b&gt;되고 Claude가 &lt;b&gt;산만해집니다&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;작업 사이에 &lt;b&gt;/clear를 자주 사용&lt;/b&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;왜 성능이 떨어지나?&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Context Rot: 채워질수록 썩는다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Chroma의 연구에서 &quot;Context Rot&quot;라는 개념이 제시되었습니다. 컨텍스트 윈도우가 채워질수록 &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;Research consistently shows that optimizing Claude's context window in 2025 involves &lt;b&gt;context quality over quantity&lt;/b&gt;, with performance degrading substantially as models approach their limits.&quot; &amp;mdash; &lt;a href=&quot;https://hyperdev.matsuoka.com/p/how-claude-code-got-better-by-protecting&quot;&gt;Hyperdev&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;LLM accuracy declines as the context window fills past 50%... &lt;b&gt;effective context windows are probably 50-60%&lt;/b&gt; or even lesser.&quot; &amp;mdash; &lt;a href=&quot;https://sankalp.bearblog.dev/my-experience-with-claude-code-20-and-how-to-get-better-at-using-coding-agents/&quot;&gt;Sankalp's Blog&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;RAM 비유: 왜 여유 공간이 필요한가&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Think of it like RAM on your computer. Sure, you can run programs until you hit 95% memory utilization. But that last 5% gets consumed by swapping, garbage collection, and system overhead&amp;mdash;&lt;b&gt;leaving nothing for actual computation&lt;/b&gt;. Your programs slow to a crawl despite having 'only' 95% utilization. LLMs work similarly. That 'free' context space isn't wasted&amp;mdash;&lt;b&gt;it's where reasoning happens&lt;/b&gt;.&quot; &amp;mdash; &lt;a href=&quot;https://hyperdev.matsuoka.com/p/how-claude-code-got-better-by-protecting&quot;&gt;Hyperdev&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;컨텍스트가 오염되면 이런 현상이 나타납니다:&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;: &quot;아까 말한 컨벤션 왜 안 지켜?&quot;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자기 모순&lt;/b&gt;: 방금 전 결정과 반대로 행동&lt;/li&gt;
&lt;li&gt;&lt;b&gt;환각(Hallucination)&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;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;The pattern was frustrating: you'd be deep into a complex refactoring, making steady progress, then suddenly Claude Code would struggle. &lt;b&gt;Responses would become generic, previous decisions would be forgotten&lt;/b&gt;, and code quality would noticeably degrade.&quot; &amp;mdash; &lt;a href=&quot;https://hyperdev.matsuoka.com/p/how-claude-code-got-better-by-protecting&quot;&gt;Hyperdev&lt;/a&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;200k 토큰인데 왜 100k에서 리셋하나?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이론적으로 Claude Code는 200k 토큰까지 쓸 수 있습니다. 하지만 실전에서는 &lt;b&gt;80~100k만 넘어가도 품질이 떨어지기 시작&lt;/b&gt;합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;실제 사용 가능 공간&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;200k 전체를 대화에 쓸 수 있는 게 아닙니다:&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;┌─────────────────────────────────────────────────────┐
│  컨텍스트 윈도우 (200K 토큰)                             │
├─────────────────────────────────────────────────────┤
│  시스템 프롬프트 + 도구: ~15K                            │
│  MCP 도구 정의: 가변 (수천~수만)                         │
│  Auto-compact 예약: ~45K (22.5%)                     │
│  ─────────────────────────────────────              │
│  실제 대화/코드: ~140K (이론상)                          │
│  유효 작업 공간: ~100K (현실적)                          │
└─────────────────────────────────────────────────────┘&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Auto-compact is a feature that quietly consumes a massive amount of your context window before you even start coding, with some reports showing the autocompact buffer consuming &lt;b&gt;45k tokens&amp;mdash;22.5% of your context window gone&lt;/b&gt; before writing a single line of code.&quot; &amp;mdash; &lt;a href=&quot;https://hyperdev.matsuoka.com/p/how-claude-code-got-better-by-protecting&quot;&gt;Hyperdev&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;75% 규칙&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code는 내부적으로 &lt;b&gt;75% 사용량에서 auto-compact를 트리거&lt;/b&gt;합니다. 이는 25%(50k 토큰)를 추론 공간으로 남겨두기 위함입니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;If Claude Code is indeed triggering compaction at 75% utilization rather than 90%+, that leaves &lt;b&gt;25% of the context window (50k tokens in a 200k window) free for reasoning&lt;/b&gt;.&quot; &amp;mdash; &lt;a href=&quot;https://hyperdev.matsuoka.com/p/how-claude-code-got-better-by-protecting&quot;&gt;Hyperdev&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결론&lt;/b&gt;: 100k를 넘기 전에 리셋하는 게 시간 절약입니다. 아깝게 느껴져도 이게 결국 더 효율적입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;컨텍스트 관리 명령어: /compact vs /clear&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;/compact &amp;mdash; 요약 압축&lt;/h3&gt;
&lt;pre class=&quot;dos&quot;&gt;&lt;code&gt;/compact
&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;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;b&gt;미묘한 컨텍스트가 손실&lt;/b&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;&quot;Compacting is distinct from the /clear command. While /clear completely wipes out the chat history and starts a brand new conversation from scratch, &lt;b&gt;/compact summarizes the conversation and preserves the essential nuances and key information&lt;/b&gt;.&quot; &amp;mdash; &lt;a href=&quot;https://stevekinney.com/courses/ai-development/claude-code-compaction&quot;&gt;Steve Kinney&lt;/a&gt;&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;같은 작업을 계속하지만 컨텍스트가 70-85% 찼을 때&lt;/li&gt;
&lt;li&gt;이전 결정사항을 유지하고 싶을 때&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;/clear &amp;mdash; 완전 초기화&lt;/h3&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;/clear
&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;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;b&gt;HANDOFF.md 없으면 위험&lt;/b&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;&quot;Pro tip: use /clear often. Every time you start something new, clear the chat. &lt;b&gt;You don't need all that history eating your tokens&lt;/b&gt;, and you definitely don't need Claude running compaction calls to summarize old conversations.&quot; &amp;mdash; &lt;a href=&quot;https://www.builder.io/blog/claude-code&quot;&gt;Builder.io&lt;/a&gt;&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;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;Claude가 이상하게 행동하거나 루프에 빠졌을 때&lt;/li&gt;
&lt;li&gt;컨텍스트가 90% 이상 찼을 때&lt;/li&gt;
&lt;li&gt;대화가 완전히 엉뚱한 방향으로 갔을 때&lt;/li&gt;
&lt;/ul&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;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&gt;컨텍스트 70-85%, 같은 작업 계속&lt;/td&gt;
&lt;td&gt;/compact&lt;/td&gt;
&lt;td&gt;결정사항 보존&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;컨텍스트 90%+, 작업 전환&lt;/td&gt;
&lt;td&gt;/clear&lt;/td&gt;
&lt;td&gt;깨끗한 시작&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude가 루프에 빠짐&lt;/td&gt;
&lt;td&gt;/clear&lt;/td&gt;
&lt;td&gt;오염된 컨텍스트 제거&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;이전 컨텍스트 50% 미만 관련&lt;/td&gt;
&lt;td&gt;/clear&lt;/td&gt;
&lt;td&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;&quot;Use /compact when: Context 70-85%, same task continues, need to preserve decisions. Use /clear when: Context 90%+, task complete, switching context, &lt;b&gt;conversation went off-track, context poisoning&lt;/b&gt;.&quot; &amp;mdash; &lt;a href=&quot;https://deepwiki.com/FlorianBruniaux/claude-code-ultimate-guide/3.3-plan-mode&quot;&gt;DeepWiki&lt;/a&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;추천 패턴: /compact 3번 후 /clear&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 쓰는 패턴입니다:&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;작업 1-2: 자유롭게 작업
──────────────────────
[/compact] &amp;larr; 70% 도달
──────────────────────
작업 3-4: 계속 작업
──────────────────────
[/compact] &amp;larr; 다시 70% 도달
──────────────────────
작업 5: 계속 작업
──────────────────────
[/compact] &amp;larr; 세 번째
──────────────────────
[HANDOFF.md 생성]
[/clear] &amp;larr; 완전 리셋
──────────────────────
새 세션: HANDOFF.md 읽고 시작
&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;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Compaction, we found, encourages long, meandering threads, in which you just compact once you run out of context window, &lt;b&gt;stacking summary on top of summary&lt;/b&gt;. What we want to encourage are &lt;b&gt;focused threads&lt;/b&gt;, because we think that's how agents yield the best results.&quot; &amp;mdash; &lt;a href=&quot;https://ampcode.com/news/handoff&quot;&gt;Amp&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/compact를 반복하면 &quot;요약의 요약&quot;이 쌓이면서 정보가 점점 손실됩니다. 3번 정도 후에는 /clear로 깨끗하게 시작하는 게 좋습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;HANDOFF.md: 리셋 전에 꼭 만들어야 할 파일&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨텍스트를 리셋하기 전에 &lt;b&gt;꼭 해야 할 일&lt;/b&gt;이 있습니다. &lt;b&gt;HANDOFF.md 파일 만들기&lt;/b&gt;입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;왜 필요한가?&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;AI sessions have limited context. When you switch tools, take a break, or hit a context limit, &lt;b&gt;the next agent starts from scratch&lt;/b&gt;. Handoffs solve this by capturing: What you're trying to do, what's done, what's not, what failed (so the next agent doesn't repeat mistakes), key decisions and their rationale, exactly how to continue.&quot; &amp;mdash; &lt;a href=&quot;https://github.com/willseltzer/claude-handoff&quot;&gt;willseltzer/claude-handoff&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HANDOFF.md 없이 /clear하면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2시간치 작업 흐름을 다시 설명해야 함&lt;/li&gt;
&lt;li&gt;이전에 실패한 접근법을 또 시도함&lt;/li&gt;
&lt;li&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;&quot;Creating a handoff takes 2-3 minutes. &lt;b&gt;Re-establishing context without one takes 10-15 minutes.&lt;/b&gt; Every session.&quot; &amp;mdash; &lt;a href=&quot;https://dev.to/dorothyjb/session-handoffs-giving-your-ai-assistant-memory-that-actually-persists-je9&quot;&gt;DEV Community&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;HANDOFF.md 템플릿&lt;/h3&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;# Handoff: [작업 제목]

**생성일**: 2026-01-20 14:30
**브랜치**: feature/user-auth
**상태**: 진행 중

## 목표
OAuth2를 이용한 사용자 인증 추가

## 완료된 작업
- [x] OAuth2 provider 설정
- [x] 로그인 엔드포인트 생성
- [x] JWT 토큰 발급 로직

## 남은 작업
- [ ] 토큰 갱신 로직 추가
- [ ] 로그아웃 처리
- [ ] 테스트 작성

## 실패한 접근법 (다시 시도하지 말 것!)
passport.js를 먼저 시도했으나 Express 미들웨어와 충돌.
`req.user`가 항상 undefined였음 - passport의 세션 미들웨어가
우리 커스텀 auth 체크 후에 실행되기 때문.
&amp;rarr; oauth4webapi로 전환 (fetch와 직접 작동, Express 건드리지 않음)

## 주요 결정사항
| 결정 | 이유 |
|------|------|
| passport 대신 oauth4webapi | 더 가볍고 미들웨어 충돌 없음 |
| refresh token은 httpOnly 쿠키에 저장 | localStorage보다 보안상 유리 |

## 현재 상태
**작동함**: 로그인 플로우에서 유효한 토큰 반환
**문제 있음**: /api/auth/refresh에서 500 에러 - `TokenExpiredError`

## 재개 지침
1. refresh.ts:42의 JWT verify 호출이 잘못된 시크릿 사용 중 - 수정 필요
2. 로그아웃: httpOnly 쿠키 클리어, POST /api/auth/logout
3. 전체 플로우 테스트 후 PR 생성
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;핵심 포인트&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&lt;b&gt;Failed approaches are mandatory&lt;/b&gt; - This is the most valuable part. 'Tried X, it didn't work because Y' saves hours.&quot; &amp;mdash; &lt;a href=&quot;https://github.com/willseltzer/claude-handoff&quot;&gt;willseltzer/claude-handoff&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HANDOFF.md에서 가장 중요한 부분은 **&quot;실패한 접근법&quot;**입니다. 이게 없으면 새 세션에서 같은 실수를 반복합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;/handoff 커맨드 만들기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매번 수동으로 작성하기 번거롭다면, 커스텀 커맨드를 만들 수 있습니다:&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;!-- .claude/commands/handoff.md --&amp;gt;
Write or update a handoff document so the next agent with fresh 
context can continue this work.

Include:
1. Goal and current progress
2. What worked and what didn't (with specific error messages)
3. Key decisions and their rationale
4. Current blockers or issues
5. Specific next steps

Save as HANDOFF.md in the project root.
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;The way I do this is to ask Claude to write a handoff document before starting fresh. Something like: &lt;b&gt;'Put the rest of the plan in the HANDOFF.md. Explain what you have tried, what worked, what didn't work, so that the next agent with fresh context is able to just load that file and nothing else to get started.'&lt;/b&gt;&quot; &amp;mdash; &lt;a href=&quot;https://github.com/ykdojo/claude-code-tips&quot;&gt;ykdojo/claude-code-tips&lt;/a&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;/compact vs HANDOFF.md: 뭐가 다른가?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘 다 컨텍스트를 보존하는 방법이지만 용도가 다릅니다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분 /compact HANDOFF.md&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&gt;&lt;b&gt;범위&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;저장 위치&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;제어권&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Claude가 요약&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;td&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;&quot;&lt;b&gt;Compacting is for within-session continuity.&lt;/b&gt; It summarizes to free up context space so you can keep working. &lt;b&gt;Handoffs are for cross-session continuity.&lt;/b&gt; They're explicit documentation of what matters, in a format you control and can search.&quot; &amp;mdash; &lt;a href=&quot;https://dev.to/dorothyjb/session-handoffs-giving-your-ai-assistant-memory-that-actually-persists-je9&quot;&gt;DEV Community&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Best Practice&lt;/b&gt;: 둘 다 사용하세요. /compact로 세션 내 연속성을 유지하고, /clear 전에는 HANDOFF.md로 세션 간 연속성을 확보하세요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;컨텍스트 사용량 기준&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용량 상태 권장 조치&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;0-50%&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;50-70%&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;  주의&lt;/td&gt;
&lt;td&gt;모니터링, HANDOFF.md 준비&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;70-85%&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;  경고&lt;/td&gt;
&lt;td&gt;/compact 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;85-95%&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;  위험&lt;/td&gt;
&lt;td&gt;HANDOFF.md 작성 &amp;rarr; /clear&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;95%+&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;⛔ 한계&lt;/td&gt;
&lt;td&gt;즉시 /clear (데이터 손실 위험)&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;&quot;I would do a handoff or compact when I reach total &lt;b&gt;60%&lt;/b&gt; if building something complex.&quot; &amp;mdash; &lt;a href=&quot;https://sankalp.bearblog.dev/my-experience-with-claude-code-20-and-how-to-get-better-at-using-coding-agents/&quot;&gt;Sankalp's Blog&lt;/a&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;h3 data-ke-size=&quot;size23&quot;&gt;패턴 1: 일반 작업&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;1. /context로 상태 확인
2. 작업 진행
3. 70% 도달 &amp;rarr; /compact
4. 계속 작업
5. 다시 70% 또는 작업 전환 시점
   &amp;rarr; HANDOFF.md 작성
   &amp;rarr; /clear
6. 새 세션에서 @HANDOFF.md로 시작
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;패턴 2: 복잡한 장기 작업&lt;/h3&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;1. Plan Mode로 계획 수립
2. 계획을 PLAN.md로 저장
3. /clear
4. @PLAN.md 읽고 1단계부터 실행
5. 각 단계 완료 시 PLAN.md 업데이트
6. 70% 도달 시마다:
   - HANDOFF.md 작성 (현재 진행 상황)
   - /clear
   - @PLAN.md + @HANDOFF.md로 재개
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Often when the context window starts getting full or I feel the model is struggling with a complex task, I want to start a new conversation using /clear. &lt;b&gt;I prefer to make Claude write what happened in current session before I kill it and start a new one.&lt;/b&gt;&quot; &amp;mdash; &lt;a href=&quot;https://sankalp.bearblog.dev/my-experience-with-claude-code-20-and-how-to-get-better-at-using-coding-agents/&quot;&gt;Sankalp's Blog&lt;/a&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;CLAUDE.md vs HANDOFF.md&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 파일의 역할이 다릅니다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분 CLAUDE.md HANDOFF.md&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&gt;&lt;b&gt;성격&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;수명&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;내용&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;로딩&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;pre class=&quot;markdown&quot;&gt;&lt;code&gt;# CLAUDE.md (프로젝트 상수)
- 기술 스택: React + Node.js + PostgreSQL
- 코드 스타일: 2-space indent, snake_case API
- 빌드 명령: pnpm dev, pnpm test

# HANDOFF.md (현재 작업 상태)
- 목표: OAuth2 인증 추가
- 완료: 로그인 엔드포인트
- 실패한 시도: passport.js (미들웨어 충돌)
- 다음 단계: 토큰 갱신 로직
&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;/h2&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;[ ] /context로 초기 사용량 확인&lt;/li&gt;
&lt;li&gt;[ ] HANDOFF.md가 있다면 @로 참조&lt;/li&gt;
&lt;li&gt;[ ] 불필요한 MCP 서버 비활성화&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[ ] 70% 도달하면 /compact 또는 HANDOFF.md 준비&lt;/li&gt;
&lt;li&gt;[ ] 100k 토큰 전에 리셋 고려&lt;/li&gt;
&lt;li&gt;[ ] Claude가 이상하게 행동하면 즉시 /clear&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[ ] ⚠️ &lt;b&gt;HANDOFF.md 작성&lt;/b&gt; (가장 중요!)&lt;/li&gt;
&lt;li&gt;[ ] 실패한 접근법 명시&lt;/li&gt;
&lt;li&gt;[ ] 다음 단계 구체적으로 기록&lt;/li&gt;
&lt;li&gt;[ ] /clear 실행&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[ ] @HANDOFF.md로 컨텍스트 복원&lt;/li&gt;
&lt;li&gt;[ ] &quot;이 파일 읽고 이어서 진행해줘&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨텍스트 관리는 Claude Code의 &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;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; (Context Rot)&lt;/li&gt;
&lt;li&gt;200k가 한계지만 &lt;b&gt;100k 전에 리셋&lt;/b&gt;하는 게 현명합니다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;/compact 3번 후 /clear&lt;/b&gt; 패턴을 추천합니다&lt;/li&gt;
&lt;li&gt;/clear 전에 &lt;b&gt;HANDOFF.md는 필수&lt;/b&gt;입니다&lt;/li&gt;
&lt;li&gt;HANDOFF.md에서 **&quot;실패한 접근법&quot;**이 가장 중요합니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code가 갑자기 이상해졌다고 느낄 때, 그건 Claude의 문제가 아닙니다. &lt;b&gt;컨텍스트가 오염된 것&lt;/b&gt;입니다. HANDOFF.md 작성하고 /clear 한 번이면 해결됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고 자료&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Anthropic 공식&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;a href=&quot;https://www.anthropic.com/engineering/claude-code-best-practices&quot;&gt;Claude Code Best Practices&lt;/a&gt; &amp;mdash; Anthropic Engineering Blog&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents&quot;&gt;Effective Context Engineering for AI Agents&lt;/a&gt; &amp;mdash; Anthropic Engineering Blog&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.sshh.io/p/how-i-use-every-claude-code-feature&quot;&gt;How I Use Every Claude Code Feature&lt;/a&gt; &amp;mdash; Shrivu Shankar&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@arthurpro/claude-code-keep-the-context-clean-d4c629ed4ac5&quot;&gt;Claude Code: Keep the Context Clean&lt;/a&gt; &amp;mdash; Arthur&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hyperdev.matsuoka.com/p/how-claude-code-got-better-by-protecting&quot;&gt;How Claude Code Got Better by Protecting More Context&lt;/a&gt; &amp;mdash; Hyperdev&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/dorothyjb/session-handoffs-giving-your-ai-assistant-memory-that-actually-persists-je9&quot;&gt;Session Handoffs: Giving Your AI Assistant Memory That Actually Persists&lt;/a&gt; &amp;mdash; DEV Community&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/willseltzer/claude-handoff&quot;&gt;willseltzer/claude-handoff&lt;/a&gt; &amp;mdash; GitHub&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ykdojo/claude-code-tips&quot;&gt;ykdojo/claude-code-tips&lt;/a&gt; &amp;mdash; GitHub&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://research.trychroma.com/context-rot&quot;&gt;Context Rot&lt;/a&gt; &amp;mdash; Chroma Research&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programmer/AI</category>
      <category>/clear</category>
      <category>/compact</category>
      <category>AI 코딩</category>
      <category>Anthropic</category>
      <category>claude code</category>
      <category>context window</category>
      <category>HANDOFF.md</category>
      <category>개발 생산성</category>
      <category>세션 핸드오프</category>
      <category>컨텍스트 관리</category>
      <author>MoreLean</author>
      <guid isPermaLink="true">https://judekim.tistory.com/166</guid>
      <comments>https://judekim.tistory.com/166#entry166comment</comments>
      <pubDate>Tue, 20 Jan 2026 23:48:45 +0900</pubDate>
    </item>
    <item>
      <title>Claude Code의 게임체인저: Plan Mode vs YOLO Mode</title>
      <link>https://judekim.tistory.com/165</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code를 쓰다 보면 두 가지 극단 사이에서 고민하게 됩니다. &quot;매번 허락 받는 게 너무 느려&quot; vs &quot;그냥 다 실행했다가 망하면 어떡해&quot;. Anthropic은 이 문제를 해결하기 위해 &lt;b&gt;세 가지 Permission Mode&lt;/b&gt;를 제공합니다. 이 글에서는 각 모드의 특징과 언제 어떤 모드를 써야 하는지 정리합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;TL;DR&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Shift+Tab&lt;/b&gt;으로 세 가지 모드를 순환할 수 있습니다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Plan Mode&lt;/b&gt;: 읽기 전용, 계획만 세움 &amp;rarr; 복잡한 작업에 최적&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Auto-Accept Mode&lt;/b&gt;: 자동 승인 &amp;rarr; 신뢰할 수 있는 반복 작업에 최적&lt;/li&gt;
&lt;li&gt;&lt;b&gt;YOLO Mode&lt;/b&gt; (--dangerously-skip-permissions): 완전 자율 &amp;rarr; 컨테이너 환경에서만 사용&lt;/li&gt;
&lt;li&gt;복잡한 작업은 Plan Mode로 시작하고, 계획 확정 후 실행하세요&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;세 가지 Permission Mode&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code는 Shift+Tab을 누를 때마다 다음 모드로 순환합니다:&lt;/p&gt;
&lt;pre class=&quot;mathematica&quot;&gt;&lt;code&gt;Normal Mode &amp;rarr; Auto-Accept Mode &amp;rarr; Plan Mode &amp;rarr; Normal Mode &amp;rarr; ...
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Pressing shift+tab cycles through Claude Code's permission modes: normal-mode, auto-accept edit on, and plan mode on.&quot; &amp;mdash; &lt;a href=&quot;https://claudelog.com/mechanics/auto-accept-permissions/&quot;&gt;ClaudeLog: Auto-Accept Permissions&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모드 표시 특징&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Normal Mode&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;Auto-Accept Mode&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;⏵⏵ accept edits on&lt;/td&gt;
&lt;td&gt;파일 수정, 명령 실행 자동 승인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Plan Mode&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;⏸ plan mode on&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;Plan Mode: 생각 먼저, 실행은 나중에&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;공식 정의&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Plan Mode instructs Claude to create a plan by analyzing the codebase with read-only operations, perfect for &lt;b&gt;exploring codebases, planning complex changes, or reviewing code safely&lt;/b&gt;.&quot; &amp;mdash; &lt;a href=&quot;https://docs.anthropic.com/en/docs/claude-code/common-workflows&quot;&gt;Anthropic Docs: Common Workflows&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;Plan Mode에서 Claude가 사용할 수 있는 도구:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;허용됨 (읽기 전용) 차단됨 (수정)&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Read, LS, Glob, Grep&lt;/td&gt;
&lt;td&gt;Edit, MultiEdit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WebSearch, WebFetch&lt;/td&gt;
&lt;td&gt;Bash (수정 명령)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Task (리서치 에이전트)&lt;/td&gt;
&lt;td&gt;Write&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NotebookRead&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;실제 사용법&lt;/h3&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# 방법 1: 세션 중 활성화
Shift+Tab 두 번 누르기

# 방법 2: 시작할 때 활성화
claude --permission-mode plan

# 방법 3: 헤드리스 쿼리
claude -p &quot;인증 시스템 리팩토링 계획 세워줘&quot; --permission-mode plan
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;왜 게임체인저인가?&lt;/h3&gt;
&lt;pre class=&quot;coq&quot;&gt;&lt;code&gt;일반 모드:
&quot;이커머스 사이트 만들어줘&quot; 
&amp;rarr; Claude가 바로 코드 작성 시작 
&amp;rarr; 방향이 틀려도 끝까지 감 
&amp;rarr; 롤백하고 처음부터 다시

Plan Mode:
&quot;이커머스 사이트 만들어줘&quot;
&amp;rarr; Claude가 전체 계획 제시
&amp;rarr; 각 단계 검토 및 수정
&amp;rarr; 승인 후 실행
&amp;rarr; 방향 수정이 쉬움
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Plan Mode forces Claude to generate a full step-by-step plan before touching any code.&quot; &amp;mdash; &lt;a href=&quot;https://towardsdev.com/mastering-plan-mode-in-claude-code-the-ai-workflow-every-developer-should-use-879a12998865&quot;&gt;Towards Dev: Mastering Plan Mode&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&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;다중 파일 수정&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;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Auto-Accept Mode: 빠른 실행&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;공식 정의&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Auto-accept mode eliminates permission prompts for configured tools, enabling uninterrupted execution.&quot; &amp;mdash; &lt;a href=&quot;https://claudefa.st/blog/guide/development/permission-management&quot;&gt;Claude Fast: Permission Management&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;Shift+Tab 한 번 누르면 활성화됩니다. 화면 하단에 ⏵⏵ accept edits on이 표시됩니다.&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;/li&gt;
&lt;li&gt;허용된 Bash 명령 자동 실행&lt;/li&gt;
&lt;li&gt;허용 목록은 settings.json에서 설정 가능&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;테스트 실행&lt;/b&gt;: npm test, pytest 등&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;Plan Mode 이후 실행 단계&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주의사항&lt;/h3&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;⚠️ Auto-Accept &amp;ne; YOLO Mode

Auto-Accept는 허용 목록에 있는 도구만 자동 승인합니다.
위험한 명령(rm -rf, curl 등)은 여전히 승인이 필요합니다.
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;YOLO Mode: 완전한 자율 (위험)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;공식 정의&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Instead of supervising Claude, you can use claude --dangerously-skip-permissions to bypass all permission checks and let Claude work uninterrupted until completion.&quot; &amp;mdash; &lt;a href=&quot;https://www.anthropic.com/engineering/claude-code-best-practices&quot;&gt;Anthropic Engineering Blog: Best Practices&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;작동 방식&lt;/h3&gt;
&lt;pre class=&quot;ada&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;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;모든 Bash 명령 실행&lt;/li&gt;
&lt;li&gt;네트워크 요청&lt;/li&gt;
&lt;li&gt;시스템 프로세스 제어&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;공식 경고&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Letting Claude run arbitrary commands is &lt;b&gt;risky and can result in data loss, system corruption, or even data exfiltration&lt;/b&gt; (for example via prompt injection attacks).&quot; &amp;mdash; Anthropic Engineering Blog&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;Anthropic이 권장하는 YOLO Mode 사용 조건:&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;컨테이너/VM 환경&lt;/b&gt;: Docker, 가상머신 내에서만 실행&lt;/li&gt;
&lt;li&gt;&lt;b&gt;인터넷 차단&lt;/b&gt;: 데이터 유출 방지&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Git 백업&lt;/b&gt;: 언제든 git reset --hard로 복구 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;명확한 범위&lt;/b&gt;: &quot;코드베이스 전체 개선&quot; ❌ &amp;rarr; &quot;이 모듈 리팩토링&quot; ✅&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;# 권장 사용 예시
docker run -it --rm \
  -v $(PWD):/workspace \
  claude-sandbox \
  claude --dangerously-skip-permissions
&lt;/code&gt;&lt;/pre&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;대량 린트 수정&lt;/b&gt;: 수백 개의 lint 오류 일괄 수정&lt;/li&gt;
&lt;li&gt;&lt;b&gt;보일러플레이트 생성&lt;/b&gt;: 프로젝트 초기 세팅&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CI/CD 파이프라인&lt;/b&gt;: 자동화된 환경&lt;/li&gt;
&lt;li&gt;&lt;b&gt;테스트 주도 개발&lt;/b&gt;: 실패하는 테스트 &amp;rarr; 통과할 때까지 반복&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;This works well for workflows like &lt;b&gt;fixing lint errors or generating boilerplate code&lt;/b&gt;.&quot; &amp;mdash; Anthropic Engineering Blog&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;p data-ke-size=&quot;size16&quot;&gt;측면 Normal Auto-Accept Plan Mode YOLO&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&gt;&lt;b&gt;속도&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;느림&lt;/td&gt;
&lt;td&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;안전성&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;높음&lt;/td&gt;
&lt;td&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;제어력&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;높음&lt;/td&gt;
&lt;td&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;활성화&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;기본&lt;/td&gt;
&lt;td&gt;Shift+Tab&amp;times;1&lt;/td&gt;
&lt;td&gt;Shift+Tab&amp;times;2&lt;/td&gt;
&lt;td&gt;CLI 플래그&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;td&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;실전 워크플로우: Plan &amp;rarr; Execute 패턴&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복잡한 기능을 구현할 때 가장 효과적인 패턴입니다:&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1단계: Plan Mode로 계획&lt;/h3&gt;
&lt;pre class=&quot;ldif&quot;&gt;&lt;code&gt;[Shift+Tab 두 번 &amp;rarr; Plan Mode 활성화]

You: 결제 시스템을 Stripe에서 Toss Payments로 마이그레이션해줘

Claude: 마이그레이션 계획을 세우겠습니다.

## 1단계: 현재 구조 분석
- src/payment/stripe.ts 분석
- API 호출 패턴 파악
- 테스트 커버리지 확인

## 2단계: Toss Payments SDK 설정
- 패키지 설치
- 환경 변수 설정
- 타입 정의

## 3단계: 결제 로직 교체
...

이 계획으로 진행할까요?
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2단계: 계획 검토 및 수정&lt;/h3&gt;
&lt;pre class=&quot;erlang&quot;&gt;&lt;code&gt;You: 2단계에서 타입 정의는 별도 파일로 분리해줘.
     그리고 기존 Stripe 코드는 삭제하지 말고 deprecated 처리해줘.

Claude: 계획을 수정했습니다.
...
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3단계: 승인 후 실행&lt;/h3&gt;
&lt;pre class=&quot;http&quot;&gt;&lt;code&gt;You: 좋아, 진행해줘

[Plan Mode 종료 &amp;rarr; 실행 시작]
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;The structured plan explains the approach, technical decisions, and potential challenges in writing, which is valuable documentation.&quot; &amp;mdash; &lt;a href=&quot;https://claude-ai.chat/blog/plan-mode-in-claude-code-when-to-use-it/&quot;&gt;Claude AI: Plan Mode Guide&lt;/a&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;pre class=&quot;yaml&quot;&gt;&lt;code&gt;작업이 복잡하고 여러 파일에 걸쳐 있나요?
├─ Yes &amp;rarr; Plan Mode로 시작
│         └─ 계획 확정 후 &amp;rarr; Auto-Accept로 실행
│
└─ No &amp;rarr; 작업이 반복적이고 안전한가요?
         ├─ Yes &amp;rarr; Auto-Accept Mode
         │
         └─ No &amp;rarr; 작업이 완전히 격리된 환경인가요?
                  ├─ Yes &amp;rarr; YOLO Mode (Docker 내에서)
                  │
                  └─ No &amp;rarr; Normal Mode
&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;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Plan Mode 사용 전&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;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Auto-Accept 사용 전&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;[ ] 허용 목록(settings.json)을 확인했는가?&lt;/li&gt;
&lt;li&gt;[ ] Git 상태가 clean인가?&lt;/li&gt;
&lt;li&gt;[ ] 작업 범위가 명확한가?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;YOLO Mode 사용 전&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;[ ] 컨테이너/VM 환경인가?&lt;/li&gt;
&lt;li&gt;[ ] 인터넷이 차단되어 있는가?&lt;/li&gt;
&lt;li&gt;[ ] Git으로 현재 상태를 백업했는가?&lt;/li&gt;
&lt;li&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;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Permission Mode는 &quot;안전 vs 속도&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;Plan Mode&lt;/b&gt;는 &quot;생각 먼저, 실행 나중에&quot; 원칙을 강제합니다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Auto-Accept&lt;/b&gt;는 신뢰할 수 있는 반복 작업을 가속화합니다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;YOLO Mode&lt;/b&gt;는 완전한 자동화를 제공하지만, 격리 환경에서만 사용하세요&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복잡한 작업일수록 &lt;b&gt;Plan Mode로 시작&lt;/b&gt;하세요. 계획을 세우는 데 드는 시간이 잘못된 방향으로 가서 롤백하는 시간보다 훨씬 짧습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고 자료&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Anthropic 공식&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;a href=&quot;https://www.anthropic.com/engineering/claude-code-best-practices&quot;&gt;Claude Code Best Practices&lt;/a&gt; &amp;mdash; Anthropic Engineering Blog&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.anthropic.com/en/docs/claude-code/common-workflows&quot;&gt;Common Workflows (Plan Mode)&lt;/a&gt; &amp;mdash; Anthropic Docs&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://claudelog.com/mechanics/auto-accept-permissions/&quot;&gt;Auto-Accept Permissions&lt;/a&gt; &amp;mdash; ClaudeLog&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://claudelog.com/mechanics/dangerous-skip-permissions/&quot;&gt;Dangerous Skip Permissions&lt;/a&gt; &amp;mdash; ClaudeLog&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://claude-ai.chat/blog/plan-mode-in-claude-code-when-to-use-it/&quot;&gt;Plan Mode in Claude Code&lt;/a&gt; &amp;mdash; Claude AI Blog&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://claudefa.st/blog/guide/development/permission-management&quot;&gt;Permission Management&lt;/a&gt; &amp;mdash; Claude Fast&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programmer/AI</category>
      <category>AI 코딩</category>
      <category>Anthropic</category>
      <category>Auto-Accept</category>
      <category>claude code</category>
      <category>permission mode</category>
      <category>Plan Mode</category>
      <category>YOLO Mode</category>
      <category>개발 생산성</category>
      <category>개발 워크플로우</category>
      <category>에이전틱 코딩</category>
      <author>MoreLean</author>
      <guid isPermaLink="true">https://judekim.tistory.com/165</guid>
      <comments>https://judekim.tistory.com/165#entry165comment</comments>
      <pubDate>Tue, 20 Jan 2026 23:37:08 +0900</pubDate>
    </item>
    <item>
      <title>Claude Code는 시니어가 아니라 &amp;quot;똑똑한 주니어&amp;quot;다</title>
      <link>https://judekim.tistory.com/164</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code를 처음 쓰면 기대가 큽니다. &quot;AI니까 알아서 다 해주겠지?&quot; 하지만 막상 써보면 결과물이 들쭉날쭉합니다. 어떤 때는 놀랍도록 잘하고, 어떤 때는 엉뚱한 방향으로 갑니다. 왜 그럴까요? 대부분 &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;TL;DR&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Claude Code를 시니어 개발자가 아닌 &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;/li&gt;
&lt;li&gt;Anthropic도 공식적으로 &lt;b&gt;Plan Mode&lt;/b&gt;와 &lt;b&gt;작업 분할&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;&quot;똑똑한 주니어&quot; 비유의 출처&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 비유는 Claude Code를 효과적으로 사용하는 개발자들 사이에서 널리 공유되는 멘탈 모델입니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Claude Code operates as what Anthropic engineers call a &lt;b&gt;'fast intern with perfect memory.'&lt;/b&gt; This mental model is crucial for effective prompting.&quot; &amp;mdash; &lt;a href=&quot;https://developertoolkit.ai/en/claude-code/productivity-patterns/prompt-engineering/&quot;&gt;Developer Toolkit&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;It's like having a really enthusiastic junior developer who's confident about everything but actually knows nothing about the codebase or business goals.&quot; &amp;mdash; Scott Spence, &lt;a href=&quot;https://scottspence.com/posts/working-with-claude-code-the-honest-version&quot;&gt;Working with Claude Code&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;The biggest mistake I made initially was being too polite or vague. To get the most out of Claude Code, you need to be &lt;b&gt;direct and specific, as if you're managing a junior developer&lt;/b&gt;.&quot; &amp;mdash; &lt;a href=&quot;https://skywork.ai/blog/review-guide-claude-code-2-0/&quot;&gt;Skywork AI&lt;/a&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;시니어 vs 주니어: 지시 방식의 차이&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시니어 개발자에게 요청할 때&lt;/h3&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;&quot;인증 기능 만들어줘&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시니어는 이 한 마디로 알아서 합니다. 로그인/회원가입 폼, 비밀번호 해싱, JWT 발급, 리프레시 토큰, 세션 관리, 보안 고려사항까지 경험에서 우러나온 판단으로 구현합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주니어 개발자에게 요청할 때&lt;/h3&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;&quot;인증 기능 만들어줘&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주니어는 어디서부터 시작해야 할지 막막해합니다. 또는 자기 나름대로 해석해서 예상과 다른 결과물을 내놓습니다. 그래서 이렇게 쪼개서 말해줘야 합니다:&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;1. 먼저 로그인 폼 UI 만들어줘
2. 이메일/비밀번호 유효성 검사 추가해줘
3. 로그인 API 엔드포인트 만들어줘
4. bcrypt로 비밀번호 검증 로직 넣어줘
5. JWT 액세스 토큰 생성해줘
6. 리프레시 토큰 구현해줘
7. 토큰 갱신 엔드포인트 만들어줘
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Claude Code도 똑같습니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;왜 이런 차이가 발생하나?&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 컨텍스트의 한계&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code는 대화 내용과 코드베이스를 참조하지만, **당신의 머릿속에 있는 &quot;당연한 것들&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;/li&gt;
&lt;li&gt;이 프로젝트의 아키텍처 결정 배경&lt;/li&gt;
&lt;li&gt;비즈니스 요구사항의 뉘앙스&lt;/li&gt;
&lt;li&gt;&quot;인증&quot;이라고 했을 때 당신이 기대하는 구체적 범위&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 모호함 &amp;rarr; 자의적 해석&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추상적인 지시를 받으면 Claude Code는 나름대로 해석합니다. 그 해석이 당신의 의도와 일치할 수도 있고, 완전히 다를 수도 있습니다. 운에 맡기는 셈이죠.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 큰 작업 = 실수 누적&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;Anthropic 공식 권장사항&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 단순히 &quot;커뮤니티 팁&quot;이 아닙니다. &lt;b&gt;Anthropic이 공식 문서에서 권장하는 방식&lt;/b&gt;입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;공식 블로그: 큰 작업은 쪼개라&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;For large tasks with multiple steps or requiring exhaustive solutions&amp;mdash;like code migrations, fixing numerous lint errors, or running complex build scripts&amp;mdash;improve performance by having Claude use a &lt;b&gt;Markdown file (or even a GitHub issue!) as a checklist and working scratchpad&lt;/b&gt;.&quot; &amp;mdash; &lt;a href=&quot;https://www.anthropic.com/engineering/claude-code-best-practices&quot;&gt;Anthropic Engineering Blog: Claude Code Best Practices&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;공식 기능: Plan Mode&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Anthropic은 이 워크플로우를 공식 기능으로 제공합니다. &lt;b&gt;Plan Mode&lt;/b&gt;는 Claude가 코드를 수정하기 전에 먼저 계획을 세우도록 강제하는 모드입니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Plan Mode instructs Claude to create a plan by analyzing the codebase with read-only operations, perfect for exploring codebases, planning complex changes, or reviewing code safely.&quot; &amp;mdash; &lt;a href=&quot;https://docs.anthropic.com/en/docs/claude-code/common-workflows&quot;&gt;Anthropic Docs: Common Workflows&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Plan Mode 사용법:&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;Shift+Tab 두 번 눌러서 활성화&lt;/li&gt;
&lt;li&gt;또는 claude --permission-mode plan으로 시작&lt;/li&gt;
&lt;li&gt;Claude가 계획을 제시하면 검토 후 승인&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;공식 권장: &quot;think&quot; 키워드&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Ask Claude to make a plan for how to approach a specific problem. We recommend using the word &lt;b&gt;'think'&lt;/b&gt; to trigger extended thinking mode, which gives Claude additional computation time to evaluate alternatives more thoroughly.&quot; &amp;mdash; Anthropic Engineering Blog&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키워드 사고 깊이&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;think&lt;/td&gt;
&lt;td&gt;기본&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;think hard&lt;/td&gt;
&lt;td&gt;중간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;think harder&lt;/td&gt;
&lt;td&gt;깊음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ultrathink&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;실전 예시: 좋은 지시 vs 나쁜 지시&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 나쁜 예시&lt;/h3&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;사용자 대시보드 페이지 만들어줘
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code가 해석할 수 있는 방향이 수십 가지입니다. 어떤 데이터를 보여줄지, 레이아웃은 어떻게 할지, 차트가 필요한지, 필터링은... 결과물이 마음에 안 들 확률이 높습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 좋은 예시&lt;/h3&gt;
&lt;pre class=&quot;ldif&quot;&gt;&lt;code&gt;사용자 대시보드 페이지를 만들건데, 단계별로 진행하자.

1단계: 먼저 대시보드 레이아웃 컴포넌트를 만들어줘
- 왼쪽 사이드바 (240px 고정)
- 상단 헤더 (사용자 이름, 로그아웃 버튼)
- 메인 컨텐츠 영역
- Tailwind CSS 사용
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1단계 결과물 확인 후:&lt;/p&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;좋아. 2단계로 메인 영역에 통계 카드 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;작업 쪼개기 프레임워크&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복잡한 기능을 요청할 때 이 순서로 쪼개보세요:&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 데이터 구조 먼저&lt;/h3&gt;
&lt;pre class=&quot;crystal&quot;&gt;&lt;code&gt;결제 기능을 만들건데, 먼저 필요한 DB 스키마부터 정의해줘.
- payments 테이블
- payment_methods 테이블
- 필요한 enum 타입들
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. API 엔드포인트&lt;/h3&gt;
&lt;pre class=&quot;haml&quot;&gt;&lt;code&gt;이 스키마 기반으로 결제 관련 API 엔드포인트 만들어줘.
- POST /payments (결제 생성)
- GET /payments/:id (결제 조회)
- POST /payments/:id/refund (환불)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 비즈니스 로직&lt;/h3&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;결제 생성 로직에서 다음 검증 추가해줘:
- 재고 확인
- 사용자 잔액 확인
- 중복 결제 방지
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. UI 컴포넌트&lt;/h3&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;결제 폼 컴포넌트 만들어줘.
- 카드 번호, 유효기간, CVC 입력
- 실시간 유효성 검사
- 로딩 상태 처리
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 통합 및 에러 처리&lt;/h3&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;결제 폼과 API를 연결하고, 에러 케이스 처리해줘.
- 카드 거절
- 네트워크 오류
- 타임아웃
&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;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예시를 보여줘라&lt;/h3&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;이런 형태로 응답 만들어줘:
{
  &quot;success&quot;: true,
  &quot;data&quot;: { ... },
  &quot;error&quot;: null
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;제약 조건을 명시해라&lt;/h3&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;- 외부 라이브러리 쓰지 마
- 파일 하나에 200줄 넘기지 마
- 기존 UserService 클래스 패턴 따라가줘
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;확인 질문을 유도해라&lt;/h3&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;시작하기 전에 불명확한 부분 있으면 먼저 물어봐
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;중간 점검을 해라&lt;/h3&gt;
&lt;pre class=&quot;erlang&quot;&gt;&lt;code&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;/h2&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;li&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;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code는 분명 강력합니다. 하지만 그 능력을 제대로 끌어내려면 &lt;b&gt;지시하는 방식&lt;/b&gt;을 바꿔야 합니다. &quot;AI니까 알아서 하겠지&quot;가 아니라 &quot;똑똑한 주니어니까 명확하게 쪼개서 시키자&quot;로요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음엔 번거롭게 느껴질 수 있습니다. 하지만 몇 번 해보면 오히려 &lt;b&gt;전체 작업 시간이 줄어듭니다&lt;/b&gt;. 모호한 지시 &amp;rarr; 엉뚱한 결과 &amp;rarr; 수정 요청 &amp;rarr; 또 수정... 이 루프를 도는 것보다 처음부터 명확하게 쪼개는 게 훨씬 빠릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code를 잘 쓰는 사람과 못 쓰는 사람의 차이는 프롬프트 스킬이 아닙니다. &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;참고 자료&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Anthropic 공식&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;a href=&quot;https://www.anthropic.com/engineering/claude-code-best-practices&quot;&gt;Claude Code Best Practices&lt;/a&gt; &amp;mdash; Anthropic Engineering Blog&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.anthropic.com/en/docs/claude-code/common-workflows&quot;&gt;Common Workflows (Plan Mode)&lt;/a&gt; &amp;mdash; Anthropic Docs&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://agenticcoding.substack.com/p/32-claude-code-tips-from-basics-to&quot;&gt;32 Claude Code Tips&lt;/a&gt; &amp;mdash; YK (ykdojo)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/design-bootcamp/claude-code-as-a-junior-engineer-and-thoughts-on-the-future-of-software-engineering-5990b90eb79b&quot;&gt;Claude Code as a Junior Engineer&lt;/a&gt; &amp;mdash; Josh Roy&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developertoolkit.ai/en/claude-code/productivity-patterns/prompt-engineering/&quot;&gt;Prompt Engineering with Claude Code&lt;/a&gt; &amp;mdash; Developer Toolkit&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programmer/AI</category>
      <category>AI 코딩</category>
      <category>Anthropic</category>
      <category>claude code</category>
      <category>Plan Mode</category>
      <category>개발 생산성</category>
      <category>개발 팁</category>
      <category>업무 효율화</category>
      <category>에이전틱 코딩</category>
      <category>프롬프트 엔지니어링</category>
      <author>MoreLean</author>
      <guid isPermaLink="true">https://judekim.tistory.com/164</guid>
      <comments>https://judekim.tistory.com/164#entry164comment</comments>
      <pubDate>Tue, 20 Jan 2026 23:31:22 +0900</pubDate>
    </item>
    <item>
      <title>Claude Code가 느려졌다면? MCP 도구 관리가 답이다</title>
      <link>https://judekim.tistory.com/163</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code를 쓰다 보면 어느 순간 응답이 느려지고, 엉뚱한 도구를 선택하는 경험을 하게 됩니다. MCP 서버를 여러 개 연결해서 &quot;만능 에이전트&quot;를 만들었는데, 오히려 성능이 떨어진 것 같은 느낌. 이 글에서는 왜 이런 일이 발생하는지, 그리고 어떻게 최적화할 수 있는지 정리합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;TL;DR&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MCP 도구는 매 요청마다 컨텍스트 윈도우를 차지합니다&lt;/li&gt;
&lt;li&gt;도구가 많으면 느려지는 게 아니라 &lt;b&gt;정확도도 떨어집니다&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;프로젝트별로 필요한 MCP만 활성화하세요&lt;/li&gt;
&lt;li&gt;/doctor와 /context 명령으로 현재 상태를 점검하세요&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제: &quot;도구가 많으면 좋은 거 아닌가요?&quot;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GitHub MCP, Notion MCP, PostgreSQL MCP, Slack MCP... 연결할 수 있는 건 다 연결해두면 편할 것 같죠? 실제로는 정반대입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 개발자의 사례를 보면, MCP 도구들이 대화 시작 전에 이미 **82,000 토큰(전체의 41%)**을 차지했습니다. 200K 토큰 윈도우 중 143K(72%)가 이미 사용되어 **자유 공간이 5.8%**밖에 남지 않았어요. 코드 한 줄 보여주기도 전에 말이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 극단적인 사례도 있습니다. MCP_DOCKER 하나만으로 135개 도구, &lt;b&gt;125,964 토큰&lt;/b&gt;을 소비한 경우도 보고되었습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;왜 이런 일이 발생하나?&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 컨텍스트 윈도우의 구조&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code가 작업할 때 컨텍스트 윈도우는 대략 이렇게 나뉩니다:&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;┌─────────────────────────────────────────────────────┐
│  Claude의 컨텍스트 윈도우 (200K 토큰)                │
├─────────────────────────────────────────────────────┤
│  시스템 프롬프트: ~3K                                │
│  시스템 도구: ~12K                                   │
│  MCP 도구 정의: ???  &amp;larr; 여기가 변수                   │
│  예약 공간: ~45K (autocompact + 출력)                │
│  실제 대화/코드: 남은 공간                           │
└─────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MCP 도구는 &lt;b&gt;매 요청마다&lt;/b&gt; 전체 정의(이름, 설명, 파라미터 스키마)가 컨텍스트에 포함됩니다. 도구 하나당 수백~수천 토큰이 &quot;고정 비용&quot;으로 빠져나갑니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 도구 선택의 인지 부하&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude가 응답할 때 내부적으로 이런 과정을 거칩니다:&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;b&gt;사용 가능한 모든 도구 검토&lt;/b&gt; &amp;larr; 여기서 도구가 많으면 복잡해짐&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;비슷한 기능의 도구가 여러 개 있으면 &quot;파일 읽기를 read_file로 할까, view로 할까, cat으로 할까?&quot; 같은 판단이 필요해지고, &lt;b&gt;잘못된 선택 확률도 올라갑니다.&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 실제 정확도 하락 데이터&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Anthropic 내부 테스트 결과, 대규모 도구 라이브러리에서 도구 수를 최적화하면:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델 최적화 전 최적화 후&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Opus 4&lt;/td&gt;
&lt;td&gt;49%&lt;/td&gt;
&lt;td&gt;74%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opus 4.5&lt;/td&gt;
&lt;td&gt;79.5%&lt;/td&gt;
&lt;td&gt;88.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도구가 많으면 Claude가 &lt;b&gt;잘못된 도구를 선택할 확률이 거의 2배&lt;/b&gt; 높아집니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결책 1: 수동 최적화&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 원칙&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;✅ MCP 서버: 20~30개 설정해두되, 동시 활성화는 10개 미만
✅ 전체 도구 수: 80개 이하 유지
✅ 프로젝트별로 필요한 MCP만 켜기
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;현재 상태 점검하기&lt;/h3&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# 컨텍스트 사용량 확인
/context

# MCP 서버별 토큰 사용량 상세 확인
/doctor
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/doctor 출력 예시:&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Context Usage Warnings
└ ⚠️ Large MCP tools context (~81,986 tokens &amp;gt; 25,000)
└ MCP servers:
    └ mcp-omnisearch: 20 tools (~14,114 tokens)
    └ playwright: 21 tools (~13,647 tokens)
    └ mcp-sqlite-tools: 19 tools (~13,349 tokens)
    ...
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MCP 토글 도구 활용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트마다 필요한 MCP를 켜고 끄는 게 번거롭다면, McPick 같은 CLI 도구를 활용할 수 있습니다:&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;npx mcpick

# 대화형으로 MCP 서버 켜기/끄기
? Select MCP servers to enable/disable:
◉ mcp-omnisearch (enabled)
◯ playwright (disabled)
◉ sequential-thinking (enabled)
&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: Tool Search 활용 (2026년 1월~)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Anthropic이 이 문제를 인식하고 &lt;b&gt;MCP Tool Search&lt;/b&gt; 기능을 출시했습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Tool Search란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 도구 정의를 미리 로드하는 대신, Claude가 필요할 때만 도구를 &lt;b&gt;동적으로 검색하고 로드&lt;/b&gt;합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;효과&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지표 기존 방식 Tool Search&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&gt;토큰 사용량 (50+ 도구)&lt;/td&gt;
&lt;td&gt;~77K&lt;/td&gt;
&lt;td&gt;~8.7K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;절감률&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;&lt;b&gt;85%&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;자유 컨텍스트&lt;/td&gt;
&lt;td&gt;5.8%&lt;/td&gt;
&lt;td&gt;44%+&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Claude Code가 MCP 도구 정의가 전체 컨텍스트의 ~10%를 넘는지 확인&lt;/li&gt;
&lt;li&gt;임계값을 넘으면 도구를 defer_loading: true로 마킹&lt;/li&gt;
&lt;li&gt;실제 필요할 때만 해당 도구 정의를 로드&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;설정 방법&lt;/h3&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;# 환경 변수로 제어
ENABLE_TOOL_SEARCH=true  # 강제 활성화
ENABLE_TOOL_SEARCH=false # 비활성화
# 미설정 시 auto 모드 (임계값 기반 자동 활성화)
&lt;/code&gt;&lt;/pre&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;Sonnet 4 이상, Opus 4 이상에서만 지원&lt;/li&gt;
&lt;li&gt;Haiku 모델은 Tool Search 미지원&lt;/li&gt;
&lt;li&gt;자주 쓰는 도구는 defer_loading: false로 미리 로드해두는 게 효율적&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;프로젝트별 MCP 구성 예시&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MCP 설정 파일 위치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code의 MCP 설정은 **scope(범위)**에 따라 다른 파일에 저장됩니다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Scope 파일 위치 용도&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&gt;&lt;b&gt;User&lt;/b&gt; (전역)&lt;/td&gt;
&lt;td&gt;~/.claude.json&lt;/td&gt;
&lt;td&gt;모든 프로젝트에서 사용하는 개인 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Project&lt;/b&gt; (프로젝트 공유)&lt;/td&gt;
&lt;td&gt;프로젝트루트/.mcp.json&lt;/td&gt;
&lt;td&gt;팀과 공유할 프로젝트별 설정 (Git에 커밋)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Local&lt;/b&gt; (프로젝트 개인)&lt;/td&gt;
&lt;td&gt;프로젝트루트/.claude/settings.local.json&lt;/td&gt;
&lt;td&gt;개인용 프로젝트 설정 (Git 제외)&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;팁&lt;/b&gt;: CLI로 MCP를 추가할 때 --scope 플래그로 저장 위치를 지정할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 전역 설정에 추가
claude mcp add github --scope user  -- npx -y @modelcontextprotocol/server-github

# 프로젝트 설정에 추가 (팀 공유용)
claude mcp add github -s project -- npx -y @modelcontextprotocol/server-github&lt;/code&gt;&lt;/pre&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;&lt;b&gt;파일&lt;/b&gt;: 프로젝트루트/.mcp.json&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;mcpServers&quot;: {
    &quot;github&quot;: {
      &quot;command&quot;: &quot;npx&quot;,
      &quot;args&quot;: [&quot;-y&quot;, &quot;@modelcontextprotocol/server-github&quot;],
      &quot;env&quot;: {
        &quot;GITHUB_PERSONAL_ACCESS_TOKEN&quot;: &quot;${GITHUB_PAT}&quot;
      }
    },
    &quot;playwright&quot;: {
      &quot;command&quot;: &quot;npx&quot;,
      &quot;args&quot;: [&quot;-y&quot;, &quot;@anthropic/mcp-playwright&quot;]
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용하지 않는 MCP는 아예 파일에서 제외하거나, McPick 같은 도구로 토글하세요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;데이터 분석 프로젝트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파일&lt;/b&gt;: 프로젝트루트/.mcp.json&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;mcpServers&quot;: {
    &quot;postgresql&quot;: {
      &quot;command&quot;: &quot;npx&quot;,
      &quot;args&quot;: [&quot;-y&quot;, &quot;@modelcontextprotocol/server-postgres&quot;],
      &quot;env&quot;: {
        &quot;DATABASE_URL&quot;: &quot;${DATABASE_URL}&quot;
      }
    },
    &quot;sqlite&quot;: {
      &quot;command&quot;: &quot;npx&quot;,
      &quot;args&quot;: [&quot;-y&quot;, &quot;mcp-sqlite-tools&quot;]
    }
  }
}
&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;b&gt;파일&lt;/b&gt;: ~/.claude.json (전역 설정으로 관리하면 편리)&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;mcpServers&quot;: {
    &quot;notion&quot;: {
      &quot;command&quot;: &quot;npx&quot;,
      &quot;args&quot;: [&quot;-y&quot;, &quot;notion-mcp-server&quot;],
      &quot;env&quot;: {
        &quot;NOTION_API_KEY&quot;: &quot;${NOTION_API_KEY}&quot;
      }
    },
    &quot;gdrive&quot;: {
      &quot;command&quot;: &quot;npx&quot;,
      &quot;args&quot;: [&quot;-y&quot;, &quot;@anthropic/mcp-gdrive&quot;]
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;설정 확인 명령어&lt;/h3&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# 현재 연결된 MCP 서버 상태 확인
/mcp

# 출력 예시:
# MCP Server Status
# &amp;bull; github: connected
# &amp;bull; postgresql: connected
# &amp;bull; notion: disconnected
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;체크리스트: Claude Code 최적화&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[ ] /doctor로 MCP 토큰 사용량 확인&lt;/li&gt;
&lt;li&gt;[ ] 25,000 토큰 넘으면 경고 &amp;mdash; 불필요한 MCP 비활성화&lt;/li&gt;
&lt;li&gt;[ ] 프로젝트별 .claude.json 설정 분리&lt;/li&gt;
&lt;li&gt;[ ] Tool Search 지원 모델 사용 시 auto 모드 활용&lt;/li&gt;
&lt;li&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;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;도구가 많을수록 좋다&quot;는 직관과 달리, AI 에이전트에서는 &lt;b&gt;적절한 도구 수 관리&lt;/b&gt;가 성능의 핵심입니다. 컨텍스트 윈도우는 유한한 자원이고, 도구 정의도 그 자원을 소비합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tool Search 기능이 나오면서 제약이 많이 완화되었지만, 여전히 프로젝트별로 필요한 MCP만 활성화하는 습관은 유효합니다. 더 빠른 응답, 더 정확한 도구 선택, 더 넓은 작업 공간을 원한다면 지금 바로 /doctor를 실행해보세요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 자료&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.anthropic.com/engineering/claude-code-best-practices&quot;&gt;Anthropic Engineering: Claude Code Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.anthropic.com/engineering/advanced-tool-use&quot;&gt;Anthropic Engineering: Advanced Tool Use&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/en/mcp&quot;&gt;Claude Code Docs: MCP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Programmer/AI</category>
      <category>AI 에이전트</category>
      <category>Anthropic</category>
      <category>claude code</category>
      <category>llm 최적화</category>
      <category>mcp</category>
      <category>model context protocol</category>
      <category>Tool Search</category>
      <category>개발 도구</category>
      <category>생산성</category>
      <category>컨텍스트 윈도우</category>
      <author>MoreLean</author>
      <guid isPermaLink="true">https://judekim.tistory.com/163</guid>
      <comments>https://judekim.tistory.com/163#entry163comment</comments>
      <pubDate>Tue, 20 Jan 2026 23:25:14 +0900</pubDate>
    </item>
    <item>
      <title>테츠 카츠야 2026 하이브리드 레시피</title>
      <link>https://judekim.tistory.com/162</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;커피를 끊어야 하면서도 내리는 즐거움에 잘 안된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계속 4:6 으로 내려 마시다가, 이번에 새로 발표된 궁극의 방법이 있다고 해서 정리해봤다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 하리오 스위치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 원두 : 20g&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 분쇄도 : Timemore S3 5.0, 코만단테 C40 MK4 28&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 물온도 : 90도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 상온수 : 150g ( 70도 ~ 80도 사이를 맞추기 위함 )&lt;/p&gt;
&lt;table id=&quot;2de0981a-df93-8082-8c2f-f7df512699a5&quot; 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&gt;시간&lt;/td&gt;
&lt;td&gt;밸브상태&lt;/td&gt;
&lt;td&gt;물온도&lt;/td&gt;
&lt;td&gt;주입량(g)&lt;/td&gt;
&lt;td&gt;누적량(g)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;2de0981a-df93-800d-adc3-e9e14a5834cb&quot;&gt;
&lt;td id=&quot;Odtk&quot;&gt;0:00&lt;/td&gt;
&lt;td id=&quot;mfKm&quot;&gt;닫힘&lt;/td&gt;
&lt;td id=&quot;e\{;&quot;&gt;90도&lt;/td&gt;
&lt;td id=&quot;g?Cu&quot;&gt;40 ~ 50 ( 잠길정도 )&lt;/td&gt;
&lt;td id=&quot;w=Zq&quot;&gt;40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;2de0981a-df93-807e-8570-ecdc47ddf081&quot;&gt;
&lt;td id=&quot;Odtk&quot;&gt;0:40&lt;/td&gt;
&lt;td id=&quot;mfKm&quot;&gt;열림&lt;/td&gt;
&lt;td id=&quot;e\{;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td id=&quot;g?Cu&quot;&gt;80&lt;/td&gt;
&lt;td id=&quot;w=Zq&quot;&gt;120&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;2de0981a-df93-8067-b95f-d45242e77d27&quot;&gt;
&lt;td id=&quot;Odtk&quot;&gt;1:30&lt;/td&gt;
&lt;td id=&quot;mfKm&quot;&gt;열림&lt;/td&gt;
&lt;td id=&quot;e\{;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td id=&quot;g?Cu&quot;&gt;80&lt;/td&gt;
&lt;td id=&quot;w=Zq&quot;&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;2de0981a-df93-808b-a797-c57948240fac&quot;&gt;
&lt;td id=&quot;Odtk&quot;&gt;2:10&lt;/td&gt;
&lt;td id=&quot;mfKm&quot;&gt;닫힘&lt;/td&gt;
&lt;td id=&quot;e\{;&quot;&gt;70 ~ 80도&lt;/td&gt;
&lt;td id=&quot;g?Cu&quot;&gt;100&lt;/td&gt;
&lt;td id=&quot;w=Zq&quot;&gt;300&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;2de0981a-df93-808b-a618-e9dba3d92ce9&quot;&gt;
&lt;td id=&quot;Odtk&quot;&gt;2:45&lt;/td&gt;
&lt;td id=&quot;mfKm&quot;&gt;열림&lt;/td&gt;
&lt;td id=&quot;e\{;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td id=&quot;g?Cu&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td id=&quot;w=Zq&quot;&gt;300&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;2de0981a-df93-806e-97b8-cf5c1c62a2ba&quot;&gt;
&lt;td id=&quot;Odtk&quot;&gt;3:30내외&lt;/td&gt;
&lt;td id=&quot;mfKm&quot;&gt;열림&lt;/td&gt;
&lt;td id=&quot;e\{;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td id=&quot;g?Cu&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td id=&quot;w=Zq&quot;&gt;300&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=4FeUp_zNiiY&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=4FeUp_zNiiY&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=4FeUp_zNiiY&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/cD6nEl/hyZRc67amS/2LBi3EkV91caqKgz2rGuh1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=216_256_392_448,https://scrap.kakaocdn.net/dn/boF7yN/hyZQQWy5rR/jQDq5RljwHGWx3n1wkDInk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=216_256_392_448&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;どんなコーヒー豆も「おいしくなる」究極系レシピ、進化しました。&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/4FeUp_zNiiY&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제대로 내리기 위해서 정리해둠 -&amp;gt; 아직 제대로 마셔보지 못한 레시피&lt;/p&gt;</description>
      <category>일상</category>
      <category>드립</category>
      <category>드립레시피</category>
      <category>드립커피</category>
      <category>레시피</category>
      <category>커피</category>
      <category>테츠카츠야</category>
      <author>MoreLean</author>
      <guid isPermaLink="true">https://judekim.tistory.com/162</guid>
      <comments>https://judekim.tistory.com/162#entry162comment</comments>
      <pubDate>Sun, 4 Jan 2026 10:23:23 +0900</pubDate>
    </item>
    <item>
      <title>Auto-Claude macOS 설치 트러블슈팅 가이드</title>
      <link>https://judekim.tistory.com/161</link>
      <description>&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Auto-Claude는 자율적으로 코딩을 수행하는 멀티 에이전트 프레임워크입니다. macOS에서 DMG 파일로 설치한 후 발생할 수 있는 문제들과 해결 방법을 정리했습니다.&lt;/p&gt;
&lt;h2 id=&quot;toc_1&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;환경&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;macOS (Apple Silicon / Intel)&lt;/li&gt;
&lt;li&gt;Python 3.12+ (Homebrew로 설치)&lt;/li&gt;
&lt;li&gt;Auto-Claude 2.7.x (DMG 설치)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 id=&quot;toc_2&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;문제 1: spawn python ENOENT&lt;/h2&gt;
&lt;h3 id=&quot;toc_3&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;증상&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Context 메뉴에서 프로젝트 분석 시 다음 에러 발생:&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #f8f8f8;&quot;&gt;&lt;code&gt;Failed to load project index
spawn python ENOENT&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 id=&quot;toc_4&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;원인&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;macOS에서 Homebrew로 Python을 설치하면&lt;span&gt;&amp;nbsp;&lt;/span&gt;python3&lt;span&gt;&amp;nbsp;&lt;/span&gt;명령어만 생성되고,&lt;span&gt;&amp;nbsp;&lt;/span&gt;python&lt;span&gt;&amp;nbsp;&lt;/span&gt;명령어는 생성되지 않습니다. Auto-Claude는&lt;span&gt;&amp;nbsp;&lt;/span&gt;python&lt;span&gt;&amp;nbsp;&lt;/span&gt;명령어를 사용하기 때문에 이 문제가 발생합니다.&lt;/p&gt;
&lt;h3 id=&quot;toc_5&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;해결 방법&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1단계: Python 설치 확인&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;pre class=&quot;vim&quot; style=&quot;background-color: #f8f8f8;&quot;&gt;&lt;code&gt;python3 --version  # Python 3.x.x 출력되면 설치됨
python --version   # command not found 발생&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2단계: 심볼릭 링크 생성&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #f8f8f8;&quot;&gt;&lt;code&gt;sudo ln -s $(which python3) /usr/local/bin/python&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3단계: 링크 확인&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;pre class=&quot;properties&quot; style=&quot;background-color: #f8f8f8;&quot;&gt;&lt;code&gt;which python
# 출력: /usr/local/bin/python

python --version
# 출력: Python 3.x.x&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 id=&quot;toc_6&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;문제 2: 심볼릭 링크 생성 후에도 동일한 에러 발생&lt;/h2&gt;
&lt;h3 id=&quot;toc_7&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;증상&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;python&lt;span&gt;&amp;nbsp;&lt;/span&gt;명령어가 터미널에서는 정상 동작하지만, Auto-Claude 앱에서는 여전히&lt;span&gt;&amp;nbsp;&lt;/span&gt;spawn python ENOENT&lt;span&gt;&amp;nbsp;&lt;/span&gt;에러 발생.&lt;/p&gt;
&lt;h3 id=&quot;toc_8&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;원인&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;macOS GUI 앱은 터미널과 다른 환경에서 실행되어&lt;span&gt;&amp;nbsp;&lt;/span&gt;/usr/local/bin&lt;span&gt;&amp;nbsp;&lt;/span&gt;PATH를 인식하지 못합니다.&lt;/p&gt;
&lt;h3 id=&quot;toc_9&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;해결 방법&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;방법 A: 터미널에서 앱 실행 (권장)&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;pre class=&quot;livecodeserver&quot; style=&quot;background-color: #f8f8f8;&quot;&gt;&lt;code&gt;open -a &quot;Auto-Claude&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;blockquote style=&quot;background-color: #ffffff; color: #777777; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고: 앱 이름에 하이픈이 포함되어 있습니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;Auto Claude가 아닌&lt;span&gt;&amp;nbsp;&lt;/span&gt;Auto-Claude입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;방법 B: 시스템 PATH 영구 등록 후 재부팅&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8;&quot;&gt;&lt;code&gt;sudo launchctl config user path &quot;/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이후 Mac을 재부팅하면 Dock에서 직접 실행해도 정상 동작합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 id=&quot;toc_10&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;문제 3: ModuleNotFoundError - dotenv&lt;/h2&gt;
&lt;h3 id=&quot;toc_11&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;증상&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;태스크 실행 시 다음 에러 발생:&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;pre class=&quot;sql&quot; style=&quot;background-color: #f8f8f8;&quot;&gt;&lt;code&gt;Traceback (most recent call last):
  File &quot;.../spec_runner.py&quot;, line 85, in &amp;lt;module&amp;gt;
    from dotenv import load_dotenv
ModuleNotFoundError: No module named 'dotenv'&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 id=&quot;toc_12&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;원인&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Auto-Claude 실행에 필요한 Python 패키지가 설치되지 않았습니다.&lt;/p&gt;
&lt;h3 id=&quot;toc_13&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;해결 방법&lt;/h3&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;pre class=&quot;mel&quot; style=&quot;background-color: #f8f8f8;&quot;&gt;&lt;code&gt;pip3 install python-dotenv --break-system-packages&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;blockquote style=&quot;background-color: #ffffff; color: #777777; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--break-system-packages&lt;span&gt;&amp;nbsp;&lt;/span&gt;플래그는 macOS의 Python 환경 보호 기능(PEP 668)을 우회합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 id=&quot;toc_14&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;문제 4: externally-managed-environment 에러&lt;/h2&gt;
&lt;h3 id=&quot;toc_15&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;증상&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;pip 설치 시 다음 에러 발생:&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;pre class=&quot;subunit&quot; style=&quot;background-color: #f8f8f8;&quot;&gt;&lt;code&gt;error: externally-managed-environment
&amp;times; This environment is externally managed&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 id=&quot;toc_16&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;원인&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;macOS Sonoma부터 시스템 Python 환경을 보호하기 위해 PEP 668이 적용되었습니다.&lt;/p&gt;
&lt;h3 id=&quot;toc_17&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;해결 방법&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;모든 pip 설치 명령에&lt;span&gt;&amp;nbsp;&lt;/span&gt;--break-system-packages&lt;span&gt;&amp;nbsp;&lt;/span&gt;플래그를 추가합니다:&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;pre class=&quot;cmake&quot; style=&quot;background-color: #f8f8f8;&quot;&gt;&lt;code&gt;pip3 install &amp;lt;패키지명&amp;gt; --break-system-packages&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 id=&quot;toc_18&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;문제 5: ModuleNotFoundError - claudeagentsdk&lt;/h2&gt;
&lt;h3 id=&quot;toc_19&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;증상&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;dotenv 설치 후에도 추가 모듈 에러 발생:&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;pre class=&quot;yaml&quot; style=&quot;background-color: #f8f8f8;&quot;&gt;&lt;code&gt;ModuleNotFoundError: No module named 'claude_agent_sdk'&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 id=&quot;toc_20&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;원인&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Auto-Claude 실행에 필요한 의존성 패키지들이 추가로 필요합니다.&lt;/p&gt;
&lt;h3 id=&quot;toc_21&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;해결 방법&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;방법 A: requirements.txt로 일괄 설치 (권장)&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;pre class=&quot;sql&quot; style=&quot;background-color: #f8f8f8;&quot;&gt;&lt;code&gt;pip3 install -r /Applications/Auto-Claude.app/Contents/Resources/auto-claude/requirements.txt --break-system-packages&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;방법 B: 개별 설치&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;pre class=&quot;mel&quot; style=&quot;background-color: #f8f8f8;&quot;&gt;&lt;code&gt;pip3 install python-dotenv claude-agent-sdk --break-system-packages&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 id=&quot;toc_22&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;최종 체크리스트&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Auto-Claude를 정상적으로 실행하기 위한 체크리스트입니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[ ] Python 3.12+ 설치 확인&lt;/li&gt;
&lt;li&gt;[ ]&lt;span&gt;&amp;nbsp;&lt;/span&gt;python&lt;span&gt;&amp;nbsp;&lt;/span&gt;심볼릭 링크 생성&lt;/li&gt;
&lt;li&gt;[ ] 필요한 Python 패키지 설치&lt;/li&gt;
&lt;li&gt;[ ] 터미널에서 앱 실행 또는 시스템 PATH 등록&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;toc_23&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;한번에 설정하기&lt;/h3&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;pre class=&quot;awk&quot; style=&quot;background-color: #f8f8f8;&quot;&gt;&lt;code&gt;# 1. python 심볼릭 링크 생성
sudo ln -s $(which python3) /usr/local/bin/python

# 2. 필수 패키지 설치
pip3 install -r /Applications/Auto-Claude.app/Contents/Resources/auto-claude/requirements.txt --break-system-packages

# 3. 앱 실행
open -a &quot;Auto-Claude&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 id=&quot;toc_24&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;참고&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #4183c4;&quot; href=&quot;https://github.com/AndyMik90/Auto-Claude&quot;&gt;Auto-Claude GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #4183c4;&quot; href=&quot;https://peps.python.org/pep-0668/&quot;&gt;PEP 668 - Externally Managed Environments&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Auto-Claude는 Claude Pro/Max 구독이 필요합니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Programmer/AI</category>
      <category>AI</category>
      <category>auto-claude</category>
      <category>Claude</category>
      <category>바이브코딩</category>
      <author>MoreLean</author>
      <guid isPermaLink="true">https://judekim.tistory.com/161</guid>
      <comments>https://judekim.tistory.com/161#entry161comment</comments>
      <pubDate>Fri, 2 Jan 2026 13:19:33 +0900</pubDate>
    </item>
    <item>
      <title>커피 그라인더 사이즈 차트 사이트</title>
      <link>https://judekim.tistory.com/160</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;내가 가지고 있는 그라인더는 Timemore S3 이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 유명하고 비싼 코만단테 MK4와는 가격차이가 엄청나지만 나름 괜찮은 만듦새로 만족하면서 쓰고 있다.&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;이번에 새롭게 접한 레시피도 코만단테 MK4 기준 28 클릭이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이게 도대체 내 Timemore S3 기준으로는 몇일까?를 알아보려 했지만 정확한 사이즈를 몰라서 궁금해 하던차에 이런 사이트를 알게 되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 그라인더 브랜드 별로 사이즈 비교차트를 알려주는 사이트이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://honestcoffeeguide.com/coffee-grind-size-chart/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://honestcoffeeguide.com/coffee-grind-size-chart/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1767174315841&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Coffee Grind Size Chart | Honest Coffee Guide&quot; data-og-description=&quot;Merch Coffee Tasting Cards for Dialling-in Espresso&quot; data-og-host=&quot;honestcoffeeguide.com&quot; data-og-source-url=&quot;https://honestcoffeeguide.com/coffee-grind-size-chart/&quot; data-og-url=&quot;https://honestcoffeeguide.com/coffee-grind-size-chart/coffee-grind-size-chart/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bd8eCb/hyZPGA3iS5/PPkgH6cvbPk4elLAtk6Em1/img.png?width=1600&amp;amp;height=1600&amp;amp;face=0_0_1600_1600,https://scrap.kakaocdn.net/dn/3DPu3/hyZQ4UFViQ/MJdlae4zChIV1Bq2QdYZw0/img.jpg?width=280&amp;amp;height=280&amp;amp;face=0_0_280_280,https://scrap.kakaocdn.net/dn/YIoZM/hyZRaHm3de/nI94Pd8qrkkHDwUnk7R610/img.png?width=280&amp;amp;height=280&amp;amp;face=0_0_280_280&quot;&gt;&lt;a href=&quot;https://honestcoffeeguide.com/coffee-grind-size-chart/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://honestcoffeeguide.com/coffee-grind-size-chart/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bd8eCb/hyZPGA3iS5/PPkgH6cvbPk4elLAtk6Em1/img.png?width=1600&amp;amp;height=1600&amp;amp;face=0_0_1600_1600,https://scrap.kakaocdn.net/dn/3DPu3/hyZQ4UFViQ/MJdlae4zChIV1Bq2QdYZw0/img.jpg?width=280&amp;amp;height=280&amp;amp;face=0_0_280_280,https://scrap.kakaocdn.net/dn/YIoZM/hyZRaHm3de/nI94Pd8qrkkHDwUnk7R610/img.png?width=280&amp;amp;height=280&amp;amp;face=0_0_280_280');&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;Coffee Grind Size Chart | Honest Coffee Guide&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Merch Coffee Tasting Cards for Dialling-in Espresso&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;honestcoffeeguide.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2234&quot; data-origin-height=&quot;2156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VKhEf/dJMcabiyfv9/kWkaFpd1pet8soqIgMNfI1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VKhEf/dJMcabiyfv9/kWkaFpd1pet8soqIgMNfI1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VKhEf/dJMcabiyfv9/kWkaFpd1pet8soqIgMNfI1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVKhEf%2FdJMcabiyfv9%2FkWkaFpd1pet8soqIgMNfI1%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;2234&quot; height=&quot;2156&quot; data-origin-width=&quot;2234&quot; data-origin-height=&quot;2156&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런게 브랜드를 검색하고, 제품 모델을 선택하면 Chart를 알려준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 코만단테 기준 MK4는 28클릭은 몇일까를 찾아보니 대략 5.0 정도이네!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxvjY0/dJMcajgwW2K/GYWC7OzCbgYf3kEHw6JLlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxvjY0/dJMcajgwW2K/GYWC7OzCbgYf3kEHw6JLlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxvjY0/dJMcajgwW2K/GYWC7OzCbgYf3kEHw6JLlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxvjY0%2FdJMcajgwW2K%2FGYWC7OzCbgYf3kEHw6JLlk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&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;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dOPOV7/dJMcaaxaRMB/qfpmMMJkLJH8685rP9PKfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dOPOV7/dJMcaaxaRMB/qfpmMMJkLJH8685rP9PKfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dOPOV7/dJMcaaxaRMB/qfpmMMJkLJH8685rP9PKfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdOPOV7%2FdJMcaaxaRMB%2FqfpmMMJkLJH8685rP9PKfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&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;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4xV35/dJMcaaxaRMN/cuYV5KYwHOqZtYdqXigc4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4xV35/dJMcaaxaRMN/cuYV5KYwHOqZtYdqXigc4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4xV35/dJMcaaxaRMN/cuYV5KYwHOqZtYdqXigc4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4xV35%2FdJMcaaxaRMN%2FcuYV5KYwHOqZtYdqXigc4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사에서는 Timemore C3 ESP Pro를 쓰고 있어서 3개를 비교해뒀다. ( 이녀석은 조절하기 쉽지 않다. )&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TIP</category>
      <category>그라인더별분쇄도</category>
      <category>분쇄도</category>
      <category>커피</category>
      <category>커피그라인더</category>
      <category>커피분쇄도</category>
      <author>MoreLean</author>
      <guid isPermaLink="true">https://judekim.tistory.com/160</guid>
      <comments>https://judekim.tistory.com/160#entry160comment</comments>
      <pubDate>Wed, 31 Dec 2025 18:47:26 +0900</pubDate>
    </item>
  </channel>
</rss>