<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>오늘도 공부</title>
    <link>https://javaexpert.tistory.com/</link>
    <description>AI,Flutter,Node등 다양한 분야를 연구하는 블로그입니다</description>
    <language>ko</language>
    <pubDate>Sun, 19 Apr 2026 13:36:53 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>행복한 수지아빠</managingEditor>
    <image>
      <title>오늘도 공부</title>
      <url>https://tistory1.daumcdn.net/tistory/649446/attach/3ffb00b63198428d8082dda2b9aef56d</url>
      <link>https://javaexpert.tistory.com</link>
    </image>
    <item>
      <title>warrior 액션 장면 프롬프트 (Seedance2)</title>
      <link>https://javaexpert.tistory.com/1744</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&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=SFr54YmrkeM&quot; data-video-width=&quot;0&quot; data-video-height=&quot;0&quot; data-video-origin-width=&quot;0&quot; data-video-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;몬스터헌터월드가이드&quot; data-video-thumbnail=&quot;&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/SFr54YmrkeM&quot; width=&quot;0&quot; height=&quot;0&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;pre id=&quot;code_1776573098610&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CHARACTER REFERENCE Imagen1= warrior's face. Imagen2 = red robotic armor reference. IMAX 70mm film texture, Panavision 35mm lens, f4, handheld sway. Live-action sci-fi, 4K, shallow DOF bokeh, cold teal-blue tone, red energy sword as only warm light. Dense industrial fog. Hard cuts. SFX only, no music. Face stable, no deformation. 0-1s: CU face. Imagen1 without helmet, calm, cold blue sidelight. Camera pushes in. Red modular mechanical Imagen2Element-type full helmet (no visor) assembles around face, pieces locking precisely. Mechanical hum. 1-3s: CU hand. Right palm up, fingers spread. Red energy particles spiral inward, condensing into a sword hilt, circuit textures forming. Energy hum. 3-4s: Side CU. Hand grips hilt &amp;mdash; red blade erupts upward, particles solidifying into translucent blade. Fully armored warrior in Imagen2Element-type red suit turns forward. Explosive hum. 4-5s: Behind MS. Warrior with sword at edge of industrial platform. Six black chitinous creatures appear in fog, red eyes glowing in pairs. Camera pulls back revealing encirclement. Shrieks. 5-6s: Low angle. Warrior combat stance. Six red eye-pairs in fog. Crane frames and cables above. Boots stamp ground. Sword hum rises. 6-7s: First creature charges. Warrior meets it &amp;mdash; horizontal slash through midsection, creature flung 3m into railing, bending it. Red arc trail lingers. Camera side-tracks full sequence. Shell tear + metal impact sounds. 7-8s: Second creature from left &amp;mdash; backhand slash severs forelimb, red sparks trailing. Third attacks from right &amp;mdash; warrior spin-kicks it into the fourth, both tumble off frame. Camera orbits rapidly. Severed limb + kick impact + collision sounds. 8-9s: CU Imagen2helmet faceplate splattered with black fluid. Heavy filtered breathing. Red sword light on metallic surfaces. 9-10s: Fifth creature ambushes from behind. Warrior reverse-grips sword, thrusts backward through creature's chest, red light exits its back. Spins and flings impaled creature into the sixth. Both vanish into fog. Camera tracks fling trajectory. Piercing + screech + distant collision sounds. 10-11s: Overhead FS. Battlefield &amp;mdash; six creatures down, missing limbs, pierced. Black fluid on metal floor, bent railings. Warrior center, sword dripping red droplets. Silence. Creaking echo, droplets hissing. 11-12s: Low CU. Red armored boots stepping through black fluid, blue-red reflections. Heavy footsteps. Metal floor begins violently trembling. Warrior stops. Camera rises to helmet. Deep tremor &amp;mdash; massive footsteps approaching like earthquakes. 12-13s: Front MS. Warrior raises head. Two enormous red lights ignite in fog &amp;mdash; ten times wider than creatures' eyes. Massive black silhouette emerges, head reaching crane frames, 10x warrior's size. Sword hum rises. Camera ascends revealing Boss scale. Seismic thuds, cables rattling, structures groaning. 13-14s: ECU helmet faceplate &amp;mdash; black fluid and moisture on metallic plates. Boss reflected: massive chitinous body, four arms, pulsing dark red chest core, curved horns, burning red eyes. Camera pushes into intricate patterns. Boss steps shake platform. 14-15s: ECU helmet optical sensors. Warrior speaks one word, low, filtered through helmet speaker: &quot;ADELANTE&quot;. Spatial reverb, metallic tone. Instantly lunges into a charge. Camera rushes forward. Frame ends in sprint motion blur. &quot;Adelante&quot; with reverb, sword hum erupts to max, boots pounding, Boss roar colliding with charge.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 프롬프트 목적&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;b&gt;주인공 얼굴&lt;/b&gt;은 Imagen1&lt;/li&gt;
&lt;li&gt;&lt;b&gt;갑옷 형태&lt;/b&gt;는 Imagen2&lt;/li&gt;
&lt;li&gt;&lt;b&gt;영상 미학&lt;/b&gt;은 IMAX 70mm + Panavision 35mm lens + handheld sway&lt;/li&gt;
&lt;li&gt;&lt;b&gt;톤&lt;/b&gt;은 cold teal-blue&lt;/li&gt;
&lt;li&gt;&lt;b&gt;유일한 따뜻한 광원&lt;/b&gt;은 red energy sword&lt;/li&gt;
&lt;li&gt;&lt;b&gt;15초 안에&lt;/b&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;6마리 처치&lt;/li&gt;
&lt;li&gt;보스 공개&lt;/li&gt;
&lt;li&gt;마지막 돌진&lt;br /&gt;까지 넣는 구성입니다.&lt;/li&gt;
&lt;/ul&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;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;A. 캐릭터 참조 역할 분리가 좋음&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Imagen1 = warrior's face&lt;/li&gt;
&lt;li&gt;Imagen2 = red robotic armor reference&lt;/li&gt;
&lt;/ul&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;얼굴은 1번에서,&lt;/li&gt;
&lt;li&gt;갑옷 디자인은 2번에서&lt;br /&gt;가져오도록 유도할 수 있어서 안정성이 높아집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 표현은 조금 더 명확히 하면 좋습니다.&lt;br /&gt;지금의 Imagen2Element-type는 다소 비표준적이라 모델이 정확히 이해 못할 수 있습니다.&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;Use Imagen1 for face identity only&lt;/li&gt;
&lt;li&gt;Use Imagen2 for armor design, helmet shape, and red mechanical suit details&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;B. 시네마 문법이 강함&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;IMAX 70mm film texture&lt;/li&gt;
&lt;li&gt;Panavision 35mm lens&lt;/li&gt;
&lt;li&gt;f4&lt;/li&gt;
&lt;li&gt;handheld sway&lt;/li&gt;
&lt;li&gt;shallow DOF bokeh&lt;/li&gt;
&lt;li&gt;dense industrial fog&lt;/li&gt;
&lt;li&gt;hard cuts&lt;/li&gt;
&lt;li&gt;SFX only, no music&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 요소들은 영상의 &lt;b&gt;재질감&lt;/b&gt;을 강하게 고정합니다.&lt;br /&gt;특히 red energy sword as only warm light는 색 설계가 매우 좋습니다.&lt;br /&gt;영상 전체 팔레트를 통제하는 데 효과적입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;C. 시간 분할이 매우 구체적임&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0&amp;ndash;1s, 1&amp;ndash;3s, 3&amp;ndash;4s처럼 잘게 나눠서&lt;br /&gt;모델이 &amp;ldquo;무엇을 언제 보여줘야 하는지&amp;rdquo; 이해하기 쉽습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 특히 영상 생성 모델에서 중요합니다.&lt;br /&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;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;D. 감각 정보가 풍부함&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 &amp;ldquo;검을 든다&amp;rdquo;가 아니라&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;particles spiral inward&lt;/li&gt;
&lt;li&gt;condensing into a sword hilt&lt;/li&gt;
&lt;li&gt;circuit textures forming&lt;/li&gt;
&lt;li&gt;explosive hum&lt;/li&gt;
&lt;li&gt;shell tear + metal impact&lt;/li&gt;
&lt;li&gt;cables rattling&lt;/li&gt;
&lt;li&gt;structures groaning&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처럼 &lt;b&gt;시각 + 청각 + 물성&lt;/b&gt;이 같이 들어가 있습니다.&lt;br /&gt;그래서 장면이 더 입체적으로 느껴집니다.&lt;/p&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;이 프롬프트의 가장 큰 장점은 **&amp;ldquo;주인공을 영웅적으로 보이게 만드는 비트 설계&amp;rdquo;**입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조를 보면:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;얼굴 클로즈업&lt;/li&gt;
&lt;li&gt;헬멧 조립&lt;/li&gt;
&lt;li&gt;검 생성&lt;/li&gt;
&lt;li&gt;포위&lt;/li&gt;
&lt;li&gt;전투&lt;/li&gt;
&lt;li&gt;승리 정적&lt;/li&gt;
&lt;li&gt;더 큰 위협 등장&lt;/li&gt;
&lt;li&gt;한 단어 대사&lt;/li&gt;
&lt;li&gt;돌진&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 거의 예고편 문법입니다.&lt;br /&gt;15초 안에 &lt;b&gt;기원 &amp;rarr; 능력 &amp;rarr; 위협 &amp;rarr; 액션 &amp;rarr; 상위 위협 &amp;rarr; 클리프행어&lt;/b&gt;가 다 들어가 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 문제점도 분명히 있음&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;A. 15초에 정보량이 너무 많음&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 가장 큽니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;15초 안에 들어가는 요소:&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;6마리 적 등장&lt;/li&gt;
&lt;li&gt;6마리 각각 다른 방식으로 처치&lt;/li&gt;
&lt;li&gt;피격 표현&lt;/li&gt;
&lt;li&gt;전장 상태&lt;/li&gt;
&lt;li&gt;지면 진동&lt;/li&gt;
&lt;li&gt;보스 등장&lt;/li&gt;
&lt;li&gt;보스 디테일 반사&lt;/li&gt;
&lt;li&gt;대사&lt;/li&gt;
&lt;li&gt;돌진&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 정도면 사실 &lt;b&gt;30~45초 분량 아이디어&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;/li&gt;
&lt;li&gt;적 숫자 유지 실패&lt;/li&gt;
&lt;li&gt;6마리 처치 과정이 섞임&lt;/li&gt;
&lt;li&gt;보스 스케일 붕괴&lt;/li&gt;
&lt;li&gt;카메라 동선 꼬임&lt;/li&gt;
&lt;li&gt;얼굴/헬멧 일관성 손상&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[Inference] 실제 생성 결과에서는 사용자가 적어둔 모든 비트를 정확히 1:1로 재현하지 못할 가능성이 높습니다. 이는 일반적인 영상 생성 모델의 장면 압축 경향에 따른 판단입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;B. 쇼트 타입이 너무 자주 바뀜&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;CU&lt;/li&gt;
&lt;li&gt;CU hand&lt;/li&gt;
&lt;li&gt;Side CU&lt;/li&gt;
&lt;li&gt;Behind MS&lt;/li&gt;
&lt;li&gt;Low angle&lt;/li&gt;
&lt;li&gt;Side-track&lt;/li&gt;
&lt;li&gt;Rapid orbit&lt;/li&gt;
&lt;li&gt;Overhead FS&lt;/li&gt;
&lt;li&gt;Low CU&lt;/li&gt;
&lt;li&gt;Front MS&lt;/li&gt;
&lt;li&gt;ECU&lt;/li&gt;
&lt;li&gt;ECU sensors&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;15초 안에 이 정도 쇼트 전환은 &lt;b&gt;매우 공격적&lt;/b&gt;입니다.&lt;br /&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;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;C. &amp;ldquo;정확한 수치&amp;rdquo;가 모델에 부담을 줌&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;six black chitinous creatures&lt;/li&gt;
&lt;li&gt;flung 3m into railing&lt;/li&gt;
&lt;li&gt;10x warrior's size&lt;/li&gt;
&lt;li&gt;ten times wider than creatures' eyes&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 수치는 사람에게는 선명하지만, 모델에게는 오히려 불안정할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 안정적인 표현은:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;surrounded by six creatures&lt;/li&gt;
&lt;li&gt;thrown hard into a railing&lt;/li&gt;
&lt;li&gt;towering boss, far larger than the warrior&lt;/li&gt;
&lt;li&gt;enormous red lights much larger than the creatures' eyes&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;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;D. 참조 이미지 연결 문법이 약간 불안정함&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Imagen2Element-type full helmet 같은 표현은 다소 어색합니다.&lt;br /&gt;모델이 이걸 &amp;ldquo;Imagen2의 요소를 따르는 헬멧&amp;rdquo;으로 이해할 수도 있지만, 아닐 수도 있습니다.&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;helmet design matching Imagen2&lt;/li&gt;
&lt;li&gt;armor silhouette and red mechanical plating based on Imagen2&lt;/li&gt;
&lt;li&gt;preserve Imagen1 facial identity before helmet closes&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;E. &amp;ldquo;Face stable, no deformation&amp;rdquo;은 좋지만 충분하지 않을 수 있음&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 안전장치이긴 한데, 액션이 많고 헬멧 장착, 피 분사, 회전, 돌진까지 있어서&lt;br /&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;preserve face identity from Imagen1 across all close-ups&lt;/li&gt;
&lt;li&gt;consistent facial proportions&lt;/li&gt;
&lt;li&gt;no facial morphing during helmet assembly&lt;/li&gt;
&lt;li&gt;helmet closes cleanly without warping the face&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 이 프롬프트의 숨은 구조&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 프롬프트는 사실 4개 블록으로 나뉩니다.&lt;/p&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;0&amp;ndash;1s 얼굴&lt;/li&gt;
&lt;li&gt;1&amp;ndash;3s 손&lt;/li&gt;
&lt;li&gt;3&amp;ndash;4s 검 + 갑옷&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;블록 2. 전장 세팅&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;4&amp;ndash;5s 포위&lt;/li&gt;
&lt;li&gt;5&amp;ndash;6s 대치&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;블록 3. 중간 전투&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;6&amp;ndash;10s 6마리 정리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;블록 4. 보스 티저&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;10&amp;ndash;15s 잔해 &amp;rarr; 진동 &amp;rarr; 보스 &amp;rarr; 대사 &amp;rarr; 돌진&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조 자체는 아주 좋습니다.&lt;br /&gt;문제는 &lt;b&gt;블록 3이 너무 빽빽하다&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. 생성 안정성을 높이려면 어떻게 바꿔야 하나&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;p data-ke-size=&quot;size16&quot;&gt;현재는 2~3초 안에&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1번 적&lt;/li&gt;
&lt;li&gt;2번 적&lt;/li&gt;
&lt;li&gt;3번 적&lt;/li&gt;
&lt;li&gt;4번 적&lt;/li&gt;
&lt;li&gt;5번 적&lt;/li&gt;
&lt;li&gt;6번 적&lt;br /&gt;이 다 들어갑니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 모델이 거의 확실히 압축합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 안정적인 방향:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;two or three rapid decisive strikes&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;multiple creatures fall in quick succession&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;brief montage of impacts, severed limbs, and bodies thrown into fog&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) 카메라 지시를 줄이고 우선순위를 정하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금은 카메라가 너무 많이 바뀝니다.&lt;br /&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;opening push-in&lt;/li&gt;
&lt;li&gt;side-tracking action shot&lt;/li&gt;
&lt;li&gt;rapid orbit for combo moment&lt;/li&gt;
&lt;li&gt;overhead aftermath&lt;/li&gt;
&lt;li&gt;ascending reveal for boss&lt;/li&gt;
&lt;li&gt;final forward rush&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;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;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;&amp;ldquo;ADELANTE&amp;rdquo;&lt;/li&gt;
&lt;li&gt;돌진&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 중간 잡몹 액션을 조금 덜어내고&lt;br /&gt;보스 등장에 1초 더 주는 편이 결과물이 더 강할 가능성이 큽니다.&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;p data-ke-size=&quot;size16&quot;&gt;이 프롬프트는&lt;br /&gt;&lt;b&gt;&amp;ldquo;비주얼 디렉팅은 매우 강하지만, 생성 모델 기준으로는 과밀하다&amp;rdquo;&lt;/b&gt;&lt;br /&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;/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;8. 어떤 모델에서 특히 잘 맞는 스타일인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[Inference] 이 프롬프트는 &lt;b&gt;텍스트 기반 시네마틱 영상 모델&lt;/b&gt;이나 &lt;b&gt;샷 서술을 어느 정도 따라가는 생성기&lt;/b&gt;에 더 잘 맞는 구조입니다.&lt;br /&gt;반면, 액션 연속성과 물리 일관성이 약한 모델에서는 다음 문제가 날 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;적 숫자 붕괴&lt;/li&gt;
&lt;li&gt;팔/검/다리 왜곡&lt;/li&gt;
&lt;li&gt;보스 스케일 불안정&lt;/li&gt;
&lt;li&gt;검 궤적과 타격 결과 불일치&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 이 프롬프트는 &amp;ldquo;아이디어는 훌륭하지만, 모델이 강해야 버텨주는 타입&amp;rdquo;입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 개선 우선순위&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최우선&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;6마리 개별 처치 디테일 축소&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;참조 이미지 문법 명확화&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;cold teal-blue vs red only warm light&lt;/li&gt;
&lt;li&gt;dense industrial fog&lt;/li&gt;
&lt;li&gt;SFX only, no music&lt;/li&gt;
&lt;li&gt;face identity stability&lt;/li&gt;
&lt;li&gt;final boss reveal + &amp;ldquo;ADELANTE&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;10. 압축해서 평가하면&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 프롬프트는 다음 장르 문법을 섞고 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;헬멧 조립 변신&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;에너지 무기 생성&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;근접 액션 학살&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;다음 보스전 티저&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;한 단어 대사로 끝나는 트레일러 클리프행어&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 결과적으로 매우 강렬합니다.&lt;br /&gt;다만 생성 품질을 우선하면, &lt;b&gt;&amp;ldquo;잡몹전 40% 축소, 보스 티저 20% 확대&amp;rdquo;&lt;/b&gt;가 가장 효과적입니다&lt;/p&gt;</description>
      <category>Seedance2</category>
      <author>행복한 수지아빠</author>
      <guid isPermaLink="true">https://javaexpert.tistory.com/1744</guid>
      <comments>https://javaexpert.tistory.com/1744#entry1744comment</comments>
      <pubDate>Sun, 19 Apr 2026 13:31:49 +0900</pubDate>
    </item>
    <item>
      <title>지구에서 캐릭터까지 내려오는 멋진 프롬프트</title>
      <link>https://javaexpert.tistory.com/1743</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;&amp;nbsp;&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=c0CqEoCCfhU&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bZLMtl/dJMb8YXNqh9/WLvKODqFftk3ouVZtLccs0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/bRVWMl/dJMb8XkhfTX/K5bCWthASNnNRP1VdLTUTK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/cys6da/dJMb8VNxjXh/6jv1OaSRnAJD3Rfmtbaqy1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;몬스터헌터월드가이드&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/c0CqEoCCfhU&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;pre id=&quot;code_1776572672813&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Epic cinematic Earth zoom-in sequence starting from deep outer space. Camera begins with a majestic wide shot of planet Earth floating in the void (0-5s), then rapidly accelerates and dives toward the surface at breathtaking speed, piercing through glowing atmosphere layers, rushing clouds, and continents with dramatic motion blur, light streaks, and intense atmospheric entry glow (5-10s). The camera swiftly descends over a vast post-apocalyptic ruined cityscape filled with crumbling skyscrapers, overgrown vegetation, abandoned vehicles, broken highways, and thick dust clouds, before seamlessly entering a massive abandoned building and revealing a hidden high-tech robot workshop inside the building filled with mechanical tools, scattered robotic parts, welding sparks, glowing holographic screens, and industrial metallic surfaces. The continuous one-take camera movement gradually slows down smoothly and settles into a perfect medium shot on the main character @img1 who strikes a dynamic cool pose: aiming her hand in a finger-gun gesture directly toward the viewer as if shooting, while playfully winking one eye at the camera, with her companion robot @img2 positioned right beside her (10-15s).



@img1: primary character reference - accurate face, body, outfit, and pose as the central figure in the robot workshop.

@img2: robot companion reference - precise robot design, details, and placement immediately next to @img1.



Cinematic film color grading, heavily desaturated moody tones, cool color palette with subtle teal accents, high contrast, subtle film grain, atmospheric dust particles floating in the air, professional Hollywood sci-fi movie look. Ultra-detailed, photorealistic yet stylized, 8K quality, masterpiece.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1) 전체 프롬프트의 설계 목적&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 프롬프트의 진짜 목적은 단순히 &amp;ldquo;지구에서 캐릭터까지 내려오는 멋진 영상&amp;rdquo;이 아니라, 아래 4가지를 동시에 잡는 것입니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;초대형 스케일감&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;연속 원테이크 카메라 쾌감&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;세계관 정보 전달&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;마지막 캐릭터 히어로 샷 정착&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 앞부분은 전부 마지막 2초의 캐릭터 샷을 더 강하게 보이게 만드는 빌드업입니다.&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[오프닝 스케일]&lt;/b&gt;&lt;br /&gt;&amp;rarr; &lt;b&gt;[고속 돌입]&lt;/b&gt;&lt;br /&gt;&amp;rarr; &lt;b&gt;[환경 소개]&lt;/b&gt;&lt;br /&gt;&amp;rarr; &lt;b&gt;[목표 공간 진입]&lt;/b&gt;&lt;br /&gt;&amp;rarr; &lt;b&gt;[최종 피사체 정착]&lt;/b&gt;&lt;br /&gt;&amp;rarr; &lt;b&gt;[레퍼런스 앵커]&lt;/b&gt;&lt;br /&gt;&amp;rarr; &lt;b&gt;[전체 룩/색보정]&lt;/b&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;3) 구간별 역분석&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;A. 오프닝 훅&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Epic cinematic Earth zoom-in sequence starting from deep outer space.&lt;/p&gt;
&lt;/blockquote&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;Epic cinematic&lt;/b&gt;: 영화적 규모, 웅장한 톤&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Earth zoom-in sequence&lt;/b&gt;: 카메라의 핵심 액션 정의&lt;/li&gt;
&lt;li&gt;&lt;b&gt;starting from deep outer space&lt;/b&gt;: 시작 지점 명확화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 첫 줄에서 이미 모델에게&lt;br /&gt;&amp;ldquo;이건 대형 SF 영화 오프닝 같은 원테이크 하강 시퀀스다&amp;rdquo;&lt;br /&gt;라고 선언한 셈입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;B. 시간축 기반 카메라 블로킹&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Camera begins with a majestic wide shot of planet Earth floating in the void (0-5s), then rapidly accelerates and dives toward the surface at breathtaking speed...&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분은 아주 중요합니다.&lt;br /&gt;단순 설명이 아니라 &lt;b&gt;시간대별 쇼트 설계&lt;/b&gt;입니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;역할&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;0&amp;ndash;5초: 우주에서 지구를 보여주는 도입&lt;/li&gt;
&lt;li&gt;5&amp;ndash;10초: 속도감 있는 대기권 돌입&lt;/li&gt;
&lt;li&gt;10&amp;ndash;15초: 도시 &amp;rarr; 건물 &amp;rarr; 실내 &amp;rarr; 캐릭터 정착&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 되면 모델이 &amp;ldquo;무엇을 먼저 보여줘야 하는지&amp;rdquo;를 순서대로 이해하기 쉬워집니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;왜 좋은가&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;긴 프롬프트일수록 모델은 종종&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;공간을 섞거나&lt;/li&gt;
&lt;li&gt;순서를 무시하거나&lt;/li&gt;
&lt;li&gt;마지막 캐릭터를 너무 빨리 보여주거나&lt;/li&gt;
&lt;li&gt;중간 도시 묘사를 생략&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하는데, 시간축을 주면 이런 붕괴를 줄이는 효과가 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;C. 속도감 보강용 시각 키워드&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;piercing through glowing atmosphere layers, rushing clouds, and continents with dramatic motion blur, light streaks, and intense atmospheric entry glow&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 &amp;ldquo;무엇을 통과하는가&amp;rdquo;와 &amp;ldquo;어떤 느낌으로 보이는가&amp;rdquo;를 동시에 고정합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;기능 분해&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;glowing atmosphere layers&lt;/b&gt;: 대기권 시각 효과&lt;/li&gt;
&lt;li&gt;&lt;b&gt;rushing clouds&lt;/b&gt;: 속도 체감&lt;/li&gt;
&lt;li&gt;&lt;b&gt;continents&lt;/b&gt;: 스케일 유지&lt;/li&gt;
&lt;li&gt;&lt;b&gt;motion blur / light streaks&lt;/b&gt;: 빠른 이동의 영상 문법&lt;/li&gt;
&lt;li&gt;&lt;b&gt;atmospheric entry glow&lt;/b&gt;: SF스러운 열감, 진입감&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 카메라의 행동만 쓴 게 아니라&lt;br /&gt;&lt;b&gt;속도를 눈에 보이게 만드는 효과 언어&lt;/b&gt;를 붙인 구조입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;D. 중간 세계관 설명 구간&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The camera swiftly descends over a vast post-apocalyptic ruined cityscape filled with crumbling skyscrapers, overgrown vegetation, abandoned vehicles, broken highways, and thick dust clouds&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분은 배경이 아니라 &lt;b&gt;세계관 압축 설명&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 전달되는 정보는:&lt;/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;p data-ke-size=&quot;size16&quot;&gt;즉, &amp;ldquo;로봇 작업실&amp;rdquo; 하나만 보여주면 그냥 SF 실내일 수 있는데,&lt;br /&gt;그 전에 &lt;b&gt;포스트 아포칼립스 도시를 깔아줘서&lt;/b&gt;&lt;br /&gt;마지막 작업실이 &amp;ldquo;폐허 속 숨겨진 생존 거점&amp;rdquo;처럼 느껴지게 만듭니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;E. 핵심 전환부&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;before seamlessly entering a massive abandoned building and revealing a hidden high-tech robot workshop inside the building&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 사실 이 프롬프트의 가장 중요한 브리지입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜냐하면 여기서 장면이&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;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;으로 급격히 좁혀지기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 전환은 모델이 자주 실패하는 구간입니다.&lt;br /&gt;그래서 &lt;b&gt;seamlessly entering&lt;/b&gt; 같은 단어로 컷 전환이 아니라 연속 카메라 이동임을 강조하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 이 문장은&lt;br /&gt;&amp;ldquo;장면이 바뀌는 게 아니라 카메라가 이어서 들어간다&amp;rdquo;&lt;br /&gt;를 강하게 고정하는 역할입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;F. 실내 세트 디테일&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;filled with mechanical tools, scattered robotic parts, welding sparks, glowing holographic screens, and industrial metallic surfaces&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구간은 워크숍을 그냥 &amp;ldquo;하이테크&amp;rdquo;라고만 하지 않고,&lt;br /&gt;모델이 쉽게 뽑을 수 있는 &lt;b&gt;오브젝트 단위 시각 단서&lt;/b&gt;로 분해해 준 것입니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;요소별 기능&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;mechanical tools&lt;/b&gt;: 작업실의 기능성&lt;/li&gt;
&lt;li&gt;&lt;b&gt;scattered robotic parts&lt;/b&gt;: 로봇 제작 공간임을 암시&lt;/li&gt;
&lt;li&gt;&lt;b&gt;welding sparks&lt;/b&gt;: 움직임, 생동감, 시네마틱 포인트&lt;/li&gt;
&lt;li&gt;&lt;b&gt;glowing holographic screens&lt;/b&gt;: 미래 기술감&lt;/li&gt;
&lt;li&gt;&lt;b&gt;industrial metallic surfaces&lt;/b&gt;: 질감 통일&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 프롬프트는 추상어보다&lt;br /&gt;이렇게 &lt;b&gt;눈에 보이는 사물 리스트&lt;/b&gt;를 잘 씁니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;G. 최종 샷의 속도 제어&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The continuous one-take camera movement gradually slows down smoothly and settles into a perfect medium shot&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문장은 매우 전략적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞부분은 엄청 빠른데, 마지막까지 빠르면&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;@img1, @img2 레퍼런스가 흐트러질 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 마지막에 속도를 줄여&lt;br /&gt;&lt;b&gt;카메라 정착 안정성&lt;/b&gt;을 확보하는 문장입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 이 프롬프트는 단순히 &amp;ldquo;멋있게&amp;rdquo;가 아니라&lt;br /&gt;&lt;b&gt;생성 성공률&lt;/b&gt;을 고려한 감속 설계가 들어가 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;H. 캐릭터 액션 고정&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;on the main character @img1 who strikes a dynamic cool pose: aiming her hand in a finger-gun gesture directly toward the viewer as if shooting, while playfully winking one eye at the camera, with her companion robot @img2 positioned right beside her&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분은 최종 목적지입니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;여기서 고정하는 것&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주인공은 @img1&lt;/li&gt;
&lt;li&gt;로봇은 @img2&lt;/li&gt;
&lt;li&gt;둘의 위치 관계&lt;/li&gt;
&lt;li&gt;주인공 포즈&lt;/li&gt;
&lt;li&gt;손 제스처&lt;/li&gt;
&lt;li&gt;시선 방향&lt;/li&gt;
&lt;li&gt;표정&lt;/li&gt;
&lt;li&gt;카메라와의 인터랙션&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 &lt;b&gt;directly toward the viewer&lt;/b&gt;가 중요합니다.&lt;br /&gt;이게 없으면 손가락 총 포즈가 옆으로 나가거나, 카메라를 안 보고 다른 곳을 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 &lt;b&gt;with her companion robot @img2 positioned right beside her&lt;/b&gt;는&lt;br /&gt;로봇이 뒤에 뜨거나 멀리 배치되거나 프레임 밖으로 밀리는 문제를 줄이려는 표현입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;I. 레퍼런스 이미지 앵커&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@img1: primary character reference - accurate face, body, outfit, and pose as the central figure in the robot workshop.&lt;br /&gt;@img2: robot companion reference - precise robot design, details, and placement immediately next to @img1.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 거의 &amp;ldquo;생성 제어용 주석&amp;rdquo;입니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;@img1의 기능&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;얼굴 유지&lt;/li&gt;
&lt;li&gt;체형 유지&lt;/li&gt;
&lt;li&gt;의상 유지&lt;/li&gt;
&lt;li&gt;중심 인물 보장&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;@img2의 기능&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로봇 디자인 유지&lt;/li&gt;
&lt;li&gt;디테일 유지&lt;/li&gt;
&lt;li&gt;주인공 옆 위치 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 텍스트 본문이 서사와 카메라를 담당하고,&lt;br /&gt;이 앵커 문장은 &lt;b&gt;아이덴티티 보존&lt;/b&gt;을 담당합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;J. 전체 룩 고정&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cinematic film color grading, heavily desaturated moody tones, cool color palette with subtle teal accents, high contrast, subtle film grain, atmospheric dust particles floating in the air, professional Hollywood sci-fi movie look. Ultra-detailed, photorealistic yet stylized, 8K quality, masterpiece.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 마지막 블록은 &amp;ldquo;렌더링 룩&amp;rdquo;을 덮어씌우는 구간입니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;기능&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;desaturated moody tones&lt;/b&gt;: 채도 억제, 진지한 분위기&lt;/li&gt;
&lt;li&gt;&lt;b&gt;cool palette / subtle teal&lt;/b&gt;: SF 컬러 방향&lt;/li&gt;
&lt;li&gt;&lt;b&gt;high contrast&lt;/b&gt;: 강한 조형감&lt;/li&gt;
&lt;li&gt;&lt;b&gt;film grain&lt;/b&gt;: 영화 질감&lt;/li&gt;
&lt;li&gt;&lt;b&gt;dust particles&lt;/b&gt;: 공기감&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Hollywood sci-fi movie look&lt;/b&gt;: 레퍼런스 무드&lt;/li&gt;
&lt;li&gt;&lt;b&gt;photorealistic yet stylized&lt;/b&gt;: 너무 다큐처럼도, 너무 만화처럼도 가지 않게 균형&lt;/li&gt;
&lt;li&gt;&lt;b&gt;8K / masterpiece&lt;/b&gt;: 품질 압박용 수식어&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4) 이 프롬프트가 잘 짜인 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 프롬프트의 장점은 크게 5개입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 카메라가 주인공이다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 프롬프트가 배경만 길게 쓰는데, 이건 카메라 동선이 먼저입니다.&lt;br /&gt;영상 모델에서는 이게 훨씬 중요합니다.&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;0&amp;ndash;5, 5&amp;ndash;10, 10&amp;ndash;15로 나눠서 모델이 흐름을 따라가기 쉽습니다.&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;우주 &amp;rarr; 지구 &amp;rarr; 대기권 &amp;rarr; 도시 &amp;rarr; 건물 &amp;rarr; 실내 &amp;rarr; 인물&lt;br /&gt;이 축소 흐름이 논리적입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 마지막 샷이 선명하다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종적으로 어디에 멈추는지 명확합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 레퍼런스 이미지의 역할이 분명하다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@img1, @img2가 그냥 &amp;ldquo;참고&amp;rdquo;가 아니라&lt;br /&gt;각각 어떤 요소를 유지해야 하는지 지정돼 있습니다.&lt;/p&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;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 너무 많은 공간 전환&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우주 &amp;rarr; 지표 &amp;rarr; 도시 &amp;rarr; 건물 내부 &amp;rarr; 작업실 &amp;rarr; 캐릭터&lt;br /&gt;이걸 15초 원테이크로 완벽히 처리하는 건 모델에 따라 어렵습니다.&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;도시 디테일도 많고 실내 디테일도 많고 캐릭터 포즈도 복잡합니다.&lt;br /&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;&amp;ldquo;@img1의 정확한 얼굴/몸/의상/포즈 유지&amp;rdquo;와&lt;br /&gt;&amp;ldquo;카메라가 초고속 원테이크로 진입&amp;rdquo;은 서로 긴장 관계가 있습니다.&lt;br /&gt;보통 빠른 동선일수록 캐릭터 일관성이 흔들릴 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. finger-gun + wink는 마지막 안정 프레임이 필요&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;6) 이 프롬프트의 핵심 공식만 뽑으면&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 프롬프트는 아래 패턴으로 재사용할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;[장르/스케일 선언]

Camera begins with [초기 거시적 쇼트] (0-5s),
then [고속 이동/돌입] through [중간 레이어들] with [속도 효과] (5-10s).

The camera descends over [세계관 환경 묘사],
then seamlessly enters [목표 공간],
revealing [실내/목적지 디테일].

The continuous one-take movement gradually slows down
and settles into [최종 쇼트 사이즈]
on [주인공] performing [명확한 포즈/표정/액션],
with [동반 오브젝트/캐릭터] positioned [위치 관계].

[레퍼런스 이미지 역할 설명]

[색보정 / 질감 / 영화 룩]
&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;거대한 우주적 스케일의 진입 쇼트&amp;rdquo;를 이용해 세계관을 깔고,&lt;br /&gt;&amp;ldquo;폐허 도시 &amp;rarr; 숨겨진 워크숍&amp;rdquo;으로 감정을 압축한 뒤,&lt;br /&gt;마지막에 &amp;ldquo;레퍼런스 고정된 캐릭터 히어로 포즈&amp;rdquo;로 착지시키는&lt;br /&gt;원테이크형 SF 시네마틱 프롬프트&amp;rdquo;&lt;/b&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;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;&lt;b&gt;Scene scale&lt;/b&gt;: outer space, Earth, continent, city, building, workshop&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Camera grammar&lt;/b&gt;: one-take, zoom-in, dive, descend, enter, slow down, settle&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Motion intensity&lt;/b&gt;: breathtaking speed, motion blur, light streaks, entry glow&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Worldbuilding&lt;/b&gt;: post-apocalyptic, ruined city, overgrown vegetation, abandoned infrastructure&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Set dressing&lt;/b&gt;: robot parts, welding sparks, holographic screens, metallic surfaces&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Character anchor&lt;/b&gt;: @img1, @img2&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Hero pose&lt;/b&gt;: finger-gun, wink, medium shot&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Lookdev&lt;/b&gt;: desaturated, teal accents, high contrast, film grain, dust particles&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Quality pressure words&lt;/b&gt;: ultra-detailed, photorealistic yet stylized, 8K, masterpiece&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) 더 좋게 다듬으려면&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;&amp;ldquo;one continuous shot&amp;rdquo;를 더 앞에 배치&lt;/li&gt;
&lt;li&gt;도시 디테일을 약간 압축&lt;/li&gt;
&lt;li&gt;실내 진입 직전 속도 완화 명시&lt;/li&gt;
&lt;li&gt;최종 포즈 프레임 홀드 1~2초 암시&lt;/li&gt;
&lt;li&gt;캐릭터 왜곡 방지 문장 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들면 보강 포인트는 이런 식입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;maintain character identity consistency throughout final approach&lt;/li&gt;
&lt;li&gt;no subject distortion, no extra characters&lt;/li&gt;
&lt;li&gt;final frame holds steadily on the pose&lt;/li&gt;
&lt;li&gt;robot remains clearly visible beside the character&lt;/li&gt;
&lt;li&gt;seamless spatial continuity from exterior to interior&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 문장은 특히 영상 생성에서 꽤 유용합니다.&lt;/p&gt;</description>
      <category>Seedance2</category>
      <author>행복한 수지아빠</author>
      <guid isPermaLink="true">https://javaexpert.tistory.com/1743</guid>
      <comments>https://javaexpert.tistory.com/1743#entry1743comment</comments>
      <pubDate>Sun, 19 Apr 2026 13:25:04 +0900</pubDate>
    </item>
    <item>
      <title>Seedance2.0에 시네마틱 프롬프트 만들기 튜터리얼 #2</title>
      <link>https://javaexpert.tistory.com/1742</link>
      <description>&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;목표 장면&lt;/h1&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;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주체가 분명함: 헌터 vs 와이번&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;h1&gt;전체 튜토리얼 흐름&lt;/h1&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;/li&gt;
&lt;li&gt;주인공 설계&lt;/li&gt;
&lt;li&gt;적 크리처 설계&lt;/li&gt;
&lt;li&gt;공간과 시간대 설계&lt;/li&gt;
&lt;li&gt;액션 핵심 비트 설계&lt;/li&gt;
&lt;li&gt;카메라 구조 설계&lt;/li&gt;
&lt;li&gt;물리/이펙트 설계&lt;/li&gt;
&lt;li&gt;사운드 설계&lt;/li&gt;
&lt;li&gt;멀티샷 타임라인으로 정리&lt;/li&gt;
&lt;li&gt;최종 프롬프트 조립&lt;/li&gt;
&lt;li&gt;변형 테스트용 프롬프트 만들기&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;1단계. 로그라인 고정&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 &amp;ldquo;무슨 장면인지&amp;rdquo;를 한 줄로 고정합니다.&lt;/p&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;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;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 세 가지만 먼저 잡습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1차 테스트 프롬프트&lt;/h2&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;해 질 무렵의 거대한 바위 협곡. 
한 명의 정예 몬스터 헌터가 거대한 날개 달린 와이번과 맞선다. 
시네마틱, 극사실적, 다크 판타지.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;a href=&quot;https://youtu.be/l5z9jYLzrDI&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/l5z9jYLzrDI&lt;/a&gt;&lt;/h2&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=l5z9jYLzrDI&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bpeA1r/dJMb9dHpKKb/YAd45LhD61IKkaHnpnOdfk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;튜터리얼 #2-1&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/l5z9jYLzrDI&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;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;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;2단계. 장르와 톤 고정&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이 장면의 감정과 스타일을 정합니다.&lt;br /&gt;이 단계가 없으면 그냥 &amp;ldquo;판타지 몬스터 싸움&amp;rdquo; 정도로 흐려집니다.&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;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;: 고전 블록버스터 액션 에너지, 하지만 특정 IP는 아님&lt;/li&gt;
&lt;/ul&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;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2차 테스트 프롬프트&lt;/h2&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;기존 작품을 기반으로 하지 않은 오리지널 다크 판타지 액션 장면. 
해 질 무렵의 거대한 바위 협곡에서 한 명의 정예 몬스터 헌터가 거대한 와이번과 맞선다. 
묵직하고 위협적인 분위기, 생존을 건 결전의 느낌, 극사실적, 시네마틱.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;a href=&quot;https://youtu.be/TgYMDRrLW4g&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/TgYMDRrLW4g&lt;/a&gt;&lt;/h2&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=TgYMDRrLW4g&quot; data-video-width=&quot;0&quot; data-video-height=&quot;0&quot; data-video-origin-width=&quot;0&quot; data-video-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;튜터리얼 #2-2&quot; data-video-thumbnail=&quot;&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/TgYMDRrLW4g&quot; width=&quot;0&quot; height=&quot;0&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;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;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;3단계. 주인공 헌터 설계&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 액션 프롬프트는 &amp;ldquo;누가 싸우는지&amp;rdquo;가 강해야 합니다.&lt;br /&gt;헌터가 흐리면 액션이 약해집니다.&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;/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;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;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3차 테스트 프롬프트&lt;/h2&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;해 질 무렵의 거대한 바위 협곡. 
한 명의 정예 몬스터 헌터가 서 있다. 
그는 겹겹이 덧댄 가죽과 금속 갑옷, 거친 털 망토, 상처 난 얼굴을 지녔고, 
손에는 거대한 변형형 블레이드 스피어를 들고 있다. 
오리지널 다크 판타지, 시네마틱, 극사실적.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;a href=&quot;https://youtu.be/stWAxEvhk9s&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/stWAxEvhk9s&lt;/a&gt;&lt;/h2&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=stWAxEvhk9s&quot; data-video-width=&quot;0&quot; data-video-height=&quot;0&quot; data-video-origin-width=&quot;0&quot; data-video-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;튜터리얼 #2-3&quot; data-video-thumbnail=&quot;&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/stWAxEvhk9s&quot; width=&quot;0&quot; height=&quot;0&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;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;인물이 &amp;lsquo;엘리트 사냥꾼&amp;rsquo;처럼 보이는지&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;4단계. 와이번 설계&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 적을 설계합니다.&lt;br /&gt;강한 액션 장면은 적이 단순히 &amp;ldquo;큰 용&amp;rdquo;이면 약합니다.&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;/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;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;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4차 테스트 프롬프트&lt;/h2&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;거대한 날아다니는 와이번이 협곡 위에 모습을 드러낸다. 
강력한 박쥐형 날개, 뿔처럼 솟은 머리 왕관, 칼날 같은 꼬리, 
흉터 난 비늘, 사냥감을 읽는 포식자 같은 지능적인 눈빛. 
오리지널 다크 판타지, 위협적이고 압도적인 존재감, 
시네마틱, 극사실적.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;a href=&quot;https://youtu.be/Mj_Db0BPZ7A&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/Mj_Db0BPZ7A&lt;/a&gt;&lt;/h2&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=Mj_Db0BPZ7A&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/cYrO01/dJMb83SksP2/ySUFFD2wg7TeqmZvrjvIC1/img.jpg?width=640&amp;amp;height=480&amp;amp;face=0_0_640_480&quot; data-video-width=&quot;640&quot; data-video-height=&quot;480&quot; data-video-origin-width=&quot;640&quot; data-video-origin-height=&quot;480&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;튜터리얼 #2-4&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/Mj_Db0BPZ7A&quot; width=&quot;640&quot; height=&quot;480&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;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;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;5단계. 공간과 시간대 설계&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 무대를 강하게 만듭니다.&lt;br /&gt;공간이 약하면 액션도 평평해집니다.&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;/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;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;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5차 테스트 프롬프트&lt;/h2&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;해 질 무렵의 거대한 바위 협곡. 부서진 고대 돌 아치들이 흩어져 있고, 
붉은 노을빛이 바위 절벽과 먼지 사이로 길게 스며든다. 
강한 바람이 협곡을 가로질러 불고, 황량하고 위험한 결전의 무대가 형성된다. 
오리지널 다크 판타지, 시네마틱, 극사실적.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;a href=&quot;https://youtu.be/3m3g_P0uAvc&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/3m3g_P0uAvc&lt;/a&gt;&lt;/h2&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=3m3g_P0uAvc&quot; data-video-width=&quot;0&quot; data-video-height=&quot;0&quot; data-video-origin-width=&quot;0&quot; data-video-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;튜티리얼 #2-5&quot; data-video-thumbnail=&quot;&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/3m3g_P0uAvc&quot; width=&quot;0&quot; height=&quot;0&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;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;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;6단계. 액션 핵심 비트 설계&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 진짜 액션 흐름을 설계합니다.&lt;br /&gt;처음부터 컷을 나누지 말고, 먼저 &lt;b&gt;무슨 일이 일어나는지&lt;/b&gt;만 정합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이번 장면의 핵심 비트&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;헌터가 전진한다&lt;/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;/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;/li&gt;
&lt;li&gt;액션의 상승 구조 만들기&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6차 테스트 프롬프트&lt;/h2&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;해 질 무렵 협곡에서 정예 몬스터 헌터가 앞으로 걸어 나간다. 
곧 거대한 와이번이 거칠게 착지하며 바위를 부수고 먼지를 폭발시키고, 
둘은 곧바로 짧고 격렬한 근접 충돌을 벌인다. 
마지막에는 헌터가 높은 바위턱에서 뛰어올라 와이번의 목을 향해 거대한 무기를 겨누고, 
이후 둘은 거친 숨을 몰아쉬며 정면으로 대치한다. 오리지널 다크 판타지 액션, 시네마틱, 극사실적.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;a href=&quot;https://youtu.be/nlfNKJq8TwY&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/nlfNKJq8TwY&lt;/a&gt;&lt;/h2&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=nlfNKJq8TwY&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/w0z9U/dJMb8WMrchc/cbb3kMuiCB0141g7x6Sur1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;튜터리얼 #2-6&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/nlfNKJq8TwY&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;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;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;7단계. 카메라 구조 설계&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 멀티샷 언어를 붙입니다.&lt;br /&gt;이 장면은 컷 전환이 많을수록 좋지만, 무질서하면 안 됩니다.&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;시작: 와이드 establishing&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;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;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7차 테스트 프롬프트&lt;/h2&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;와이드 establishing shot으로 시작한다. 
해 질 무렵의 거대한 협곡을 천천히 내려다보며 먼지와 부서진 돌 아치를 보여준다. 
이후 미디엄 와이드 트래킹샷으로 헌터가 전진하는 모습을 잡고, 
와이번이 착지하는 순간 빠른 클로즈업과 와이드샷을 번갈아 사용해 충돌의 충격을 강조한다. 
이어서 영웅적인 오빗샷으로 헌터의 점프 공격을 보여주고, 
마지막은 거친 숨을 몰아쉬는 둘의 대치 클로즈업으로 끝난다. 초시네마틱, 극사실적.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;a href=&quot;https://youtu.be/rBYwgyMBE7E&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/rBYwgyMBE7E&lt;/a&gt;&lt;/h2&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=rBYwgyMBE7E&quot; data-video-width=&quot;0&quot; data-video-height=&quot;0&quot; data-video-origin-width=&quot;0&quot; data-video-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;튜터리얼 #2-7&quot; data-video-thumbnail=&quot;&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/rBYwgyMBE7E&quot; width=&quot;0&quot; height=&quot;0&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;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;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;8단계. 물리와 이펙트 설계&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 장면은 물리감이 매우 중요합니다.&lt;br /&gt;먼지, 낙석, 꼬리 휩쓸기, 날개 압력, 착지 충격이 살아야 합니다.&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;/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;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;&amp;ldquo;그냥 모션만 빠른 액션&amp;rdquo;이 아니라 충격이 느껴지는 액션 만들기&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8차 테스트 프롬프트&lt;/h2&gt;
&lt;pre class=&quot;erlang&quot;&gt;&lt;code&gt;거대한 와이번이 착지하는 순간 발톱이 바위를 짓뭉개고, 날개가 크게 퍼지며 먼지와 파편을 사방으로 폭발시킨다. 헌터의 무기는 땅을 끌며 불꽃을 튀기고, 꼬리가 카메라 옆을 스쳐 지나가며 돌과 흙이 흩어진다. 공기에는 재와 먼지가 떠다니고, 해 질 무렵의 강한 역광이 연기와 먼지 사이를 가르며 들어온다. 강한 물리감, 다크 판타지 액션, 초시네마틱, 극사실적.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;a href=&quot;https://youtu.be/_WU61knqrLU&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/_WU61knqrLU&lt;/a&gt;&lt;/h2&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=_WU61knqrLU&quot; data-video-width=&quot;0&quot; data-video-height=&quot;0&quot; data-video-origin-width=&quot;0&quot; data-video-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;몬스터헌터월드가이드&quot; data-video-thumbnail=&quot;&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/_WU61knqrLU&quot; width=&quot;0&quot; height=&quot;0&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;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;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;9단계. 사운드 설계&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 사운드를 붙이면 장면이 완성됩니다.&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;/li&gt;
&lt;li&gt;보조 소리: 날개 압력과 먼지 폭발&lt;/li&gt;
&lt;li&gt;보조 소리: 금속 마찰, 무기 충돌음&lt;/li&gt;
&lt;li&gt;마무리 소리: 거친 숨소리, 바람&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9차 테스트 프롬프트&lt;/h2&gt;
&lt;pre class=&quot;erlang&quot;&gt;&lt;code&gt;거대한 협곡에서 와이번이 착지할 때 거대한 충돌음이 울리고, 날개가 공기를 후려치며 먼지와 파편이 폭발하는 소리가 터진다. 헌터의 무기가 바위 바닥을 긁으며 금속성 마찰음과 불꽃을 만들고, 짧고 강한 충돌마다 날카로운 타격음이 섞인다. 마지막 대치 순간에는 거친 숨소리와 협곡을 가르는 바람만 남는다. 초시네마틱 다크 판타지 액션, 극사실적.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;a href=&quot;https://youtu.be/zyutU9CdhLs&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/zyutU9CdhLs&lt;/a&gt;&lt;/h2&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=zyutU9CdhLs&quot; data-video-width=&quot;0&quot; data-video-height=&quot;0&quot; data-video-origin-width=&quot;0&quot; data-video-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;몬스터헌터월드가이드&quot; data-video-thumbnail=&quot;&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/zyutU9CdhLs&quot; width=&quot;0&quot; height=&quot;0&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;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;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;10단계. 멀티샷 타임라인으로 정리&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 위 요소를 시간 구조로 고정합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이번 13.5초 구조&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;0&amp;ndash;2.5초: 협곡과 헌터 소개&lt;/li&gt;
&lt;li&gt;2.5&amp;ndash;4.5초: 와이번 착지&lt;/li&gt;
&lt;li&gt;4.5&amp;ndash;8.5초: 빠른 근접 충돌&lt;/li&gt;
&lt;li&gt;8.5&amp;ndash;11.5초: 영웅적 점프/오빗샷&lt;/li&gt;
&lt;li&gt;11.5&amp;ndash;13.5초: 대치 클로즈업&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;10차 테스트 프롬프트&lt;/h2&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;[0-2.5초]: 와이드 establishing shot, 해 질 무렵의 거대한 바위 협곡을 천천히 크레인 다운으로 내려다본다. 먼지가 부서진 돌 아치 사이를 휘감고, 정예 몬스터 헌터가 앞으로 걸어 나오며 무기를 땅에 끌어 불꽃을 만든다.

[2.5-4.5초]: 미디엄 와이드 트래킹샷, 거대한 와이번이 협곡 바닥에 거칠게 착지한다. 발톱이 바위를 부수고, 날개가 공기를 후려치며 파편과 먼지를 바깥으로 폭발시킨다.

[4.5-8.5초]: 빠른 클로즈업과 와이드샷 교차. 헌터가 전력 질주해 휩쓸리는 발톱 아래로 미끄러져 들어가고, 날카로운 충격과 함께 전진한다. 와이번은 반동으로 몸을 젖히고, 꼬리가 카메라 옆을 스치며 돌과 재가 프레임 안으로 터진다.

[8.5-11.5초]: 영웅적인 오빗샷. 헌터가 부서진 바위턱에서 뛰어올라 망토를 거칠게 휘날리며, 거대한 블레이드 스피어를 와이번의 목 쪽으로 겨눈다. 와이번은 공중에서 몸을 비틀며 거대한 날개를 힘껏 친다.

[11.5-13.5초]: 극적인 대치 클로즈업. 둘 다 거친 숨을 몰아쉬고, 강한 눈맞춤을 유지한다. 노을빛 림라이트, 떠다니는 재, 찢어진 대지, 깊은 심도, 초시네마틱, 극사실적.
&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;컷 전환이 명확한지&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;h1&gt;11단계. 최종 완성 프롬프트&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 위 모든 것을 합쳐서 &lt;b&gt;완성형 시네마틱 프롬프트&lt;/b&gt;로 만듭니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;최종 완성 프롬프트&lt;/h2&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;기존 작품을 기반으로 하지 않은 오리지널 다크 판타지 액션 장면. 해 질 무렵의 거대한 바위 협곡 안에서, 겹겹이 덧댄 가죽과 금속 갑옷, 거친 털 망토, 상처 난 얼굴을 지닌 고독한 정예 몬스터 헌터가 거대한 비행형 와이번과 맞선다. 헌터는 거대한 변형형 블레이드 스피어를 들고 있다. 와이번은 강력한 박쥐형 날개, 뿔처럼 솟은 머리 왕관, 칼날 같은 꼬리, 흉터 난 비늘, 포식자 같은 지능을 지녔다.

[0-2.5초]: 와이드 establishing shot, 느린 크레인 다운으로 협곡을 내려다본다. 먼지가 부서진 돌 아치 사이를 지나가고, 헌터가 앞으로 걸어 나오며 무기를 땅에 끌어 불꽃을 만든다.

[2.5-4.5초]: 미디엄 와이드 트래킹샷, 와이번이 거칠게 착지한다. 발톱이 바위를 부수고, 날개가 공기를 후려쳐 파편과 먼지를 폭발시킨다.

[4.5-8.5초]: 빠른 클로즈업과 와이드샷 교차. 헌터가 전력 질주해 휩쓰는 발톱 아래로 미끄러지고, 날카로운 운동 에너지와 함께 전진한다. 와이번은 반동으로 몸을 젖히고, 꼬리가 카메라 옆을 스치며 돌과 재가 프레임 안으로 폭발한다.

[8.5-11.5초]: 영웅적인 오빗샷. 헌터가 부서진 바위턱에서 뛰어올라 망토를 거칠게 휘날리며, 무기를 와이번의 목으로 뻗는다. 와이번은 공중에서 몸을 비틀고 거대한 날개를 힘껏 친다.

[11.5-13.5초]: 극적인 대치 클로즈업. 둘 다 거친 숨을 몰아쉬고, 강한 눈맞춤을 유지한다. 노을빛 림라이트, 떠다니는 재, 찢어진 대지, 깊은 심도, 초시네마틱 블록버스터, 극사실적 8K, 80~90년대 액션 영화 에너지, 다양한 카메라 앵글과 샷 전환, 볼류메트릭 연기와 먼지 효과, 강한 역광, 비정상적 왜곡 없는 정상 비율.
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;12단계. 변형 테스트 프롬프트&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;완성 프롬프트만 쓰지 말고, 아래처럼 요소별로 비교 테스트하면 훨씬 빨리 늡니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;변형 A. 카메라 강조 버전&lt;/h2&gt;
&lt;pre class=&quot;erlang&quot;&gt;&lt;code&gt;오리지널 다크 판타지 액션 장면. 거대한 협곡의 전투를 더 과감한 카메라 문법으로 표현한다. 느린 크레인 다운, 빠른 핸드헬드 느낌의 충돌 클로즈업, 과장된 오빗샷, 낮은 로우앵글, 빠른 샷 전환으로 헌터와 와이번의 충돌을 더 격렬하게 보여준다. 극사실적, 초시네마틱.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;변형 B. 물리/먼지 강조 버전&lt;/h2&gt;
&lt;pre class=&quot;erlang&quot;&gt;&lt;code&gt;오리지널 다크 판타지 전투 장면. 와이번 착지의 충돌, 바위 파괴, 날개 압력, 먼지 폭발, 불꽃, 낙석, 꼬리 휩쓸기, 재와 흙 입자, 볼류메트릭 먼지 효과를 강하게 강조한다. 액션의 모든 충격이 무겁고 현실적인 물리감으로 느껴지도록 한다. 극사실적, 초시네마틱.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;변형 C. 영웅적 피날레 강조 버전&lt;/h2&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;h1&gt;이 튜토리얼의 핵심&lt;/h1&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;/li&gt;
&lt;li&gt;캐릭터&lt;/li&gt;
&lt;li&gt;적&lt;/li&gt;
&lt;li&gt;공간&lt;/li&gt;
&lt;li&gt;액션 비트&lt;/li&gt;
&lt;li&gt;카메라&lt;/li&gt;
&lt;li&gt;물리/이펙트&lt;/li&gt;
&lt;li&gt;사운드&lt;/li&gt;
&lt;li&gt;타임코드&lt;/li&gt;
&lt;li&gt;최종 조립&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;멋있는 문장을 한 번에 쓰는 훈련&lt;/b&gt;이 아니라,&lt;br /&gt;&lt;b&gt;영화를 설계하듯 프롬프트를 쌓아 올리는 훈련&lt;/b&gt;입니다.&lt;/p&gt;</description>
      <category>Seedance2</category>
      <author>행복한 수지아빠</author>
      <guid isPermaLink="true">https://javaexpert.tistory.com/1742</guid>
      <comments>https://javaexpert.tistory.com/1742#entry1742comment</comments>
      <pubDate>Thu, 16 Apr 2026 15:50:02 +0900</pubDate>
    </item>
    <item>
      <title>Seedance를 위한 프롬프트 설계 튜터리얼 #1</title>
      <link>https://javaexpert.tistory.com/1741</link>
      <description>&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;실제로 어떤 프롬프트를 넣어 테스트하면 되는지&lt;/li&gt;
&lt;li&gt;다음 단계에서 무엇을 추가해야 하는지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 흐름을 따라가게 만드는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종 프롬프트 미리보기&lt;/p&gt;
&lt;pre id=&quot;code_1776320378840&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;시네마틱하고 하이퍼리얼한 서스펜스 장면을 만들어줘. 배경은 비 오는 밤의 좁은 네온 골목이다. 검은 코트를 입은 한 여성이 골목을 천천히 걸어 들어오다가, 누군가를 기다리는 듯 멈춰 선다. 감정의 중심은 긴장감이다. 그녀는 편하게 서 있는 것이 아니라, 경계하고 있고, 불안하며, 주변을 조용히 살피고 있어야 한다.

핵심 비주얼 포인트:

젖은 아스팔트 위로 길게 번지는 빨간색과 파란색 네온 반사
검은 코트를 입은 여성의 실루엣
비와 습기로 가득한 골목 공기, 빛나는 간판 조명, 축축한 벽면

이 장면은 처음에는 그녀가 그저 스쳐 지나가는 행인처럼 보이게 시작해야 한다. 하지만 점점 그녀가 이 장면의 진짜 중심 인물임이 드러나야 한다. 즉, 누군가를 기다리고 있고, 긴장한 채 주변을 살피며, 감정적으로 무게를 지닌 인물처럼 보여야 한다.

[0&amp;ndash;4초]
와이드 establishing shot.
비 오는 밤의 좁은 네온 골목. 빨간색과 파란색 네온사인이 젖은 아스팔트 위로 길게 반사된다. 축축한 벽, 안개처럼 흐린 습기 어린 공기, 가늘게 내리는 비가 차갑고 불안한 도시 분위기를 만든다. 공간을 가득 채우는 것은 빗소리다.

[4&amp;ndash;8초]
미디엄 와이드 트래킹 샷.
검은 코트를 입은 여성이 골목 안으로 천천히 걸어 들어온다. 카메라는 측면에서 그녀를 따라가며 조심스러운 걸음, 반짝이는 젖은 바닥, 물기 어린 발소리, 뚜렷한 실루엣을 담아낸다. 멀리서 차량 소리가 희미하게 들린다.

[8&amp;ndash;12초]
슬로우 푸시 인 클로즈 샷.
그녀가 멈춰 선다. 카메라는 천천히 가까이 다가가며, 누군가를 기다리듯 주변을 살피는 그녀의 긴장된 표정과 불안한 눈빛을 강조한다. 차가운 네온빛이 그녀의 얼굴, 젖은 머리카락, 코트의 가장자리에 반사된다. 금방 무언가 일어날 것 같은 분위기가 감돈다.

[12&amp;ndash;15초]
타이트한 감정 클로즈업.
그녀는 그대로 멈춰 선 채 조용히 기다린다. 대사는 없다. 들리는 것은 빗소리, 젖은 공간의 잔잔한 주변음, 멀리서 들려오는 차량 소리, 희미한 네온 전기음뿐이다. 그녀의 표정에는 긴장과 불확실성이 남아 있다. 결말은 해소되지 않은 서스펜스로 끝난다.

카메라
시작은 와이드 샷, 그녀가 걸을 때는 측면 트래킹의 미디엄 와이드, 멈춘 뒤에는 천천히 푸시 인. 움직임은 매끄럽고 절제되어 있어야 하며, 오직 긴장감을 쌓는 방향으로만 진행된다.

조명과 분위기
밤비, 빨간색과 파란색 네온을 주요 광원으로 사용. 젖은 바닥과 축축한 벽에 강한 반사가 살아 있어야 한다. 차갑고 깊은 그림자, 도시적이고 서스펜스적인 무드. 로맨틱한 분위기는 피한다.

사운드
계속되는 빗소리, 또렷한 젖은 발소리, 멀리서 희미하게 들리는 차량 소리, 미세한 네온 전기음. 사운드는 비어 있고 절제되어 있으며, 시끄럽지 않아야 한다.

연기
등장인물은 여성 한 명뿐. 그녀는 천천히 걷다가 멈춘다. 몸짓과 자세에서는 경계심 어린 기대감이 느껴져야 한다. 길을 잃고 서 있는 것이 아니라, 분명 누군가를 기다리는 사람처럼 보여야 한다.

스타일
시네마틱, 하이퍼리얼, 디테일한 도시의 밤 공기, 선명한 실루엣 가독성, 젖은 질감, 반사되는 표면, 습기 어린 공기, 현실감 있는 감정 표현, 서스펜스 톤, 8K 디테일.

피해야 할 요소
여러 명의 주요 인물, 로맨스 분위기, 군중, 액션 장면, 코미디, 판타지풍, 밝고 경쾌한 도시 분위기, 불필요한 핸드헬드 흔들림, 편안하거나 여유로운 표정&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/CPlAGCmVuZ0&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/CPlAGCmVuZ0&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=CPlAGCmVuZ0&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bo1iUA/dJMb8U8VaZQ/R5G6X5As5k1Qoqci0t5cbK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=496_142_652_312,https://scrap.kakaocdn.net/dn/ePPJ4/dJMb8QMdAxv/vzBuRXQLOaa9ZgpaDlBsw0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=496_142_652_312,https://scrap.kakaocdn.net/dn/bhU0qT/dJMb9lMc6rn/e1KTC1PhCMPwziuOVyNfO0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=496_142_652_312&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/CPlAGCmVuZ0&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;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;튜토리얼 주제&lt;/h1&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;/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;Seedance 2.0 스타일 테스트에 잘 맞음&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;전체 목표&lt;/h1&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;/li&gt;
&lt;li&gt;시각 요소 고정&lt;/li&gt;
&lt;li&gt;행동과 변화 고정&lt;/li&gt;
&lt;li&gt;카메라 설계&lt;/li&gt;
&lt;li&gt;조명과 분위기 설계&lt;/li&gt;
&lt;li&gt;사운드 설계&lt;/li&gt;
&lt;li&gt;단일 장면 프롬프트 완성&lt;/li&gt;
&lt;li&gt;멀티샷 프롬프트 확장&lt;/li&gt;
&lt;li&gt;변형 테스트 프롬프트 만들기&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;1단계. 로그라인을 장면 문장으로 고정하기&lt;/h1&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;br /&gt;먼저 &lt;b&gt;장면의 기본 골격&lt;/b&gt;만 고정합니다.&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;/li&gt;
&lt;li&gt;장소: 비 내리는 네온 골목&lt;/li&gt;
&lt;li&gt;핵심 행동: 걷다가 멈춘다&lt;/li&gt;
&lt;li&gt;상태: 누군가를 기다린다&lt;/li&gt;
&lt;/ul&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;h2 data-ke-size=&quot;size26&quot;&gt;1차 테스트 프롬프트&lt;/h2&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;비 내리는 네온 골목. 한 여성이 골목 안을 천천히 걸어오다가 멈춰 선다. 
그녀는 누군가를 기다리는 듯 주변을 바라본다. 시네마틱, 극사실적.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;a href=&quot;https://youtu.be/_ukbB13VjE4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/_ukbB13VjE4&lt;/a&gt;&lt;/h2&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=_ukbB13VjE4&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/cBkDn3/dJMb8U8U8Ig/BFpUSv8ku3xLicIsT3TCtK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/o715t/dJMb8U8U8Ih/4TX3PyB4eCKKJqIL5Ycid1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/bpvE9P/dJMb9kT4w1t/7TgTk1x9KAkSxQAQFzifL0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;몬스터헌터월드가이드&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/_ukbB13VjE4&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;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;&amp;ldquo;기다리는 느낌&amp;rdquo;이 어느 정도 전달되는지&lt;/li&gt;
&lt;/ul&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;&amp;ldquo;기다림&amp;rdquo;이 아니라 그냥 산책처럼 보임&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;2단계. 핵심 감정 하나 고정하기&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금 장면은 감정이 아직 열려 있습니다.&lt;br /&gt;이 장면의 중심 감정을 하나 고르겠습니다.&lt;/p&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;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;누군가를 기다린다&amp;rdquo;는 상황과 잘 맞음&lt;/li&gt;
&lt;li&gt;비, 네온, 밤 골목과도 잘 맞음&lt;/li&gt;
&lt;li&gt;카메라와 사운드 설계에 힘을 줌&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이 단계에서 바뀌는 것&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제부터 이 장면은 단순한 대기가 아니라&lt;br /&gt;&lt;b&gt;긴장감 있는 기다림&lt;/b&gt;이 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2차 테스트 프롬프트&lt;/h2&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;비 내리는 네온 골목. 한 여성이 천천히 걸어오다가 멈춰 선다. 
그녀는 누군가를 기다리는 듯 긴장한 표정으로 주변을 살핀다. 
젖은 바닥 위로 네온빛이 번지고, 차가운 공기와 불안한 정적이 감돈다. 
시네마틱, 극사실적.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;a href=&quot;https://youtu.be/_f86fnEOToU&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/_f86fnEOToU&lt;/a&gt;&lt;/h2&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=_f86fnEOToU&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/AFZFS/dJMb9kmejSa/yAtUrDLCLiJ0msBPRnmpbK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=368_76_794_540,https://scrap.kakaocdn.net/dn/b2axx6/dJMb8QenJJW/RJmS30jK9UxNZUjylScAW0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=368_76_794_540,https://scrap.kakaocdn.net/dn/bVdhLQ/dJMb9lk8Hwc/PeKKSx5jq8El2TW7RuZNFk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=368_76_794_540&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;Seedance 튜터리얼 #1-2&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/_f86fnEOToU&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;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;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;포인트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 단계에서는 아직 카메라를 세게 넣지 않습니다.&lt;br /&gt;먼저 &lt;b&gt;감정만 추가했을 때 얼마나 달라지는지&lt;/b&gt; 보는 단계입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;3단계. 핵심 시각 요소 3개 고정하기&lt;/h1&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;이 장면의 핵심 시각 요소 3개를 정하겠습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;시각 요소 3개&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;&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;p data-ke-size=&quot;size16&quot;&gt;이 3개가 이 장면의 화면 정체성입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3차 테스트 프롬프트&lt;/h2&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;비 내리는 좁은 네온 골목. 
젖은 아스팔트 위로 붉고 푸른 네온빛이 길게 반사된다. 
검은 코트를 입은 한 여성이 골목 안을 천천히 걸어오다가 멈춰 선다. 
빗물이 공기 중에 떠 있고, 축축한 골목 벽과 간판 빛이 그녀의 실루엣을 드러낸다. 
그녀는 긴장한 채 누군가를 기다리는 듯 서 있다. 
시네마틱, 극사실적, 디테일한 도시 야간 분위기.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;a href=&quot;https://youtu.be/2y7pS_fmkGU&quot;&gt;https://youtu.be/2y7pS_fmkGU&lt;/a&gt;&lt;/h2&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=2y7pS_fmkGU&quot; data-video-width=&quot;0&quot; data-video-height=&quot;0&quot; data-video-origin-width=&quot;0&quot; data-video-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;Seedance 튜터리얼 #1-3&quot; data-video-thumbnail=&quot;&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/2y7pS_fmkGU&quot; width=&quot;0&quot; height=&quot;0&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;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=2y7pS_fmkGU&quot; data-video-width=&quot;0&quot; data-video-height=&quot;0&quot; data-video-origin-width=&quot;0&quot; data-video-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;Seedance 튜터리얼 #1-3&quot; data-video-thumbnail=&quot;&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/2y7pS_fmkGU&quot; width=&quot;0&quot; height=&quot;0&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;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;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이 단계의 핵심&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 장면이 더 구체적인 &amp;ldquo;그림&amp;rdquo;으로 바뀝니다.&lt;br /&gt;이전까지는 상황 설명이었다면, 이제부터는 &lt;b&gt;화면 설계&lt;/b&gt;입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;4단계. 주요 행동 1개와 장면 변화 1개 정하기&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영상은 정지 이미지가 아니기 때문에,&lt;br /&gt;장면 안에서 작은 변화가 있어야 합니다.&lt;/p&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;h2 data-ke-size=&quot;size26&quot;&gt;장면 변화&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;지나가는 인물처럼 보이던 상태 &amp;rarr; 기다리는 주인공처럼 부각되는 상태&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 변화가 중요합니다.&lt;br /&gt;장면의 시작과 끝이 달라져야 영상이 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4차 테스트 프롬프트&lt;/h2&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;비 내리는 좁은 네온 골목. 
검은 코트를 입은 한 여성이 골목 끝에서 천천히 걸어온다. 
처음에는 도시 속을 지나가는 인물처럼 보이지만, 
그녀가 멈춰 서는 순간 긴장한 표정과 시선이 강조되며 누군가를 기다리는 주인공처럼 느껴진다. 
젖은 아스팔트 위 네온 반사, 빗물 어린 공기, 차가운 간판 불빛. 시네마틱, 극사실적.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;a href=&quot;https://youtu.be/Zqj9KJM2SOo&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/Zqj9KJM2SOo&lt;/a&gt;&lt;/h2&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=Zqj9KJM2SOo&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/kBa4c/dJMb85vQyQ4/1keLQ6xZPaNRohm4azRMTk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=604_170_774_356,https://scrap.kakaocdn.net/dn/e1Flg/dJMb84X0ibW/Y3Dm4WxomliJLHsSG7Lw60/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=604_170_774_356,https://scrap.kakaocdn.net/dn/gs0Zr/dJMb82MEEj3/ORZcjHljml8Mi90karTOz0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=604_170_774_356&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;Seedance 튜터리얼 #1-4&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/Zqj9KJM2SOo&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;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;&amp;ldquo;걸어온다 &amp;rarr; 멈춘다&amp;rdquo;의 변화가 있는지&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;h1&gt;5단계. 카메라 설계하기&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 카메라를 넣습니다.&lt;br /&gt;카메라는 멋있어서 넣는 것이 아니라 &lt;b&gt;감정을 전달하기 위해&lt;/b&gt; 넣습니다.&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;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;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;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5차 테스트 프롬프트&lt;/h2&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;비 내리는 좁은 네온 골목. 
카메라는 검은 코트를 입은 한 여성을 옆에서 따라가며 그녀가 천천히 걸어오는 모습을 미디엄 와이드샷으로 보여준다. 
그녀가 멈춰 서는 순간 카메라는 천천히 더 가까워지며 긴장한 표정과 시선을 강조한다. 
젖은 아스팔트에는 붉고 푸른 네온빛이 길게 반사되고, 빗물 어린 공기와 차가운 간판 조명이 그녀의 실루엣을 감싼다. 
누군가를 기다리는 긴장감 있는 분위기, 시네마틱, 극사실적, 8k.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;a href=&quot;https://youtu.be/xk415thzuQw&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/xk415thzuQw&lt;/a&gt;&lt;/h2&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=xk415thzuQw&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/cQxfly/dJMb9lk8Hzk/IP0mmlvTCLWmpqd7H3BYa0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=688_140_778_238,https://scrap.kakaocdn.net/dn/b7bIo5/dJMb9jOouHZ/1Z11BkgyARlGwl9aankvmK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=688_140_778_238,https://scrap.kakaocdn.net/dn/QHEMh/dJMb8VNwYR4/CIFIPuveio6uMn2kd1p7a1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=688_140_778_238&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/xk415thzuQw&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;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;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;6단계. 조명과 분위기 설계하기&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 장면의 조명 문법을 고정합니다.&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;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;h2 data-ke-size=&quot;size26&quot;&gt;6차 테스트 프롬프트&lt;/h2&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;비 내리는 밤의 좁은 네온 골목. 
붉고 푸른 네온 간판 빛이 젖은 아스팔트와 골목 벽면에 차갑게 반사된다. 
검은 코트를 입은 한 여성이 골목을 천천히 걸어오고, 카메라는 옆에서 따라간다. 
그녀가 멈춰 서는 순간 카메라는 천천히 가까워지며 불안한 시선과 긴장한 표정을 드러낸다. 
차가운 네온 조명, 축축한 공기, 깊은 그림자, 불안한 도시 밤의 분위기. 
시네마틱, 극사실적, 8k.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;a href=&quot;https://youtu.be/D2JQfF-jGWw&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/D2JQfF-jGWw&lt;/a&gt;&lt;/h2&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=D2JQfF-jGWw&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bjjzWy/dJMb8SpJwla/3eUdIKvRI76h1YJVJW6EH0/img.jpg?width=480&amp;amp;height=360&amp;amp;face=206_117_291_210,https://scrap.kakaocdn.net/dn/bjuTWp/dJMb8XR7eUH/QBU32aLWSPrhlswvk7mO8k/img.jpg?width=480&amp;amp;height=360&amp;amp;face=206_117_291_210,https://scrap.kakaocdn.net/dn/bumGdY/dJMb9lk8HAY/K0HFUKL6h2UikXtI0KApV0/img.jpg?width=480&amp;amp;height=360&amp;amp;face=206_117_291_210&quot; data-video-width=&quot;480&quot; data-video-height=&quot;360&quot; data-video-origin-width=&quot;480&quot; data-video-origin-height=&quot;360&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/D2JQfF-jGWw&quot; width=&quot;480&quot; height=&quot;360&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;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;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;7단계. 사운드 설계하기&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Seedance류 모델에서는 사운드가 중요하므로&lt;br /&gt;지금부터는 사운드도 구조적으로 넣습니다.&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;주요 소리 1개: &lt;b&gt;빗소리&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;보조 소리 1개: &lt;b&gt;젖은 바닥을 밟는 발걸음&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;보조 소리 1개: &lt;b&gt;멀리서 지나가는 차량의 희미한 소리&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 조합이 좋습니다.&lt;br /&gt;골목의 외로움과 긴장을 같이 만듭니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7차 테스트 프롬프트&lt;/h2&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;비 내리는 밤의 좁은 네온 골목. 
붉고 푸른 네온 간판 빛이 젖은 아스팔트와 골목 벽에 차갑게 번진다. 
검은 코트를 입은 한 여성이 골목을 천천히 걸어오고, 카메라는 옆에서 따라간다. 
그녀가 멈춰 서는 순간 카메라는 천천히 더 가까워지며 긴장한 표정과 누군가를 기다리는 시선을 강조한다. 
빗소리가 지속적으로 들리고, 젖은 바닥을 밟는 발걸음 소리가 또렷하게 울리며, 
멀리서 지나가는 차량 소리가 희미하게 섞인다. 
차갑고 불안한 도시 밤의 분위기, 시네마틱, 극사실적, 8k.&lt;/code&gt;&lt;/pre&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;span style=&quot;background-color: #f9f9f9; color: #065fd4; text-align: start;&quot;&gt;&lt;a href=&quot;https://youtu.be/-1oauJSA05M&quot;&gt;https://youtu.be/-1oauJSA05M&lt;/a&gt;&lt;/span&gt;&lt;/h2&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=-1oauJSA05M&quot; data-video-width=&quot;0&quot; data-video-height=&quot;0&quot; data-video-origin-width=&quot;0&quot; data-video-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;Seedance 20&quot; data-video-thumbnail=&quot;&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/-1oauJSA05M&quot; width=&quot;0&quot; height=&quot;0&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;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=-1oauJSA05M&quot; data-video-width=&quot;0&quot; data-video-height=&quot;0&quot; data-video-origin-width=&quot;0&quot; data-video-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;Seedance 20&quot; data-video-thumbnail=&quot;&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/-1oauJSA05M&quot; width=&quot;0&quot; height=&quot;0&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;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;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;8단계. 단일 장면용 완성 프롬프트 만들기&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 지금까지의 설계를 한데 묶어서&lt;br /&gt;&lt;b&gt;단일 연속숏용 완성 프롬프트&lt;/b&gt;로 정리합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;단일 장면 완성 프롬프트&lt;/h2&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;비 내리는 밤의 좁은 네온 골목. 
붉고 푸른 네온 간판 빛이 젖은 아스팔트와 축축한 골목 벽에 길게 반사된다. 
검은 코트를 입은 한 여성이 골목 안을 천천히 걸어오고, 
카메라는 그녀를 옆에서 따라가는 미디엄 와이드샷으로 움직인다. 
그녀가 멈춰 서는 순간 카메라는 천천히 더 가까워지며 긴장한 표정과 누군가를 기다리는 불안한 시선을 강조한다. 
빗물 어린 공기, 차가운 그림자, 선명한 실루엣, 도시의 축축하고 불안한 밤 분위기. 
지속적인 빗소리, 젖은 바닥을 밟는 발걸음, 멀리서 지나가는 차량 소리가 공간감을 만든다. 
긴장감 있는 시네마틱 장면, 극사실적, 8k.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;a href=&quot;https://youtu.be/GDVCZR_pGQQ&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/GDVCZR_pGQQ&lt;/a&gt;&lt;/h2&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=GDVCZR_pGQQ&quot; data-video-width=&quot;0&quot; data-video-height=&quot;0&quot; data-video-origin-width=&quot;0&quot; data-video-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;Seedance 20&quot; data-video-thumbnail=&quot;&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/GDVCZR_pGQQ&quot; width=&quot;0&quot; height=&quot;0&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;h2 data-ke-size=&quot;size26&quot;&gt;이 프롬프트의 역할&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 지금까지 만든 설계를 가장 안정적으로 묶은 버전입니다.&lt;br /&gt;먼저 이걸 돌려본 다음, 문제를 확인하고 멀티샷으로 넘어가는 것이 좋습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;9단계. 멀티샷 15초 버전으로 확장하기&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 같은 장면을 멀티샷 구조로 확장해보겠습니다.&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;0&amp;ndash;4초: 공간과 인물 소개&lt;/li&gt;
&lt;li&gt;4&amp;ndash;8초: 걷는 흐름&lt;/li&gt;
&lt;li&gt;8&amp;ndash;12초: 멈춤과 긴장 강조&lt;/li&gt;
&lt;li&gt;12&amp;ndash;15초: 기다리는 감정 마무리&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;멀티샷 튜토리얼 프롬프트&lt;/h2&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;[0-4초]: 
와이드 establishing shot, 
비 내리는 밤의 좁은 네온 골목. 붉고 푸른 네온빛이 젖은 아스팔트 위로 길게 반사되고, 
축축한 골목 벽과 간판이 차가운 도시 분위기를 만든다. 
빗소리가 공간을 채운다.

[4-8초]: 
미디엄샷, 검은 코트를 입은 한 여성이 골목 안을 천천히 걸어온다. 
카메라는 인물을 옆에서 따라가며 젖은 바닥 위 발걸음과 흔들리는 실루엣을 보여준다. 
멀리서 차량 소리가 희미하게 들린다.

[8-12초]: 
클로즈업으로 천천히 전환, 
그녀가 멈춰 서는 순간 카메라가 가까워지며 긴장한 표정과 주변을 살피는 시선을 강조한다. 
차가운 네온빛이 얼굴 윤곽과 젖은 머리카락에 반사된다.

[12-15초]: 
타이트한 클로즈업 또는 감정 강조 컷, 
그녀는 아무 말 없이 누군가를 기다리며 서 있고, 
빗소리와 도시의 먼 소리만 남는다. 
불안하고 긴장감 있는 정적. 시네마틱, 극사실적, 8k.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;a href=&quot;https://youtu.be/KpJRjefNTyE&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/KpJRjefNTyE&lt;/a&gt;&lt;/h2&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=KpJRjefNTyE&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bN4IuB/dJMb8RRTqTV/8Tnz9ClmYtY7TUe7tVYyBk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=576_124_806_374,https://scrap.kakaocdn.net/dn/bcPBXf/dJMb8U8U8WL/xrvXIDEK6rwuqgkgy8dS2k/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=576_124_806_374,https://scrap.kakaocdn.net/dn/bXDQfc/dJMb8WeBceQ/byK6WBZQSudKo5osVfT7A1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=576_124_806_374&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/KpJRjefNTyE&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;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;와이드 &amp;rarr; 미디엄 &amp;rarr; 클로즈업 흐름이 자연스러운지&lt;/li&gt;
&lt;li&gt;감정이 후반으로 갈수록 더 진해지는지&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;10단계. 테스트용 변형 프롬프트 만들기&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제부터는 이 장면을 기반으로&lt;br /&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;변형 A. 카메라 강조 테스트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카메라 차이만 보고 싶을 때&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;비 내리는 밤의 좁은 네온 골목. 
붉고 푸른 네온빛이 젖은 아스팔트에 반사된다. 
검은 코트를 입은 한 여성이 천천히 걸어오다가 멈춰 선다. 
카메라는 그녀를 정면에서 아주 천천히 돌리 인하며 따라가고, 
멈춰 서는 순간 긴장한 표정과 눈빛을 강조한다. 
빗소리, 젖은 발걸음, 멀리서 지나가는 차량 소리. 차갑고 불안한 도시 밤 분위기, 시네마틱, 극사실적, 8k.&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a href=&quot;https://youtu.be/R0G66imc81A&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/R0G66imc81A&lt;/a&gt;&lt;/h3&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=R0G66imc81A&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/eTzJG/dJMb8UHQJmS/7x8TNUxa1Ux18jL44P6Kqk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=588_120_778_326,https://scrap.kakaocdn.net/dn/bKWAct/dJMb8Rj3wf6/mFMx2fKhvkLtFPVehoaQG1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=588_120_778_326,https://scrap.kakaocdn.net/dn/qPNVQ/dJMb9g5cKaG/hKWlIwmajPpnc7mWXjtsRK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=588_120_778_326&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/R0G66imc81A&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;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;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;변형 B. 조명/분위기 강조 테스트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분위기만 바꾸고 싶을 때&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;안개 섞인 비가 내리는 밤의 도시 골목길. 
보라색과 청록색 네온빛이 젖은 아스팔트와 벽면에 부드럽게 번진다. 
검은 코트를 입은 한 인물이 천천히 걸어오다 잠시 멈춰 선다. 
카메라는 인물을 옆에서 부드럽게 따라가며 자연스럽게 장면을 담는다. 
차가운 안개, 흐릿한 간판빛, 젖은 공기, 몽환적이고 차분한 도시 밤의 분위기. 
잔잔한 빗소리와 희미한 도시 배경음. 시네마틱, 극사실적, 고급 영화 같은 질감.&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a href=&quot;https://youtu.be/5RvZSLJ4zWI&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/5RvZSLJ4zWI&lt;/a&gt;&lt;/h3&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=5RvZSLJ4zWI&quot; data-video-width=&quot;0&quot; data-video-height=&quot;0&quot; data-video-origin-width=&quot;0&quot; data-video-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;몬스터헌터월드가이드&quot; data-video-thumbnail=&quot;&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/5RvZSLJ4zWI&quot; width=&quot;0&quot; height=&quot;0&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;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;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;변형 C. 사운드 강조 테스트&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;비 내리는 밤의 좁은 네온 골목. 붉고 푸른 네온빛이 젖은 바닥 위로 길게 번진다. 검은 코트를 입은 한 여성이 골목을 천천히 걸어오다가 멈춰 선다. 카메라는 그녀를 옆에서 따라가다 멈추는 순간 천천히 가까워진다. 강하게 들리는 빗소리, 젖은 바닥을 누르는 발걸음, 멀리서 미끄러지듯 지나가는 차량의 소리, 간판 전기음의 희미한 웅웅거림이 긴장감을 키운다. 차갑고 불안한 도시 밤, 시네마틱, 극사실적, 8k.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;a href=&quot;https://youtu.be/_cCd5QfLRjU&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/_cCd5QfLRjU&lt;/a&gt;&lt;/h3&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=_cCd5QfLRjU&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/28Nlm/dJMb9effyzM/Z8mP04qweLBkFdqWL3AZ61/img.jpg?width=480&amp;amp;height=360&amp;amp;face=237_124_275_165,https://scrap.kakaocdn.net/dn/XedoC/dJMb9lMc55e/KdIuNTx8HIZl1Tc10M1CI1/img.jpg?width=480&amp;amp;height=360&amp;amp;face=237_124_275_165,https://scrap.kakaocdn.net/dn/IFIzd/dJMb9kmelH3/geaef1NuIRE6vDnEdvQVkK/img.jpg?width=480&amp;amp;height=360&amp;amp;face=237_124_275_165&quot; data-video-width=&quot;480&quot; data-video-height=&quot;360&quot; data-video-origin-width=&quot;480&quot; data-video-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;튜터리얼 #1-10-C&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/_cCd5QfLRjU&quot; width=&quot;480&quot; height=&quot;360&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;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;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;이 튜토리얼의 핵심 정리&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식으로 연습하면 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;흐름&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;로그라인만 먼저 정한다&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;감정을 하나 고른다&lt;/li&gt;
&lt;li&gt;눈에 보일 요소 3개를 고른다&lt;/li&gt;
&lt;li&gt;행동과 변화 1개를 정한다&lt;/li&gt;
&lt;li&gt;카메라에 이유를 붙인다&lt;/li&gt;
&lt;li&gt;조명 톤을 정한다&lt;/li&gt;
&lt;li&gt;사운드를 붙인다&lt;/li&gt;
&lt;li&gt;단일 장면으로 먼저 완성한다&lt;/li&gt;
&lt;li&gt;멀티샷으로 확장한다&lt;/li&gt;
&lt;li&gt;변형 프롬프트로 비교 테스트한다&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;바로 따라 하기 좋은 실전 루틴&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 장면으로 실제 연습할 때는 아래 순서가 좋습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1차 생성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1단계 프롬프트 사용&lt;br /&gt;&amp;rarr; 기본 상황이 잡히는지 확인&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2차 생성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3단계 프롬프트 사용&lt;br /&gt;&amp;rarr; 시각 요소가 살아나는지 확인&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3차 생성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5단계 프롬프트 사용&lt;br /&gt;&amp;rarr; 카메라가 반영되는지 확인&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4차 생성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7단계 프롬프트 사용&lt;br /&gt;&amp;rarr; 사운드가 장면을 살리는지 확인&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5차 생성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단일 장면 완성 프롬프트 사용&lt;br /&gt;&amp;rarr; 전체 완성도 확인&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6차 생성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멀티샷 프롬프트 사용&lt;br /&gt;&amp;rarr; 컷 구성 확인&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7차 생성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변형 A/B/C 비교&lt;br /&gt;&amp;rarr; 어떤 요소가 가장 결과에 영향이 큰지 확인&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;가장 중요한 포인트&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 튜토리얼에서 중요한 건&lt;br /&gt;&lt;b&gt;처음부터 완벽한 프롬프트를 쓰는 것&lt;/b&gt;이 아니라,&lt;br /&gt;&lt;b&gt;장면을 단계별로 설계하고 어떤 요소가 결과를 바꾸는지 배우는 것&lt;/b&gt;입니다.&lt;/p&gt;</description>
      <category>Seedance2</category>
      <author>행복한 수지아빠</author>
      <guid isPermaLink="true">https://javaexpert.tistory.com/1741</guid>
      <comments>https://javaexpert.tistory.com/1741#entry1741comment</comments>
      <pubDate>Thu, 16 Apr 2026 09:47:54 +0900</pubDate>
    </item>
    <item>
      <title>Seedance 2.0 손그림 애니메이션 테스트</title>
      <link>https://javaexpert.tistory.com/1740</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/CoPB9huRPBE&quot;&gt;https://youtu.be/CoPB9huRPBE&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=CoPB9huRPBE&quot; data-video-width=&quot;0&quot; data-video-height=&quot;0&quot; data-video-origin-width=&quot;0&quot; data-video-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;Seedance 2.0 손그림 애니메이션 테스트&quot; data-video-thumbnail=&quot;&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/CoPB9huRPBE&quot; width=&quot;0&quot; height=&quot;0&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;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=CoPB9huRPBE&quot; data-video-width=&quot;0&quot; data-video-height=&quot;0&quot; data-video-origin-width=&quot;0&quot; data-video-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;Seedance 2.0 손그림 애니메이션 테스트&quot; data-video-thumbnail=&quot;&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/CoPB9huRPBE&quot; width=&quot;0&quot; height=&quot;0&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;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=CoPB9huRPBE&quot; data-video-width=&quot;0&quot; data-video-height=&quot;0&quot; data-video-origin-width=&quot;0&quot; data-video-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;Seedance 2.0 손그림 애니메이션 테스트&quot; data-video-thumbnail=&quot;&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/CoPB9huRPBE&quot; width=&quot;0&quot; height=&quot;0&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2072&quot; data-origin-height=&quot;1138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DVhbo/dJMcajhyfLw/KMhpgQliKunV4l2kklSgw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DVhbo/dJMcajhyfLw/KMhpgQliKunV4l2kklSgw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DVhbo/dJMcajhyfLw/KMhpgQliKunV4l2kklSgw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDVhbo%2FdJMcajhyfLw%2FKMhpgQliKunV4l2kklSgw0%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;2072&quot; height=&quot;1138&quot; data-origin-width=&quot;2072&quot; data-origin-height=&quot;1138&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1776299899637&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;프롬프트 정리

형식
- 15초
- 스타일화된 2D 손그림 애니메이션
- 머리 위 시점 해전
- 오래된 노란색 줄무늬 공책 용지 배경 유지
- 파란 가로선, 빨간 왼쪽 여백선 항상 보이기

비주얼 규칙
- 처음부터 끝까지 같은 공책 종이 세계 유지
- 미세한 종이 질감, 연필 자국, 잉크 획 강조
- 실사 금지 / 3D 금지 / 사실적 얼굴 금지 / 현대적 물건 금지
- 내레이션, 자막 없음

핵심 콘셉트
- 어린아이 낙서 해전 &amp;rarr; 전설적 삽화 해전 &amp;rarr; 다시 낙서로 붕괴
- 상상력이 종이를 장악하는 듯한 점진적이고 마법 같은 에스컬레이션

전투 설정
- 빨강 vs 파랑 두 해군 세력
- 판옥선, 노 젓는 배, 깃발, 화살, 화포 등장
- 중심에는 거북선
- 초반엔 조잡한 낙서, 후반엔 세밀한 잉크 삽화로 발전

주요 인물
- 이순신 장군을 상징하는 지휘관
- 사실적 초상 대신 영웅적 실루엣 중심
- 후반으로 갈수록 더 위엄 있고 선명한 손그림 표현

시간대별 진행
- 0~3초: 단순한 공책 낙서 해전 시작, 양측 함대 전진
- 3~7초: 첫 충돌, 화살&amp;middot;화포&amp;middot;함선 충돌, 디테일 업그레이드 시작
- 7~11초: 가장 웅장한 삽화형 해전 완성, 거북선 중심 전투 절정
- 11~15초: 결정적 돌진 후 충격, 모든 것이 다시 낙서와 선 조각으로 붕괴

움직임 톤
- 부드럽고 유동적
- 충격은 날카롭고 리드미컬
- 최소 24fps 느낌
- 머리 위 시점에서 읽기 쉬운 실루엣 유지

감정 흐름
- 장난스럽고 호기심 어린 시작
- 점점 비장하고 영웅적으로 확장
- 전설적 절정 후
- 무너진 뒤 이상하게 고요한 여운&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1776300171214&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;이 프롬프트에서 배울 수 있는 점

1. 세계관 규칙을 먼저 고정해야 한다

- 가장 먼저 &amp;ldquo;오래된 공책 용지 위의 2D 손그림 세계&amp;rdquo;라는 룰을 강하게 고정했습니다.
- 그래서 모델이 중간에 실사풍, 3D풍, 다른 배경으로 흔들릴 가능성을 줄입니다.
- 좋은 프롬프트는 보통 무엇을 만들지보다 먼저 어떤 세계 안에서만 움직일지를 정합니다.

2. 금지 조건이 결과 안정성에 큰 영향을 준다

- 실사 없음, 3D 없음, 사실적 얼굴 없음, 현대적 물건 없음, 자막 없음 같은 조건은 단순한 부가 설명이 아니라 스타일 붕괴 방지 장치입니다.
- 특히 영상 생성에서는 원하는 요소보다 원하지 않는 요소를 명확히 막는 것이 중요합니다.

3. 핵심 아이디어는 한 문장으로 잡혀 있어야 한다

- 이 프롬프트의 중심은 &amp;ldquo;어린아이 낙서 해전이 전설적 삽화 해전으로 커졌다가 다시 낙서로 무너진다&amp;rdquo;입니다.
- 이 한 줄이 전체 연출, 움직임, 감정, 클라이맥스를 전부 묶어줍니다.
- 좋은 프롬프트는 세부가 많아도 중심 개념은 단순해야 합니다.

4. 변화는 갑작스럽게가 아니라 단계적으로 설계해야 한다

- 초반 낙서 &amp;rarr; 중반 디테일 강화 &amp;rarr; 후반 삽화 완성 &amp;rarr; 마지막 붕괴
- 이런 식으로 변화의 단계가 명확합니다.
- 생성형 영상에서는 변화가 뜬금없이 튀는 경우가 많은데, 이 프롬프트는 점진적 에스컬레이션으로 그 문제를 줄이고 있습니다.

5. 시간 구간을 나누면 영상이 훨씬 잘 통제된다

- 0~3초
- 3~7초
- 7~11초
- 11~15초

- 이렇게 나누면 모델이 장면 전개를 더 잘 따라갑니다.
- 특히 15초 영상은 한 덩어리로 쓰기보다 구간별 사건 배치를 하는 편이 더 유리합니다.

6. 액션만 쓰지 말고 스타일 변화도 같이 써야 한다

- 단순히 &amp;ldquo;배가 싸운다&amp;rdquo;가 아니라
- 충돌할수록 선이 강해지고
- 갑옷 실루엣이 생기고
- 물보라와 연기가 잉크처럼 번지고
- 거북선 디테일이 살아난다고 적었습니다.

- 즉, 이 프롬프트는 서사 진행과 비주얼 진화를 동시에 쓰고 있습니다.
- 이 점이 매우 중요합니다.

7. 주인공은 얼굴보다 상징으로 잡는 게 안전할 때가 있다

- 이순신 장군을 직접 사실적으로 묘사하지 않고
- 상징적이고 영웅적인 지휘관 실루엣으로 처리했습니다.
- 이렇게 하면 스타일 유지가 쉬워지고, 얼굴 디테일 때문에 전체 톤이 깨지는 문제를 줄일 수 있습니다.

8. 배경도 움직이는 요소처럼 설계할 수 있다

- 이 프롬프트에서 바다는 단순한 배경이 아니라
- 공책 줄
- 종이 질감
- 잉크 번짐
- 물결선
- 종이 떨림까지 포함한 반응하는 무대입니다.

- 좋은 영상 프롬프트는 배경을 정지된 배경으로 두지 않고 연출의 일부로 만듭니다.

9. 클라이맥스 이후의 마무리도 중요하다

- 많은 프롬프트가 절정까지만 강하고 끝맺음이 약합니다.
- 그런데 여기서는 마지막에 전쟁이 다시 낙서로 붕괴하면서 여운 있는 엔딩 구조를 줍니다.
- 시작과 끝이 연결되기 때문에 짧은 영상인데도 완결감이 생깁니다.

10. 분위기 흐름을 따로 적는 것이 좋다

- 장난스러움
- 호기심
- 비장함
- 영웅성
- 신화적 절정
- 이상한 고요함

- 이렇게 감정 곡선을 적어두면 단순히 사건만 있는 영상이 아니라 톤이 있는 영상이 됩니다.

11. 읽기 쉬운 실루엣이라는 조건이 중요하다

- 머리 위 시점 전투는 복잡해지기 쉽습니다.
- 그래서 이 프롬프트는 계속 읽기 쉬운 실루엣, 명확한 구분, 중심 오브젝트인 거북선 강조를 넣고 있습니다.
- 즉, 멋진 설정보다 먼저 한눈에 이해되는 화면을 챙긴 것입니다.

12. 좋은 프롬프트는 무엇을 보여줄지와 어떻게 보여줄지를 같이 쓴다

- 무엇: 거북선 해전, 이순신 상징 지휘관, 붕괴하는 낙서 전쟁
- 어떻게: 공책 종이, 손그림 2D, 점진적 진화, 머리 위 시점, 잉크 질감, 리드미컬한 충격

- 이 둘을 함께 설계해야 결과가 강해집니다.
- 둘 중 하나만 있으면 결과가 약해질 수 있습니다.

한 줄 정리

좋은 영상 프롬프트는 소재만 설명하는 것이 아니라, 세계관 규칙, 시간 구조, 비주얼 진화, 감정 흐름까지 함께 설계하는 것입니다.&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Seedance2</category>
      <author>행복한 수지아빠</author>
      <guid isPermaLink="true">https://javaexpert.tistory.com/1740</guid>
      <comments>https://javaexpert.tistory.com/1740#entry1740comment</comments>
      <pubDate>Thu, 16 Apr 2026 09:43:31 +0900</pubDate>
    </item>
    <item>
      <title>Seedance 2.0 프롬프트, 예쁜 문장보다 중요한 것은 구조다</title>
      <link>https://javaexpert.tistory.com/1738</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;AI 영상 생성이 점점 쉬워졌다고들 말합니다. 텍스트 몇 줄만 입력하면 그럴듯한 장면이 나오고, 짧은 숏폼 영상도 빠르게 뽑아낼 수 있습니다. 하지만 실제로 여러 번 만들어본 사람이라면 금방 느끼게 됩니다. &lt;b&gt;아이디어가 좋아도 결과가 쉽게 흔들리고, 화면이 깨지고, 인물이 달라지고, 카메라가 뜻대로 움직이지 않는다는 것&lt;/b&gt;을요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 초보자들이 여기서 이렇게 생각합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;프롬프트를 더 길게 써야 하나?&amp;rdquo;&lt;br /&gt;&amp;ldquo;더 멋있는 표현을 넣어야 하나?&amp;rdquo;&lt;br /&gt;&amp;ldquo;cinematic, epic, stunning 같은 단어를 더 많이 넣어야 하나?&amp;rdquo;&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;제가 정리한 핵심은 단순합니다. Seedance 2.0은 단순한 텍스트 입력형 영상 생성기가 아니라, &lt;b&gt;이미지&amp;middot;영상&amp;middot;오디오&amp;middot;텍스트를 함께 다루는 멀티모달 연출 도구&lt;/b&gt;에 가깝습니다. 그래서 결과를 안정적으로 만들고 싶다면, 시처럼 쓰기보다 &lt;b&gt;촬영감독처럼 지시해야&lt;/b&gt; 합니다.&amp;nbsp;&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;왜 Seedance 프롬프트는 일반 텍스트 프롬프트와 다르게 접근해야 할까&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Seedance 계열 프롬프트에서 중요한 건 &amp;ldquo;무엇이 멋져 보이는가&amp;rdquo;가 아니라 &amp;ldquo;모델이 무엇을 오해하지 않게 할 것인가&amp;rdquo;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 아래 두 문장을 비교해보겠습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;좋지 않은 예&lt;/h3&gt;
&lt;pre class=&quot;gml&quot;&gt;&lt;code&gt;A beautiful cinematic woman in an epic room with amazing lighting
&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;/li&gt;
&lt;li&gt;무엇을 하고 있는지 알 수 없습니다.&lt;/li&gt;
&lt;li&gt;카메라가 움직이는지 고정인지 알 수 없습니다.&lt;/li&gt;
&lt;li&gt;조명이 어떤 종류인지 알 수 없습니다.&lt;/li&gt;
&lt;li&gt;&amp;ldquo;beautiful&amp;rdquo;, &amp;ldquo;cinematic&amp;rdquo;, &amp;ldquo;epic&amp;rdquo;은 감상어이지 지시어가 아닙니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;더 좋은 예&lt;/h3&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;[Subject]
late 20s woman, short dark curls, small silver hoop earring, black turtleneck

[Action]
she slowly turns toward the window and pauses

[Camera]
slow push-in from medium shot, stable camera

[Style]
golden hour lighting, cinematic film tone, 35mm, warm amber tone

[Constraints]
avoid jitter, avoid bent limbs, maintain face consistency, avoid temporal flicker
&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;/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;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;Seedance 프롬프트의 핵심 구조: 5-Layer Prompt Stack&lt;/h2&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;Subject&lt;/li&gt;
&lt;li&gt;Action&lt;/li&gt;
&lt;li&gt;Camera&lt;/li&gt;
&lt;li&gt;Style&lt;/li&gt;
&lt;li&gt;Constraints&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 순서는 단순한 목록이 아니라, 모델이 장면을 이해하는 우선순위를 잡아주는 장치로 볼 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) Subject: 화면의 중심을 먼저 고정하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 먼저 해야 할 일은 &lt;b&gt;무엇이 프레임의 중심인가&lt;/b&gt;를 확실히 적는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 &amp;ldquo;a woman&amp;rdquo;이라고만 쓰면 모델은 평균적인 여성을 상상합니다. 그런데 아래처럼 구체화하면 결과가 훨씬 안정됩니다.&lt;/p&gt;
&lt;pre class=&quot;ceylon&quot;&gt;&lt;code&gt;late 20s woman, tight dark curls, small silver hoop earring, fitted black turtleneck, pale skin, calm expression
&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;/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;p data-ke-size=&quot;size16&quot;&gt;이런 세부를 적는 이유는 &amp;ldquo;더 멋있게 보이게 하려는 것&amp;rdquo;이 아니라, &lt;b&gt;모델이 빈칸을 마음대로 채우지 못하게 하려는 것&lt;/b&gt;입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) Action: 감정이 아니라 움직임을 지시하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 영상에서 많은 분들이 자주 하는 실수가 있습니다. 감정을 써놓고 동작을 생략하는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들면 이런 식입니다.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;she looks sad
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 사람이 보면 이해할 수 있지만, 모델은 애매하게 받아들일 수 있습니다. 반면 아래처럼 바꾸면 훨씬 명확해집니다.&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;she lowers her head slowly, pauses, then reaches toward the old photo with hesitation
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &amp;ldquo;슬프다&amp;rdquo;를 직접 말하기보다 &lt;b&gt;슬픔이 드러나는 행동&lt;/b&gt;을 쓰는 편이 좋습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) Camera: 피사체 움직임과 카메라 움직임을 분리하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분이 실제 품질 차이를 크게 만듭니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 이런 문장은 흔들리기 쉽습니다.&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;spinning camera around a dancing person
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;누가 도는 걸까요? 카메라인가요, 사람인가요, 둘 다인가요? 모델은 이 문장을 모호하게 처리할 가능성이 큽니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 좋은 방식은 분리하는 것입니다.&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;subject action: the dancer spins slowly
camera: fixed framing
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹은&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;subject action: the dancer remains centered and turns gently
camera: slow orbit around the subject
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 쓰면 &lt;b&gt;무엇이 움직이고 무엇이 고정되는지&lt;/b&gt;가 분명해집니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) Style: 특히 조명을 구체적으로 적기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 분들이 style을 &amp;ldquo;cinematic&amp;rdquo; 같은 한 단어로 끝냅니다. 하지만 이건 너무 추상적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Seedance 스타일 프롬프트에서는 조명이 특히 중요하게 작동하는 경우가 많습니다. 예를 들면 아래와 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;golden hour&lt;/li&gt;
&lt;li&gt;rim light&lt;/li&gt;
&lt;li&gt;overcast daylight&lt;/li&gt;
&lt;li&gt;soft key from 45 degrees&lt;/li&gt;
&lt;li&gt;volumetric fog&lt;/li&gt;
&lt;li&gt;motivated lighting from practical source&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 &amp;ldquo;멋진 조명&amp;rdquo;이 아니라, &lt;b&gt;빛이 어디서 어떻게 들어오는지&lt;/b&gt;를 적어야 합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5) Constraints: 무엇을 망치지 말아야 하는지 미리 적기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 결과는 멋진 형용사보다 &lt;b&gt;실패 방지 문구&lt;/b&gt;에서 나오는 경우가 많습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적인 예시는 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;avoid jitter
avoid bent limbs
avoid identity drift
avoid temporal flicker
maintain face consistency
stable picture
sharp clarity
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 문구는 특히 인물, 액션, 빠른 카메라 움직임, 숏츠 영상에서 중요합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;카메라 키워드는 왜 중요한가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 영상이 어색해지는 가장 큰 이유 중 하나는 카메라 지시가 불분명하기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실전에서 자주 쓰는 카메라 키워드를 정리하면 다음과 같습니다.&lt;/p&gt;
&lt;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;fixed / locked-off: 카메라 정지&lt;/li&gt;
&lt;li&gt;static wide: 넓은 고정 쇼트&lt;/li&gt;
&lt;li&gt;locked tripod: 삼각대처럼 흔들림 없는 고정&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;push-in / dolly in: 앞으로 들어감&lt;/li&gt;
&lt;li&gt;pull-out / dolly out: 뒤로 빠짐&lt;/li&gt;
&lt;li&gt;pan left/right: 좌우 회전&lt;/li&gt;
&lt;li&gt;tracking shot / follow: 피사체를 따라감&lt;/li&gt;
&lt;li&gt;orbit / arc: 피사체 주위를 돎&lt;/li&gt;
&lt;li&gt;crane up/down: 수직 상승/하강&lt;/li&gt;
&lt;li&gt;gimbal: 부드럽고 안정적인 이동&lt;/li&gt;
&lt;li&gt;handheld: 일부러 자연스러운 흔들림&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;slow&lt;/li&gt;
&lt;li&gt;gentle&lt;/li&gt;
&lt;li&gt;smooth&lt;/li&gt;
&lt;li&gt;controlled&lt;/li&gt;
&lt;li&gt;barely&lt;/li&gt;
&lt;li&gt;gradual&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 것은 &lt;b&gt;fast를 남발하지 않는 것&lt;/b&gt;입니다. 너무 많은 요소가 동시에 빨라지면 지터나 깨짐이 쉽게 생길 수 있습니다. 그래서 빠르게 만들고 싶은 것이 있더라도, &lt;b&gt;하나만 빠르게 하고 나머지는 안정화하는 편이 좋습니다&lt;/b&gt;.&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;많은 프롬프트가 style 부분에서 막힙니다. 예쁜 느낌을 쓰고 싶지만, 너무 추상적으로 쓰면 결과가 흔들립니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;좋지 않은 예&lt;/h3&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;cinematic, epic, beautiful lighting
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;더 좋은 예&lt;/h3&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;golden hour lighting, cinematic film tone, 35mm, warm amber tone, soft rim light
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 style 문장은 보통 다음 요소를 포함합니다.&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;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어,&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;overcast daylight, soft diffused shadows, documentary-style handheld framing
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문장은 자연광 다큐 느낌을 만들어내는 데 도움이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로,&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;chiaroscuro lighting, crushed blacks, warm practical lamp glow, cinematic 35mm
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 쓰면 더 강한 영화적 대비가 만들어질 가능성이 높습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;멀티샷 타임코드 방식이 중요한 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;짧은 15초 영상도 한 덩어리로 쓰기보다, &lt;b&gt;시간 구간별로 나누어 설계&lt;/b&gt;하면 훨씬 안정적인 결과를 얻을 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들면 이런 식입니다.&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;[0-4s]
shot size: wide shot
camera: static
subject action: woman stands by the desk looking at an old photograph
lighting: warm window light

[4-8s]
shot size: medium shot
camera: slow push-in
subject action: she reaches toward the photograph and hesitates
lighting: golden hour highlights on face and hand

[8-12s]
shot size: close-up
camera: continued gentle push-in
subject action: fingertips stop just before touching the photo
lighting: soft warm side light

[12-15s]
shot size: close-up hold
camera: static hold
subject action: she touches the photo and exhales softly
lighting: steady amber light, shallow falloff
&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;/li&gt;
&lt;li&gt;카메라가 중간에 제멋대로 바뀌는 일이 줄어듭니다.&lt;/li&gt;
&lt;li&gt;감정의 흐름을 단계적으로 설계할 수 있습니다.&lt;/li&gt;
&lt;li&gt;숏츠에서 특히 중요한 &amp;ldquo;도입 &amp;rarr; 상승 &amp;rarr; 클라이맥스&amp;rdquo;가 자연스러워집니다.&lt;/li&gt;
&lt;/ul&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;0&amp;ndash;4초: 세계를 보여주는 wide shot&lt;/li&gt;
&lt;li&gt;4&amp;ndash;8초: 인물과 상황을 좁혀가는 medium shot&lt;/li&gt;
&lt;li&gt;8&amp;ndash;12초: 감정이 최고조로 가는 close-up&lt;/li&gt;
&lt;li&gt;12&amp;ndash;15초: reveal 또는 hold&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;wide &amp;rarr; medium &amp;rarr; close &amp;rarr; closest/reveal&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;이 부분은 Seedance형 워크플로우에서 특히 중요합니다. 텍스트만으로 모든 걸 설명하기보다, &lt;b&gt;참조 자산의 역할을 분명히 나누는 것&lt;/b&gt;이 훨씬 강력할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들면,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;@Image1 = 캐릭터 기준 이미지&lt;/li&gt;
&lt;li&gt;@Image2 = 배경/환경 기준 이미지&lt;/li&gt;
&lt;li&gt;@Video1 = 카메라 움직임 레퍼런스&lt;/li&gt;
&lt;li&gt;@Audio1 = 배경음악 또는 타이밍 기준&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 역할을 명시해두면 모델이 평균화해서 처리하는 문제를 줄일 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 하나 좋은 방식은 &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;/li&gt;
&lt;li&gt;끝: 우주 공간으로 떠오른 같은 인물&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;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) 추상어를 너무 많이 쓰는 경우&lt;/h3&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;epic, amazing, beautiful, cinematic, powerful, awesome
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 단어는 대부분 감상문에 가깝습니다. 지시문으로는 효율이 떨어집니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) 인물을 너무 대충 쓰는 경우&lt;/h3&gt;
&lt;pre class=&quot;inform7&quot;&gt;&lt;code&gt;a woman in a room
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러면 얼굴, 의상, 나이, 체형, 헤어, 인상 모두 흔들릴 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) 피사체와 카메라를 한 문장에 섞는 경우&lt;/h3&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;spinning around quickly while the camera is moving dynamically
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) 제약 문구를 빼는 경우&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 멋진 묘사만 적고 끝내기 쉽습니다. 하지만 실제로 결과를 망치는 건 흔들림, 왜곡, 얼굴 변화, 노출 깜빡임 같은 문제입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5) 실패했을 때 프롬프트를 전부 갈아엎는 경우&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 비효율적인 방식입니다. 카메라, 조명, 스타일, 액션을 한 번에 바꾸면 무엇이 문제였는지 알 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 좋은 방식은 다음과 같습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;기본 버전 2~3개 생성&lt;/li&gt;
&lt;li&gt;카메라만 바꾸기&lt;/li&gt;
&lt;li&gt;조명만 바꾸기&lt;/li&gt;
&lt;li&gt;style만 바꾸기&lt;/li&gt;
&lt;li&gt;constraints를 강화하기&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;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;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;[Subject]
late 20s woman, short dark curls, silver hoop earring, black turtleneck

[Action]
she stands by the desk, looks at an old photograph, slowly reaches toward it, hesitates, then touches it gently

[Camera]
slow push-in from medium shot, stable framing

[Style]
golden hour lighting, cinematic film tone, 35mm, warm amber tone, shallow depth of field

[Constraints]
avoid jitter, avoid bent limbs, maintain face consistency, avoid temporal flicker, stable picture, sharp clarity
&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;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;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;[Subject]
a luxury perfume bottle with clear glass body and metallic cap on a dark reflective surface

[Action]
the bottle remains still while light moves across the glass surface, revealing texture and reflection

[Camera]
gentle slow push-in, macro framing, smooth controlled movement

[Style]
dramatic rim light, premium commercial look, shallow depth of field, dark minimal background

[Constraints]
avoid jitter, avoid distortion, no stretching, avoid temporal flicker, stable picture, sharp clarity, clean edges
&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;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;세로 9:16 숏츠에서는 전장을 가로로 넓게 펼치기보다, &lt;b&gt;주인공 전투기를 중앙축에 고정하고 아래에서 위로 치고 올라가는 흐름&lt;/b&gt;이 잘 맞습니다.&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;15-second cinematic vertical space battle sequence, 9:16 aspect ratio

[0-4s]
shot size: ultra wide vertical shot
camera: slow push-in
subject action: the hero starfighter rises from the lower frame toward a massive battle above
lighting: cold planetary backlight, red laser streaks, blue engine trails

[4-8s]
shot size: medium vertical chase shot
camera: rear tracking centered on the starfighter
subject action: the fighter ascends between debris while enemy ships fire from behind
lighting: flashing weapon bursts, engine reflections on debris

[8-12s]
shot size: close action shot
camera: fast but controlled side-to-rear follow
subject action: the hero ship turns sharply and destroys one enemy fighter
lighting: intense explosion bloom, hot orange wreckage glow

[12-15s]
shot size: vertical climax shot
camera: dramatic pull-out
subject action: the hero ship charges upward while a giant flagship explodes behind it
lighting: massive explosion backlight, flickering reflections across nearby ships

style: cinematic film tone, premium sci-fi blockbuster, strong vertical depth
constraints: avoid jitter, avoid distortion, no stretching, avoid temporal flicker, stable picture, sharp clarity
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 것은 &amp;ldquo;스타워즈풍&amp;rdquo;이라는 감상어가 아니라, &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;실전 예제 4: 꿈에서 우주로 이어지는 변환 장면&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시작 이미지와 끝 이미지 연결 테스트용으로도 좋은 구조입니다.&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;15-second cinematic vertical transformation sequence, 9:16

[0-4s]
shot size: ultra wide vertical shot
camera: slow push-in
subject action: a young woman stands in the center of a quiet bedroom at night
lighting: soft moonlight, cool blue room shadow

[4-8s]
shot size: medium vertical shot
camera: smooth upward follow
subject action: papers and objects begin to float, walls dissolve into stars
lighting: stronger blue-violet glow, subtle cosmic reflections

[8-12s]
shot size: close action shot
camera: controlled push-in
subject action: the woman lifts upward as fragments of the bedroom drift apart
lighting: intense portal bloom, glowing particles, bright rim light

[12-15s]
shot size: vertical climax shot
camera: pull-through into space
subject action: the woman fully rises into outer space, leaving the bedroom behind
lighting: radiant cosmic blue-white streaks, dreamy backlight

style: cinematic dreamlike sci-fi, magical realism, strong depth layering
constraints: avoid jitter, avoid distortion, avoid temporal flicker, maintain face consistency
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 구조는 &lt;b&gt;첫 프레임과 마지막 프레임을 연결하는 테스트&lt;/b&gt;에도 적합합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 문제 제기부터 시작하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;왜 AI 영상은 자꾸 흔들릴까?&amp;rdquo;&lt;br /&gt;&amp;ldquo;왜 내 프롬프트는 멋지게 써도 결과가 불안정할까?&amp;rdquo;&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. 답을 구조로 제시하기&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;Subject&lt;/li&gt;
&lt;li&gt;Action&lt;/li&gt;
&lt;li&gt;Camera&lt;/li&gt;
&lt;li&gt;Style&lt;/li&gt;
&lt;li&gt;Constraints&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 다섯 요소를 글의 뼈대로 삼는 것이 좋습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 추상어 vs 구조화 예시를 꼭 넣기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;독자 입장에서는 &amp;ldquo;왜 cinematic만 쓰면 안 되지?&amp;rdquo;가 가장 먼저 생깁니다. 그러니 나쁜 예 / 좋은 예 비교를 꼭 넣는 것이 좋습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 예제를 짧고 바로 복붙 가능하게 넣기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사람들은 원칙보다 예제를 더 빨리 가져갑니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 마지막에 반복 실험 원칙을 붙이기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론을 아래처럼 마무리하면 좋습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 프롬프트는 시처럼 멋지게 쓰는 것이 아니라, 촬영감독처럼 명확하게 지시하는 데서 나온다. 그리고 실패했을 때는 더 길게 쓰는 것이 아니라, 한 번에 한 변수만 고쳐야 한다.&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;AI 영상 프롬프트를 잘 쓴다는 것은 화려한 수식어를 많이 붙이는 일이 아닙니다. 오히려 반대입니다. &lt;b&gt;무엇을 보여줄지, 누가 움직일지, 카메라가 어떻게 따라갈지, 빛이 어디서 들어올지, 무엇을 망치지 말아야 할지를 차분하게 적는 일&lt;/b&gt;에 가깝습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 Seedance 2.0처럼 멀티모달 특성이 강한 도구를 다룰 때는, 텍스트만으로 모든 걸 해결하려 하기보다 &lt;b&gt;이미지&amp;middot;영상&amp;middot;오디오를 함께 쓰고 역할을 명시하는 방향&lt;/b&gt;이 더 자연스럽습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 중요한 것은 하나입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프롬프트를 예쁜 문장으로 쓰지 말고, 장면 설계서처럼 써라.&lt;/b&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;바로 복붙해서 쓸 수 있는 마지막 템플릿&lt;/h2&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;[Subject]

[Action]

[Camera]

[Style]

[Constraints]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹은 15초 멀티샷이라면,&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;[0-4s]
shot size:
camera:
subject action:
lighting:

[4-8s]
shot size:
camera:
subject action:
lighting:

[8-12s]
shot size:
camera:
subject action:
lighting:

[12-15s]
shot size:
camera:
subject action:
lighting:

style:
constraints:
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 두 가지 구조만 제대로 익혀도, 대부분의 장면은 훨씬 안정적으로 설계할 수 있습니다.&lt;/p&gt;</description>
      <category>Seedance2</category>
      <author>행복한 수지아빠</author>
      <guid isPermaLink="true">https://javaexpert.tistory.com/1738</guid>
      <comments>https://javaexpert.tistory.com/1738#entry1738comment</comments>
      <pubDate>Wed, 15 Apr 2026 11:43:14 +0900</pubDate>
    </item>
    <item>
      <title>Build Your Own OpenClaw: OpenClaw를 처음부터 단계별로 공부해보자</title>
      <link>https://javaexpert.tistory.com/1737</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이 저장소는 완성형 프레임워크를 바로 쓰게 하는 대신, 가장 단순한 채팅 루프에서 출발해 도구 호출, 스킬, 세션 저장, 컨텍스트 압축, 이벤트 버스, 멀티 에이전트, 장기 메모리까지 직접 조립해 보게 만드는 튜토리얼형 프로젝트입니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 AI 에이전트를 다룰 때 가장 답답한 지점은 &amp;ldquo;잘 돌아가는 데 왜 그렇게 설계됐는지&amp;rdquo;가 보이지 않는다는 점입니다. 프레임워크는 빠르게 결과를 내주지만, 구조를 이해하지 못하면 비용이 왜 늘었는지, 컨텍스트가 왜 깨졌는지, 왜 특정 상황에서만 불안정한지 판단하기 어렵습니다. 이 저장소는 그 불투명한 중간층을 단계별 코드로 드러냅니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글을 끝까지 읽으면 세 가지가 명확해집니다.&lt;br /&gt;첫째, 에이전트가 단순한 LLM 호출이 아니라 세션, 이벤트, 라우팅, 메모리, 동시성 제어가 얽힌 시스템이라는 점입니다. 둘째, OpenClaw 계열 접근이 기존 &amp;ldquo;단일 프롬프트 챗봇&amp;rdquo;과 어떻게 다른지입니다. 셋째, 이 구조를 언제 도입해야 하고 언제는 과한 선택인지 판단할 수 있게 됩니다. (&lt;a href=&quot;https://github.com/openclaw/openclaw/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;figure id=&quot;og_1776150752581&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - czl9707/build-your-own-openclaw: A step-by-step guide to build your own AI agent.&quot; data-og-description=&quot;A step-by-step guide to build your own AI agent. Contribute to czl9707/build-your-own-openclaw development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/czl9707/build-your-own-openclaw&quot; data-og-url=&quot;https://github.com/czl9707/build-your-own-openclaw&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/WB8BA/dJMb85vQm70/AtQiFa35nuXYbutJqodKh0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/fWpFF/dJMb84p92l7/QfyZQPW4wwKKVXGDNRGKSk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/cdHEfM/dJMb86nYW8C/dKrkOnEvxHciCc5NOcCdeK/img.png?width=1440&amp;amp;height=720&amp;amp;face=0_0_1440_720&quot;&gt;&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/czl9707/build-your-own-openclaw&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/WB8BA/dJMb85vQm70/AtQiFa35nuXYbutJqodKh0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/fWpFF/dJMb84p92l7/QfyZQPW4wwKKVXGDNRGKSk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/cdHEfM/dJMb86nYW8C/dKrkOnEvxHciCc5NOcCdeK/img.png?width=1440&amp;amp;height=720&amp;amp;face=0_0_1440_720');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - czl9707/build-your-own-openclaw: A step-by-step guide to build your own AI agent.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A step-by-step guide to build your own AI agent. Contribute to czl9707/build-your-own-openclaw development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;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;p data-ke-size=&quot;size16&quot;&gt;처음에는 채팅 루프 하나면 충분해 보입니다. 실제로 이 튜토리얼도 Step 00에서 사용자 입력을 받고, 메시지 히스토리를 그대로 모델에 보내고, 응답을 다시 세션에 추가하는 아주 단순한 구조로 시작합니다. 문제는 이 방식이 조금만 길어져도 금방 한계를 드러낸다는 점입니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw/blob/main/00-chat-loop&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 먼저 드러나는 건 비용 문제입니다. 대화가 길어질수록 매 호출마다 전체 히스토리를 다시 보내야 하므로, 불필요한 토큰 사용이 늘어납니다. 저장소가 별도 단계로 compaction을 도입한 이유도 바로 이 때문인데, 오래된 대화를 요약하고 새 세션으로 넘기지 않으면 컨텍스트 한계와 비용 증가가 동시에 발생하기 때문입니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw/blob/main/00-chat-loop&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성능 문제도 바로 따라옵니다. 단일 루프 구조에서는 외부 채널 연동, 프로그램적 접근, 백그라운드 작업 같은 요구가 생길 때 병목이 쉽게 생깁니다. 이 저장소가 중간 단계에서 이벤트 버스와 WebSocket 계층을 따로 분리하는 이유는, 입력 소스와 에이전트 실행을 느슨하게 결합해 확장성을 확보하려는 설계 때문입니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw/blob/main/07-event-driven&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유지보수 문제는 규모가 커질수록 더 커집니다. 도구, 프롬프트, 라우팅 규칙, 메모리 전략이 한 파일에 뒤섞이면 기능 추가보다 디버깅이 더 어려워집니다. 그래서 이 프로젝트는 스킬 정의, 에이전트 정의, 라우팅 테이블, 메모리 전용 에이전트처럼 책임을 나눠 보여 줍니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw/blob/main/02-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 경험 측면에서도 차이가 큽니다. 단순 챗봇은 빠르게 만들 수 있지만, 실제 제품화 단계에 가면 &amp;ldquo;왜 이 응답이 나왔는지&amp;rdquo;, &amp;ldquo;어느 에이전트가 처리했는지&amp;rdquo;, &amp;ldquo;동시에 여러 요청이 오면 어떻게 되는지&amp;rdquo;를 설명하기 어려워집니다. 이 저장소는 그 과정을 튜토리얼 단계로 분해해, 비결정적 동작을 줄이고 구조를 눈으로 따라가게 만듭니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Build Your Own OpenClaw란 무엇인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 문장으로 정의하면, Build Your Own OpenClaw는 &amp;ldquo;개인용 AI 에이전트 시스템을 작은 부품부터 직접 조립하며 이해하게 만드는 단계형 학습 저장소&amp;rdquo;입니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비유하면 이 프로젝트는 완성차를 주는 것이 아니라, 엔진과 조향 장치와 브레이크를 순서대로 조립해 보게 하는 정비 교육 키트에 가깝습니다. 처음에는 단순히 앞으로 가기만 하던 것이, 점점 외부 장치와 연결되고, 여러 작업을 분담하고, 오래 기억하고, 과부하를 막는 방향으로 발전합니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw/blob/main/00-chat-loop&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기술적으로 보면 이 저장소는 18개의 단계로 구성되어 있고, 각 단계마다 설명용 README와 실행 가능한 코드가 함께 제공됩니다. 구조는 1) 단일 에이전트, 2) 이벤트 기반 아키텍처, 3) 자율 동작과 멀티 에이전트, 4) 운영과 스케일 단계로 나뉘어 있습니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 방식과의 가장 큰 차이는 &amp;ldquo;프레임워크 사용법&amp;rdquo;이 아니라 &amp;ldquo;에이전트 시스템의 내부 모델&amp;rdquo;을 가르친다는 점입니다. 단순한 챗 인터페이스를 만드는 데서 멈추지 않고, 왜 세션이 필요하고, 왜 이벤트 버스가 필요한지, 왜 메모리를 별도 에이전트로 분리할 수 있는지까지 보여 줍니다. 이것이 이 프로젝트의 철학입니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw/blob/main/00-chat-loop&quot;&gt;GitHub&lt;/a&gt;)&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;b&gt;18단계 점진식 구성&lt;/b&gt;&lt;br /&gt;한 번에 거대한 구조를 던지지 않고, 채팅 루프에서 메모리와 동시성 제어까지 점진적으로 확장합니다. 초보자에게는 학습 곡선을 낮추고, 실무자에게는 아키텍처 변화 지점을 분명히 보여 줍니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;README와 실행 코드가 함께 존재&lt;/b&gt;&lt;br /&gt;각 단계가 설명 문서와 runnable codebase를 함께 제공하므로, 개념만 이해하고 끝나는 것이 아니라 바로 실행해 보며 검증할 수 있습니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스킬을 런타임에 지연 로드&lt;/b&gt;&lt;br /&gt;Step 02는 SKILL.md 기반 스킬을 필요할 때만 불러오는 구조를 소개합니다. 이는 모든 기능을 프롬프트에 미리 넣지 않고, 필요한 능력만 로드해 컨텍스트 낭비를 줄이려는 방향과 연결됩니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw/blob/main/02-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;컨텍스트 압축 전략을 별도 단계로 다룸&lt;/b&gt;&lt;br /&gt;Step 05는 큰 툴 결과를 먼저 줄이고, 그래도 크면 오래된 대화를 요약해 새 세션으로 넘기는 방식을 설명합니다. 긴 대화에서 비용과 컨텍스트 한계를 동시에 다루는 점이 중요합니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw/blob/main/05-compaction&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이벤트 기반 구조로 전환&lt;/b&gt;&lt;br /&gt;Step 07 이후에는 입력과 실행을 직접 묶지 않고, InboundEvent와 OutboundEvent를 이벤트 버스로 흘려보냅니다. 이 방식은 CLI를 넘어 채널 연동, 서버화, 백그라운드 작업으로 확장하기 쉽게 만듭니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw/blob/main/07-event-driven&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;멀티 에이전트와 운영 제어까지 포함&lt;/b&gt;&lt;br /&gt;Step 11은 메시지 출처에 따라 다른 에이전트로 라우팅하고, Step 16은 세마포어 기반 동시성 제어를 둡니다. 즉, 이 프로젝트는 &amp;ldquo;잘 대답하는 봇&amp;rdquo;이 아니라 &amp;ldquo;운영 가능한 에이전트 시스템&amp;rdquo;으로 가는 과정을 다룹니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw/blob/main/11-multi-agent-routing&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실제로 어떤 효과가 있는가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 프로젝트의 가장 큰 효과는 성능 수치보다 이해 비용을 줄여 준다는 데 있습니다. 공개된 자료 기준으로 이 저장소는 &amp;ldquo;작동하는 결과물&amp;rdquo;보다 &amp;ldquo;왜 이런 구성요소가 필요한지&amp;rdquo;를 단계별로 체감하게 만드는 데 초점을 둡니다. 그래서 프레임워크를 외워 쓰는 것이 아니라, 설계 판단의 근거를 쌓는 데 유리합니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전과 후를 비교하면 차이가 분명합니다. 시작점은 전체 히스토리를 그대로 보내는 단일 채팅 루프입니다. 이후에는 툴 호출, 스킬 로딩, 세션 저장, 컨텍스트 압축, 이벤트 버스, WebSocket, 라우팅, 메모리, 동시성 제한이 더해지면서 &amp;ldquo;한 번 대답하는 봇&amp;rdquo;이 &amp;ldquo;여러 입력 경로를 처리하고 상태를 유지하는 시스템&amp;rdquo;으로 바뀝니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw/blob/main/00-chat-loop&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;효과가 가장 크게 드러나는 상황은 두 가지입니다. 하나는 AI 에이전트를 처음 설계하는 팀이 구조를 통째로 이해해야 할 때입니다. 다른 하나는 이미 챗봇은 만들었지만, 긴 대화, 외부 채널 연결, 멀티 에이전트, 메모리, 운영 안정성 문제로 다음 단계가 막힌 팀입니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 스타트업이나 소규모 팀에는 장점이 큽니다. 처음부터 대형 프레임워크 전체를 받아들이지 않고, 필요한 복잡도를 필요한 시점에만 도입하는 사고방식을 익힐 수 있기 때문입니다. 반대로 이미 조직 표준 프레임워크와 운영 체계가 굳어 있는 팀이라면, 이 프로젝트는 생산성 도구보다 학습 재료로서 가치가 더 큽니다. 이 평가는 저장소의 단계형 구조와 설명 중심 구성에서 자연스럽게 도출되는 판단입니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;동작 원리 / 구조&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;입력을 받는다&lt;/b&gt;&lt;br /&gt;시작점은 CLI 채팅 루프입니다. 사용자가 메시지를 입력하면 세션이 이를 사용자 메시지로 저장하고, 현재까지의 히스토리를 모델 호출용 메시지 배열로 구성합니다. 가장 단순한 형태지만, 모든 에이전트 시스템의 최소 단위가 여기서 드러납니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw/blob/main/00-chat-loop&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;필요한 능력을 붙인다&lt;/b&gt;&lt;br /&gt;다음 단계에서 도구와 스킬이 들어옵니다. 특히 스킬은 SKILL.md 정의를 기반으로 런타임에 로드되며, 전용 스킬 툴을 통해 필요한 순간에만 내용을 꺼내 옵니다. 이 설계는 능력을 정적으로 다 박아 넣는 대신, 필요 시점에 확장하는 쪽에 가깝습니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw/blob/main/02-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;대화 상태를 보존한다&lt;/b&gt;&lt;br /&gt;세션과 저장 계층이 추가되면 에이전트는 단발성 호출이 아니라 상태 있는 상호작용으로 바뀝니다. 이후 compaction 단계에서는 오래된 히스토리를 그대로 유지하지 않고 요약해 새 세션으로 넘기는데, 이는 긴 대화에서도 컨텍스트를 관리하기 위한 설계입니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw/blob/main/00-chat-loop&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;입력과 실행을 분리한다&lt;/b&gt;&lt;br /&gt;이벤트 기반 단계에서는 InboundEvent와 OutboundEvent가 도입되고, EventBus가 이 이벤트를 pub/sub 방식으로 배포합니다. 이렇게 하면 입력 채널이 늘어나도 에이전트 실행 로직을 직접 뜯지 않아도 됩니다. 설계 목적은 확장성과 결합도 감소입니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw/blob/main/07-event-driven&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;채널과 프로그램적 접근을 연다&lt;/b&gt;&lt;br /&gt;이후 채널 단계와 WebSocket 단계에서 에이전트는 CLI 밖으로 나갑니다. WebSocket 워커는 연결된 클라이언트를 관리하고 이벤트를 브로드캐스트하므로, 외부 애플리케이션이나 다른 인터페이스가 같은 에이전트 시스템과 연결될 수 있습니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;여러 에이전트로 역할을 나눈다&lt;/b&gt;&lt;br /&gt;멀티 에이전트 라우팅 단계에서는 에이전트 정의를 스캔하고, 소스 패턴과 매핑 규칙에 따라 어느 에이전트가 처리할지 결정합니다. 즉, 하나의 거대한 프롬프트에 모든 역할을 욱여넣는 대신, 역할별 에이전트를 분리하는 방향입니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw/blob/main/11-multi-agent-routing&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;장기 메모리를 별도 책임으로 둔다&lt;/b&gt;&lt;br /&gt;메모리 단계에서는 기억을 전담하는 specialized agent가 등장합니다. 현재 구현은 메모리 전용 에이전트를 dispatch해 정보를 저장하고 조회하는 방식이며, 직접 툴로 붙이는 방식이나 벡터 데이터베이스 방식과 구분됩니다. 이 선택은 &amp;ldquo;기억&amp;rdquo;을 별도 책임으로 분리한다는 설계 의도를 보여 줍니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw/blob/main/17-memory&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;운영 안정성을 보강한다&lt;/b&gt;&lt;br /&gt;마지막으로 동시성 제어 단계에서는 에이전트별 최대 동시 실행 수를 두고, 세마포어로 과도한 병렬 실행을 막습니다. 이것이 필요한 이유는 에이전트가 길게 실행되거나 백그라운드 작업을 동반할 때, 자원 고갈이 곧 장애로 이어질 수 있기 때문입니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw/blob/main/16-concurrency-control&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치 / 사용 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 저장소는 각 단계가 독립 실행 가능한 형태로 구성되어 있습니다. 공통적으로 먼저 설정 파일을 복사해 API 키를 넣고, 그다음 원하는 단계 디렉터리로 들어가 실행하는 흐름입니다. 루트 README는 모든 단계 실행 전에 config.example.yaml을 config.user.yaml로 복사해 API 키를 넣으라고 안내합니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 흐름은 대략 아래처럼 이해하면 됩니다. 저장소는 Python 3.11 이상을 요구하고, Step 00의 pyproject.toml에는 litellm, typer, rich, pydantic, pyyaml 같은 의존성이 정의되어 있습니다. 실행 예시는 uv run my-bot chat 형태로 제공됩니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw/blob/main/00-chat-loop/pyproject.toml&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;git clone &amp;lt;저장소&amp;gt;
cd build-your-own-openclaw

cp default_workspace/config.example.yaml default_workspace/config.user.yaml
# config.user.yaml에 API 키 입력

cd 00-chat-loop
uv run my-bot chat
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최소 실행 예제는 Step 00입니다. 이 단계에서는 단순히 대화를 주고받는 기본 에이전트를 확인할 수 있습니다. 이후 Step 02로 가면 스킬 개념을, Step 05로 가면 컨텍스트 압축을, Step 07 이후로 가면 이벤트 기반 구조를 같은 방식으로 이어서 실험할 수 있습니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw/blob/main/00-chat-loop&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리까지 보고 싶다면 다음 흐름이 이해하기 좋습니다.&lt;br /&gt;Step 00으로 기본 루프를 익히고, Step 02에서 능력 확장 방식을 보고, Step 05에서 컨텍스트 관리 이유를 체감한 다음, Step 07과 Step 11을 거쳐 Step 17에서 장기 기억이 어떻게 붙는지 확인하면 전체 구조가 자연스럽게 이어집니다. 이 순서는 저장소의 단계 설계와 잘 맞습니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 쓰는 예시 / 활용 시나리오&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. AI 에이전트 입문 학습&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에이전트를 처음 만드는 개발자에게 가장 적합한 용도입니다. 단순 챗봇에서 끝나지 않고, 왜 도구와 세션, 이벤트, 메모리, 동시성 제어가 필요한지 흐름으로 익힐 수 있습니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw&quot;&gt;GitHub&lt;/a&gt;)&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;이미 &amp;ldquo;질문하면 대답하는 봇&amp;rdquo;은 있지만, 채널 연동이나 서버화가 필요한 팀에 맞습니다. 이벤트 버스와 WebSocket 단계는 입력 경로를 늘리면서도 실행 로직의 결합을 낮추는 방향을 보여 줍니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw/blob/main/07-event-driven&quot;&gt;GitHub&lt;/a&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;대화가 길어져 비용이 늘고 응답 품질이 흔들리는 상황에서 compaction 단계가 유용합니다. 오래된 메시지를 요약해 넘기는 방식은 벡터 검색 없이도 긴 세션을 관리하는 현실적인 첫 단계가 됩니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw/blob/main/05-compaction&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 역할 분리형 에이전트 설계&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 에이전트에 모든 역할을 몰아넣는 대신, 소스별로 다른 에이전트가 처리하게 만들고 싶을 때 적합합니다. 멀티 에이전트 라우팅 단계는 어떤 메시지를 어느 에이전트가 맡을지 규칙 기반으로 분리하는 사고를 익히게 합니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw/blob/main/11-multi-agent-routing&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 장기 기억 구조 실험&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 정보나 프로젝트 맥락을 장기적으로 유지해야 할 때, Step 17의 specialized memory agent 접근이 좋은 실험 재료가 됩니다. 특히 메모리를 주 에이전트의 프롬프트에 섞는 대신, 별도 책임으로 나누는 방식이 어떤 장단점을 가지는지 확인할 수 있습니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw/blob/main/17-memory&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;한계 / 주의할 점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째, 이 저장소는 어디까지나 튜토리얼 성격이 강합니다. 문서상 확인되는 범위에서 각 단계는 개념을 설명하고 runnable code를 제공하는 데 초점이 있으며, 대규모 운영 환경에서 필요한 모든 관찰성, 보안, 장애 복구, 배포 자동화를 포괄한다고 보기는 어렵습니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘째, OpenClaw와 완전히 동일한 구현은 아닙니다. 예를 들어 스킬 시스템은 이 튜토리얼에서는 전용 skill 툴 방식으로 설명하지만, 설명상 OpenClaw는 시스템 프롬프트 주입과 파일 읽기 방식에 더 가깝다고 명시합니다. 따라서 &amp;ldquo;OpenClaw 복제본&amp;rdquo;이라기보다 &amp;ldquo;핵심 설계를 학습하기 위한 경량 구현&amp;rdquo;으로 보는 편이 정확합니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw/blob/main/02-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;셋째, 적용이 어려운 경우도 있습니다. 단순한 사내 FAQ 봇이나 일회성 챗 인터페이스라면, 이벤트 버스&amp;middot;멀티 에이전트&amp;middot;동시성 제어까지 도입하는 것은 과할 수 있습니다. 이 구조는 채널이 늘고, 역할이 분리되고, 세션 지속성과 운영 안정성이 중요해질 때 가치가 커집니다. 이 부분은 저장소의 단계 구성을 바탕으로 한 실무적 해석입니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;넷째, 현재 기준으로는 성능 벤치마크나 운영 지표를 체계적으로 제시하는 프로젝트는 아닙니다. 공개된 자료 기준으로 강점은 수치 최적화보다 구조 학습과 설계 이해에 있습니다. 따라서 &amp;ldquo;바로 프로덕션에 넣을 도구&amp;rdquo;를 찾는 기대와는 약간 다를 수 있습니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Build Your Own OpenClaw의 가치는 기능 수가 아니라 설명 방식에 있습니다.&lt;br /&gt;이 프로젝트는 에이전트를 프롬프트 몇 줄의 문제가 아니라, 상태 관리와 이벤트 흐름, 역할 분리와 운영 제어가 필요한 시스템으로 보게 만듭니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 AI 에이전트 개발을 처음 구조적으로 배우고 싶은 개발자, 단일 챗봇에서 한 단계 넘어가려는 스타트업, 여러 역할과 채널을 다루는 개인용 혹은 소규모 팀용 에이전트를 설계하는 사람에게 잘 맞습니다. 반면, 당장 완성형 프레임워크만 필요한 팀에게는 학습용 비중이 더 크게 느껴질 수 있습니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw&quot;&gt;GitHub&lt;/a&gt;)&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;b&gt;핵심 개념&lt;/b&gt;&lt;br /&gt;Build Your Own OpenClaw는 채팅 루프에서 시작해 도구, 스킬, 세션, 컨텍스트 압축, 이벤트 버스, 멀티 에이전트, 장기 메모리, 동시성 제어까지 직접 조립하며 배우는 단계형 에이전트 튜토리얼입니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;차별점&lt;/b&gt;&lt;br /&gt;사용법을 가르치는 프레임워크 문서가 아니라, 왜 그런 구조가 필요한지까지 보여 주는 설계 학습형 저장소라는 점이 다릅니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;언제 쓰면 좋은지&lt;/b&gt;&lt;br /&gt;AI 에이전트 아키텍처를 처음부터 이해하고 싶을 때, 기존 챗봇을 채널 연동&amp;middot;멀티 에이전트&amp;middot;메모리 구조로 확장하고 싶을 때 좋습니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw/blob/main/07-event-driven&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;언제 쓰면 안 되는지&lt;/b&gt;&lt;br /&gt;단순 질의응답 봇처럼 구조 복잡도가 낮은 문제를 빠르게 끝내야 한다면, 이 저장소의 단계적 아키텍처는 과한 선택일 수 있습니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;한 줄 요약&lt;/b&gt;&lt;br /&gt;&amp;ldquo;에이전트를 만드는 법&amp;rdquo;보다 &amp;ldquo;에이전트 시스템이 왜 그렇게 생겨야 하는지&amp;rdquo;를 배우게 해 주는 저장소입니다. (&lt;a href=&quot;https://github.com/czl9707/build-your-own-openclaw&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AI</category>
      <author>행복한 수지아빠</author>
      <guid isPermaLink="true">https://javaexpert.tistory.com/1737</guid>
      <comments>https://javaexpert.tistory.com/1737#entry1737comment</comments>
      <pubDate>Tue, 14 Apr 2026 16:12:41 +0900</pubDate>
    </item>
    <item>
      <title>GEOFlow: GEO를 자동화 운영 시스템</title>
      <link>https://javaexpert.tistory.com/1736</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 &lt;b&gt;GEOFlow를 이해하기 위해 작성되었습니다.&lt;/b&gt;&lt;br /&gt;단순히 AI로 글을 생성하는 도구로 보면 이 프로젝트의 핵심을 놓치기 쉽습니다. GEOFlow는 글 생성 자체보다, &lt;b&gt;콘텐츠 운영의 전체 흐름을 하나의 시스템으로 묶는 것&lt;/b&gt;에 더 가깝습니다. 모델 설정, 소재 관리, 작업 실행, 검토, 게시까지를 끊기지 않게 연결하려는 시도입니다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존의 AI 콘텐츠 운영은 보통 여러 도구에 흩어져 있습니다. 프롬프트는 문서에 따로 저장하고, 제목은 스프레드시트로 관리하고, 생성은 별도 스크립트로 돌리고, 결과는 CMS에 다시 붙여 넣습니다. 이런 구조는 처음에는 빨라 보여도, 작업량이 늘어나면 관리 비용이 급격히 커집니다. GEOFlow는 바로 그 지점을 겨냥합니다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글을 끝까지 읽으면 세 가지를 분명하게 이해할 수 있습니다.&lt;br /&gt;첫째, GEOFlow가 왜 단순한 &amp;ldquo;AI 글쓰기 툴&amp;rdquo;이 아닌지.&lt;br /&gt;둘째, 기존 SEO 운영 방식과 무엇이 다른지.&lt;br /&gt;셋째, 실제로 어떤 팀이 어떤 상황에서 도입할 만한지입니다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;figure id=&quot;og_1776150665601&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - yaojingang/GEOFlow: Open-source GEO content production system with AI tasks, review workflow, and publishing.&quot; data-og-description=&quot;Open-source GEO content production system with AI tasks, review workflow, and publishing. - yaojingang/GEOFlow&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/yaojingang/GEOFlow&quot; data-og-url=&quot;https://github.com/yaojingang/GEOFlow&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dAYVsP/dJMb8WMqX4l/dMdZv7T6aRbnkBFPscod8k/img.png?width=1200&amp;amp;height=600&amp;amp;face=973_121_1051_205,https://scrap.kakaocdn.net/dn/c6nRvy/dJMb887acyZ/At0JbWNu6fQaZWC06ECzUK/img.png?width=1200&amp;amp;height=600&amp;amp;face=973_121_1051_205,https://scrap.kakaocdn.net/dn/sgkWV/dJMb84p92lB/VvkgObEaPS6g0ZALBdwtb1/img.png?width=2676&amp;amp;height=1520&amp;amp;face=0_0_2676_1520&quot;&gt;&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dAYVsP/dJMb8WMqX4l/dMdZv7T6aRbnkBFPscod8k/img.png?width=1200&amp;amp;height=600&amp;amp;face=973_121_1051_205,https://scrap.kakaocdn.net/dn/c6nRvy/dJMb887acyZ/At0JbWNu6fQaZWC06ECzUK/img.png?width=1200&amp;amp;height=600&amp;amp;face=973_121_1051_205,https://scrap.kakaocdn.net/dn/sgkWV/dJMb84p92lB/VvkgObEaPS6g0ZALBdwtb1/img.png?width=2676&amp;amp;height=1520&amp;amp;face=0_0_2676_1520');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - yaojingang/GEOFlow: Open-source GEO content production system with AI tasks, review workflow, and publishing.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Open-source GEO content production system with AI tasks, review workflow, and publishing. - yaojingang/GEOFlow&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;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;p data-ke-size=&quot;size16&quot;&gt;AI를 이용해 콘텐츠를 만들기 시작하면 가장 먼저 부딪히는 문제는 &lt;b&gt;비용&lt;/b&gt;입니다. 한 번의 실험은 싸 보이지만, 제목 후보를 여러 개 돌리고, 본문을 다시 생성하고, 실패한 작업을 재시도하고, 게시 전 검토까지 포함하면 API 호출 수가 빠르게 늘어납니다. 생성이 자동화되지 않은 상태에서는 사람이 그 흐름을 수동으로 붙잡고 있어야 해서 운영 비용도 같이 올라갑니다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 &lt;b&gt;성능 문제&lt;/b&gt;입니다. 단순한 &amp;ldquo;한 번 생성&amp;rdquo;은 쉽지만, 실제 운영에서는 예약 실행, 배치 처리, 실패 재시도, 게시 상태 관리가 필요합니다. 이걸 코드 몇 개와 크론 작업으로만 유지하면, 작업이 쌓일수록 병목이 어디서 생기는지 파악하기 어렵습니다. GEOFlow는 스케줄러와 워커를 분리해 이 문제를 구조적으로 다루려 합니다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;유지보수 문제&lt;/b&gt;도 큽니다. 프롬프트, 제목 라이브러리, 키워드, 이미지, 지식 베이스가 따로 놀면 어느 조합으로 어떤 결과가 나왔는지 추적하기 어렵습니다. 결과가 마음에 들지 않아도 원인을 좁히기 힘들고, 같은 실수를 반복하게 됩니다. GEOFlow는 이 요소들을 &amp;ldquo;소재&amp;rdquo;라는 운영 단위로 관리하도록 설계돼 있습니다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막은 &lt;b&gt;개발 경험 문제&lt;/b&gt;입니다. 많은 팀이 AI 기능을 붙일 때, 먼저 스크립트를 만들고 나중에 운영 시스템을 덧붙입니다. 그런데 이 순서는 대개 반대로 비용을 만듭니다. 작업 상태, 인증, 게시 흐름, 관리 화면이 뒤늦게 필요해지기 때문입니다. GEOFlow는 처음부터 Admin, API, CLI, Worker를 함께 두어 &amp;ldquo;운영 가능한 AI 콘텐츠 시스템&amp;rdquo;으로 접근합니다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;GEOFlow란 무엇인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GEOFlow는 한 문장으로 정의하면, &lt;b&gt;GEO/SEO 콘텐츠 운영을 위해 AI 생성과 검토&amp;middot;게시 워크플로를 하나로 묶은 오픈소스 시스템&lt;/b&gt;입니다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 비유하면, 단순한 AI 글쓰기 버튼이 아니라 &lt;b&gt;콘텐츠 공장의 생산 관리판&lt;/b&gt;에 가깝습니다. 원재료인 제목, 키워드, 이미지, 지식 문서를 넣고, 어떤 모델로 어떤 규칙으로 돌릴지 정한 뒤, 생성된 결과를 검토하고 최종 게시까지 이어지게 만드는 구조입니다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기술적으로 보면 GEOFlow는 PHP 기반의 웹/관리 화면 위에, PostgreSQL 저장소, 스케줄러, 워커, API, CLI를 얹은 구조입니다. 여기서 핵심은 &amp;ldquo;생성&amp;rdquo;이 아니라 &lt;b&gt;작업 단위의 라이프사이클 관리&lt;/b&gt;입니다. 즉, 프롬프트 한 번 호출하는 것이 아니라, 작업을 만들고 큐에 넣고 실행하고 실패를 처리하고 게시 상태를 바꾸는 흐름 전체를 다룹니다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 방식과의 차이도 여기서 분명해집니다. 일반적인 AI 자동화는 모델 호출 중심입니다. 반면 GEOFlow는 &lt;b&gt;콘텐츠 운영 시스템 중심&lt;/b&gt;입니다. 모델은 교체 가능한 부품이고, 더 중요한 것은 운영 체계입니다. OpenAI 스타일 API와 호환되는 여러 AI 서비스에 붙을 수 있게 만든 것도 그 철학의 연장선입니다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&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;b&gt;OpenAI 스타일 API 호환&lt;/b&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;이미 OpenAI 계열 인터페이스에 익숙한 팀이라면 모델 교체 비용을 낮출 수 있습니다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;작업 스케줄링과 큐 기반 실행&lt;/b&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;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;소재의 중앙 관리&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;제목 라이브러리, 키워드, 이미지, 지식 베이스, 프롬프트를 한곳에서 관리합니다.&lt;/li&gt;
&lt;li&gt;결과 품질보다 더 중요한 &amp;ldquo;재현 가능성&amp;rdquo;을 높여줍니다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;초안-검토-게시 워크플로&lt;/b&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;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프론트 사이트까지 포함한 일체형 구성&lt;/b&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;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CLI와 API 동시 제공&lt;/b&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;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실제로 어떤 효과가 있는가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공개된 자료 기준으로 보면, GEOFlow의 가장 큰 효과는 &lt;b&gt;툴을 하나 더 추가하는 것&lt;/b&gt;이 아니라 &lt;b&gt;흩어진 단계를 한 흐름으로 정리하는 것&lt;/b&gt;에 있습니다. 기존에는 모델 호출 스크립트, 프롬프트 파일, CMS 입력, 검수 기록이 분리돼 있었다면, GEOFlow는 이를 작업 관리와 게시 워크플로 안으로 끌어옵니다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전과 후를 비교하면 차이는 더 분명합니다.&lt;br /&gt;전에는 &amp;ldquo;생성 성공&amp;rdquo;이 끝이었습니다.&lt;br /&gt;후에는 &amp;ldquo;작업 생성 &amp;rarr; 큐 적재 &amp;rarr; 생성 &amp;rarr; 초안 저장 &amp;rarr; 검토 &amp;rarr; 게시&amp;rdquo;가 하나의 시스템 이벤트로 이어집니다. 이 차이는 규모가 커질수록 커집니다. 특히 주기적으로 많은 글을 발행하거나, 사람이 검토해야 하는 팀에 유리합니다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;효과가 극대화되는 상황은 세 가지입니다.&lt;br /&gt;첫째, 반복적으로 유사한 형식의 콘텐츠를 대량 생산해야 할 때입니다.&lt;br /&gt;둘째, 모델을 자주 바꾸거나 여러 공급자를 시험해야 할 때입니다.&lt;br /&gt;셋째, 생성 결과를 바로 공개하면 안 되고 검토가 필요한 팀일 때입니다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 &amp;ldquo;한두 개 글을 수동으로 써보는 단계&amp;rdquo;에서는 이 시스템의 장점이 크게 드러나지 않을 수 있습니다. GEOFlow의 가치는 단일 생성 품질보다 &lt;b&gt;운영 흐름을 구조화하는 데서&lt;/b&gt; 나오기 때문입니다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;동작 원리 / 구조&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;관리 화면에서 모델과 소재를 설정합니다.&lt;/b&gt;&lt;br /&gt;여기서 AI 모델, 프롬프트, 제목 라이브러리, 이미지 라이브러리, 지식 베이스를 준비합니다.&lt;br /&gt;이 단계를 분리한 이유는 생성 품질보다 먼저 입력 자산을 표준화하기 위해서입니다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;작업을 생성하고 실행 규칙을 정합니다.&lt;/b&gt;&lt;br /&gt;어떤 모델을 쓸지, 어떤 소재를 쓸지, 게시 규칙을 어떻게 할지를 작업 단위로 저장합니다.&lt;br /&gt;즉, &amp;ldquo;실행 요청&amp;rdquo;이 아니라 &amp;ldquo;운영 정책&amp;rdquo;을 하나 만든다고 보는 편이 맞습니다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스케줄러가 작업을 큐에 넣습니다.&lt;/b&gt;&lt;br /&gt;스케줄러는 주기적으로 실행되며, 실행 대상 작업을 찾아 job queue에 적재합니다.&lt;br /&gt;생성과 스케줄링을 분리한 것은 병목 지점을 나누고 안정성을 높이기 위한 전형적인 설계입니다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;워커가 실제 AI 생성을 수행합니다.&lt;/b&gt;&lt;br /&gt;워커는 큐에서 작업을 가져와 AI 서비스를 호출하고, 본문과 보조 메타데이터를 생성합니다.&lt;br /&gt;실패 시 재시도나 상태 갱신이 가능하도록 작업 흐름이 서비스 계층에 묶여 있습니다. (&lt;a href=&quot;https://raw.githubusercontent.com/yaojingang/GEOFlow/main/docker-compose.yml&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결과를 초안으로 저장하고 검토 상태를 붙입니다.&lt;/b&gt;&lt;br /&gt;생성 결과는 곧바로 공개되는 것이 아니라 초안, 검토, 게시 상태로 이동할 수 있습니다.&lt;br /&gt;이 설계는 &amp;ldquo;콘텐츠 생성&amp;rdquo;과 &amp;ldquo;콘텐츠 출판&amp;rdquo;을 분리하기 위한 것입니다. (&lt;a href=&quot;https://raw.githubusercontent.com/yaojingang/GEOFlow/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프론트엔드가 SEO 친화적인 페이지를 출력합니다.&lt;/b&gt;&lt;br /&gt;최종 게시된 글은 기사 페이지, 카테고리 페이지, 아카이브 페이지 등으로 노출됩니다.&lt;br /&gt;SEO 메타 정보와 구조화 데이터까지 염두에 둔 출력 구조를 갖고 있습니다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조를 한 줄로 요약하면 이렇습니다.&lt;br /&gt;&lt;b&gt;&amp;ldquo;생성 요청&amp;rdquo;을 즉시 모델에 보내는 것이 아니라, &amp;ldquo;운영 가능한 작업&amp;rdquo;으로 바꾼 뒤 시스템이 처리하게 만든다.&lt;/b&gt;&lt;br /&gt;그래서 GEOFlow는 기능보다 구조가 먼저 보이는 프로젝트입니다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치 / 사용 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 빠른 방법은 Docker Compose 방식입니다. 공개 저장소 기준으로 웹, PostgreSQL, 스케줄러, 워커를 함께 올리는 형태가 기본입니다. Compose 설정에도 web, postgres, scheduler, worker 서비스가 분리돼 있습니다. (&lt;a href=&quot;https://raw.githubusercontent.com/yaojingang/GEOFlow/main/docker-compose.yml&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Docker로 실행&lt;/h3&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;git clone https://github.com/yaojingang/GEOFlow.git
cd GEOFlow

cp .env.example .env

docker compose --profile scheduler up -d --build
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 환경 변수 예시는 단순합니다.&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;HOST_PORT=18080
CRON_INTERVAL=60
APP_SECRET_KEY=replace-with-a-long-random-secret
SITE_URL=http://localhost:18080
TZ=Asia/Shanghai
REQUIRE_STRONG_APP_SECRET=false
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 후 접근 흐름은 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;# 프론트
http://localhost:18080

# 관리자
http://localhost:18080/geo_admin/
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;로컬 PHP 서버로 실행&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서 기준으로는 PHP 7.4 이상과 pdo_pgsql, curl 확장이 필요합니다. 로컬 PostgreSQL도 준비되어 있어야 합니다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;git clone https://github.com/yaojingang/GEOFlow.git
cd GEOFlow

export DB_DRIVER=pgsql
export DB_HOST=127.0.0.1
export DB_PORT=5432
export DB_NAME=geo_system
export DB_USER=geo_user
export DB_PASSWORD=geo_password

php -S localhost:8080 router.php
&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;a href=&quot;https://raw.githubusercontent.com/yaojingang/GEOFlow/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;1) 관리자 로그인
2) AI 모델 등록
3) 제목/이미지/지식베이스/프롬프트 준비
4) 작업 생성
5) 스케줄러와 워커가 생성 실행
6) 초안 검토 후 게시
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CLI도 제공합니다. 구조를 보면 config, login, catalog, task, job, article 명령을 지원합니다. 즉, UI 없이도 작업 조회나 게시 자동화를 붙일 수 있습니다. (&lt;a href=&quot;https://raw.githubusercontent.com/yaojingang/GEOFlow/main/bin/geoflow&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;php bin/geoflow login --base-url http://localhost:18080
php bin/geoflow task list
php bin/geoflow article list
&lt;/code&gt;&lt;/pre&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;누가 쓰는가.&lt;br /&gt;콘텐츠 마케팅 팀이나 소규모 미디어 팀입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언제 유리한가.&lt;br /&gt;비슷한 형식의 글을 주기적으로 많이 발행해야 할 때입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 쓰는가.&lt;br /&gt;제목 라이브러리와 작업 스케줄을 결합해 반복 생산 흐름을 만들기 쉽기 때문입니다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. AI 에이전트 없이도 운영 가능한 생성 백엔드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;누가 쓰는가.&lt;br /&gt;복잡한 멀티에이전트 설계보다, 예측 가능한 운영 파이프라인이 필요한 개발팀입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언제 유리한가.&lt;br /&gt;생성 품질보다 작업 상태와 게시 흐름이 더 중요한 경우입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 쓰는가.&lt;br /&gt;작업, 큐, 워커, 게시 단계를 시스템 구조로 고정해 비결정성을 줄일 수 있기 때문입니다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&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;누가 쓰는가.&lt;br /&gt;여러 LLM 공급자를 비교하려는 팀입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언제 유리한가.&lt;br /&gt;같은 운영 흐름 위에서 모델만 바꿔보며 테스트하고 싶을 때입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 쓰는가.&lt;br /&gt;OpenAI 스타일 API 호환 구조 덕분에 통합 비용을 낮출 수 있기 때문입니다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 내부 편집팀이 있는 AI 콘텐츠 운영&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;누가 쓰는가.&lt;br /&gt;생성 결과를 사람이 검토해야 하는 조직입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언제 유리한가.&lt;br /&gt;법무 검수, 브랜드 톤 점검, 사실 확인이 필요한 콘텐츠를 다룰 때입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 쓰는가.&lt;br /&gt;초안-검토-게시 흐름이 이미 시스템에 포함돼 있기 때문입니다. (&lt;a href=&quot;https://raw.githubusercontent.com/yaojingang/GEOFlow/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&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;이 프로젝트는 범용 CMS가 아닙니다.&lt;/b&gt;&lt;br /&gt;현재 기준으로는 GEO/SEO 콘텐츠 운영에 맞춘 구조가 강합니다. 일반적인 기업용 콘텐츠 플랫폼처럼 다양한 편집 협업 기능이나 복잡한 권한 체계를 기대하면 맞지 않을 수 있습니다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘째, &lt;b&gt;생성 품질 자체를 보장하는 도구로 보면 오해가 생깁니다.&lt;/b&gt;&lt;br /&gt;GEOFlow는 좋은 글을 자동으로 보장하는 엔진이 아니라, 좋은 운영 구조를 제공하는 시스템입니다. 결과 품질은 결국 모델 선택, 프롬프트 설계, 지식 베이스 품질에 크게 좌우됩니다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;셋째, &lt;b&gt;작은 팀에게는 다소 무거울 수 있습니다.&lt;/b&gt;&lt;br /&gt;한두 편의 글을 수동으로 올리는 수준이라면, 관리자 화면&amp;middot;DB&amp;middot;워커&amp;middot;스케줄러까지 갖춘 구조가 오히려 과할 수 있습니다. 이런 경우에는 단순 스크립트나 기존 CMS 플러그인이 더 낫습니다. 이는 문서상 명시된 한계라기보다, 공개된 구조를 기준으로 한 실무적 판단입니다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;넷째, &lt;b&gt;현재 문서 기준으로는 대규모 운영에서의 검증 범위가 넓게 공개돼 있지는 않습니다.&lt;/b&gt;&lt;br /&gt;예를 들어 고가용성, 멀티 워커 확장 전략, 세밀한 권한 분리 같은 엔터프라이즈 운영 정보는 공개 자료에서 상세히 드러나지 않습니다. 따라서 대규모 상용 서비스에 바로 넣기 전에는 직접 검증이 필요합니다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow/tree/main/docs&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다섯째, &lt;b&gt;보안 기본값은 배포 직후 바로 손봐야 합니다.&lt;/b&gt;&lt;br /&gt;문서상 기본 관리자 계정과 비밀번호가 제공되며, APP_SECRET_KEY도 별도로 설정해야 합니다. 즉, 테스트 편의성은 높지만 운영 배포 전 보안 설정은 반드시 다시 해야 합니다. (&lt;a href=&quot;https://raw.githubusercontent.com/yaojingang/GEOFlow/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GEOFlow의 핵심 가치는 AI 모델을 더 잘 부르는 데 있지 않습니다.&lt;br /&gt;그보다 &lt;b&gt;콘텐츠 생성과 게시를 운영 가능한 시스템으로 바꾸는 데&lt;/b&gt; 있습니다.&lt;br /&gt;이 프로젝트는 &amp;ldquo;AI가 글을 써준다&amp;rdquo;보다, &amp;ldquo;AI를 콘텐츠 운영 체계 안에 넣는다&amp;rdquo;에 가깝습니다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이 도구는 특히 &lt;b&gt;스타트업, AI 에이전트 개발자, 반복형 콘텐츠를 운영하는 팀, 검토가 필요한 게시 워크플로를 가진 조직&lt;/b&gt;에 잘 맞습니다. 반대로 단발성 생성 실험만 원하는 개인에게는 구조가 다소 크고 무겁게 느껴질 수 있습니다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&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;b&gt;핵심 개념&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GEOFlow는 AI 콘텐츠 생성 도구가 아니라, 모델 설정부터 검토&amp;middot;게시까지를 묶은 운영 시스템이다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;차별점&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Admin, API, CLI, Scheduler, Worker, Front site를 함께 제공해 &amp;ldquo;생성 이후의 운영&amp;rdquo;까지 다룬다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;언제 쓰면 좋은지&lt;/b&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/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;언제 쓰면 안 되는지&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한두 편만 수동으로 생성하는 경우, 혹은 범용 CMS 수준의 협업 기능을 기대하는 경우에는 과할 수 있다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow/blob/main/docs/%E7%B3%BB%E7%BB%9F%E8%AF%B4%E6%98%8E%E6%96%87%E6%A1%A3.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;한 줄 요약&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GEOFlow는 &amp;ldquo;AI로 글을 쓰는 툴&amp;rdquo;이 아니라, &lt;b&gt;AI 기반 콘텐츠 운영 파이프라인을 실제 서비스 구조로 바꾸는 프로젝트&lt;/b&gt;다. (&lt;a href=&quot;https://github.com/yaojingang/GEOFlow&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AI</category>
      <author>행복한 수지아빠</author>
      <guid isPermaLink="true">https://javaexpert.tistory.com/1736</guid>
      <comments>https://javaexpert.tistory.com/1736#entry1736comment</comments>
      <pubDate>Tue, 14 Apr 2026 16:11:24 +0900</pubDate>
    </item>
    <item>
      <title>Open Agents : Vercel의 자율 에이전트 SDK</title>
      <link>https://javaexpert.tistory.com/1735</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;최근 AI 코딩 에이전트는 빠르게 늘어났지만, 실무에서 써보면 금방 한계가 드러납니다. 로컬에서 터미널을 켜 두고 지켜봐야 하고, 중간에 끊기면 다시 상태를 맞춰야 하며, 긴 작업은 요청-응답 수명 안에 가두기 어렵기 때문입니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Open Agents는 이 문제를 &amp;ldquo;에이전트를 오래 실행되게 만드는 방법&amp;rdquo;의 관점에서 다시 설계한 프로젝트입니다. 웹 UI, 워크플로우 기반의 에이전트 실행, 샌드박스 VM, 그리고 GitHub 연동을 한 구조로 묶어, 프롬프트에서 코드 변경과 푸시, PR 생성까지 이어지는 흐름을 만들었습니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글을 끝까지 읽으면 세 가지가 분명해집니다. 왜 기존 AI 코딩 에이전트가 실무에서 피로했는지, Open Agents가 그 문제를 어떤 아키텍처로 풀었는지, 그리고 이것이 단순한 데모가 아니라 기업용 AI 소프트웨어 팩토리의 뼈대로 왜 주목받는지입니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에이전트는&amp;nbsp;샌드박스와&amp;nbsp;워크플로우&amp;nbsp;기능을&amp;nbsp;활용해&amp;nbsp;시간&amp;nbsp;제한이나&amp;nbsp;타임아웃&amp;nbsp;없이&amp;nbsp;수많은&amp;nbsp;에이전트를&amp;nbsp;동시에&amp;nbsp;띄울&amp;nbsp;수&amp;nbsp;있고,&amp;nbsp;수&amp;nbsp;시간&amp;nbsp;동안&amp;nbsp;알아서&amp;nbsp;작업을&amp;nbsp;수행하며,&amp;nbsp;완료되면&amp;nbsp;깃허브에&amp;nbsp;코드를&amp;nbsp;저장하고&amp;nbsp;푸시까지&amp;nbsp;끝마칩니다.&lt;/p&gt;
&lt;figure id=&quot;og_1776150583563&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;open-agents/README.md at main &amp;middot; vercel-labs/open-agents&quot; data-og-description=&quot;An open source template for building cloud agents. - vercel-labs/open-agents&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot; data-og-url=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bC2G1h/dJMb9kmd8QV/sT3JoYFko3qyoRIJpM9Vhk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/NQk2E/dJMb9jOojly/KNinOtTI8r0Bp44o2RTeEK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bC2G1h/dJMb9kmd8QV/sT3JoYFko3qyoRIJpM9Vhk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/NQk2E/dJMb9jOojly/KNinOtTI8r0Bp44o2RTeEK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;open-agents/README.md at main &amp;middot; vercel-labs/open-agents&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;An open source template for building cloud agents. - vercel-labs/open-agents&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;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;p data-ke-size=&quot;size16&quot;&gt;AI 코딩 에이전트를 실제 개발 흐름에 넣으려면, 단순히 &amp;ldquo;코드를 잘 쓰는 모델&amp;rdquo;만으로는 부족합니다. 중요한 것은 긴 작업을 끊기지 않게 이어가고, 작업 상태를 보존하고, 결과를 실제 저장소 작업으로 연결하는 실행 구조입니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 방식은 비용 문제부터 드러납니다. 에이전트가 한 번의 대화 요청 안에서 모든 것을 처리하려고 하면, 컨텍스트를 계속 크게 들고 가야 하고, 실패했을 때 같은 맥락을 다시 불러오며 불필요한 모델 호출이 늘어납니다. 긴 작업일수록 이 비용은 더 커집니다. 이런 문제는 최근 에이전트 설계 논의에서도 반복해서 지적됩니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성능 문제도 큽니다. 요청 하나에 에이전트 실행을 몰아넣으면, 네트워크 지연이나 세션 종료, 브라우저 연결 해제 같은 외부 요인에 전체 실행이 흔들립니다. 작업이 길어질수록 &amp;ldquo;모델이 못해서&amp;rdquo;가 아니라 &amp;ldquo;실행 구조가 버티지 못해서&amp;rdquo; 실패하는 경우가 많아집니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유지보수 측면에서는 더 복잡합니다. 에이전트, 파일시스템, 셸 실행, Git 작업, 미리보기 서버가 한 덩어리처럼 얽히면 어디서 문제가 났는지 분리해서 보기 어렵습니다. 구조가 커질수록 디버깅 포인트도 늘어나고, 특정 모델이나 특정 실행 환경에 묶이는 순간 교체 비용도 커집니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 경험도 좋지 않습니다. 터미널을 계속 켜 두고 진행 상황을 지켜봐야 하고, 멈추면 수동으로 복구해야 하며, 여러 작업을 동시에 돌리기도 어렵습니다. 결국 &amp;ldquo;에이전트가 알아서 일한다&amp;rdquo;기보다 &amp;ldquo;사람이 에이전트를 계속 감시한다&amp;rdquo;에 가까워집니다. Open Agents는 바로 이 불편을 구조적으로 줄이려는 시도입니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Open Agents란 무엇인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Open Agents는 백그라운드에서 오래 실행되는 코딩 에이전트를 만들기 위한 오픈소스 레퍼런스 앱입니다. 더 정확히 말하면, 웹 UI와 에이전트 런타임, 워크플로우, 샌드박스, GitHub 연동을 한 번에 묶어 놓은 &amp;ldquo;구조 예제&amp;rdquo;에 가깝습니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 비유하면 이렇습니다. 기존 방식이 &amp;ldquo;노트북 안에서 직접 일하는 1인 개발자&amp;rdquo;라면, Open Agents는 &amp;ldquo;지시를 받으면 별도 작업실로 가서 일하고, 끝나면 저장소에 반영까지 하고 돌아오는 비동기 팀원&amp;rdquo;에 가깝습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기술적으로 중요한 정의는 따로 있습니다. 이 프로젝트는 에이전트를 샌드박스 안에 넣지 않습니다. 에이전트는 샌드박스 바깥에서 워크플로우로 실행되고, 샌드박스는 파일시스템&amp;middot;셸&amp;middot;Git&amp;middot;개발 서버를 제공하는 실행 환경으로 남습니다. 즉, &amp;ldquo;에이전트의 제어 평면&amp;rdquo;과 &amp;ldquo;코드가 실제로 돌아가는 실행 평면&amp;rdquo;을 분리한 구조입니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 점이 기존 방식과 가장 다릅니다. 보통은 VM 안에서 에이전트가 직접 모든 걸 처리하게 만들기 쉽습니다. 하지만 Open Agents는 에이전트 수명주기와 샌드박스 수명주기를 분리해, 워크플로우는 오래 살아남고, 샌드박스는 필요할 때 깨우고 쉬게 만드는 철학을 택했습니다. 모델이나 제공자 교체도 이 분리 덕분에 상대적으로 쉬워집니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&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;b&gt;웹 &amp;rarr; 워크플로우 &amp;rarr; 샌드박스의 3계층 구조&lt;/b&gt;&lt;br /&gt;UI, 제어 로직, 실행 환경을 분리했습니다. 그래서 화면이 끊겨도 작업 상태와 실행 흐름을 독립적으로 이어가기 좋습니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;에이전트가 요청 안에서 즉시 끝나지 않는 내구성 있는 실행&lt;/b&gt;&lt;br /&gt;채팅 요청이 에이전트를 인라인으로 돌리는 것이 아니라 워크플로우 실행을 시작합니다. 각 턴이 여러 지속 단계로 이어질 수 있어 긴 작업에 유리합니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;샌드박스 스냅샷 기반 재개&lt;/b&gt;&lt;br /&gt;샌드박스는 스냅샷 기반으로 재개할 수 있고, 비활성 시 하이버네이트됩니다. 긴 작업을 전부 새로 시작하지 않고 상태를 이어가기 좋은 설계입니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;GitHub 저장소 작업 자동화&lt;/b&gt;&lt;br /&gt;저장소 클론, 브랜치 작업, 선택적 자동 커밋, 푸시, PR 생성까지 지원합니다. 즉 &amp;ldquo;코드를 제안하는 도구&amp;rdquo;를 넘어 &amp;ldquo;저장소 변경까지 연결되는 도구&amp;rdquo;로 확장됩니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;모델&amp;middot;제공자와 실행 환경의 결합도 축소&lt;/b&gt;&lt;br /&gt;공식 설명에서도 모델/프로바이더 선택과 샌드박스 구현을 따로 진화시킬 수 있다고 밝힙니다. 특정 모델 종속을 줄이려는 팀에게 중요한 포인트입니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;포크해서 바꾸는 것을 전제로 한 레퍼런스 앱&lt;/b&gt;&lt;br /&gt;이 저장소는 블랙박스로 쓰라고 만든 것이 아니라, 포크하고 내부 프로세스에 맞게 바꾸라고 만든 구조입니다. 기업이 자체 AI 개발 자동화 체계를 구축할 때 특히 의미가 있습니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실제로 어떤 효과가 있는가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공개된 자료 기준으로 보면, Open Agents의 가장 큰 효과는 &amp;ldquo;사람이 에이전트 실행을 계속 붙들고 있지 않아도 된다&amp;rdquo;는 점입니다. 작업 요청은 워크플로우로 넘어가고, 실제 파일 조작과 셸 실행은 샌드박스에서 처리되며, 완료 후에는 GitHub 반영까지 이어질 수 있습니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전과 후를 비교하면 차이가 분명합니다. 전에는 로컬 터미널 세션 중심으로 에이전트를 돌리며, 세션 유지와 상태 감시를 사람이 맡았습니다. 이후에는 웹 UI에서 작업을 던지고, 지속 가능한 워크플로우가 상태를 이어가며, 샌드박스가 실제 실행을 담당합니다. 인간은 실행자가 아니라 감독자에 가까워집니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;효과가 가장 큰 상황도 뚜렷합니다. 코드 수정이 한두 파일에 그치지 않고, 저장소 전체 검색&amp;middot;셸 명령&amp;middot;브랜치 작업&amp;middot;미리보기 확인 같은 다단계 흐름이 필요한 경우입니다. 특히 &amp;ldquo;오래 걸리는 작업을 요청 수명주기에서 떼어내고 싶다&amp;rdquo;는 팀에서 체감이 큽니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 팀에 특히 유리한지도 명확합니다. 내부 도구 팀, 플랫폼 엔지니어링 팀, AI 코딩 자동화 실험을 하는 조직, 여러 모델을 바꿔가며 자체 프로세스에 맞는 에이전트를 만들려는 기업에 잘 맞습니다. 단순 챗봇이 아니라 &amp;ldquo;AI 소프트웨어 팩토리&amp;rdquo;의 실행 계층을 직접 만들려는 조직일수록 가치가 커집니다. 이는 최근 Vercel이 강조하는 에이전트 인프라 방향성과도 맞닿아 있습니다. (&lt;a href=&quot;https://vercel.com/blog/anyone-can-build-agents-but-it-takes-a-platform-to-run-them?utm_source=chatgpt.com&quot;&gt;Vercel&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 공개된 자료에는 &amp;ldquo;몇 배 빠르다&amp;rdquo; 같은 범용 정량 수치가 중심으로 제시되지는 않습니다. 그래서 이 도구의 가치는 벤치마크 숫자보다, 긴 실행&amp;middot;상태 보존&amp;middot;샌드박스 격리&amp;middot;GitHub 연계라는 운영 구조에서 판단하는 편이 더 정확합니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;동작 원리 / 구조&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;사용자가 웹 UI에서 작업을 요청합니다.&lt;/b&gt;&lt;br /&gt;이 계층은 인증, 세션, 채팅, 스트리밍 UI를 담당합니다. 중요한 점은 여기서 모든 일을 끝내지 않는다는 것입니다. 화면은 입력과 상태 표시를 맡고, 실제 장기 실행은 아래 계층으로 넘깁니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;요청은 에이전트 워크플로우 실행으로 변환됩니다.&lt;/b&gt;&lt;br /&gt;채팅 요청이 곧바로 에이전트 실행 본체가 되는 것이 아니라, 워크플로우 런이 시작됩니다. 이 설계 덕분에 실행은 단일 HTTP 요청에 묶이지 않고, 여러 지속 단계로 이어질 수 있습니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;에이전트는 샌드박스 바깥에서 도구를 통해 샌드박스를 조작합니다.&lt;/b&gt;&lt;br /&gt;파일 읽기, 수정, 검색, 셸 명령 같은 도구 호출을 통해 샌드박스와 상호작용합니다. 이때 샌드박스는 실행 환경일 뿐, 에이전트의 제어 평면이 아닙니다. 그래서 둘의 책임이 섞이지 않습니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;샌드박스는 실제 코드 작업을 수행합니다.&lt;/b&gt;&lt;br /&gt;파일시스템, 셸, Git, 개발 서버, 프리뷰 포트를 제공하고, 필요 시 하이버네이트 후 재개합니다. 이 구조는 &amp;ldquo;실행 중인 작업 공간&amp;rdquo;을 에이전트 논리와 분리해 재사용하고 관리하기 쉽게 만듭니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;완료 후 결과를 저장소 흐름으로 연결합니다.&lt;/b&gt;&lt;br /&gt;저장소 클론, 브랜치 작업, 자동 커밋, 푸시, PR 생성은 선택적으로 이어질 수 있습니다. 즉, 결과가 채팅 응답으로만 끝나지 않고 실제 코드 변경 이력으로 남습니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용자는 다시 접속해 기존 실행을 이어서 볼 수 있습니다.&lt;/b&gt;&lt;br /&gt;활성 실행은 기존 워크플로우 스트림에 다시 연결해 재개할 수 있습니다. 이것이 &amp;ldquo;에이전트를 오래 돌리는 구조&amp;rdquo;에서 매우 중요합니다. 브라우저 세션이나 탭 상태가 작업의 생존 조건이 아니기 때문입니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조가 중요한 이유는 분명합니다. 에이전트는 판단과 제어를 맡고, 샌드박스는 실행과 격리를 맡으며, 웹은 상호작용을 맡습니다. 이 세 층이 섞이지 않아야 장기 실행, 장애 복구, 모델 교체, 운영 정책 분리가 쉬워집니다. Open Agents의 핵심은 기능보다 이 분리 원칙에 있습니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치 / 사용 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 공개된 저장소 기준으로 로컬 실행 흐름은 비교적 단순합니다. 다만 &amp;ldquo;그냥 바로 실행되는 예제&amp;rdquo;라기보다, 데이터베이스와 시크릿, 인증 연동을 이해하고 설정해야 하는 레퍼런스 앱에 가깝습니다. 최소 런타임에는 PostgreSQL 연결 문자열과 JWE 시크릿이 필요하고, 실제 로그인 사용에는 추가 환경 변수가 필요합니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;설치 명령어&lt;/h3&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;git clone &amp;lt;open-agents 저장소&amp;gt;
cd open-agents
bun install
cp apps/web/.env.example apps/web/.env
&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;# apps/web/.env에 필수 값 입력
POSTGRES_URL=...
JWE_SECRET=...

# 필요 시 로그인/연동 관련 값 추가
ENCRYPTION_KEY=...
NEXT_PUBLIC_VERCEL_APP_CLIENT_ID=...
VERCEL_APP_CLIENT_SECRET=...

# 실행
bun run web
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬 개발에서 GitHub 저장소 접근, 푸시, PR 생성까지 사용하려면 GitHub App 관련 값도 추가로 필요합니다. 즉, 설치 자체보다 &amp;ldquo;권한과 연동을 어떻게 설계할 것인가&amp;rdquo;가 더 중요한 프로젝트입니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자주 쓰는 명령&lt;/h3&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;bun run web
bun run check
bun run typecheck
bun run ci
bun run sandbox:snapshot-base
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;저장소 구조&lt;/h3&gt;
&lt;pre class=&quot;glsl&quot;&gt;&lt;code&gt;apps/web         # Next.js 앱, 워크플로우, 인증, 채팅 UI
packages/agent   # 에이전트 구현, 도구, 서브에이전트, 스킬
packages/sandbox # 샌드박스 추상화와 Vercel Sandbox 연동
packages/shared  # 공통 유틸리티
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조만 봐도 의도가 드러납니다. UI, 에이전트 로직, 샌드박스 추상화가 나뉘어 있어서, 팀이 특정 부분만 교체하거나 내부 정책에 맞게 확장하기 좋습니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&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;플랫폼 팀이나 시니어 개발자가 대형 저장소를 한 번에 파악해야 할 때 유용합니다. 에이전트가 검색, 파일 읽기, 셸 실행을 이어가며 구조를 조사하고, 결과를 변경안이나 작업 브랜치로 연결할 수 있습니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&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;여러 파일에 걸친 타입 수정, API 마이그레이션, 폴더 구조 정리처럼 오래 걸리는 작업에서 가치가 큽니다. 로컬 터미널 세션보다 워크플로우 기반 지속 실행이 유리하기 때문입니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&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;기업이 코드 생성, 수정, 검증, 커밋, PR 생성까지 하나의 자동 흐름으로 묶고 싶을 때 좋은 출발점이 됩니다. 특히 사내 정책에 맞춘 인증, 권한, 승인 흐름을 덧붙여 자체 플랫폼으로 확장하기 좋습니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 모델 비종속형 에이전트 플랫폼 실험&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 모델 하나에 종속되지 않고, 모델 제공자나 실행 인프라를 바꿔가며 아키텍처를 검증하려는 팀에 적합합니다. 이 프로젝트는 저장소 자체가 그런 분리를 염두에 두고 설계되어 있습니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. AI 소프트웨어 팩토리의 뼈대 구축&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 &amp;ldquo;채팅으로 코드 생성&amp;rdquo;을 넘어서, 요청 접수부터 작업 공간 준비, 실행, 결과 반영, 저장소 기록까지 이어지는 시스템을 만들고 싶다면 좋은 토대가 됩니다. 특히 여러 에이전트를 역할별로 나누는 구조로 확장하기 쉽습니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;한계 / 주의할 점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째, 이것은 완제품보다 레퍼런스 앱에 가깝습니다. 문서상 확인되는 범위에서, 저장소도 블랙박스로 쓰기보다 포크해서 바꾸는 방식을 전제로 합니다. 즉, 바로 도입해 끝나는 제품이 아니라 내부 요구사항에 맞춰 조정해야 하는 베이스입니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘째, Vercel 중심의 인프라 전제를 이해해야 합니다. 워크플로우, 샌드박스, OAuth, GitHub App, 데이터베이스 설정이 함께 맞물립니다. 그래서 단순히 로컬에서 에이전트를 하나 돌려보는 수준보다, 운영 환경을 설계하는 역량이 더 중요합니다. 현재 기준으로는 개인 취미 프로젝트보다 플랫폼 성격의 팀 프로젝트에 더 잘 맞습니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;셋째, &amp;ldquo;모든 코딩 업무를 완전 자동화한다&amp;rdquo;는 식으로 이해하면 곤란합니다. 자동 커밋, 푸시, PR 생성은 지원되지만 항상 켜지는 강제 동작이 아니라 선택적 기능입니다. 결국 중요한 것은 자동화의 범위를 팀 정책에 맞게 제한하는 일입니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;넷째, 아직 검증 범위를 과장해서 보면 안 됩니다. 공개된 자료 기준으로는 구조와 실행 방식은 분명하지만, 모든 산업군과 모든 개발 문화에서 동일하게 잘 맞는다고 보기는 어렵습니다. 승인 체계가 강한 조직, 보안 규제가 엄격한 조직, 레거시 저장소가 복잡한 조직은 추가 설계가 필요합니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다섯째, &amp;ldquo;샌드박스가 있으니 안전하다&amp;rdquo;는 단순한 해석도 위험합니다. 샌드박스는 격리된 실행 환경이지만, 실제 운영에서는 권한 범위, 비밀값 관리, GitHub App 권한, 리뷰 프로세스 설계가 함께 필요합니다. 도구보다 운영 정책이 더 중요해지는 구간입니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Open Agents의 핵심 가치는 AI 코딩 에이전트를 더 똑똑하게 만드는 데만 있지 않습니다. 더 중요한 것은 에이전트를 오래 실행되고, 상태를 이어가고, 실제 저장소 작업으로 연결되는 구조로 바꿨다는 점입니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이 프로젝트는 &amp;ldquo;AI가 코드를 써준다&amp;rdquo;는 데모보다 한 단계 더 현실적입니다. 사람의 노트북과 터미널에 묶여 있던 에이전트를, 워크플로우와 샌드박스 위에서 관리 가능한 시스템으로 끌어올리기 때문입니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 스타트업의 내부 플랫폼 팀, AI 에이전트 개발자, 대규모 코드베이스를 운영하는 조직, 그리고 특정 모델에 종속되지 않는 자체 AI 소프트웨어 팩토리를 고민하는 팀에게 유용합니다. 반대로 단순한 코드 생성 챗봇만 필요하다면, 이 구조는 다소 무겁게 느껴질 수 있습니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&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;b&gt;핵심 개념&lt;/b&gt;&lt;br /&gt;Open Agents는 웹 UI, 내구성 있는 워크플로우 실행, 샌드박스 VM, GitHub 연동을 결합한 백그라운드 코딩 에이전트 레퍼런스 앱입니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;차별점&lt;/b&gt;&lt;br /&gt;에이전트를 샌드박스 안에 넣지 않고, 워크플로우와 샌드박스를 분리해 장기 실행&amp;middot;상태 보존&amp;middot;모델 비종속성&amp;middot;실행 환경 교체 가능성을 확보한 점이 핵심입니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;언제 쓰면 좋은지&lt;/b&gt;&lt;br /&gt;장시간 코딩 작업, 저장소 단위 자동화, 브랜치/PR까지 이어지는 개발 흐름, 기업 내부 AI 소프트웨어 팩토리 구축을 고민할 때 특히 좋습니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;언제 쓰면 안 되는지&lt;/b&gt;&lt;br /&gt;단순한 로컬 코드 생성 보조, 가벼운 개인 실험, 인프라와 권한 설계를 감당하기 어려운 팀에는 과할 수 있습니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;한 줄 요약&lt;/b&gt;&lt;br /&gt;Open Agents는 AI 코딩 에이전트를 &amp;ldquo;터미널에서 잠깐 돌리는 도구&amp;rdquo;에서 &amp;ldquo;오래 실행되고 저장소까지 책임지는 시스템&amp;rdquo;으로 바꾸는 오픈소스 구조입니다. (&lt;a href=&quot;https://github.com/vercel-labs/open-agents/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AI</category>
      <author>행복한 수지아빠</author>
      <guid isPermaLink="true">https://javaexpert.tistory.com/1735</guid>
      <comments>https://javaexpert.tistory.com/1735#entry1735comment</comments>
      <pubDate>Tue, 14 Apr 2026 16:09:51 +0900</pubDate>
    </item>
    <item>
      <title>ralph-orchestrator : ralph + 자율 에이전트</title>
      <link>https://javaexpert.tistory.com/1734</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 &lt;b&gt;ralph-orchestrator가 왜 등장했고, 자율 AI 에이전트 워크플로우를 어떻게 더 안정적으로 만들려는지&lt;/b&gt; 이해하기 위해 작성되었습니다. 단순히 &amp;ldquo;에이전트를 계속 돌리는 도구&amp;rdquo;로 보면 이 프로젝트의 핵심을 놓치게 됩니다. 이 도구가 겨냥하는 문제는 기능 부족이 아니라, &lt;b&gt;에이전트가 똑똑할수록 오히려 전체 흐름은 더 불안정해질 수 있다는 점&lt;/b&gt;입니다. (&lt;a href=&quot;https://github.com/mikeyobrien/ralph-orchestrator&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 자율 에이전트 방식은 보통 하나의 강한 프롬프트에 많은 책임을 몰아넣습니다. 계획도 세우고, 코드도 짜고, 테스트도 돌리고, 실패 원인도 스스로 해석하게 만듭니다. 처음엔 단순해 보이지만, 작업이 길어질수록 컨텍스트가 비대해지고, 실패 원인이 흐려지고, &amp;ldquo;됐다고 했는데 실제로는 안 된 상태&amp;rdquo;가 자주 생깁니다. ralph-orchestrator는 이 문제를 &lt;b&gt;일부러 더 단순한 역할 단위로 쪼개고, 이벤트와 검증 게이트로 연결하는 방식&lt;/b&gt;으로 다룹니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/concepts/hats-and-events/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&lt;/p&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;a href=&quot;https://github.com/mikeyobrien/ralph-orchestrator&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;figure id=&quot;og_1776150491261&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - mikeyobrien/ralph-orchestrator: An improved implementation of the Ralph Wiggum technique for autonomous AI agent orches&quot; data-og-description=&quot;An improved implementation of the Ralph Wiggum technique for autonomous AI agent orchestration - mikeyobrien/ralph-orchestrator&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/mikeyobrien/ralph-orchestrator&quot; data-og-url=&quot;https://github.com/mikeyobrien/ralph-orchestrator&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bKEDPc/dJMb9dHpwt4/AK2rAvk4BzuOUVciNvCLiK/img.png?width=1200&amp;amp;height=600&amp;amp;face=984_133_1025_178,https://scrap.kakaocdn.net/dn/B5L9h/dJMb8XR63tq/ezNzqHHbx1cZMmzmaMqeVK/img.png?width=1200&amp;amp;height=600&amp;amp;face=984_133_1025_178,https://scrap.kakaocdn.net/dn/4AKXV/dJMb9gxmNXj/kKsMfZsqUNs1T06h2vEqhK/img.png?width=1513&amp;amp;height=1128&amp;amp;face=0_0_1513_1128&quot;&gt;&lt;a href=&quot;https://github.com/mikeyobrien/ralph-orchestrator&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/mikeyobrien/ralph-orchestrator&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bKEDPc/dJMb9dHpwt4/AK2rAvk4BzuOUVciNvCLiK/img.png?width=1200&amp;amp;height=600&amp;amp;face=984_133_1025_178,https://scrap.kakaocdn.net/dn/B5L9h/dJMb8XR63tq/ezNzqHHbx1cZMmzmaMqeVK/img.png?width=1200&amp;amp;height=600&amp;amp;face=984_133_1025_178,https://scrap.kakaocdn.net/dn/4AKXV/dJMb9gxmNXj/kKsMfZsqUNs1T06h2vEqhK/img.png?width=1513&amp;amp;height=1128&amp;amp;face=0_0_1513_1128');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - mikeyobrien/ralph-orchestrator: An improved implementation of the Ralph Wiggum technique for autonomous AI agent orches&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;An improved implementation of the Ralph Wiggum technique for autonomous AI agent orchestration - mikeyobrien/ralph-orchestrator&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;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;p data-ke-size=&quot;size16&quot;&gt;자율 에이전트를 실무에 붙이면 가장 먼저 부딪히는 건 정확도보다 &lt;b&gt;신뢰성&lt;/b&gt;입니다. 모델이 한 번 잘 푸는 문제보다, 여러 단계가 이어지는 작업을 &lt;b&gt;계속 비슷한 품질로 마무리할 수 있느냐&lt;/b&gt;가 더 중요합니다. 그런데 단일 에이전트 방식은 이 지점에서 흔들리기 쉽습니다. 한 프롬프트가 너무 많은 책임을 가지면, 어느 단계에서 판단이 어긋났는지 추적하기가 어렵습니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/concepts/hats-and-events/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비용 문제도 바로 연결됩니다. 문서상 구조를 보면 Ralph는 컨텍스트 윈도우를 40~60% 수준의 &amp;ldquo;smart zone&amp;rdquo;으로 유지하려 하고, 이벤트는 데이터를 싣는 통로가 아니라 &lt;b&gt;작은 라우팅 신호&lt;/b&gt;로 쓰며, 자세한 내용은 메모리 쪽으로 밀어냅니다. 이 말은 곧 긴 작업일수록 &amp;ldquo;한 번에 다 들고 가는 방식&amp;rdquo;이 토큰 비용과 맥락 관리 면에서 불리하다는 뜻입니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/advanced/architecture/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성능 문제도 단순한 속도 문제가 아닙니다. 에이전트가 코드를 수정하고 &amp;ldquo;완료&amp;rdquo;라고 말했는데 테스트를 안 돌렸거나, 테스트는 돌렸지만 실패 로그를 잘못 해석하는 경우가 생깁니다. Ralph는 이런 상황을 줄이기 위해 &lt;b&gt;backpressure&lt;/b&gt;, 즉 통과 근거가 없으면 다음 단계로 못 넘어가게 하는 구조를 전면에 둡니다. &amp;ldquo;어떻게 할지&amp;rdquo;를 세세히 지시하기보다 &amp;ldquo;무엇이 완료인지&amp;rdquo;를 엄격하게 정의하는 쪽입니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/concepts/backpressure/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유지보수와 개발 경험도 중요합니다. 워크플로우가 커질수록 단일 프롬프트는 비결정성이 커지고, 프롬프트 수정이 곧 전체 시스템 수정이 됩니다. 반면 Ralph는 hat, event, backend, memory, task 같은 축으로 책임을 나눠 둡니다. 역할을 분리하면 디버깅 포인트도 분리되고, 특정 단계만 교체하거나 강화하기 쉬워집니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/advanced/architecture/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ralph-orchestrator란 무엇인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 문장으로 정의하면, &lt;b&gt;LLM이 스스로 똑똑하게 다 하길 기대하기보다, 단순한 역할이 이벤트를 주고받으며 반복 작업을 끝낼 때까지 조율하는 자율 에이전트 오케스트레이터&lt;/b&gt;입니다. 레포 설명에서도 이 프로젝트는 &amp;ldquo;task is done&amp;rdquo;까지 에이전트를 루프에 유지하는 hat-based orchestration framework로 소개됩니다. (&lt;a href=&quot;https://github.com/mikeyobrien/ralph-orchestrator&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 비유하면 이렇습니다. 한 명의 만능 요리사에게 &amp;ldquo;메뉴 구상, 재료 손질, 조리, 플레이팅, 위생 검사까지 전부 알아서 해&amp;rdquo;라고 맡기면 빠를 때도 있지만 실수도 커집니다. 반대로 주방장이 &amp;ldquo;이건 계획해&amp;rdquo;, &amp;ldquo;이건 만들어&amp;rdquo;, &amp;ldquo;이건 검증해&amp;rdquo;처럼 단위를 분리하면, 각 단계는 단순해지고 전체 흐름은 더 통제 가능해집니다. Ralph의 hat이 바로 이 분리된 역할입니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/concepts/hats-and-events/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기술적으로 보면 hat은 &lt;b&gt;트리거되는 이벤트&lt;/b&gt;, &lt;b&gt;발행할 수 있는 이벤트&lt;/b&gt;, &lt;b&gt;활성화될 때 주입되는 지시문&lt;/b&gt;으로 구성됩니다. 이벤트는 topic, payload, source hat, target hat 같은 필드를 가지며, 이벤트 버스가 이를 라우팅합니다. 즉 이 도구의 철학은 &amp;ldquo;거대한 자율성&amp;rdquo;보다 &lt;b&gt;작은 역할과 명확한 상태 전이&lt;/b&gt;에 가깝습니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/concepts/hats-and-events/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 방식과의 차이도 여기서 분명합니다. 많은 에이전트 프레임워크가 &amp;ldquo;더 많은 도구, 더 많은 추론, 더 긴 컨텍스트&amp;rdquo;로 문제를 풀려 한다면, Ralph는 오히려 &lt;b&gt;한 역할당 하나의 책임&lt;/b&gt;, &lt;b&gt;작은 이벤트&lt;/b&gt;, &lt;b&gt;검증 근거가 포함된 완료 신호&lt;/b&gt;를 권장합니다. 그래서 이 프로젝트는 단순한 자동화 도구라기보다, 자율 워크플로우를 설계하는 하나의 운영 원칙에 가깝습니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/concepts/hats-and-events/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&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;b&gt;Hat 기반 역할 분리&lt;/b&gt;&lt;br /&gt;planner, builder, critic, finalizer 같은 역할을 나눠 실행할 수 있습니다. 한 에이전트가 모든 판단을 떠안지 않게 만들어, 실패 원인을 단계별로 분리하기 쉽습니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/guide/presets/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이벤트 중심 오케스트레이션&lt;/b&gt;&lt;br /&gt;task.start, plan.ready, build.done 같은 typed event로 흐름을 이동시킵니다. 이 구조 덕분에 워크플로우를 프롬프트 덩어리가 아니라 상태 전이로 다룰 수 있습니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/concepts/hats-and-events/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Backpressure 기반 품질 게이트&lt;/b&gt;&lt;br /&gt;테스트, 린트, 타입체크, 보안 점검 같은 증거가 없으면 완료로 인정하지 않는 설계를 지원합니다. &amp;ldquo;대충 끝났다&amp;rdquo;는 선언을 구조적으로 막으려는 점이 핵심입니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/concepts/backpressure/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;멀티 백엔드 지원&lt;/b&gt;&lt;br /&gt;Claude Code, Kiro, Gemini CLI, Codex, Amp, Copilot CLI, OpenCode를 지원하며 자동 감지와 명시적 선택이 가능합니다. 특정 모델이나 CLI에 종속되지 않고 오케스트레이션 계층을 분리하려는 의도가 보입니다. (&lt;a href=&quot;https://github.com/mikeyobrien/ralph-orchestrator&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;지속 상태 관리&lt;/b&gt;&lt;br /&gt;.agent/ 아래에 memories, tasks, event history 같은 상태를 저장합니다. 긴 작업에서 이전 판단과 작업 흔적을 잃지 않도록 한 설계입니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/advanced/architecture/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;작게 유지되는 기본 프리셋&lt;/b&gt;&lt;br /&gt;기본 builtin은 code-assist, debug, research, review, pdd-to-code-assist 정도로 작게 유지됩니다. 문서상 설명도 &amp;ldquo;지원 표면적을 줄이고 테스트 가능한 범위에 집중하겠다&amp;rdquo;는 방향입니다. (&lt;a href=&quot;https://github.com/mikeyobrien/ralph-orchestrator&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실제로 어떤 효과가 있는가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공개된 자료 기준으로 보면 Ralph가 강조하는 효과는 숫자형 성능 벤치마크보다 &lt;b&gt;실패 방식의 통제&lt;/b&gt;에 있습니다. 즉 &amp;ldquo;더 똑똑해진다&amp;rdquo;보다는 &amp;ldquo;덜 엉뚱하게 실패한다&amp;rdquo;에 가깝습니다. 계획, 구현, 검증, 최종 완료를 서로 다른 역할로 나누고, 각 단계가 근거를 싣고 다음 단계로 넘어가게 만들면 완료 선언의 품질이 안정됩니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/guide/presets/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전후 비교로 보면, 기존 방식은 하나의 프롬프트 안에서 계획과 실행과 검증이 섞여 있습니다. Ralph 방식은 planner &amp;rarr; builder &amp;rarr; critic/finalizer처럼 역할을 분리하고, 필요하면 reviewer가 빌더의 주장을 다시 검증합니다. 이 구조는 특히 &lt;b&gt;여러 번 수정과 검증이 반복되는 개발 작업&lt;/b&gt;에서 효과가 커집니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/guide/presets/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;효과가 극대화되는 상황도 비교적 분명합니다. 코드 수정 후 테스트, 린트, 타입체크, 문서 반영까지 여러 단계가 이어지는 작업, 또는 디버깅처럼 &amp;ldquo;원인 분석&amp;rdquo;과 &amp;ldquo;수정&amp;rdquo;을 분리해야 하는 작업에 잘 맞습니다. 반대로 한 번의 짧은 생성 작업이라면 이 구조가 주는 이득보다 오버헤드가 더 클 수 있습니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/guide/presets/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 유리한 팀은 AI 에이전트를 개인 장난감이 아니라 &lt;b&gt;반복 가능한 팀 워크플로우&lt;/b&gt;로 다루려는 곳입니다. 스타트업의 빠른 프로토타이핑, AI 개발도구를 실험하는 팀, 대규모 코드베이스에서 작업 완료 기준을 엄격히 관리해야 하는 팀에 잘 맞습니다. 현재 GitHub 기준으로 이 프로젝트는 공개 저장소로 운영되고 있고, 2026년 4월 10일 기준 최신 릴리스는 2.9.2이며, GitHub 페이지에는 약 2.7k 스타가 표시됩니다. 관심과 유지보수도 일정 수준 확인됩니다. (&lt;a href=&quot;https://github.com/mikeyobrien/ralph-orchestrator&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;동작 원리 / 구조&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;입력을 받습니다.&lt;/b&gt;&lt;br /&gt;보통 ralph run -p &quot;...&quot; 형태로 작업을 시작하거나, ralph plan으로 먼저 계획 문서를 만듭니다. 빠른 시작 문서에서는 ralph init으로 백엔드를 선택하고, ralph plan으로 요구사항&amp;middot;설계&amp;middot;구현 계획 파일을 만든 뒤, ralph run으로 구현을 이어가는 흐름을 제시합니다. (&lt;a href=&quot;https://github.com/mikeyobrien/ralph-orchestrator&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;설정과 역할 컬렉션을 불러옵니다.&lt;/b&gt;&lt;br /&gt;기본 설정은 ralph.yml에서 읽고, 필요하면 -c로 core 설정을 덮어쓰며, -H로 hat collection을 따로 지정할 수 있습니다. 이 분리는 &amp;ldquo;실행 환경 설정&amp;rdquo;과 &amp;ldquo;워크플로우 정의&amp;rdquo;를 अलग-अलग 다루게 해 줍니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/guide/configuration/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이벤트 루프가 시작됩니다.&lt;/b&gt;&lt;br /&gt;아키텍처 문서상 핵심 엔진은 ralph-core의 EventLoop입니다. 전통적 모드에서는 프롬프트를 백엔드로 보내고 출력이 LOOP_COMPLETE인지 확인하며 반복하고, hat-based 모드에서는 시작 이벤트가 이벤트 버스로 들어가고 매칭되는 hat이 실행됩니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/advanced/architecture/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;활성화된 hat의 지시문이 주입됩니다.&lt;/b&gt;&lt;br /&gt;각 hat은 어떤 이벤트에서 켜지고, 어떤 이벤트를 발행할 수 있는지, 그리고 어떤 지시를 받아야 하는지가 정의돼 있습니다. 이 과정에서 역할이 작게 유지될수록 모델이 해야 할 판단도 작아집니다. 그래서 문서도 &amp;ldquo;한 hat에 하나의 책임&amp;rdquo;을 강하게 권장합니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/concepts/hats-and-events/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;백엔드 CLI가 실제 작업을 수행합니다.&lt;/b&gt;&lt;br /&gt;ralph-adapters가 Claude, Gemini, Codex 같은 CLI 백엔드를 연결하고, PTY 기반 실행과 스트림 처리를 담당합니다. 오케스트레이터는 모델 그 자체가 아니라, 모델을 호출하는 실행 계층을 감싸는 구조입니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/advanced/architecture/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;출력을 파싱해 이벤트나 완료 상태로 바꿉니다.&lt;/b&gt;&lt;br /&gt;에이전트가 ralph emit으로 이벤트를 발행하면 이벤트 버스가 다음 hat으로 넘깁니다. 완료 신호가 오면 종료하고, 아니면 다음 반복으로 이어집니다. 결국 이 시스템의 본질은 &amp;ldquo;대화&amp;rdquo;보다 &lt;b&gt;상태 머신에 가까운 루프 제어&lt;/b&gt;입니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/concepts/hats-and-events/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;메모리와 작업 상태를 디스크에 남깁니다.&lt;/b&gt;&lt;br /&gt;.agent/ 아래의 memories.md, tasks.jsonl, event_history.jsonl 같은 파일이 여기에 해당합니다. 이 설계 덕분에 긴 작업에서도 결과와 근거를 외부 상태로 보관할 수 있고, 이벤트는 작게 유지할 수 있습니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/advanced/architecture/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 설계된 이유는 명확합니다. 긴 자율 작업에서 가장 큰 적은 &amp;ldquo;모델이 순간적으로 똑똑하지 않은 것&amp;rdquo;보다 &lt;b&gt;전체 흐름이 한 덩어리로 엉켜 있는 것&lt;/b&gt;이기 때문입니다. Ralph는 그 엉킴을 줄이기 위해 루프, 역할, 이벤트, 검증을 나눴습니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/concepts/hats-and-events/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치 / 사용 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서 기준 권장 설치 방식은 npm입니다. Cargo와 GitHub 릴리스 설치 스크립트도 제공됩니다. (&lt;a href=&quot;https://github.com/mikeyobrien/ralph-orchestrator&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;npm install -g @ralph-orchestrator/ralph-cli
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;avrasm&quot;&gt;&lt;code&gt;cargo install ralph-cli
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 기본적인 실행 흐름은 아래와 같습니다. 백엔드를 초기화하고, 계획을 만들고, 그 계획을 구현하는 순서입니다. (&lt;a href=&quot;https://github.com/mikeyobrien/ralph-orchestrator&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# 1) 초기화
ralph init --backend claude

# 2) 기능 계획
ralph plan &quot;Add user authentication with JWT&quot;

# 3) 구현 실행
ralph run -p &quot;Implement the feature in specs/user-authentication/&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 짧게 시작하려면 바로 실행할 수도 있습니다. 이 경우 복잡한 구조 설계 없이 기본 루프부터 시험해 볼 수 있습니다. (&lt;a href=&quot;https://github.com/mikeyobrien/ralph-orchestrator&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;ralph run -p &quot;Add input validation to the /users endpoint&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내장 hat 컬렉션을 명시적으로 쓰고 싶다면 이런 형태도 가능합니다. code-assist가 기본 구현 작업용으로 권장되고, debug, research, review 같은 특화 모드가 따로 준비돼 있습니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/guide/cli-reference/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;ralph init --backend claude
ralph run -c ralph.yml -H builtin:code-assist -p &quot;Add OAuth login&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최소 실행 예제를 하나만 더 들면, Ralph식 워크플로우의 핵심은 &amp;ldquo;역할 분리 + 증거 기반 완료&amp;rdquo;입니다. 예를 들어 builder가 일을 마친 뒤 이렇게 이벤트를 발행하게 만들 수 있습니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/concepts/hats-and-events/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;mel&quot;&gt;&lt;code&gt;ralph emit &quot;build.done&quot; &quot;tests: pass, lint: pass, typecheck: pass&quot;
&lt;/code&gt;&lt;/pre&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;누가 보더라도 가장 직접적인 활용처입니다. planner가 작업을 쪼개고, builder가 구현하고, critic이나 finalizer가 검토하는 식으로 흘러갑니다. 단순 코드 생성보다 &amp;ldquo;완료 조건이 있는 구현 작업&amp;rdquo;에 더 어울립니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/guide/presets/&quot;&gt;mikeyobrien.github.io&lt;/a&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;버그 수정은 구현과 다르게 원인 재현, 원인 분석, 수정, 검증이 분리돼야 합니다. 문서상 debug builtin은 investigator, tester, fixer, verifier 같은 역할로 이 흐름을 강화합니다. 단일 프롬프트보다 실패 원인을 남기기 좋습니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/guide/presets/&quot;&gt;mikeyobrien.github.io&lt;/a&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;코드를 바꾸지 않고 읽기만 하면서 위험 요소를 찾는 review, 읽고 요약하는 research 같은 모드도 있습니다. 운영 코드 수정 없이 분석 워크플로우를 따로 돌리고 싶을 때 유용합니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/guide/presets/&quot;&gt;mikeyobrien.github.io&lt;/a&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;빠른 시작 문서에 ralph plan이 따로 있는 이유도 여기 있습니다. 요구사항, 설계, 구현 계획을 먼저 파일로 만들고 나서 구현 루프로 넘기면, 에이전트가 &amp;ldquo;무엇을 만들지&amp;rdquo;와 &amp;ldquo;어떻게 만들지&amp;rdquo;를 섞어버리는 문제를 줄일 수 있습니다. (&lt;a href=&quot;https://github.com/mikeyobrien/ralph-orchestrator&quot;&gt;GitHub&lt;/a&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;Telegram 기반의 RObot 기능을 통해 에이전트가 질문을 던지고, 사람이 중간에 방향을 수정할 수 있습니다. 완전 무인 자율보다, 장기 실행 중에 사람 승인이 필요한 팀에 더 현실적입니다. (&lt;a href=&quot;https://github.com/mikeyobrien/ralph-orchestrator&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&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;입니다. 문서상 확인되는 범위에서 보면 Ralph는 모델 품질 자체를 대체하지 않습니다. 모델이 잘못 판단할 가능성은 여전히 있고, 다만 그 실수를 &lt;b&gt;더 작은 단계에서 드러내고 되돌리기 쉽게&lt;/b&gt; 만들 뿐입니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/concepts/backpressure/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;적용이 어려운 경우도 있습니다. 작업이 아주 짧고 단순하면 hat, event, gate를 설계하는 비용이 오히려 더 큽니다. 한두 번의 생성으로 끝나는 개인 작업이라면, 일반적인 단일 에이전트 호출이 더 빠를 수 있습니다. Ralph는 길고 반복적이며 검증이 필요한 흐름에서 이득이 커집니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/guide/presets/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비용 측면에서도 오해하면 안 됩니다. 역할 분리와 검증 루프는 실패를 줄이는 대신 호출 수를 늘릴 수 있습니다. 문서에는 작업 유형별 권장 예산과 반복 최적화, 비용 모니터링, 자동 중단 같은 안내가 따로 있을 정도로, 이 시스템은 애초에 비용 관리가 중요한 도구입니다. 즉 &amp;ldquo;오케스트레이션을 넣으면 무조건 싸진다&amp;rdquo;가 아니라, &lt;b&gt;큰 실패를 줄여 총비용을 관리하려는 접근&lt;/b&gt;으로 보는 편이 맞습니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/guide/cost-management/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 기준으로는 웹 대시보드도 알파 상태입니다. 문서상 &amp;ldquo;rough edges and breaking changes&amp;rdquo;가 명시돼 있어, 핵심은 여전히 CLI와 설정 기반 사용에 있습니다. 실무 도입 시에는 먼저 CLI 루프와 프리셋을 익힌 뒤, 대시보드는 보조 도구로 보는 편이 안전합니다. (&lt;a href=&quot;https://github.com/mikeyobrien/ralph-orchestrator&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 하나는 구조 복잡도입니다. 문서가 일부러 내장 프리셋 수를 줄이고 &amp;ldquo;작은 supported set&amp;rdquo;을 유지하는 이유도 여기에 있습니다. 워크플로우를 너무 많이 제품 표면으로 끌어올리면, 문서화와 테스트와 유지보수 비용이 폭증합니다. 자율 워크플로우 설계에서 가장 흔한 실패는 기능 부족보다 &lt;b&gt;구조 과잉&lt;/b&gt;입니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/guide/presets/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ralph-orchestrator의 핵심 가치는 &amp;ldquo;에이전트를 더 똑똑하게 만들겠다&amp;rdquo;가 아닙니다. 오히려 &lt;b&gt;에이전트가 복잡하게 굴지 않아도 되도록, 역할과 검증 구조를 먼저 설계하겠다&lt;/b&gt;에 가깝습니다. 그래서 이 프로젝트는 모델 성능보다 워크플로우 신뢰성에 관심이 많은 사람에게 더 중요합니다. (&lt;a href=&quot;https://github.com/mikeyobrien/ralph-orchestrator&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 스타트업, AI 에이전트 개발자, 반복적인 코드 수정과 검증이 많은 팀, 대규모 코드베이스를 운영하는 팀이라면 참고할 가치가 큽니다. 반대로 짧고 단발성인 작업이라면 이 구조가 과할 수 있습니다. 결국 이 도구가 던지는 메시지는 단순합니다. &lt;b&gt;자율성은 크게 주는 것보다, 잘게 나눠 통제하는 편이 더 실용적일 때가 많다&lt;/b&gt;는 것입니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/guide/presets/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&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;b&gt;핵심 개념&lt;/b&gt;&lt;br /&gt;ralph-orchestrator는 hat, event, backpressure를 이용해 자율 에이전트 작업을 역할 단위로 분리해 조율하는 오케스트레이터입니다. (&lt;a href=&quot;https://github.com/mikeyobrien/ralph-orchestrator&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;차별점&lt;/b&gt;&lt;br /&gt;큰 단일 프롬프트에 모든 책임을 몰지 않고, 작은 역할과 증거 기반 완료 신호로 흐름을 설계합니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/concepts/hats-and-events/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;언제 쓰면 좋은지&lt;/b&gt;&lt;br /&gt;구현, 디버깅, 리뷰, 스펙 기반 개발처럼 여러 단계와 검증 기준이 있는 장기 작업에 적합합니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/guide/presets/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;언제 쓰면 안 되는지&lt;/b&gt;&lt;br /&gt;단순하고 짧은 생성 작업, 역할 분리보다 속도가 더 중요한 개인성 업무에는 오버헤드가 될 수 있습니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/guide/cost-management/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;한 줄 요약&lt;/b&gt;&lt;br /&gt;ralph-orchestrator는 &amp;ldquo;강한 단일 에이전트&amp;rdquo;보다 &amp;ldquo;단순한 역할들의 통제된 협업&amp;rdquo;으로 자율 워크플로우 신뢰성을 높이려는 구현체입니다. (&lt;a href=&quot;https://mikeyobrien.github.io/ralph-orchestrator/concepts/hats-and-events/&quot;&gt;mikeyobrien.github.io&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AI</category>
      <author>행복한 수지아빠</author>
      <guid isPermaLink="true">https://javaexpert.tistory.com/1734</guid>
      <comments>https://javaexpert.tistory.com/1734#entry1734comment</comments>
      <pubDate>Tue, 14 Apr 2026 16:08:17 +0900</pubDate>
    </item>
    <item>
      <title>Stretchy Studio: PSD,PNG-&amp;gt;2D 캐릭터로 변경</title>
      <link>https://javaexpert.tistory.com/1733</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1456&quot; data-origin-height=&quot;738&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wQh6C/dJMcagLWiXm/uNjzkYrmD2RknBm0vIDPBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wQh6C/dJMcagLWiXm/uNjzkYrmD2RknBm0vIDPBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wQh6C/dJMcagLWiXm/uNjzkYrmD2RknBm0vIDPBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwQh6C%2FdJMcagLWiXm%2FuNjzkYrmD2RknBm0vIDPBK%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;1456&quot; height=&quot;738&quot; data-origin-width=&quot;1456&quot; data-origin-height=&quot;738&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정적인 PSD나 PNG를 가져와서, 복잡한 리깅 작업 없이 빠르게 2D 캐릭터 애니메이션으로 바꾸는 흐름을 설명합니다. 특히 이 도구가 단순한 편집기가 아니라, 레이어 분해된 캐릭터를 실제 애니메이션 파이프라인으로 연결하는 데 초점을 둔 이유를 다룹니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 2D 캐릭터 애니메이션 도구는 크게 두 가지 불편이 있었습니다. 하나는 본 세팅과 파라미터 설계가 무겁다는 점이고, 다른 하나는 AI가 분해해 준 레이어를 실제 애니메이션 가능한 구조로 옮기는 과정이 생각보다 수작업 중심이라는 점입니다. Stretchy Studio는 이 사이를 메우기 위해, 타임라인 중심 편집과 메쉬 변형을 결합하는 방향으로 설계되었습니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글을 끝까지 읽으면 세 가지가 잡힙니다. 왜 이 도구가 기존 Live2D식 접근과 다른지, 어떤 구조로 동작하는지, 그리고 실제로 어떤 팀이나 프로젝트에서 유리한지입니다. 동시에 아직 부족한 부분과 당장 쓰기 전에 알아야 할 주의점도 함께 정리합니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio/blob/master/PROJECT_STATUS.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;왜 이 문제가 중요한가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2D 캐릭터 애니메이션 제작은 생각보다 비용이 큽니다. 레이어를 정리하고, 본을 잡고, 변형 포인트를 설계하고, 타임라인을 세팅하는 과정이 모두 사람 손을 탑니다. 캐릭터 수가 늘어나면 작업량은 거의 선형이 아니라 관리 복잡도까지 포함해 더 가파르게 증가합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성능 문제도 있습니다. 단순 이미지 레이어만 다룰 때는 가볍지만, 리깅과 변형 시스템이 들어가면 렌더링과 편집 상태 관리가 복잡해집니다. 특히 계층 구조, 드로우 오더, 메시 편집, 키프레임 보간이 한 화면 안에서 같이 돌아가야 해서 툴 구조가 금방 무거워집니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유지보수 관점에서도 어려움이 큽니다. 파라미터 기반 툴은 기능이 늘수록 상태 조합이 폭발하고, 디버깅 포인트도 많아집니다. 어떤 포즈가 왜 그렇게 나왔는지 추적하기 어렵고, 애니메이션 결과가 추상 파라미터에 묶이면 수정 비용도 올라갑니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio/blob/master/PROJECT_STATUS.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 경험도 문제입니다. 구조가 복잡해질수록 &amp;ldquo;가져오기 &amp;rarr; 리깅 &amp;rarr; 수정 &amp;rarr; 애니메이션 &amp;rarr; 저장&amp;rdquo;의 전체 흐름을 끝까지 작동시키기가 어려워집니다. Stretchy Studio는 이 문제를 의식해, 각 마일스톤마다 끝에서 끝까지 동작하는 얇은 기능 조각을 만드는 방식으로 발전해 왔습니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio/blob/master/PROJECT_STATUS.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;figure id=&quot;og_1776150307215&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;stretchystudio/PROJECT_STATUS.md at master &amp;middot; MangoLion/stretchystudio&quot; data-og-description=&quot;FOSS 2D animation tool for turning static illustrations into mesh-deformable characters - MangoLion/stretchystudio&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/MangoLion/stretchystudio/blob/master/PROJECT_STATUS.md&quot; data-og-url=&quot;https://github.com/MangoLion/stretchystudio/blob/master/PROJECT_STATUS.md&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/wctoU/dJMb8XkgJPr/RKgPCom2rTB4tFMcLzukNK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/sGrFa/dJMb8UHQv8K/CMmOtF8kvkdJSzJnpyFaLk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/MangoLion/stretchystudio/blob/master/PROJECT_STATUS.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/MangoLion/stretchystudio/blob/master/PROJECT_STATUS.md&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/wctoU/dJMb8XkgJPr/RKgPCom2rTB4tFMcLzukNK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/sGrFa/dJMb8UHQv8K/CMmOtF8kvkdJSzJnpyFaLk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;stretchystudio/PROJECT_STATUS.md at master &amp;middot; MangoLion/stretchystudio&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;FOSS 2D animation tool for turning static illustrations into mesh-deformable characters - MangoLion/stretchystudio&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Stretchy Studio란 무엇인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stretchy Studio는 정적인 2D 레이어 이미지를 가져와, 메쉬 변형과 스켈레톤 기반 조작을 통해 빠르게 애니메이션 가능한 캐릭터로 바꾸는 웹 기반 2D 애니메이션 툴입니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비유하면 이 도구는 &amp;ldquo;포토샵 레이어를 바로 만질 수 있는 경량 애니메이션 스튜디오&amp;rdquo;에 가깝습니다. 그림을 가져오고, 필요한 부분만 메쉬를 만들고, 관절을 잡고, 타임라인 위에서 바로 움직이는 방식입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기술적으로는 전통적인 본 회전 중심 방식만 쓰지 않습니다. 필요한 부위에는 스켈레톤을 얹고, 더 유기적인 움직임이 필요한 부위에는 메시 정점 변형을 직접 적용합니다. 그래서 단순 회전보다 더 부드러운 머리카락, 눈, 팔다리 움직임을 만들 수 있습니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 방식과 가장 큰 차이는 철학입니다. 이 프로젝트는 원래 Live2D 스타일의 파라미터 시스템을 고려했지만, 이후 이를 버리고 타임라인 우선 구조로 방향을 틀었습니다. 즉, 추상 파라미터를 설계하는 도구가 아니라, 애니메이터가 바로 키프레임을 찍는 도구에 더 가깝습니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio/blob/master/PROJECT_STATUS.md&quot;&gt;GitHub&lt;/a&gt;)&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;b&gt;타임라인 우선 편집 구조&lt;/b&gt;&lt;br /&gt;파라미터를 설계하는 대신 키프레임 중심으로 움직입니다. 그래서 처음 쓰는 사람도 상태 모델보다 결과 화면에 집중하기 쉽습니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio/blob/master/PROJECT_STATUS.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;메쉬 온디맨드 생성&lt;/b&gt;&lt;br /&gt;가져온 모든 레이어에 즉시 무거운 메쉬를 만들지 않습니다. 처음에는 단순 쿼드로 렌더링하고, 필요한 파트만 나중에 메쉬를 생성해 비용과 복잡도를 줄입니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio/blob/master/PROJECT_STATUS.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PSD 기반 다층 가져오기와 자동 정리&lt;/b&gt;&lt;br /&gt;PSD 레이어를 유지한 채 가져오고, 특정 캐릭터 태그 패턴을 인식해 머리&amp;middot;눈&amp;middot;상체&amp;middot;하체 같은 구조로 자동 그룹화합니다. 초기 세팅 시간을 줄이는 데 중요한 기능입니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;휴리스틱 리깅과 AI 리깅을 함께 지원&lt;/b&gt;&lt;br /&gt;빠른 시작이 필요하면 경계 상자 기반 휴리스틱 리깅을, 정확도가 더 필요하면 DWPose 기반 ONNX 추정을 사용할 수 있습니다. 즉시성와 정확도 사이에서 선택할 수 있습니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio/blob/master/PROJECT_STATUS.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정점 변형 기반의 유기적 움직임&lt;/b&gt;&lt;br /&gt;회전만으로는 부족한 부위에 정점 단위 변형을 적용할 수 있습니다. 그래서 숨쉬기, 머리카락 흔들림, 미세한 표정 변화 같은 표현에 유리합니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프로젝트 저장/불러오기 구조가 이미 들어가 있음&lt;/b&gt;&lt;br /&gt;현재 기준으로 .stretch 포맷 저장과 로드가 구현되어 있습니다. 실험용 프로토타입을 넘어서, 작업 지속성을 염두에 둔 구조라는 점이 중요합니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio/blob/master/PROJECT_STATUS.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실제로 어떤 효과가 있는가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공개된 자료 기준으로 보면, Stretchy Studio의 효과는 &amp;ldquo;세팅 시간 단축&amp;rdquo;과 &amp;ldquo;전체 흐름 일체화&amp;rdquo;에 가깝습니다. PSD를 가져온 뒤 그룹 정리, 리깅, 타임라인 편집, 저장/불러오기까지 한 툴 안에서 이어지기 때문에, 툴 사이를 오가며 자산을 다시 맞추는 비용이 줄어듭니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전후 비교로 보면 차이가 더 선명합니다. 기존 방식은 레이어 정리 후 별도 리깅과 별도 애니메이션 세팅이 필요했다면, 이 프로젝트는 가져오기 직후 자동 그룹화와 리깅 보조를 제공하고 바로 타임라인 작업으로 넘어갑니다. 특히 see-through 방식처럼 이미 분해된 캐릭터 자산이 있을수록 효과가 커집니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성능 측면에서는 현재 프로젝트 상태 문서 기준으로, 리깅된 캐릭터와 애니메이션 재생에서 60fps를 목표로 하고 있으며 저장은 200~500ms, 불러오기는 500ms~2초 수준으로 정리되어 있습니다. 또한 저장 포맷은 base64 JSON 방식 대비 파일 크기를 40~60% 수준으로 줄였다고 설명합니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio/blob/master/PROJECT_STATUS.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이 도구는 특히 작은 팀, AI 레이어 분해 결과를 바로 움직여야 하는 팀, 프로토타입을 빠르게 만들어야 하는 캐릭터 애니메이션 작업에 잘 맞습니다. 반대로 정교한 장편 제작 파이프라인 전체를 대체하는 도구로 보기에는 아직 이릅니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio/blob/master/PROJECT_STATUS.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;동작 원리 / 구조&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;입력 자산을 가져옵니다&lt;/b&gt;&lt;br /&gt;PNG 또는 PSD를 불러오고, PSD라면 레이어 이름과 순서를 유지한 채 분해합니다. 이 단계에서 이미지 데이터와 알파 정보가 이후 선택, 메시 생성, 렌더링의 기초가 됩니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프로젝트 트리와 그룹 구조를 만듭니다&lt;/b&gt;&lt;br /&gt;각 파트는 part 또는 group 노드로 프로젝트 트리에 들어갑니다. 부모-자식 관계, 가시성, 불투명도, 변환 정보가 이 트리에 모이고, 이후 모든 편집은 이 구조를 기준으로 이뤄집니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio/blob/master/PROJECT_STATUS.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;필요하면 자동 정리와 리깅을 수행합니다&lt;/b&gt;&lt;br /&gt;레이어 이름이 특정 패턴을 만족하면 머리, 눈, 몸통 같은 그룹으로 자동 정리됩니다. 리깅은 빠른 휴리스틱 방식이나 DWPose 기반 AI 추정으로 진행되며, 마지막에는 캔버스에서 관절을 직접 조정합니다. 이 설계는 자동화와 수동 제어의 균형을 맞추기 위한 선택입니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio/blob/master/PROJECT_STATUS.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;렌더링 전에 월드 변환을 계산합니다&lt;/b&gt;&lt;br /&gt;렌더러는 먼저 트리를 깊이 우선으로 순회하며 부모 행렬과 로컬 행렬을 합성해 각 노드의 월드 행렬을 만듭니다. 이렇게 해야 그룹 이동이나 회전이 자식 파트에 자연스럽게 전파됩니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio/blob/master/PROJECT_STATUS.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;드로우 오더 기준으로 실제 그립니다&lt;/b&gt;&lt;br /&gt;그 다음 패스에서는 드로우 오더에 따라 각 파트를 GPU에 올린 버퍼와 함께 렌더링합니다. 메쉬가 없다면 단순 쿼드로, 메쉬가 있다면 삼각형 메시로 그립니다. 즉, 단순한 파트와 변형이 필요한 파트를 같은 시스템 안에서 다루기 위한 구조입니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio/blob/master/PROJECT_STATUS.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;애니메이션은 타임라인 상태에서 보간됩니다&lt;/b&gt;&lt;br /&gt;애니메이션 스토어가 현재 시간, 재생 상태, 포즈 오버라이드, 키프레임을 관리합니다. 중요한 점은 선택과 편집도 저장된 원본 좌표가 아니라 &amp;ldquo;현재 시점에 계산된 유효 포즈&amp;rdquo;를 기준으로 해야 한다는 점인데, 실제로 관련 버그를 수정한 기록도 있습니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio/blob/master/PROJECT_STATUS.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;메쉬 생성은 별도 알고리즘으로 처리됩니다&lt;/b&gt;&lt;br /&gt;메시 생성은 알파 마스크를 만들고, 경계를 추적하고, 내부를 샘플링한 뒤 삼각분할을 수행하는 파이프라인으로 구성됩니다. 경계보다 약간 바깥으로 확장하는 dilation을 두는 이유는, 변형 시 이미지 가장자리가 찢어져 보이는 현상을 줄이기 위해서입니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio/blob/master/mesh_gen_doc.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치 / 사용 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 문서 기준으로 로컬 개발 환경은 Node.js 18 이상과 pnpm을 권장합니다. 프레임워크는 React와 Vite를 기반으로 하고, UI는 Shadcn UI와 Tailwind CSS 조합 위에 올라가 있습니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치와 실행 흐름은 아래처럼 이해하면 됩니다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;git clone &amp;lt;repository&amp;gt;
cd stretchystudio
pnpm install
pnpm dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 후에는 로컬 개발 서버에서 에디터를 열고, PSD 또는 PNG를 드래그해 가져옵니다. 그 다음 리깅 마법사로 뼈대를 잡고, Animation 모드로 전환해 키프레임을 추가하는 흐름입니다. 문서상 빠른 시작은 &amp;ldquo;가져오기 &amp;rarr; 오토 리깅 &amp;rarr; 애니메이션&amp;rdquo;의 3단계에 가깝게 정리되어 있습니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최소 실행 예시는 이렇게 볼 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;pnpm install
pnpm dev
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;1) PSD 또는 PNG 가져오기
2) 필요하면 자동 리깅 또는 수동 리깅 선택
3) 관절 위치 보정
4) Animation 모드로 전환
5) 키프레임 추가 후 재생
6) 프로젝트 저장
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 쓰는 예시 / 활용 시나리오&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;AI로 분해된 캐릭터 PSD를 바로 움직여야 하는 경우&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 레이어가 나뉜 캐릭터를 갖고 있지만, 이를 애니메이션 가능한 구조로 바꾸는 작업이 남아 있을 때 적합합니다. see-through 계열 자산을 바로 이어서 다루도록 설계된 점이 강점입니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;VTuber 스타일의 간단한 리깅 프로토타입이 필요한 경우&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정교한 수작업 리깅 전에 빠르게 뼈대를 추정하고 테스트해 볼 수 있습니다. 휴리스틱 방식은 빠르고, DWPose 방식은 더 정밀한 시작점을 줍니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio/blob/master/PROJECT_STATUS.md&quot;&gt;GitHub&lt;/a&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;눈동자, 머리카락, 호흡 같은 부위는 단순 회전보다 메시 정점 변형이 더 자연스럽습니다. Stretchy Studio는 이 지점을 위해 만들어진 도구에 가깝습니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;게임용 2D 자산 애니메이션을 빠르게 실험하는 경우&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 기준으로는 스프라이트시트 내보내기 단계가 다음 마일스톤으로 남아 있지만, 구조적으로는 그 방향을 분명히 보고 있습니다. 따라서 게임 자산용 실험 도구로는 충분히 흥미롭습니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio/blob/master/PROJECT_STATUS.md&quot;&gt;GitHub&lt;/a&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;프로젝트 스토어, 애니메이션 스토어, WebGL 렌더러, 메시 생성 파이프라인이 비교적 명확하게 분리돼 있어, 에디터 아키텍처 사례로 읽기 좋습니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;한계 / 주의할 점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서상 확인되는 범위에서, 이 프로젝트는 아직 완성형 상용 제작 파이프라인이라고 보긴 어렵습니다. 현재 기준으로 M6는 완료됐지만, 스프라이트시트 내보내기와 GIF&amp;middot;비디오 출력, 물리 시뮬레이션, undo/redo 통합, 블렌드 모드 같은 기능은 다음 단계로 남아 있습니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio/blob/master/PROJECT_STATUS.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;적용이 어려운 경우도 분명합니다. PSD의 CMYK, 스마트 오브젝트, 복잡한 레이어 효과, 특수 블렌드 모드는 아직 충분히 검증되지 않았다고 적혀 있습니다. 즉, 일러스트 원본이 복잡할수록 바로 가져와서 완벽히 동작한다고 기대하면 안 됩니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio/blob/master/PROJECT_STATUS.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오해하기 쉬운 부분도 있습니다. 이 도구는 &amp;ldquo;무조건 AI가 전부 해주는 자동 애니메이션 툴&amp;rdquo;이 아닙니다. 자동 리깅과 보조 기능은 있지만, 실제 결과 품질은 그룹 구조, 관절 보정, 메시 밀도 조절, 키프레임 설계에 여전히 많이 좌우됩니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio/blob/master/PROJECT_STATUS.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 기준으로는 특히 대규모 팀의 정교한 아트 파이프라인 전체를 대체하기보다, 빠른 제작&amp;middot;실험&amp;middot;프로토타이핑에 더 잘 맞습니다. 반대로 이미 성숙한 전용 툴체인과 자동화가 갖춰진 스튜디오라면 도입 이득이 제한적일 수 있습니다. 이 점은 기대치를 맞추는 데 중요합니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio/blob/master/PROJECT_STATUS.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stretchy Studio의 핵심 가치는 복잡한 2D 캐릭터 애니메이션 제작을 &amp;ldquo;리깅 시스템 설계&amp;rdquo;가 아니라 &amp;ldquo;편집 가능한 작업 흐름&amp;rdquo;으로 다시 묶어낸 데 있습니다. PSD 가져오기, 그룹 구조, 리깅, 메시 변형, 타임라인, 저장까지 한 흐름으로 연결하려는 점이 분명합니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 이 도구는 스타트업, AI 기반 캐릭터 생성 파이프라인을 다루는 팀, VTuber&amp;middot;게임용 2D 캐릭터를 빠르게 움직여 봐야 하는 개발자와 아티스트에게 잘 맞습니다. 반대로 정교한 최종 제작 파이프라인을 즉시 대체할 도구를 찾고 있다면, 아직은 실험적 성격을 함께 감안해야 합니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio/blob/master/PROJECT_STATUS.md&quot;&gt;GitHub&lt;/a&gt;)&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;b&gt;핵심 개념&lt;/b&gt;&lt;br /&gt;정적인 2D 레이어 이미지를 메시 변형과 스켈레톤, 타임라인 편집으로 바로 애니메이션 가능한 구조로 바꾸는 웹 기반 도구입니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;차별점&lt;/b&gt;&lt;br /&gt;Live2D식 파라미터 중심 접근보다, 타임라인에서 직접 키프레임과 변형을 다루는 방향으로 설계됐다는 점이 가장 큰 차이입니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio/blob/master/PROJECT_STATUS.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;언제 쓰면 좋은지&lt;/b&gt;&lt;br /&gt;AI로 분해된 PSD를 빠르게 움직이고 싶을 때, 캐릭터 리깅 프로토타입을 빠르게 만들고 싶을 때, 메시 기반 미세 변형이 필요한 2D 캐릭터 작업에 적합합니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;언제 쓰면 안 되는지&lt;/b&gt;&lt;br /&gt;복잡한 PSD 기능까지 완전 호환되는 상용급 파이프라인 대체재가 필요한 경우, 혹은 GIF&amp;middot;비디오&amp;middot;물리 시뮬레이션 같은 후속 기능이 필수인 경우에는 아직 맞지 않을 수 있습니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio/blob/master/PROJECT_STATUS.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;한 줄 요약&lt;/b&gt;&lt;br /&gt;Stretchy Studio는 &amp;ldquo;AI로 분해된 2D 캐릭터를, 무거운 파라미터 설계 없이 바로 움직이기 위한 타임라인 중심 애니메이션 툴&amp;rdquo;로 이해하면 가장 정확합니다. (&lt;a href=&quot;https://github.com/MangoLion/stretchystudio&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AI</category>
      <author>행복한 수지아빠</author>
      <guid isPermaLink="true">https://javaexpert.tistory.com/1733</guid>
      <comments>https://javaexpert.tistory.com/1733#entry1733comment</comments>
      <pubDate>Tue, 14 Apr 2026 16:07:23 +0900</pubDate>
    </item>
    <item>
      <title>16GB GPU로 100GB 넘는 초거대 모델을 돌린다고요?</title>
      <link>https://javaexpert.tistory.com/1732</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;ldquo;원래는 안 될 것 같은데, 요즘은 됩니다&amp;rdquo;의 진짜 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 들으면 이상합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;27B, 70B, 100B, 심지어 200B가 넘는 모델을&lt;br /&gt;고작 16GB VRAM GPU로 돌릴 수 있다.&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상식적으로는 말이 안 되는 이야기처럼 보입니다.&lt;br /&gt;보통 대형 모델은 &lt;b&gt;모델 전체가 GPU 메모리(VRAM)에 올라가야 실행된다&lt;/b&gt;고 알려져 있기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 많은 분들이 이렇게 생각합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;아니, 100GB가 넘는 모델이면&lt;br /&gt;당연히 VRAM도 그 정도는 있어야 하는 거 아닌가?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네, &lt;b&gt;최고 속도로 돌리려면 그 말이 맞습니다.&lt;/b&gt;&lt;br /&gt;하지만 요즘은 꼭 그렇게만 돌리지 않습니다.&lt;br /&gt;최근 추론 엔진과 양자화 기술이 발전하면서, 이제는 &lt;b&gt;GPU 메모리만으로 버티는 시대&lt;/b&gt;에서 &lt;b&gt;GPU + RAM을 함께 활용하는 시대&lt;/b&gt;로 넘어오고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말하면,&lt;br /&gt;예전에는 &amp;ldquo;전부 비싼 전용 창고에 넣어야만 작업 가능&amp;rdquo;했다면,&lt;br /&gt;이제는 &amp;ldquo;핵심 물건만 전용 창고에 두고, 나머지는 옆 창고를 빌려서&amp;rdquo; 처리할 수 있게 된 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서는&lt;br /&gt;**왜 16GB GPU로도 100GB가 넘는 모델이 &amp;lsquo;돌아갈 수 있는지&amp;rsquo;**를&lt;br /&gt;아주 쉽게, 핵심만 정리해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 16G 그래픽카드로만 돌아가진 않고 추가로 DRAM(예로 96G)을 세팅해주면 통합 메모리 사용하는 맥이나 DGX SPARK보단 빠르게 돌아갈수 있습니다.&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;많은 사람들이 헷갈리는 이유는,&lt;br /&gt;사실 &lt;b&gt;&amp;ldquo;돌아간다&amp;rdquo;와 &amp;ldquo;빠르게 돌아간다&amp;rdquo;를 같은 뜻으로 생각하기 때문&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;완전히 GPU에 올려 최고 속도로 추론하는 것&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;GPU와 시스템 메모리를 같이 써서 느리지만 실행 가능하게 만드는 것&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 둘은 완전히 다른 이야기입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;br /&gt;&amp;ldquo;100GB 모델이면 100GB 이상의 VRAM이 필요하다&amp;rdquo;는 말은&lt;br /&gt;대체로 &lt;b&gt;최고 성능 기준&lt;/b&gt;에서는 맞는 말입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면,&lt;br /&gt;Unsloth나 llama.cpp 계열에서 말하는 세팅은&lt;br /&gt;&amp;ldquo;전부 GPU에 넣는 방식&amp;rdquo;이 아니라&lt;br /&gt;&lt;b&gt;일부는 GPU, 나머지는 RAM으로 분산해서 일단 실행되게 만드는 방식&lt;/b&gt;에 가깝습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 여기 있습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;요즘은 모델을 한 덩어리로 다루지 않고,&lt;br /&gt;잘게 나눠서 필요한 자원을 쪼개 쓰는 방식이 가능해졌다.&lt;/b&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;1. 레이어 오프로딩: 모델을 통째로 올리지 않고, 나눠서 처리한다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 중요한 개념은 &lt;b&gt;레이어 오프로딩(layer offloading)&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM은 하나의 거대한 파일처럼 보이지만,&lt;br /&gt;실제로는 내부적으로 여러 개의 &lt;b&gt;레이어(layer)&lt;/b&gt;로 구성되어 있습니다.&lt;br /&gt;추론할 때는 이 레이어들을 순서대로 통과하면서 계산이 진행됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예전에는 이 레이어 대부분을 GPU에 올려야 한다고 생각했지만,&lt;br /&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;GPU(16GB VRAM)&lt;/b&gt;: 연산이 빠른 핵심 일부 레이어 담당&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시스템 RAM(예: 96GB)&lt;/b&gt;: 나머지 대부분의 레이어 보관&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CPU&lt;/b&gt;: RAM에 있는 레이어 계산 보조 및 데이터 이동 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 모델 전체를 GPU에 억지로 다 넣는 대신,&lt;br /&gt;&lt;b&gt;GPU에 들어갈 수 있는 만큼만 올리고&lt;/b&gt;,&lt;br /&gt;나머지는 시스템 메모리에 둔 채 &lt;b&gt;필요할 때 불러와 계산&lt;/b&gt;하는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 비유하면 이해가 쉽습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시험 문제를 푸는 데&lt;br /&gt;가장 똑똑한 학생 한 명(GPU)에게 모든 문제를 다 맡기고 싶지만,&lt;br /&gt;책상이 너무 작아서 문제지를 다 펼칠 수 없는 상황입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서&lt;br /&gt;정말 계산이 많이 필요한 문제 몇 장만 그 학생 책상에 올려두고,&lt;br /&gt;나머지는 뒤에서 다른 학생들(CPU + RAM)이 들고 있다가&lt;br /&gt;필요한 순간마다 넘겨주는 방식으로 푸는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 이 방식은 비효율이 있습니다.&lt;br /&gt;문제를 옮겨주고 받는 시간이 들기 때문입니다.&lt;br /&gt;하지만 중요한 건, &lt;b&gt;원래 아예 못 풀던 문제를 이제는 풀 수 있게 되었다&lt;/b&gt;는 점입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;br /&gt;오프로딩은 &amp;ldquo;최고 속도&amp;rdquo;를 만드는 기술이라기보다&lt;br /&gt;**&amp;ldquo;한정된 하드웨어에서도 대형 모델을 실행 가능하게 만드는 기술&amp;rdquo;**이라고 보는 편이 정확합니다.&lt;/p&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;양자화(Quantization)&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 기술이 중요한 이유는 아주 단순합니다.&lt;br /&gt;대형 모델이 무거운 이유는 결국 &lt;b&gt;숫자를 너무 많이, 너무 정밀하게 저장하기 때문&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래 LLM은 보통 FP16 같은 고정밀 숫자 형식으로 저장됩니다.&lt;br /&gt;이 방식은 정확하지만, 메모리를 엄청나게 먹습니다.&lt;br /&gt;모델이 커질수록 용량은 금방 수십 GB, 수백 GB 단위로 커집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 추론에서는&lt;br /&gt;항상 그렇게까지 정밀한 숫자가 필요한 것은 아닙니다.&lt;br /&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;/li&gt;
&lt;li&gt;4비트, 경우에 따라 더 낮은 비트 수준으로 줄여서&lt;/li&gt;
&lt;li&gt;메모리 사용량을 크게 낮추는 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 FP16 기반 모델은 너무 커서 엄두가 안 나더라도,&lt;br /&gt;이를 4비트 계열로 양자화하면&lt;br /&gt;용량이 크게 줄어들어 &lt;b&gt;현실적인 PC 환경에서도 다뤄볼 수 있는 크기&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;GGUF&lt;/li&gt;
&lt;li&gt;IQ4&lt;/li&gt;
&lt;li&gt;Q4_K&lt;/li&gt;
&lt;li&gt;UD-IQ4_XS&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 이름들은 대체로&lt;br /&gt;&lt;b&gt;모델을 어떤 방식으로 압축했는지&lt;/b&gt;,&lt;br /&gt;그리고 &lt;b&gt;속도&amp;middot;용량&amp;middot;성능 균형을 어떻게 맞췄는지&lt;/b&gt;를 나타내는 포맷 또는 양자화 방식입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 포인트는 하나입니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;모델이 원래 크기 그대로 올라가는 게 아니라,&lt;br /&gt;훨씬 더 작은 형태로 줄어든 뒤 올라간다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 270B급처럼 원래는 상상하기 어려운 모델도&lt;br /&gt;4비트 수준으로 줄이면&lt;br /&gt;&amp;ldquo;아주 빠르진 않아도, RAM 많은 PC에서 겨우겨우 돌려볼 수 있는 영역&amp;rdquo;으로 내려오게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 공짜는 아닙니다.&lt;br /&gt;양자화를 하면 일부 성능 손실은 생길 수 있습니다.&lt;br /&gt;하지만 최근 양자화 기법은 꽤 정교해져서,&lt;br /&gt;많은 사용자는 &lt;b&gt;생각보다 큰 품질 저하 없이&lt;/b&gt; 실사용 가능한 수준을 경험합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 양자화는&lt;br /&gt;대형 모델을 위한 마법이 아니라,&lt;br /&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;3. 왜 어떤 경우엔 Mac보다 PC가 더 빠를까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이쯤에서 흥미로운 질문이 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그럼 메모리가 넉넉한 Mac이 무조건 유리한 거 아닌가?&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직관적으로는 그렇게 보입니다.&lt;br /&gt;특히 Apple Silicon의 통합 메모리 구조는&lt;br /&gt;GPU와 CPU가 같은 메모리 풀을 공유하기 때문에&lt;br /&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;/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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대형 모델 추론에서는 단순히 &amp;ldquo;메모리가 하나로 합쳐져 있느냐&amp;rdquo;보다&lt;br /&gt;&lt;b&gt;실제 연산 성능&lt;/b&gt;과&lt;br /&gt;&lt;b&gt;데이터를 처리하는 전체 파이프라인&lt;/b&gt;이 더 중요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고성능 NVIDIA GPU가 들어간 PC는&lt;br /&gt;비록 모델 일부를 RAM에서 가져와야 하는 병목이 있더라도,&lt;br /&gt;정작 GPU가 계산을 시작하면 그 연산 속도 자체가 매우 강력합니다.&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;Mac은 구조가 우아하고 안정적이지만&lt;/li&gt;
&lt;li&gt;PC는 병목이 있어도 GPU 화력이 워낙 강해서&lt;/li&gt;
&lt;li&gt;실제 토큰 생성 속도에서는 더 유리할 수 있는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분은 자동차에 비유하면 이해가 쉽습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mac은 큰 짐칸이 달린 일체형 차량처럼 볼 수 있습니다.&lt;br /&gt;짐을 싣고 내리는 흐름이 자연스럽고 효율적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 PC는&lt;br /&gt;짐칸과 엔진룸이 분리되어 있어서 중간 이동 과정이 번거롭지만,&lt;br /&gt;엔진 자체가 훨씬 강력해서&lt;br /&gt;막상 달리기 시작하면 더 빠를 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 &amp;ldquo;통합 메모리니까 무조건 빠르다&amp;rdquo;도 아니고,&lt;br /&gt;&amp;ldquo;오프로딩이 있으니 PC가 무조건 좋다&amp;rdquo;도 아닙니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정확히 말하면,&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Mac은 큰 모델을 다루는 경험이 부드럽고,&lt;br /&gt;PC는 적절한 조합이면 더 높은 추론 속도를 낼 수 있다&lt;/b&gt;&lt;br /&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;결국 정리하면: VRAM이 부족해도, RAM을 빌려서 돌리는 시대다&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;예전에는 대형 모델을 돌리려면 큰 VRAM이 필수였지만,&lt;br /&gt;이제는 오프로딩과 양자화 덕분에 시스템 RAM까지 활용해서 &amp;ldquo;느리지만 실행 가능한&amp;rdquo; 구성이 가능해졌다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 우리가 흔히 떠올리는 기준은&lt;br /&gt;아직도 **&amp;ldquo;모델 전체를 GPU에 올리는 방식&amp;rdquo;**에 머물러 있는 경우가 많습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 최근 로컬 LLM 생태계는 다릅니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모델을 레이어 단위로 나누고&lt;/li&gt;
&lt;li&gt;일부는 GPU에, 나머지는 RAM에 두고&lt;/li&gt;
&lt;li&gt;양자화로 크기를 크게 줄이고&lt;/li&gt;
&lt;li&gt;CPU와 GPU가 협력해서 추론을 이어가는 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 점점 보편화되고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이제는&lt;br /&gt;&amp;ldquo;이론상 불가능해 보이는 하드웨어 조합&amp;rdquo;에서도&lt;br /&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;/li&gt;
&lt;li&gt;응답 지연이 꽤 클 수 있습니다&lt;/li&gt;
&lt;li&gt;컨텍스트 길이나 배치 설정에 따라 더 버거울 수 있습니다&lt;/li&gt;
&lt;li&gt;사용 경험은 &amp;ldquo;쾌적하다&amp;rdquo;기보다 &amp;ldquo;된다&amp;rdquo;에 가까울 수 있습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼에도 불구하고 의미는 큽니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예전에는&lt;br /&gt;초거대 모델을 만져보려면&lt;br /&gt;수천만 원대 장비나 서버급 환경이 사실상 전제 조건처럼 느껴졌습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이제는&lt;br /&gt;RAM이 넉넉한 일반 데스크톱과&lt;br /&gt;적당한 GPU만 있어도&lt;br /&gt;&amp;ldquo;완전한 최고 성능은 아니지만, 직접 돌려보고 감을 잡아보는 것&amp;rdquo;이 가능한 시대가 된 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 변화는 꽤 중요합니다.&lt;br /&gt;왜냐하면 기술의 진입장벽이 낮아졌다는 뜻이기 때문입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이제 질문은 &amp;ldquo;돌아가냐&amp;rdquo;가 아니라 &amp;ldquo;어느 정도로 쓸 만하냐&amp;rdquo;에 가깝다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로 로컬 LLM 환경에서 더 중요한 질문은&lt;br /&gt;&amp;ldquo;이 모델이 내 PC에서 아예 실행되느냐&amp;rdquo;보다&lt;br /&gt;**&amp;ldquo;내 용도에서 어느 정도 속도와 품질로 쓸 만하냐&amp;rdquo;**가 될 가능성이 큽니다.&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;문서 요약 정도인지&lt;/li&gt;
&lt;li&gt;코딩 보조인지&lt;/li&gt;
&lt;li&gt;장문 추론이 필요한지&lt;/li&gt;
&lt;li&gt;속도가 중요한지, 아니면 모델 크기가 중요한지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에 따라 최적의 선택은 달라집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 사람에게는&lt;br /&gt;작지만 빠른 14B 모델이 더 좋은 선택일 수 있고,&lt;br /&gt;또 어떤 사람에게는&lt;br /&gt;느리더라도 훨씬 큰 70B 이상 모델을 오프로딩으로 돌려보는 것이 더 의미 있을 수 있습니다.&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;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리해보면 이렇습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대형 모델을 돌릴 때 필요한 &amp;ldquo;128GB VRAM&amp;rdquo; 같은 조건은&lt;br /&gt;대개 &lt;b&gt;모델을 전부 GPU에 올려 빠르게 돌릴 때의 기준&lt;/b&gt;입니다.&lt;br /&gt;반면 최근 로컬 추론 환경은&lt;br /&gt;&lt;b&gt;레이어 오프로딩 + 양자화 + CPU/RAM 협업&lt;/b&gt;을 통해&lt;br /&gt;훨씬 적은 GPU 메모리로도 대형 모델을 실행 가능하게 만들고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;br /&gt;16GB GPU로 100GB가 넘는 모델을 돌린다는 말은&lt;br /&gt;&amp;ldquo;말도 안 되는 허풍&amp;rdquo;이라기보다,&lt;br /&gt;정확히는 **&amp;ldquo;RAM까지 총동원해서 느리지만 돌아가게 만든 구성&amp;rdquo;**에 가깝습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 지금은&lt;br /&gt;무조건 가장 비싼 GPU가 있어야만 초거대 모델을 경험할 수 있는 시대가 아닙니다.&lt;br /&gt;물론 최고 성능은 여전히 고가 장비의 영역에 가깝습니다.&lt;br /&gt;하지만 적어도 이제는,&lt;br /&gt;&lt;b&gt;일반 사용자도 충분히 대형 모델의 세계를 직접 찍어먹어볼 수 있는 시대&lt;/b&gt;가 된 것은 분명합니다.&lt;/p&gt;</description>
      <category>AI</category>
      <author>행복한 수지아빠</author>
      <guid isPermaLink="true">https://javaexpert.tistory.com/1732</guid>
      <comments>https://javaexpert.tistory.com/1732#entry1732comment</comments>
      <pubDate>Tue, 14 Apr 2026 09:56:18 +0900</pubDate>
    </item>
    <item>
      <title>마크다운 파일 17개로 만드는 나만의 콘텐츠 엔진</title>
      <link>https://javaexpert.tistory.com/1731</link>
      <description>&lt;p data-end=&quot;898&quot; data-start=&quot;869&quot; data-ke-size=&quot;size16&quot;&gt;대부분의 사람들은 AI를 콘텐츠 제작에 이렇게 쓴다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1036&quot; data-start=&quot;900&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;915&quot; data-start=&quot;900&quot; data-section-id=&quot;4j42y0&quot;&gt;Claude를 연다&lt;/li&gt;
&lt;li data-end=&quot;949&quot; data-start=&quot;916&quot; data-section-id=&quot;1wwr2xx&quot;&gt;&amp;ldquo;생산성에 대한 링크드인 포스트 써줘&amp;rdquo;라고 입력한다&lt;/li&gt;
&lt;li data-end=&quot;981&quot; data-start=&quot;950&quot; data-section-id=&quot;1amxgp4&quot;&gt;회사 인턴이 쓴 것 같은 평범한 포스트를 받는다&lt;/li&gt;
&lt;li data-end=&quot;1008&quot; data-start=&quot;982&quot; data-section-id=&quot;1jmtstz&quot;&gt;로봇처럼 안 들리게 20분 동안 손본다&lt;/li&gt;
&lt;li data-end=&quot;1036&quot; data-start=&quot;1009&quot; data-section-id=&quot;3gkfto&quot;&gt;그리고 플랫폼마다 그걸 또 처음부터 반복한다&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;1070&quot; data-start=&quot;1038&quot; data-ke-size=&quot;size16&quot;&gt;이건 시스템이 아니다.&lt;br /&gt;그냥 단계만 더 많은 잡일이다.&lt;/p&gt;
&lt;p data-end=&quot;1173&quot; data-start=&quot;1072&quot; data-ke-size=&quot;size16&quot;&gt;문제는 AI가 아니다.&lt;br /&gt;문제는 네가 AI에게 &lt;b&gt;브랜드, 독자, 말투, 플랫폼 전략, 그리고 이 모든 요소가 어떻게 연결되는지에 대한 맥락을 전혀 주지 않고 있다는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;1217&quot; data-start=&quot;1175&quot; data-ke-size=&quot;size16&quot;&gt;매번 새 채팅을 시작할 때마다 기억상실에 걸린 천재를 새로 고용하는 셈이다.&lt;/p&gt;
&lt;p data-end=&quot;1247&quot; data-start=&quot;1219&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결책: 스킬 그래프가 이 문제를 해결한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1268&quot; data-start=&quot;1249&quot; data-ke-size=&quot;size16&quot;&gt;신입 직원을 고용한다고 생각해보자.&lt;/p&gt;
&lt;p data-end=&quot;1345&quot; data-start=&quot;1270&quot; data-ke-size=&quot;size16&quot;&gt;첫날부터 아무 온보딩도 없이, 문서도 없이, 회사가 어떻게 돌아가는지에 대한 맥락도 없이 바로 실전에 던져놓고 잘하길 바랄 수도 있다.&lt;/p&gt;
&lt;p data-end=&quot;1421&quot; data-start=&quot;1347&quot; data-ke-size=&quot;size16&quot;&gt;아니면 네가 누구인지, 어떻게 일하는지, 누구에게 말하는지, 좋은 결과물이 어떤 것인지 설명하는 완전한 플레이북을 건네줄 수도 있다.&lt;/p&gt;
&lt;p data-end=&quot;1470&quot; data-start=&quot;1423&quot; data-ke-size=&quot;size16&quot;&gt;스킬 그래프는 그 플레이북이다.&lt;br /&gt;다만 사람용이 아니라 &lt;b&gt;AI 에이전트용&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;1556&quot; data-start=&quot;1472&quot; data-ke-size=&quot;size16&quot;&gt;기술적으로 보면, 이것은 서로 연결된 마크다운 파일들의 폴더일 뿐이다.&lt;br /&gt;각 파일은 하나의 &amp;ldquo;지식 노드&amp;rdquo;, 즉 네 콘텐츠 시스템 두뇌의 한 조각이다.&lt;/p&gt;
&lt;p data-end=&quot;1640&quot; data-start=&quot;1558&quot; data-ke-size=&quot;size16&quot;&gt;각 파일 안에서는 [[brand-voice]], [[hooks]] 같은 &lt;b&gt;위키링크&lt;/b&gt;(이중 대괄호 링크)를 사용해서 다른 노드를 참조한다.&lt;/p&gt;
&lt;p data-end=&quot;1792&quot; data-start=&quot;1642&quot; data-ke-size=&quot;size16&quot;&gt;AI 에이전트에게 이 폴더를 가리키고 주제를 하나 주면, 그 에이전트는 파일 하나만 읽는 것이 아니다.&lt;br /&gt;링크를 따라가며 연결된 노드들을 읽고, &lt;b&gt;글을 한 줄 쓰기 전에&lt;/b&gt; 네 브랜드, 말투, 독자, 플랫폼 규칙, 훅 공식, 재가공 로직에 대한 전체 이해를 쌓는다.&lt;/p&gt;
&lt;p data-end=&quot;1803&quot; data-start=&quot;1794&quot; data-ke-size=&quot;size16&quot;&gt;차이는 엄청나다.&lt;/p&gt;
&lt;p data-end=&quot;1870&quot; data-start=&quot;1805&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;나쁜 방식:&lt;/b&gt; 단일 프롬프트 = 브리프도 없고, 브랜드 가이드도 없고, 독자 이해도 없는 프리랜서를 고용하는 것&lt;/p&gt;
&lt;p data-end=&quot;1961&quot; data-start=&quot;1872&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;좋은 방식:&lt;/b&gt; 30개 이상의 상호 연결된 .md 파일 그래프 = 전체 플레이북을 다 읽고 플랫폼별 작동 방식까지 정확히 이해한 콘텐츠 팀을 고용하는 것&lt;/p&gt;
&lt;p data-end=&quot;1971&quot; data-start=&quot;1963&quot; data-ke-size=&quot;size16&quot;&gt;다르게 말하면,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2095&quot; data-start=&quot;1973&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2018&quot; data-start=&quot;1973&quot; data-section-id=&quot;fjwywa&quot;&gt;평평한 .md 파일 하나는 &lt;b&gt;도구&lt;/b&gt;를 준다.&lt;br /&gt;(단순 참고 문서)&lt;/li&gt;
&lt;li data-end=&quot;2095&quot; data-start=&quot;2019&quot; data-section-id=&quot;ixwo4i&quot;&gt;그래프는 &lt;b&gt;팀&lt;/b&gt;을 준다.&lt;br /&gt;(플랫폼별 전문가, 훅 유형별 전문가, 보이스 변형 전문가, 독자 세그먼트 전문가가 있는 시스템)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2135&quot; data-start=&quot;2097&quot; data-ke-size=&quot;size16&quot;&gt;이것이 내 월 5,000달러짜리 콘텐츠 제작 비용을 대체한 방식이다.&lt;/p&gt;
&lt;p data-end=&quot;2207&quot; data-start=&quot;2137&quot; data-ke-size=&quot;size16&quot;&gt;개별 파일이 마법이라서가 아니다.&lt;br /&gt;&lt;b&gt;파일들 사이의 연결이 단일 프롬프트로는 만들 수 없는 지능을 만들어내기 때문&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;2228&quot; data-start=&quot;2209&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 플레이북 시작 ] &amp;darr;&amp;darr;&amp;darr;&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;2233&quot; data-start=&quot;2230&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2248&quot; data-start=&quot;2235&quot; data-section-id=&quot;vi2dgx&quot;&gt;어디에서 만들까?&lt;/h1&gt;
&lt;h2 data-end=&quot;2258&quot; data-start=&quot;2249&quot; data-section-id=&quot;1vab8a1&quot; data-ke-size=&quot;size26&quot;&gt;(툴 스택)&lt;/h2&gt;
&lt;p data-end=&quot;2283&quot; data-start=&quot;2260&quot; data-ke-size=&quot;size16&quot;&gt;선택지는 두 가지다. 둘 다 잘 작동한다.&lt;/p&gt;
&lt;h3 data-end=&quot;2300&quot; data-start=&quot;2285&quot; data-section-id=&quot;jwmegc&quot; data-ke-size=&quot;size23&quot;&gt;1. Obsidian&lt;/h3&gt;
&lt;p data-end=&quot;2327&quot; data-start=&quot;2301&quot; data-ke-size=&quot;size16&quot;&gt;그래프를 시각적으로 보고 싶다면 이걸 추천한다.&lt;/p&gt;
&lt;p data-end=&quot;2416&quot; data-start=&quot;2329&quot; data-ke-size=&quot;size16&quot;&gt;Obsidian은 무료 마크다운 에디터로, [[wikilinks]]를 기본 지원하고, 모든 노드가 어떻게 연결되는지 보여주는 멋진 그래프 뷰도 제공한다.&lt;/p&gt;
&lt;p data-end=&quot;2510&quot; data-start=&quot;2418&quot; data-ke-size=&quot;size16&quot;&gt;마치 네 콘텐츠 시스템의 신경망을 들여다보는 느낌이다.&lt;br /&gt;디버깅도 직관적이다. 어떤 노드가 끊어져 있는지, 어떤 노드가 과하게 링크되어 있는지 한눈에 볼 수 있다.&lt;/p&gt;
&lt;h3 data-end=&quot;2530&quot; data-start=&quot;2512&quot; data-section-id=&quot;paun4f&quot; data-ke-size=&quot;size23&quot;&gt;2. 데스크톱의 일반 폴더&lt;/h3&gt;
&lt;p data-end=&quot;2588&quot; data-start=&quot;2531&quot; data-ke-size=&quot;size16&quot;&gt;툴을 더 늘리고 싶지 않다면(툴 피로감, 진짜 있다), 그냥 .md 파일 폴더만 써도 충분히 된다.&lt;/p&gt;
&lt;p data-end=&quot;2661&quot; data-start=&quot;2590&quot; data-ke-size=&quot;size16&quot;&gt;AI 에이전트는 Obsidian 자체에는 관심이 없다.&lt;br /&gt;마크다운을 읽고 [[wikilinks]]를 따라가기만 하면 된다.&lt;/p&gt;
&lt;p data-end=&quot;2716&quot; data-start=&quot;2663&quot; data-ke-size=&quot;size16&quot;&gt;VS Code, 마크다운으로 내보낸 Notion, 심지어 메모장도 괜찮다.&lt;br /&gt;진짜 뭐든 된다.&lt;/p&gt;
&lt;hr data-end=&quot;2721&quot; data-start=&quot;2718&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2746&quot; data-start=&quot;2723&quot; data-section-id=&quot;1al48m9&quot;&gt;실제로 시스템을 돌리는 도구는 무엇인가&lt;/h1&gt;
&lt;h3 data-end=&quot;2758&quot; data-start=&quot;2748&quot; data-section-id=&quot;ercgjg&quot; data-ke-size=&quot;size23&quot;&gt;Claude&lt;/h3&gt;
&lt;p data-end=&quot;2782&quot; data-start=&quot;2759&quot; data-ke-size=&quot;size16&quot;&gt;내 주력 선택지다.&lt;br /&gt;가장 좋은 두뇌다.&lt;/p&gt;
&lt;p data-end=&quot;2883&quot; data-start=&quot;2784&quot; data-ke-size=&quot;size16&quot;&gt;Claude Projects를 쓰면 모든 .md 파일을 업로드해서 지속적인 컨텍스트로 유지할 수 있다.&lt;br /&gt;즉, 그 프로젝트 안의 모든 대화는 전체 그래프에 접근할 수 있다.&lt;/p&gt;
&lt;h3 data-end=&quot;2896&quot; data-start=&quot;2885&quot; data-section-id=&quot;1rgtl8b&quot; data-ke-size=&quot;size23&quot;&gt;ChatGPT&lt;/h3&gt;
&lt;p data-end=&quot;2938&quot; data-start=&quot;2897&quot; data-ke-size=&quot;size16&quot;&gt;커스텀 GPT를 쓰거나, 핵심 파일들을 대화에 붙여넣는 방식으로 가능하다.&lt;/p&gt;
&lt;h3 data-end=&quot;2950&quot; data-start=&quot;2940&quot; data-section-id=&quot;exezos&quot; data-ke-size=&quot;size23&quot;&gt;Cursor&lt;/h3&gt;
&lt;p data-end=&quot;3007&quot; data-start=&quot;2951&quot; data-ke-size=&quot;size16&quot;&gt;기술적인 사용자라면 Cursor를 써서 에이전트가 로컬 파일 시스템의 파일을 직접 읽게 할 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;3087&quot; data-start=&quot;3009&quot; data-ke-size=&quot;size16&quot;&gt;편한 것을 고르면 된다.&lt;br /&gt;다만 내 생각엔 독자의 95%는 Claude를 고를 것이고, 그것이 가장 좋은 선택이다.&lt;br /&gt;나도 그렇게 쓴다.&lt;/p&gt;
&lt;hr data-end=&quot;3092&quot; data-start=&quot;3089&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3101&quot; data-start=&quot;3094&quot; data-section-id=&quot;1qdleii&quot;&gt;폴더 구조&lt;/h1&gt;
&lt;p data-end=&quot;3121&quot; data-start=&quot;3103&quot; data-ke-size=&quot;size16&quot;&gt;네가 만들 구조는 정확히 이렇다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;/content-skill-graph&lt;/span&gt;&lt;br /&gt;&lt;span&gt;├── index.md&lt;/span&gt;&lt;br /&gt;&lt;span&gt;├── platforms/&lt;/span&gt;&lt;br /&gt;&lt;span&gt;│ ├── x.md&lt;/span&gt;&lt;br /&gt;&lt;span&gt;│ ├── linkedin.md&lt;/span&gt;&lt;br /&gt;&lt;span&gt;│ ├── instagram.md&lt;/span&gt;&lt;br /&gt;&lt;span&gt;│ ├── tiktok.md&lt;/span&gt;&lt;br /&gt;&lt;span&gt;│ ├── youtube.md&lt;/span&gt;&lt;br /&gt;&lt;span&gt;│ ├── threads.md&lt;/span&gt;&lt;br /&gt;&lt;span&gt;│ ├── facebook.md&lt;/span&gt;&lt;br /&gt;&lt;span&gt;│ └── newsletter.md&lt;/span&gt;&lt;br /&gt;&lt;span&gt;├── voice/&lt;/span&gt;&lt;br /&gt;&lt;span&gt;│ ├── brand-voice.md&lt;/span&gt;&lt;br /&gt;&lt;span&gt;│ └── platform-tone.md&lt;/span&gt;&lt;br /&gt;&lt;span&gt;├── engine/&lt;/span&gt;&lt;br /&gt;&lt;span&gt;│ ├── hooks.md&lt;/span&gt;&lt;br /&gt;&lt;span&gt;│ ├── repurpose.md&lt;/span&gt;&lt;br /&gt;&lt;span&gt;│ ├── scheduling.md&lt;/span&gt;&lt;br /&gt;&lt;span&gt;│ └── content-types.md&lt;/span&gt;&lt;br /&gt;&lt;span&gt;└── audience/&lt;/span&gt;&lt;br /&gt;&lt;span&gt; ├── builders.md&lt;/span&gt;&lt;br /&gt;&lt;span&gt; └── casual.md&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3584&quot; data-start=&quot;3545&quot; data-ke-size=&quot;size16&quot;&gt;17개 파일.&lt;br /&gt;4개 폴더.&lt;br /&gt;이게 네 전체 콘텐츠 제작 머신이다.&lt;/p&gt;
&lt;p data-end=&quot;3632&quot; data-start=&quot;3586&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;지금 당장 이 구조를 만들어라. 진심이다. 읽는 걸 잠깐 멈추고 먼저 해라.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;3639&quot; data-start=&quot;3634&quot; data-ke-size=&quot;size16&quot;&gt;단계별로:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3731&quot; data-start=&quot;3641&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3671&quot; data-start=&quot;3641&quot; data-section-id=&quot;118mihw&quot;&gt;Obsidian을 열거나, 데스크톱에 폴더를 만든다&lt;/li&gt;
&lt;li data-end=&quot;3684&quot; data-start=&quot;3672&quot; data-section-id=&quot;ny1ug0&quot;&gt;하위 폴더를 만든다&lt;/li&gt;
&lt;li data-end=&quot;3710&quot; data-start=&quot;3685&quot; data-section-id=&quot;ctmgc7&quot;&gt;위 이름대로 빈 .md 파일들을 만든다&lt;/li&gt;
&lt;li data-end=&quot;3731&quot; data-start=&quot;3711&quot; data-section-id=&quot;1h4vwhh&quot;&gt;그다음 돌아와서 하나씩 다 채운다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3736&quot; data-start=&quot;3733&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3757&quot; data-start=&quot;3738&quot; data-section-id=&quot;17koky3&quot;&gt;각 폴더가 하는 일 빠르게 보기&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4093&quot; data-start=&quot;3759&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3823&quot; data-start=&quot;3759&quot; data-section-id=&quot;9avt6d&quot;&gt;index.md &amp;mdash; 진입점. AI 에이전트가 가장 먼저 읽는 브리핑 문서. 시스템 전체에서 가장 중요한 파일&lt;/li&gt;
&lt;li data-end=&quot;3910&quot; data-start=&quot;3824&quot; data-section-id=&quot;xlk4jg&quot;&gt;platforms/ &amp;mdash; 플랫폼별 파일. 규칙, 포맷, 글자 수 제한, 게시 빈도, 콘텐츠 스타일 등 플랫폼에 자연스럽게 글쓰기 위해 필요한 모든 것&lt;/li&gt;
&lt;li data-end=&quot;3972&quot; data-start=&quot;3911&quot; data-section-id=&quot;10bztt6&quot;&gt;voice/ &amp;mdash; 브랜드 보이스 DNA와 플랫폼별 변형 방식. 콘텐츠가 로봇처럼 들리지 않게 해주는 핵심&lt;/li&gt;
&lt;li data-end=&quot;4026&quot; data-start=&quot;3973&quot; data-section-id=&quot;dtn1rz&quot;&gt;engine/ &amp;mdash; 운영 백본. 훅 공식, 재가공 체인, 스케줄링 규칙, 콘텐츠 타입 정의&lt;/li&gt;
&lt;li data-end=&quot;4093&quot; data-start=&quot;4027&quot; data-section-id=&quot;gh93hk&quot;&gt;audience/ &amp;mdash; 실제로 누구에게 말하고 있는지. 같은 주제도 독자 세그먼트에 따라 다른 각도로 풀어야 한다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;1. index.md &amp;mdash; 커맨드 센터&lt;/h1&gt;
&lt;pre class=&quot;lua&quot;&gt;&lt;code&gt;# 콘텐츠 스킬 그래프 &amp;mdash; 커맨드 센터

## 1. 정체성

[브랜드명/이름]을 위한 콘텐츠 제작 시스템.
하나의 아이디어 입력으로 소셜 미디어 계정 10개를 운영한다.

브랜드: [당신의 이름 / 브랜드명]
분야: [당신의 분야 &amp;mdash; 예: &quot;AI 자동화, SaaS 제작, 기술 역량 수익화&quot;]
미션: 하나의 주제를 플랫폼 네이티브 포스트 10개로 바꾸되,
각 포스트가 같은 주제를 서로 다른 방식으로 사고하도록 만든다.

## 2. 노드 맵

아래의 모든 노드는 지식 파일이다.
어떤 작업을 실행하기 전에 관련 파일을 먼저 읽어라.
[[위키링크]]는 클릭 가능한 링크이며, 반드시 따라가라.

### 플랫폼
- [[x]] &amp;mdash; 짧은 형식, 훅 중심, 최대 280자, 캐주얼한 소문자 스타일.
  주 5회 이상 게시. 반대 의견형 포스트와 단계형 스레드 중심
- [[linkedin]] &amp;mdash; 장문 서사형, 전문적인 톤, 1500자 이상.
  주 3회 게시. 비즈니스 인사이트가 들어간 개인 경험형 글
- [[instagram]] &amp;mdash; 비주얼 중심. 첫 슬라이드에 강한 주장이 들어간
  7장짜리 캐러셀. 주 4회 게시. 숏폼 비디오용 릴스 포함
- [[tiktok]] &amp;mdash; 거칠고 덜 다듬어진 45~60초 화면 녹화 또는
  토킹헤드 영상. 주 5회 게시. 첫 2초 안에 훅 필요
- [[youtube]] &amp;mdash; SEO 최적화 제목, 구조화된 아웃라인,
  8~12분 분량. 주 2회 게시. 에버그린 콘텐츠 중심
- [[threads]] &amp;mdash; 대화형, 의견 중심, 캐주얼. 주 3회 게시.
  &quot;X보다 더 느슨한 버전&quot;처럼 생각하기
- [[facebook]] &amp;mdash; 커뮤니티 중심, 더 긴 캡션, 그룹 참여형.
  주 3회 게시
- [[newsletter]] &amp;mdash; 깊이 있는 포맷, 1000~2000단어,
  실행 가능한 프레임워크 중심. 주 1회 발송

### 보이스
- [[brand-voice]] &amp;mdash; 모든 플랫폼에서 공통으로 유지되는 핵심 성격,
  가치관, 톤 마커, 어휘를 정의하는 파일
- [[platform-tone]] &amp;mdash; 핵심 보이스가 플랫폼별로 어떻게 변형되는지.
  같은 사람, 다른 공간

### 엔진
- [[hooks]] &amp;mdash; 스크롤을 멈추게 하는 도입부 공식.
  반대 의견형, 증거형, 발견형, 대체형, 플레이북형으로 분류.
  성과를 기준으로 매주 업데이트
- [[repurpose]] &amp;mdash; 재가공 체인: 아이디어 1개 &amp;rarr; 결과물 10개.
  어떤 플랫폼을 먼저 쓰는지, 어떤 순서로 적응시키는지,
  버전마다 무엇이 바뀌는지를 정의
- [[scheduling]] &amp;mdash; 게시 캘린더, 플랫폼별 최적 시간,
  빈도 규칙, 배치 작업 흐름
- [[content-types]] &amp;mdash; 스레드, 캐러셀, 릴스,
  장문 글, 짧은 의견, 영상 스크립트, 뉴스레터 등의 포맷 정의

### 독자
- [[builders]] &amp;mdash; 핵심 독자. 인디해커, AI 엔지니어,
  SaaS 창업자, 기술로 수익화하는 프리랜서.
  이들은 바로 실행 가능한 플레이북, 실제 숫자,
  오늘 당장 쓸 수 있는 도구를 원한다.
- [[casual]] &amp;mdash; 보조 독자. AI/기술에 관심은 있지만 아직 직접 만들지는 않는 사람들.
  이들은 영감, 쉬운 설명,
  &quot;나도 할 수 있겠는데&quot; 같은 감정을 원한다.

## 3. 실행 지침

주제가 주어졌을 때:

1. 이 주제가 우리의 분야와 맞는지 먼저 확인하라. 맞지 않으면 거절하라.
2. 핵심 성격을 파악하기 위해 [[brand-voice]]를 읽어라.
3. [[hooks]]를 읽고, 해당 주제에 가장 적합한 훅 공식을 선택하라.
4. 제작 순서를 파악하기 위해 [[repurpose]]를 읽어라.
5. 체인에서 첫 번째 플랫폼(보통 [[x]])용 콘텐츠부터 작성하라.
6. 이후 플랫폼마다 해당 플랫폼 노드와 [[platform-tone]]을 읽고 적응시켜라.
   단순 재포맷하지 말고, 그 플랫폼에 맞게
   각도, 구조, 훅, 포맷을 다시 사고하라.
7. 게시 타이밍과 빈도에는 [[scheduling]] 규칙을 적용하라.
8. 각 플랫폼별로 바로 게시 가능한 네이티브 포스트를 하나씩 출력하라.

핵심 규칙: 결과물은 같은 글을 10개 플랫폼용으로 다시 포맷한 것이 아니다.
같은 주제를 다루더라도, 각 플랫폼에서
다른 각도, 다른 훅, 다른 보이스, 다른 구조, 다른 포맷으로 사고한
10개의 별도 결과물이어야 한다.
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;2. platforms/x.md&lt;/h1&gt;
&lt;pre class=&quot;lua&quot;&gt;&lt;code&gt;# X / 트위터

## 플랫폼 DNA
- 글자 수 제한: 기본 트윗은 280자, 장문 트윗은 최대 25,000자
  (하지만 가장 잘 먹히는 길이는 1,000~2,000자)
- 분위기: 빠르고, 캐주얼하며, 의견 중심. 기본은 소문자 스타일.
  사람들이 매우 빠르게 스크롤하기 때문에, 멈춰 세울 시간은 0.5초 정도뿐이다.
- 이 플랫폼의 독자: 더 기술적이고, 더 빌더 중심이다.
  [[casual]]보다 [[builders]]에 더 가깝다.

## 콘텐츠 규칙
- 이 플랫폼은 [[repurpose]] 체인에서 가장 먼저 작성하라.
  X는 짧게 압축하게 만들기 때문에, 이후 확장이 쉬워진다.
- [[hooks]]를 사용하라 &amp;mdash; 특히 반대 의견형 훅과 증거형 훅이 잘 작동한다.
- [[brand-voice]]를 따르되 더 캐주얼하게 조정하라.
  X 전용 조정은 [[platform-tone]]를 참고하라.
- 생각 단위마다 줄바꿈하라. 절대 빽빽한 문단을 쓰지 마라.
- 해시태그는 쓰지 마라. X에서는 스팸처럼 보인다.
- 이모지는 글 맨 끝의 사인오프처럼만 사용하라. (하트 하나 또는 없음)
- 링크는 본문이 아니라 본인 글의 답글에 넣어라.
  본문 외부 링크는 알고리즘에 불리하다.

## 잘 작동하는 포맷
1. 단계형 스레드 &amp;mdash; &quot;[결과]를 얻기 위한 [N]단계는 다음과 같다:&quot;
   형식으로 시작하고 번호를 붙여 설명한다.
   가장 안정적으로 반응을 얻는 형식이다.
2. 짧은 의견형 &amp;mdash; 2~4줄.
   강한 주장 + 한 줄 맥락 + 펀치라인.
   반대 의견형 훅에 잘 맞는다.
3. 증거형 포스트 &amp;mdash; &quot;[지표] &amp;rarr; [지표] in [기간]&quot; 형식으로 시작하고
   뒤에 분석을 붙인다. 사람들은 실제 숫자에 매우 강하게 반응한다.
4. 리소스 소개형 &amp;mdash; &quot;방금 [무언가]를 찾았는데 &amp;mdash; [왜 중요한지]&quot;
   짧고 가치가 높아야 한다. 반드시 개인적인 해석을 덧붙여라.
5. 장문 트윗 &amp;mdash; 1,000~2,000자.
   하나의 아이디어를 깊게 풀어내는 형식.
   너무 자주 쓰지 말고 주 1~2회 정도만 사용하라.

## 게시 전략
- 빈도: 최소 주 5~7회 (하루 1~2포스트)
- 최적 시간: 오전 8~9시, 12~1시, 오후 5~6시 (독자 시간대 기준)
- 게시 후 30분 동안은 답글에 적극 참여하라 (사실상 알고리즘 핵)
- 전체 일정은 [[scheduling]] 참고

## X의 독자
- 핵심 독자: [[builders]] &amp;mdash; 인디해커, AI 엔지니어, SaaS 창업자
- 원하는 것: 실행 가능한 콘텐츠, 실제 숫자, 도구, 플레이북
- 원하지 않는 것: 내용 없는 동기부여 문구,
  &quot;AI가 세상을 바꾼다&quot; 수준의 뻔한 이야기
- 독자에게는 &quot;당신&quot;이라고 직접 말하라 &amp;mdash; 코칭하는 에너지로

## 재가공 메모
- X는 [[repurpose]] 체인의 출발점이다.
- X용 글을 쓴 뒤에는 [[linkedin]]용으로 확장하라.
  (서사와 전문적 프레이밍 추가)
- 훅은 [[tiktok]]용으로 압축하라.
  (영상 첫 2초에 들어가야 하기 때문)
- 스레드는 [[instagram]] 캐러셀 슬라이드로 바꿀 수 있다.
- 전체 흐름은 [[repurpose]]를 참고하라.
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;3. platforms/linkedin.md&lt;/h1&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;# 링크드인

## 플랫폼 DNA
- 엄격한 글자 수 제한은 없지만,
  일반 포스트는 1,300~2,000자 정도가 가장 잘 맞고,
  아티클은 최대 3,000자까지 가능하다.
- 분위기: 전문적이지만 인간적이어야 한다.
  개인 경험에 비즈니스 교훈이 붙은 글이 강하다.
- 독자: [[builders]]와 [[casual]]가 섞여 있지만,
  더 많은 직장인, 의사결정자, 실제 예산을 가진 사람들이 있다.

## 콘텐츠 규칙
- 개인적인 훅으로 시작하라.
  예: &quot;내가 틀렸던 부분은...&quot; / &quot;3개월 전만 해도 나는...&quot; / &quot;모두가 나에게 ...라고 했다&quot;
- 첫 문장이 전부다.
  링크드인은 약 210자 이후 &quot;더 보기&quot;로 접히기 때문에,
  첫 줄에 훅이 없으면 클릭이 일어나지 않는다.
- [[hooks]]를 사용하라 &amp;mdash; 특히 증거형 훅과 플레이북형 훅이 잘 맞는다.
- [[brand-voice]]를 따르되 더 전문적으로 조정하라.
  세부 조정은 [[platform-tone]] 참고
- 짧은 문단으로 써라. 한 문단에는 하나의 아이디어만.
  여백이 중요하다.
- 본문에 해시태그를 넣지 마라.
  넣는다면 맨 마지막에 3개 이하만 넣어라.
- 링크는 본문이 아니라 첫 댓글에 넣어라.
  본문 링크는 알고리즘에 불리하다.

## 잘 작동하는 포맷
1. 개인 서사형 &amp;mdash; &quot;나는 [무언가를 했다/배웠다/실패했다]&quot;
   &amp;rarr; 교훈 &amp;rarr; 실행 가능한 인사이트.
   링크드인의 대표 포맷이다.
2. 리스트형 포스트 &amp;mdash; &quot;[주제]에 대해 내가 배운 7가지:&quot;
   형식으로 번호를 붙여 정리한다.
3. 반대 의견형 &amp;mdash; 통념을 정면으로 뒤집는다.
   강한 주장으로 시작하고, 그 뒤에 근거를 붙인다.
4. 사례 연구형 &amp;mdash; 실제 결과, 실제 숫자, 실제 과정.
   예: &quot;우리가 [이전 상태]에서 [이후 상태]로 [기간] 안에 바뀐 방법&quot;
5. 문서/캐러셀 포스트 &amp;mdash; PDF 슬라이드를 문서로 업로드하는 형식.
   10~15장, 슬라이드당 하나의 아이디어, 굵은 헤드라인 중심

## 게시 전략
- 빈도: 주 3~5회
- 최적 시간: 오전 7~8시, 12시, 오후 5~6시
- 게시 전에 관련 포스트 10개에 댓글을 달아라 (참여도 상승용 핵)
- 전체 일정은 [[scheduling]] 참고

## 링크드인의 독자
- [[builders]]와 [[casual]]가 섞여 있다.
- 원하는 것: 커리어 성장, 비즈니스 인사이트,
  교훈이 있는 실제 이야기, 업무를 더 잘하게 해주는 도구
- 원하지 않는 것: 지나치게 가벼운 말투, 밈,
  근거 없는 뜨거운 주장
- X보다 고가 리드 가능성이 높다.
  이 플랫폼에는 예산을 가진 사람이 많다.

## 재가공 메모
- 링크드인은 보통 [[repurpose]] 체인의 두 번째 플랫폼이다.
- X용 글을 가져와서 개인 서사를 추가하고,
  1,300자 이상으로 확장하라.
- &quot;내가 10개 계정을 운영하며 배운 점은...&quot; 같은 전문적 프레이밍을 덧붙여라.
- 훅은 거의 항상 다시 써야 한다.
  X에서 먹히는 훅이 링크드인에서는 그대로 통하지 않는다.
- 이 글에서 [[instagram]]용 캐러셀 슬라이드를 추출할 수도 있다.
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;4. platforms/instagram.md&lt;/h1&gt;
&lt;pre class=&quot;lua&quot;&gt;&lt;code&gt;# 인스타그램

## 플랫폼 DNA
- 캡션 제한은 2,200자지만,
  실제 참여를 이끄는 건 비주얼(캐러셀 슬라이드 또는 릴스)이다.
- 분위기: 비주얼 우선.
  이미지나 캐러셀이 스크롤을 멈추게 하고,
  캡션이 설득을 마무리한다.
  강하고, 깔끔하고, 디자인된 느낌이어야 한다.
- 독자: X나 링크드인보다 더 넓고,
  [[casual]]에 더 가깝다. 더 aspirational하고 시각 학습형이 많다.

## 콘텐츠 규칙
- 캐러셀이 핵심이다. 7~10장, 슬라이드당 하나의 아이디어만.
- 1번 슬라이드 = 훅.
  굵은 주장, 큰 글자, 반대 의견 또는 호기심 유발 문장.
  [[hooks]]를 사용하라. 시각 형식에서는 발견형 훅과 증거형 훅이 잘 맞는다.
- [[brand-voice]]를 따르되 언어를 더 쉽게 조정하라.
  세부 조정은 [[platform-tone]] 참고
- 캡션은 슬라이드에 없는 맥락을 보완해야 한다.
  슬라이드 내용을 그대로 반복하지 마라.
- 해시태그: 캡션 마지막에 관련 해시태그 5~10개.
  X와 달리 인스타그램에서는 해시태그가 실제로 발견성을 높인다.
- 마지막 슬라이드와 캡션 모두에 CTA를 넣어라.
  예: &quot;나중에 보려고 저장하세요&quot; / &quot;[주제] 더 보려면 팔로우&quot; /
  &quot;이게 필요한 사람에게 공유하세요&quot;

## 캐러셀 디자인 규칙
- 폰트: 굵은 산세리프, 배경과 높은 대비
- 슬라이드당 하나의 아이디어. 슬라이드당 최대 30단어
- 모든 슬라이드에 일관된 색상 체계 유지 (브랜드 컬러)
- 1번 슬라이드: 매우 크고 강한 문장, 최대 8단어
- 마지막 슬라이드: 명확한 CTA와 계정 핸들 포함

## 게시 전략
- 빈도: 주 4~5회 (캐러셀 3개, 릴스 1~2개)
- 최적 시간: 오전 11시~오후 1시, 오후 7~9시
- 전체 일정은 [[scheduling]] 참고

## 재가공 메모
- 캐러셀은 [[x]] 스레드를 시각 슬라이드로 확장해 만든다.
- 릴스는 [[tiktok]] 스크립트에서 가져와 적응시킨다.
- 인스타그램 버전은 시스템 전체 콘텐츠 중 가장 시각적으로 polished되어야 한다.
- 전체 흐름은 [[repurpose]] 참고
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;5. platforms/tiktok.md&lt;/h1&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;# 틱톡

## 플랫폼 DNA
- 영상 플랫폼이다. 모든 것이 영상이다.
  15초부터 10분까지 가능하지만,
  가장 잘 맞는 길이는 45~90초다.
- 분위기: 거칠고, 덜 다듬어졌으며, 진짜 같아야 한다.
  지나치게 잘 만든 콘텐츠는 오히려 성과가 떨어질 수 있다.
  사람들은 완벽함보다 진짜를 원한다.
- 독자: 가장 젊은 인구층. [[casual]] 비중이 더 높다.
  깊게 파기보다 새로운 주제를 발견하러 온다.
- 알고리즘은 발견 기반이다.
  팔로워가 없어도 바이럴 가능성이 있다.
  모든 영상이 기회를 가진다.

## 콘텐츠 규칙
- 첫 2초 안에 훅을 넣어라.
  여기서 잡지 못하면 바로 스와이프당한다.
  [[hooks]]를 사용하되, 영상용으로 변형한 반대 의견형 훅과 발견형 훅이 잘 맞는다.
- [[brand-voice]]를 따르되 가장 캐주얼하고 에너지 높게 조정하라.
  세부 조정은 [[platform-tone]] 참고
- 카메라에 대고 친구에게 말하듯 말하라.
- 기술/AI 콘텐츠에서는 화면 녹화 + 보이스오버가 매우 잘 먹힌다.
  설명만 하지 말고 보여줘라.
- 긴 인트로는 금지.
  &quot;안녕하세요 여러분&quot; 같은 말 없이 바로 본론으로 들어가라.
- 자막/텍스트 오버레이는 필수다.
  많은 사용자가 무음으로 본다.

## 잘 작동하는 포맷
1. 화면 녹화형 &amp;mdash; 실제로 하는 장면을 보여줘라.
   화면을 녹화하고 보이스오버를 입힌다. 45~60초 권장
2. 퀵팁형 &amp;mdash; 하나의 실행 가능한 팁을 30초 안에 전달.
   훅 &amp;rarr; 팁 &amp;rarr; 결과 구조
3. &quot;나는 X를 Y로 대체했다&quot; 형 &amp;mdash; 변화 전/후를 보여줘라.
   AI/자동화 콘텐츠에 특히 잘 맞는다.
4. 리액션형 &amp;mdash; 분야 내 트렌드에 반응하고,
   거기에 자신의 해석을 얹는다.

## 스크립트 템플릿
[훅: 2초 (텍스트 오버레이 + 보이스오버)]
[맥락: 5초]
[방법 설명: 30~40초]
[결과: 5초]
[CTA: 3초]

## 게시 전략
- 빈도: 주 5~7회 (가능하면 매일)
- 최적 시간: 오전 7~9시, 12~3시, 오후 7~10시
- 최소 30일은 꾸준히 올리고 나서 결과를 판단하라. 진짜로.
- 전체 일정은 [[scheduling]] 참고

## 재가공 메모
- 틱톡 스크립트는 [[x]] 포스트를 45~60초짜리 spoken content로 압축해 만든다.
- 하나의 핵심 아이디어에만 집중하라.
  모든 걸 다 우겨 넣지 마라.
- [[instagram]] 릴스와 유튜브 쇼츠로도 약간의 수정 후 재사용 가능하다.
- 전체 흐름은 [[repurpose]] 참고
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;6. platforms/youtube.md&lt;/h1&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;# 유튜브

## 플랫폼 DNA
- 장문 영상 플랫폼. 알고리즘상 가장 잘 맞는 길이는 8~12분이다.
- 분위기: 교육형, 구조화, SEO 중심.
  유튜브는 사실상 검색 엔진이기 때문에,
  사람들은 답을 찾으러 들어온다.
- 독자: [[builders]]와 [[casual]]가 섞여 있지만,
  8분 이상 시간을 쓰는 만큼 스크롤러보다 훨씬 몰입도가 높다.
- 에버그린 콘텐츠가 살아남는다.
  좋은 영상 하나는 몇 년 동안 조회수를 만든다.

## 콘텐츠 규칙
- 제목이 전부다.
  SEO 최적화, 호기심 유도, 구체성.
  &quot;AI 콘텐츠 시스템 만드는 법 (단계별 가이드)&quot;는 좋지만,
  &quot;내 콘텐츠 전략&quot;은 검색되지 않는다.
- 썸네일: 굵은 텍스트, 개인 브랜드라면 얼굴,
  대비가 강한 색상.
  썸네일과 제목의 조합이 클릭의 대부분을 결정한다.
- [[brand-voice]]를 따르되 더 구조적으로 조정하라.
  세부 조정은 [[platform-tone]] 참고
- 도입 30초 안에 [[hooks]]를 활용하라.
  유튜브 훅은 최고의 글 훅을 spoken version으로 바꾼 것에 가깝다.
- 섹션 구분이 명확해야 한다.
  유튜브는 챕터도 보여주므로 적극 활용하라.

## 영상 구조
[훅 &amp;mdash; 0:00~0:30]
문제를 제시하고 해결책을 약속하라.
예: &quot;나는 소셜 미디어 계정 10개를 운영하지만 직접 포스트를 한 줄도 쓰지 않습니다.
이 영상이 끝나면 같은 시스템을 어떻게 만드는지 알게 될 겁니다.&quot;

[맥락 &amp;mdash; 0:30~2:00]
왜 이게 중요한지, 대부분 사람들이 무엇을 잘못하는지,
왜 이 방식을 봐야 하는지 설명하라.

[메인 콘텐츠 &amp;mdash; 2:00~9:00]
단계별 워크스루.
화면 녹화, 데모, 예시를 넣고,
3~5개의 뚜렷한 섹션으로 나눠 타임스탬프를 붙여라.

[정리 + CTA &amp;mdash; 9:00~10:00]
핵심 포인트를 요약하고,
구독 유도 또는 템플릿 다운로드 같은 CTA로 마무리하라.

## SEO 규칙
- 제목: 핵심 키워드 포함, 자연스러운 문장, 60자 이내
- 설명란: 처음 2줄이 &quot;더 보기&quot; 전에 보이므로,
  훅과 핵심 링크를 거기에 넣어라.
  전체 설명은 200~500단어 정도
- 태그: 관련도 높은 것 5~10개, 넓은 키워드와 구체적 키워드 혼합
- 챕터: 설명란에 각 섹션 타임스탬프 기입

## 게시 전략
- 빈도: 주 1~2회
- 유튜브는 빈도보다 일관성이 훨씬 중요하다.
- 추천 요일: 화, 목, 토
- 전체 일정은 [[scheduling]] 참고

## 재가공 메모
- 유튜브 스크립트는 가장 확장된 버전이다.
  [[x]]와 [[linkedin]]을 합쳐 구조화된 튜토리얼로 만든다.
- 가장 좋은 60초 구간은 쇼츠로 뽑아
  [[tiktok]]과 [[instagram]] 릴스로 재사용하라.
- 설명란 링크는 뉴스레터나 리드마그넷으로 연결하라.
- 전체 흐름은 [[repurpose]] 참고
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;7. platforms/threads.md&lt;/h1&gt;
&lt;pre class=&quot;lua&quot;&gt;&lt;code&gt;# 스레드

## 플랫폼 DNA
- 텍스트 우선, 대화형, 의견 중심
- 게시물당 500자 제한
- 분위기: 느슨하고 커뮤니티 감성이 강함.
  X보다 더 캐주얼하다.
- 독자: 성장 중이며, 더 [[casual]] 쪽이고,
  기술 밀도는 X보다 낮다.

## 콘텐츠 규칙
- 의견과 핫테이크가 가장 잘 먹힌다.
- [[x]]보다 더 대화체로 써라.
  마치 속으로 생각을 말하듯이.
- 해시태그 금지. 링크 금지. 순수 텍스트 참여 중심.
- [[brand-voice]]를 따르되 가장 느슨한 버전으로.
  세부 조정은 [[platform-tone]] 참고
- [[x]] 콘텐츠를 적응시켜 교차 게시할 수 있지만,
  훅은 반드시 다시 쓰고 톤도 더 부드럽게 조정하라.

## 재가공
- [[x]]에서 가져오되 더 대화적인 톤으로 바꾼다.
- 링크가 필요한 CTA는 제거하라.
- 전체 흐름은 [[repurpose]] 참고
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;8. platforms/facebook.md&lt;/h1&gt;
&lt;pre class=&quot;lua&quot;&gt;&lt;code&gt;# 페이스북

## 플랫폼 DNA
- 더 연령대가 높고, 커뮤니티 중심이며, 그룹 활동이 중요하다.
- 엄격한 글자 수 제한은 없지만,
  가장 잘 맞는 길이는 300~800자 정도다.
- 분위기: 개인 브랜딩보다는
  &quot;도움을 주는 커뮤니티 구성원&quot;에 가깝다.

## 콘텐츠 규칙
- 질문과 토론 유도형 문장이 참여를 이끈다.
- 조금 더 긴 캡션과 개인적 맥락이 잘 맞는다.
- 네이티브 업로드 영상이 알고리즘 우선순위를 받는다.
- [[brand-voice]]를 따르되 더 따뜻하게 조정하라.
  세부 조정은 [[platform-tone]] 참고
- 프로필에만 올리지 말고,
  관련 그룹에도 공유하라.

## 재가공
- [[x]] 콘텐츠를 가져와 개인적 맥락을 더 붙여 확장하라.
- 마지막에는 댓글을 유도하는 질문을 하나 넣어라.
- 전체 흐름은 [[repurpose]] 참고
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;9. platforms/newsletter.md&lt;/h1&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;# 뉴스레터

## 플랫폼 DNA
- 이메일 기반 플랫폼. 알고리즘과 싸우지 않고 독자를 직접 소유한다.
- 호당 1,000~2,000단어. 깊이 있는 형식.
- 분위기: 직접적이고 개인적이어야 한다.
  똑똑한 친구이자 멘토가 보내는 편지처럼.
  모든 플랫폼 중 가장 개인적인 버전이다.

## 콘텐츠 규칙
- 제목이 곧 훅이다.
  이메일용으로 변형한 [[hooks]]를 사용하라.
  예: &quot;월 8천 달러짜리 콘텐츠 팀을 대체한 시스템&quot;
  같은 제목이 좋고,
  &quot;주간 뉴스레터 #47&quot; 같은 제목은 아무도 열지 않는다.
- 개인적인 이야기나 관찰로 시작한 뒤,
  실전 내용으로 자연스럽게 넘어가라.
- 한 회차당 하나의 핵심 주제만 다뤄라.
  너무 많은 주제를 한 번에 넣지 마라.
- [[brand-voice]]를 따르되 가장 개인적인 톤으로 조정하라.
  세부 조정은 [[platform-tone]] 참고
- 마지막에는 CTA를 하나만 넣어라.
  답장을 유도하거나,
  특정 리소스를 보게 하거나,
  한 가지 행동을 하게 만드는 정도면 충분하다.
- 플레인 텍스트 또는 최소한의 디자인만 사용하라.
  화려한 템플릿은 마케팅 메일처럼 보이기 쉽다.
  플레인 텍스트는 실제 사람이 보낸 편지처럼 느껴진다.

## 재가공
- 주간 베스트 주제의 가장 깊은 버전이다.
- [[x]]의 핵심 주장 + [[linkedin]]의 서사 +
  소셜에는 공개하지 않은 인사이트를 합쳐라.
- 여기서 포스트의 &quot;어떻게&quot;를 가장 깊게 설명한다.
- 전체 흐름은 [[repurpose]] 참고
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;10. voice/brand-voice.md&lt;/h1&gt;
&lt;pre class=&quot;haml&quot;&gt;&lt;code&gt;# 브랜드 보이스

이 파일은 모든 콘텐츠 뒤에 있는 핵심 성격을 정의한다.
모든 플랫폼 노드([[x]], [[linkedin]], [[instagram]] 등)는
이 파일을 참고한 뒤 각 플랫폼 맥락에 맞게 조정한다.
플랫폼별 조정은 [[platform-tone]]를 참고하라.

## 핵심 성격

[브랜드의 성격을 3~5문장으로 설명하라.
구체적으로 써라. 아래는 builder/AI 분야 예시다.]

우리는 만들면서 동시에 가르치는 빌더다.
가볍지만 권위 있는 톤을 가진다 &amp;mdash; 잘 알고 있지만,
절대 상대를 내려다보며 말하지 않는다.
우리는 실제 숫자, 실제 실수, 실제 시스템을 공유한다.
독자에게는 함께 만들고 있는 친구처럼 말한다.
직접적이고, 실용적이며, 쓸데없는 말에 알레르기가 있다.

## 톤 마커

- 캐주얼하지만 신뢰 가능해야 한다 &amp;mdash; &quot;imo&quot;, &quot;btw&quot;, &quot;lol&quot; 같은 표현을 자연스럽게 쓸 수 있지만,
  항상 실제 데이터와 경험으로 뒷받침해야 한다.
- 직접적이고 개인적이어야 한다 &amp;mdash; &quot;나&quot;를 자주 쓰고,
  독자에게는 &quot;당신&quot;이라고 부른다.
  강의가 아니라 코칭처럼 느껴져야 한다.
- 매끈함보다 솔직함 &amp;mdash;
  &quot;가장 큰 실수는 검증을 건너뛰는 것이다&quot;는 좋지만,
  &quot;시장 검증 프로세스 부족은 흔한 함정이다&quot; 같은 문장은 피하라.
- 코칭 에너지 &amp;mdash; 모든 콘텐츠가
  독자를 단계별로 직접 안내하는 느낌이어야 한다.
- 숫자와 증거 &amp;mdash; 가능하면 구체적 수치를 넣어라.
  &quot;월 MRR 4천 달러&quot;, &quot;주당 리드 200개&quot;, &quot;계정 10개&quot;처럼.
  구체성은 신뢰를 만든다.

## 어휘

우리가 자주 쓰는 단어:
build, ship, automate, system, playbook, stack,
workflow, scale, compound, iterate

절대 쓰지 않을 단어:
moreover, furthermore, in conclusion,
it's worth noting, delve, synergy, circle back, holistic

자주 쓰는 문구:
- &quot;진짜로 먹히는 건 이거다&quot;
- &quot;대부분 여기서 틀린다&quot;
- &quot;진짜 이유는 이것이다&quot;
- &quot;이건 꼭 봐라&quot;
- &quot;재밌게 봤길 바란다&quot;

절대 쓰지 않을 문구:
- &quot;오늘날처럼 빠르게 변화하는 세상에서...&quot;
- &quot;말할 필요도 없이...&quot;
- &quot;그럼 바로 본론으로 들어가서...&quot;
- 기업형 허세 용어 모음 전체

## 포맷 규칙
- 본문은 기본적으로 소문자 스타일
- 훅/헤드라인만 Title Case 또는 ALL CAPS 허용
- 불릿 포인트는 - 기호 사용
- 생각 단위마다 줄바꿈. 빽빽한 문단 금지
- 해시태그 금지 (단, 인스타그램은 예외)
- 이모지는 최소한으로, 사인오프 용도로만 사용
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;11. voice/platform-tone.md&lt;/h1&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;# 플랫폼별 톤 적응 가이드

핵심 보이스는 [[brand-voice]]에 정의되어 있다.
이 파일은 그 보이스가 플랫폼마다 어떻게 변형되는지 정의한다.

## X / 트위터
- 가장 캐주얼한 버전
- 전부 소문자 스타일
- 짧고 강한 문장. 군더더기 없음
- &quot;lol&quot;, &quot;imo&quot;, &quot;btw&quot; 자유롭게 사용 가능
- 냉소와 아이러니도 허용
- 예시: &quot;10개의 툴은 필요 없다. 10개의 마크다운 파일이면 된다.
  이건 꼭 봐라.&quot;

## 링크드인
- 전문적이지만 여전히 인간적이어야 한다. 기업체 말투 금지
- &quot;나&quot;를 많이 쓰되, 교훈과 인사이트 프레임으로 써라
- 더 긴 문장도 허용. 서사 구조 강화
- &quot;lol&quot; 대신 사려 깊은 관찰로 대체
- 예시: &quot;나는 3개월 동안 콘텐츠 시스템을 만들었고,
  지금은 그 시스템이 내 대신 10개 계정을 굴리고 있다.
  내가 실제로 만든 구조를 공유하겠다.&quot;

## 인스타그램
- 가장 쉬운 언어 사용. 비주얼이 중심이고,
  텍스트는 비주얼을 보조한다.
- 캐러셀 텍스트: 굵고 짧게. 슬라이드당 하나의 아이디어.
  1번 슬라이드는 최대 8단어
- 캡션: 더 자세히 써도 되지만 여전히 훑어보기 쉬워야 한다.
- &quot;당신도 할 수 있다&quot;는 aspirational 에너지 필요
- 예시: &quot;나는 10개 계정을 운영하지만 직접 쓰지 않는다.
  시스템이 궁금하다면 넘겨보세요.&quot;

## 틱톡
- 가장 에너지 높은 버전
- 쓰는 문장이 아니라 말하는 문장이어야 한다.
  실제 말하듯 써라.
- 빠르게, 군더더기 없이, 바로 훅 진입
- &quot;이거 진짜 미쳤다&quot; 같은 에너지 허용
- 예시: &quot;아직도 플랫폼마다 직접 글 쓰고 있어요?
  내가 대신 쓰는 시스템 보여드릴게요.&quot;

## 유튜브
- 가장 구조적이고 교육적이어야 한다.
- 더 길고, 더 자세하고, 더 단계별이어야 한다.
- 권위 있는 설명자 목소리 &amp;mdash; 수업하는 전문가처럼
- 여전히 캐주얼할 수 있지만 깊이가 있어야 한다.
- 예시: &quot;오늘은 마크다운 파일과 AI만으로 콘텐츠 시스템을 만드는 방법을
  단계별로 보여드리겠습니다.&quot;

## 뉴스레터
- 가장 개인적이고 친밀한 버전
- 똑똑한 친구에게 편지 쓰듯
- 더 취약하고, 회고적이고, 비하인드 스토리형도 가능
- 어떤 생각이든 가장 길게 풀 수 있는 플랫폼

## 스레드
- X와 비슷하지만 훨씬 더 느슨함
- 구조보다 의견이 더 강함
- &quot;샤워하다 떠오른 생각&quot; 같은 에너지
- 예시: &quot;핫테이크:
  마크다운 파일 폴더 하나가 그 어떤 콘텐츠 마케팅 툴보다 강력할 수 있다&quot;

## 페이스북
- 가장 따뜻하고 커뮤니티 친화적
- 질문하고, 대화를 초대하라
- 전술적 플레이북보다 개인적인 이야기 비중 높이기

## 규칙

플랫폼에 맞게 바꿀 때는:
1. 먼저 톤을 바꿔라.
2. 그다음 포맷을 바꿔라.
3. 그다음 훅을 바꿔라.

보이스 자체는 유지되고,
달라지는 것은 전달 방식뿐이다.
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;12. engine/hooks.md&lt;/h1&gt;
&lt;pre class=&quot;haml&quot;&gt;&lt;code&gt;# 훅 공식

모든 포스트의 시작에 이 공식을 사용하라.
훅 유형은 플랫폼과 주제에 맞게 선택하라.
전달 방식 조정은 [[platform-tone]]를 참고하라.

## 플레이북형 훅
&quot;[원하는 결과]를 얻기 위한 [N]단계는 다음과 같다:&quot;
- 가장 잘 맞는 곳: X, 링크드인, 유튜브 제목
- 예시:
  - &quot;콘텐츠 제작을 자동화하는 7단계는 다음과 같다:&quot;
  - &quot;내가 직접 쓰지 않고 10개 계정을 운영하는 방법은 이렇다:&quot;

## 증거형 훅
&quot;[이전 지표] &amp;rarr; [이후 지표] in [기간]&quot;
- 가장 잘 맞는 곳: X, 링크드인
- 예시:
  - &quot;0 &amp;rarr; 10개 계정 운영, 30일 만에. 마크다운 파일로 만든 시스템&quot;
  - &quot;월 8천 달러 콘텐츠 비용 &amp;rarr; 0달러. 시스템 하나 만든 뒤&quot;

## 반대 의견형 훅
&quot;당신에게 필요한 건 [기존 방식]이 아니다. [이것]이다.&quot;
- 가장 잘 맞는 곳: X, 스레드
- 예시:
  - &quot;콘텐츠 팀은 필요 없다. 스킬 그래프가 필요하다.&quot;
  - &quot;툴 15개는 필요 없다. 마크다운 파일 15개면 된다.&quot;

## 대체형 훅
&quot;나는 [비싸거나 복잡한 것]을 [더 단순한 것]으로 대체했다&quot;
- 가장 잘 맞는 곳: X, 틱톡, 인스타그램 1번 슬라이드
- 예시:
  - &quot;나는 월 8천 달러짜리 콘텐츠 팀을 .md 파일 폴더 하나로 대체했다&quot;
  - &quot;나는 콘텐츠 툴 5개를 위키링크된 마크다운 파일 30개로 대체했다&quot;

## 발견형 훅
&quot;방금 [가치 있는 무언가]를 찾았다&quot;
- 가장 잘 맞는 곳: X
- 예시:
  - &quot;AI가 플랫폼마다 다르게 쓰게 만드는 방법을 방금 찾았다&quot;

## 비하인드형 훅
&quot;나는 [인상적인 것]을 운영하지만, [의외의 방식]을 쓴다&quot;
- 가장 잘 맞는 곳: X, 링크드인, 유튜브 제목
- 예시:
  - &quot;나는 소셜 계정 10개를 운영하지만 직접 글을 한 줄도 쓰지 않는다&quot;

## 규칙
- 주제마다 2~3개의 훅을 테스트하라.
- 어떤 훅 유형이 플랫폼별로 반응이 좋은지 추적하라.
- 매주 업데이트하라.
  성과가 낮은 훅은 지우고, 잘 먹힌 훅은 추가하라.
- [[x]]에서 잘 먹힌 훅이 [[linkedin]]에서도 그대로 먹히는 경우는 거의 없다.
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;13. engine/repurpose.md&lt;/h1&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;# 재가공 체인

하나의 아이디어가 들어오면,
플랫폼 네이티브 결과물 10개가 나온다.
각 결과물은 같은 주제를 다른 방식으로 사고해야 한다.
이건 재포맷이 아니다.

## 체인 순서

아래 순서대로 작성하라.
각 단계는 이전 단계를 기반으로 하지만,
반드시 플랫폼에 맞게 적응되어야 한다.

### 1단계: [[x]] (가장 먼저 작성)
X는 짧게 써야 하기 때문에,
핵심 아이디어와 가장 날카로운 훅을 뽑아내게 만든다.
이후 모든 플랫폼은 여기서 확장된다.
- 출력물: 트윗 1개 또는 장문 트윗 1개 (280~2,000자)

### 2단계: [[linkedin]] (서사를 붙여 확장)
X용 글을 가져와 개인 이야기와 더 깊은 분석을 붙여라.
단순히 길게 쓰지 마라 &amp;mdash; 다른 각도를 추가하라.
- X는 이렇게 말한다: &quot;나는 콘텐츠 팀을 .md 파일로 대체했다&quot;
- 링크드인은 이렇게 말한다:
  &quot;3개월 전만 해도 나는 콘텐츠에 월 8천 달러를 쓰고 있었다.
   그런데 마크다운과 Claude로 시스템을 만든 뒤 모든 게 바뀌었다&quot;
- 출력물: 장문 포스트 (1,300~2,000자)

### 3단계: [[instagram]] (시각 자료로 변환)
핵심 포인트를 뽑아 캐러셀 슬라이드로 바꿔라.
각도는 비주얼 중심, 훑어보기 쉬운 구조, aspirational한 방향으로 이동한다.
- 출력물: 7~10장 캐러셀 + 캡션
- 1번 슬라이드 = 강한 훅
- 각 슬라이드 = 하나의 아이디어, 최대 30단어

### 4단계: [[tiktok]] (날것의 영상으로 압축)
45~60초 스크립트로 압축하라.
이 단계의 핵심은 &quot;설명&quot;이 아니라 &quot;보여주기&quot;다.
- 출력물: 타임스탬프가 있는 영상 스크립트
- 훅은 첫 2초 안에
- 가능하면 시스템이 실제로 작동하는 장면을 보여라

### 5단계: [[youtube]] (깊이 있게 확장)
지금까지의 내용을 합쳐 구조화된 튜토리얼로 만들어라.
시청자가 보고 그대로 따라 할 수 있어야 한다.
- 출력물: 전체 영상 아웃라인 (8~12분)
- SEO 제목 + 설명란
- 챕터용 타임스탬프 포함

### 6단계: [[newsletter]] (가장 개인적인 버전)
가장 깊고, 가장 개인적인 버전이다.
비하인드 스토리, 교훈, 소셜에 공개하지 않은 인사이트를 넣어라.
- 출력물: 1,000~2,000단어 이메일

### 7단계: [[threads]] (대화형으로 재해석)
X 버전을 가져오되 더 느슨하고 의견 중심으로 바꿔라.
- 출력물: 500자 이하의 짧은 포스트 1~3개

### 8단계: [[facebook]] (커뮤니티형으로 변환)
마지막에 질문을 붙여라.
읽게만 하지 말고, 참여를 초대해야 한다.
- 출력물: 끝에 질문이 들어간 포스트

## 리트머스 테스트

각 플랫폼 버전은 반드시 이 질문을 통과해야 한다.

&quot;만약 누군가가 내 모든 플랫폼을 다 팔로우하고 있다면,
같은 내용을 여기저기서 반복해서 본다고 짜증낼까?&quot;

- 그렇다면 &amp;rarr; 재포맷하고 있는 것이다. 다시 돌아가라.
- 아니라면 &amp;rarr; 하나의 아이디어에서 8개의 고유한 결과물을 만든 것이다. 그게 목표다.

## 플랫폼마다 실제로 바뀌는 것

| 요소 | 어떻게 바뀌는가 |
|------|----------------|
| 각도 | 같은 주제라도 진입점이 달라진다 |
| 훅 | 플랫폼마다 다시 써야 한다 |
| 톤 | [[platform-tone]]에 맞게 조정된다 |
| 포맷 | 스레드 / 캐러셀 / 영상 / 장문 글로 달라진다 |
| 길이 | 280자에서 2,000단어까지 달라진다 |
| 깊이 | 표면 인사이트에서 깊은 튜토리얼까지 확장된다 |

## 배치 작업 흐름

1. 모든 플랫폼 버전을 하루 안에 한 세션에서 다 써라.
   며칠에 나눠 쓰지 마라.
2. 반드시 체인 순서를 따라라.
   앞 단계가 뒤 단계를 먹여 살린다.
3. 하나라도 게시하기 전에 8개 결과물을 전부 함께 검토하라.
4. [[scheduling]]을 기준으로 일주일에 분산 예약하라.
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;14. engine/scheduling.md&lt;/h1&gt;
&lt;pre class=&quot;gherkin&quot;&gt;&lt;code&gt;# 스케줄링 &amp;amp; 게시 캘린더

## 주간 빈도
| 플랫폼 | 주당 게시 수 | 추천 요일 |
|--------|--------------|-----------|
| X | 7~10 | 매일 |
| LinkedIn | 3~5 | 월~목 |
| Instagram | 4~5 | 월, 수, 금, 토 |
| TikTok | 5~7 | 매일 |
| YouTube | 1~2 | 화, 목 또는 토 |
| Newsletter | 1 | 화 또는 목 오전 |
| Threads | 3~5 | X 올리는 날 같이 |
| Facebook | 3 | 화, 목, 토 |

## 최적 게시 시간
| 플랫폼 | 추천 시간 |
|--------|-----------|
| X | 오전 8~9시, 12~1시, 오후 5~6시 |
| LinkedIn | 오전 7~8시, 12시, 오후 5~6시 |
| Instagram | 오전 11시~오후 1시, 오후 7~9시 |
| TikTok | 오전 7~9시, 12~3시, 오후 7~10시 |
| YouTube | 전날 오후 2~4시 (밤새 인덱싱됨) |
| Newsletter | 오전 8~10시 |

## 배치 작업 흐름

주간 배치 작업 (일요일 또는 월요일):
1. 이번 주 주제 2~3개를 정한다.
2. 각 주제에 대해 [[repurpose]] 전체 체인을 실행한다.
3. 한 번의 세션으로 주간 포스트 16~24개를 확보할 수 있다.
4. 전부 예약한다.
   (Buffer, Hypefury, Later 또는 각 플랫폼 자체 예약 기능 사용)

일일 루틴 (15분):
1. 참여도 확인
2. 게시 후 첫 1시간 안에 댓글/답글 대응
3. 어떤 훅과 포맷이 잘 먹혔는지 기록

주간 리뷰 (금요일):
1. 어떤 주제가 가장 잘됐는가? &amp;rarr; 그 주제를 더 만든다
2. 어떤 훅 유형이 참여를 만들었는가? &amp;rarr; [[hooks]] 업데이트
3. 어떤 플랫폼이 가장 빨리 성장하는가? &amp;rarr; 거기에 더 집중한다
4. 댓글/DM에서 새 콘텐츠 아이디어가 나왔는가?
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;15. engine/content-types.md&lt;/h1&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;# 콘텐츠 유형 &amp;amp; 포맷

## 스레드 / 멀티파트 포스트
- 플랫폼: X(스레드), LinkedIn(여러 문단), Threads
- 사용 시점: 단계별 가이드, 리스트형 정리, 분석형 콘텐츠
- 구조: 훅 &amp;rarr; 번호형 단계 &amp;rarr; 결론 + CTA

## 캐러셀 / 슬라이드 포스트
- 플랫폼: Instagram, LinkedIn(문서 포스트)
- 사용 시점: 시각 가이드, 프로세스 설명, 비교형 콘텐츠
- 구조: 1번 슬라이드 = 훅, 2~9번 = 내용, 마지막 = CTA

## 숏폼 영상
- 플랫폼: TikTok, Instagram Reels, YouTube Shorts
- 사용 시점: 퀵팁, 데모, 리액션, 비하인드 스토리
- 구조: 훅(2초) &amp;rarr; 본문(30~50초) &amp;rarr; CTA(5초)

## 롱폼 영상
- 플랫폼: YouTube
- 사용 시점: 튜토리얼, 딥다이브, 시스템 워크스루
- 구조: 훅(30초) &amp;rarr; 맥락(90초) &amp;rarr; 본문(6~8분) &amp;rarr; 요약

## 장문 텍스트
- 플랫폼: Newsletter, LinkedIn 아티클, 블로그
- 사용 시점: 깊은 분석, 개인 서사, 종합 가이드
- 길이: 1,000~3,000단어

## 짧은 의견형 포스트
- 플랫폼: X, Threads, Facebook
- 사용 시점: 핫테이크, 관찰, 단일 인사이트
- 길이: X는 280자 이하, Threads는 500자 이하
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;16. audience/builders.md&lt;/h1&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;# 독자: Builders

## 이들은 누구인가
인디해커, 1인 창업자, AI 엔지니어, SaaS 빌더,
프리랜서, 에이전시 운영자.
이미 무언가를 만들고 있거나, 적극적으로 계획 중인 사람들.
당신이 가르치는 내용을 직접 구현할 만큼은 기술적이다.
수익 범위는 월 0달러~5만 달러 정도이며,
더 크게 키우고 싶어 한다.

## 이들이 원하는 것
- 이론이 아니라 실행 가능한 플레이북.
  오늘 바로 따라 할 수 있는 단계
- 실제 숫자. 매출, 지표, 비용, 절약된 시간
- 맥락이 있는 도구 추천.
  단순히 &quot;이 툴 쓰세요&quot;가 아니라,
  언제 왜 써야 하는지까지
- 시스템 사고.
  개별 팁이 아니라 요소들이 어떻게 연결되는지

## 이들에게 말하는 방식
- 직접적이고 구체적으로.
  &quot;한번 고려해보세요&quot;가 아니라 &quot;5단계는 이렇다&quot;
- 작업 과정을 보여줘라.
  실제 스크린샷, 실제 숫자, 실제 프로세스
- 동료 같은 에너지.
  위에서 가르치는 사람이 아니라 함께 만드는 사람처럼
- 도전하라.
  &quot;이걸 안 하고 있다면 돈을 놓치고 있는 것이다&quot; 같은 식으로
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;17. audience/casual.md&lt;/h1&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;# 독자: Casual

## 이들은 누구인가
AI/기술에 관심은 있지만 아직 깊게 기술적이지는 않은 사람들.
비기술 직무의 직장인일 수도 있고,
AI에 관심을 갖기 시작한 초기 단계일 수도 있다.
아직은 만드는 것보다 소비하는 비중이 더 크다.
그러나 aspirational하다.
언젠가는 builder가 되고 싶어 한다.

## 이들이 원하는 것
- 복잡한 주제를 쉽게 풀어준 설명
- 영감과 &quot;나도 할 수 있겠다&quot;는 감정
- 시작점 &amp;mdash; 어디서 시작해야 하는지,
  무엇부터 배워야 하는지
- 너무 intimidating하지 않은 현실적 결과

## 이들에게 말하는 방식
- 더 쉬운 언어를 사용하라.
  약어는 풀어 설명하고, 용어는 정의하라.
- 더 격려하고, 덜 압박하라.
- &quot;가장 쉽게 시작하는 방법은 이거다&quot; 같은 에너지
- 이미 알고 있는 것과 연결되는 비유와 비교를 사용하라.
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;18. 실제 실행 프롬프트 전체 한국어 번역&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Claude Projects용 실행 프롬프트&lt;/h2&gt;
&lt;pre class=&quot;erlang&quot;&gt;&lt;code&gt;주제: 내가 마크다운 파일을 사용해,
직접 아무것도 수동으로 쓰지 않고 소셜 미디어 계정 10개를 운영하는 방법

index.md의 실행 지침을 따르세요.
repurpose 체인 순서대로 각 플랫폼용 네이티브 포스트를 하나씩 만들어 주세요.
각 포스트는 같은 주제를 단순히 다시 포맷한 것이 아니라,
그 플랫폼에 맞게 완전히 다시 사고한 버전이어야 합니다.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;단순 붙여넣기 방식용 지시문&lt;/h2&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;h1&gt;19. 예시 주제에 대한 플랫폼별 사고 차이 설명 번역&lt;/h1&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;b&gt;&quot;AI를 사용해 소셜 미디어 계정 10개를 관리하는 방법&quot;&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;X&lt;/b&gt;: 반대 의견형 스레드, 소문자, 캐주얼, 단계형&lt;br /&gt;예: &quot;콘텐츠 팀은 필요 없다. 30개의 마크다운 파일이 필요하다. 내가 직접 한 줄도 쓰지 않고 10개 계정을 운영하는 방식은 이렇다:&quot;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LinkedIn&lt;/b&gt;: 개인 서사 + 전문적 톤 + 약 1,500자&lt;br /&gt;예: &quot;6개월 전만 해도 나는 10개 플랫폼의 콘텐츠 제작에 월 8,000달러를 쓰고 있었다. 지금은 0달러다. 정확히 무엇이 바뀌었는지 공유하겠다.&quot;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Instagram&lt;/b&gt;: 7장 캐러셀, 첫 장에 강한 주장&lt;br /&gt;예:&lt;br /&gt;1장: &quot;나는 10개 계정을 운영하지만 직접 쓰지 않는다&quot;&lt;br /&gt;2~7장: 시스템을 시각적 단계로 분해&lt;br /&gt;마지막 장: &quot;저장하세요. 더 보려면 팔로우&quot;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;TikTok&lt;/b&gt;: 45초 스크린 레코딩 스크립트&lt;br /&gt;예: &quot;아직도 플랫폼마다 손으로 직접 글 쓰고 있나요? 내가 쓰는 시스템 보여드릴게요.&quot;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;YouTube&lt;/b&gt;: SEO 제목 + 구조화된 8분 튜토리얼&lt;br /&gt;예: &quot;AI로 소셜 미디어 계정 10개 운영하는 법 (완전한 시스템 가이드)&quot;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Newsletter&lt;/b&gt;: 1,500단어 깊이 있는 설명&lt;br /&gt;예: &quot;이번 주에는 몇 달 동안 조용히 구축해 온 시스템의 뒤를 공개해보려 한다...&quot;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Threads&lt;/b&gt;: 대화형 핫테이크&lt;br /&gt;예: &quot;핫테이크: 콘텐츠의 미래는 네 대신 써주는 AI가 아니라, 네 대신 10명처럼 생각해주는 AI다&quot;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Facebook&lt;/b&gt;: 커뮤니티 질문형&lt;br /&gt;예: &quot;여러 계정을 한 번에 운영하기 위해 직접 시스템을 만들어본 적 있나요? 제가 요즘 실험 중인 방식은 이런데, 여러분 생각도 궁금합니다.&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;20. 최종 요약&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 콘텐츠 엔진은 더 강한 한 줄 프롬프트에서 나오지 않는다.&lt;br /&gt;좋은 콘텐츠 엔진은 &lt;b&gt;AI가 따라갈 수 있는 구조화된 지식 그래프&lt;/b&gt;에서 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 그 지식 그래프는 거창한 인프라보다,&lt;br /&gt;잘 연결된 마크다운 파일 17개로도 시작할 수 있다.&lt;/p&gt;</description>
      <category>AI</category>
      <author>행복한 수지아빠</author>
      <guid isPermaLink="true">https://javaexpert.tistory.com/1731</guid>
      <comments>https://javaexpert.tistory.com/1731#entry1731comment</comments>
      <pubDate>Mon, 13 Apr 2026 14:33:34 +0900</pubDate>
    </item>
    <item>
      <title>RAG vs Agentic RAG 정리</title>
      <link>https://javaexpert.tistory.com/1730</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAWtYd/dJMcabqjszt/jjWd0csePS16y4xCTwHvhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAWtYd/dJMcabqjszt/jjWd0csePS16y4xCTwHvhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAWtYd/dJMcabqjszt/jjWd0csePS16y4xCTwHvhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAWtYd%2FdJMcabqjszt%2FjjWd0csePS16y4xCTwHvhK%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;1014&quot; height=&quot;1024&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;RAG vs Agentic RAG 정리&lt;/h1&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;RAG&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;그 결과를 LLM에 붙여서 답하게 하는 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Agentic RAG&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;b&gt;에이전트가 계획을 세우고, 필요한 도구를 선택하고, 여러 소스를 순차적으로 탐색한 뒤&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;더 능동적으로 답을 만드는 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;2. 기본 RAG 구조&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지 상단의 흐름은 거의 이렇게 보면 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;동작 흐름&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;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;Search&lt;/b&gt;가 지식 소스에서 관련 정보 가져옴
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PDF&lt;/li&gt;
&lt;li&gt;Database&lt;/li&gt;
&lt;li&gt;Documents&lt;/li&gt;
&lt;li&gt;Code&lt;/li&gt;
&lt;li&gt;Web Search&lt;/li&gt;
&lt;li&gt;API&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;검색 결과를 서버가 받음&lt;/li&gt;
&lt;li&gt;서버가 원래 질문 + 검색된 문맥을 합쳐서 LLM에 전달&lt;/li&gt;
&lt;li&gt;LLM이 최종 답변 생성&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;/li&gt;
&lt;li&gt;빠르고 구현이 쉬움&lt;/li&gt;
&lt;li&gt;질문 1개 &amp;rarr; 검색 1번 &amp;rarr; 답변 1번 같은 흐름에 적합&lt;/li&gt;
&lt;li&gt;정적인 문서 검색형 QA에 강함&lt;/li&gt;
&lt;/ul&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;&amp;ldquo;먼저 뭐를 찾고, 그다음 어떤 도구를 써야 하는지&amp;rdquo;를 능동적으로 판단하는 능력이 약함&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;3. Agentic RAG 구조&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지 하단은 단순 검색이 아니라 &lt;b&gt;중간에 에이전트 레이어&lt;/b&gt;가 들어간 구조입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;동작 흐름&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;사용자&lt;/b&gt;가 질문 입력&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Aggregator Agent&lt;/b&gt;가 질문을 받음&lt;/li&gt;
&lt;li&gt;에이전트가 먼저 &lt;b&gt;Plan(계획)&lt;/b&gt; 수립
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ReAct&lt;/li&gt;
&lt;li&gt;CoT&lt;/li&gt;
&lt;li&gt;Planning&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;필요한 작업을 여러 &lt;b&gt;하위 Agent&lt;/b&gt;에게 분배&lt;/li&gt;
&lt;li&gt;각 Agent가 MCP 서버나 외부 도구를 통해 정보 수집
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Local Data&lt;/li&gt;
&lt;li&gt;Local Data Sources&lt;/li&gt;
&lt;li&gt;Search Engine&lt;/li&gt;
&lt;li&gt;Web Search&lt;/li&gt;
&lt;li&gt;Cloud Engine&lt;/li&gt;
&lt;li&gt;AWS &amp;amp; Azure&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;필요한 경우 &lt;b&gt;Memory&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Short Term&lt;/li&gt;
&lt;li&gt;Long Term&lt;br /&gt;를 활용해 문맥 보강&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;모은 정보를 통합해서 최종 응답 생성&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;4. Agentic RAG의 핵심 요소&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4-1. Aggregator Agent&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;/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;/ul&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;4-2. Planning&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 RAG와 가장 큰 차이 중 하나입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 질문이:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;최신 시장 동향 찾아서 요약하고,&lt;/li&gt;
&lt;li&gt;내부 문서랑 비교하고,&lt;/li&gt;
&lt;li&gt;누락된 리스크도 정리해줘&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 식이면 Agentic RAG는:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;최신 웹 검색&lt;/li&gt;
&lt;li&gt;내부 문서 조회&lt;/li&gt;
&lt;li&gt;비교 분석&lt;/li&gt;
&lt;li&gt;리스크 정리&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 &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;4-3. Multi-Agent&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Agent 1, 2, 3 같은 여러 작업 단위를 둘 수 있습니다.&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;Agent 1: 내부 문서 검색&lt;/li&gt;
&lt;li&gt;Agent 2: 웹 검색&lt;/li&gt;
&lt;li&gt;Agent 3: 클라우드/API 질의&lt;/li&gt;
&lt;li&gt;Aggregator: 결과 종합&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;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4-4. Memory&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Agentic RAG는 메모리를 붙이기 쉽습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Short-term memory&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;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Long-term memory&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;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 덕분에 단순 &amp;ldquo;문서 검색기&amp;rdquo;가 아니라&lt;br /&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;4-5. MCP / Tool Use&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지에서는 MCP Servers가 외부 실행 계층처럼 보입니다.&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;로컬 데이터, 검색엔진, 웹, 클라우드 서비스, 각종 API 같은&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;즉 Agentic RAG는&lt;br /&gt;&amp;ldquo;검색해서 붙여주는 시스템&amp;rdquo;을 넘어서&lt;br /&gt;&lt;b&gt;도구를 실제로 쓰는 시스템&lt;/b&gt;으로 발전합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;5. 둘의 차이를 표처럼 보면&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기본 RAG&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;li&gt;적합한 작업: 문서 QA, FAQ, 단순 검색 응답&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Agentic RAG&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;li&gt;적합한 작업: 복합 조사, 자동화, 멀티스텝 문제 해결&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;6. 언제 무엇을 쓰면 좋은가&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;RAG가 맞는 경우&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;고객지원 FAQ&lt;/li&gt;
&lt;li&gt;메뉴얼 기반 질의응답&lt;/li&gt;
&lt;li&gt;속도와 단순성이 중요한 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Agentic RAG가 맞는 경우&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;검색 외에 API 호출, DB 조회, 웹 탐색이 필요한 경우&lt;/li&gt;
&lt;li&gt;사용자별 문맥 기억이 중요한 경우&lt;/li&gt;
&lt;li&gt;조사 &amp;rarr; 비교 &amp;rarr; 판단 &amp;rarr; 정리 같은 워크플로우가 필요한 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;7. 실무 관점에서 더 현실적으로 보면&lt;/h1&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기본 RAG&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;문서 chunking&lt;/li&gt;
&lt;li&gt;reranking&lt;/li&gt;
&lt;li&gt;answer synthesis&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2단계&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Tool-augmented RAG&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;검색 + API 호출&lt;/li&gt;
&lt;li&gt;검색 실패 시 웹 검색 fallback&lt;/li&gt;
&lt;li&gt;citation 정리&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;&lt;b&gt;Agentic RAG&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&lt;/li&gt;
&lt;li&gt;retriever agent&lt;/li&gt;
&lt;li&gt;tool agent&lt;/li&gt;
&lt;li&gt;memory&lt;/li&gt;
&lt;li&gt;evaluator / verifier&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 처음부터 무조건 Agentic으로 가기보다,&lt;br /&gt;대부분은 &lt;b&gt;RAG &amp;rarr; 도구 결합 &amp;rarr; 에이전트화&lt;/b&gt; 순서로 진화합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;8. 이 이미지의 핵심 메시지&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 그림이 말하는 본질은 딱 이겁니다:&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RAG는 &quot;찾아서 넣어주는 구조&quot;이고,&lt;br /&gt;Agentic RAG는 &quot;생각하고, 나누고, 도구를 써서, 종합하는 구조&quot;다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;9. 아주 짧게 다시 요약&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;RAG&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;질문 &amp;rarr; 검색 &amp;rarr; 문맥 추가 &amp;rarr; LLM 답변&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Agentic RAG&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;질문 &amp;rarr; 계획 &amp;rarr; 여러 에이전트/도구 사용 &amp;rarr; 메모리 활용 &amp;rarr; 결과 통합 &amp;rarr; 답변&lt;/p&gt;</description>
      <category>AI</category>
      <author>행복한 수지아빠</author>
      <guid isPermaLink="true">https://javaexpert.tistory.com/1730</guid>
      <comments>https://javaexpert.tistory.com/1730#entry1730comment</comments>
      <pubDate>Mon, 13 Apr 2026 12:19:05 +0900</pubDate>
    </item>
    <item>
      <title>deep-project: 요구사항을 아주 제대로 정의해보자</title>
      <link>https://javaexpert.tistory.com/1729</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;AI 코딩 도구를 쓰다 보면, 가장 먼저 부딪히는 문제는 코드 생성 자체가 아닙니다.&lt;br /&gt;오히려 &amp;ldquo;무엇을 어디까지 만들 것인가&amp;rdquo;를 구조화하지 못한 상태에서 너무 큰 요구사항을 한 번에 던지는 일이 더 큰 문제입니다.&lt;br /&gt;예를 들어 &amp;ldquo;SaaS 플랫폼 하나 만들어줘&amp;rdquo; 같은 요청은 그럴듯해 보이지만, 실제 구현 단계로 내려가면 인증, 결제, 대시보드, 외부 연동처럼 서로 다른 성격의 하위 문제들이 섞여 있습니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;deep-project는 바로 이 지점을 다룹니다.&lt;br /&gt;이 도구는 모호하고 큰 프로젝트 요구사항을 바로 구현하려 하지 않고, 먼저 인터뷰와 분해 과정을 거쳐 &amp;ldquo;계획 가능한 단위&amp;rdquo;로 나누는 데 집중합니다.&lt;/p&gt;
&lt;figure id=&quot;og_1776049706222&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - piercelamb/deep-project: Claude Code plugin that transforms vague software ideas into individual, ready-to-be-planned c&quot; data-og-description=&quot;Claude Code plugin that transforms vague software ideas into individual, ready-to-be-planned components - piercelamb/deep-project&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/piercelamb/deep-project&quot; data-og-url=&quot;https://github.com/piercelamb/deep-project&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cu4CaN/dJMb8T90Kjt/3tA6iZa880Kiw4r9A09aeK/img.png?width=1200&amp;amp;height=600&amp;amp;face=982_131_1047_202,https://scrap.kakaocdn.net/dn/bFK01V/dJMb9kT4eg5/7f1JPCWtpx0ominxqy2cM1/img.png?width=1200&amp;amp;height=600&amp;amp;face=982_131_1047_202,https://scrap.kakaocdn.net/dn/P4nFr/dJMb9dHpoRh/RC11uhu7J8YB6cp32nXpk1/img.jpg?width=700&amp;amp;height=297&amp;amp;face=0_0_700_297&quot;&gt;&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/piercelamb/deep-project&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cu4CaN/dJMb8T90Kjt/3tA6iZa880Kiw4r9A09aeK/img.png?width=1200&amp;amp;height=600&amp;amp;face=982_131_1047_202,https://scrap.kakaocdn.net/dn/bFK01V/dJMb9kT4eg5/7f1JPCWtpx0ominxqy2cM1/img.png?width=1200&amp;amp;height=600&amp;amp;face=982_131_1047_202,https://scrap.kakaocdn.net/dn/P4nFr/dJMb9dHpoRh/RC11uhu7J8YB6cp32nXpk1/img.jpg?width=700&amp;amp;height=297&amp;amp;face=0_0_700_297');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - piercelamb/deep-project: Claude Code plugin that transforms vague software ideas into individual, ready-to-be-planned c&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Claude Code plugin that transforms vague software ideas into individual, ready-to-be-planned components - piercelamb/deep-project&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;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;p data-ke-size=&quot;size16&quot;&gt;프로젝트 요구사항이 큰데도 바로 설계나 구현으로 들어가면, 가장 먼저 비용 문제가 생깁니다.&lt;br /&gt;같은 내용을 여러 번 다시 설명해야 하고, 각 세션마다 컨텍스트를 다시 쌓아야 하며, 잘못 쪼개진 작업 때문에 재계획이 반복됩니다.&lt;br /&gt;결국 API 비용이든, 사람의 검토 비용이든, 둘 다 늘어납니다. 이는 README가 말하는 &amp;ldquo;인터뷰에 약 15분 투자하고 이후 재작업 시간을 줄인다&amp;rdquo;는 메시지와도 맞닿아 있습니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성능 문제도 큽니다.&lt;br /&gt;하나의 거대한 요구사항 안에는 독립적으로 판단해야 할 서브시스템이 여러 개 들어 있는데, 이를 한 번에 처리하면 모델이 범위를 과도하게 넓게 해석하거나, 중요한 관계를 놓치기 쉽습니다.&lt;br /&gt;README에서도 이런 경우 Claude가 범위에 압도되어 가정을 늘리고, 통합 이슈와 재작업으로 이어질 수 있다고 설명합니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유지보수 문제는 더 실무적입니다.&lt;br /&gt;처음부터 기능 경계가 정리되지 않으면, 나중에 문서와 구현 단위가 엉키고, 어떤 컴포넌트가 무엇에 의존하는지 추적하기 어려워집니다.&lt;br /&gt;특히 인증, 결제, 관리자 기능처럼 순서와 의존성이 중요한 영역은 초기에 구조를 잘못 잡으면 이후 수정 비용이 크게 올라갑니다. deep-project가 manifest와 dependency mapping을 별도로 두는 이유가 여기에 있습니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 경험 측면에서도 손실이 큽니다.&lt;br /&gt;거대한 요구사항을 한 번에 처리하면 디버깅이 어려워지고, 세션이 끊겼을 때 어디까지 진행했는지 복원하기도 힘듭니다.&lt;br /&gt;반대로 deep-project는 인터뷰 기록, 분해 결과, 디렉터리 생성, 스펙 생성 상태를 기준으로 재개 지점을 판단하도록 설계되어 있습니다. 이건 단순 편의 기능이 아니라, AI 기반 작업 흐름을 끊김 없이 유지하기 위한 핵심 설계입니다. (&lt;a href=&quot;https://raw.githubusercontent.com/piercelamb/deep-project/main/skills/deep-project/SKILL.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;deep-project란 무엇인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;deep-project는 &lt;b&gt;모호한 프로젝트 요구사항을 잘 계획할 수 있는 여러 개의 작업 단위로 분해해 주는 Claude Code 플러그인&lt;/b&gt;입니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비유하자면, 바로 집을 짓는 도구가 아니라 먼저 방 개수, 배관, 전기, 출입 동선부터 나눠서 설계 도면의 뼈대를 만드는 도구에 가깝습니다.&lt;br /&gt;즉, &amp;ldquo;만들기&amp;rdquo;보다 먼저 &amp;ldquo;어떻게 나눌지&amp;rdquo;를 결정하는 단계에 특화되어 있습니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기술적으로 보면 이 도구는 큰 요구사항을 입력받아 인터뷰를 수행하고, 분할이 필요한지 판단한 뒤, 각 분할 단위의 의존 관계와 실행 순서를 정리한 manifest와 개별 spec.md 파일들을 생성합니다.&lt;br /&gt;이 출력물은 이후 deep-plan 같은 다음 단계 도구에 넘겨 더 세밀한 구현 계획으로 이어지도록 설계되어 있습니다. 즉, 구현 도구가 아니라 &amp;ldquo;계획 전처리기&amp;rdquo;에 가깝습니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 방식과의 차이는 분명합니다.&lt;br /&gt;보통은 하나의 긴 프롬프트로 전체 시스템을 설명하고, 그 결과를 다시 사람이 정리합니다.&lt;br /&gt;반면 deep-project는 처음부터 요구사항 분해를 독립된 단계로 분리합니다. 철학적으로도 &amp;ldquo;큰 문제를 바로 풀지 말고, 먼저 경계를 정의하라&amp;rdquo;에 가깝습니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&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;b&gt;AI 인터뷰 기반 요구사항 보완&lt;/b&gt;&lt;br /&gt;입력 파일이 대충 적혀 있어도 인터뷰 단계에서 사용자의 머릿속 구조를 끌어냅니다. 그래서 처음부터 완벽한 명세를 써두지 않아도 됩니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프로젝트 분할 여부를 먼저 판단&lt;/b&gt;&lt;br /&gt;무조건 여러 개로 쪼개는 것이 아니라, 이 프로젝트가 정말 분할이 필요한지부터 평가합니다. 작은 기능이면 단일 단위로 유지할 수도 있습니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;의존 관계와 실행 순서를 문서화&lt;/b&gt;&lt;br /&gt;단순히 파일만 여러 개 만드는 것이 아니라, 어떤 단위가 무엇에 선행하는지 manifest에 남깁니다. 이게 있어야 이후 계획과 구현이 덜 흔들립니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;재개 가능한 워크플로우&lt;/b&gt;&lt;br /&gt;세션이 끊기거나 중단돼도 기존 산출물을 보고 어디서부터 이어갈지 판단합니다. AI 도구를 실무에서 쓸 때 중요한 안정성을 의식한 구조입니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;출력물이 다음 단계 도구와 자연스럽게 연결됨&lt;/b&gt;&lt;br /&gt;각 분할 디렉터리 안의 spec.md는 이후 deep-plan에 넘기기 위한 입력으로 설계되어 있습니다. 즉, 독립 도구라기보다 파이프라인의 첫 단계입니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;외부 API 키 없이 동작&lt;/b&gt;&lt;br /&gt;README 기준으로 Python 의존성만 관리하면 되고, deep-plan과 달리 외부 API 키가 필요하지 않다고 설명합니다. 초기 진입 장벽이 낮다는 뜻입니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실제로 어떤 효과가 있는가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공개된 자료 기준으로 보면, 이 도구의 핵심 효과는 &amp;ldquo;큰 요구사항을 작은 계획 단위로 바꾸는 것&amp;rdquo;입니다.&lt;br /&gt;예시로는 SaaS 플랫폼 같은 넓은 범위의 프로젝트를 인증, 결제, 대시보드 같은 식으로 분해해 각 단위를 별도 계획 세션으로 넘길 수 있게 합니다.&lt;br /&gt;즉, 한 번에 모든 걸 잘하게 만드는 도구가 아니라, 한 번에 잘못 다루지 않게 만드는 도구입니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전과 후를 비교하면 차이가 분명합니다.&lt;br /&gt;이전에는 하나의 넓은 요구사항을 통째로 처리하다 보니 범위가 뒤섞이고 관계가 누락되기 쉬웠습니다.&lt;br /&gt;이후에는 인터뷰, 분할 분석, 의존성 정리, 스펙 생성까지 거치면서 각 작업 단위가 독립적으로 검토 가능한 형태로 바뀝니다. README는 이를 통해 수시간의 조정과 재작업을 줄일 수 있다고 설명합니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;효과가 가장 큰 상황도 명확합니다.&lt;br /&gt;여러 서브시스템이 얽힌 신규 프로젝트, 기능보다 제품 전체 구조가 먼저 필요한 프로젝트, 여러 계획 세션을 병렬로 나눠야 하는 팀에서 특히 유리합니다.&lt;br /&gt;반대로 단일 기능이나 작은 버그 수정처럼 이미 범위가 좁은 일에는 효과가 제한적입니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 팀 단위 프로젝트에 잘 맞습니다.&lt;br /&gt;manifest로 실행 순서와 의존성을 남기고, 각 split별 spec.md를 따로 만들기 때문에 사람이나 에이전트를 여러 갈래로 나누어 일시키기 쉬워집니다.&lt;br /&gt;이 구조는 개인 생산성보다 협업 가능한 구조화에 더 큰 강점이 있습니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;동작 원리 / 구조&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;입력 파일 검증&lt;/b&gt;&lt;br /&gt;먼저 @path/to/requirements.md 형태의 요구사항 파일이 있는지, Markdown 파일인지, 비어 있지 않은지 검사합니다.&lt;br /&gt;이 단계가 있는 이유는 이후 흐름 전체가 파일 기반 상태 관리에 의존하기 때문입니다. 입력이 불안정하면 재개도 불가능해집니다. (&lt;a href=&quot;https://raw.githubusercontent.com/piercelamb/deep-project/main/skills/deep-project/SKILL.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;세션과 플러그인 루트 확인&lt;/b&gt;&lt;br /&gt;세션 시작 훅이 넣어준 DEEP_PLUGIN_ROOT, DEEP_SESSION_ID 같은 정보를 바탕으로 플러그인 루트와 세션 상태를 확인합니다.&lt;br /&gt;이건 단순 초기화가 아니라, 중단 후 재실행해도 같은 작업 목록과 상태를 복원하기 위한 장치입니다. (&lt;a href=&quot;https://raw.githubusercontent.com/piercelamb/deep-project/main/skills/deep-project/SKILL.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;인터뷰 수행&lt;/b&gt;&lt;br /&gt;고정된 질문지를 무조건 돌리는 방식이 아니라, 사용자의 답을 바탕으로 적응형 질문을 이어가며 프로젝트의 정신 모델을 끌어냅니다.&lt;br /&gt;왜 이런 방식이냐면, 처음 요구사항 문서는 대개 불완전하고, 실제로 중요한 분할 기준은 사용자의 머릿속에 있기 때문입니다. 인터뷰 결과는 별도 파일로 저장됩니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;분할 분석&lt;/b&gt;&lt;br /&gt;인터뷰 내용과 원본 요구사항을 바탕으로 이 프로젝트가 여러 planning unit으로 나뉘어야 하는지 판단합니다.&lt;br /&gt;중요한 점은 &amp;ldquo;항상 많이 쪼개는 것&amp;rdquo;이 아니라 &amp;ldquo;계획 가능한 단위로 쪼개는 것&amp;rdquo;입니다. 그래서 작은 기능이면 단일 단위로 유지할 수도 있습니다. (&lt;a href=&quot;https://raw.githubusercontent.com/piercelamb/deep-project/main/skills/deep-project/SKILL.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;의존성 발견과 manifest 생성&lt;/b&gt;&lt;br /&gt;각 split의 역할, 상호 관계, 추천 실행 순서를 project-manifest.md에 정리합니다.&lt;br /&gt;이 단계가 핵심인 이유는, 나누기만 하고 관계를 명시하지 않으면 이후 병렬 작업에서 다시 충돌이 생기기 때문입니다. README는 여기에 machine-readable한 SPLIT_MANIFEST 블록도 포함된다고 설명합니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용자 확인&lt;/b&gt;&lt;br /&gt;도구가 제안한 분해 구조를 바로 확정하지 않고, 사용자 승인 과정을 둡니다.&lt;br /&gt;이는 AI가 범위를 잘 쪼개는 것과, 실제 팀이 원하는 경계가 일치하는지를 마지막으로 맞추는 단계입니다. (&lt;a href=&quot;https://raw.githubusercontent.com/piercelamb/deep-project/main/skills/deep-project/SKILL.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;디렉터리 생성&lt;/b&gt;&lt;br /&gt;승인된 manifest를 바탕으로 번호가 붙은 split 디렉터리를 생성합니다.&lt;br /&gt;예를 들어 01-auth-system, 02-billing 같은 구조가 만들어집니다. 이 번호 체계는 순서를 눈에 보이게 하고, 후속 작업에서 경로 규칙을 단순하게 만들어 줍니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;각 split의 spec 생성&lt;/b&gt;&lt;br /&gt;마지막으로 각 디렉터리 안에 spec.md를 작성합니다.&lt;br /&gt;이렇게 생성된 스펙은 이후 더 깊은 계획 단계의 입력으로 쓰입니다. 즉, 결과물의 목적이 &amp;ldquo;문서 저장&amp;rdquo;이 아니라 &amp;ldquo;다음 자동화 단계의 안정적 입력&amp;rdquo;이라는 점이 중요합니다. (&lt;a href=&quot;https://raw.githubusercontent.com/piercelamb/deep-project/main/skills/deep-project/SKILL.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치 / 사용 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 README 기준 기본 설치 흐름은 Claude Code 플러그인 마켓플레이스를 사용하는 방식입니다.&lt;br /&gt;필수 조건으로는 Claude Code, Python 3.11 이상, uv가 제시되어 있습니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;설치 명령어&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;/plugin marketplace add piercelamb/deep-project
/plugin install deep-project
/plugin enable deep-project
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;README에는 이미 같은 계열 플러그인을 추가한 경우, 마켓플레이스를 다시 추가하지 않고 설치만 진행할 수 있다고 안내합니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&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;먼저 planning 디렉터리에 요구사항 파일을 준비합니다.&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;mkdir -p planning
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들면 다음처럼 요구사항을 정리할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# My SaaS Platform

Build a complete SaaS platform with:
- User authentication
- Subscription billing
- Admin dashboard
- User-facing dashboard
- API for third-party integrations
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 Claude Code에서 아래처럼 실행합니다.&lt;/p&gt;
&lt;pre class=&quot;aspectj&quot;&gt;&lt;code&gt;/deep-project @planning/requirements.md
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그다음에는 인터뷰 &amp;rarr; 분할 분석 &amp;rarr; 확인 &amp;rarr; 생성 흐름으로 진행됩니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최소 실행 예제&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;mkdir -p planning
cat &amp;gt; planning/requirements.md &amp;lt;&amp;lt; 'EOF'
# Internal Tool

Build an internal operations platform with:
- SSO login
- Role-based permissions
- Billing summary page
- Admin analytics
EOF

/deep-project @planning/requirements.md
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행이 끝나면 대략 다음과 같은 구조를 기대할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;dos&quot;&gt;&lt;code&gt;planning/
├── requirements.md
├── deep_project_interview.md
├── project-manifest.md
└── splits/
    ├── 01-auth-system/
    │   └── spec.md
    ├── 02-billing/
    │   └── spec.md
    └── 03-dashboard/
        └── spec.md
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션이 중간에 끊겨도 같은 명령을 다시 실행하면 기존 상태를 보고 재개할 수 있습니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&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;누가 봐도 범위가 넓은 SaaS, 내부 운영 플랫폼, B2B 제품 초기 기획에 적합합니다.&lt;br /&gt;인증, 결제, 대시보드, API 연동처럼 결이 다른 문제를 먼저 갈라야 할 때 유용합니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. deep-plan 같은 후속 계획 도구를 쓰기 전 단계&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 spec 기반 계획 워크플로우를 운영하고 있다면, deep-project는 그 앞단에서 입력 품질을 정리하는 역할을 합니다.&lt;br /&gt;특히 너무 큰 요구사항을 그대로 넣으면 후속 계획 단계도 흔들릴 수 있을 때 효과가 큽니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-plan/blob/main/README.md?utm_source=chatgpt.com&quot;&gt;GitHub&lt;/a&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;한 사람이 전체를 붙잡고 있기보다, split별로 각각 계획 세션을 따로 돌리고 싶은 경우에 적합합니다.&lt;br /&gt;manifest에 의존성과 순서가 남기 때문에 누가 무엇을 먼저 해야 하는지 정리하기 쉽습니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. AI 코딩 세션이 자주 끊기는 환경&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨텍스트 제한이나 세션 중단이 잦다면, 상태 기반 재개 기능이 큰 장점이 됩니다.&lt;br /&gt;한 번의 긴 세션에 모든 걸 걸기보다, 단계별 산출물을 남기며 이어가는 방식에 맞습니다. (&lt;a href=&quot;https://raw.githubusercontent.com/piercelamb/deep-project/main/skills/deep-project/SKILL.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. &amp;ldquo;무엇을 만들어야 하는지&amp;rdquo;부터 불명확한 프로젝트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요구사항 문서가 애매하고, 팀 내부에서도 경계가 합의되지 않은 경우에 특히 좋습니다.&lt;br /&gt;인터뷰 단계가 바로 이런 애매함을 구조화하기 위한 장치입니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&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;br /&gt;즉, 이것만으로 상세 설계나 코드 구현이 끝나는 것은 아닙니다. 이후 단계 도구나 사람의 검토가 여전히 필요합니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 기준으로는 작은 작업에는 오히려 과할 수 있습니다.&lt;br /&gt;README도 단일 기능, 버그 수정, 범위가 이미 명확한 작업이라면 건너뛰라고 안내합니다.&lt;br /&gt;모든 문제를 무조건 잘게 쪼개는 것이 좋은 것은 아닙니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 하나 주의할 점은, 분해 품질이 인터뷰 품질에 영향을 받는다는 것입니다.&lt;br /&gt;도구가 자동으로 구조를 제안하더라도, 사용자가 프로젝트의 핵심 경계를 제대로 설명하지 못하면 결과도 어긋날 수 있습니다.&lt;br /&gt;즉, 완전 자동화라기보다 &amp;ldquo;잘 질문하고 잘 정리하는 자동화&amp;rdquo;에 가깝습니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직 검증되지 않은 영역도 있습니다.&lt;br /&gt;공개 자료만으로는 대규모 조직에서 이 출력물이 얼마나 일관되게 유지되는지, 혹은 복잡한 도메인 모델에서 분해 기준이 얼마나 안정적인지까지는 확인하기 어렵습니다.&lt;br /&gt;따라서 실무 적용 시에는 먼저 내부 프로젝트 한두 개에 시범 적용해 split granularity가 팀과 맞는지 확인하는 접근이 현실적입니다. 이는 공개된 문서 구조를 바탕으로 한 판단입니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;deep-project의 핵심 가치는 코드를 더 빨리 쓰게 하는 데 있지 않습니다.&lt;br /&gt;그보다 먼저, 큰 요구사항을 사람이 검토할 수 있고 다음 단계 도구가 다룰 수 있는 단위로 정리해 준다는 데 있습니다.&lt;br /&gt;AI 코딩에서 가장 취약한 지점이 &amp;ldquo;모호한 입력&amp;rdquo;이라면, 이 도구는 바로 그 취약점을 줄이는 쪽에 서 있습니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 신규 제품을 설계하는 스타트업, AI 에이전트 기반 개발 워크플로우를 만들고 있는 개발자, 여러 서브시스템을 동시에 다뤄야 하는 팀에게 잘 맞습니다.&lt;br /&gt;반대로 범위가 이미 분명한 작은 기능 작업에는 굳이 앞단 분해 단계를 넣지 않아도 됩니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&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;b&gt;핵심 개념&lt;/b&gt;&lt;br /&gt;deep-project는 큰 요구사항을 인터뷰와 분해 과정을 통해 계획 가능한 단위로 나누는 Claude Code 플러그인입니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;차별점&lt;/b&gt;&lt;br /&gt;바로 구현하지 않고, 먼저 split 구조와 의존성을 정리한 manifest 및 개별 spec.md를 만드는 데 집중합니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;언제 쓰면 좋은지&lt;/b&gt;&lt;br /&gt;다중 서브시스템 프로젝트, 모호한 요구사항, 병렬 계획이 필요한 팀, 후속 planning 파이프라인의 입력을 정리해야 할 때 적합합니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;언제 쓰면 안 되는지&lt;/b&gt;&lt;br /&gt;단일 기능, 작은 개선, 버그 수정처럼 이미 범위가 좁고 명확한 작업에는 과할 수 있습니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;한 줄 요약&lt;/b&gt;&lt;br /&gt;deep-project는 &amp;ldquo;AI가 코드를 쓰기 전에, 무엇을 어떻게 나눠서 계획할지 먼저 정리하는 도구&amp;rdquo;라고 보면 가장 정확합니다. (&lt;a href=&quot;https://github.com/piercelamb/deep-project&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AI</category>
      <author>행복한 수지아빠</author>
      <guid isPermaLink="true">https://javaexpert.tistory.com/1729</guid>
      <comments>https://javaexpert.tistory.com/1729#entry1729comment</comments>
      <pubDate>Mon, 13 Apr 2026 12:09:14 +0900</pubDate>
    </item>
    <item>
      <title>Voicebox: 로컬 음성 스튜디오</title>
      <link>https://javaexpert.tistory.com/1728</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 음성 합성은 더 이상 실험용 기능이 아닙니다. 팟캐스트, 오디오북, 게임 대사, 숏폼 더빙, AI 캐릭터 음성까지 이미 제작 파이프라인의 한 부분이 되었습니다. 문제는 많은 팀이 여전히 클라우드 TTS에 의존하고 있다는 점입니다. 비용은 계속 누적되고, 샘플 음성과 생성 결과가 외부로 오가며, 서비스 제약도 함께 따라옵니다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Voicebox는 이 문제를 다른 방향에서 풀려는 도구입니다. 핵심은 &amp;ldquo;좋은 음성 합성을 클라우드 API가 아니라 내 장비에서 직접 처리하자&amp;rdquo;는 접근입니다. 이 글을 끝까지 읽으면 Voicebox가 왜 등장했는지, 기존 방식과 무엇이 다른지, 실제로 어떤 구조로 돌아가며, 어떤 팀에게 유리하고 어디까지는 아직 조심해서 봐야 하는지까지 한 번에 잡을 수 있습니다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;figure id=&quot;og_1776044867535&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - jamiepine/voicebox: The open-source voice synthesis studio&quot; data-og-description=&quot;The open-source voice synthesis studio. Contribute to jamiepine/voicebox development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/jamiepine/voicebox&quot; data-og-url=&quot;https://github.com/jamiepine/voicebox&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://github.com/jamiepine/voicebox&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/jamiepine/voicebox&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - jamiepine/voicebox: The open-source voice synthesis studio&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The open-source voice synthesis studio. Contribute to jamiepine/voicebox development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;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;p data-ke-size=&quot;size16&quot;&gt;클라우드 기반 음성 서비스는 시작은 쉽습니다. 가입하고 API 키를 넣으면 바로 결과가 나오기 때문입니다. 하지만 실무로 들어가면 문제가 달라집니다. 사용량이 늘수록 비용이 예측하기 어려워지고, 샘플 음성이나 생성 오디오를 외부에 보내야 하므로 보안 검토가 길어집니다. 특히 민감한 콘텐츠를 다루는 팀은 도입 자체가 느려집니다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성능 문제도 단순히 &amp;ldquo;속도&amp;rdquo; 하나로 끝나지 않습니다. 긴 대본을 여러 조각으로 나눠야 하고, 여러 화자 음성을 섞어야 하며, 후처리까지 붙이면 파이프라인이 길어집니다. 이때 클라우드 호출이 여러 단계로 쪼개지면 재시도, 상태 관리, 결과 버전 관리가 모두 복잡해집니다. 작은 데모는 쉬워도, 제작 시스템으로 키우는 순간 유지보수 비용이 커집니다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox?utm_source=chatgpt.com&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 경험 측면에서도 비슷합니다. 모델 선택, 음성 프로필 관리, 긴 문장 처리, 오디오 효과, 배치 처리, API 연동이 따로 놀면 디버깅이 어렵습니다. 결과적으로 팀은 &amp;ldquo;음성을 만드는 일&amp;rdquo;보다 &amp;ldquo;음성 시스템을 이어 붙이는 일&amp;rdquo;에 더 많은 시간을 씁니다. 로컬 우선 도구가 주목받는 이유가 여기에 있습니다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Voicebox란 무엇인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Voicebox는 한 문장으로 정리하면, &lt;b&gt;로컬에서 실행되는 올인원 음성 합성&amp;middot;클로닝 스튜디오&lt;/b&gt;입니다. 공개 자료 기준으로 이 프로젝트는 몇 초 길이의 샘플에서 음성 프로필을 만들고, 여러 TTS 엔진을 바꿔 쓰며, 후처리와 멀티트랙 편집까지 한 흐름 안에서 처리하는 도구로 소개됩니다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비유하면, 기존 클라우드 TTS가 &amp;ldquo;음성을 요청해서 받는 서비스&amp;rdquo;라면, Voicebox는 &amp;ldquo;내 컴퓨터 안에 두는 작은 음성 제작실&amp;rdquo;에 가깝습니다. 음성 모델도, 샘플 데이터도, 생성 결과도 기본적으로 사용자 환경 안에 머무는 구조입니다. 그래서 철학 자체가 다릅니다. API 소비자가 아니라, 로컬 제작 환경의 주인이 되는 방식입니다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 방식과 가장 큰 차이는 두 가지입니다. 첫째, 특정 클라우드 사업자에 잠기지 않습니다. 둘째, 음성 생성이 단일 기능이 아니라 편집과 후처리까지 포함한 워크플로로 묶여 있습니다. 그래서 Voicebox는 단순 TTS 앱이라기보다, 음성 중심 제작 스택에 더 가깝습니다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox&quot;&gt;GitHub&lt;/a&gt;)&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;b&gt;로컬 우선 실행&lt;/b&gt;&lt;br /&gt;모델과 음성 데이터가 기본적으로 사용자 장비에 머뭅니다. 보안 검토와 데이터 통제 측면에서 의미가 큽니다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;5개 TTS 엔진 지원&lt;/b&gt;&lt;br /&gt;Qwen3-TTS, Chatterbox 계열, LuxTTS, HumeAI TADA를 상황별로 선택할 수 있습니다. 한 모델에 모든 요구를 억지로 맞추지 않아도 된다는 점이 중요합니다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;긴 문장 자동 처리&lt;/b&gt;&lt;br /&gt;문장을 자동으로 분할하고 다시 이어 붙이는 방식으로 긴 스크립트를 다룹니다. 대본이 길어질수록 수작업 편집을 줄여주는 기능입니다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;오디오 후처리 내장&lt;/b&gt;&lt;br /&gt;Spotify Pedalboard 기반 8개 효과를 적용할 수 있습니다. TTS 결과를 다른 툴로 내보내지 않고도 기본적인 음색 가공이 가능합니다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox?utm_source=chatgpt.com&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스토리 편집기와 멀티트랙 구성&lt;/b&gt;&lt;br /&gt;여러 화자의 대사, 내레이션, 팟캐스트 구성 같은 작업을 타임라인 기반으로 다룰 수 있습니다. 생성 이후 편집이 별도 공정이 아니라는 점이 실무적으로 큽니다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;API 우선 구조&lt;/b&gt;&lt;br /&gt;데스크톱 앱으로 끝나는 도구가 아니라 REST API를 함께 제공합니다. 배치 처리나 내부 서비스 연동까지 고려한 설계라는 뜻입니다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실제로 어떤 효과가 있는가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공개된 자료 기준으로 Voicebox의 효과는 &amp;ldquo;기능 하나가 뛰어나다&amp;rdquo;보다 &amp;ldquo;분산돼 있던 음성 작업을 한 구조로 묶는다&amp;rdquo;에 가깝습니다. 음성 클로닝, 생성, 후처리, 버전 관리, 편집, API 연동이 하나의 흐름에 들어오면, 팀은 도구 간 이동 비용을 줄일 수 있습니다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox?utm_source=chatgpt.com&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전과 후를 비교하면 차이가 분명합니다. 이전에는 클라우드 TTS 호출, 별도 오디오 편집, 긴 문장 분할 처리, 재생성 관리가 따로 놀 가능성이 컸습니다. 이후에는 음성 프로필 생성부터 결과 편집까지가 하나의 로컬 작업 공간으로 들어옵니다. 특히 반복 생성과 수정이 잦은 콘텐츠 제작 팀일수록 효과가 커집니다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 팀에 특히 유리한지도 분명합니다. 오디오북, 팟캐스트, 게임 대사처럼 긴 분량과 다화자 구성이 필요한 팀, 그리고 외부 전송이 민감한 사내 음성 도구를 만드는 팀에 잘 맞습니다. 반대로 음성 하나를 간헐적으로 생성하는 정도라면 로컬 모델 관리가 오히려 과할 수 있습니다. (&lt;a href=&quot;https://voicebox.sh/&quot;&gt;Voicebox&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2026년 4월 기준으로 프로젝트는 MIT 라이선스로 공개되어 있고, GitHub에서도 약 1.5만 개 이상의 star를 모으고 있습니다. 적어도 시장의 관심과 개발자 반응 측면에서는 단발성 실험 프로젝트를 넘은 상태로 볼 수 있습니다. (&lt;a href=&quot;https://github.com/nousresearch/hermes-agent&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;동작 원리 / 구조&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;입력을 받는다&lt;/b&gt;&lt;br /&gt;사용자는 텍스트를 넣고, 음성 샘플을 업로드하거나 마이크로 녹음으로 프로필을 만듭니다. 경우에 따라 시스템 오디오 캡처와 Whisper 기반 전사도 함께 사용됩니다. 이 단계의 목적은 &amp;ldquo;좋은 참조 음성&amp;rdquo;과 &amp;ldquo;생성할 텍스트&amp;rdquo;를 안정적으로 정리하는 데 있습니다. (&lt;a href=&quot;https://voicebox.sh/&quot;&gt;Voicebox&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;음성 프로필과 엔진을 결정한다&lt;/b&gt;&lt;br /&gt;Voicebox는 음성 프로필 관리와 TTS 엔진 선택을 분리합니다. 같은 음성 프로필이라도 어떤 엔진을 쓰느냐에 따라 품질, 속도, 감정 표현, 언어 지원이 달라집니다. 이 설계는 모델을 하나로 고정하지 않기 위해 필요합니다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;백엔드가 생성 작업을 실행한다&lt;/b&gt;&lt;br /&gt;구조상 프런트엔드는 React 기반 UI이고, 백엔드는 FastAPI 서버입니다. 배포 시에는 Python 서버가 바이너리로 묶이고, Tauri 앱이 이를 사이드카처럼 포함하는 2단계 빌드 구조를 사용합니다. 즉, 겉으로는 데스크톱 앱이지만 내부적으로는 API 서버를 품은 형태입니다. (&lt;a href=&quot;https://docs.voicebox.sh/developer/building&quot;&gt;Voicebox&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;긴 텍스트는 자동 분할한다&lt;/b&gt;&lt;br /&gt;긴 대본은 문장 경계 기준으로 자동 분할된 뒤, 각 조각이 독립적으로 생성되고 다시 크로스페이드로 이어집니다. 이 방식은 모델 한 번 호출로 긴 문장을 무리하게 처리하는 것보다 안정적입니다. 긴 오디오 생성 품질을 지키기 위한 설계라고 보면 됩니다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;후처리와 버전 관리를 붙인다&lt;/b&gt;&lt;br /&gt;생성된 결과에는 pitch shift, reverb, delay, compressor 같은 효과를 적용할 수 있고, 원본과 변형본의 계보도 관리합니다. 실무에서는 &amp;ldquo;좋은 결과 하나&amp;rdquo;보다 &amp;ldquo;여러 테이크를 비교하고 되돌릴 수 있는 구조&amp;rdquo;가 더 중요할 때가 많습니다. Voicebox는 이 지점을 꽤 잘 의식한 설계입니다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox?utm_source=chatgpt.com&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;타임라인에서 다화자 콘텐츠로 조립한다&lt;/b&gt;&lt;br /&gt;최종적으로는 스토리 편집기에서 여러 트랙을 조합해 대화형 콘텐츠를 만듭니다. 그래서 Voicebox는 단순 추론 엔진이 아니라, 제작 단계를 포함한 로컬 음성 워크스테이션처럼 동작합니다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치 / 사용 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서상 확인되는 범위에서 개발 환경 기준 흐름은 비교적 단순합니다. 저장소를 받은 뒤 의존성을 한 번에 세팅하고, 개발 모드로 앱과 백엔드를 함께 올리는 방식입니다. 공식 안내에는 just 기반 명령이 중심으로 정리되어 있습니다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox/blob/main/CONTRIBUTING.md?utm_source=chatgpt.com&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;git clone &amp;lt;voicebox-repository&amp;gt;
cd voicebox

just setup
just dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 모드가 아니라 백엔드를 따로 띄우는 방식도 가능합니다. 원격 GPU 서버를 붙이는 경우에는 백엔드를 별도로 실행하고, 로컬 앱은 UI만 담당하게 구성할 수 있습니다. 이 구조는 &amp;ldquo;노트북은 가볍게, 추론은 서버에서&amp;rdquo;라는 분리에 잘 맞습니다. (&lt;a href=&quot;https://docs.voicebox.sh/overview/remote-mode?utm_source=chatgpt.com&quot;&gt;Voicebox&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최소 실행 흐름은 아래처럼 이해하면 됩니다.&lt;/p&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# 1) 앱 실행
just dev

# 2) 음성 프로필 생성
#    샘플 음성을 넣거나 녹음해서 프로필 생성

# 3) 텍스트 입력 후 엔진 선택
#    Qwen3-TTS / Chatterbox / LuxTTS / TADA 등 선택

# 4) 생성 결과 확인 후 효과 적용
#    필요하면 preset 또는 개별 효과 적용

# 5) 스토리 편집기에서 여러 화자 음성 조합
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 중심으로 붙이고 싶다면 로컬 서버에 직접 요청하는 방식도 가능합니다. 공개 자료에는 /generate, /profiles, /stories, /transcribe 같은 엔드포인트가 정리돼 있습니다. 즉, UI를 쓰지 않고 내부 서비스에서 Voicebox를 음성 엔진으로 호출하는 것도 가능합니다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox/blob/main/backend/README.md?utm_source=chatgpt.com&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;scilab&quot;&gt;&lt;code&gt;curl -X POST http://localhost:17493/generate \
  -H &quot;Content-Type: application/json&quot; \
  -d '{&quot;text&quot;:&quot;안녕하세요&quot;,&quot;profile_id&quot;:&quot;my_voice&quot;,&quot;language&quot;:&quot;ko&quot;}'
&lt;/code&gt;&lt;/pre&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;여러 화자의 톤을 고정하고, 대본 수정이 자주 일어나는 팀에 잘 맞습니다. 생성과 편집이 한 도구 안에 있으므로 수정 회전이 빠릅니다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox&quot;&gt;GitHub&lt;/a&gt;)&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;긴 챕터를 자동 분할과 이어 붙이기로 처리할 수 있어 장문 생성에 유리합니다. 사람이 일일이 컷을 나누는 부담을 줄일 수 있습니다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox&quot;&gt;GitHub&lt;/a&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;캐릭터별 음성 프로필과 여러 버전의 테이크를 관리해야 할 때 효과적입니다. API가 있으므로 빌드 도구나 사내 에디터에 연결하기도 좋습니다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 숏폼 영상 더빙&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빠른 반복 생성과 기본 후처리가 필요한 경우에 잘 맞습니다. 특히 클라우드 과금이 부담되는 소규모 제작 팀에서 비용 체감이 큽니다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 에이전트 음성 인터페이스&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hermes Agent 같은 실행형 에이전트와 조합하면 역할이 분리됩니다. 에이전트가 기억&amp;middot;작업 수행을 맡고, Voicebox가 음성 입출력과 캐릭터 보이스를 맡는 식입니다. Hermes Agent 공개 설명도 장기 기억, 기술 생성, 다중 채널 인터페이스를 핵심으로 내세우고 있어 이런 결합 방향은 충분히 자연스럽습니다. (&lt;a href=&quot;https://github.com/nousresearch/hermes-agent&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&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;a href=&quot;https://voicebox.sh/&quot;&gt;Voicebox&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘째, 로컬 우선이라고 해서 준비 비용이 없는 것은 아닙니다. 모델 다운로드, GPU 환경, 드라이버, 저장 공간, 운영체제별 차이를 감당해야 합니다. 문서상 확인되는 범위에서 macOS, Windows, Linux를 지원하지만, Linux는 한동안 사전 빌드 바이너리가 제한적이었고 소스 빌드가 필요한 구간도 있었습니다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;셋째, &amp;ldquo;클라우드 완전 대체&amp;rdquo;라는 표현은 상황에 따라 과장일 수 있습니다. 로컬 장비가 충분하지 않다면 품질보다 속도가 먼저 발목을 잡을 수 있습니다. 그래서 현재 기준으로는 모든 사용자에게 무조건 우월하다기보다, &lt;b&gt;보안&amp;middot;비용&amp;middot;제어권이 중요한 팀에게 특히 유리한 대안&lt;/b&gt;으로 보는 편이 정확합니다. (&lt;a href=&quot;https://voicebox.sh/&quot;&gt;Voicebox&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;넷째, 아직 검증되지 않은 영역도 있습니다. 공개 로드맵에는 실시간 스트리밍, 음성 디자인, 플러그인 확장 같은 항목이 보이지만, 이 부분은 이미 완성된 기능이 아니라 앞으로의 방향에 가깝습니다. 그래서 현재 기준으로는 &amp;ldquo;강한 기반을 가진 로컬 음성 스튜디오&amp;rdquo;로 보는 것이 적절합니다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox?utm_source=chatgpt.com&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Voicebox의 핵심 가치는 음성 생성 품질 하나가 아닙니다. 음성 클로닝, 긴 문장 처리, 후처리, 편집, API 연동을 로컬 워크플로로 묶었다는 점에 있습니다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이 도구는 단순 체험용 TTS보다, 실제 제작 파이프라인을 줄이고 싶은 팀에게 더 잘 맞습니다. 특히 스타트업, AI 에이전트 개발자, 오디오북&amp;middot;팟캐스트 제작 팀, 게임 음성 파이프라인을 가진 팀이 가장 큰 효용을 볼 가능성이 높습니다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox&quot;&gt;GitHub&lt;/a&gt;)&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;b&gt;핵심 개념&lt;/b&gt;&lt;br /&gt;Voicebox는 로컬에서 실행되는 올인원 음성 합성&amp;middot;클로닝 스튜디오다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;차별점&lt;/b&gt;&lt;br /&gt;단순 TTS가 아니라 음성 프로필, 멀티 엔진, 긴 문장 처리, 후처리, 타임라인 편집, REST API를 한 구조로 묶는다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox?utm_source=chatgpt.com&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;언제 쓰면 좋은지&lt;/b&gt;&lt;br /&gt;비용을 줄이고 싶을 때, 음성 데이터를 외부로 보내기 어렵거나, 반복 제작과 다화자 편집이 많은 프로젝트일 때 유리하다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;언제 쓰면 안 되는지&lt;/b&gt;&lt;br /&gt;로컬 GPU 운영이 부담스럽거나, 아주 간단한 단발성 TTS만 필요한 경우에는 과한 선택일 수 있다. 또한 사칭 위험이 큰 조직에서는 강한 통제 없이 도입하면 안 된다. (&lt;a href=&quot;https://docs.voicebox.sh/overview/remote-mode?utm_source=chatgpt.com&quot;&gt;Voicebox&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;한 줄 요약&lt;/b&gt;&lt;br /&gt;Voicebox는 &amp;ldquo;클라우드 TTS 호출기&amp;rdquo;가 아니라, 로컬에서 돌아가는 음성 제작 스택에 가깝다. (&lt;a href=&quot;https://github.com/jamiepine/voicebox&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AI</category>
      <author>행복한 수지아빠</author>
      <guid isPermaLink="true">https://javaexpert.tistory.com/1728</guid>
      <comments>https://javaexpert.tistory.com/1728#entry1728comment</comments>
      <pubDate>Mon, 13 Apr 2026 10:48:10 +0900</pubDate>
    </item>
    <item>
      <title>맥 개발자가 tmux를 꼭 알아야 하는 이유</title>
      <link>https://javaexpert.tistory.com/1727</link>
      <description>&lt;h1&gt;&lt;span style=&quot;color: #333333; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; font-size: 16px; letter-spacing: 0px;&quot;&gt;터미널 하나를 &amp;ldquo;작업 공간&amp;rdquo;으로 바꾸는 가장 실용적인 방법&lt;/span&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맥으로 개발하다 보면 어느 순간 이런 장면이 반복됩니다.&lt;br /&gt;한쪽에서는 서버를 띄우고, 다른 창에서는 로그를 보고, 또 다른 탭에서는 데이터베이스에 붙고, SSH로 원격 서버도 들어가야 합니다. 그런데 맥북을 덮거나 터미널 창을 잘못 닫는 순간 흐름이 끊깁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 많은 개발자가 결국 정착하는 도구가 tmux입니다. tmux는 하나의 터미널 안에서 여러 프로그램을 실행하고, 작업을 분리했다가 다시 붙을 수 있게 해주는 &lt;b&gt;터미널 멀티플렉서&lt;/b&gt;입니다. 공식 위키도 tmux를 &amp;ldquo;하나의 터미널 안에서 여러 프로그램을 다루고, 분리(detach) 후 다시 재연결(reattach)할 수 있게 해주는 도구&amp;rdquo;로 설명합니다. (&lt;a href=&quot;https://github.com/tmux/tmux/wiki/Getting-Started?utm_source=chatgpt.com&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서는 맥 기준으로 tmux가 정확히 무엇인지, 왜 쓰는지, 어떻게 설치하고, 어떤 식으로 실전에 적용하는지까지 브런치 스타일로 차근차근 정리해보겠습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;tmux는 정확히 무엇일까&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tmux를 처음 접하면 &amp;ldquo;터미널 탭 관리 도구인가?&amp;rdquo; 정도로 생각하기 쉽습니다. 그런데 실제로는 그보다 훨씬 강력합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 세 가지입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째, &lt;b&gt;한 개의 터미널 창 안에서 여러 작업을 동시에 관리&lt;/b&gt;할 수 있습니다.&lt;br /&gt;둘째, &lt;b&gt;세션을 분리(detach)해도 작업이 계속 살아 있습니다.&lt;/b&gt;&lt;br /&gt;셋째, &lt;b&gt;나중에 같은 세션에 다시 접속해서 이어서 작업&lt;/b&gt;할 수 있습니다. (&lt;a href=&quot;https://github.com/tmux/tmux/wiki/Getting-Started?utm_source=chatgpt.com&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, tmux는 단순히 화면을 나누는 도구가 아니라, &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;/li&gt;
&lt;li&gt;백엔드 API 서버 실행&lt;/li&gt;
&lt;li&gt;로그 tail 확인&lt;/li&gt;
&lt;li&gt;PostgreSQL 접속&lt;/li&gt;
&lt;li&gt;원격 서버 SSH 접속&lt;/li&gt;
&lt;li&gt;Git 작업&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통은 여러 탭을 열어두고 작업하겠지만, tmux에서는 이것을 &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;맥에서 tmux가 특히 유용한 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맥 사용자들은 iTerm2나 Terminal 앱의 탭 기능만으로도 어느 정도 작업이 가능합니다. 그런데 탭 기반 작업에는 몇 가지 한계가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 큰 문제는 &lt;b&gt;작업의 지속성&lt;/b&gt;입니다.&lt;br /&gt;터미널 탭은 눈에 보이는 UI 단위이지만, tmux 세션은 작업 상태 자체를 하나의 논리적 공간으로 유지합니다. 그래서 네트워크가 잠시 끊기거나, SSH 연결이 재구성되거나, 터미널 UI를 닫아도 세션에 다시 붙을 수 있습니다. 이것이 원격 서버 작업에서 특히 강력합니다. (&lt;a href=&quot;https://github.com/tmux/tmux/wiki/Getting-Started?utm_source=chatgpt.com&quot;&gt;GitHub&lt;/a&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;/li&gt;
&lt;li&gt;원격 서버에서 로그 확인&lt;/li&gt;
&lt;li&gt;Docker 컨테이너 관리&lt;/li&gt;
&lt;li&gt;장시간 배치 작업 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 흐름에서는 &amp;ldquo;창을 많이 여는 것&amp;rdquo;보다 &amp;ldquo;작업 구조를 유지하는 것&amp;rdquo;이 더 중요합니다. tmux는 바로 그 부분을 해결합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;tmux를 맥에 설치하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맥에서는 보통 Homebrew로 설치합니다. Homebrew 공식 formula 페이지에서도 tmux의 설치 명령은 brew install tmux로 안내됩니다. 현재 Homebrew formula에는 tmux가 &amp;ldquo;Terminal multiplexer&amp;rdquo;로 등록되어 있습니다. (&lt;a href=&quot;https://formulae.brew.sh/formula/tmux?utm_source=chatgpt.com&quot;&gt;Homebrew Formulae&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치는 아래처럼 하면 됩니다.&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;brew install tmux
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 끝나면 버전을 확인합니다.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;tmux -V
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식 Homebrew formula 기준으로 현재 stable 버전은 3.6a입니다. 다만 실제 설치 버전은 사용 시점의 formula 업데이트 상태에 따라 달라질 수 있습니다. (&lt;a href=&quot;https://formulae.brew.sh/formula/tmux?utm_source=chatgpt.com&quot;&gt;Homebrew Formulae&lt;/a&gt;)&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;tmux의 핵심 개념: 세션, 윈도우, 패널&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tmux를 제대로 쓰려면 용어 세 개만 정확히 잡으면 됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) Session&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 큰 작업 단위입니다.&lt;br /&gt;예를 들어 frontend, backend, infra, trading-bot 같은 식으로 프로젝트별 세션을 만들 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) Window&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저의 탭과 비슷한 개념입니다.&lt;br /&gt;세션 안에 여러 윈도우를 둘 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) Pane&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 윈도우를 좌우/상하로 나눈 분할 화면입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조를 그림처럼 표현하면 이렇습니다.&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;Session: myproject
├── Window 1: editor
│   ├── Pane 1: nvim
│   └── Pane 2: npm run dev
├── Window 2: backend
│   ├── Pane 1: pnpm start
│   └── Pane 2: logs
└── Window 3: infra
    ├── Pane 1: ssh prod
    └── Pane 2: htop
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조를 이해하면 tmux는 갑자기 어렵지 않습니다.&lt;br /&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;p data-ke-size=&quot;size16&quot;&gt;tmux를 실행하는 가장 단순한 방법은 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;tmux
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 실전에서는 보통 이름을 붙여 세션을 만듭니다.&lt;/p&gt;
&lt;pre class=&quot;haxe&quot;&gt;&lt;code&gt;tmux new -s work
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 API 프로젝트용 세션을 만들고 싶다면:&lt;/p&gt;
&lt;pre class=&quot;haxe&quot;&gt;&lt;code&gt;tmux new -s api
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이 세션 안에서 작업을 시작하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 실행 중인 세션 목록 확인:&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;tmux ls
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 세션에 다시 붙기:&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;tmux attach -t api
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션 종료:&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;tmux kill-session -t api
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 흐름이 tmux의 가장 기본 뼈대입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;prefix 개념부터 이해하자&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tmux의 대부분 명령은 바로 입력하지 않고, 먼저 &lt;b&gt;prefix 키&lt;/b&gt;를 누른 뒤 실행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 prefix는:&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;Ctrl + b
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, Ctrl+b를 누르고 나서 다음 키를 입력하는 구조입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 새 윈도우를 만들고 싶으면:&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;Ctrl+b, 그 다음 c
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 조금 낯설지만 금방 익숙해집니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;가장 많이 쓰는 단축키&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 아래만 기억해도 실무에 바로 들어갈 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;세션 관련&lt;/h3&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;Ctrl+b d      현재 세션에서 detach
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;윈도우 관련&lt;/h3&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;Ctrl+b c      새 윈도우 생성
Ctrl+b n      다음 윈도우
Ctrl+b p      이전 윈도우
Ctrl+b 0~9    번호로 윈도우 이동
Ctrl+b ,      윈도우 이름 변경
Ctrl+b &amp;amp;      윈도우 종료
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;패널 관련&lt;/h3&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;Ctrl+b %      좌우 분할
Ctrl+b &quot;      상하 분할
Ctrl+b 방향키  패널 이동
Ctrl+b x      현재 패널 닫기
Ctrl+b z      현재 패널 확대/축소
Ctrl+b q      패널 번호 표시
Ctrl+b space  레이아웃 순환
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;스크롤 / 복사 모드&lt;/h3&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;Ctrl+b [      복사 모드 진입
q             복사 모드 종료
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식 위키의 Getting Started와 Recipes 문서도 이런 기본 조작과 함께 분할, 세션 재연결, 새 창/패널 생성 같은 흐름을 중심으로 설명합니다. (&lt;a href=&quot;https://github.com/tmux/tmux/wiki/Getting-Started?utm_source=chatgpt.com&quot;&gt;GitHub&lt;/a&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;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;haxe&quot;&gt;&lt;code&gt;tmux new -s myapp
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 첫 번째 윈도우에서 프론트엔드 실행&lt;/h3&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;pnpm dev
&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;Ctrl+b c&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 백엔드 실행:&lt;/p&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;pnpm --filter api dev
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 또 새 윈도우 생성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ctrl+b c&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그 보기:&lt;/p&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;tail -f logs/app.log
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 다시 이전 윈도우로 이동&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ctrl+b p&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 되면 하나의 myapp 세션 안에 프론트, 백엔드, 로그가 각각 구조적으로 정리됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업을 중간에 멈추고 싶지 않다면:&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;Ctrl+b d
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 detach 하면 tmux 바깥으로 빠져나오지만, 내부 작업은 계속 살아 있습니다.&lt;br /&gt;나중에 다시:&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;tmux attach -t myapp
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하면 원래 상태 그대로 돌아옵니다. 이것이 tmux를 쓰는 가장 큰 이유입니다. (&lt;a href=&quot;https://github.com/tmux/tmux/wiki/Getting-Started?utm_source=chatgpt.com&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;이번에는 패널 분할을 써보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;tmux new -s server
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왼쪽 패널에서 서버 실행:&lt;/p&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;npm run start
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 화면을 좌우로 나눕니다.&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;Ctrl+b %
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오른쪽 패널에서 로그 확인:&lt;/p&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;tail -f /var/log/app.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패널 이동은:&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;Ctrl+b + 방향키
&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;/li&gt;
&lt;li&gt;다른 쪽에서 curl 요청 테스트&lt;/li&gt;
&lt;li&gt;또는 로그 모니터링&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왼쪽 패널&lt;/p&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;npm run start
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오른쪽 패널&lt;/p&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;watch -n 1 &quot;curl -I http://localhost:3000&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;h3 data-ke-size=&quot;size23&quot;&gt;SSH 원격 서버 작업을 끊김 없이 이어가기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tmux가 진짜 빛나는 순간은 원격 서버 작업입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 맥에서 서버에 SSH 접속했다고 해보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;ssh ubuntu@my-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 원격 서버 안에서 tmux 세션을 시작합니다.&lt;/p&gt;
&lt;pre class=&quot;haxe&quot;&gt;&lt;code&gt;tmux new -s deploy
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 다음 배포 작업이나 로그 모니터링을 실행합니다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;git pull
pnpm install
pnpm build
pm2 restart app
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹은:&lt;/p&gt;
&lt;pre class=&quot;fortran&quot;&gt;&lt;code&gt;tail -f /var/log/nginx/access.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 상태에서 로컬 인터넷이 흔들리거나 맥북을 닫아도, 다시 SSH로 접속한 뒤 세션에 붙으면 됩니다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;ssh ubuntu@my-server
tmux attach -t deploy
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 흐름 때문에 서버 관리자는 tmux를 거의 필수 도구처럼 씁니다. 작업이 &amp;ldquo;터미널 창&amp;rdquo;이 아니라 &amp;ldquo;세션&amp;rdquo;에 귀속되기 때문입니다. (&lt;a href=&quot;https://github.com/tmux/tmux/wiki/Getting-Started?utm_source=chatgpt.com&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;tmux를 더 편하게 만드는 설정 파일&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tmux 설정은 보통 아래 파일에서 관리합니다.&lt;/p&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;~/.tmux.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에 자주 쓰는 옵션을 넣어두면 훨씬 편해집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 먼저 추천할 만한 설정은 아래 정도입니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;set -g mouse on
set -g history-limit 100000

unbind C-b
set -g prefix C-a
bind C-a send-prefix

bind '&quot;' split-window -c &quot;#{pane_current_path}&quot;
bind % split-window -h -c &quot;#{pane_current_path}&quot;
bind c new-window -c &quot;#{pane_current_path}&quot;
&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;mouse on&lt;br /&gt;마우스로 패널 선택, 스크롤, 리사이즈가 편해집니다.&lt;/li&gt;
&lt;li&gt;history-limit 100000&lt;br /&gt;스크롤백 버퍼를 크게 잡아 로그 보기 좋습니다.&lt;/li&gt;
&lt;li&gt;prefix를 Ctrl+b에서 Ctrl+a로 변경&lt;br /&gt;GNU Screen에 익숙한 사용자들이 많이 선호합니다.&lt;/li&gt;
&lt;li&gt;새 패널/윈도우를 &lt;b&gt;현재 작업 디렉터리 기준&lt;/b&gt;으로 열기&lt;br /&gt;이것이 실전에서 정말 중요합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 마지막 세 줄은 공식 tmux Wiki Recipes에도 소개되는 패턴입니다. 새 패널과 새 윈도우가 현재 패널의 작업 경로를 이어받게 만들어 주기 때문에, 프로젝트 작업 흐름이 훨씬 자연스러워집니다. (&lt;a href=&quot;https://github.com/tmux/tmux/wiki/Recipes?utm_source=chatgpt.com&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정 반영:&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;tmux source-file ~/.tmux.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;맥 사용자에게 추천하는 .tmux.conf 예제&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;# 마우스 사용
set -g mouse on

# 스크롤백 크게
set -g history-limit 100000

# prefix 변경
unbind C-b
set -g prefix C-a
bind C-a send-prefix

# 인덱스를 1부터 시작
set -g base-index 1
setw -g pane-base-index 1

# 현재 디렉터리 유지하며 새 창/분할 생성
bind c new-window -c &quot;#{pane_current_path}&quot;
bind '&quot;' split-window -v -c &quot;#{pane_current_path}&quot;
bind % split-window -h -c &quot;#{pane_current_path}&quot;

# 설정 리로드
bind r source-file ~/.tmux.conf \; display-message &quot;tmux config reloaded&quot;

# 더 직관적인 패널 이동
bind -n M-Left select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up select-pane -U
bind -n M-Down select-pane -D
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 base-index 1은 윈도우 번호를 0이 아니라 1부터 시작하게 해서 직관성을 높입니다.&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) tmux를 종료하면 작업이 다 죽는다고 생각하는 경우&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇지 않습니다. detach는 종료가 아니라 &lt;b&gt;세션에서 빠져나오는 것&lt;/b&gt;입니다.&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;Ctrl+b d
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 세션을 끄는 게 아니라 &amp;ldquo;잠시 나가는 것&amp;rdquo;입니다.&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;현재 패널에서 실행 중인 쉘을 exit 하면 그 패널만 닫힙니다.&lt;br /&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;기본 터미널 스크롤과 tmux의 복사 모드가 다르게 동작해서 그렇습니다.&lt;br /&gt;이럴 때는 마우스 활성화 설정이나 복사 모드 사용법을 익히면 해결됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;tmux를 실제 개발 workflow에 녹이는 방법&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;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;frontend 세션&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Window 1: editor&lt;/li&gt;
&lt;li&gt;Window 2: dev server&lt;/li&gt;
&lt;li&gt;Window 3: test runner&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;backend 세션&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Window 1: editor&lt;/li&gt;
&lt;li&gt;Window 2: API server&lt;/li&gt;
&lt;li&gt;Window 3: worker&lt;/li&gt;
&lt;li&gt;Window 4: logs&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;infra 세션&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Window 1: ssh staging&lt;/li&gt;
&lt;li&gt;Window 2: ssh prod&lt;/li&gt;
&lt;li&gt;Window 3: docker / k8s commands&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 나누면 머릿속도 정리됩니다.&lt;br /&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;p data-ke-size=&quot;size16&quot;&gt;tmux는 Terminal.app에서도 잘 동작하고, iTerm2와 함께 써도 좋습니다.&lt;br /&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;tmux: 실제 작업 공간&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 탭을 많이 열어 관리하기보다 &lt;b&gt;iTerm2 탭 하나 안에 tmux 세션을 붙여서 사용하는 방식&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;iTerm2 탭 1 &amp;rarr; 로컬 개발용 tmux&lt;/li&gt;
&lt;li&gt;iTerm2 탭 2 &amp;rarr; 원격 서버용 SSH 후 tmux&lt;/li&gt;
&lt;li&gt;iTerm2 탭 3 &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;tmux와 함께 자주 언급되는 도구들&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tmux 자체만으로도 충분하지만, 세션 자동 구성을 도와주는 도구들도 있습니다. Homebrew에는 tmuxinator, tmuxp, tmux-sessionizer, tmux-xpanes 같은 관련 도구가 등록되어 있습니다. 각각 복잡한 세션 구성을 템플릿화하거나 여러 패널을 빠르게 여는 데 쓰입니다. (&lt;a href=&quot;https://formulae.brew.sh/formula/tmux-xpanes?utm_source=chatgpt.com&quot;&gt;Homebrew Formulae&lt;/a&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;/li&gt;
&lt;li&gt;백엔드&lt;/li&gt;
&lt;li&gt;로그&lt;/li&gt;
&lt;li&gt;DB 셸&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 레이아웃을 매번 손으로 만들지 않고 자동으로 띄울 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 처음에는 tmux 본체만 익히는 것을 추천합니다.&lt;br /&gt;기본기가 잡히지 않은 상태에서 세션 매니저부터 쓰면 오히려 구조를 이해하기 어려워질 수 있습니다.&lt;/p&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;아래 실습만 해도 tmux 감이 옵니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1단계. 새 세션 생성&lt;/h3&gt;
&lt;pre class=&quot;haxe&quot;&gt;&lt;code&gt;tmux new -s demo
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2단계. 첫 번째 패널에서 명령 실행&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;python3 -m http.server 8000
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3단계. 화면 분할&lt;/h3&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;Ctrl+b %
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4단계. 오른쪽 패널에서 테스트&lt;/h3&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;curl http://localhost:8000
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5단계. 새 윈도우 생성&lt;/h3&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;Ctrl+b c
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6단계. 새 윈도우에서 파일 목록 보기&lt;/h3&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;ls -al
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7단계. 세션 분리&lt;/h3&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;Ctrl+b d
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8단계. 다시 접속&lt;/h3&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;tmux attach -t demo
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 한 번만 해보면 tmux가 &amp;ldquo;어려운 고급 툴&amp;rdquo;이 아니라, 단지 &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;결국 tmux는 누구에게 필요한가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tmux는 모든 사람에게 필수는 아닙니다.&lt;br /&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;SSH 작업이 많다&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;p data-ke-size=&quot;size16&quot;&gt;특히 맥에서 개발하는 사람에게 tmux는 &amp;ldquo;화면 분할 도구&amp;rdquo;가 아니라, &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;tmux를 처음 보면 낯설고, 단축키도 조금 투박해 보입니다.&lt;br /&gt;그런데 며칠만 써보면 알게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 터미널이 부족한 게 아니라,&lt;br /&gt;&lt;b&gt;작업 구조가 없었던 것&lt;/b&gt;이라는 사실을요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맥에서 tmux를 익히면 얻는 가장 큰 이점은 화려한 기능이 아닙니다.&lt;br /&gt;작업이 덜 끊기고, 덜 잃어버리고, 덜 헤매게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 그 차이는 하루 작업량보다,&lt;br /&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;pre class=&quot;sql&quot;&gt;&lt;code&gt;# 설치
brew install tmux

# 버전 확인
tmux -V

# 새 세션 생성
tmux new -s work

# 세션 목록
tmux ls

# 세션 재접속
tmux attach -t work

# 세션 종료
tmux kill-session -t work

# 설정 다시 불러오기
tmux source-file ~/.tmux.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1800&quot; data-origin-height=&quot;2400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCdInL/dJMcaaSthg9/IcyKXSwzoEdfZI03Rb5EXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCdInL/dJMcaaSthg9/IcyKXSwzoEdfZI03Rb5EXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCdInL/dJMcaaSthg9/IcyKXSwzoEdfZI03Rb5EXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCdInL%2FdJMcaaSthg9%2FIcyKXSwzoEdfZI03Rb5EXK%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;1800&quot; height=&quot;2400&quot; data-origin-width=&quot;1800&quot; data-origin-height=&quot;2400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>행복한 수지아빠</author>
      <guid isPermaLink="true">https://javaexpert.tistory.com/1727</guid>
      <comments>https://javaexpert.tistory.com/1727#entry1727comment</comments>
      <pubDate>Mon, 13 Apr 2026 10:44:32 +0900</pubDate>
    </item>
    <item>
      <title>VoxCPM2 정리: 토크나이저 없이 다국어 TTS와 음성 클로닝을 만드는 오픈소스 모델</title>
      <link>https://javaexpert.tistory.com/1726</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;최근 TTS(Text-to-Speech)는 많이 발전했지만, 실무에서는 여전히 몇 가지 문제가 남아 있습니다. 음성은 자연스러워야 하고, 화자 특성은 유지해야 하고, 여러 언어를 지원해야 하며, 가능하면 실시간에 가깝게 동작해야 합니다. VoxCPM2는 이 요구를 &lt;b&gt;하나의 오픈소스 모델 계열&lt;/b&gt; 안에서 풀어보려는 시도입니다. GitHub README와 공식 문서에 따르면, 이 모델은 &lt;b&gt;tokenizer-free TTS&lt;/b&gt;, &lt;b&gt;30개 언어 지원&lt;/b&gt;, &lt;b&gt;보이스 디자인&lt;/b&gt;, &lt;b&gt;제어 가능한 음성 클로닝&lt;/b&gt;, &lt;b&gt;48kHz 출력&lt;/b&gt;을 핵심으로 내세웁니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;figure id=&quot;og_1776042680758&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - OpenBMB/VoxCPM: VoxCPM2: Tokenizer-Free TTS for Multilingual Speech Generation, Creative Voice Design, and True-to-Life&quot; data-og-description=&quot;VoxCPM2: Tokenizer-Free TTS for Multilingual Speech Generation, Creative Voice Design, and True-to-Life Cloning - OpenBMB/VoxCPM&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/OpenBMB/VoxCPM&quot; data-og-url=&quot;https://github.com/OpenBMB/VoxCPM&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/sHZE7/dJMb9gxmFhN/IoJD0fnorn2wOTlpj75x4k/img.png?width=1288&amp;amp;height=480&amp;amp;face=0_0_1288_480&quot;&gt;&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/sHZE7/dJMb9gxmFhN/IoJD0fnorn2wOTlpj75x4k/img.png?width=1288&amp;amp;height=480&amp;amp;face=0_0_1288_480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - OpenBMB/VoxCPM: VoxCPM2: Tokenizer-Free TTS for Multilingual Speech Generation, Creative Voice Design, and True-to-Life&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;VoxCPM2: Tokenizer-Free TTS for Multilingual Speech Generation, Creative Voice Design, and True-to-Life Cloning - OpenBMB/VoxCPM&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 이런 분들에게 특히 도움이 됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TTS 모델을 처음 구조적으로 이해해보고 싶은 개발자&lt;/li&gt;
&lt;li&gt;단순 합성보다 &lt;b&gt;음성 복제와 스타일 제어&lt;/b&gt;까지 보고 싶은 사람&lt;/li&gt;
&lt;li&gt;실서비스에 넣을 수 있는 &lt;b&gt;오픈소스 TTS 스택&lt;/b&gt;을 찾는 엔지니어&lt;/li&gt;
&lt;li&gt;&amp;ldquo;왜 토크나이저를 없앴다는 말이 중요한가?&amp;rdquo;가 궁금한 사람&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;왜 이 문제가 중요한가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 TTS 파이프라인은 겉보기보다 복잡합니다. 텍스트를 음성으로 바꾸는 과정에서, 보통 중간 표현을 어떻게 다루느냐가 품질과 제어 가능성을 크게 좌우합니다. VoxCPM 계열이 해결하려는 문제는 바로 이 지점입니다. 기존 방식은 안정성과 표현력 사이에서 자주 트레이드오프를 만듭니다. 공개된 기술 보고서에서도, &lt;b&gt;이산 토큰 기반 접근은 안정적이지만 표현력이 떨어질 수 있고&lt;/b&gt;, 반대로 &lt;b&gt;연속 표현 기반 접근은 음향 정보를 잘 보존하지만 오류 누적과 얽힘 문제가 생길 수 있다&lt;/b&gt;고 설명합니다. (&lt;a href=&quot;https://arxiv.org/abs/2509.24650?utm_source=chatgpt.com&quot;&gt;arXiv&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서는 이런 불편으로 이어집니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;자연스러움은 좋은데 화자 유지가 약한 경우&lt;/b&gt;&lt;br /&gt;데모에서는 괜찮아 보여도, 실제 문장을 길게 읽히면 목소리의 일관성이 흔들릴 수 있습니다. 이는 클로닝 품질과 직결됩니다. (&lt;a href=&quot;https://arxiv.org/abs/2509.24650?utm_source=chatgpt.com&quot;&gt;arXiv&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;다국어 지원이 있어도 언어별 설정이 번거로운 경우&lt;/b&gt;&lt;br /&gt;언어 태그를 따로 넣거나, 언어별 모델을 나눠 운영해야 하는 경우가 있습니다. VoxCPM2는 README 기준으로 30개 언어 입력을 별도 언어 태그 없이 직접 합성하는 방향을 제시합니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스타일 제어와 화자 복제가 분리되어 있는 경우&lt;/b&gt;&lt;br /&gt;&amp;ldquo;이 사람 목소리인데 좀 더 밝게 말해줘&amp;rdquo; 같은 요구는 생각보다 어렵습니다. VoxCPM2는 화자 정보와 말하는 방식 정보를 분리해서 다루려는 구조를 강조합니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;출력 품질을 높이려면 후처리 체인이 길어지는 경우&lt;/b&gt;&lt;br /&gt;업샘플러나 추가 후처리 모델이 필요한 경우 운영이 복잡해집니다. VoxCPM2는 AudioVAE V2 기반으로 16kHz 입력 참조를 받아 &lt;b&gt;직접 48kHz 출력&lt;/b&gt;을 내는 구조를 설명합니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;실시간에 가까운 응답이 필요한데 추론 비용이 부담되는 경우&lt;/b&gt;&lt;br /&gt;README 기준으로 RTX 4090에서 기본 PyTorch 구현은 &lt;b&gt;RTF 약 0.3&lt;/b&gt;, Nano-vLLM 기반 가속 시 &lt;b&gt;약 0.13&lt;/b&gt;까지 내려간다고 안내합니다. 실시간 스트리밍이나 동시 요청 처리 관점에서 중요한 수치입니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;VoxCPM이란 무엇인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;VoxCPM은 외부 음성 토크나이저에 의존하지 않고, 연속적인 음성 표현을 직접 생성하는 tokenizer-free TTS 시스템&lt;/b&gt;입니다. 최신 버전인 VoxCPM2는 이 구조를 기반으로 다국어 합성, 음성 디자인, 음성 클로닝, 고품질 출력까지 확장한 모델입니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말하면, 기존의 많은 TTS 시스템은 음성을 먼저 잘게 쪼갠 &amp;ldquo;토큰&amp;rdquo; 같은 형태로 바꾼 뒤 그 토큰을 예측하는 방식에 가깝습니다. VoxCPM은 이 과정을 우회하고, &lt;b&gt;AudioVAE 잠재 공간(latent space)&lt;/b&gt; 안에서 음성을 더 직접적으로 다룹니다. 이 덕분에 표현력을 유지하면서도, 구조적으로 의미 정보와 음향 정보를 나눠 처리하려고 합니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 방식과의 차이를 한 줄로 요약하면 이렇습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기존: &lt;b&gt;음성 토큰 중심의 다단계 파이프라인&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;VoxCPM2: &lt;b&gt;토크나이저 없이 잠재 공간에서 end-to-end로 음성 생성&lt;/b&gt; (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&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;30개 언어 지원&lt;/b&gt;&lt;br /&gt;영어, 한국어, 일본어, 프랑스어 등 30개 언어를 지원합니다. README 기준으로 별도 언어 태그 없이 입력 텍스트만으로 합성하는 흐름을 제시합니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Voice Design&lt;/b&gt;&lt;br /&gt;참조 음성 없이도 자연어 설명만으로 새로운 목소리를 설계할 수 있습니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Controllable Voice Cloning&lt;/b&gt;&lt;br /&gt;짧은 참조 음성으로 화자 음색을 복제하고, 동시에 감정&amp;middot;속도&amp;middot;스타일까지 제어할 수 있습니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Ultimate Cloning&lt;/b&gt;&lt;br /&gt;참조 음성과 그 전사문까지 함께 주면, 더 세밀한 발화 특성을 이어받는 continuation 기반 클로닝을 지원합니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;48kHz 출력&lt;/b&gt;&lt;br /&gt;AudioVAE V2의 비대칭 인코드/디코드 구조를 통해 고품질 오디오 출력을 제공합니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;오픈소스와 상업 사용 가능&lt;/b&gt;&lt;br /&gt;코드와 가중치는 Apache-2.0 라이선스로 공개되어 있습니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실제로 어떤 효과가 있는가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공개 자료 기준으로 VoxCPM2는 단순히 &amp;ldquo;새 기능이 추가된 버전&amp;rdquo;이 아니라, &lt;b&gt;용량&amp;middot;언어 범위&amp;middot;출력 품질&amp;middot;제어성&lt;/b&gt;이 함께 확장된 버전입니다. 공식 문서에서는 2B 파라미터, 2.36M 시간 규모의 다국어 데이터, 30개 언어, 48kHz 출력, 스타일 제어를 핵심 변화로 설명합니다. (&lt;a href=&quot;https://voxcpm.readthedocs.io/en/latest/models/voxcpm2.html&quot;&gt;voxcpm.readthedocs.io&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전/후 차이를 README 기준으로 정리하면 다음과 같습니다.&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;VoxCPM2 vs VoxCPM1.5&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파라미터: 2B vs 0.6B&lt;/li&gt;
&lt;li&gt;샘플레이트: 48kHz vs 44.1kHz&lt;/li&gt;
&lt;li&gt;언어 수: 30 vs 2&lt;/li&gt;
&lt;li&gt;Voice Design: 지원 vs 미지원&lt;/li&gt;
&lt;li&gt;Controllable Voice Cloning: 지원 vs 미지원&lt;/li&gt;
&lt;li&gt;VRAM: 약 8GB vs 약 6GB&lt;/li&gt;
&lt;li&gt;RTF(RTX 4090): 약 0.30 vs 약 0.15 (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 점은, 성능이 무조건 &amp;ldquo;더 빠르다&amp;rdquo;가 아니라는 점입니다. 최신 버전은 더 큰 모델이고 기능도 많아서 기본 추론 속도만 보면 1.5보다 느릴 수 있습니다. 대신 &lt;b&gt;표현력, 언어 확장, 제어 가능성&lt;/b&gt;이 커졌고, 가속 엔진인 Nano-vLLM을 쓰면 RTF를 낮춰 실서비스용 처리량을 노릴 수 있습니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;벤치마크도 공개되어 있습니다. README는 VoxCPM2가 공개 zero-shot 및 controllable TTS 벤치마크에서 &lt;b&gt;state-of-the-art 혹은 이에 준하는 성능&lt;/b&gt;을 보인다고 설명합니다. 다만 이 부분은 공개된 평가 셋과 설정 기준이므로, 실제 서비스 품질은 데이터 도메인과 언어, 사용 문장 길이에 따라 달라질 수 있습니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;동작 원리 / 구조&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VoxCPM2의 핵심은 &lt;b&gt;4단계 파이프라인&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;LocEnc (Local Encoder)&lt;/b&gt;&lt;br /&gt;입력 음성을 지역적인 오디오 특징으로 인코딩합니다. 음성의 세밀한 지역 정보가 이후 단계의 기반이 됩니다. 공식 문서상 VoxCPM2는 이 4단계 구조를 유지하되, 정보 전달 경로를 재설계했다고 설명합니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;TSLM (Text-Semantic Language Model)&lt;/b&gt;&lt;br /&gt;텍스트를 바탕으로 의미와 운율에 가까운 계획을 만듭니다. 원 논문 설명에 따르면, 이 단계는 의미적으로 안정적인 패턴에 집중하도록 설계되어 있습니다. (&lt;a href=&quot;https://arxiv.org/abs/2509.24650?utm_source=chatgpt.com&quot;&gt;arXiv&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;RALM (Residual Acoustic Language Model)&lt;/b&gt;&lt;br /&gt;TSLM이 만든 큰 틀 위에, 더 미세한 음향 디테일과 화자 특성을 보완합니다. 논문 표현을 빌리면, TSLM이 semantic-prosodic plan을 만들고 RALM이 fine-grained acoustic detail을 복원하는 식입니다. (&lt;a href=&quot;https://arxiv.org/abs/2509.24650?utm_source=chatgpt.com&quot;&gt;arXiv&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LocDiT (Local DiT / CFM)&lt;/b&gt;&lt;br /&gt;최종적으로 고품질 음성 잠재 표현을 생성하는 diffusion 기반 디코더 역할을 합니다. README와 문서는 이 흐름이 AudioVAE V2의 latent space 안에서 동작한다고 설명합니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VoxCPM2에서 특히 눈에 띄는 구조 개선은 세 가지입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) Residual LM Fusion 변경&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 1.x 계열은 base LM 출력과 로컬 오디오 특징을 &lt;b&gt;단순 덧셈&lt;/b&gt;으로 합쳤습니다. VoxCPM2는 이를 &lt;b&gt;concat 후 projection&lt;/b&gt; 방식으로 바꿨습니다. 문서 설명대로라면, 이렇게 하면 의미 정보와 음향 정보를 더 유연하게 결합할 수 있습니다. (&lt;a href=&quot;https://voxcpm.readthedocs.io/en/latest/models/voxcpm2.html&quot;&gt;voxcpm.readthedocs.io&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) DiT Conditioning 강화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 버전은 conditioning 정보를 하나의 토큰처럼 다루는 성격이 강했지만, VoxCPM2는 &lt;b&gt;multi-token prefix&lt;/b&gt; 방식으로 바꿨습니다. 덕분에 diffusion 쪽 attention이 semantic-level 정보와 acoustic-level 정보를 더 독립적으로 볼 수 있게 설계됐습니다. (&lt;a href=&quot;https://voxcpm.readthedocs.io/en/latest/models/voxcpm2.html&quot;&gt;voxcpm.readthedocs.io&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) Isolated Reference Audio Channel&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분이 실무적으로 꽤 중요합니다. VoxCPM 1.x는 사실상 prompt continuation 기반의 클로닝 중심이었다면, VoxCPM2는 &lt;b&gt;참조 음성을 별도 채널로 분리&lt;/b&gt;해 다룹니다. 그래서 다음 네 가지 모드를 더 자연스럽게 다룰 수 있습니다. (&lt;a href=&quot;https://voxcpm.readthedocs.io/en/latest/models/voxcpm2.html&quot;&gt;voxcpm.readthedocs.io&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;텍스트만으로 zero-shot 생성&lt;/li&gt;
&lt;li&gt;prompt audio 기반 continuation&lt;/li&gt;
&lt;li&gt;reference-only voice cloning&lt;/li&gt;
&lt;li&gt;reference audio + prompt audio를 함께 쓰는 결합 모드&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &amp;ldquo;누가 말하는가&amp;rdquo;와 &amp;ldquo;어떻게 이어 말하는가&amp;rdquo;를 구조적으로 분리하려는 방향입니다. 이게 곧 &lt;b&gt;보이스 디자인&lt;/b&gt;과 &lt;b&gt;제어형 클로닝&lt;/b&gt;이 가능한 이유라고 볼 수 있습니다. 이 해석은 공식 문서의 구조 설명을 바탕으로 한 요약입니다. (&lt;a href=&quot;https://voxcpm.readthedocs.io/en/latest/models/voxcpm2.html&quot;&gt;voxcpm.readthedocs.io&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치 / 사용 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 빠른 시작은 pip install voxcpm 입니다. README 기준 요구사항은 &lt;b&gt;Python 3.10 이상 3.13 미만&lt;/b&gt;, &lt;b&gt;PyTorch 2.5.0 이상&lt;/b&gt;, &lt;b&gt;CUDA 12.0 이상&lt;/b&gt;입니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;설치&lt;/h3&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;pip install voxcpm
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Python API로 기본 TTS&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;from voxcpm import VoxCPM
import soundfile as sf

model = VoxCPM.from_pretrained(
    &quot;openbmb/VoxCPM2&quot;,
    load_denoiser=False,
)

wav = model.generate(
    text=&quot;VoxCPM2는 다국어 음성 합성과 음성 클로닝을 지원하는 TTS 모델입니다.&quot;,
    cfg_value=2.0,
    inference_timesteps=10,
)

sf.write(&quot;demo.wav&quot;, wav, model.tts_model.sample_rate)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 예시는 README의 기본 사용 예시를 한국어 문장으로 바꾼 형태입니다. 공식 API 흐름 자체는 동일합니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Voice Design&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조 음성 없이 자연어 설명만으로 목소리를 만들 수 있습니다. 설명은 보통 텍스트 앞의 괄호 안에 넣습니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;wav = model.generate(
    text=&quot;(차분하고 부드러운 30대 여성 목소리)안녕하세요. VoxCPM2 사용 예시입니다.&quot;,
    cfg_value=2.0,
    inference_timesteps=10,
)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Voice Cloning&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;wav = model.generate(
    text=&quot;이 문장은 참조 음성을 바탕으로 생성된 클론 음성입니다.&quot;,
    reference_wav_path=&quot;path/to/voice.wav&quot;,
)
&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;wav = model.generate(
    text=&quot;(조금 더 밝고 경쾌한 톤)같은 화자의 목소리지만 말하는 느낌은 다르게 조절할 수 있습니다.&quot;,
    reference_wav_path=&quot;path/to/voice.wav&quot;,
    cfg_value=2.0,
    inference_timesteps=10,
)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Ultimate Cloning&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조 음성과 전사문을 함께 사용합니다. 더 높은 유사도를 노릴 때 쓰는 방식입니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;wav = model.generate(
    text=&quot;이 문장은 더욱 세밀한 화자 특성을 이어받아 생성됩니다.&quot;,
    prompt_wav_path=&quot;path/to/voice.wav&quot;,
    prompt_text=&quot;참조 음성의 실제 전사문&quot;,
    reference_wav_path=&quot;path/to/voice.wav&quot;,
)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;CLI 사용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식 CLI도 제공합니다. 빠른 테스트에 유용합니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# 보이스 디자인
voxcpm design \
  --text &quot;VoxCPM2는 스튜디오급 다국어 음성 합성을 지원합니다.&quot; \
  --output out.wav

# 스타일 제어
voxcpm design \
  --text &quot;VoxCPM2는 스튜디오급 다국어 음성 합성을 지원합니다.&quot; \
  --control &quot;Young female voice, warm and gentle, slightly smiling&quot; \
  --output out.wav

# 참조 음성 기반 클로닝
voxcpm clone \
  --text &quot;이 문장은 보이스 클로닝 데모입니다.&quot; \
  --reference-audio path/to/voice.wav \
  --output out.wav

# 배치 처리
voxcpm batch --input examples/input.txt --output-dir outs
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;웹 데모&lt;/h3&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;python app.py --port 8808
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;README 기준으로 실행 후 브라우저에서 로컬 포트를 열어 테스트할 수 있습니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&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;Nano-vLLM 기반 추론 엔진도 별도 제공됩니다. 동시 요청 처리나 FastAPI 서버 구성이 필요한 경우 이 경로가 더 적합합니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;pip install nano-vllm-voxcpm
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 쓰는 예시 / 활용 시나리오&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) 한국어&amp;middot;영어&amp;middot;일본어를 함께 지원하는 글로벌 서비스&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 모델 계열로 여러 언어를 처리하고 싶을 때 유용합니다. README와 문서 기준으로 한국어를 포함한 30개 언어를 지원합니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&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;성우 녹음 전에, &amp;ldquo;차분한 중년 남성&amp;rdquo;, &amp;ldquo;밝고 빠른 20대 여성&amp;rdquo; 같은 식으로 보이스 디자인을 먼저 시도해볼 수 있습니다. 참조 음성 없이 시작할 수 있다는 점이 장점입니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&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;짧은 레퍼런스 음성으로 특정 화자 톤을 유지하면서, 문장 내용만 바꿔 대량 생성할 수 있습니다. 필요하면 말투나 감정도 텍스트 태그로 조절할 수 있습니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) 오디오북&amp;middot;내레이션 실험&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문맥에 맞는 prosody를 자동 추론하는 방향을 내세우기 때문에, 평면적인 낭독보다 자연스러운 억양을 기대할 수 있습니다. 다만 실제 효과는 텍스트 길이와 언어, 콘텐츠 유형에 따라 확인이 필요합니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5) 특정 도메인/화자용 파인튜닝&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식 문서와 README에 따르면 SFT와 LoRA 파인튜닝을 모두 지원하며, &lt;b&gt;5~10분 정도의 오디오&lt;/b&gt;로도 특정 화자&amp;middot;언어&amp;middot;도메인 적응이 가능하다고 안내합니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;# LoRA 파인튜닝
python scripts/train_voxcpm_finetune.py \
    --config_path conf/voxcpm_v2/voxcpm_finetune_lora.yaml

# Full fine-tuning
python scripts/train_voxcpm_finetune.py \
    --config_path conf/voxcpm_v2/voxcpm_finetune_all.yaml
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;한계 / 주의할 점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 점만 보면 안 됩니다. 공식 README와 문서가 직접 밝히는 한계도 분명합니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) 오용 위험이 큽니다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;음성 클로닝이 매우 사실적일 수 있기 때문에, 사칭&amp;middot;사기&amp;middot;허위정보 생성에 쓰면 안 된다고 저장소가 명시합니다. AI 생성 음성은 명확히 표시하라고 권장합니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&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;Voice Design과 Controllable Voice Cloning은 실행마다 결과가 조금 달라질 수 있고, 저장소는 원하는 결과를 위해 &lt;b&gt;1~3회 재생성&lt;/b&gt;을 권장합니다. 즉, &amp;ldquo;지시문 하나로 항상 완전히 같은 목소리&amp;rdquo;를 기대하면 안 됩니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&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;공식 지원은 30개 언어입니다. 그 밖의 언어는 직접 테스트하거나 파인튜닝이 필요할 수 있습니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) 최신 버전이 항상 가장 가벼운 선택은 아닙니다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VoxCPM2는 기능이 많고 2B 모델이라, 리소스와 속도 면에서는 더 작은 모델이 나을 수 있습니다. README 기준 VRAM은 약 8GB 수준입니다. 개발 환경과 운영 예산에 따라 0.5B나 1.5 계열이 더 실용적일 수 있습니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5) 벤치마크와 실서비스 품질은 다를 수 있습니다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공개 벤치마크에서 좋은 결과를 보였더라도, 실제 서비스에서는 입력 길이, 텍스트 스타일, 잡음 있는 참조 음성, 특정 언어 데이터 편중 같은 요소가 큰 영향을 줍니다. README도 프로덕션 배포 전 &lt;b&gt;충분한 테스트와 안전성 평가&lt;/b&gt;를 권장합니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VoxCPM2의 핵심은 단순히 &amp;ldquo;오픈소스 TTS 하나 더 나왔다&amp;rdquo;가 아닙니다.&lt;br /&gt;이 프로젝트는 &lt;b&gt;토크나이저 없는 TTS 구조&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;/b&gt;을 한 흐름으로 묶으려는 시도라는 점에서 의미가 있습니다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무 관점에서 보면, VoxCPM2는 특히 이런 사람에게 유용합니다.&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;다국어 TTS + 클로닝 + 스타일 제어&lt;/b&gt;를 함께 다루고 싶은 팀&lt;/li&gt;
&lt;li&gt;오픈소스 기반으로 빠르게 실험하고, 필요하면 &lt;b&gt;LoRA 파인튜닝&lt;/b&gt;까지 확장하고 싶은 개발자&lt;/li&gt;
&lt;li&gt;단순 음성 합성보다 &lt;b&gt;화자 유지와 표현력&lt;/b&gt;이 중요한 제품을 만드는 엔지니어 (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&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;VoxCPM2는 &lt;b&gt;tokenizer-free TTS&lt;/b&gt; 구조를 채택한 OpenBMB의 최신 오픈소스 모델이다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;2B 파라미터, 2.36M 시간 규모 데이터, 30개 언어, 48kHz 출력, Voice Design, Controllable Voice Cloning이 핵심 변화다. (&lt;a href=&quot;https://voxcpm.readthedocs.io/en/latest/models/voxcpm2.html&quot;&gt;voxcpm.readthedocs.io&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;구조적으로는 &lt;b&gt;LocEnc &amp;rarr; TSLM &amp;rarr; RALM &amp;rarr; LocDiT&lt;/b&gt;의 4단계 파이프라인을 사용한다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Python API, CLI, Web Demo, Nano-vLLM 배포 경로까지 제공해 실험부터 서비스화까지 이어가기 좋다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;다만 음성 클로닝 오용 위험, 제어 결과의 변동성, 언어 범위 한계는 반드시 고려해야 한다. (&lt;a href=&quot;https://github.com/OpenBMB/VoxCPM&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AI</category>
      <author>행복한 수지아빠</author>
      <guid isPermaLink="true">https://javaexpert.tistory.com/1726</guid>
      <comments>https://javaexpert.tistory.com/1726#entry1726comment</comments>
      <pubDate>Mon, 13 Apr 2026 10:11:53 +0900</pubDate>
    </item>
    <item>
      <title>Archon:AI 코딩을 매번 같은 품질로 굴리는 방법</title>
      <link>https://javaexpert.tistory.com/1725</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;AI 코딩 도구를 써 본 개발자라면 금방 느낍니다.&lt;br /&gt;같은 요청을 해도 결과가 매번 다릅니다. 어떤 날은 계획을 잘 세우고, 어떤 날은 테스트를 건너뛰고, 어떤 날은 PR 설명조차 엉성합니다. Archon은 바로 이 불안정함을 줄이기 위해 나온 도구입니다. (&lt;a href=&quot;https://github.com/coleam00/Archon&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 간단합니다.&lt;br /&gt;&amp;ldquo;AI에게 일을 맡긴다&amp;rdquo;에서 끝내지 않고, &amp;ldquo;어떤 순서와 규칙으로 일을 하게 할지&amp;rdquo;를 워크플로로 고정하는 것입니다. 이 글을 끝까지 읽으면 Archon이 왜 필요한지, 기존 AI 코딩 방식과 무엇이 다른지, 어떤 팀에 잘 맞고 어디까지 기대해야 하는지까지 한 번에 감을 잡을 수 있습니다. (&lt;a href=&quot;https://github.com/coleam00/Archon&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;figure id=&quot;og_1775784901963&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - coleam00/Archon: The first open-source harness builder for AI coding. Make AI coding deterministic and repeatable.&quot; data-og-description=&quot;The first open-source harness builder for AI coding. Make AI coding deterministic and repeatable. - coleam00/Archon&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/coleam00/Archon&quot; data-og-url=&quot;https://github.com/coleam00/Archon&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/mP08t/dJMb9hC2jp8/GSaswhe3blNMGCDvO7NYq0/img.png?width=1200&amp;amp;height=600&amp;amp;face=975_144_1057_234,https://scrap.kakaocdn.net/dn/c6OCgB/dJMb8ZvCtw2/d4wp6hK4efLm8pU27GrK0k/img.png?width=1200&amp;amp;height=600&amp;amp;face=975_144_1057_234,https://scrap.kakaocdn.net/dn/cKdR7g/dJMb9jOnXlq/l3zVKNOTUzk1LCAuAbLFo0/img.png?width=409&amp;amp;height=409&amp;amp;face=0_0_409_409&quot;&gt;&lt;a href=&quot;https://github.com/coleam00/Archon&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/coleam00/Archon&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/mP08t/dJMb9hC2jp8/GSaswhe3blNMGCDvO7NYq0/img.png?width=1200&amp;amp;height=600&amp;amp;face=975_144_1057_234,https://scrap.kakaocdn.net/dn/c6OCgB/dJMb8ZvCtw2/d4wp6hK4efLm8pU27GrK0k/img.png?width=1200&amp;amp;height=600&amp;amp;face=975_144_1057_234,https://scrap.kakaocdn.net/dn/cKdR7g/dJMb9jOnXlq/l3zVKNOTUzk1LCAuAbLFo0/img.png?width=409&amp;amp;height=409&amp;amp;face=0_0_409_409');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - coleam00/Archon: The first open-source harness builder for AI coding. Make AI coding deterministic and repeatable.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The first open-source harness builder for AI coding. Make AI coding deterministic and repeatable. - coleam00/Archon&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;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;p data-ke-size=&quot;size16&quot;&gt;지금 많은 팀이 AI 코딩을 도입했지만, 실제 운영 단계에서는 생각보다 다른 문제가 먼저 터집니다.&lt;br /&gt;모델의 답변 품질보다, 그 답변이 어떤 절차를 거쳐 나왔는지 추적하기 어렵다는 점이 더 큰 문제입니다. 같은 버그 수정 요청도 누락된 테스트, 부족한 리뷰, 불안정한 브랜치 운영으로 이어질 수 있습니다. (&lt;a href=&quot;https://github.com/coleam00/Archon&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비용 문제도 있습니다.&lt;br /&gt;에이전트가 매번 처음부터 다시 탐색하고, 검증 없이 다시 시도하고, 문맥을 길게 끌고 가면 토큰 비용과 실행 시간이 같이 늘어납니다. 특히 구현과 검증이 섞인 상태에서는 실패 원인이 모델 품질인지, 절차 설계인지 구분하기가 어려워집니다. 이때 사람은 더 자주 개입해야 하고, 결국 자동화 이득이 줄어듭니다. 이는 Archon이 AI 노드와 결정적 노드를 분리해 쓰도록 설계한 이유와도 맞닿아 있습니다. (&lt;a href=&quot;https://github.com/coleam00/Archon/blob/dev/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성능과 유지보수 측면도 비슷합니다.&lt;br /&gt;구조가 복잡해질수록 &amp;ldquo;왜 이 단계가 실행됐는지&amp;rdquo;, &amp;ldquo;어디서 실패했는지&amp;rdquo;, &amp;ldquo;어떤 검증을 통과했는지&amp;rdquo;가 흐려집니다. 에이전트 동작이 비결정적이면 디버깅은 더 어려워지고, 팀마다 쓰는 방식이 달라져 재현성도 무너집니다. Archon은 이 지점을 워크플로 정의 파일과 공통 실행 규칙으로 고정하려고 합니다. (&lt;a href=&quot;https://github.com/coleam00/Archon/blob/dev/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 경험 문제도 큽니다.&lt;br /&gt;좋은 프롬프트를 가진 사람이 성과를 독점하는 구조는 팀 단위 운영에 불리합니다. 반면 절차가 파일로 남고 저장소에 커밋되면, 개인의 감각이 아니라 팀의 프로세스로 재사용할 수 있습니다. Archon이 워크플로를 저장소 내부 .archon/workflows/와 .archon/commands/로 관리하게 한 이유가 여기에 있습니다. (&lt;a href=&quot;https://github.com/coleam00/Archon/blob/dev/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Archon이란 무엇인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Archon은 AI 코딩 에이전트를 위한 워크플로 엔진입니다.&lt;br /&gt;조금 더 쉽게 말하면, &amp;ldquo;AI가 코드를 잘 짜게 만드는 프롬프트 모음&amp;rdquo;이 아니라 &amp;ldquo;AI가 어떤 순서로 일하게 할지 정의하는 실행 시스템&amp;rdquo;에 가깝습니다. (&lt;a href=&quot;https://github.com/coleam00/Archon&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비유하자면 이런 느낌입니다.&lt;br /&gt;도커가 인프라 설정을 파일로 고정했고, GitHub Actions가 CI/CD 절차를 파일로 고정했다면, Archon은 AI 코딩 절차를 파일로 고정합니다. README도 이 점을 직접 강조하며, 소프트웨어 개발용 n8n처럼 볼 수 있다고 설명합니다. (&lt;a href=&quot;https://github.com/coleam00/Archon&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기술적으로 보면 Archon은 YAML로 개발 절차를 정의하고, 그 안에 계획 수립, 구현, 검증, 리뷰, PR 생성 같은 단계를 노드 형태로 배치합니다.&lt;br /&gt;중요한 점은 모든 단계를 AI에게 맡기지 않는다는 것입니다. 테스트 실행, Git 작업, 검증 같은 반복 가능 작업은 결정적으로 처리하고, 계획&amp;middot;생성&amp;middot;리뷰처럼 AI가 강한 지점에만 모델을 투입합니다. 철학 자체가 &amp;ldquo;AI를 믿되, 구조는 사람이 소유한다&amp;rdquo;에 가깝습니다. (&lt;a href=&quot;https://github.com/coleam00/Archon&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 하나 짚어둘 점이 있습니다.&lt;br /&gt;2026년 4월 기준 Archon 저장소는 예전의 Python 기반 MCP 지식관리 도구에서, TypeScript와 Bun 기반의 AI 코딩 워크플로 엔진으로 방향을 크게 전환한 상태입니다. 그래서 과거에 Archon을 &amp;ldquo;RAG 중심 툴&amp;rdquo;로 기억하는 사람이라면, 지금은 성격이 꽤 달라졌다고 보는 편이 정확합니다. (&lt;a href=&quot;https://github.com/coleam00/Archon/issues/952&quot;&gt;GitHub&lt;/a&gt;)&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;b&gt;YAML 기반 워크플로 정의&lt;/b&gt;&lt;br /&gt;계획, 구현, 검증, 리뷰, PR 생성까지를 파일로 남길 수 있습니다. 말로 지시하던 절차가 코드처럼 관리되기 때문에 재현성과 협업성이 올라갑니다. (&lt;a href=&quot;https://github.com/coleam00/Archon&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결정적 단계와 AI 단계를 분리&lt;/b&gt;&lt;br /&gt;bash 실행, 테스트, Git 작업은 결정적으로 처리하고, AI는 필요한 곳에만 넣습니다. 이 구조는 비용과 실패 원인을 분리해서 보게 해준다는 점이 중요합니다. (&lt;a href=&quot;https://github.com/coleam00/Archon/blob/dev/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;격리된 Git worktree 실행&lt;/b&gt;&lt;br /&gt;각 워크플로 실행이 독립 worktree를 사용합니다. 여러 작업을 병렬로 돌릴 때 충돌을 줄이고, 실험과 복구가 쉬워집니다. (&lt;a href=&quot;https://github.com/coleam00/Archon/blob/dev/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;웹 UI와 CLI를 함께 제공&lt;/b&gt;&lt;br /&gt;CLI로 시작할 수 있고, 웹 대시보드에서는 대화, 실행 현황, 단계별 진행, 워크플로 빌더까지 볼 수 있습니다. 개인 실험에서 팀 운영으로 넘어갈 때 체감 차이가 큰 부분입니다. (&lt;a href=&quot;https://github.com/coleam00/Archon/blob/dev/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기본 워크플로 다수 제공&lt;/b&gt;&lt;br /&gt;2026년 4월 기준 기본 워크플로가 17개 포함되어 있고, 이슈 수정, 아이디어에서 PR 생성, PR 리뷰, 충돌 해결, 리팩터링 같은 일반 작업을 바로 시작할 수 있습니다. 시작 비용을 낮춰 준다는 점에서 의미가 있습니다. (&lt;a href=&quot;https://github.com/coleam00/Archon/blob/dev/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;팀 저장소 안에서 프로세스 버전 관리 가능&lt;/b&gt;&lt;br /&gt;기본 제공 워크플로를 복사해 저장소에서 덮어쓸 수 있습니다. 즉 &amp;ldquo;우리 팀 방식&amp;rdquo;을 설정 문서가 아니라 실행 가능한 자산으로 만들 수 있습니다. (&lt;a href=&quot;https://github.com/coleam00/Archon/blob/dev/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실제로 어떤 효과가 있는가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Archon이 주는 가장 큰 효과는 &amp;ldquo;AI가 뭘 할지&amp;rdquo;보다 &amp;ldquo;AI가 어떤 순서로 일할지&amp;rdquo;를 통제할 수 있다는 점입니다.&lt;br /&gt;버그 수정이든 기능 개발이든, 계획 &amp;rarr; 구현 &amp;rarr; 검증 &amp;rarr; 리뷰 &amp;rarr; PR 같은 흐름이 반복 가능하게 고정되면 결과 품질보다 운영 안정성이 먼저 좋아집니다. README 역시 같은 워크플로를 같은 순서로 반복 실행할 수 있다는 점을 핵심 가치로 내세웁니다. (&lt;a href=&quot;https://github.com/coleam00/Archon&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전과 후를 비교하면 차이는 분명합니다.&lt;br /&gt;기존 방식은 &amp;ldquo;이슈를 고쳐 줘&amp;rdquo;라고 요청하면 에이전트가 어떤 절차를 밟을지 매번 달라집니다. 반면 Archon 방식은 어떤 단계에서 테스트를 돌리고, 언제 사람 승인을 받고, 언제 PR을 만들지까지 워크플로가 결정합니다. 즉 결과를 잘 뽑는 도구라기보다, 결과가 흔들리지 않게 만드는 도구에 가깝습니다. (&lt;a href=&quot;https://github.com/coleam00/Archon&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;효과가 가장 커지는 상황도 분명합니다.&lt;br /&gt;같은 패턴의 작업이 반복되는 팀, PR 품질 편차가 큰 팀, AI 코딩 도입은 했지만 운영 규칙이 없는 팀에서 특히 유리합니다. 반대로 개인이 단발성으로 빠르게 실험하는 단계에서는 이 구조가 오히려 무겁게 느껴질 수 있습니다. 이 부분은 공개 자료에서 정량 성능 수치보다 사용 구조와 기본 워크플로 구성을 통해 읽히는 효과입니다. (&lt;a href=&quot;https://github.com/coleam00/Archon/blob/dev/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수치로 공개된 벤치마크는 현재 확인되는 범위에서 전면에 나오지 않습니다.&lt;br /&gt;그래서 &amp;ldquo;몇 퍼센트 빨라진다&amp;rdquo;보다 &amp;ldquo;재현성, 병렬 실행, 검증 일관성, 팀 표준화&amp;rdquo; 같은 운영 효과를 중심으로 이해하는 편이 맞습니다. 공개 자료 기준으로도 Archon은 속도 경쟁형 도구보다 프로세스 고정형 도구에 가깝습니다. (&lt;a href=&quot;https://github.com/coleam00/Archon&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;동작 원리 / 구조&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;요청을 해석한다&lt;/b&gt;&lt;br /&gt;사용자는 CLI나 웹 UI에서 원하는 작업을 말합니다. 예를 들어 이슈 수정, 기능 구현, 리뷰 같은 요청입니다. Archon은 여기에 맞는 워크플로를 선택하거나, 사용자가 지정한 워크플로를 실행합니다. 기본 워크플로 목록도 이미 제공됩니다. (&lt;a href=&quot;https://github.com/coleam00/Archon/blob/dev/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;워크플로를 노드 단위로 펼친다&lt;/b&gt;&lt;br /&gt;워크플로는 YAML로 정의되며, 각 노드는 계획, 구현, 테스트, 리뷰 같은 역할을 가집니다. 의존 관계가 있고, 어떤 노드는 루프를 돌며 완료 조건을 만족할 때까지 반복할 수 있습니다. 예시 워크플로에는 depends_on, loop, until, interactive 같은 제어가 등장합니다. (&lt;a href=&quot;https://github.com/coleam00/Archon/blob/dev/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AI와 결정적 실행을 섞어 처리한다&lt;/b&gt;&lt;br /&gt;구현 계획 작성이나 코드 리뷰는 AI 프롬프트 노드가 맡고, 테스트 실행은 bash 노드가 맡는 식입니다. 이렇게 분리하는 이유는 AI의 강점을 살리면서도 검증 단계는 흔들리지 않게 유지하기 위해서입니다. (&lt;a href=&quot;https://github.com/coleam00/Archon/blob/dev/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;격리된 작업 환경에서 실행한다&lt;/b&gt;&lt;br /&gt;각 실행은 독립된 Git worktree를 사용합니다. 설계 의도는 병렬 실행 시 충돌을 줄이고, 브랜치 오염 없이 작업을 진행하게 만드는 데 있습니다. &amp;ldquo;여러 개를 동시에 돌려도 안전하게 관리한다&amp;rdquo;는 운영 관점의 장치라고 보면 됩니다. (&lt;a href=&quot;https://github.com/coleam00/Archon/blob/dev/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사람 승인과 반복 루프를 포함할 수 있다&lt;/b&gt;&lt;br /&gt;모든 자동화가 완전 무인으로 돌아가야 하는 것은 아닙니다. 예시 워크플로에는 사람 승인 노드가 있고, 피드백이 있으면 다시 수정하도록 설계되어 있습니다. 즉 Archon은 &amp;ldquo;사람을 제거하는 구조&amp;rdquo;보다 &amp;ldquo;사람 개입 시점을 설계하는 구조&amp;rdquo;에 더 가깝습니다. (&lt;a href=&quot;https://github.com/coleam00/Archon/blob/dev/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결과를 모니터링하고 재사용한다&lt;/b&gt;&lt;br /&gt;웹 UI에서는 대화, 툴 호출 시각화, 실행 기록, 워크플로 실행 상태를 추적할 수 있습니다. 또한 워크플로 파일을 저장소에 커밋해 팀 전체가 같은 절차를 재사용하게 만들 수 있습니다. (&lt;a href=&quot;https://github.com/coleam00/Archon/blob/dev/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치 / 사용 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 기준으로 문서에서 가장 권장하는 시작 방식은 전체 설정 경로입니다.&lt;br /&gt;Bun, GitHub CLI, Claude Code를 준비한 뒤 저장소를 클론하고, setup wizard를 통해 인증과 프로젝트 연결까지 진행하는 흐름입니다. 빠른 설치용 CLI 경로도 별도로 제공됩니다. (&lt;a href=&quot;https://github.com/coleam00/Archon/blob/dev/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;전체 설정 예시&lt;/h3&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# Bun 설치 (macOS/Linux)
curl -fsSL https://bun.sh/install | bash

# GitHub CLI 설치 (macOS)
brew install gh

# Claude Code 설치 (macOS/Linux/WSL)
curl -fsSL https://claude.ai/install.sh | bash

# Archon 설치
git clone https://github.com/coleam00/Archon
cd Archon
bun install
claude
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 Claude Code 안에서 아래처럼 설정을 시작하는 흐름입니다.&lt;/p&gt;
&lt;pre class=&quot;gams&quot;&gt;&lt;code&gt;Set up Archon
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 설정 마법사는 CLI 설치, 인증, 플랫폼 선택, 대상 저장소에 Archon skill 복사까지 안내합니다. 또한 실제 작업은 Archon 저장소가 아니라 &lt;b&gt;대상 프로젝트 저장소에서&lt;/b&gt; 실행하라고 문서가 명시합니다. (&lt;a href=&quot;https://github.com/coleam00/Archon/blob/dev/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;빠른 CLI 설치 예시&lt;/h3&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;# macOS / Linux
curl -fsSL https://archon.diy/install | bash
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;# Windows PowerShell
irm https://archon.diy/install.ps1 | iex
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;# Homebrew
brew install coleam00/archon/archon
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최소 실행 흐름&lt;/h3&gt;
&lt;pre class=&quot;gradle&quot;&gt;&lt;code&gt;cd /path/to/your/project
claude
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그다음 에이전트에게 이렇게 요청할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;Use archon to fix issue #42
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 사용 가능한 워크플로를 물어볼 수도 있습니다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;What archon workflows do I have? When would I use each one?
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 UI가 필요하면 저장소 루트에서 개발 서버를 띄우는 방식도 문서에 포함되어 있습니다.&lt;/p&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;bun run dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키지 스크립트 기준으로는 dev, dev:web, build, validate 같은 명령이 정의되어 있어, 개발&amp;middot;웹 실행&amp;middot;빌드&amp;middot;검증 흐름을 분리해 운영할 수 있습니다. (&lt;a href=&quot;https://raw.githubusercontent.com/coleam00/Archon/main/package.json&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 쓰는 예시 / 활용 시나리오&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) GitHub 이슈를 PR까지 자동으로 밀어붙이고 싶을 때&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;누가 쓰나 하면, 작은 버그 수정이 자주 들어오는 팀입니다.&lt;br /&gt;이슈 분류, 조사, 구현, 검증, PR 생성까지를 묶은 기본 워크플로가 있어 반복 작업 자동화에 잘 맞습니다. (&lt;a href=&quot;https://github.com/coleam00/Archon/blob/dev/README.md&quot;&gt;GitHub&lt;/a&gt;)&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;기획이 거칠고 개발이 빠르게 돌아가는 스타트업에 유리합니다.&lt;br /&gt;아이디어를 계획으로 바꾸고, 구현하고, 검증하고, 리뷰를 거쳐 PR을 만드는 흐름이 이미 기본 워크플로에 들어 있습니다. (&lt;a href=&quot;https://github.com/coleam00/Archon/blob/dev/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) PR 리뷰를 다중 단계로 표준화하고 싶을 때&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리뷰 품질 편차가 큰 팀에 적합합니다.&lt;br /&gt;스마트 리뷰와 다중 리뷰 워크플로가 기본 제공되어, &amp;ldquo;리뷰를 하긴 하는데 항상 수준이 다르다&amp;rdquo;는 문제를 줄이는 데 도움이 됩니다. (&lt;a href=&quot;https://github.com/coleam00/Archon/blob/dev/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) 안전한 리팩터링을 반복적으로 수행하고 싶을 때&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레거시 코드베이스를 운영하는 팀에서 유용합니다.&lt;br /&gt;타입 체크, 동작 검증, 리뷰 단계를 묶어 리팩터링을 프로세스화할 수 있기 때문입니다. README에도 architect, refactor-safely 계열 워크플로가 포함돼 있습니다. (&lt;a href=&quot;https://github.com/coleam00/Archon/blob/dev/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5) 팀의 개발 절차 자체를 자산으로 남기고 싶을 때&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인 프롬프트가 아니라 팀 룰을 저장소에 넣고 싶은 경우입니다.&lt;br /&gt;.archon/workflows/와 .archon/commands/에 정의를 넣고 커밋하면, 팀원 모두가 같은 과정을 따라가게 만들 수 있습니다. (&lt;a href=&quot;https://github.com/coleam00/Archon/blob/dev/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;한계 / 주의할 점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째, 모든 팀에 바로 맞는 도구는 아닙니다.&lt;br /&gt;작업이 작고 단순한데도 계획, 검증, 리뷰, 승인 절차를 다 걸면 오히려 느려질 수 있습니다. 즉 Archon은 &amp;ldquo;빠른 한 번의 답&amp;rdquo;보다 &amp;ldquo;반복 가능한 운영&amp;rdquo;에 강합니다. 현재 공개 문서 기준으로도 이 도구의 중심은 생산성 폭발보다 절차 표준화에 있습니다. (&lt;a href=&quot;https://github.com/coleam00/Archon&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘째, AI 코딩 도구의 의존성을 그대로 안고 갑니다.&lt;br /&gt;문서상 확인되는 범위에서 Archon은 Claude Code를 전제로 한 설정 흐름을 강조하고, CLI와 웹 UI를 함께 제공하지만, 결국 내부 실행 품질은 연결된 코딩 에이전트와 모델 환경에 영향을 받습니다. 구조가 좋다고 해서 모델 한계가 사라지는 것은 아닙니다. (&lt;a href=&quot;https://github.com/coleam00/Archon/blob/dev/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;셋째, 초기 설계 비용이 있습니다.&lt;br /&gt;기본 워크플로 17개가 출발점은 되어 주지만, 팀에 맞게 바꾸려면 결국 워크플로를 읽고 수정해야 합니다. 즉 &amp;ldquo;아무 설정 없이 바로 최고의 자동화&amp;rdquo;를 기대하면 실망할 수 있습니다. Archon은 제품이라기보다 운영 체계를 만드는 프레임에 가깝습니다. (&lt;a href=&quot;https://github.com/coleam00/Archon/blob/dev/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;넷째, 예전 Archon과 혼동하기 쉽습니다.&lt;br /&gt;현재 기준으로는 Python 기반 RAG/MCP 성격의 이전 버전이 별도 아카이브 브랜치로 보존되어 있고, 메인 흐름은 TypeScript/Bun 기반 워크플로 엔진입니다. 기존 글이나 영상에서 본 Archon과 지금의 Archon이 다를 수 있다는 점을 염두에 두는 편이 좋습니다. (&lt;a href=&quot;https://github.com/coleam00/Archon/issues/952&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다섯째, 아직 검증되지 않은 영역도 있습니다.&lt;br /&gt;현재 기준으로는 공개 문서에서 운영 철학과 기능 구조는 비교적 선명하지만, 대규모 엔터프라이즈 환경에서의 장기 운영 사례나 정량 벤치마크는 전면에 드러나지 않습니다. 그래서 도입 판단은 &amp;ldquo;기능이 많다&amp;rdquo;보다 &amp;ldquo;우리 팀이 절차형 자동화를 실제로 원하느냐&amp;rdquo;를 기준으로 하는 편이 더 현실적입니다. (&lt;a href=&quot;https://github.com/coleam00/Archon/blob/dev/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Archon의 가치는 AI가 더 똑똑해진다는 데 있지 않습니다.&lt;br /&gt;AI가 일하는 방식을 팀이 통제할 수 있게 만든다는 데 있습니다. 그 차이는 개인 사용 단계에서는 작아 보여도, 팀 운영 단계에서는 꽤 크게 벌어집니다. (&lt;a href=&quot;https://github.com/coleam00/Archon&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 반복적인 개발 프로세스가 있고, PR 품질을 일정하게 맞추고 싶고, AI 코딩을 &amp;ldquo;요령&amp;rdquo;이 아니라 &amp;ldquo;체계&amp;rdquo;로 바꾸고 싶은 팀에 잘 맞습니다.&lt;br /&gt;스타트업, AI 에이전트 개발자, 대규모 코드베이스 운영 팀 모두 후보가 될 수 있지만, 공통 조건은 하나입니다. AI를 더 많이 쓰고 싶은 팀이 아니라, AI를 더 예측 가능하게 쓰고 싶은 팀이어야 한다는 점입니다. (&lt;a href=&quot;https://github.com/coleam00/Archon/blob/dev/README.md&quot;&gt;GitHub&lt;/a&gt;)&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;b&gt;핵심 개념&lt;/b&gt;&lt;br /&gt;Archon은 AI 코딩 에이전트를 위한 YAML 기반 워크플로 엔진이다. (&lt;a href=&quot;https://github.com/coleam00/Archon&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;차별점&lt;/b&gt;&lt;br /&gt;프롬프트를 잘 쓰게 해주는 도구가 아니라, 계획&amp;middot;구현&amp;middot;검증&amp;middot;리뷰&amp;middot;PR 절차 자체를 파일로 고정하는 도구다. (&lt;a href=&quot;https://github.com/coleam00/Archon/blob/dev/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;언제 쓰면 좋은지&lt;/b&gt;&lt;br /&gt;반복 작업이 많고, 리뷰 품질 편차가 크고, AI 코딩을 팀 표준 프로세스로 묶고 싶을 때 좋다. (&lt;a href=&quot;https://github.com/coleam00/Archon/blob/dev/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;언제 쓰면 안 되는지&lt;/b&gt;&lt;br /&gt;단발성 실험이 많고, 절차 설계보다 빠른 응답이 더 중요하고, 워크플로 유지 비용을 감당하기 어려운 상황에서는 무거울 수 있다. (&lt;a href=&quot;https://github.com/coleam00/Archon&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;한 줄 요약&lt;/b&gt;&lt;br /&gt;Archon은 AI에게 코드를 맡기는 도구가 아니라, AI가 코드를 어떻게 만들지 팀이 통제하게 해주는 도구다. (&lt;a href=&quot;https://github.com/coleam00/Archon&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AI</category>
      <author>행복한 수지아빠</author>
      <guid isPermaLink="true">https://javaexpert.tistory.com/1725</guid>
      <comments>https://javaexpert.tistory.com/1725#entry1725comment</comments>
      <pubDate>Fri, 10 Apr 2026 10:35:25 +0900</pubDate>
    </item>
    <item>
      <title>Obsidian: AI+옵시디언</title>
      <link>https://javaexpert.tistory.com/1724</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;최근 AI 도구는 많아졌지만, 실제로 메모 앱 안에서 일하는 방식은 크게 바뀌지 않았습니다. 채팅창에 질문을 던지고, 답을 복사해서 노트에 붙여넣고, 다시 수정 지시를 내리는 흐름이 대부분이었습니다. 이 과정은 보기보다 자주 끊깁니다. 문맥이 잘리고, 수정 이력이 흩어지고, 작업 대상이 많아질수록 대화와 파일이 따로 노는 문제가 생깁니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claudian은 이 불편을 정면으로 건드립니다. 핵심은 &amp;ldquo;AI를 노트 앱에 붙인다&amp;rdquo;가 아니라, Obsidian 볼트 자체를 에이전트의 작업 디렉터리로 바꾸는 데 있습니다. 즉, AI가 단순히 답변만 생성하는 것이 아니라 볼트 안의 파일을 읽고, 쓰고, 검색하고, 필요하면 여러 단계를 거쳐 작업을 수행하는 구조입니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글을 끝까지 읽으면 세 가지가 정리됩니다. Claudian이 왜 기존 AI 노트 도구와 다른지, 실제로 어떤 구조로 동작하는지, 그리고 어떤 팀과 작업 방식에 특히 잘 맞는지입니다. 반대로 언제 기대를 낮춰야 하는지도 함께 보겠습니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;figure id=&quot;og_1775784636252&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;claudian/README.md at main &amp;middot; YishenTu/claudian&quot; data-og-description=&quot;An Obsidian plugin that embeds Claude Code as an AI collaborator in your vault - YishenTu/claudian&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot; data-og-url=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/oL5YX/dJMb8ZvCtvb/HQ8eWZGXgbPsYWXQ6UVP11/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/rjpVj/dJMb9eTQGM3/0pKo2578Hz87BBKsfMtxj1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/ZJBAp/dJMb85WUmNl/5AJGjKUhNh4QCUUOremQBk/img.png?width=2908&amp;amp;height=1704&amp;amp;face=0_0_2908_1704&quot;&gt;&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/oL5YX/dJMb8ZvCtvb/HQ8eWZGXgbPsYWXQ6UVP11/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/rjpVj/dJMb9eTQGM3/0pKo2578Hz87BBKsfMtxj1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/ZJBAp/dJMb85WUmNl/5AJGjKUhNh4QCUUOremQBk/img.png?width=2908&amp;amp;height=1704&amp;amp;face=0_0_2908_1704');&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;claudian/README.md at main &amp;middot; YishenTu/claudian&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;An Obsidian plugin that embeds Claude Code as an AI collaborator in your vault - YishenTu/claudian&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;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;p data-ke-size=&quot;size16&quot;&gt;기존 방식의 가장 큰 한계는 작업 대상과 대화 인터페이스가 분리되어 있다는 점입니다. 메모는 메모 앱에 있고, AI는 브라우저 탭이나 별도 앱에 있습니다. 그러면 사용자는 항상 맥락을 손으로 옮겨야 합니다. 이 수동 복사가 반복되면 컨텍스트 손실이 생기고, 긴 작업일수록 일관성이 깨집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비용 문제도 있습니다. 같은 파일 내용을 여러 번 붙여넣는 구조는 토큰을 낭비합니다. 특히 노트가 길어지거나 관련 문서가 많아질수록, 실제 작업보다 문맥 전달 비용이 더 커지는 경우가 많습니다. 에이전트가 파일 시스템을 직접 다루지 못하면 결국 사람이 매번 내용을 다시 제공해야 하기 때문입니다. 이 점에서 볼트를 직접 작업 공간으로 쓰는 접근은 비용 구조 자체를 바꾸는 방향입니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;GitHub&lt;/a&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;유지보수 문제는 시간이 갈수록 커집니다. 프롬프트 템플릿, 자주 쓰는 작업 지시, 외부 도구 연결, 파일 단위 수정 패턴이 쌓이기 시작하면 개인의 작업 습관이 점점 시스템처럼 변합니다. 그런데 이 구조가 앱 바깥의 채팅 서비스에 흩어져 있으면 재현이 어렵습니다. 협업이나 장기 운영 관점에서는 결국 &amp;ldquo;어떻게 같은 방식으로 다시 실행할 것인가&amp;rdquo;가 중요해집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 경험도 영향을 받습니다. AI를 쓰는 시간이 늘수록, 답변 품질보다 더 중요한 것은 작업 흐름의 끊김이 줄어드는지입니다. 채팅, 파일 수정, 계획 수립, 도구 호출이 한 환경에서 이어질 때 비로소 생산성이 올라갑니다. Claudian이 주목받는 이유도 바로 여기 있습니다. Obsidian을 단순 노트 앱이 아니라 AI 작업 허브로 재해석하기 때문입니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Claudian이란 무엇인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claudian은 Obsidian 볼트 안에 AI 코딩 에이전트를 내장해, 노트와 파일을 직접 다루는 작업형 인터페이스로 확장하는 데스크톱 플러그인입니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비유하면, 기존 AI 노트 도구가 &amp;ldquo;메모를 보여주고 의견을 주는 조수&amp;rdquo;라면 Claudian은 &amp;ldquo;메모 보관함 안에 들어와 직접 문서를 찾고 수정하는 작업자&amp;rdquo;에 가깝습니다. 사용자는 내용을 복사해서 전달하는 대신, 볼트 자체를 작업 맥락으로 제공하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기술적으로 보면 Claudian은 Obsidian 안에 provider-backed chat runtime을 넣고, 사이드바 채팅과 인라인 편집 흐름을 결합한 구조입니다. 기본 제공자는 Claude 계열이며, Codex도 선택적으로 같은 대화 모델에 합류할 수 있도록 설계되어 있습니다. 즉 특정 모델 UI를 흉내 낸 플러그인이 아니라, 공급자별 런타임을 꽂아 넣는 다중 제공자 구조를 지향합니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/CLAUDE.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 방식과의 차이는 명확합니다. 일반적인 AI 플러그인이 &amp;ldquo;대화 중심&amp;rdquo;이라면, Claudian은 &amp;ldquo;작업 디렉터리 중심&amp;rdquo;입니다. 핵심 철학은 답변 생성보다 실행 가능한 작업 환경에 가깝습니다. 이 차이 때문에 파일 읽기&amp;middot;쓰기, 검색, Bash 실행, 다단계 워크플로우, 계획 모드 같은 기능이 자연스럽게 한 흐름으로 묶입니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&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;b&gt;볼트를 에이전트 작업 디렉터리로 사용&lt;/b&gt;&lt;br /&gt;메모를 복사해서 붙여넣을 필요가 줄어듭니다. 파일 읽기, 쓰기, 검색이 바로 이어지기 때문에 컨텍스트 전달 비용이 낮아집니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;인라인 편집과 단어 단위 diff 미리보기 지원&lt;/b&gt;&lt;br /&gt;채팅창에서 결과를 받은 뒤 수동 반영하는 방식보다 훨씬 실용적입니다. 특히 문단 수정, 문체 정리, 요약 갱신 같은 작업에서 효과가 큽니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;슬래시 커맨드와 스킬 재사용 구조&lt;/b&gt;&lt;br /&gt;자주 쓰는 프롬프트나 작업 패턴을 반복 가능한 형태로 축적할 수 있습니다. 개인 생산성 도구를 넘어서 팀 작업 표준으로 확장하기 쉬운 이유입니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;@mention, 계획 모드, 지시 모드 지원&lt;/b&gt;&lt;br /&gt;특정 파일이나 외부 자원을 명시하고, 먼저 설계를 검토한 뒤 실행하는 흐름을 만들 수 있습니다. 즉흥적인 실행보다 통제 가능한 에이전트 경험에 가깝습니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MCP 서버 연결과 다중 제공자 구조&lt;/b&gt;&lt;br /&gt;외부 도구를 붙이거나, Claude 외의 제공자를 붙일 수 있는 방향으로 설계되어 있습니다. 현재 기준으로 Claude가 가장 완전한 기능 세트를 제공하고, Codex는 선택적 제공자 형태로 통합됩니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데스크톱 전용, 로컬 볼트 중심 동작&lt;/b&gt;&lt;br /&gt;Obsidian 데스크톱 환경에서 동작하며, 설정과 세션 메타데이터는 로컬 저장을 사용합니다. 추적성보다 작업 통합을 우선한 도구라는 점이 분명합니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실제로 어떤 효과가 있는가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공개된 자료 기준으로 Claudian의 효과는 &amp;ldquo;더 똑똑한 답변&amp;rdquo;보다 &amp;ldquo;작업 흐름의 마찰 감소&amp;rdquo;에 가깝습니다. 전에는 사용자가 파일을 열고, 필요한 부분을 복사하고, AI에게 붙여넣고, 결과를 다시 수동 반영해야 했다면, 이후에는 같은 볼트 안에서 읽기&amp;middot;검색&amp;middot;수정&amp;middot;재검토가 하나의 흐름으로 이어집니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;효과가 극대화되는 상황은 파일이 여러 개 연결된 지식 작업입니다. 예를 들어 연구 노트 정리, 기술 문서 초안 작성, 프로젝트 기록 정리, 코드와 문서를 함께 다루는 개발 메모가 여기에 해당합니다. 단일 질문에 대한 답을 받는 용도보다, 여러 문서를 참조해 구조를 정리하고 수정하는 작업에서 가치가 더 큽니다. 이 점은 Claudian이 채팅 앱보다 &amp;ldquo;작업 환경&amp;rdquo;으로 읽혀야 하는 이유이기도 합니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 개인 지식 베이스를 오래 운영하는 사용자나, Obsidian을 사실상 업무 허브처럼 쓰는 개발자에게 유리합니다. 프롬프트를 매번 새로 짜기보다 스킬과 작업 패턴을 축적할 수 있기 때문입니다. 반대로 짧은 질의응답 위주 사용자는 기능의 깊이에 비해 체감 이점이 크지 않을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 관점에서는 스타트업처럼 문서 체계가 빠르게 변하는 팀, 기술 문서와 설계 기록을 자주 갱신하는 개발 조직, 에이전트형 워크플로우를 실험하는 개인 개발자에게 특히 맞습니다. 저장소의 공개 지표만 봐도 2026년 4월 9일 기준 최신 릴리스가 2.0.2까지 올라와 있고, 저장소 관심도도 빠르게 커진 상태라 실험적 관심을 넘어 실제 사용층이 형성된 것으로 볼 수 있습니다. 이는 어디까지나 공개 지표를 바탕으로 한 해석입니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian?ref=nigzu.com&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;동작 원리 / 구조&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;사용자 입력이 채팅 또는 인라인 편집으로 들어옵니다.&lt;/b&gt;&lt;br /&gt;Claudian은 사이드바 채팅과 노트 내부 편집을 함께 제공합니다. 즉 &amp;ldquo;대화형 요청&amp;rdquo;과 &amp;ldquo;문서 직접 수정&amp;rdquo;이 같은 작업 모델 위에 놓입니다. 이 설계는 생각과 실행을 분리하지 않기 위해서입니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;현재 볼트와 선택된 대상이 작업 컨텍스트가 됩니다.&lt;/b&gt;&lt;br /&gt;파일, 선택 영역, 멘션된 대상, 명령 스킬이 함께 묶여 에이전트가 볼 수 있는 작업 범위를 형성합니다. 기존 채팅형 도구처럼 매번 본문을 붙여넣는 것이 아니라, 볼트 자체가 컨텍스트 저장소가 됩니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Provider registry가 실제 런타임을 결정합니다.&lt;/b&gt;&lt;br /&gt;내부 구조상 공유 앱 셸과 provider-neutral core가 있고, 그 위에 ProviderRegistry와 workspace registry가 붙습니다. 여기서 어떤 제공자 런타임을 쓸지, 명령 카탈로그나 MCP 관리 같은 부가 기능을 어떻게 연결할지 결정됩니다. 이 구조 덕분에 특정 모델 종속 UI가 아니라 제공자 교체 가능한 아키텍처가 됩니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/CLAUDE.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;에이전트가 파일 작업과 도구 호출을 수행합니다.&lt;/b&gt;&lt;br /&gt;Claude 계열에서는 Claude Code CLI 기반 작업이 핵심이고, Codex는 선택형 제공자로 참여합니다. README 기준 기능 설명만 봐도 파일 읽기&amp;middot;쓰기&amp;middot;검색&amp;middot;Bash&amp;middot;다단계 워크플로우가 기본 경험으로 제시됩니다. 즉 답변 생성보다 작업 수행이 중심입니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결과를 인라인 diff나 대화 이력으로 검토합니다.&lt;/b&gt;&lt;br /&gt;변경 내용을 바로 적용해 버리는 것이 아니라, diff 미리보기와 계획 승인 같은 검토 흐름이 들어가 있습니다. 이것은 에이전트 자동화를 쓰면서도 통제를 잃지 않게 하려는 설계로 읽을 수 있습니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;세션과 설정은 로컬 중심으로 유지됩니다.&lt;/b&gt;&lt;br /&gt;README에 따르면 설정과 세션 메타데이터는 로컬 경로에 저장되고, Claude와 Codex의 대화 기록도 각 런타임 저장 위치를 사용합니다. 추적 분석보다는 사용자의 로컬 작업 맥락을 보존하는 방향입니다. 텔레메트리가 없다고 명시한 점도 같은 맥락입니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치 / 사용 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서상 확인되는 범위에서 Claudian은 Obsidian 데스크톱과 Claude Code CLI 설치를 전제로 합니다. Codex는 선택 사항입니다. 최소 요구 조건은 Obsidian 1.4.5 이상이며, 데스크톱 전용입니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 이해하기 쉬운 개발 설치 흐름은 아래와 같습니다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;cd /path/to/vault/.obsidian/plugins
git clone https://github.com/YishenTu/claudian.git
cd claudian
npm install
npm run build
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 중에는 감시 모드로 실행할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&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;Obsidian 데스크톱에서 플러그인을 활성화합니다.&lt;/li&gt;
&lt;li&gt;Claude Code CLI 경로를 확인합니다.&lt;/li&gt;
&lt;li&gt;사이드바 채팅을 열거나, 노트에서 텍스트를 선택합니다.&lt;/li&gt;
&lt;li&gt;인라인 편집 또는 채팅 지시로 파일 수정 작업을 시작합니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서 막히기 쉬운 부분은 CLI 경로입니다. README에는 spawn claude ENOENT 같은 오류가 날 때 고급 설정에서 Claude CLI path를 직접 지정하라고 안내되어 있습니다. 특히 Node 버전 매니저를 쓰는 환경이나 Windows 환경에서는 이 설정이 사실상 필수에 가깝습니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&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;누가 쓰나 하면, 프로젝트 노트를 Obsidian으로 관리하는 개발자입니다. 여러 회의 메모와 설계 문서를 읽고 하나의 결정 로그로 정리할 때 유용합니다. 왜냐하면 파일 간 참조와 수정이 한 번에 이어지기 때문입니다.&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;초안 작성은 이미 끝났는데, 문체를 통일하고 중복 문단을 줄이고 싶은 경우가 많습니다. 이때 인라인 편집과 diff 미리보기는 단순 채팅형 교정보다 훨씬 실용적입니다. 어디가 어떻게 바뀌는지 문서 안에서 바로 확인할 수 있기 때문입니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;GitHub&lt;/a&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;반복되는 문서 작업이 있는 팀이나 개인에게 적합합니다. 슬래시 커맨드와 스킬을 사용하면 &amp;ldquo;회의록 정리&amp;rdquo;, &amp;ldquo;문체 정제&amp;rdquo;, &amp;ldquo;요약 생성&amp;rdquo;, &amp;ldquo;체크리스트 업데이트&amp;rdquo; 같은 작업 패턴을 재사용 가능한 형태로 만들 수 있습니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 에이전트 기반 지식 베이스 운영 실험&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAG를 따로 붙이지 않더라도, 로컬 볼트 자체를 컨텍스트 기반 작업 공간으로 활용하려는 경우가 있습니다. 이럴 때 Claudian은 노트 앱 위에서 에이전트형 워크플로우를 실험하기 좋은 출발점이 됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 외부 도구를 붙인 확장형 작업&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MCP 서버를 활용해 외부 기능을 연결하려는 사용자에게도 의미가 있습니다. Obsidian 안의 지식과 외부 도구 호출을 한 흐름으로 이어갈 수 있기 때문입니다. 다만 이 영역은 제공자별 지원 차이를 꼭 확인해야 합니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;한계 / 주의할 점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째, 모든 사용자가 바로 이득을 보는 도구는 아닙니다. 단순한 질문 몇 개를 던지고 답만 받는 사용 패턴이라면, 일반 AI 채팅 서비스와 차이가 생각보다 크지 않을 수 있습니다. Claudian의 강점은 &amp;ldquo;문서 작업과 도구 실행이 엮인 긴 흐름&amp;rdquo;에서 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘째, 설치 난도가 완전히 낮지는 않습니다. 현재 기준으로는 Obsidian 데스크톱, Claude Code CLI, 경우에 따라 경로 설정까지 요구됩니다. 특히 로컬 환경과 CLI 설정에 익숙하지 않은 사용자는 첫 진입에서 불편을 느낄 수 있습니다. README에서도 CLI 자동 감지 실패와 경로 수동 지정 이슈를 별도 문제로 다루고 있습니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;셋째, 다중 제공자 구조라고 해도 기능 완성도는 동일하지 않습니다. 문서상 확인되는 범위에서 Claude 쪽이 더 완전한 기능 세트를 제공하며, Codex는 일부 기능이 지원되지 않거나 제한됩니다. 따라서 &amp;ldquo;어떤 모델이든 같은 경험&amp;rdquo;을 기대하면 오해가 생길 수 있습니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/CLAUDE.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;넷째, 개인정보와 외부 전송 경계는 반드시 이해해야 합니다. README에는 사용자 입력, 첨부 파일, 이미지, 도구 출력이 API 제공자에게 전송될 수 있다고 적혀 있습니다. 로컬 저장 구조가 있다고 해서 모든 데이터가 로컬에만 머무는 것은 아닙니다. 이 부분은 작업 대상 문서의 민감도에 따라 판단이 필요합니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다섯째, 아직 검증되지 않은 영역도 있습니다. 예를 들어 대규모 팀 협업 표준으로 얼마나 안정적으로 정착할 수 있는지, 복잡한 외부 도구 연결을 어느 정도까지 운영할 수 있는지는 현재 기준으로는 사용 패턴에 따라 편차가 클 수 있습니다. 저장소 로드맵에도 추가 모델 확장과 제공자 통합이 계속 언급되는 만큼, 제품은 여전히 빠르게 진화하는 단계로 보는 편이 맞습니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian?ref=nigzu.com&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claudian의 핵심 가치는 AI를 노트 앱 안으로 가져오는 데 있지 않습니다. 더 정확히 말하면, Obsidian 볼트를 에이전트가 실제로 일하는 작업 공간으로 바꾸는 데 있습니다. 그래서 이 도구는 &amp;ldquo;답변을 잘하는 AI&amp;rdquo;보다 &amp;ldquo;문서를 다루는 AI 워크플로우&amp;rdquo;에 더 가깝습니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 Obsidian을 오래 써온 사용자, 기술 문서와 개발 메모를 함께 관리하는 개발자, 에이전트형 작업 환경을 실험하는 팀에게 잘 맞습니다. 반대로 가벼운 채팅형 AI만 원한다면 다소 과한 도구처럼 느껴질 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 판단 기준은 간단합니다. 내 작업이 &amp;ldquo;답변 받기&amp;rdquo; 중심인지, 아니면 &amp;ldquo;파일을 읽고 고치고 연결하는 일&amp;rdquo; 중심인지입니다. 후자라면 Claudian은 꽤 설득력 있는 선택지입니다.&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;b&gt;핵심 개념&lt;/b&gt;&lt;br /&gt;Claudian은 Obsidian 볼트를 AI 에이전트의 작업 디렉터리로 바꾸는 데스크톱 플러그인입니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;차별점&lt;/b&gt;&lt;br /&gt;일반 AI 플러그인처럼 대화만 하는 것이 아니라, 파일 읽기&amp;middot;쓰기&amp;middot;검색&amp;middot;Bash&amp;middot;다단계 워크플로우를 같은 환경에서 수행합니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;언제 쓰면 좋은지&lt;/b&gt;&lt;br /&gt;여러 문서를 참조하며 정리&amp;middot;수정&amp;middot;구조화하는 지식 작업, 개발 메모 운영, 반복 프롬프트를 작업 표준으로 축적하는 경우에 특히 유리합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;언제 쓰면 안 되는지&lt;/b&gt;&lt;br /&gt;짧은 질의응답 위주 사용, 로컬 CLI 설정이 부담스러운 환경, 제공자별 기능 차이를 감수하기 어려운 경우에는 기대보다 효율이 낮을 수 있습니다. (&lt;a href=&quot;https://github.com/YishenTu/claudian/blob/main/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;한 줄 요약&lt;/b&gt;&lt;br /&gt;Claudian은 Obsidian 안에 AI를 넣는 도구가 아니라, Obsidian 자체를 AI 작업공간으로 바꾸는 도구입니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AI</category>
      <author>행복한 수지아빠</author>
      <guid isPermaLink="true">https://javaexpert.tistory.com/1724</guid>
      <comments>https://javaexpert.tistory.com/1724#entry1724comment</comments>
      <pubDate>Fri, 10 Apr 2026 10:31:10 +0900</pubDate>
    </item>
    <item>
      <title>Multica:Claude Managed Agents 대체 오픈소스</title>
      <link>https://javaexpert.tistory.com/1723</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 앤트로픽이 공개한 &lt;b&gt;Claude Managed Agents&lt;/b&gt;와, 거의 동시에 등장한 오픈소스 프로젝트 &lt;b&gt;Multica&lt;/b&gt;가 무엇을 해결하려는지 정리한 글입니다. 핵심은 단순히 &amp;ldquo;비슷한 제품이 나왔다&amp;rdquo;가 아닙니다. 이제는 &lt;b&gt;에이전트를 잘 만드는 것보다, 에이전트를 안정적으로 실행하고 팀 워크플로우에 붙이는 인프라&lt;/b&gt;가 더 중요한 단계로 넘어가고 있다는 점입니다. (&lt;a href=&quot;https://platform.claude.com/docs/en/managed-agents/overview&quot;&gt;Claude Platform&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 Claude Managed Agents는 앤트로픽이 직접 제공하는 &lt;b&gt;관리형 에이전트 실행 환경&lt;/b&gt;이고, Multica는 그 문제를 &lt;b&gt;오픈소스&amp;middot;셀프호스팅&amp;middot;벤더 중립&lt;/b&gt; 방식으로 풀려는 프로젝트입니다. 둘 다 &amp;ldquo;모델 호출&amp;rdquo;을 넘어, 에이전트가 장시간 작업하고, 도구를 쓰고, 상태를 유지하고, 팀 안에서 일하게 만드는 데 초점을 둡니다. (&lt;a href=&quot;https://platform.claude.com/docs/en/managed-agents/overview&quot;&gt;Claude Platform&lt;/a&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;AI 에이전트를 실무 워크플로우에 넣고 싶은 개발자&lt;/li&gt;
&lt;li&gt;&amp;ldquo;LLM API 호출&amp;rdquo;과 &amp;ldquo;실제 운영 가능한 에이전트 시스템&amp;rdquo;의 차이를 이해하고 싶은 팀&lt;/li&gt;
&lt;li&gt;Claude Managed Agents 발표를 보고, Multica가 왜 바로 주목받았는지 알고 싶은 사람&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1775727607261&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - multica-ai/multica: The open-source managed agents platform. Turn coding agents into real teammates &amp;mdash; assign tasks, t&quot; data-og-description=&quot;The open-source managed agents platform. Turn coding agents into real teammates &amp;mdash; assign tasks, track progress, compound skills. - multica-ai/multica&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/multica-ai/multica&quot; data-og-url=&quot;https://github.com/multica-ai/multica&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/pKYFI/dJMb8T90r64/C7brMHKoTj67KtsEnnjlIk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bYk1c0/dJMb9efeWlq/Pg1AGikx6mHXOyVvNh2wAK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/eTbXA/dJMb9fZwizG/BBTaj9e566ex3719jLNwa0/img.png?width=1400&amp;amp;height=944&amp;amp;face=0_0_1400_944&quot;&gt;&lt;a href=&quot;https://github.com/multica-ai/multica&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/multica-ai/multica&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/pKYFI/dJMb8T90r64/C7brMHKoTj67KtsEnnjlIk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bYk1c0/dJMb9efeWlq/Pg1AGikx6mHXOyVvNh2wAK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/eTbXA/dJMb9fZwizG/BBTaj9e566ex3719jLNwa0/img.png?width=1400&amp;amp;height=944&amp;amp;face=0_0_1400_944');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - multica-ai/multica: The open-source managed agents platform. Turn coding agents into real teammates &amp;mdash; assign tasks, t&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The open-source managed agents platform. Turn coding agents into real teammates &amp;mdash; assign tasks, track progress, compound skills. - multica-ai/multica&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;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;p data-ke-size=&quot;size16&quot;&gt;기존에 많은 팀은 에이전트를 만들 때 &lt;b&gt;모델 프롬프트&lt;/b&gt; 자체보다, 그 주변 인프라를 직접 붙이느라 더 많은 시간을 씁니다. 예를 들어 에이전트 루프, 샌드박스, 파일 시스템, 장시간 실행, 중간 상태 저장, 도구 연결, 스트리밍, 권한 통제 같은 부분입니다. 앤트로픽도 Managed Agents를 소개하며 바로 이 점을 강조했습니다. &amp;ldquo;직접 agent loop, tool execution, runtime을 만들지 않아도 된다&amp;rdquo;는 것이 제품의 핵심 가치입니다. (&lt;a href=&quot;https://platform.claude.com/docs/en/managed-agents/overview&quot;&gt;Claude Platform&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서는 이런 문제가 반복됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;한 번 실행하고 끝나는 데모&lt;/b&gt;는 되는데, 몇 분~몇 시간 걸리는 실제 작업은 불안정하다.&lt;/li&gt;
&lt;li&gt;에이전트가 파일을 읽고 수정하고 명령을 실행하는 동안 &lt;b&gt;상태를 유지&lt;/b&gt;하기 어렵다.&lt;/li&gt;
&lt;li&gt;사람과 에이전트가 같은 작업 보드에서 협업하지 못해, 결국 사람이 프롬프트 복사&amp;middot;붙여넣기를 계속하게 된다.&lt;/li&gt;
&lt;li&gt;에이전트 실행 환경이 특정 벤더나 클라우드에 강하게 묶이면, 도입은 쉬워도 장기적으로 운영 선택지가 줄어든다. (&lt;a href=&quot;https://platform.claude.com/docs/en/managed-agents/overview&quot;&gt;Claude Platform&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&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;PR 리뷰나 버그 수정 작업을 에이전트에 맡기려 해도, 중간 실패 시 &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;a href=&quot;https://github.com/multica-ai/multica&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 지점에서 Claude Managed Agents와 Multica가 공통으로 겨냥하는 문제는 분명합니다. &lt;b&gt;에이전트를 &amp;ldquo;API 호출 결과&amp;rdquo;가 아니라 &amp;ldquo;운영되는 작업 주체&amp;rdquo;로 다루는 것&lt;/b&gt;입니다. (&lt;a href=&quot;https://platform.claude.com/docs/en/managed-agents/overview&quot;&gt;Claude Platform&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Multica란 무엇인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Multica는 코딩 에이전트를 팀의 실제 작업 단위에 연결해 주는 오픈소스 managed agents 플랫폼&lt;/b&gt;입니다. 저장소 소개 문구도 이를 아주 직접적으로 설명합니다. 이슈를 에이전트에게 할당하면, 에이전트가 작업을 집고, 코드를 작성하고, 진행 상황을 올리고, 막히면 보고한다는 식입니다. (&lt;a href=&quot;https://github.com/multica-ai/multica&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말하면 Multica는 다음을 묶어 줍니다.&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;결과와 상태를 다시 팀 UI로 가져오는 구조입니다. (&lt;a href=&quot;https://github.com/multica-ai/multica&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 방식과 다른 점은, 에이전트를 단순한 &amp;ldquo;채팅 인터페이스 뒤의 모델&amp;rdquo;이 아니라 &lt;b&gt;보드 위에서 일하는 팀원 같은 객체&lt;/b&gt;로 다룬다는 점입니다. Multica 문서에서도 에이전트가 보드에 나타나고, 댓글을 달고, 이슈를 만들고, blocker를 보고한다고 설명합니다. (&lt;a href=&quot;https://github.com/multica-ai/multica&quot;&gt;GitHub&lt;/a&gt;)&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;b&gt;오픈소스 managed agents 플랫폼&lt;/b&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/multica-ai/multica&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;벤더 중립 구조&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Claude Code와 Codex를 지원한다고 명시합니다. 특정 모델 제공자 하나에만 묶인 구조가 아닙니다. (&lt;a href=&quot;https://github.com/multica-ai/multica&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;에이전트를 팀원처럼 운영&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이슈 할당, 진행 상태 업데이트, blocker 보고, 댓글 참여 같은 협업 흐름을 전제로 합니다. (&lt;a href=&quot;https://github.com/multica-ai/multica&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;로컬 daemon + 웹 앱 조합&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로컬 머신에 daemon을 띄우고, 웹 앱에서 해당 런타임을 인식해 작업을 라우팅합니다. (&lt;a href=&quot;https://github.com/multica-ai/multica/blob/main/CLI_AND_DAEMON.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Reusable Skills&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 번 만든 해결 방식을 팀 차원의 재사용 가능한 skill로 축적하는 방향을 제시합니다. (&lt;a href=&quot;https://github.com/multica-ai/multica&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;멀티 워크스페이스와 런타임 통합&lt;/b&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/multica-ai/multica&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;에이전트 사용 방식이 &amp;ldquo;프롬프트 수동 운전&amp;rdquo;에서 &amp;ldquo;업무 시스템 편입&amp;rdquo;으로 바뀐다는 점&lt;/b&gt;입니다. Multica README는 이를 &amp;ldquo;copy-pasting prompts&amp;rdquo;와 &amp;ldquo;babysitting runs&amp;rdquo;를 줄이는 방향으로 설명합니다. 즉, 사람이 매번 작업 내용을 붙여넣고 결과를 옮기는 대신, 작업 보드 중심으로 에이전트를 운영하겠다는 뜻입니다. (&lt;a href=&quot;https://github.com/multica-ai/multica&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Managed Agents도 같은 문제를 다른 방식으로 풉니다. 앤트로픽이 제공하는 관리형 인프라 안에서 세션, 환경, 이벤트를 관리하고, 내장 도구와 서버 측 이벤트 스트리밍을 통해 장시간 작업을 안정적으로 운영하는 쪽입니다. 공개 문서 기준으로는 &lt;b&gt;에이전트/환경/세션/이벤트&lt;/b&gt;라는 네 가지 핵심 개념으로 구조를 잡고 있습니다. (&lt;a href=&quot;https://platform.claude.com/docs/en/managed-agents/overview&quot;&gt;Claude Platform&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비용 구조도 이 변화와 연결됩니다. Claude Managed Agents는 토큰 비용 외에 &lt;b&gt;세션 런타임당 시간 과금&lt;/b&gt;을 둡니다. 문서 기준 세션 런타임은 &lt;b&gt;시간당 0.08달러&lt;/b&gt;이며, 토큰 요금과 별도로 계산됩니다. 이 구조는 &amp;ldquo;한 번의 응답&amp;rdquo;보다 &amp;ldquo;지속 실행되는 세션&amp;rdquo;을 제품의 기본 단위로 보고 있다는 신호입니다. (&lt;a href=&quot;https://platform.claude.com/docs/en/about-claude/pricing?utm_source=chatgpt.com&quot;&gt;Claude Platform&lt;/a&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;/li&gt;
&lt;li&gt;파일 수정, 명령 실행, 웹 검색이 반복되는 작업을 자동화할 때&lt;/li&gt;
&lt;li&gt;한 명이 여러 에이전트의 진행 상황을 모니터링해야 할 때&lt;/li&gt;
&lt;li&gt;팀 차원의 재사용 가능한 작업 스킬을 쌓고 싶을 때 (&lt;a href=&quot;https://platform.claude.com/docs/en/managed-agents/overview&quot;&gt;Claude Platform&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;동작 원리 / 구조&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Claude Managed Agents의 구조&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앤트로픽 문서 기준으로 Claude Managed Agents는 아래 흐름으로 동작합니다. (&lt;a href=&quot;https://platform.claude.com/docs/en/managed-agents/overview&quot;&gt;Claude Platform&lt;/a&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;Agent 생성&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모델, 시스템 프롬프트, 도구, MCP 서버, skills를 정의합니다. (&lt;a href=&quot;https://platform.claude.com/docs/en/managed-agents/overview&quot;&gt;Claude Platform&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Environment 생성&lt;/b&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://platform.claude.com/docs/en/managed-agents/overview&quot;&gt;Claude Platform&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Session 시작&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 agent와 environment를 참조하는 실행 세션을 엽니다. (&lt;a href=&quot;https://platform.claude.com/docs/en/managed-agents/overview&quot;&gt;Claude Platform&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이벤트 송수신&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자가 메시지를 보내면, 에이전트가 도구를 자율적으로 실행하고 SSE로 결과를 스트리밍합니다. (&lt;a href=&quot;https://platform.claude.com/docs/en/managed-agents/overview&quot;&gt;Claude Platform&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;중간 개입&lt;/b&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://platform.claude.com/docs/en/managed-agents/overview&quot;&gt;Claude Platform&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심은 &lt;b&gt;모델 호출이 아니라 세션 운영&lt;/b&gt;입니다. 그래서 long-running execution, stateful sessions, secure container, built-in tools가 전면에 나옵니다. (&lt;a href=&quot;https://platform.claude.com/docs/en/managed-agents/overview&quot;&gt;Claude Platform&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Multica의 구조&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Multica는 공개 README 기준으로 아래와 같은 구조입니다. (&lt;a href=&quot;https://github.com/multica-ai/multica&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;Next.js Frontend
   ↕
Go Backend (Chi + WebSocket)
   ↕
PostgreSQL (pgvector)
   ↕
Agent Daemon (사용자 머신 또는 런타임)
   ↕
Claude Code / Codex
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조를 단계로 풀면 이렇습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;웹 앱에서 워크스페이스와 에이전트를 관리&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보드, 이슈, 에이전트, 런타임을 UI에서 다룹니다. (&lt;a href=&quot;https://github.com/multica-ai/multica&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;로컬 머신에 multica daemon 실행&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CLI로 로그인하고 daemon을 띄우면, 해당 머신이 실행 가능한 runtime으로 등록됩니다. (&lt;a href=&quot;https://github.com/multica-ai/multica/blob/main/CLI_AND_DAEMON.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;daemon이 사용 가능한 에이전트 CLI 자동 감지&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PATH에 있는 claude나 codex 등을 찾아 어떤 작업을 어디서 실행할지 판단합니다. (&lt;a href=&quot;https://github.com/multica-ai/multica&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이슈를 에이전트에게 할당&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;작업 보드 또는 CLI에서 issue를 만들고 agent에 assign합니다. (&lt;a href=&quot;https://github.com/multica-ai/multica&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;agent가 로컬/클라우드 runtime에서 실행&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;daemon이 격리된 환경을 만들고 실제 작업을 수행한 뒤, 결과를 서버와 UI에 다시 보고합니다. (&lt;a href=&quot;https://github.com/multica-ai/multica&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 보면 Multica는 Claude Managed Agents의 &amp;ldquo;관리형 실행 인프라&amp;rdquo;와 비슷한 사용자 경험을, &lt;b&gt;웹 앱 + daemon + 오픈소스 런타임 라우팅&lt;/b&gt;으로 재구성한 형태에 가깝습니다. 다만 공개 문서 기준으로는 Anthropic의 완전한 기능 범위와 1:1 동등성을 공식 보장하는 것은 아닙니다. 예를 들어 Anthropic 문서에는 outcomes, multiagent, memory 같은 일부 기능이 research preview로 따로 구분되어 있습니다. (&lt;a href=&quot;https://platform.claude.com/docs/en/managed-agents/overview&quot;&gt;Claude Platform&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치 / 사용 방법&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Multica 빠른 시작&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공개된 CLI 가이드 기준으로 가장 빠른 흐름은 아래와 같습니다. (&lt;a href=&quot;https://github.com/multica-ai/multica/blob/main/CLI_AND_DAEMON.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;# 설치
brew tap multica-ai/tap
brew install multica

# 로그인
multica login

# 로컬 런타임 시작
multica daemon start
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 후에는 daemon이 사용자가 속한 워크스페이스를 찾고 watch list에 추가합니다. watched workspace에 할당된 작업만 현재 머신에서 실행됩니다. (&lt;a href=&quot;https://github.com/multica-ai/multica/blob/main/CLI_AND_DAEMON.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;워크스페이스 관련 자주 쓰는 명령은 다음과 같습니다. (&lt;a href=&quot;https://github.com/multica-ai/multica/blob/main/CLI_AND_DAEMON.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;# 워크스페이스 목록 확인
multica workspace list

# 특정 워크스페이스 감시 시작/중지
multica workspace watch &amp;lt;workspace-id&amp;gt;
multica workspace unwatch &amp;lt;workspace-id&amp;gt;

# 상세 정보 확인
multica workspace get &amp;lt;workspace-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 다음 흐름은 문서상 아래 순서입니다. (&lt;a href=&quot;https://github.com/multica-ai/multica&quot;&gt;GitHub&lt;/a&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;Runtime&lt;/b&gt;이 활성 상태인지 확인&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Settings &amp;rarr; Agents&lt;/b&gt;에서 새 agent 생성&lt;/li&gt;
&lt;li&gt;provider로 Claude Code 또는 Codex 선택&lt;/li&gt;
&lt;li&gt;보드에서 issue를 만들고 agent에 할당&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;gauss&quot;&gt;&lt;code&gt;# CLI에서 이슈 생성 예시
multica issue create
&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;README의 Self-Host 섹션 기준 최소 흐름은 이렇습니다. (&lt;a href=&quot;https://github.com/multica-ai/multica&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;git clone https://github.com/multica-ai/multica.git
cd multica
cp .env.example .env
# .env에서 최소한 JWT_SECRET 변경

docker compose up -d
cd server &amp;amp;&amp;amp; go run ./cmd/migrate up &amp;amp;&amp;amp; cd ..
make start
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 환경 요구사항도 비교적 명확합니다. README 기준으로 Node.js v20+, pnpm v10.28+, Go v1.26+, Docker가 필요합니다. (&lt;a href=&quot;https://github.com/multica-ai/multica&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;pnpm install
cp .env.example .env
make setup
make start
&lt;/code&gt;&lt;/pre&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;버그 이슈를 만들고 agent에 assign하면, 에이전트가 관련 파일을 읽고 수정하고 진행 상태를 보드에 올리는 흐름입니다. 반복적인 소규모 수정 작업에서 특히 잘 맞습니다. Multica와 Anthropic 모두 파일 작업과 명령 실행을 핵심 전제로 둡니다. (&lt;a href=&quot;https://github.com/multica-ai/multica&quot;&gt;GitHub&lt;/a&gt;)&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;단순 Q&amp;amp;A가 아니라 몇 분~몇 시간 이어지는 작업은 세션 관리가 중요합니다. Claude Managed Agents는 이 점을 long-running execution, stateful sessions로 설명하고, Multica는 daemon과 runtime 개념으로 대응합니다. (&lt;a href=&quot;https://platform.claude.com/docs/en/managed-agents/overview&quot;&gt;Claude Platform&lt;/a&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;슬랙이나 채팅창이 아니라 작업 보드에서 에이전트를 운영하면, 누가 무엇을 하고 있는지 보기가 쉬워집니다. 사람과 에이전트를 같은 assignable entity처럼 다루고 싶은 팀에 유용합니다. (&lt;a href=&quot;https://github.com/multica-ai/multica&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) 반복 작업의 skill 축적&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배포, 마이그레이션, 코드 리뷰처럼 비슷한 해결 패턴을 계속 쓰는 팀은 reusable skills 개념의 효과가 큽니다. Anthropic도 Managed Agents에서 skills를 핵심 구성 요소로 포함하고 있습니다. (&lt;a href=&quot;https://github.com/multica-ai/multica&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5) 벤더 종속성 완화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 모델 제공자의 관리형 서비스에만 올인하기 부담스러운 팀은, Multica처럼 Claude Code와 Codex를 함께 지원하는 구조가 매력적일 수 있습니다. 문서상 확인되는 범위에서는 Multica가 vendor-neutral을 명시적으로 내세웁니다. (&lt;a href=&quot;https://github.com/multica-ai/multica&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&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;Multica가 Claude Managed Agents와 완전히 동일하다고 단정하면 안 됩니다.&lt;/b&gt; 공개 자료 기준으로는 문제 정의와 사용자 경험이 매우 유사하지만, 앤트로픽의 관리형 인프라에는 secure sandboxing, built-in tools, prompt caching, compaction, SSE, research preview 기능 등 플랫폼 레벨 요소가 포함되어 있습니다. Multica는 현재 공개 README 기준으로 그중 상당 부분을 오픈소스 방식으로 재현하려는 프로젝트로 보는 편이 정확합니다. (&lt;a href=&quot;https://platform.claude.com/docs/en/managed-agents/overview&quot;&gt;Claude Platform&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 Multica는 로컬 daemon과 실제 agent CLI 환경에 의존합니다. 즉, Claude Code나 Codex 같은 실행 주체가 머신에 준비되어 있어야 하고, 런타임 연결과 운영은 사용자가 직접 관리해야 합니다. 관리형 서비스보다 자유도가 높은 대신, 운영 책임도 더 큽니다. (&lt;a href=&quot;https://github.com/multica-ai/multica&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Managed Agents 역시 아직 베타입니다. 모든 엔드포인트에 managed-agents-2026-04-01 베타 헤더가 필요하고, 일부 기능은 research preview로 따로 구분됩니다. 프로덕션 적용 전에는 API와 동작 변화 가능성을 염두에 둬야 합니다. (&lt;a href=&quot;https://platform.claude.com/docs/en/managed-agents/overview&quot;&gt;Claude Platform&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 비용 구조도 봐야 합니다. Claude Managed Agents는 토큰뿐 아니라 세션 런타임 비용도 붙습니다. 반대로 셀프호스팅 오픈소스는 표면상 &amp;ldquo;무료&amp;rdquo;처럼 보여도, 실제로는 운영 인프라&amp;middot;보안&amp;middot;모니터링&amp;middot;유지보수 비용이 들어갑니다. 무엇이 더 싸다고 단정하기보다, &lt;b&gt;누가 운영 책임을 지는지&lt;/b&gt;를 먼저 봐야 합니다. (&lt;a href=&quot;https://platform.claude.com/docs/en/about-claude/pricing?utm_source=chatgpt.com&quot;&gt;Claude Platform&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 흐름에서 중요한 건 &amp;ldquo;Anthropic 발표 직후 오픈소스가 바로 따라왔다&amp;rdquo;는 속도 자체보다, &lt;b&gt;에이전트 시장의 경쟁 축이 모델 성능에서 운영 인프라로 이동하고 있다는 점&lt;/b&gt;입니다. Claude Managed Agents는 이를 공식 플랫폼 기능으로 묶어냈고, Multica는 같은 문제를 오픈소스와 셀프호스팅으로 풀겠다는 신호를 강하게 보냈습니다. (&lt;a href=&quot;https://platform.claude.com/docs/en/managed-agents/overview&quot;&gt;Claude Platform&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 실무에서 중요한 질문은 이것입니다.&lt;br /&gt;&lt;b&gt;우리 팀은 에이전트를 &amp;ldquo;가끔 쓰는 도구&amp;rdquo;로 둘 것인가, 아니면 &amp;ldquo;지속적으로 일하는 작업 주체&amp;rdquo;로 편입할 것인가.&lt;/b&gt; Claude Managed Agents와 Multica는 둘 다 후자를 향합니다. 차이는 관리형 플랫폼을 택할지, 오픈소스 런타임을 택할지에 있습니다. (&lt;a href=&quot;https://platform.claude.com/docs/en/managed-agents/overview&quot;&gt;Claude Platform&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 아래 같은 팀이라면 Multica를 눈여겨볼 만합니다.&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 Code, Codex 같은 도구를 이미 쓰고 있는 팀&lt;/li&gt;
&lt;li&gt;특정 벤더에 종속되지 않는 운영 구조를 원하는 팀&lt;/li&gt;
&lt;li&gt;셀프호스팅과 커스터마이징 자유도가 중요한 팀 (&lt;a href=&quot;https://github.com/multica-ai/multica&quot;&gt;GitHub&lt;/a&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 Managed Agents는 &lt;b&gt;관리형 에이전트 실행 인프라&lt;/b&gt;이고, Multica는 이를 &lt;b&gt;오픈소스&amp;middot;벤더 중립 방식&lt;/b&gt;으로 풀려는 프로젝트입니다. (&lt;a href=&quot;https://platform.claude.com/docs/en/managed-agents/overview&quot;&gt;Claude Platform&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;둘 다 공통적으로 &lt;b&gt;장시간 실행, 상태 유지, 도구 사용, 팀 워크플로우 통합&lt;/b&gt; 문제를 해결하려고 합니다. (&lt;a href=&quot;https://platform.claude.com/docs/en/managed-agents/overview&quot;&gt;Claude Platform&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Multica는 &lt;b&gt;보드 기반 협업 + 로컬 daemon + runtime 라우팅&lt;/b&gt; 구조가 핵심입니다. (&lt;a href=&quot;https://github.com/multica-ai/multica&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Claude Managed Agents는 문서 기준으로 &lt;b&gt;Agent / Environment / Session / Events&lt;/b&gt; 중심 구조이며, 런타임은 Anthropic이 관리합니다. (&lt;a href=&quot;https://platform.claude.com/docs/en/managed-agents/overview&quot;&gt;Claude Platform&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;지금 실무에서 중요한 것은 새 도구를 아는 것보다, &lt;b&gt;이런 인프라를 팀 워크플로우에 얼마나 빨리 연결하느냐&lt;/b&gt;입니다. 이 흐름이 앞으로 더 빨라질 가능성이 큽니다. (&lt;a href=&quot;https://www.wired.com/story/anthropic-launches-claude-managed-agents?utm_source=chatgpt.com&quot;&gt;WIRED&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AI</category>
      <author>행복한 수지아빠</author>
      <guid isPermaLink="true">https://javaexpert.tistory.com/1723</guid>
      <comments>https://javaexpert.tistory.com/1723#entry1723comment</comments>
      <pubDate>Thu, 9 Apr 2026 18:40:37 +0900</pubDate>
    </item>
    <item>
      <title>Agent Skills의 /spec 에 알아보자</title>
      <link>https://javaexpert.tistory.com/1722</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 Google Cloud AI 디렉터 Addy Osmani가 만든 agent-skills의 6단계 프로세스 중, 첫 단계인 &lt;b&gt;DEFINE&lt;/b&gt;을 정리한 글입니다. 특히 DEFINE 단계에서 사용하는 /spec 명령이 왜 중요한지, 그리고 이 명령이 단순히 &amp;ldquo;앱을 만들어주는 기능&amp;rdquo;이 아니라 &lt;b&gt;요구사항을 명확하게 만드는 도구&lt;/b&gt;라는 점을 중심으로 설명합니다. (&lt;a href=&quot;https://github.com/addyosmani/agent-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 AI 코딩 에이전트를 쓰면 보통 이렇게 요청하게 됩니다.&lt;br /&gt;&amp;ldquo;할 일 앱을 만들어줘.&amp;rdquo;&lt;br /&gt;문제는 이 한 문장만으로는 화면 범위, 저장 방식, 로그인 필요 여부, 우선순위 기능, 테스트 기준이 전혀 정해지지 않는다는 점입니다. agent-skills의 /spec은 바로 이 모호함을 줄이기 위해 존재합니다. 코드를 먼저 쓰는 대신, &lt;b&gt;무엇을 만들지 문서로 먼저 고정&lt;/b&gt;하게 만듭니다. (&lt;a href=&quot;https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/addyosmani/agent-skills&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1775709017238&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;agent-skills/skills/spec-driven-development/SKILL.md at main &amp;middot; addyosmani/agent-skills&quot; data-og-description=&quot;Production-grade engineering skills for AI coding agents. - addyosmani/agent-skills&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md&quot; data-og-url=&quot;https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cZIcAU/dJMb8RRSPio/XUSKNThQbYWdTFz9PHn981/img.png?width=1200&amp;amp;height=600&amp;amp;face=975_121_1057_211,https://scrap.kakaocdn.net/dn/nezpD/dJMb8WeAztJ/njwmob7NkV0hLZc3N3THm1/img.png?width=1200&amp;amp;height=600&amp;amp;face=975_121_1057_211&quot;&gt;&lt;a href=&quot;https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cZIcAU/dJMb8RRSPio/XUSKNThQbYWdTFz9PHn981/img.png?width=1200&amp;amp;height=600&amp;amp;face=975_121_1057_211,https://scrap.kakaocdn.net/dn/nezpD/dJMb8WeAztJ/njwmob7NkV0hLZc3N3THm1/img.png?width=1200&amp;amp;height=600&amp;amp;face=975_121_1057_211');&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;agent-skills/skills/spec-driven-development/SKILL.md at main &amp;middot; addyosmani/agent-skills&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Production-grade engineering skills for AI coding agents. - addyosmani/agent-skills&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글을 읽으면 다음을 이해할 수 있습니다.&lt;br /&gt;첫째, 왜 AI에게 바로 구현을 시키는 방식이 종종 아쉬운 결과로 이어지는지.&lt;br /&gt;둘째, /spec이 어떤 식으로 질문을 던지고 문서를 만드는지.&lt;br /&gt;셋째, 왜 이 과정이 실무에서 결과 품질을 크게 좌우하는지입니다.&lt;br /&gt;기획이 흐릿한 상태에서 AI를 쓰고 있는 개발자, 또는 &amp;ldquo;AI가 코드는 빨리 짜는데 결과가 자꾸 엇나간다&amp;rdquo;고 느끼는 개발자에게 특히 도움이 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;왜 이 문제가 중요한가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 코딩 에이전트는 속도가 빠릅니다.&lt;br /&gt;하지만 속도가 빠르다는 것과, &lt;b&gt;원하는 것을 정확히 만든다&lt;/b&gt;는 것은 전혀 다른 문제입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 방식의 가장 흔한 문제는 &amp;ldquo;대충 요청하고 바로 구현 들어가기&amp;rdquo;입니다.&lt;br /&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;br /&gt;&amp;ldquo;할 일 앱&amp;rdquo;이라고 했는데 AI가 필터, 태그, 로그인, 다크모드까지 넣어버릴 수 있습니다. 반대로 정말 필요한 반복 일정이나 우선순위 기능은 빠질 수도 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용자 기대와 결과물이 어긋납니다&lt;/b&gt;&lt;br /&gt;사용자는 모바일 중심 앱을 생각했는데, AI는 데스크톱 웹 기준으로 만들 수 있습니다. 저장도 로컬스토리지인지, 서버 DB인지 달라질 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;테스트 기준이 없어 검증이 애매해집니다&lt;/b&gt;&lt;br /&gt;&amp;ldquo;잘 동작한다&amp;rdquo;는 말만 있고 성공 조건이 없으면, 어디까지가 완료인지 판단하기 어렵습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;구조와 경계가 불명확해집니다&lt;/b&gt;&lt;br /&gt;어떤 폴더에 무엇을 둘지, 어떤 변경은 먼저 물어봐야 하는지, 어떤 것은 절대 하면 안 되는지 기준이 없으면 결과물이 금방 산만해집니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;수정 비용이 뒤로 밀립니다&lt;/b&gt;&lt;br /&gt;처음에는 빨라 보이지만, 나중에 &amp;ldquo;이건 내가 원한 게 아닌데?&amp;rdquo;가 나오면 다시 설명하고 다시 수정해야 합니다. 결국 초기 요구사항 정리가 더 싸게 먹힙니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;agent-skills는 이런 문제를 해결하기 위해 개발 과정을 &lt;b&gt;DEFINE &amp;rarr; PLAN &amp;rarr; BUILD &amp;rarr; VERIFY &amp;rarr; REVIEW &amp;rarr; SHIP&lt;/b&gt;으로 나누고, 각 단계에 맞는 스킬과 명령을 연결합니다. 이때 /spec은 DEFINE 단계의 대표 진입점입니다. (&lt;a href=&quot;https://github.com/addyosmani/agent-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Agent Skills의 /spec이란 무엇인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 문장으로 정리하면, /spec은 &lt;b&gt;코드를 쓰기 전에 요구사항과 성공 기준을 문서로 정리하게 만드는 명령&lt;/b&gt;입니다. (&lt;a href=&quot;https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 점은 이것입니다.&lt;br /&gt;/spec을 쓰기 전에는 &amp;ldquo;할 일 앱을 만들어줘&amp;rdquo;가 &lt;b&gt;곧바로 구현 요청&lt;/b&gt;으로 해석될 수 있습니다.&lt;br /&gt;하지만 /spec을 사용하면 같은 요청도 &lt;b&gt;명세 작성의 출발점&lt;/b&gt;으로 바뀝니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 에이전트는 바로 앱을 만들지 않습니다.&lt;br /&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;a href=&quot;https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 차이가 생각보다 큽니다.&lt;br /&gt;결국 /spec은 &amp;ldquo;AI가 더 똑똑해지는 기능&amp;rdquo;이라기보다, &lt;b&gt;AI가 멋대로 추측하지 못하게 만드는 장치&lt;/b&gt;에 가깝습니다.&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;b&gt;코드보다 스펙을 먼저 둡니다&lt;/b&gt;&lt;br /&gt;저장소 README에서도 /spec의 핵심 원칙을 &amp;ldquo;Spec before code&amp;rdquo;로 설명합니다. (&lt;a href=&quot;https://github.com/addyosmani/agent-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;모호한 요구를 그대로 넘기지 않습니다&lt;/b&gt;&lt;br /&gt;requirements가 ambiguous 하거나 vague idea 수준일 때 쓰라고 명시돼 있습니다. (&lt;a href=&quot;https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;가정을 먼저 드러냅니다&lt;/b&gt;&lt;br /&gt;&amp;ldquo;웹 앱인지&amp;rdquo;, &amp;ldquo;인증이 필요한지&amp;rdquo;, &amp;ldquo;DB가 무엇인지&amp;rdquo; 같은 가정을 숨기지 않고 먼저 밝히게 합니다. (&lt;a href=&quot;https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;질문을 통해 요구사항을 구체화합니다&lt;/b&gt;&lt;br /&gt;사람에게 clarifying questions를 던져 요구를 concrete 하게 만들도록 설계돼 있습니다. (&lt;a href=&quot;https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;문서의 필수 항목이 정해져 있습니다&lt;/b&gt;&lt;br /&gt;Objective, Commands, Project Structure, Code Style, Testing Strategy, Boundaries 같은 핵심 항목을 반드시 포함하도록 안내합니다. (&lt;a href=&quot;https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;검토와 승인 단계를 전제로 합니다&lt;/b&gt;&lt;br /&gt;스펙은 사람과 AI의 공통 기준 문서이며, 구현 전에 사람의 리뷰와 승인을 받는 흐름을 전제로 합니다. (&lt;a href=&quot;https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실제로 어떤 효과가 있는가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공개된 자료 기준으로 agent-skills는 /spec을 포함한 명령을 통해 &lt;b&gt;개발 생명주기의 각 단계를 분리&lt;/b&gt;하고, 각 단계마다 검증 가능한 워크플로를 따르도록 설계돼 있습니다. 특히 spec-driven-development는 새 프로젝트, 새 기능, 중요한 변경처럼 범위가 큰 작업에서 먼저 스펙을 만들라고 권장합니다. (&lt;a href=&quot;https://github.com/addyosmani/agent-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;막연한 요청을 바로 코드로 바꾸면, AI가 알아서 비어 있는 부분을 채웁니다.&lt;br /&gt;문제는 그 &amp;ldquo;알아서&amp;rdquo;가 사용자 의도와 맞지 않을 수 있다는 점입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/spec을 거치면 최소한 다음이 정리됩니다.&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;a href=&quot;https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) &amp;ldquo;완료&amp;rdquo;의 기준이 생깁니다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 스킬은 vague한 요구를 &lt;b&gt;success criteria&lt;/b&gt;로 다시 쓰라고 합니다.&lt;br /&gt;예를 들어 &amp;ldquo;더 빠르게 해줘&amp;rdquo;를 &amp;ldquo;LCP 2.5초 미만&amp;rdquo;, &amp;ldquo;초기 로드 500ms 미만&amp;rdquo; 같은 식으로 바꾸는 예시를 제시합니다. (&lt;a href=&quot;https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 실무에서 매우 중요합니다.&lt;br /&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;요구사항이 잘못된 상태에서 코드를 먼저 만드는 것보다,&lt;br /&gt;초기에 질문 몇 개 더 받고 문서를 고치는 편이 훨씬 저렴합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 여러 파일을 건드리거나 구조적 결정을 내려야 하는 작업은, 문서 없이 바로 구현에 들어가면 되돌리기 비용이 커집니다. agent-skills도 이런 경우에 /spec 사용을 권장합니다. (&lt;a href=&quot;https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) 사람과 AI가 같은 기준을 보게 됩니다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서상 확인되는 범위에서, 스펙은 &lt;b&gt;human engineer와 agent 사이의 shared source of truth&lt;/b&gt;로 설명됩니다. 즉, 대화 로그가 아니라 문서가 기준이 됩니다. (&lt;a href=&quot;https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 팀 작업에서도 유리합니다.&lt;br /&gt;나중에 다른 사람이 봐도 &amp;ldquo;왜 이렇게 만들었는지&amp;rdquo;를 추적할 수 있기 때문입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;동작 원리 / 구조&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;spec-driven-development는 단순히 &amp;ldquo;문서 하나 써라&amp;rdquo; 수준이 아닙니다.&lt;br /&gt;문서상 이 스킬은 아래와 같은 &lt;b&gt;4단계 게이트형 워크플로&lt;/b&gt;를 제시합니다.&lt;br /&gt;SPECIFY &amp;rarr; PLAN &amp;rarr; TASKS &amp;rarr; IMPLEMENT 순서이며, 각 단계는 사람의 검토를 전제로 합니다. (&lt;a href=&quot;https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Specify&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 먼저 높은 수준의 아이디어를 받습니다.&lt;br /&gt;그리고 요구사항이 구체화될 때까지 질문을 던집니다. (&lt;a href=&quot;https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 단계의 핵심은 두 가지입니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;가정을 먼저 공개한다&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;모호한 표현을 성공 기준으로 바꾼다&lt;/b&gt;&lt;/li&gt;
&lt;/ol&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;데이터는 어디에 저장하는가&lt;/li&gt;
&lt;li&gt;완료 조건은 무엇인가&lt;/li&gt;
&lt;li&gt;어느 정도 품질이면 &amp;ldquo;끝났다&amp;rdquo;고 볼 것인가&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Plan&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;/li&gt;
&lt;li&gt;의존 관계 정리&lt;/li&gt;
&lt;li&gt;구현 순서 결정&lt;/li&gt;
&lt;li&gt;위험 요소와 대응 방안 정리&lt;/li&gt;
&lt;li&gt;검증 포인트 설정 (&lt;a href=&quot;https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. Tasks&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;/li&gt;
&lt;li&gt;수용 기준이 명확하게&lt;/li&gt;
&lt;li&gt;검증 단계가 포함되게&lt;/li&gt;
&lt;li&gt;의존성 순서대로 정렬되게&lt;/li&gt;
&lt;li&gt;너무 많은 파일을 한 번에 건드리지 않게 (&lt;a href=&quot;https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. Implement&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그제야 구현에 들어갑니다.&lt;br /&gt;즉, /spec은 사실상 &amp;ldquo;구현 전에 문제 정의와 완료 기준을 잠그는 장치&amp;rdquo;입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치 / 사용 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;agent-skills 저장소 기준으로 Claude Code에서는 플러그인 형태로 설치할 수 있습니다. 저장소 README에는 아래 방식이 안내되어 있습니다. (&lt;a href=&quot;https://github.com/addyosmani/agent-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;/plugin marketplace add addyosmani/agent-skills
/plugin install agent-skills@addy-agent-skills
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬 저장소를 직접 연결하는 방식도 있습니다.&lt;/p&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;git clone https://github.com/addyosmani/agent-skills.git
claude --plugin-dir /path/to/agent-skills
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서상 agent-skills는 Claude Code 외에도 Cursor, Gemini CLI, Windsurf, GitHub Copilot 등에서 사용할 수 있고, 기본적으로는 SKILL.md를 규칙 파일이나 시스템 프롬프트에 넣어 쓰는 구조입니다. (&lt;a href=&quot;https://github.com/addyosmani/agent-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;/spec 기본 사용 흐름&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가볍게 감을 잡으려면 이렇게 볼 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;/spec
할일 앱을 만들어줘
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 점은, /spec 없이 요청했을 때와 결과가 달라진다는 것입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;/spec 없이 요청&lt;br /&gt;&amp;rarr; 에이전트가 바로 구현으로 들어갈 수 있음&lt;/li&gt;
&lt;li&gt;/spec과 함께 요청&lt;br /&gt;&amp;rarr; 에이전트가 먼저 요구사항을 구체화하고 스펙 문서를 작성하려고 함 (&lt;a href=&quot;https://github.com/addyosmani/agent-skills&quot;&gt;GitHub&lt;/a&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;문서상 /spec이 만드는 스펙은 대략 이런 구조를 가집니다. (&lt;a href=&quot;https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# Spec: [Project/Feature Name]

## Objective
[무엇을 왜 만드는지]

## Tech Stack
[프레임워크, 언어, 주요 의존성]

## Commands
[build, test, lint, dev 명령]

## Project Structure
[디렉터리 구조]

## Code Style
[코드 스타일 예시와 규칙]

## Testing Strategy
[테스트 도구, 위치, 범위]

## Boundaries
- Always: [...]
- Ask first: [...]
- Never: [...]

## Success Criteria
[완료 조건]

## Open Questions
[아직 결정되지 않은 부분]
&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;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;&amp;ldquo;할 일 앱 만들어줘&amp;rdquo;,&lt;br /&gt;&amp;ldquo;사내 대시보드 하나 필요해&amp;rdquo;,&lt;br /&gt;&amp;ldquo;간단한 관리자 페이지가 있으면 좋겠어&amp;rdquo; 같은 요청은 대부분 너무 넓습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이럴 때 /spec은 막연한 아이디어를 바로 코드로 바꾸지 않고, 먼저 범위를 좁히는 데 유용합니다. (&lt;a href=&quot;https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md&quot;&gt;GitHub&lt;/a&gt;)&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;로그인 추가, 결제 도입, 검색 기능 확장처럼 한 군데만 건드려서 끝나지 않는 작업은 설계가 먼저 필요합니다.&lt;br /&gt;문서상 이 스킬도 &lt;b&gt;multiple files or modules&lt;/b&gt;에 걸치는 변경에서 쓰라고 안내합니다. (&lt;a href=&quot;https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md&quot;&gt;GitHub&lt;/a&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;서버에서 처리할지, 클라이언트에서 처리할지.&lt;br /&gt;로컬 저장인지 DB 저장인지.&lt;br /&gt;세션 기반 인증인지 토큰 기반 인증인지.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 결정은 초기에 안 박아두면 구현 중간에 흔들리기 쉽습니다. /spec은 이런 가정을 먼저 표면으로 끌어올립니다. (&lt;a href=&quot;https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 팀원과 AI가 같은 기준을 봐야 할 때&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혼자 개발할 때보다 팀 작업에서 더 유용합니다.&lt;br /&gt;&amp;ldquo;대화로만 합의된 요구사항&amp;rdquo;은 금방 잊히지만, 스펙 문서는 기준점이 됩니다.&lt;br /&gt;저장소 문서도 스펙과 태스크 아티팩트를 버전 관리 안에서 공유된 기준으로 유지하라고 설명합니다. (&lt;a href=&quot;https://github.com/addyosmani/agent-skills/blob/main/docs/getting-started.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. AI가 자꾸 엇나간 결과를 낼 때&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI가 코드는 빨리 쓰는데 결과가 원하는 방향과 어긋난다면, 많은 경우 문제는 모델 성능이 아니라 &lt;b&gt;입력 요구사항의 불명확함&lt;/b&gt;입니다. /spec은 바로 그 문제를 다루는 단계입니다.&lt;/p&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;작은 수정에는 오히려 과할 수 있습니다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서상 이 스킬은 단순 오타 수정, 한 줄짜리 수정, 요구사항이 아주 명확한 변경에는 적합하지 않다고 설명합니다. (&lt;a href=&quot;https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 모든 작업에 /spec을 붙이는 것이 정답은 아닙니다.&lt;br /&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;처음에는 &amp;ldquo;그냥 만들어주면 되는데 왜 이렇게 많이 묻지?&amp;rdquo;라는 느낌이 들 수 있습니다.&lt;br /&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;agent-skills의 워크플로는 각 단계에서 human review를 전제로 합니다.&lt;br /&gt;즉, 문서를 잘 만들어도 마지막 판단은 사람이 해야 합니다. (&lt;a href=&quot;https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md&quot;&gt;GitHub&lt;/a&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;좋은 스펙은 좋은 출발점이지, 자동 완성 버튼은 아닙니다.&lt;br /&gt;이후에도 /plan, /build, /test, /review, /ship 같은 다음 단계가 필요합니다. 저장소 역시 전체 라이프사이클을 분리해서 운영하는 구조를 제시합니다. (&lt;a href=&quot;https://github.com/addyosmani/agent-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;agent-skills의 /spec은 &amp;ldquo;AI에게 더 자세히 말해라&amp;rdquo; 수준의 팁이 아닙니다.&lt;br /&gt;이 명령은 &lt;b&gt;정의되지 않은 요구를 먼저 정의된 문서로 바꾸는 단계&lt;/b&gt;를 강제합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 &amp;ldquo;할 일 앱을 만들어줘&amp;rdquo;라는 요청도,&lt;br /&gt;그냥 던지면 구현이 시작될 수 있고,&lt;br /&gt;/spec과 함께 던지면 요구사항 정리부터 시작합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 차이가 실무에서는 꽤 큽니다.&lt;br /&gt;좋은 결과물은 종종 더 좋은 모델보다, 더 좋은 문제 정의에서 나옵니다.&lt;br /&gt;결국 이 도구는 &lt;b&gt;AI에게 일을 시키기 전에, 내가 무엇을 원하는지 먼저 정리하고 싶은 개발자&lt;/b&gt;에게 특히 유용합니다.&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;/spec은 코드를 바로 만드는 명령이 아니라, &lt;b&gt;요구사항 문서를 먼저 만드는 DEFINE 단계의 도구&lt;/b&gt;입니다. (&lt;a href=&quot;https://github.com/addyosmani/agent-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;이 스킬은 모호한 요구를 그대로 넘기지 않고, &lt;b&gt;가정을 먼저 드러내고 질문을 통해 구체화&lt;/b&gt;합니다. (&lt;a href=&quot;https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;스펙에는 Objective, Commands, Project Structure, Code Style, Testing Strategy, Boundaries, Success Criteria 등이 포함됩니다. (&lt;a href=&quot;https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;장점은 구현 전에 방향을 맞추고, 완료 기준을 명확히 하며, 사람과 AI가 같은 기준 문서를 보게 만든다는 점입니다. (&lt;a href=&quot;https://github.com/addyosmani/agent-skills/blob/main/docs/getting-started.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;다만 작은 수정에는 과할 수 있고, 결국 사람의 리뷰와 판단은 계속 필요합니다. (&lt;a href=&quot;https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AI</category>
      <author>행복한 수지아빠</author>
      <guid isPermaLink="true">https://javaexpert.tistory.com/1722</guid>
      <comments>https://javaexpert.tistory.com/1722#entry1722comment</comments>
      <pubDate>Thu, 9 Apr 2026 13:30:47 +0900</pubDate>
    </item>
    <item>
      <title>브라우저만으로 지오코딩 사용하기</title>
      <link>https://javaexpert.tistory.com/1721</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;보통 지오코딩이라고 하면 Google Maps API나 별도 geocoding 서버를 떠올립니다. 그런데 이 프로젝트는 &lt;b&gt;DuckDB-WASM으로 브라우저 안에 SQL 엔진을 올리고&lt;/b&gt;, &lt;b&gt;Overture Maps 주소 데이터를 Parquet 파일로 직접 조회&lt;/b&gt;해서 정방향/역방향 지오코딩을 처리합니다. README 기준으로 &lt;b&gt;4억 6,900만 건 이상 주소&lt;/b&gt;, &lt;b&gt;39개국 지원&lt;/b&gt;, &lt;b&gt;지도 클릭 기반 reverse geocoding&lt;/b&gt;, &lt;b&gt;H3 타일 기반 조회 최적화&lt;/b&gt;까지 포함합니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 도구는 특히 다음 독자에게 도움이 됩니다. &lt;b&gt;지도 서비스나 위치 검색 UI를 만드는 프론트엔드 개발자&lt;/b&gt;, &lt;b&gt;지오스페이셜 데이터 처리 흐름을 이해하고 싶은 개발자&lt;/b&gt;, &lt;b&gt;서버 비용 없이 데모나 프로토타입을 만들고 싶은 팀&lt;/b&gt;입니다. 공개된 저장소 기준으로 확인되는 범위 안에서, 배경부터 구조, 사용법까지 한 번에 정리해보겠습니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;figure id=&quot;og_1775708959577&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - walkthru-earth/geocoding-playground: Browser-based geocoder powered by DuckDB-WASM and Overture Maps, 469M+ addresses, &quot; data-og-description=&quot;Browser-based geocoder powered by DuckDB-WASM and Overture Maps, 469M+ addresses, zero backend - walkthru-earth/geocoding-playground&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/walkthru-earth/geocoding-playground&quot; data-og-url=&quot;https://github.com/walkthru-earth/geocoding-playground&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hbaE5/dJMb9cBI2E3/0dmy2Yis8JiYMWVNliCtRK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/ca8ooE/dJMb9hC2esk/CVhcZDfdtaFFRRCIe2w8y0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hbaE5/dJMb9cBI2E3/0dmy2Yis8JiYMWVNliCtRK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/ca8ooE/dJMb9hC2esk/CVhcZDfdtaFFRRCIe2w8y0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - walkthru-earth/geocoding-playground: Browser-based geocoder powered by DuckDB-WASM and Overture Maps, 469M+ addresses,&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Browser-based geocoder powered by DuckDB-WASM and Overture Maps, 469M+ addresses, zero backend - walkthru-earth/geocoding-playground&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;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;p data-ke-size=&quot;size16&quot;&gt;지오코딩은 생각보다 비용과 제약이 큰 문제입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 방식은 대체로 외부 API 호출이나 자체 geocoding 서버 운영에 의존합니다. 둘 다 단점이 분명합니다.&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;API 비용이 누적된다&lt;/b&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;내부 운영 도구나 B2B 서비스에서도 트래픽이 쌓이면 부담이 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;응답 지연이 생긴다&lt;/b&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;지도에서 클릭할 때 reverse geocoding까지 붙으면 체감 지연이 더 커집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 통제권이 약하다&lt;/b&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;/li&gt;
&lt;li&gt;&lt;b&gt;오프라인성 또는 프라이버시 요구에 약하다&lt;/b&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;/li&gt;
&lt;li&gt;&lt;b&gt;프로토타입 만들 때도 인프라가 필요하다&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단순 데모를 만들고 싶어도 API 키, 서버, 캐시, 데이터 파이프라인이 따라옵니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;관리자 화면에서 하루 수천 건 주소 정규화를 돌리는데 API 비용이 계속 올라간다.&lt;/li&gt;
&lt;li&gt;물류/배달/부동산 서비스에서 국가별 주소 표기 차이 때문에 검색 정확도가 흔들린다.&lt;/li&gt;
&lt;li&gt;지도 클릭으로 주소를 보여주는 기능이 필요한데 서버를 추가로 운영해야 한다.&lt;/li&gt;
&lt;li&gt;PoC 단계인데도 geocoder API 선정, 키 발급, 쿼터 관리부터 해야 한다.&lt;/li&gt;
&lt;li&gt;외부 전송이 어려운 환경이라 주소 입력 자체를 서버로 보내기 부담스럽다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Geocoding Playground가 흥미로운 이유는 이 문제를 **&amp;ldquo;브라우저 안에서 직접 쿼리한다&amp;rdquo;**는 방식으로 풀기 때문입니다. README에 따르면 이 프로젝트는 &lt;b&gt;백엔드 없이 Parquet 파일을 HTTP range request로 읽어 주소를 조회&lt;/b&gt;합니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Geocoding Playground란 무엇인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Geocoding Playground는 DuckDB-WASM과 Overture Maps 주소 데이터를 이용해, 브라우저 안에서 직접 지오코딩을 수행하는 오픈소스 도구&lt;/b&gt;입니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&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;브라우저 안에 DuckDB 엔진이 올라가고&lt;/li&gt;
&lt;li&gt;주소 데이터는 Parquet 형태로 원격에 있고&lt;/li&gt;
&lt;li&gt;필요한 부분만 HTTP range request로 가져와&lt;/li&gt;
&lt;li&gt;SQL처럼 조회해서 주소 검색과 역검색을 수행합니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&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;기존 geocoding API: &amp;ldquo;주소를 서버에 보내고 결과를 받는다&amp;rdquo;&lt;/li&gt;
&lt;li&gt;이 프로젝트: &amp;ldquo;브라우저가 직접 데이터를 조회해 결과를 만든다&amp;rdquo; (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&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;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;Forward Geocoding 지원&lt;/b&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/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Reverse Geocoding 지원&lt;/b&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/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;39개국 지원&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;README 기준 39개국 주소 검색을 지원합니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;국가별 주소 파서&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NL, US, DE, FR, IT, ES, BR, AU, CA, JP에 대해 전용 파서를 둡니다. 즉, &amp;ldquo;39개국 전체에 동일 로직&amp;rdquo;이 아니라 일부 국가는 형식 특화 파서를 더 깊게 적용합니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;3단계 캐싱&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;WASM 초기화, 국가별 prefetch, 타일 LRU 캐시를 사용해 반복 조회를 빠르게 만듭니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;지도 UI 내장&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MapLibre GL 지도와 H3 타일 오버레이, 결과 마커를 함께 제공합니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Overture 릴리스 선택&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;네비게이션 바에서 사용 가능한 Overture Maps 릴리스를 바꿔볼 수 있습니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공개된 자료 기준으로 확인되는 효과는 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;백엔드가 없어도 된다&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;README는 &amp;ldquo;No backend required&amp;rdquo;를 명시합니다. 즉, 최소한 데모나 프로토타입 단계에서는 geocoding 서버를 별도로 두지 않아도 됩니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;전체 데이터를 한 번에 내려받지 않는다&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Parquet 파일을 &lt;b&gt;HTTP range request&lt;/b&gt;로 직접 조회하므로, 필요한 조각만 가져오는 구조입니다. 이것이 브라우저에서 수억 건 데이터셋을 다루는 핵심입니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;반복 조회가 빨라진다&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로젝트 문서에는 &lt;b&gt;sub-second queries&lt;/b&gt;를 목표로 하는 3단계 캐싱이 설명되어 있습니다. 다만 이것은 README의 프로젝트 설명이며, 모든 브라우저&amp;middot;네트워크 환경에서 동일하게 보장되는 수치라고 단정할 수는 없습니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;초기 로딩과 국가 전환 비용이 분리된다&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;README 기준으로 WASM 초기화는 약 &lt;b&gt;2~4초&lt;/b&gt;, 국가 prefetch는 약 &lt;b&gt;3~8초&lt;/b&gt;로 설명됩니다. 즉, 한 번의 무거운 전체 로딩보다 &amp;ldquo;초기화 &amp;rarr; 국가 범위 준비 &amp;rarr; 실제 조회&amp;rdquo; 흐름으로 나뉘어 있습니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;사내 운영툴에서 주소 검색이 필요하지만 별도 geocoder 서버를 두기 싫을 때&lt;/li&gt;
&lt;li&gt;국가별 주소 형식 차이를 직접 제어하고 싶을 때&lt;/li&gt;
&lt;li&gt;지도 기반 reverse geocoding 데모를 빨리 보여줘야 할 때&lt;/li&gt;
&lt;li&gt;서버 비용이나 외부 API 의존을 줄이고 싶을 때&lt;/li&gt;
&lt;/ul&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;pnpm 모노레포&lt;/b&gt;입니다. 크게 두 패키지로 나뉩니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;packages/core/   @walkthru-earth/geocoding-core
apps/playground/ playground
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;packages/core
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프레임워크 독립적인 TypeScript 라이브러리입니다.&lt;/li&gt;
&lt;li&gt;DuckDB-WASM 래퍼, 주소 파싱, 검색 알고리즘, 캐싱, 타입 정의를 담습니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;apps/playground
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Svelte 5 기반 UI입니다.&lt;/li&gt;
&lt;li&gt;인터랙티브 지도와 결과 화면을 제공하는 데모 앱입니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동작 흐름은 README에 단계별로 꽤 명확하게 정리되어 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) WASM 초기화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저가 시작되면 DuckDB-WASM과 필요한 확장들을 로드합니다. README에는 httpfs, spatial, h3 확장을 로드한다고 설명합니다. 이 단계에서 글로벌 타일 인덱스와 매니페스트도 캐시합니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&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;사용자가 특정 국가를 선택하면, 그 나라의 &lt;b&gt;도시/우편번호/도로명 인덱스&lt;/b&gt;를 메모리 테이블로 미리 가져옵니다. 이 단계가 있어서 조회 범위를 처음부터 전 세계 전체로 넓게 잡지 않습니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&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;입력된 문자열을 국가별 파서로 해석합니다. 나라에 따라 주소 형식이 다르기 때문에, 단순 문자열 검색보다 더 구조화된 해석이 들어갑니다. README는 일부 국가에 대해 전용 파서를 둔다고 설명합니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) H3 타일로 범위 좁히기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파싱 결과를 바탕으로 관련 H3 타일 범위를 좁힙니다. 이 단계가 없으면 원격 Parquet 범위를 너무 넓게 읽게 됩니다. 즉, &lt;b&gt;H3가 검색 공간을 빠르게 줄이는 인덱스 역할&lt;/b&gt;을 합니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5) Parquet 직접 조회&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 DuckDB가 원격 Parquet를 필터 푸시다운과 함께 조회합니다. 필요한 행만 읽도록 최대한 범위를 줄인 뒤 결과를 만듭니다. README는 이 지점을 &amp;ldquo;queried directly from Parquet files via HTTP range requests&amp;rdquo;라고 설명합니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6) 타일 캐시 유지&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 번 조회한 타일은 메모리 LRU 캐시에 남겨 반복 요청을 빠르게 처리합니다. README에는 &lt;b&gt;4M address budget&lt;/b&gt;이 적혀 있어, 메모리 예산 안에서 주소 데이터를 유지하는 방식임을 알 수 있습니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 흐름은 아래처럼 이해하면 됩니다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;사용자 입력
&amp;rarr; 국가별 파싱
&amp;rarr; H3 타일 후보 축소
&amp;rarr; DuckDB-WASM이 원격 Parquet 직접 조회
&amp;rarr; 결과 반환
&amp;rarr; 자주 본 타일은 캐시에 유지
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치 / 사용 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;README 기준으로 로컬 실행은 간단합니다. 저장소 루트에서 아래 명령을 실행하면 됩니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;pnpm install
pnpm dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그다음 브라우저에서 아래 주소를 엽니다. README는 기본 로컬 경로를 다음처럼 안내합니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;http://localhost:5173/geocoding-playground/
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드와 프리뷰도 가능합니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;pnpm build
pnpm preview
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트 관련 스크립트도 준비되어 있습니다. 루트와 앱 패키지 설정을 보면 코어 테스트, E2E 테스트, 파서 검증 스크립트가 있습니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground/blob/main/package.json&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;pnpm test
pnpm test:e2e
pnpm test:validate
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기술 스택은 문서와 패키지 설정 기준으로 아래처럼 확인됩니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;UI: Svelte 5
DB: DuckDB-WASM
Map: MapLibre GL
Geo Index: H3
Data: Overture Maps addresses (Parquet)
Build: Vite 8
Style: Tailwind CSS 4 + DaisyUI 5
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱 패키지에 적힌 의존성 버전도 흥미롭습니다. 예를 들어 공개된 apps/playground/package.json에는 Svelte ^5.55.2, Vite ^8.0.7, MapLibre GL ^5.22.0, H3 ^4.4.0, DuckDB-WASM 1.33.1-dev44.0이 명시되어 있습니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground/blob/main/apps/playground/package.json&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&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;부동산, 물류, 배달, 행정 서비스처럼 &amp;ldquo;주소 입력 &amp;rarr; 지도 표시&amp;rdquo;가 필요한 앱에서 빠른 데모를 만들 수 있습니다. 서버 없이도 검색 UI를 바로 붙여볼 수 있다는 점이 큽니다. README 기준으로 forward geocoding과 interactive map이 이미 준비되어 있습니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&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;현장 관리 툴이나 내부 운영 도구에서는 사용자가 지도를 클릭하고 해당 주소를 확인하는 기능이 자주 필요합니다. 이 프로젝트는 reverse geocoding을 기본 기능으로 제공하므로, 해당 UX를 구현하는 데 참고하기 좋습니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&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;주소 형식은 나라별로 많이 다릅니다. 이 프로젝트는 국가별 전문 파서를 일부 국가에 대해 별도로 둡니다. 따라서 &amp;ldquo;단순 full-text 검색&amp;rdquo;이 아니라 &lt;b&gt;국가별 구조화 파싱이 얼마나 중요한지&lt;/b&gt; 보여주는 예제로도 좋습니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) 프론트엔드 중심 geospatial 아키텍처 학습&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DuckDB-WASM, HTTP range request, H3, Parquet, MapLibre를 한 번에 볼 수 있는 예제는 흔하지 않습니다. &amp;ldquo;브라우저가 어디까지 데이터 시스템 역할을 할 수 있는가&amp;rdquo;를 보여주는 교육용 샘플로 가치가 큽니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5) 자체 geocoding UI 프로토타이핑&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;README에 따르면 코어 로직은 @walkthru-earth/geocoding-core로 분리되어 있고 프레임워크 독립적입니다. 즉, Playground UI는 Svelte 5지만, 실제 로직은 다른 프레임워크에도 가져갈 여지가 있습니다. React, Vue, Next.js 같은 환경에서 재사용 가능성을 염두에 둔 구조입니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;초기 로딩 비용이 있다&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;README 자체가 WASM 초기화와 국가 prefetch 시간을 명시합니다.&lt;/li&gt;
&lt;li&gt;즉, 완전히 즉시 반응하는 구조라기보다 &amp;ldquo;초기 준비 후 빠르게 조회&amp;rdquo;하는 모델입니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;브라우저 메모리와 환경 제약을 받는다&lt;/b&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;README의 4M address budget는 이를 의식한 설계로 보입니다. 이는 문서 기반 해석입니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;지원 국가와 파서 정밀도는 구분해서 봐야 한다&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;39개국 지원과, 일부 국가 전용 파서 제공은 같은 말이 아닙니다.&lt;/li&gt;
&lt;li&gt;즉 &amp;ldquo;지원은 넓지만 정교한 파싱 로직은 특정 국가에 더 집중되어 있다&amp;rdquo;고 이해하는 편이 정확합니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 최신성과 커버리지는 Overture 릴리스에 의존한다&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 프로젝트는 Overture Maps 주소 데이터를 사용하고, 릴리스 선택 기능도 제공합니다.&lt;/li&gt;
&lt;li&gt;따라서 결과 품질은 사용하는 릴리스와 데이터 소스 특성의 영향을 받습니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;라이선스와 출처 표기를 확인해야 한다&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;저장소는 프로젝트 자체 라이선스와 별개로, Overture Maps 주소 데이터의 라이선스 및 국가별 attribution 요구사항을 안내합니다.&lt;/li&gt;
&lt;li&gt;실제 서비스 적용 전에는 이 부분을 반드시 검토해야 합니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프로덕션 geocoder의 모든 요구를 대체한다고 보긴 어렵다&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Playground는 강력한 데모이자 아키텍처 사례입니다.&lt;/li&gt;
&lt;li&gt;대규모 상용 서비스에서는 브라우저 성능, SEO, 캐시 전략, 모바일 UX, 운영 관측성까지 함께 검토해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Geocoding Playground의 핵심 가치는 단순히 &amp;ldquo;브라우저에서 지오코딩이 된다&amp;rdquo;가 아닙니다. 더 중요한 점은 &lt;b&gt;지오코딩을 서버 API 호출 문제로만 보지 않고, 클라이언트 데이터 처리 문제로 다시 설계했다&lt;/b&gt;는 데 있습니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DuckDB-WASM, Overture Maps Parquet, H3, MapLibre 조합은 &amp;ldquo;지도 검색도 이제 브라우저 안에서 꽤 많은 일을 할 수 있다&amp;rdquo;는 사실을 보여줍니다. 특히 백엔드 없이도 수억 건 규모 주소 데이터를 다룰 수 있게 만든 구조는, 프론트엔드와 데이터 엔지니어링의 경계가 어떻게 흐려지고 있는지를 잘 보여줍니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&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;외부 geocoding API 의존을 줄이는 방법을 고민하는 팀&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;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DuckDB-WASM + Parquet + HTTP range request + H3&lt;/b&gt; 조합으로 수억 건 주소 데이터를 다룹니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;39개국 지원, forward/reverse geocoding, MapLibre 기반 지도 UI&lt;/b&gt;가 이미 갖춰져 있습니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;국가별 주소 파싱과 다단계 캐싱&lt;/b&gt;이 정확도와 속도를 받쳐줍니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;실무 적용 전에는 &lt;b&gt;초기 로딩, 브라우저 자원 제약, 데이터 라이선스&lt;/b&gt;를 함께 검토해야 합니다. (&lt;a href=&quot;https://github.com/walkthru-earth/geocoding-playground&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AI</category>
      <author>행복한 수지아빠</author>
      <guid isPermaLink="true">https://javaexpert.tistory.com/1721</guid>
      <comments>https://javaexpert.tistory.com/1721#entry1721comment</comments>
      <pubDate>Thu, 9 Apr 2026 13:29:29 +0900</pubDate>
    </item>
    <item>
      <title>DeskRPG : AI 에이전트의 &amp;lsquo;2D 가상 오피스</title>
      <link>https://javaexpert.tistory.com/1720</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1788&quot; data-origin-height=&quot;1300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qPlFr/dJMcaf7eGG3/m2ONpLOOXWBndyrwAB5oVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qPlFr/dJMcaf7eGG3/m2ONpLOOXWBndyrwAB5oVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qPlFr/dJMcaf7eGG3/m2ONpLOOXWBndyrwAB5oVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqPlFr%2FdJMcaf7eGG3%2Fm2ONpLOOXWBndyrwAB5oVk%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;1788&quot; height=&quot;1300&quot; data-origin-width=&quot;1788&quot; data-origin-height=&quot;1300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;협업 도구는 이미 많습니다. 그런데 대부분은 결국 &amp;ldquo;채팅창 + 문서 + 보드&amp;rdquo; 조합으로 흘러갑니다. DeskRPG는 여기서 한 걸음 더 나가, &lt;b&gt;브라우저 안의 2D 픽셀 아트 오피스&lt;/b&gt;를 협업 인터페이스로 삼고, 그 안에 &lt;b&gt;AI NPC, 태스크 진행, 회의, 맵 편집&lt;/b&gt;까지 붙입니다. 단순한 장식이 아니라, 협업 경험 자체를 공간 기반으로 재구성하려는 시도라고 볼 수 있습니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;figure id=&quot;og_1775702708970&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - dandacompany/deskrpg: 2D pixel art multiplayer virtual office game &amp;mdash; create characters, join channels, chat with AI N&quot; data-og-description=&quot;2D pixel art multiplayer virtual office game &amp;mdash; create characters, join channels, chat with AI NPCs, and collaborate in real-time - dandacompany/deskrpg&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/dandacompany/deskrpg&quot; data-og-url=&quot;https://github.com/dandacompany/deskrpg&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dtmbNk/dJMb9c9yNKU/S8UxYENNrA7CArcQ4gLN0k/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bPlpfq/dJMb81fTyoy/kIzQBRaqVjZAQBlDuKk2Vk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/5K8K9/dJMb9lk74nh/PPClPZI7zuA9io9A1Fm8ak/img.png?width=3600&amp;amp;height=2092&amp;amp;face=0_0_3600_2092&quot;&gt;&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dtmbNk/dJMb9c9yNKU/S8UxYENNrA7CArcQ4gLN0k/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bPlpfq/dJMb81fTyoy/kIzQBRaqVjZAQBlDuKk2Vk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/5K8K9/dJMb9lk74nh/PPClPZI7zuA9io9A1Fm8ak/img.png?width=3600&amp;amp;height=2092&amp;amp;face=0_0_3600_2092');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - dandacompany/deskrpg: 2D pixel art multiplayer virtual office game &amp;mdash; create characters, join channels, chat with AI N&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;2D pixel art multiplayer virtual office game &amp;mdash; create characters, join channels, chat with AI NPCs, and collaborate in real-time - dandacompany/deskrpg&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 이런 글은 도움이 됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;AI 에이전트를 업무 공간 안에 자연스럽게 녹여 넣는 방식&amp;rdquo;이 궁금한 개발자&lt;/li&gt;
&lt;li&gt;셀프 호스팅 가능한 협업 도구를 찾는 팀&lt;/li&gt;
&lt;li&gt;채팅 중심 UI가 아닌, 더 직관적인 팀 공간 모델에 관심 있는 사람&lt;/li&gt;
&lt;li&gt;Next.js, Phaser, Socket.IO, Drizzle 기반 앱 구조를 실전 예제로 보고 싶은 사람 (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&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;/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;AI 도구가 채팅창 바깥의 &amp;ldquo;구성원&amp;rdquo;처럼 느껴지지 않고, 그냥 호출형 유틸리티로 머문다&lt;/li&gt;
&lt;li&gt;회의, 업무 요청, 진행 상태, 보고가 서로 다른 화면과 도구로 쪼개진다&lt;/li&gt;
&lt;li&gt;셀프 호스팅 환경에서는 협업 도구가 너무 무겁거나, 반대로 기능이 너무 단순하다&lt;/li&gt;
&lt;li&gt;원격 협업에서 &amp;ldquo;같이 일하는 느낌&amp;rdquo;은 부족한데, 그렇다고 메타버스형 제품은 실무 연결이 약한 경우가 많다&lt;/li&gt;
&lt;/ul&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;AI에게 맡긴 일이 어디까지 갔는지 따로 확인해야 함&lt;/li&gt;
&lt;li&gt;회의와 결과물이 분리돼 후속 액션이 끊김&lt;/li&gt;
&lt;li&gt;팀 공간이 단순 채팅방이라 참여감이 낮음&lt;/li&gt;
&lt;li&gt;커스텀 공간이나 내부 운영 정책을 반영하기 어려움&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DeskRPG는 이 지점을 &lt;b&gt;&amp;ldquo;가상 오피스&amp;rdquo;라는 공간 모델&lt;/b&gt;로 풀려는 접근입니다. 사용자는 채널에 입장해 캐릭터로 움직이고, NPC와 대화하고, 태스크를 맡기고, 회의실에서 AI 회의를 돌립니다. 즉, 협업 UI를 문서/채팅 중심이 아니라 &lt;b&gt;공간 + 등장인물 + 상태 변화&lt;/b&gt; 중심으로 바꿉니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;DeskRPG란 무엇인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DeskRPG는 셀프 호스팅 가능한 2D 픽셀 아트 멀티플레이어 가상 오피스이며, 캐릭터 이동, 공유 채널, AI NPC, 태스크 보드, AI 회의, 맵 편집 기능을 브라우저에서 제공하는 협업 앱입니다.&lt;/b&gt; (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&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;/li&gt;
&lt;li&gt;게임처럼 보이는 2D 오피스 맵이 기본 화면이고&lt;/li&gt;
&lt;li&gt;사람과 AI가 그 공간 안의 구성원처럼 존재하며&lt;/li&gt;
&lt;li&gt;업무 요청과 진행 보고도 그 안에서 일어나는 구조입니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 방식과의 차이는 분명합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;기존 협업 도구&lt;/b&gt;: 메시지, 문서, 보드가 중심&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DeskRPG&lt;/b&gt;: 공간, 캐릭터, 상호작용, AI 동료가 중심&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이 프로젝트는 단순히 &amp;ldquo;예쁜 UI&amp;rdquo;가 아니라, &lt;b&gt;협업 인터페이스를 게임적 공간 모델로 재설계한 사례&lt;/b&gt;로 보는 쪽이 더 정확합니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&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;b&gt;셀프 호스팅 가능&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;npm 런타임, 로컬 실행, Docker, SQLite, PostgreSQL 등 여러 방식으로 시작할 수 있습니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;2D 멀티플레이어 오피스&lt;/b&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/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LPC 기반 캐릭터 생성&lt;/b&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/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AI NPC 연결&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;OpenClaw 게이트웨이를 연결하면 NPC를 고용하고 에이전트와 바인딩할 수 있습니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;태스크 흐름 내장&lt;/b&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/dandacompany/deskrpg/blob/master/README.ko.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;회의실과 맵 에디터 제공&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AI 회의용 공간과 브라우저 기반 맵 편집 기능이 포함됩니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실제로 어떤 효과가 있는가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공개 자료 기준으로 DeskRPG는 정량 성능 수치보다는 &lt;b&gt;경험 구조의 변화&lt;/b&gt;에 강점이 있습니다. README에서 확인되는 효과는 다음 쪽에 가깝습니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) AI를 &amp;ldquo;도구&amp;rdquo;가 아니라 &amp;ldquo;동료&amp;rdquo;처럼 다루기 쉬워진다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NPC를 채널 안에 배치하고, 대화하고, 호출하고, 복귀시키고, 해고하는 흐름이 명시돼 있습니다. 즉 AI가 별도 탭의 챗봇이 아니라, 팀 공간 안의 개체로 취급됩니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg/blob/master/README.ko.md&quot;&gt;GitHub&lt;/a&gt;)&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;태스크는 상태를 가지며, 중요한 보고는 NPC가 플레이어에게 직접 걸어와 전달한다고 설명돼 있습니다. 이건 상태 변경을 단순 알림이 아니라 &lt;b&gt;공간 내 이벤트&lt;/b&gt;로 바꾸는 방식입니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg/blob/master/README.ko.md&quot;&gt;GitHub&lt;/a&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;실시간 멀티플레이어 채널, 오피스 맵, 회의실 구조는 &amp;ldquo;같은 공간에서 일한다&amp;rdquo;는 감각을 강화합니다. 특히 텍스트 채팅만으로는 팀 존재감이 약한 환경에서 효과가 클 수 있습니다. 이 부분은 README 설명을 바탕으로 한 해석입니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) 셀프 호스팅 팀에 맞는 선택지가 많다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단히 시작하려면 SQLite, 장기 운영이나 다중 사용자를 생각하면 PostgreSQL, AI 기능까지 바로 붙이려면 OpenClaw 포함 Docker 구성을 선택할 수 있습니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;동작 원리 / 구조&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서상 확인되는 범위에서 DeskRPG의 흐름은 대략 이렇게 이해할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 사용자는 캐릭터를 만든다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;채널에 들어가기 전에 캐릭터 생성이 필요합니다. 캐릭터 외형은 LPC 기반 레이어 스프라이트 조합으로 구성됩니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg/blob/master/README.ko.md&quot;&gt;GitHub&lt;/a&gt;)&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;채널은 공유 오피스 공간입니다. 공개/제한 접근 규칙을 둘 수 있고, 맵은 템플릿을 기반으로 만들어집니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg/blob/master/README.ko.md&quot;&gt;GitHub&lt;/a&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;저장소 설명에는 &lt;b&gt;live multiplayer movement&lt;/b&gt;가 명시돼 있고, 의존성에는 phaser, socket.io, socket.io-client가 포함돼 있습니다. 따라서 브라우저 내 실시간 이동과 상호작용을 게임 엔진 + 실시간 통신으로 구현하는 구조로 볼 수 있습니다. 이 부분은 문서와 패키지 정보를 바탕으로 한 합리적 추론입니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. AI 기능은 OpenClaw 게이트웨이를 통해 연결된다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI NPC, 태스크 자동화, AI 회의는 OpenClaw 연결이 필요합니다. 사용자는 채널 설정의 AI 연결 탭에서 게이트웨이 URL과 토큰을 넣고 연결을 테스트합니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. NPC가 업무를 수행한다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NPC는 OpenClaw 에이전트와 연결할 수 있고, 대화를 통해 업무를 맡길 수 있습니다. 태스크 상태는 대기 &amp;rarr; 진행중 &amp;rarr; 중단 &amp;rarr; 완료로 흘러갑니다. 보고 요청이나 재촉도 가능합니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg/blob/master/README.ko.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. 회의실에서 AI 회의를 운영한다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전용 회의실이 있고, 회의 노트와 멀티 에이전트 토론을 지원한다고 README에 적혀 있습니다. 즉 협업 흐름이 &amp;ldquo;대화형 NPC&amp;rdquo;에만 머물지 않고, 집단 논의 시나리오까지 확장됩니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7. 데이터 저장과 앱 실행 구조&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;package.json 기준으로 DeskRPG는 Next.js 16, React 19, Drizzle ORM, pg, better-sqlite3를 사용합니다. 즉 프런트엔드/앱 서버는 Next.js 중심이고, 데이터 저장소는 PostgreSQL 또는 SQLite를 선택할 수 있는 구조입니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg/blob/master/package.json&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치 / 사용 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서에 나온 시작 방법은 6가지입니다. 처음 보는 입장에서는 아래처럼 정리하면 이해가 쉽습니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;가장 빠르게 체험하기: npm 런타임 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장소를 클론하지 않고 설치형처럼 시작하는 방식입니다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;npx deskrpg init
npx deskrpg start
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본 접속 주소: http://localhost:3000&lt;/li&gt;
&lt;li&gt;런타임 데이터 저장 위치:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;~/.deskrpg/.env.local&lt;/li&gt;
&lt;li&gt;~/.deskrpg/data/deskrpg.db&lt;/li&gt;
&lt;li&gt;~/.deskrpg/uploads/&lt;/li&gt;
&lt;li&gt;~/.deskrpg/logs/ (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;저장소 기준으로 직접 실행: PostgreSQL 버전&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 앱을 repo 기준으로 돌려보려면 이 경로가 가장 정석입니다.&lt;/p&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;git clone https://github.com/dandacompany/deskrpg.git
cd deskrpg
npm install
cp .env.example .env.local
npm run setup
npm run dev
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;접속 주소: http://localhost:3000&lt;/li&gt;
&lt;li&gt;README에서는 repo 기반 전체 앱 실행에 가장 적합한 옵션이라고 설명합니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;더 가볍게 시작: SQLite 버전&lt;/h3&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;git clone https://github.com/dandacompany/deskrpg.git
cd deskrpg
npm install
npm run setup:lite
npm run dev
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SQLite 데이터 파일: data/deskrpg.db (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;운영형에 가까운 실행: Docker + PostgreSQL&lt;/h3&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;cp .env.example .env.docker
docker compose --env-file .env.docker up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 실행 전에는 .env.docker에서 아래 값을 설정해야 합니다.&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;JWT_SECRET=your-secret
POSTGRES_PASSWORD=your-password
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;접속 주소: http://localhost:3102&lt;/li&gt;
&lt;li&gt;다중 사용자 또는 더 안정적인 저장소가 필요하면 이 구성을 권장한다고 문서에 적혀 있습니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;AI 기능까지 한 번에: Docker + PostgreSQL + OpenClaw&lt;/h3&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;cp .env.example .env.docker
docker compose --env-file .env.docker -f docker/docker-compose.openclaw.yml up -d --build
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필수 환경 변수:&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;JWT_SECRET=your-secret
POSTGRES_PASSWORD=your-password
OPENCLAW_TOKEN=your-token
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 엔드포인트:&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;DeskRPG:  http://localhost:3102
OpenClaw: http://localhost:18789/openclaw?token=&amp;lt;OPENCLAW_TOKEN&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 OpenClaw 대시보드에서 provider/model 온보딩을 끝내고, DeskRPG의 설정 -&amp;gt; 채널 설정 -&amp;gt; AI 연결에서 게이트웨이 URL과 토큰을 저장해야 AI 기능이 작동합니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&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;package.json 기준 주요 스크립트는 이렇습니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;npm run dev
npm run dev:debug
npm run setup
npm run setup:lite
npm run build
npm run start
npm run test
npm run db:migrate
npm run db:studio
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 개발, 경량 셋업, 마이그레이션, 빌드, 테스트 흐름이 분리돼 있습니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg/blob/master/package.json&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&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;원격 팀이 &amp;ldquo;온라인 사무실&amp;rdquo;처럼 접속해서 함께 움직이고 대화하는 공간으로 쓸 수 있습니다. 일반 채팅방보다 팀 존재감을 만들기 좋습니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. AI 동료 실험용 샌드박스&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenClaw와 연결한 뒤 NPC를 에이전트에 바인딩하면, AI를 단순 API 호출이 아니라 &amp;ldquo;팀 구성원&amp;rdquo;처럼 운영하는 UX를 실험할 수 있습니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&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;업무를 대화로 넘기고, 상태를 보고, 중단된 작업을 다시 이어가게 하는 흐름이 있어 에이전트 협업 UX를 테스트하기 좋습니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg/blob/master/README.ko.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 회의 중심 AI 운영 환경&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전용 회의실과 멀티 에이전트 논의 기능을 이용해 회의록 생성, 역할 기반 논의, 의견 수집 같은 흐름을 구성할 수 있습니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 맵 커스터마이징이 필요한 조직용 공간&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저 기반 맵 에디터와 사용자 맵 업로드 기능이 있어, 조직 고유 공간이나 이벤트성 공간을 만드는 데 활용할 수 있습니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&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;OpenClaw 의존성이 있다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI NPC, 태스크 자동화, AI 회의는 OpenClaw 연결이 필요합니다. 즉 DeskRPG만 띄운다고 AI 기능이 바로 되는 구조는 아닙니다. 게이트웨이 연결, 토큰 설정, provider/model 온보딩이 별도로 필요합니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;ldquo;가볍게 쓰는 채팅 도구&amp;rdquo;와는 결이 다르다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 프로젝트의 강점은 공간성과 상호작용입니다. 반대로 말하면, 단순 메시징만 필요할 때는 과할 수 있습니다. 팀이 이런 인터페이스를 좋아하는지 먼저 보는 게 좋습니다. 이 부분은 제품 성격에 대한 해석입니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;운영 형태에 따라 DB 선택이 갈린다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서에서도 빠른 시작은 SQLite, 장기 운영은 PostgreSQL을 권장합니다. 테스트와 운영을 같은 방식으로 가져갈지 초반에 정하는 편이 낫습니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg/blob/master/README.ko.md&quot;&gt;GitHub&lt;/a&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;README에는 웹사이트가 &amp;ldquo;planned&amp;rdquo;로 표기돼 있고 버전은 v2026.4.6로 표시돼 있습니다. 따라서 지금 시점에서는 저장소 문서와 셀프 호스팅 흐름이 사실상 핵심 진입점입니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DeskRPG의 핵심은 화려한 2D 화면이 아닙니다. &lt;b&gt;협업을 채팅방이 아니라 공간으로 바꾸고&lt;/b&gt;, 그 안에 &lt;b&gt;AI NPC와 태스크 흐름을 자연스럽게 넣었다는 점&lt;/b&gt;이 더 중요합니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&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;/li&gt;
&lt;li&gt;AI 에이전트를 실제 업무 흐름 속 &amp;ldquo;구성원&amp;rdquo;처럼 다뤄 보고 싶은 사람&lt;/li&gt;
&lt;li&gt;게임형 인터페이스와 실시간 협업을 결합한 제품 구조를 연구하는 개발자&lt;/li&gt;
&lt;li&gt;Next.js + Phaser + Socket.IO + Drizzle 조합의 실전 예시를 보고 싶은 사람 (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 DeskRPG는 &lt;b&gt;&amp;ldquo;AI가 들어간 협업 도구&amp;rdquo;를 만드는 데서 한 단계 더 나아가, &amp;ldquo;AI와 사람이 함께 있는 공간 자체를 설계하는 도구&amp;rdquo;&lt;/b&gt;에 가깝습니다. 이런 문제의식이 있는 팀이라면 충분히 살펴볼 가치가 있습니다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&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;DeskRPG는 &lt;b&gt;셀프 호스팅 가능한 2D 픽셀 아트 가상 오피스 협업 앱&lt;/b&gt;이다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;핵심 가치는 채팅창이 아니라 &lt;b&gt;공간 기반 협업 + AI NPC 상호작용&lt;/b&gt;에 있다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;AI 기능은 &lt;b&gt;OpenClaw 게이트웨이 연결 후&lt;/b&gt; 사용할 수 있다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;실행은 npm, 로컬, Docker, SQLite, PostgreSQL 등 여러 방식으로 가능하다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;실무적으로는 &lt;b&gt;원격 협업 경험 강화, AI 동료 UX 실험, 태스크 위임형 워크플로우 설계&lt;/b&gt;에 특히 의미가 있다. (&lt;a href=&quot;https://github.com/dandacompany/deskrpg&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AI</category>
      <author>행복한 수지아빠</author>
      <guid isPermaLink="true">https://javaexpert.tistory.com/1720</guid>
      <comments>https://javaexpert.tistory.com/1720#entry1720comment</comments>
      <pubDate>Thu, 9 Apr 2026 11:46:19 +0900</pubDate>
    </item>
    <item>
      <title>Claude Code를 시작시 초반 구조 자동으로 잡아보자</title>
      <link>https://javaexpert.tistory.com/1719</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 Claude Code를 처음 프로젝트에 붙일 때 많은 팀이 비슷하게 겪는 문제를 어떻게 줄일 수 있는지 정리한 글입니다. 특히 &amp;ldquo;두 번째 세션부터 컨텍스트가 사라진다&amp;rdquo;, &amp;ldquo;에이전트에게 많이 맡겼더니 결과가 서로 충돌한다&amp;rdquo;, &amp;ldquo;하드 룰은 개발하다가 뒤늦게 떠오른다&amp;rdquo; 같은 문제를, 시작 단계에서 구조화하는 방법에 초점을 맞춥니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공개된 저장소 기준으로, AlexZio00/claude-code-skills는 Claude Code용 실전형 스킬 모음이며 현재 README에서 확인되는 핵심 스킬은 /project-init입니다. 이 스킬은 코드를 쓰기 전에 인터뷰를 통해 CLAUDE.md와 DEVELOPMENT_ROADMAP.md를 생성하는 방식으로 프로젝트의 기본 원칙을 먼저 고정하자는 접근을 취합니다. (&lt;a href=&quot;https://github.com/AlexZio00/claude-code-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글을 읽으면 다음을 이해할 수 있습니다. 왜 많은 Claude Code 프로젝트가 초반에 흔들리는지, 왜 &amp;ldquo;무엇을 만드는가 / 어떻게 구성하는가 / 누가 만드는가&amp;rdquo;를 먼저 정해야 하는지, 그리고 /project-init가 그 문제를 어떤 방식으로 줄이려는지입니다. Claude Code를 이제 막 쓰기 시작한 개발자나, 팀 단위 에이전트 워크플로를 정리하려는 사람에게 특히 도움이 됩니다. (&lt;a href=&quot;https://github.com/AlexZio00/claude-code-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;figure id=&quot;og_1775694537796&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - AlexZio00/claude-code-skills: Four skills for Claude Code projects: audit existing projects, scaffold new ones, wire th&quot; data-og-description=&quot;Four skills for Claude Code projects: audit existing projects, scaffold new ones, wire the AI layer, assemble the agent team. - AlexZio00/claude-code-skills&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/AlexZio00/claude-code-skills&quot; data-og-url=&quot;https://github.com/AlexZio00/claude-code-skills&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cGO7T3/dJMb8T90owM/WZIq2meFK68WV3pleGGm2k/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/0AkPU/dJMb8TCaxsZ/tx3yNzOckT9Hlkx0Klkck0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/AlexZio00/claude-code-skills&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/AlexZio00/claude-code-skills&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cGO7T3/dJMb8T90owM/WZIq2meFK68WV3pleGGm2k/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/0AkPU/dJMb8TCaxsZ/tx3yNzOckT9Hlkx0Klkck0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - AlexZio00/claude-code-skills: Four skills for Claude Code projects: audit existing projects, scaffold new ones, wire th&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Four skills for Claude Code projects: audit existing projects, scaffold new ones, wire the AI layer, assemble the agent team. - AlexZio00/claude-code-skills&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;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;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;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;br /&gt;프로젝트 목표, 아키텍처 원칙, 금지 사항이 문서화되어 있지 않으면 다음 세션에서 같은 설명을 반복하게 됩니다. 저장소 README의 표현대로, CLAUDE.md before code가 중요한 이유도 여기에 있습니다. (&lt;a href=&quot;https://github.com/AlexZio00/claude-code-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;하드 룰이 뒤늦게 추가된다&lt;/b&gt;&lt;br /&gt;예를 들어 &amp;ldquo;UI는 DB만 읽고 외부 API를 직접 호출하지 않는다&amp;rdquo;, &amp;ldquo;로그는 append-only로 남긴다&amp;rdquo;, &amp;ldquo;feature flag는 기본 OFF&amp;rdquo; 같은 규칙은 초반에는 없었다가 나중에 생기기 쉽습니다. 그런데 이런 규칙은 나중에 붙이면 이미 만들어진 코드가 규칙을 어기고 있을 가능성이 큽니다. 저장소도 바로 이 점을 핵심 문제로 지적합니다. (&lt;a href=&quot;https://github.com/AlexZio00/claude-code-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;여러 에이전트가 각자 맞다고 생각하는 방향으로 구현한다&lt;/b&gt;&lt;br /&gt;공통 규약이 없으면 한 에이전트는 빠른 구현을, 다른 에이전트는 장기 유지보수를 우선합니다. 결과적으로 폴더 구조, 에러 처리, 비밀정보 관리, 데이터 접근 방식이 섞입니다. 이는 사용자가 제공한 문제의식과도 맞닿아 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;로드맵 없이 작업이 분산된다&lt;/b&gt;&lt;br /&gt;&amp;ldquo;지금 무엇을 먼저 만들어야 하는가&amp;rdquo;가 정리되지 않으면, 중요한 기반 작업보다 눈에 보이는 기능부터 붙이게 됩니다. /project-init가 인터뷰 후 Phase 구조의 로드맵 파일을 생성하는 이유가 바로 이것입니다. (&lt;a href=&quot;https://github.com/AlexZio00/claude-code-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;보안과 운영 규칙이 빠진 채 시작된다&lt;/b&gt;&lt;br /&gt;.env 커밋 금지 같은 기본 시크릿 정책조차 초반에 빠질 수 있습니다. README는 명시적으로 &amp;ldquo;one .env commit compromises even private repos&amp;rdquo;라고 설명하며 secrets policy를 초기 설정에 포함합니다. (&lt;a href=&quot;https://github.com/AlexZio00/claude-code-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서는 이 문제가 결국 비용으로 이어집니다.&lt;br /&gt;처음 며칠은 빨라 보이지만, 이후에는 컨텍스트 재설명 비용, 충돌 수정 비용, 규칙 위반 리팩터링 비용이 누적됩니다. &amp;ldquo;빨리 시작했다&amp;rdquo;는 장점이 &amp;ldquo;나중에 다시 정리해야 한다&amp;rdquo;는 비용으로 되돌아오는 구조입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;claude-code-skills란 무엇인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;claude-code-skills는 Claude Code에서 쓸 수 있는 실전형 스킬 모음입니다. README의 한 문장 정의를 바꾸어 말하면, &lt;b&gt;실제 운영 경험에서 나온 개발 규칙과 프로젝트 시작 절차를 Claude Code에서 재사용할 수 있게 묶은 스킬 저장소&lt;/b&gt;라고 볼 수 있습니다. (&lt;a href=&quot;https://github.com/AlexZio00/claude-code-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 공개 README에서 확인되는 대표 스킬은 /project-init입니다. 이 스킬은 &amp;ldquo;프로젝트를 바로 구현하지 말고, 먼저 질문을 통해 불변 조건과 구조를 정리하자&amp;rdquo;는 생각에 기반합니다. 단순히 템플릿 파일을 복사하는 것이 아니라, 질문을 통해 프로젝트에 맞는 CLAUDE.md와 로드맵을 생성한다는 점이 핵심입니다. (&lt;a href=&quot;https://github.com/AlexZio00/claude-code-skills&quot;&gt;GitHub&lt;/a&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;/li&gt;
&lt;li&gt;/project-init 방식: 아이디어를 설명한 뒤, 구조와 제약부터 확정하고 코드로 넘어감&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &amp;ldquo;프롬프트로 개발을 시작하는 방식&amp;rdquo;에서 &amp;ldquo;규칙이 먼저 있는 개발 방식&amp;rdquo;으로 바꾸는 도구에 가깝습니다.&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;b&gt;인터뷰 기반 시작&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;8개의 질문을 한 번에 던지는 대신, 하나씩 묻는 방식으로 프로젝트 정의를 구체화합니다. (&lt;a href=&quot;https://github.com/AlexZio00/claude-code-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CLAUDE.md 자동 생성&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Hard Rules, Secrets Policy, Dev Conventions를 프로젝트 맞춤형으로 정리합니다. (&lt;a href=&quot;https://github.com/AlexZio00/claude-code-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DEVELOPMENT_ROADMAP.md 생성&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;작업 순서를 Phase 단위로 정리해, 초반 우선순위를 명확히 합니다. (&lt;a href=&quot;https://github.com/AlexZio00/claude-code-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;언어별 폴더 구조 제안&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Python, TypeScript, Java/Kotlin, Go, Rust, Swift 등에 맞는 구조를 제안한다고 명시되어 있습니다. (&lt;a href=&quot;https://github.com/AlexZio00/claude-code-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;초기 불변 조건 강제&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;나중에 붙이면 비싸지는 규칙을 day one에 정하게 만드는 것이 핵심 철학입니다. (&lt;a href=&quot;https://github.com/AlexZio00/claude-code-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Claude Code 세션 간 컨텍스트 유지에 유리&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로젝트의 기준 문서를 먼저 만든다는 점에서, 세션이 바뀌어도 기준점이 남습니다. 이는 README의 &amp;ldquo;re-explaining context every session is expensive&amp;rdquo;라는 문제의식과 직접 연결됩니다. (&lt;a href=&quot;https://github.com/AlexZio00/claude-code-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실제로 어떤 효과가 있는가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공개 자료 기준으로, 이 저장소는 성능 수치나 정량적 벤치마크를 제공하지는 않습니다. 따라서 &amp;ldquo;몇 퍼센트 더 빨라진다&amp;rdquo; 같은 식으로 단정할 수는 없습니다. 다만 문서상 확인되는 범위에서는 다음 효과를 기대하는 설계입니다. (&lt;a href=&quot;https://github.com/AlexZio00/claude-code-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) 세션 전환 비용 감소&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기 인터뷰 결과가 CLAUDE.md로 남으면, 다음 세션에서 매번 &amp;ldquo;이 프로젝트는 왜 만들고, 어떤 규칙을 지켜야 하는가&amp;rdquo;를 설명할 필요가 줄어듭니다.&lt;br /&gt;에이전트 개발에서 생각보다 큰 비용은 생성 자체가 아니라 &lt;b&gt;맥락 복원&lt;/b&gt;입니다.&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;Hard Rules와 Dev Conventions를 초반에 정하면, 여러 번의 코드 생성 결과가 한 방향으로 수렴할 가능성이 높아집니다.&lt;br /&gt;예를 들어,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;UI가 외부 API를 직접 호출하지 않는다&lt;/li&gt;
&lt;li&gt;feature flag는 기본 OFF다&lt;/li&gt;
&lt;li&gt;로그는 append-only다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 원칙은 사소해 보이지만, 실제로는 데이터 흐름과 운영 방식 전체를 고정합니다. (&lt;a href=&quot;https://github.com/AlexZio00/claude-code-skills&quot;&gt;GitHub&lt;/a&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;README에 따르면 인터뷰 항목에는 언어/런타임, 데이터 레이어, 인터페이스, 배포 방식, AI/LLM 전략, 하드 룰, 범위와 일정이 포함됩니다. 즉 &amp;ldquo;일단 만들어보고 나중에 정하자&amp;rdquo;로 빠지기 쉬운 항목을 초반에 체크하게 만듭니다. (&lt;a href=&quot;https://github.com/AlexZio00/claude-code-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) 팀 단위 작업에 더 잘 맞음&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 적어주신 &amp;ldquo;무엇을 만드는가 / 어떻게 구성하는가 / 누가 만드는가&amp;rdquo;라는 세 가지 질문은 실제로 팀 에이전트 운영에서 중요한 기준입니다. 공개 README는 현재 /project-init 중심이지만, 이 문제의식 자체는 팀 작업에서 특히 더 중요합니다.&lt;br /&gt;한 명이 쓰는 도구가 아니라, 여러 역할이 섞일 때 더 효과가 커지는 구조입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;동작 원리 / 구조&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/project-init의 동작 방식은 README 기준으로 비교적 단순합니다. 하지만 단순해서 실무 적용이 쉽습니다. (&lt;a href=&quot;https://github.com/AlexZio00/claude-code-skills&quot;&gt;GitHub&lt;/a&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새 세션에서 /project-init를 호출합니다.&lt;/li&gt;
&lt;li&gt;필요하면 프로젝트 아이디어나 기존 노트를 함께 붙일 수 있습니다. (&lt;a href=&quot;https://github.com/AlexZio00/claude-code-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Claude가 8개의 질문을 순차적으로 묻는다&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Core definition&lt;/li&gt;
&lt;li&gt;Language / runtime&lt;/li&gt;
&lt;li&gt;Data layer&lt;/li&gt;
&lt;li&gt;Interface&lt;/li&gt;
&lt;li&gt;Deployment&lt;/li&gt;
&lt;li&gt;AI / LLM&lt;/li&gt;
&lt;li&gt;Hard rules&lt;/li&gt;
&lt;li&gt;Scope &amp;amp; timeline&lt;br /&gt;이 순서대로 하나씩 물으며 구조를 잡습니다. (&lt;a href=&quot;https://github.com/AlexZio00/claude-code-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스택 요약을 먼저 보여준다&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인터뷰 후 Claude가 스택 요약을 제시하고 승인받는 흐름입니다. (&lt;a href=&quot;https://github.com/AlexZio00/claude-code-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;문서를 생성한다&lt;/b&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;DEVELOPMENT_ROADMAP.md&lt;br /&gt;두 파일을 생성해 이후 세션과 구현의 기준점으로 삼습니다. (&lt;a href=&quot;https://github.com/AlexZio00/claude-code-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;언어에 맞는 폴더 구조를 제안한다&lt;/b&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/AlexZio00/claude-code-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;머릿속으로 그리면, &amp;ldquo;질문 &amp;rarr; 기준 확정 &amp;rarr; 문서화 &amp;rarr; 구현 시작&amp;rdquo;의 파이프라인입니다.&lt;br /&gt;중요한 점은 코드 생성이 마지막이라는 것입니다. 이 스킬은 코드를 빨리 만들기 위한 스킬이라기보다, &lt;b&gt;나중에 덜 망가지게 시작하는 스킬&lt;/b&gt;에 가깝습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치 / 사용 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;README 기준 설치 방법은 아래와 같습니다. (&lt;a href=&quot;https://github.com/AlexZio00/claude-code-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;설치&lt;/h3&gt;
&lt;pre class=&quot;crystal&quot;&gt;&lt;code&gt;# macOS / Linux
mkdir -p ~/.claude/skills/project-init
cp project-init/skill.md ~/.claude/skills/project-init/skill.md
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Windows 예시도 README에 포함되어 있습니다.&lt;/p&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;mkdir &quot;%USERPROFILE%\.claude\skills\project-init&quot;
copy project-init\skill.md &quot;%USERPROFILE%\.claude\skills\project-init\skill.md&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;실행&lt;/h3&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;/project-init
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 기존 메모를 함께 붙여서 시작할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;/project-init
[paste your project idea or point to a file]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 사용 흐름&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;1. /project-init 실행
2. Claude가 질문을 하나씩 던짐
3. 답변하면서 프로젝트 조건 확정
4. 스택 요약 확인
5. CLAUDE.md + DEVELOPMENT_ROADMAP.md 생성
6. 그 다음부터 실제 구현 시작
&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;asciidoc&quot;&gt;&lt;code&gt;- 이 프로젝트는 누가 쓰는가?
- 첫 버전에서 꼭 필요한 기능은 무엇인가?
- 데이터는 어디서 오고 어디에 저장되는가?
- UI / API / 배치 중 무엇이 중심인가?
- 절대 깨지면 안 되는 규칙은 무엇인가?
- 비밀정보와 로그는 어떻게 다룰 것인가?
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 준비해두면 인터뷰 응답이 더 구체적이 되고, 생성되는 문서 품질도 함께 올라갑니다.&lt;/p&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;사이드 프로젝트는 보통 빨리 만들수록 좋다고 생각하기 쉽습니다.&lt;br /&gt;하지만 데이터 저장 방식, 인증 방식, 배포 방식이 늦게 결정되면 오히려 더 오래 걸립니다. 이때 /project-init는 최소한의 설계 질문을 먼저 통과하게 해줍니다. (&lt;a href=&quot;https://github.com/AlexZio00/claude-code-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) Claude Code를 팀에 처음 도입할 때&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 명은 프론트엔드 감각으로, 다른 한 명은 백엔드 감각으로, 또 다른 에이전트는 단순 기능 완성을 목표로 답을 내면 결과가 섞입니다.&lt;br /&gt;이럴 때 공통 기준 문서가 먼저 있어야 팀 전체의 방향이 맞습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) AI/LLM 기능이 들어가는 서비스 설계할 때&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;README에는 인터뷰 항목 중 하나로 AI / LLM 전략이 포함되어 있고, cloud vs local, cost gating을 묻는다고 되어 있습니다.&lt;br /&gt;즉, 모델을 붙일지 말지뿐 아니라 비용과 운영 정책도 초반에 정하도록 유도합니다. (&lt;a href=&quot;https://github.com/AlexZio00/claude-code-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) 규정이 중요한 프로젝트&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;/li&gt;
&lt;li&gt;외부 API 호출 위치를 엄격히 통제해야 한다&lt;/li&gt;
&lt;li&gt;feature flag 정책이 중요하다&lt;/li&gt;
&lt;li&gt;secrets 관리가 중요하다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 프로젝트는 &amp;ldquo;잘 만드는 것&amp;rdquo;만큼 &amp;ldquo;규칙을 안 깨는 것&amp;rdquo;이 중요합니다. /project-init는 이 부분에 특히 잘 맞습니다. (&lt;a href=&quot;https://github.com/AlexZio00/claude-code-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5) 두 번째 세션부터 자꾸 흔들리는 프로젝트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 세션에서는 잘 되는데, 다음 세션부터 설명이 달라지고 산출물이 흔들린다면 대부분 기준 문서가 없기 때문입니다. 이 경우 생성 속도를 높이기보다 기준점을 먼저 만드는 쪽이 더 효과적입니다.&lt;/p&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;공개 저장소에서 현재 명확히 확인되는 것은 /project-init 중심이다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 언급한 /harness-init, /team-init 구성은 이번 메시지의 설명에는 포함되어 있지만, 제가 확인한 공개 GitHub README에서는 현재 /project-init만 구체적으로 문서화되어 있습니다. 따라서 나머지 둘에 대해서는 저장소 문서상 확인되는 범위 이상으로 단정하면 안 됩니다. (&lt;a href=&quot;https://github.com/AlexZio00/claude-code-skills&quot;&gt;GitHub&lt;/a&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;인터뷰 기반 도구는 질문이 좋아도, 답변이 모호하면 결과 문서도 모호해집니다.&lt;br /&gt;즉, 이 스킬은 &amp;ldquo;생각을 대신해주는 도구&amp;rdquo;라기보다 &amp;ldquo;생각을 구조화해주는 도구&amp;rdquo;에 가깝습니다.&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.md와 로드맵이 생긴다고 해서 구현이 자동으로 좋아지는 것은 아닙니다.&lt;br /&gt;이 도구가 보장하는 것은 &amp;ldquo;방향&amp;rdquo;이지, &amp;ldquo;완성도&amp;rdquo; 자체는 아닙니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;매우 작은 실험에는 과할 수 있다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1시간짜리 실험 코드나 throwaway prototype이라면 인터뷰와 문서 생성이 오히려 무겁게 느껴질 수 있습니다.&lt;br /&gt;다만 &amp;ldquo;나중에도 이어갈 가능성&amp;rdquo;이 조금이라도 있다면, 초반 10분 구조화가 오히려 시간을 아껴줄 수 있습니다.&lt;/p&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;공개된 자료 기준으로 /project-init는 바로 그 지점을 겨냥한 스킬입니다. 코드를 쓰기 전에 질문을 통해 구조를 먼저 정하고, CLAUDE.md와 DEVELOPMENT_ROADMAP.md를 만들어 이후 작업의 공통 기준으로 삼습니다. (&lt;a href=&quot;https://github.com/AlexZio00/claude-code-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 이 도구는 &amp;ldquo;AI에게 빨리 시키는 사람&amp;rdquo;보다, &lt;b&gt;AI와 함께 오래 유지할 프로젝트를 시작하는 사람&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;Claude Code 초반 실패는 종종 모델 성능보다 &lt;b&gt;초기 구조 부재&lt;/b&gt;에서 시작된다.&lt;/li&gt;
&lt;li&gt;공개 저장소 기준 핵심 스킬인 /project-init는 인터뷰를 통해 CLAUDE.md와 로드맵을 먼저 만든다. (&lt;a href=&quot;https://github.com/AlexZio00/claude-code-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;핵심은 &amp;ldquo;코드 생성&amp;rdquo;보다 &lt;b&gt;불변 조건과 규칙을 먼저 고정하는 것&lt;/b&gt;이다.&lt;/li&gt;
&lt;li&gt;세션 전환, 에이전트 충돌, 늦은 하드 룰 추가 문제를 줄이는 데 특히 유리하다.&lt;/li&gt;
&lt;li&gt;다만 현재 공개 문서상 명확히 확인되는 범위는 /project-init 중심이므로, 다른 구성 요소는 별도 문서 확인이 필요하다. (&lt;a href=&quot;https://github.com/AlexZio00/claude-code-skills&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AI</category>
      <author>행복한 수지아빠</author>
      <guid isPermaLink="true">https://javaexpert.tistory.com/1719</guid>
      <comments>https://javaexpert.tistory.com/1719#entry1719comment</comments>
      <pubDate>Thu, 9 Apr 2026 09:29:01 +0900</pubDate>
    </item>
    <item>
      <title>Graphify : 카파시의 위키 구현 버전</title>
      <link>https://javaexpert.tistory.com/1718</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 GitHub 레포지토리 &lt;b&gt;graphify&lt;/b&gt;를 기준으로, 이 도구가 왜 필요한지부터 핵심 개념, 동작 방식, 설치 방법, 실무 활용 포인트까지 한 번에 정리한 글입니다. 공개된 README와 아키텍처 문서상 확인되는 범위에서 설명합니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 AI 코딩 도구를 쓰다 보면 비슷한 문제가 자주 생깁니다. 파일은 많고, 문서와 코드와 이미지가 섞여 있고, 모델은 매번 원본 파일을 다시 훑느라 느리고 비싸고 맥락을 놓칩니다. graphify는 이 문제를 &amp;ldquo;파일 모음&amp;rdquo;을 &lt;b&gt;질의 가능한 지식 그래프&lt;/b&gt;로 바꾸는 방식으로 풀려는 도구입니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 이 도구는 Claude Code, Codex, OpenCode, OpenClaw, Factory Droid 같은 AI 코딩 어시스턴트와 함께 쓰는 것을 전제로 설계되어 있습니다. 코드만이 아니라 PDF, 마크다운, 스크린샷, 다이어그램, 화이트보드 사진까지 하나의 그래프로 연결한다는 점이 핵심입니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&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;입니다. 질문이 들어올 때마다 AI가 grep, glob, 파일 열기, 문서 재읽기를 반복합니다. 코드베이스가 작을 때는 괜찮지만, 프로젝트가 커질수록 비용과 시간이 급격히 늘어납니다. graphify README도 이 문제를 &amp;ldquo;raw 파일을 계속 다시 읽는 방식&amp;rdquo;의 한계로 설명합니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서 특히 불편한 지점은 다음과 같습니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&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;코드와 문서가 분리되어 있다&lt;/b&gt;&lt;br /&gt;구현은 코드에 있고, 의사결정 배경은 README&amp;middot;설계 문서&amp;middot;주석&amp;middot;이미지에 흩어져 있습니다. AI가 한쪽만 보면 &amp;ldquo;무엇을 하는지&amp;rdquo;는 알아도 &amp;ldquo;왜 이렇게 만들었는지&amp;rdquo;를 놓치기 쉽습니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;질문할 때마다 원본을 다시 읽는다&lt;/b&gt;&lt;br /&gt;같은 프로젝트를 여러 번 물어보면 비슷한 파일을 반복해서 읽게 됩니다. graphify는 이를 피하기 위해 graph.json과 캐시를 남겨 재사용하도록 설계되어 있습니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;키워드 검색은 구조를 잘 보여주지 못한다&lt;/b&gt;&lt;br /&gt;&amp;ldquo;이 함수가 왜 여기 있지?&amp;rdquo;, &amp;ldquo;이 컴포넌트와 저 모듈은 어떻게 연결되지?&amp;rdquo; 같은 질문은 단순 텍스트 검색보다 관계 구조가 중요합니다. graphify는 이런 관계를 노드와 엣지로 정리합니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;멀티모달 자료를 함께 이해하기 어렵다&lt;/b&gt;&lt;br /&gt;코드, 논문, PDF, 스크린샷, 다이어그램을 같이 보는 작업은 일반적인 코드 인덱서만으로 처리하기 어렵습니다. graphify는 이 입력들을 하나의 그래프로 합치려 합니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AI가 추론한 내용과 실제 근거를 구분하기 어렵다&lt;/b&gt;&lt;br /&gt;답은 그럴듯하지만 어디까지가 사실인지 애매한 경우가 많습니다. graphify는 관계를 EXTRACTED, INFERRED, AMBIGUOUS로 태깅해 구분합니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;graphify란 무엇인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;graphify는 코드&amp;middot;문서&amp;middot;이미지 같은 프로젝트 자산을 읽어, AI가 재사용 가능한 지식 그래프로 변환해 주는 AI 코딩 어시스턴트용 스킬이자 Python 라이브러리입니다.&lt;/b&gt; (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말하면, &amp;ldquo;프로젝트 폴더를 그냥 파일 집합으로 두지 말고, 개념&amp;middot;구성요소&amp;middot;관계가 연결된 지도처럼 바꾸자&amp;rdquo;는 접근입니다. 그래서 AI가 매번 원문을 뒤지는 대신, 먼저 그래프와 리포트를 보고 전체 구조를 파악한 뒤 필요한 부분만 깊게 들어갈 수 있습니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 방식과의 차이는 분명합니다. 일반적인 검색 기반 접근이 &amp;ldquo;어떤 단어가 어디에 있나&amp;rdquo;를 찾는 데 강하다면, graphify는 &amp;ldquo;무엇이 무엇과 어떻게 연결되는가&amp;rdquo;를 먼저 드러냅니다. README는 이를 &amp;ldquo;assistant gets a map, then navigates precisely&amp;rdquo;라는 식으로 설명합니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&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;b&gt;코드 + 문서 + 이미지까지 처리하는 멀티모달 입력&lt;/b&gt;&lt;br /&gt;PDF, markdown, screenshot, diagram, whiteboard photo까지 그래프에 통합할 수 있습니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;코드는 AST 기반으로 먼저 분석&lt;/b&gt;&lt;br /&gt;코드 파일은 LLM 없이 deterministic AST pass로 구조를 추출합니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;문서와 이미지에는 병렬 서브에이전트 사용&lt;/b&gt;&lt;br /&gt;Claude subagent가 병렬로 개념, 관계, 설계 의도를 추출합니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;임베딩 없이 그래프 토폴로지로 클러스터링&lt;/b&gt;&lt;br /&gt;NetworkX 그래프 위에 Leiden community detection을 적용합니다. 별도 벡터 DB가 필수는 아닙니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;관계 신뢰도 레이블 제공&lt;/b&gt;&lt;br /&gt;EXTRACTED, INFERRED, AMBIGUOUS를 통해 근거 수준을 구분합니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;출력물이 실무 친화적&lt;/b&gt;&lt;br /&gt;graph.html, GRAPH_REPORT.md, graph.json, 캐시 디렉터리를 생성해 시각화&amp;middot;요약&amp;middot;재질의&amp;middot;증분 업데이트를 지원합니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실제로 어떤 효과가 있는가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;README에는 &lt;b&gt;&amp;ldquo;raw 파일을 직접 읽는 것 대비 질의당 71.5배 적은 토큰 사용&amp;rdquo;&lt;/b&gt; 이라는 표현이 나옵니다. 다만 이 수치는 레포지토리에서 제시한 값이므로, 일반적인 모든 프로젝트에서 동일하게 재현된다고 단정하기보다는 &lt;b&gt;제공된 자료 기준의 주장&lt;/b&gt;으로 보는 것이 맞습니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 효과는 크게 네 가지로 이해할 수 있습니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&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;br /&gt;그래프와 캐시가 남기 때문에, 같은 프로젝트를 여러 번 물어볼수록 이점이 커집니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;구조 중심 탐색 가능&lt;/b&gt;&lt;br /&gt;GRAPH_REPORT.md가 god node, community, surprising connection 같은 요약을 제공해, AI가 처음부터 구조를 보고 접근하게 만듭니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정확한 깊이 탐색 지원&lt;/b&gt;&lt;br /&gt;/graphify query, /graphify path, /graphify explain 같은 명령으로 특정 연결 경로와 관계를 더 깊게 추적할 수 있습니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;원본 근거와 추론의 분리&lt;/b&gt;&lt;br /&gt;관계마다 confidence 라벨이 있어, AI 답변을 검증하기 쉬워집니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&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;논문&amp;middot;이미지&amp;middot;메모가 섞인 연구형 저장소&lt;/b&gt;, &lt;b&gt;AI에게 반복적으로 아키텍처 질문을 던지는 팀 환경&lt;/b&gt;에서 더 유리합니다. 이 평가는 README와 아키텍처 문서의 설계 방향을 바탕으로 한 해석입니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;동작 원리 / 구조&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;graphify의 파이프라인은 아키텍처 문서에 비교적 명확하게 나와 있습니다. 전체 흐름은 다음과 같습니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify/blob/v3/ARCHITECTURE.md&quot;&gt;GitHub&lt;/a&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;detect&lt;/b&gt;&lt;br /&gt;입력 디렉터리에서 분석할 파일을 수집합니다. .graphifyignore를 통해 제외 패턴도 적용할 수 있습니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;extract&lt;/b&gt;&lt;br /&gt;각 파일에서 노드와 엣지를 뽑아냅니다. 코드 파일은 tree-sitter 기반 AST로, 문서&amp;middot;이미지는 별도 추출 흐름으로 처리됩니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;build_graph&lt;/b&gt;&lt;br /&gt;파일별 추출 결과를 NetworkX 그래프로 합칩니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;cluster&lt;/b&gt;&lt;br /&gt;그래프를 커뮤니티 단위로 묶습니다. README는 Leiden community detection을 사용한다고 설명합니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;analyze&lt;/b&gt;&lt;br /&gt;god node, surprising connection, suggested question 같은 분석 결과를 만듭니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;report / export&lt;/b&gt;&lt;br /&gt;GRAPH_REPORT.md, graph.html, graph.json, 필요 시 graph.svg, GraphML, Neo4j용 cypher, Obsidian vault 등으로 내보냅니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아키텍처 문서 기준으로 각 단계는 별도 모듈 함수로 분리되어 있고, dict와 NetworkX graph를 통해 데이터를 주고받습니다. 공유 상태를 최소화하고, 출력은 graphify-out/ 중심으로 관리합니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify/blob/v3/ARCHITECTURE.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 하나 중요한 점은 &lt;b&gt;관계 스키마&lt;/b&gt;입니다. 각 extractor는 nodes와 edges를 반환하고, edge는 relation과 confidence를 가집니다. 그래서 &amp;ldquo;어디서 나온 관계인지&amp;rdquo;, &amp;ldquo;직접 추출인지 추론인지&amp;rdquo;를 뒤에서 다시 추적할 수 있습니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify/blob/v3/ARCHITECTURE.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&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;Python 3.10 이상&lt;/b&gt;이며, Claude Code, Codex, OpenCode, OpenClaw, Factory Droid 중 하나가 필요합니다. 현재 PyPI 패키지 이름은 임시로 graphifyy이고, CLI 명령은 여전히 graphify입니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) 설치&lt;/h3&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;pip install graphifyy &amp;amp;&amp;amp; graphify install
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code 외 플랫폼은 다음처럼 설치 플래그를 다르게 줍니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;# Claude Code (Windows 자동 감지 가능)
graphify install --platform windows

# Codex
graphify install --platform codex

# OpenCode
graphify install --platform opencode

# OpenClaw
graphify install --platform claw

# Factory Droid
graphify install --platform droid
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Codex는 병렬 추출을 위해 ~/.codex/config.toml의 [features] 아래에 multi_agent = true 설정이 추가로 필요하다고 README에 적혀 있습니다. OpenClaw는 병렬 에이전트 지원이 아직 이른 단계라 순차 추출을 사용한다고 안내합니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) 첫 그래프 만들기&lt;/h3&gt;
&lt;pre class=&quot;erlang&quot;&gt;&lt;code&gt;/graphify .
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Codex에서는 / 대신 $를 사용합니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;gams&quot;&gt;&lt;code&gt;$graphify .
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 후에는 보통 다음 출력물이 생깁니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;graphify-out/
├── graph.html
├── GRAPH_REPORT.md
├── graph.json
└── cache/
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) 제외할 폴더 설정&lt;/h3&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# .graphifyignore
vendor/
node_modules/
dist/
*.generated.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.graphifyignore 문법은 .gitignore와 같습니다. 실행한 루트 기준 상대 경로로 매칭됩니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) 자주 쓰는 실행 옵션&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;/graphify ./raw --mode deep
/graphify ./raw --update
/graphify ./raw --cluster-only
/graphify ./raw --no-viz
/graphify ./raw --watch
/graphify ./raw --wiki
/graphify ./raw --svg
/graphify ./raw --graphml
/graphify ./raw --neo4j
/graphify ./raw --mcp
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서상 이 옵션들은 각각 더 공격적인 추론, 변경 파일만 재추출, 재클러스터링, HTML 생략, 파일 변경 감시, 에이전트가 읽기 쉬운 wiki 생성, SVG/GraphML/Neo4j/MCP 출력 등에 대응합니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5) 어시스턴트가 항상 그래프를 먼저 보게 만들기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;README는 이 방식을 권장합니다. 플랫폼별로 install 명령을 한 번 더 실행하면, Claude Code는 CLAUDE.md와 PreToolUse hook을 설치하고, 다른 플랫폼은 AGENTS.md에 규칙을 작성합니다. 목적은 AI가 raw 파일을 먼저 뒤지기 전에 GRAPH_REPORT.md를 읽게 만드는 것입니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;graphify claude install
graphify codex install
graphify opencode install
graphify claw install
graphify droid install
&lt;/code&gt;&lt;/pre&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;새 팀원이 들어왔을 때 가장 어려운 건 파일 위치가 아니라 &lt;b&gt;구조와 의사결정 배경&lt;/b&gt;입니다. graphify는 call graph, imports, docstrings, rationale comments, 문서 관계를 함께 묶어 구조 지도를 만들기 때문에 온보딩 초반에 유용합니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들면 이런 질문이 가능합니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;/graphify query &quot;authentication flow is connected to which modules?&quot;
/graphify path &quot;DigestAuth&quot; &quot;Response&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) 논문 + 코드 + 메모가 섞인 연구 저장소 정리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;README는 논문, 트윗, 스크린샷, 노트를 한 폴더에 쌓아두는 워크플로를 예로 듭니다. 이럴 때 graphify는 URL을 ingest하고 그래프를 업데이트하는 방식으로 자료를 연결합니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;/graphify add https://arxiv.org/abs/1706.03762
/graphify add https://x.com/karpathy/status/...
/graphify query &quot;what connects attention to the optimizer?&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) 아키텍처 질문에 답하는 AI 보조 도구&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;항상 켜진 규칙을 설치해 두면, AI가 grep부터 하는 대신 GRAPH_REPORT.md를 먼저 읽고 큰 구조를 잡습니다. README는 이것을 &amp;ldquo;구조 기반 탐색&amp;rdquo;으로 설명합니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&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;/li&gt;
&lt;li&gt;문서상 설계 의도와 실제 코드 연결이 맞는가&lt;/li&gt;
&lt;li&gt;서로 멀어 보이는 두 컴포넌트 사이 경로는 무엇인가 (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) 증분 업데이트가 필요한 프로젝트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;README에 따르면 캐시는 SHA256 기반이고, --update 옵션으로 변경된 파일만 다시 처리할 수 있습니다. 자주 바뀌는 저장소에서 전체 재분석 비용을 줄이는 데 유리합니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;/graphify ./project --update
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5) 다른 도구로 내보내는 그래프 파이프라인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GraphML, SVG, Neo4j, Obsidian vault, MCP server 같은 출력이 문서에 보입니다. 즉 graphify를 단순 시각화 도구가 아니라, &lt;b&gt;다른 분석 도구로 넘기는 중간 포맷 생성기&lt;/b&gt;로도 볼 수 있습니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;한계 / 주의할 점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 도구가 만능은 아닙니다. 문서상 확인되는 범위에서 주의할 점도 분명합니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&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;추론은 어디까지나 추론이다&lt;/b&gt;&lt;br /&gt;INFERRED와 AMBIGUOUS는 도움이 되지만, 사람이 검토해야 할 여지가 남습니다. 특히 설계 의도나 의미 관계는 과신하면 안 됩니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;지원 플랫폼 전제가 있다&lt;/b&gt;&lt;br /&gt;단독 Python 라이브러리로도 쓸 수 있지만, README는 특정 AI 코딩 어시스턴트 환경과의 결합을 중심으로 설명합니다. 즉 &amp;ldquo;일반적인 CLI 인덱서&amp;rdquo;와는 포지션이 조금 다릅니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;언어/기능 지원은 문서 기준으로 봐야 한다&lt;/b&gt;&lt;br /&gt;README에는 19개 언어 지원이라고 적혀 있지만, pyproject.toml에는 tree-sitter-julia도 보입니다. 이런 차이는 문서와 패키지 메타데이터 간 시점 차이일 수 있으므로, 실제 사용 전에는 현재 버전 기준 문서를 다시 확인하는 편이 안전합니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;클러스터링 품질은 그래프 품질에 의존한다&lt;/b&gt;&lt;br /&gt;임베딩 없이 그래프 토폴로지 기반으로 군집화한다는 점은 단순하고 명확하지만, 결국 초기에 추출된 노드&amp;middot;엣지 품질이 결과를 크게 좌우합니다. 이 평가는 문서에 적힌 구조를 바탕으로 한 해석입니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;추가 기능은 optional dependency가 필요할 수 있다&lt;/b&gt;&lt;br /&gt;mcp, neo4j, pdf, watch, leiden, office 등은 optional dependency로 나뉘어 있습니다. 기능에 따라 별도 설치가 필요할 수 있습니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify/blob/v3/pyproject.toml&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;graphify의 핵심은 단순합니다. &lt;b&gt;AI가 프로젝트를 파일 단위로 매번 다시 읽게 하지 말고, 먼저 구조화된 그래프를 보게 하자&lt;/b&gt;는 것입니다. 이 발상 덕분에 코드, 문서, 이미지, 메모가 섞인 저장소도 하나의 연결된 지도로 다룰 수 있습니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무적으로 보면 이 도구는 &amp;ldquo;정확한 검색&amp;rdquo;보다 &amp;ldquo;전체 구조 이해&amp;rdquo;가 더 중요한 팀에 잘 맞습니다. 특히 대형 코드베이스, 문서가 많은 프로젝트, 연구형 저장소, 그리고 AI 코딩 어시스턴트를 반복적으로 쓰는 환경에서 가치가 커집니다. 반대로 작은 프로젝트나 단순 텍스트 검색만 필요한 경우에는 체감 이점이 상대적으로 작을 수 있습니다. 이 역시 공개된 자료의 설계 의도를 바탕으로 한 정리입니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 graphify는 &lt;b&gt;AI에게 더 많은 파일을 보여주는 도구&lt;/b&gt;가 아니라, &lt;b&gt;AI가 더 적은 비용으로 더 구조적으로 이해하게 만드는 도구&lt;/b&gt;에 가깝습니다. &amp;ldquo;왜 이 코드가 이렇게 생겼는지&amp;rdquo;까지 빠르게 파악해야 하는 개발자에게 특히 유용한 접근입니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&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;graphify는 코드&amp;middot;문서&amp;middot;이미지를 &lt;b&gt;질의 가능한 지식 그래프&lt;/b&gt;로 바꾸는 AI 코딩 어시스턴트용 도구입니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;코드 구조는 AST 기반으로, 문서&amp;middot;이미지는 서브에이전트 기반으로 추출한 뒤 하나의 그래프로 합칩니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;출력물은 graph.html, GRAPH_REPORT.md, graph.json, 캐시 등이며, 반복 질의와 증분 업데이트에 유리합니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;EXTRACTED, INFERRED, AMBIGUOUS 레이블로 &lt;b&gt;사실과 추론을 구분&lt;/b&gt;할 수 있습니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;대형 코드베이스, 문서가 많은 프로젝트, 연구 저장소처럼 &lt;b&gt;구조 이해가 중요한 환경&lt;/b&gt;에서 특히 강점을 보입니다. (&lt;a href=&quot;https://github.com/safishamsi/graphify&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AI</category>
      <author>행복한 수지아빠</author>
      <guid isPermaLink="true">https://javaexpert.tistory.com/1718</guid>
      <comments>https://javaexpert.tistory.com/1718#entry1718comment</comments>
      <pubDate>Thu, 9 Apr 2026 09:27:28 +0900</pubDate>
    </item>
    <item>
      <title>VoiceStar 정리: 제로샷 TTS에서 음성 길이까지 제어하는 모델은 왜 주목받는가</title>
      <link>https://javaexpert.tistory.com/1717</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 &lt;b&gt;VoiceStar가 무엇인지, 왜 기존 제로샷 TTS보다 한 단계 더 주목받는지&lt;/b&gt;를 정리한 글입니다. 특히 &amp;ldquo;목소리만 비슷하게 복제하면 끝 아닌가?&amp;rdquo;가 아니라, &lt;b&gt;원하는 길이에 맞춰 음성을 만들고, 학습 때 본 것보다 더 긴 구간까지 안정적으로 생성하는 문제&lt;/b&gt;를 어떻게 다루는지에 초점을 맞춥니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 TTS는 품질만으로는 차별화가 어렵습니다. 실무에서는 &lt;b&gt;발화 길이 제어&lt;/b&gt;, &lt;b&gt;긴 문장 안정성&lt;/b&gt;, &lt;b&gt;말이 밀리거나 끊기지 않는 정렬&lt;/b&gt;, &lt;b&gt;빠른 테스트 환경&lt;/b&gt;이 더 중요해집니다. VoiceStar는 이 지점에서, 논문 기준으로 &lt;b&gt;제로샷 TTS에서 duration control과 extrapolation을 동시에 달성한 첫 모델&lt;/b&gt;로 소개됩니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 이런 분께 도움이 됩니다.&lt;br /&gt;제로샷 TTS를 처음 보는 개발자, 음성 합성 모델을 비교 중인 엔지니어, 그리고 &amp;ldquo;이 모델이 실무에서 왜 의미가 있지?&amp;rdquo;를 빠르게 이해하고 싶은 분입니다.&lt;/p&gt;
&lt;figure id=&quot;og_1775694366817&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - jasonppy/VoiceStar: VoiceStar: Robust, Duration-controllable TTS that can Extrapolate&quot; data-og-description=&quot;VoiceStar: Robust, Duration-controllable TTS that can Extrapolate - jasonppy/VoiceStar&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/jasonppy/VoiceStar&quot; data-og-url=&quot;https://github.com/jasonppy/VoiceStar&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/grvdh/dJMb84p9zXl/ufLbkve0B1GaeM9yQHGGO0/img.png?width=1200&amp;amp;height=600&amp;amp;face=986_135_1085_243,https://scrap.kakaocdn.net/dn/blr8d0/dJMb85WUgh4/N3HkIyQj4fSLQVAJdqYTj0/img.png?width=1200&amp;amp;height=600&amp;amp;face=986_135_1085_243&quot;&gt;&lt;a href=&quot;https://github.com/jasonppy/VoiceStar&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/jasonppy/VoiceStar&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/grvdh/dJMb84p9zXl/ufLbkve0B1GaeM9yQHGGO0/img.png?width=1200&amp;amp;height=600&amp;amp;face=986_135_1085_243,https://scrap.kakaocdn.net/dn/blr8d0/dJMb85WUgh4/N3HkIyQj4fSLQVAJdqYTj0/img.png?width=1200&amp;amp;height=600&amp;amp;face=986_135_1085_243');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - jasonppy/VoiceStar: VoiceStar: Robust, Duration-controllable TTS that can Extrapolate&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;VoiceStar: Robust, Duration-controllable TTS that can Extrapolate - jasonppy/VoiceStar&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;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;p data-ke-size=&quot;size16&quot;&gt;기존 TTS를 실제 서비스에 붙이면, 품질 못지않게 &lt;b&gt;제어 가능성&lt;/b&gt;이 문제로 드러납니다. 논문에서도 기존 neural codec LM 계열 TTS의 한계로 &lt;b&gt;정밀한 길이 제어 부족&lt;/b&gt;과 &lt;b&gt;학습 길이 밖 구간에서의 불안정성&lt;/b&gt;을 지적합니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서는 이런 불편이 자주 생깁니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;영상 더빙 길이를 맞추기 어렵다&lt;/b&gt;&lt;br /&gt;8초 슬롯에 들어가야 하는 음성이 6초나 11초로 나오면 편집 비용이 커집니다. VoiceStar는 이런 duration control 문제를 정면으로 다룹니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;긴 문장에서 누락&amp;middot;반복&amp;middot;이상한 침묵이 생긴다&lt;/b&gt;&lt;br /&gt;논문은 기존 NCLM 기반 TTS가 단어를 건너뛰거나, 반복하거나, 부자연스러운 침묵을 넣는 문제를 언급합니다. 긴 발화일수록 더 치명적입니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;텍스트와 음성 정렬이 흐트러진다&lt;/b&gt;&lt;br /&gt;텍스트와 음성 토큰 정렬을 모델이 암묵적으로만 배우게 두면, 문장 길이가 길어질수록 어긋날 가능성이 커집니다. VoiceStar는 이를 PM-RoPE로 보완합니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;제로샷 보이스 클로닝이 prosody까지 과하게 끌려간다&lt;/b&gt;&lt;br /&gt;참고 음성의 화자 특성만 가져오고 싶은데, 억양과 감정까지 같이 끌려오면 목표 텍스트와 어울리지 않는 출력이 나올 수 있습니다. VoiceStar는 CPM training으로 이 문제를 줄이려 합니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;연구 데모는 좋은데 바로 써보기 어렵다&lt;/b&gt;&lt;br /&gt;저장소 기준으로 VoiceStar는 CLI와 Gradio UI를 모두 제공해서, 모델 비교나 빠른 프로토타이핑 진입 장벽을 낮춥니다. (&lt;a href=&quot;https://github.com/jasonppy/VoiceStar&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;VoiceStar란 무엇인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;VoiceStar는 제로샷 음성 복제 TTS에 &amp;ldquo;출력 길이 제어&amp;rdquo;와 &amp;ldquo;학습 길이 밖 생성&amp;rdquo;을 결합한 오토리그레시브 neural codec language model&lt;/b&gt;입니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&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;/li&gt;
&lt;li&gt;그 사람의 목소리 스타일을 따라가며&lt;/li&gt;
&lt;li&gt;원하는 텍스트를 읽게 하되&lt;/li&gt;
&lt;li&gt;&lt;b&gt;출력 길이도 목표치에 맞추고&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;학습 때 본 최대 길이보다 더 긴 발화도 비교적 안정적으로 생성&lt;/b&gt;하려는 모델입니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 방식과 다른 점은, 단순히 &amp;ldquo;좋은 음성&amp;rdquo;을 만드는 데서 끝나지 않고 &lt;b&gt;정렬과 길이 제어를 모델 구조 자체에 넣었다&lt;/b&gt;는 점입니다. VoiceStar는 encoder-decoder 구조에 &lt;b&gt;PM-RoPE&lt;/b&gt;를 적용해 텍스트와 음성의 진행 상황을 함께 추적하도록 설계되었습니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&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;b&gt;제로샷 보이스 클로닝 TTS&lt;/b&gt;&lt;br /&gt;학습 때 보지 못한 화자도 참고 음성만으로 합성합니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;출력 duration control&lt;/b&gt;&lt;br /&gt;생성 음성의 목표 길이를 조건으로 줄 수 있습니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;길이 extrapolation&lt;/b&gt;&lt;br /&gt;학습 최대 길이보다 긴 구간에서도 성능을 유지하도록 설계됐습니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PM-RoPE 기반 정렬 개선&lt;/b&gt;&lt;br /&gt;텍스트-음성 토큰 정렬과 생성 진행률 추적을 동시에 돕습니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CPM training 적용&lt;/b&gt;&lt;br /&gt;speech continuation만 학습할 때 생기는 train/inference mismatch를 줄이고, intelligibility와 naturalness를 개선하려는 접근입니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CLI + Gradio 지원&lt;/b&gt;&lt;br /&gt;저장소에서 바로 커맨드라인과 웹 UI 방식 모두로 실행할 수 있습니다. (&lt;a href=&quot;https://github.com/jasonppy/VoiceStar&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실제로 어떤 효과가 있는가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;논문 기준으로 VoiceStar의 핵심 메시지는 명확합니다. &lt;b&gt;짧은 구간에서는 기존 강한 모델과 비슷하거나 더 좋고, 긴 구간에서는 특히 강하다&lt;/b&gt;는 점입니다. 저자들은 VoiceStar가 short-form benchmark에서는 SOTA와 비슷하거나 더 좋고, &lt;b&gt;20초~50초 long-form / extrapolation benchmark에서는 intelligibility와 naturalness 측면에서 크게 앞선다&lt;/b&gt;고 설명합니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&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;최대 30초 길이 컨텍스트로 학습&lt;/b&gt;되었습니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;그런데 평가에서는 &lt;b&gt;20&amp;ndash;30초, 30&amp;ndash;40초, 40&amp;ndash;50초&lt;/b&gt; 구간을 따로 측정합니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;주 모델은 &lt;b&gt;840M 파라미터&lt;/b&gt;입니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;40&amp;ndash;50초 extrapolation 구간에서 논문 표 기준 VoiceStar의 WER은 &lt;b&gt;11.91&lt;/b&gt;로, 비교된 F5-TTS &lt;b&gt;52.44&lt;/b&gt;, MaskGCT &lt;b&gt;82.29&lt;/b&gt;보다 훨씬 낮게 보고됩니다. 제공된 자료 기준 긴 구간 intelligibility 차이가 꽤 큽니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 한 가지는 정확히 짚고 가야 합니다.&lt;br /&gt;질문에서 &amp;ldquo;30초 데이터로 학습한 후 50초까지 음성을 만든다&amp;rdquo;고 요약하셨는데, &lt;b&gt;논문 기준으로는 30초까지 학습하고 40&amp;ndash;50초 평가 구간에서 외삽 성능을 검증&lt;/b&gt;한 것이 더 정확합니다. 또 데모 페이지 TL;DR에는 &lt;b&gt;30초 학습, 40초 생성&lt;/b&gt;이라는 표현이 보입니다. 따라서 &amp;ldquo;항상 50초까지 생성 가능&amp;rdquo;이라고 단정하기보다, &lt;b&gt;문서상 확인되는 범위에서는 30초 학습 대비 40~50초 구간 외삽 성능을 실험으로 보여줬다&lt;/b&gt;고 정리하는 편이 안전합니다. (&lt;a href=&quot;https://jasonppy.github.io/VoiceStar_web/?utm_source=chatgpt.com&quot;&gt;Puyuan Peng&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;속도에 대해서도 보수적으로 보는 게 좋습니다. 저장소와 사용자 설명만 보면 &amp;ldquo;가볍고 빠르다&amp;rdquo;는 인상을 받을 수 있지만, &lt;b&gt;논문 부록에는 840M 모델의 real-time factor가 1보다 커서 faster-than-real-time 생성은 아니라고 명시&lt;/b&gt;돼 있습니다. 따라서 &amp;ldquo;고품질 대비 상대적으로 현실적인 크기&amp;rdquo;라고 보는 편이 맞고, &lt;b&gt;실시간 TTS용 초고속 모델&lt;/b&gt;이라고 단정하면 과합니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;동작 원리 / 구조&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VoiceStar의 흐름은 크게 이렇게 이해하면 됩니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&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;텍스트를 phoneme 단위로 변환한다&lt;/b&gt;&lt;br /&gt;논문과 저장소 모두 espeak-ng 기반 phonemizer 사용을 전제로 합니다. 텍스트를 바로 넣기보다 음소 단위 표현을 사용해 정렬을 더 다루기 쉽게 만듭니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;참고 음성을 neural codec token으로 바꾼다&lt;/b&gt;&lt;br /&gt;VoiceStar는 Encodec 기반 speech tokenizer를 사용합니다. 음성을 연속 파형이 아니라 discrete token 시퀀스로 다룹니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;encoder-decoder 구조로 텍스트와 음성을 연결한다&lt;/b&gt;&lt;br /&gt;일반적인 decoder-only보다 텍스트-음성 관계를 더 명확히 다루려는 선택입니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PM-RoPE가 진행률과 목표 길이를 함께 반영한다&lt;/b&gt;&lt;br /&gt;이 부분이 핵심입니다. PM-RoPE는
&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;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CPM training으로 reference와 target의 괴리를 줄인다&lt;/b&gt;&lt;br /&gt;항상 같은 발화의 continuation만 학습시키지 않고, 같은 화자의 다른 발화를 reference prompt로 섞어 사용합니다. 이 덕분에 화자 특성과 발화 내용&amp;middot;억양을 더 잘 분리하도록 유도합니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;추론 시 target duration을 조건으로 넣어 생성한다&lt;/b&gt;&lt;br /&gt;그래서 사용자가 &amp;ldquo;이 문장은 8초 정도로 읽어줘&amp;rdquo; 같은 식의 제어를 걸 수 있습니다. 저장소 예제에서도 --target_duration 인자를 직접 받습니다. (&lt;a href=&quot;https://github.com/jasonppy/VoiceStar&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치 / 사용 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장소 README 기준 기본 흐름은 다음과 같습니다. (&lt;a href=&quot;https://github.com/jasonppy/VoiceStar&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) 모델 다운로드&lt;/h3&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;# VoiceStar 루트 디렉터리 기준
wget -O ./pretrained/encodec_6f79c6a8.th \
  https://huggingface.co/pyp1/Encodec_VoiceStar/resolve/main/encodec_4cb2048_giga.th?download=true

wget -O ./pretrained/VoiceStar_840M_30s.pth \
  https://huggingface.co/pyp1/VoiceStar/resolve/main/VoiceStar_840M_30s.pth?download=true

wget -O ./pretrained/VoiceStar_840M_40s.pth \
  https://huggingface.co/pyp1/VoiceStar/resolve/main/VoiceStar_840M_40s.pth?download=true
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) 추론용 환경 구성&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;conda create -n voicestar python=3.10
conda activate voicestar

pip install torch==2.5.1 torchaudio==2.5.1 --index-url https://download.pytorch.org/whl/cu124
pip install numpy tqdm fire
pip install phonemizer==3.2.1
apt-get install espeak-ng
pip install torchmetrics
pip install einops
pip install omegaconf==2.3.0
pip install openai-whisper
pip install gradio
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) CLI로 바로 실행&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;README 예제는 다음과 같습니다. reference_speech, target_text, target_duration 세 가지가 핵심입니다. (&lt;a href=&quot;https://github.com/jasonppy/VoiceStar&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;python inference_commandline.py \
  --reference_speech &quot;./demo/5895_34622_000026_000002.wav&quot; \
  --target_text &quot;I cannot believe that the same model can also do text to speech synthesis too! And you know what? this audio is 8 seconds long.&quot; \
  --target_duration 8
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) Gradio 웹 UI 실행&lt;/h3&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;python inference_gradio.py
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5) 조절 가능한 하이퍼파라미터 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;README는 inference_commandline.py 안의 run_inference 시그니처를 보라고 안내합니다. 즉, 기본 예제 외에도 추론 옵션을 코드 수준에서 조절할 수 있습니다. (&lt;a href=&quot;https://github.com/jasonppy/VoiceStar&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&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;광고, 쇼츠, 튜토리얼 더빙은 슬롯 길이가 고정입니다.&lt;br /&gt;이때 &amp;ldquo;목소리 유사도&amp;rdquo;만으로는 부족하고, &lt;b&gt;정해진 초 안에 자연스럽게 끝나는지&lt;/b&gt;가 중요합니다. VoiceStar의 duration control이 가장 직접적으로 먹히는 시나리오입니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&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;짧은 문장은 대부분 모델이 잘 만듭니다. 차이는 긴 문장에서 드러납니다.&lt;br /&gt;VoiceStar는 20&amp;ndash;50초 long-form 평가를 별도로 수행했다는 점에서, 긴 발화 안정성을 확인해 보기 좋은 대상입니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&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;데이터를 길게 모으지 않고도 참고 음성으로 빠르게 톤 테스트를 해볼 수 있습니다. 데모 페이지는 &amp;ldquo;몇 초의 음성만 필요하다&amp;rdquo;고 설명합니다. (&lt;a href=&quot;https://jasonppy.github.io/VoiceStar_web/?utm_source=chatgpt.com&quot;&gt;Puyuan Peng&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 연구 비교 베이스라인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PM-RoPE, CPM training, prompt repetition 같은 아이디어가 분리되어 있어,&lt;br /&gt;&amp;ldquo;길이 제어는 어디서 좋아졌는가&amp;rdquo;, &amp;ldquo;화자 유사도는 어떤 트릭이 먹히는가&amp;rdquo;를 분석하기 좋습니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. CLI와 UI를 함께 쓰는 팀 환경&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연구자는 CLI로 반복 실험하고, 비개발자는 Gradio로 샘플을 들어보는 식으로 역할을 나누기 좋습니다. 저장소 구조도 이 흐름에 맞춰져 있습니다. (&lt;a href=&quot;https://github.com/jasonppy/VoiceStar&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&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;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;br /&gt;840M 모델은 논문 기준 real-time factor가 1보다 커서 faster-than-real-time은 아닙니다. 실시간 음성 비서보다 오프라인 생성&amp;middot;배치 처리 쪽에 더 어울립니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;현재 공개 자료는 영어 중심&lt;/b&gt;&lt;br /&gt;논문은 영어 데이터셋을 중심으로 학습&amp;middot;평가합니다. 한국어 다국어 일반화는 공개 자료만으로 단정하기 어렵습니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;설치 난이도가 아주 낮지는 않다&lt;/b&gt;&lt;br /&gt;espeak-ng, specific torch 버전, pretrained weight 다운로드 등 준비 단계가 있습니다. &amp;ldquo;웹 UI 지원&amp;rdquo;이 곧 &amp;ldquo;설치 없이 바로 사용 가능&amp;rdquo;을 뜻하는 것은 아닙니다. (&lt;a href=&quot;https://github.com/jasonppy/VoiceStar&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;50초 생성 가능을 보장한다고 해석하면 과하다&lt;/b&gt;&lt;br /&gt;문서상 확인되는 범위에서는 30초 학습 길이 대비 40~50초 구간에서 외삽 성능을 평가한 것입니다. 항상 어떤 입력이든 50초까지 안정 생성한다고 일반화하면 과장입니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;라이선스도 확인해야 한다&lt;/b&gt;&lt;br /&gt;코드 라이선스는 MIT이고, 모델 가중치는 CC-BY-4.0으로 표기되어 있습니다. 상용 활용 전에는 데이터&amp;middot;가중치 라이선스를 별도로 확인하는 것이 안전합니다. (&lt;a href=&quot;https://github.com/jasonppy/VoiceStar&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VoiceStar의 핵심은 단순히 &amp;ldquo;좋은 목소리 복제&amp;rdquo;가 아닙니다.&lt;br /&gt;&lt;b&gt;제로샷 TTS에 길이 제어와 긴 구간 안정성이라는 실무 문제를 구조적으로 풀어 넣었다&lt;/b&gt;는 점이 더 중요합니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 PM-RoPE는 텍스트와 음성 정렬, 목표 길이 인식, 길이 외삽을 하나의 흐름으로 묶어 설명한다는 점에서 인상적입니다. 여기에 CPM training까지 더해, 단순 continuation 기반 보이스 클로닝이 갖는 한계를 줄이려는 방향도 분명합니다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 이 도구는 &lt;b&gt;&amp;ldquo;길이까지 통제되는 제로샷 TTS&amp;rdquo;가 필요한 사람&lt;/b&gt;, 그리고 &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;VoiceStar는 &lt;b&gt;제로샷 TTS + duration control + extrapolation&lt;/b&gt;을 함께 내세운 모델이다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;핵심 아이디어는 &lt;b&gt;PM-RoPE&lt;/b&gt;와 &lt;b&gt;CPM training&lt;/b&gt;이다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;논문 기준 &lt;b&gt;최대 30초 길이로 학습하고 40~50초 구간까지 평가&lt;/b&gt;해 외삽 성능을 보여준다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;공개 저장소 기준으로 &lt;b&gt;CLI와 Gradio UI&lt;/b&gt;를 모두 제공한다. (&lt;a href=&quot;https://github.com/jasonppy/VoiceStar&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;다만 &lt;b&gt;실시간 초고속 모델로 단정하기는 어렵고&lt;/b&gt;, 영어 중심 공개 자료라는 점도 함께 봐야 한다. (&lt;a href=&quot;https://arxiv.org/html/2505.19462v2&quot;&gt;arXiv&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AI</category>
      <author>행복한 수지아빠</author>
      <guid isPermaLink="true">https://javaexpert.tistory.com/1717</guid>
      <comments>https://javaexpert.tistory.com/1717#entry1717comment</comments>
      <pubDate>Thu, 9 Apr 2026 09:26:21 +0900</pubDate>
    </item>
    <item>
      <title>TypeScript로 AI 에이전트를 만들 때 VoltAgent를 볼 만한 이유</title>
      <link>https://javaexpert.tistory.com/1716</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;최근 에이전트 개발은 &amp;ldquo;모델 호출&amp;rdquo; 자체보다도 &lt;b&gt;라우팅, 메모리, 툴 연결, 워크플로, 관찰 가능성&lt;/b&gt; 같은 주변 인프라가 더 어렵습니다. VoltAgent는 이 부분을 TypeScript 중심으로 묶어, 에이전트 로직보다 인프라 조립에 시간을 덜 쓰게 하려는 방향을 갖고 있습니다. (&lt;a href=&quot;https://github.com/VoltAgent/voltagent&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 JavaScript&amp;middot;TypeScript 스택에서 서버와 UI를 함께 다루는 개발자라면 볼 이유가 있습니다. 공식 문서 기준으로 VoltAgent는 &lt;b&gt;Vercel AI SDK 위에 구축&lt;/b&gt;되어 있고, 모델 문자열 기반 설정과 TypeScript API를 통해 여러 모델 제공자를 바꿔 끼울 수 있게 설계되어 있습니다. (&lt;a href=&quot;https://voltagent.dev/docs/getting-started/providers-models/&quot;&gt;voltagent.dev&lt;/a&gt;)&lt;/p&gt;
&lt;figure id=&quot;og_1775694284793&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - VoltAgent/voltagent: AI Agent Engineering Platform built on an Open Source TypeScript AI Agent Framework&quot; data-og-description=&quot;AI Agent Engineering Platform built on an Open Source TypeScript AI Agent Framework - VoltAgent/voltagent&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/VoltAgent/voltagent&quot; data-og-url=&quot;https://github.com/VoltAgent/voltagent&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/olHmY/dJMb87f7n6q/G8mlt76kUXkOzVeJQMChu1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/byBJtL/dJMb83SjK25/Ynj96Eu8OPiIbnHEUDC9kk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/gFtcS/dJMb8869JiC/KXvdXlzM0FDIKDWMx4wjd0/img.png?width=3422&amp;amp;height=1758&amp;amp;face=0_0_3422_1758&quot;&gt;&lt;a href=&quot;https://github.com/VoltAgent/voltagent&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/VoltAgent/voltagent&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/olHmY/dJMb87f7n6q/G8mlt76kUXkOzVeJQMChu1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/byBJtL/dJMb83SjK25/Ynj96Eu8OPiIbnHEUDC9kk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/gFtcS/dJMb8869JiC/KXvdXlzM0FDIKDWMx4wjd0/img.png?width=3422&amp;amp;height=1758&amp;amp;face=0_0_3422_1758');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - VoltAgent/voltagent: AI Agent Engineering Platform built on an Open Source TypeScript AI Agent Framework&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AI Agent Engineering Platform built on an Open Source TypeScript AI Agent Framework - VoltAgent/voltagent&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;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;p data-ke-size=&quot;size16&quot;&gt;에이전트 프로젝트는 처음엔 간단해 보여도, 실무에 들어가면 금방 복잡해집니다. 프롬프트 하나로 끝나는 수준을 넘어서면 &amp;ldquo;어떤 툴을 언제 호출할지&amp;rdquo;, &amp;ldquo;이전 대화를 어디까지 기억할지&amp;rdquo;, &amp;ldquo;여러 에이전트를 어떻게 분업시킬지&amp;rdquo;, &amp;ldquo;문제가 났을 때 어디서 디버깅할지&amp;rdquo;가 바로 병목이 됩니다. (&lt;a href=&quot;https://voltagent.dev/docs/agents/overview/?utm_source=chatgpt.com&quot;&gt;voltagent.dev&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 방식에서 자주 생기는 불편은 대체로 이렇습니다. 공식 문서가 강조하는 기능 목록을 거꾸로 보면, 바로 이런 문제를 겨냥하고 있다는 뜻이기도 합니다. (&lt;a href=&quot;https://github.com/VoltAgent/voltagent&quot;&gt;GitHub&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;툴 연결이 제각각&lt;/b&gt;입니다. API 호출, 스키마 검증, 취소 처리, MCP 연결을 각자 따로 붙이면 코드가 금방 지저분해집니다. (&lt;a href=&quot;https://github.com/VoltAgent/voltagent&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;메모리 설계가 애매&lt;/b&gt;합니다. 단순 메시지 히스토리만 둘지, 영속 저장을 붙일지, 의미 기반 검색까지 넣을지 매번 따로 판단해야 합니다. (&lt;a href=&quot;https://voltagent.dev/docs/agents/memory/overview/?utm_source=chatgpt.com&quot;&gt;voltagent.dev&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;멀티 에이전트 구성이 번거롭습니다.&lt;/b&gt; 역할별 에이전트를 나누고 supervisor가 위임하도록 짜려면 라우팅과 컨텍스트 전달을 직접 관리해야 합니다. (&lt;a href=&quot;https://voltagent.dev/docs/agents/sub-agents/?utm_source=chatgpt.com&quot;&gt;voltagent.dev&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;워크플로가 금방 커스텀 제어 흐름 지옥이 됩니다.&lt;/b&gt; 단순 체인에서 조건 분기, 재시도, 승인 흐름이 들어가는 순간 관리가 어려워집니다. (&lt;a href=&quot;https://voltagent.dev/docs/workflows/overview/?utm_source=chatgpt.com&quot;&gt;voltagent.dev&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;운영 단계에서 추적이 어렵습니다.&lt;/b&gt; 에이전트가 왜 그런 응답을 냈는지, 어느 툴이 호출됐는지, 어느 단계에서 실패했는지 바로 보기 어렵습니다. VoltAgent는 이 지점을 observability와 evals로 함께 가져가려 합니다. (&lt;a href=&quot;https://github.com/VoltAgent/voltagent&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 이런 상황에서 문제가 더 크게 드러납니다. (&lt;a href=&quot;https://voltagent.dev/actions-triggers-docs/triggers/github/?utm_source=chatgpt.com&quot;&gt;voltagent.dev&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;GitHub 이벤트를 받아 코드 리뷰 에이전트를 돌리는 경우&lt;/li&gt;
&lt;li&gt;사내 문서를 RAG로 묶어 지원 봇을 만드는 경우&lt;/li&gt;
&lt;li&gt;HR&amp;middot;교육&amp;middot;개발 도메인처럼 외부 시스템 연동이 많은 경우&lt;/li&gt;
&lt;li&gt;승인 프로세스처럼 단계형 자동화가 필요한 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;VoltAgent란 무엇인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;VoltAgent는 TypeScript로 AI 에이전트를 만들고 오케스트레이션하기 위한 오픈소스 프레임워크&lt;/b&gt;입니다. 공식 표현으로는 더 넓게 &amp;ldquo;AI Agent Engineering Platform&amp;rdquo;이며, 오픈소스 프레임워크와 운영용 VoltOps 콘솔로 구성됩니다. (&lt;a href=&quot;https://github.com/VoltAgent/voltagent&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말하면, &amp;ldquo;LLM 호출 코드 몇 줄&amp;rdquo;이 아니라 &lt;b&gt;에이전트에 필요한 공통 부품을 프레임워크로 제공하는 도구&lt;/b&gt;에 가깝습니다. 에이전트, 메모리, 워크플로, 서브에이전트, 툴, MCP, RAG, 가드레일, 스트리밍 같은 요소를 하나의 개발 경험 안에 넣으려는 접근입니다. (&lt;a href=&quot;https://github.com/VoltAgent/voltagent&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 Python 중심 생태계와의 차별점은, 적어도 공식 문서 기준으로는 &lt;b&gt;TypeScript 네이티브 경험&lt;/b&gt;과 &lt;b&gt;Vercel AI SDK 친화성&lt;/b&gt;입니다. 즉 JS/TS 앱 안에서 모델 교체, 스트리밍, 툴 호출, 서버 노출을 같은 스택으로 가져가기 쉽다는 점이 핵심입니다. (&lt;a href=&quot;https://voltagent.dev/docs/getting-started/providers-models/&quot;&gt;voltagent.dev&lt;/a&gt;)&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;b&gt;TypeScript 중심 설계&lt;/b&gt;&lt;br /&gt;에이전트, 툴, 워크플로를 타입 안전하게 정의하는 방향이 강합니다. (&lt;a href=&quot;https://github.com/VoltAgent/voltagent&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Vercel AI SDK 기반&lt;/b&gt;&lt;br /&gt;OpenAI, Anthropic, Google 등 여러 제공자를 같은 패턴으로 연결할 수 있습니다. (&lt;a href=&quot;https://voltagent.dev/docs/getting-started/providers-models/&quot;&gt;voltagent.dev&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Supervisor + Sub-agent 구조 지원&lt;/b&gt;&lt;br /&gt;역할이 다른 에이전트를 분업시키고 supervisor가 조율하는 구조를 기본 개념으로 제공합니다. (&lt;a href=&quot;https://github.com/VoltAgent/voltagent&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;메모리와 RAG 내장 방향&lt;/b&gt;&lt;br /&gt;인메모리부터 LibSQL, Postgres, Supabase, semantic search까지 문서화돼 있습니다. (&lt;a href=&quot;https://voltagent.dev/docs/agents/memory/overview/?utm_source=chatgpt.com&quot;&gt;voltagent.dev&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;워크플로 엔진 제공&lt;/b&gt;&lt;br /&gt;다단계 자동화를 선언적으로 기술할 수 있게 설계돼 있습니다. 다만 문서상 &amp;ldquo;Preview&amp;rdquo; 상태입니다. (&lt;a href=&quot;https://voltagent.dev/docs/workflows/overview/?utm_source=chatgpt.com&quot;&gt;voltagent.dev&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MCP와 운영 기능까지 연결&lt;/b&gt;&lt;br /&gt;툴 레지스트리, MCP, guardrails, evals, observability까지 프레임워크 주변을 넓게 커버합니다. (&lt;a href=&quot;https://github.com/VoltAgent/voltagent&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&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;입니다. 공식 Quick Start만 봐도 에이전트 정의, 메모리, 서버, 워크플로 등록이 한 흐름 안에 들어가 있습니다. 즉 &amp;ldquo;대화형 에이전트 하나 띄우기&amp;rdquo;에서 끝나지 않고, 이후 확장을 염두에 둔 구조를 바로 가져갈 수 있습니다. (&lt;a href=&quot;https://github.com/VoltAgent/voltagent&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 하나는 &lt;b&gt;모델 공급자 교체 비용을 낮추려는 설계&lt;/b&gt;입니다. 문서상으로는 모델 문자열을 쓰거나 AI SDK provider를 직접 넘길 수 있어, 특정 제공자에 강하게 잠기지 않도록 되어 있습니다. (&lt;a href=&quot;https://voltagent.dev/docs/getting-started/providers-models/&quot;&gt;voltagent.dev&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 운영 신뢰도 측면에서는, VoltAgent 측이 공개한 고객 사례 페이지가 존재합니다. Joggr, MagicSchool AI, Service Hero Marketing 등 사례가 소개되어 있어 &amp;ldquo;프로덕션 지향&amp;rdquo; 메시지 자체는 공식 자료에서 확인됩니다. 다만 개별 사례의 성과 수치나 일반화 가능성은 각 케이스 문맥이 다르므로 그대로 보편화해서 받아들이기보다는 참고 자료로 보는 편이 안전합니다. (&lt;a href=&quot;https://voltagent.dev/customers/?utm_source=chatgpt.com&quot;&gt;voltagent.dev&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 효과가 큰 팀은 대체로 이렇습니다. (&lt;a href=&quot;https://github.com/VoltAgent/voltagent&quot;&gt;GitHub&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;Next.js나 Node.js 기반으로 제품을 만들고 있는 팀&lt;/li&gt;
&lt;li&gt;프런트엔드와 백엔드를 모두 TypeScript로 가져가는 팀&lt;/li&gt;
&lt;li&gt;단일 챗봇이 아니라 툴 호출, 메모리, 자동화가 함께 필요한 팀&lt;/li&gt;
&lt;li&gt;Python 중심 프레임워크 대신 JS 친화적인 선택지를 찾는 팀&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;동작 원리 / 구조&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VoltAgent의 구조를 아주 단순하게 그리면 아래 흐름에 가깝습니다. 공식 문서의 Agent, Memory, Sub-agents, Workflows, Providers 구조를 바탕으로 재구성한 설명입니다. (&lt;a href=&quot;https://voltagent.dev/docs/agents/overview/?utm_source=chatgpt.com&quot;&gt;voltagent.dev&lt;/a&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;Agent를 정의합니다.&lt;/b&gt;&lt;br /&gt;이름, instructions, model, tools, memory를 묶어서 하나의 실행 단위를 만듭니다. (&lt;a href=&quot;https://github.com/VoltAgent/voltagent&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Model provider를 연결합니다.&lt;/b&gt;&lt;br /&gt;openai(&quot;gpt-4o-mini&quot;)처럼 직접 provider를 넘기거나, &quot;openai/gpt-4o-mini&quot; 같은 문자열로 라우팅할 수 있습니다. (&lt;a href=&quot;https://voltagent.dev/docs/getting-started/providers-models/&quot;&gt;voltagent.dev&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Tool과 MCP를 붙입니다.&lt;/b&gt;&lt;br /&gt;에이전트가 외부 세계와 상호작용할 수 있도록 툴을 등록하고, 필요하면 MCP 서버도 연결합니다. (&lt;a href=&quot;https://github.com/VoltAgent/voltagent&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Memory를 연결합니다.&lt;/b&gt;&lt;br /&gt;기본 인메모리부터 시작해, 필요하면 LibSQL&amp;middot;Postgres&amp;middot;Supabase 등으로 영속 저장을 붙입니다. semantic search도 확장 가능합니다. (&lt;a href=&quot;https://voltagent.dev/docs/agents/memory/in-memory/?utm_source=chatgpt.com&quot;&gt;voltagent.dev&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Supervisor가 서브에이전트에 위임합니다.&lt;/b&gt;&lt;br /&gt;복잡한 작업은 역할별 sub-agent에 나누고, supervisor가 작업을 라우팅합니다. 컨텍스트는 하위 에이전트에 전달됩니다. (&lt;a href=&quot;https://voltagent.dev/docs/agents/sub-agents/?utm_source=chatgpt.com&quot;&gt;voltagent.dev&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;워크플로로 다단계 실행을 구성합니다.&lt;/b&gt;&lt;br /&gt;단순 질의응답을 넘어 승인, 처리, 후속 액션 같은 자동화 흐름을 붙일 수 있습니다. (&lt;a href=&quot;https://voltagent.dev/docs/workflows/overview/?utm_source=chatgpt.com&quot;&gt;voltagent.dev&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;서버/API로 노출합니다.&lt;/b&gt;&lt;br /&gt;문서상 에이전트는 직접 메서드 호출로 쓰거나 REST API 형태로 노출할 수 있습니다. Quick Start 예시는 honoServer()를 사용합니다. (&lt;a href=&quot;https://voltagent.dev/docs/agents/overview/?utm_source=chatgpt.com&quot;&gt;voltagent.dev&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치 / 사용 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 빠른 시작점은 공식 CLI입니다. (&lt;a href=&quot;https://github.com/VoltAgent/voltagent&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;npm create voltagent-app@latest
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트를 만든 뒤 개발 서버를 실행합니다. (&lt;a href=&quot;https://github.com/VoltAgent/voltagent&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서와 README에 나오는 기본 흐름은 대략 이런 형태입니다. (&lt;a href=&quot;https://github.com/VoltAgent/voltagent&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;import { VoltAgent, Agent, Memory } from &quot;@voltagent/core&quot;;
import { LibSQLMemoryAdapter } from &quot;@voltagent/libsql&quot;;
import { honoServer } from &quot;@voltagent/server-hono&quot;;
import { openai } from &quot;@ai-sdk/openai&quot;;

const memory = new Memory({
  storage: new LibSQLMemoryAdapter({
    url: &quot;file:./.voltagent/memory.db&quot;,
  }),
});

const agent = new Agent({
  name: &quot;my-agent&quot;,
  instructions: &quot;A helpful assistant&quot;,
  model: openai(&quot;gpt-4o-mini&quot;),
  memory,
});

new VoltAgent({
  agents: { agent },
  server: honoServer(),
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델 문자열 기반으로 더 간단하게도 설정할 수 있습니다. 이 방식은 provider import를 줄이고 싶을 때 편합니다. (&lt;a href=&quot;https://voltagent.dev/docs/getting-started/providers-models/&quot;&gt;voltagent.dev&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;sqf&quot;&gt;&lt;code&gt;import { Agent } from &quot;@voltagent/core&quot;;

const agent = new Agent({
  name: &quot;my-agent&quot;,
  instructions: &quot;You are a helpful assistant&quot;,
  model: &quot;openai/gpt-4o-mini&quot;,
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;워크플로나 멀티스텝 실행이 필요한 경우에는 일반 Agent 대신 PlanAgent 같은 상위 추상화도 있습니다. 문서상 PlanAgent는 planning, task delegation, filesystem tools, summarization을 추가로 제공합니다. (&lt;a href=&quot;https://voltagent.dev/docs/agents/plan-agent/&quot;&gt;voltagent.dev&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;import { PlanAgent } from &quot;@voltagent/core&quot;;

const agent = new PlanAgent({
  name: &quot;planner&quot;,
  instructions: &quot;Plan tasks and execute them step by step.&quot;,
  model: &quot;openai/gpt-4o&quot;,
});
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 쓰는 예시 / 활용 시나리오&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) GitHub 이벤트 기반 개발 에이전트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PR 오픈, 이슈 생성, 릴리스 이벤트를 트리거로 받아 리뷰&amp;middot;분류&amp;middot;배포 자동화를 붙이는 시나리오입니다. 공식 트리거 문서에도 GitHub webhook 기반 사용 예가 보입니다. (&lt;a href=&quot;https://voltagent.dev/actions-triggers-docs/triggers/github/?utm_source=chatgpt.com&quot;&gt;voltagent.dev&lt;/a&gt;)&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;문서, 정책, FAQ를 RAG로 연결하고 답변에 memory를 더하는 형태입니다. 단순 챗봇보다 &amp;ldquo;조직 문맥&amp;rdquo;을 넣기 쉽습니다. (&lt;a href=&quot;https://voltagent.dev/docs/rag/overview/?utm_source=chatgpt.com&quot;&gt;voltagent.dev&lt;/a&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;예를 들어 리서치 에이전트, 요약 에이전트, 작성 에이전트를 나누고 supervisor가 조정하는 구조입니다. GitHub repo analyzer 예시도 이런 멀티 에이전트 구조를 보여줍니다. (&lt;a href=&quot;https://voltagent.dev/docs/agents/sub-agents/?utm_source=chatgpt.com&quot;&gt;voltagent.dev&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) 승인&amp;middot;후처리가 있는 업무 자동화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비용 승인, 고객 응대 후 Slack 전송, 일정 등록 같은 다단계 자동화에 workflow가 잘 맞습니다. Quick Start 문서도 triggers와 actions를 함께 설명합니다. (&lt;a href=&quot;https://voltagent.dev/docs/quick-start/&quot;&gt;voltagent.dev&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5) TypeScript 제품 안에 바로 붙이는 AI 기능&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 Node/Next.js 서비스에 에이전트를 별도 Python 서비스로 떼지 않고 같은 언어권에서 운영하고 싶을 때 적합합니다. 이 부분은 공식 문서의 TypeScript 중심 API와 AI SDK 기반 구조에서 자연스럽게 이어지는 활용 방향입니다. (&lt;a href=&quot;https://voltagent.dev/docs/getting-started/providers-models/&quot;&gt;voltagent.dev&lt;/a&gt;)&lt;/p&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;입니다. 프레임워크 하나로 에이전트, 메모리, 워크플로, RAG, 운영까지 가져가려 하기 때문에, 작은 프로젝트에는 오히려 개념이 많게 느껴질 수 있습니다. (&lt;a href=&quot;https://github.com/VoltAgent/voltagent&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 &lt;b&gt;워크플로는 문서상 Preview&lt;/b&gt;입니다. 실무 적용 전에는 API 안정성과 변경 가능성을 감안해야 합니다. (&lt;a href=&quot;https://voltagent.dev/docs/workflows/overview/?utm_source=chatgpt.com&quot;&gt;voltagent.dev&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 &amp;ldquo;TypeScript 친화적&amp;rdquo;이라는 장점은 분명하지만, 그것이 곧바로 &amp;ldquo;생태계 전체 우위&amp;rdquo;를 뜻하진 않습니다. Python 쪽은 이미 축적된 예제와 운영 경험이 많고, VoltAgent는 아직 상대적으로 새롭기 때문에 팀의 언어 스택, 기존 운영 자산, 문서 성숙도까지 함께 봐야 합니다. 이 부분은 공개 문서와 저장소 구조를 기준으로 한 판단이며, 절대적인 승부로 볼 문제는 아닙니다. (&lt;a href=&quot;https://github.com/VoltAgent/voltagent&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로, 공개된 고객 사례가 있더라도 &lt;b&gt;모든 도메인에서 바로 검증됐다고 단정하기는 어렵습니다.&lt;/b&gt; 실제 도입 전에는 에이전트 품질, 비용, 장애 대응, 로깅, 데이터 보안, 툴 실패 복구를 별도로 테스트해야 합니다. (&lt;a href=&quot;https://voltagent.dev/customers/?utm_source=chatgpt.com&quot;&gt;voltagent.dev&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VoltAgent를 한 줄로 정리하면, &lt;b&gt;TypeScript에서 AI 에이전트를 만들 때 반복적으로 부딪히는 인프라 문제를 프레임워크 차원에서 줄이려는 도구&lt;/b&gt;입니다. 에이전트 정의만이 아니라 메모리, 서브에이전트, 워크플로, 툴, MCP, 관찰 가능성까지 한 방향으로 묶으려는 점이 핵심입니다. (&lt;a href=&quot;https://github.com/VoltAgent/voltagent&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이 도구는 특히 &lt;b&gt;Node.js/Next.js 중심 제품 팀&lt;/b&gt;, &lt;b&gt;TypeScript 단일 스택을 선호하는 팀&lt;/b&gt;, &lt;b&gt;툴 호출과 메모리, 자동화가 섞인 에이전트를 만들려는 팀&lt;/b&gt;에게 의미가 있습니다. 반대로 아주 단순한 LLM 호출만 필요한 경우에는 다소 무겁게 느껴질 수도 있습니다. (&lt;a href=&quot;https://voltagent.dev/docs/getting-started/providers-models/&quot;&gt;voltagent.dev&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 관전 포인트는 두 가지입니다. 첫째, TypeScript 생태계에서 이 정도 범위의 에이전트 프레임워크 경험이 얼마나 매끄럽게 자리 잡는가. 둘째, 공식 고객 사례와 문서 수준을 넘어 더 많은 실제 프로덕션 운영 사례가 쌓이는가입니다. 지금 시점에서는 &amp;ldquo;바로 실험해볼 만한 후보&amp;rdquo;로는 충분히 흥미롭고, &amp;ldquo;무조건 정답&amp;rdquo;이라고 말하기에는 아직 지켜볼 지점도 남아 있습니다. (&lt;a href=&quot;https://voltagent.dev/customers/?utm_source=chatgpt.com&quot;&gt;voltagent.dev&lt;/a&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;VoltAgent는 &lt;b&gt;오픈소스 TypeScript 기반 AI 에이전트 프레임워크&lt;/b&gt;다. (&lt;a href=&quot;https://github.com/VoltAgent/voltagent&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;에이전트뿐 아니라 &lt;b&gt;메모리, 워크플로, 서브에이전트, MCP, RAG&lt;/b&gt;까지 함께 다루려는 방향이 강하다. (&lt;a href=&quot;https://github.com/VoltAgent/voltagent&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;공식 문서 기준으로 &lt;b&gt;Vercel AI SDK 위에 구축&lt;/b&gt;되어 있어 JS/TS 스택과의 접점이 좋다. (&lt;a href=&quot;https://voltagent.dev/docs/getting-started/providers-models/&quot;&gt;voltagent.dev&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Quick Start와 공개 고객 사례가 있어 &lt;b&gt;실험 단계는 넘은 인상&lt;/b&gt;이지만, 기능에 따라 아직 Preview 영역도 있다. (&lt;a href=&quot;https://voltagent.dev/docs/quick-start/&quot;&gt;voltagent.dev&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;특히 &lt;b&gt;Next.js&amp;middot;Node.js 기반 팀&lt;/b&gt;이 Python 생태계 말고 다른 선택지를 찾을 때 검토할 만하다. (&lt;a href=&quot;https://voltagent.dev/docs/getting-started/providers-models/&quot;&gt;voltagent.dev&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AI</category>
      <author>행복한 수지아빠</author>
      <guid isPermaLink="true">https://javaexpert.tistory.com/1716</guid>
      <comments>https://javaexpert.tistory.com/1716#entry1716comment</comments>
      <pubDate>Thu, 9 Apr 2026 09:25:10 +0900</pubDate>
    </item>
    <item>
      <title>RedditVideoMakerBot: Reddit 영상을 한 번의 명령으로 만드는 자동화 도구</title>
      <link>https://javaexpert.tistory.com/1715</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이름 그대로 Reddit 글과 댓글을 바탕으로 쇼츠형 영상을 자동 생성해 주는 오픈소스 봇입니다. 저장소 소개 문구도 &amp;ldquo;한 번의 명령으로 Reddit 영상을 만든다&amp;rdquo;는 점을 전면에 내세우고 있습니다. (&lt;a href=&quot;https://github.com/elebumm/RedditVideoMakerBot&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 도구가 흥미로운 이유는 단순히 &amp;ldquo;영상 하나를 편하게 만든다&amp;rdquo; 수준이 아니기 때문입니다. 원래는 Reddit 글 선정, 댓글 추출, 스크린샷, TTS 음성 생성, 배경 영상 합성, 자막 느낌의 구성까지 여러 단계를 사람이 따로 처리해야 합니다. RedditVideoMakerBot은 이 흐름을 코드로 묶어 자동화합니다. 공개 README 기준으로 설치 후 python main.py로 실행하고, Reddit 앱 설정과 봇 옵션을 입력해 결과 영상을 만드는 구조입니다. (&lt;a href=&quot;https://github.com/elebumm/RedditVideoMakerBot/blob/master/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 이런 도구는 &amp;ldquo;콘텐츠 자동화가 실무에서 왜 중요한가&amp;rdquo;를 이해하는 데도 좋습니다. 영상 제작 자체보다, 반복적인 멀티미디어 파이프라인을 어떻게 자동화할 수 있는지 보여주는 사례이기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/elebumm/RedditVideoMakerBot/blob/master/README.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/elebumm/RedditVideoMakerBot/blob/master/README.md&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1775631731558&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;RedditVideoMakerBot/README.md at master &amp;middot; elebumm/RedditVideoMakerBot&quot; data-og-description=&quot;Create Reddit Videos with just✨ one command ✨. Contribute to elebumm/RedditVideoMakerBot development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/elebumm/RedditVideoMakerBot/blob/master/README.md&quot; data-og-url=&quot;https://github.com/elebumm/RedditVideoMakerBot/blob/master/README.md&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eoVBoN/dJMb8WMqr7p/HnwBBYGj5CTW6XlQyCgAF1/img.png?width=1200&amp;amp;height=600&amp;amp;face=975_140_1061_233,https://scrap.kakaocdn.net/dn/bb1DBe/dJMb8PGwZvL/tz0Qog3fTXC9KK8Qdldez1/img.png?width=1200&amp;amp;height=600&amp;amp;face=975_140_1061_233,https://scrap.kakaocdn.net/dn/uE2tz/dJMb8954tBp/MAdNjqeNSc6vwdOKcb1zY0/img.png?width=3000&amp;amp;height=519&amp;amp;face=0_0_3000_519&quot;&gt;&lt;a href=&quot;https://github.com/elebumm/RedditVideoMakerBot/blob/master/README.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/elebumm/RedditVideoMakerBot/blob/master/README.md&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eoVBoN/dJMb8WMqr7p/HnwBBYGj5CTW6XlQyCgAF1/img.png?width=1200&amp;amp;height=600&amp;amp;face=975_140_1061_233,https://scrap.kakaocdn.net/dn/bb1DBe/dJMb8PGwZvL/tz0Qog3fTXC9KK8Qdldez1/img.png?width=1200&amp;amp;height=600&amp;amp;face=975_140_1061_233,https://scrap.kakaocdn.net/dn/uE2tz/dJMb8954tBp/MAdNjqeNSc6vwdOKcb1zY0/img.png?width=3000&amp;amp;height=519&amp;amp;face=0_0_3000_519');&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;RedditVideoMakerBot/README.md at master &amp;middot; elebumm/RedditVideoMakerBot&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Create Reddit Videos with just✨ one command ✨. Contribute to elebumm/RedditVideoMakerBot development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;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;p data-ke-size=&quot;size16&quot;&gt;Reddit 기반 쇼츠 영상은 겉보기에 단순해 보여도, 실제 작업은 꽤 반복적입니다.&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;Reddit에서 쓸 만한 스레드를 직접 찾는다&lt;/li&gt;
&lt;li&gt;본문과 상위 댓글을 읽고 영상 분량에 맞게 고른다&lt;/li&gt;
&lt;li&gt;화면 캡처를 만들거나 디자인한다&lt;/li&gt;
&lt;li&gt;TTS 음성을 입힌다&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;/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;콘텐츠 1개당 준비 시간이 길다&lt;/b&gt;&lt;br /&gt;글 선정부터 렌더링까지 사람이 손대는 단계가 많습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;출력 품질이 매번 달라진다&lt;/b&gt;&lt;br /&gt;댓글 길이, 화면 배치, 음성 톤, 배경 영상 선택이 작업자마다 달라집니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;반복 작업이 많아진다&lt;/b&gt;&lt;br /&gt;포맷이 거의 같은데도 매번 같은 편집을 반복하게 됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;대량 생산이 어렵다&lt;/b&gt;&lt;br /&gt;쇼츠를 하루 여러 개 만들려면 병목이 바로 생깁니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;개발 관점에서 자동화 포인트를 놓치기 쉽다&lt;/b&gt;&lt;br /&gt;사실 이 문제는 편집 문제가 아니라, 데이터 수집 &amp;rarr; 가공 &amp;rarr; 렌더링 파이프라인 문제에 가깝습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 마케팅 팀이 짧은 포맷 영상을 지속적으로 만들어야 하거나, 사이드 프로젝트로 자동 콘텐츠 생성 파이프라인을 실험하고 싶다면 이런 작업은 사람 손보다 스크립트가 훨씬 잘 맞습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;RedditVideoMakerBot란 무엇인가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Reddit 글과 댓글을 가져와 TTS, 스크린샷, 배경 영상 조합까지 자동으로 처리해 최종 영상 파일을 만들어 주는 오픈소스 Python 기반 봇&lt;/b&gt;입니다. (&lt;a href=&quot;https://github.com/elebumm/RedditVideoMakerBot&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말하면, &amp;ldquo;Reddit 콘텐츠를 입력 데이터로 삼아 쇼츠형 영상으로 렌더링하는 자동 제작 파이프라인&amp;rdquo;이라고 볼 수 있습니다.&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;RedditVideoMakerBot: 코드 중심 자동 생성 워크플로&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 한 가지 중요한 점이 있습니다. README의 안내에 따르면 이 봇은 &lt;b&gt;자동 업로드까지는 하지 않고, 최종 파일만 생성&lt;/b&gt;합니다. 저장소 측 설명도 커뮤니티 가이드라인 이슈를 피하기 위해 업로드는 직접 하도록 두고 있습니다. (&lt;a href=&quot;https://github.com/elebumm/RedditVideoMakerBot/blob/master/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 이 도구의 역할은 &amp;ldquo;영상 생성 자동화&amp;rdquo;까지입니다. 퍼블리싱 자동화까지 포함된 올인원 배포 도구는 아닙니다.&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;b&gt;한 번의 실행 흐름으로 영상 생성&lt;/b&gt;&lt;br /&gt;설치 후 python main.py로 실행하는 기본 흐름을 제공합니다. (&lt;a href=&quot;https://github.com/elebumm/RedditVideoMakerBot/blob/master/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Reddit API 연동 기반 구성&lt;/b&gt;&lt;br /&gt;Reddit Apps 페이지에서 script 타입 앱을 만들고 자격 정보를 입력해 연결합니다. (&lt;a href=&quot;https://github.com/elebumm/RedditVideoMakerBot/blob/master/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Playwright 기반 브라우저 처리 사용&lt;/b&gt;&lt;br /&gt;설치 과정에 Playwright와 관련 의존성 설치가 포함되어 있습니다. 스크린샷이나 웹 기반 렌더링 처리와 연결되는 부분으로 이해할 수 있습니다. (&lt;a href=&quot;https://github.com/elebumm/RedditVideoMakerBot/blob/master/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;TTS 기능 지원&lt;/b&gt;&lt;br /&gt;릴리스 노트 기준으로 TikTok TTS, ElevenLabs TTS 관련 기능이 반영된 버전들이 있었습니다. (&lt;a href=&quot;https://github.com/elebumm/RedditVideoMakerBot/releases&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스토리 모드, 해상도 옵션 등 확장 기능&lt;/b&gt;&lt;br /&gt;릴리스 내역에는 story mode, custom resolution, thumbnail 생성 같은 기능 추가가 언급됩니다. (&lt;a href=&quot;https://github.com/elebumm/RedditVideoMakerBot/releases&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;오픈소스 프로젝트로 커뮤니티 규모가 큼&lt;/b&gt;&lt;br /&gt;GitHub 저장소는 2026년 4월 기준 약 10.2k stars, 2.5k forks, 최신 릴리스는 3.4.0(2025년 10월 28일)로 표시됩니다. (&lt;a href=&quot;https://github.com/elebumm/RedditVideoMakerBot&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&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;/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;br /&gt;사람 손으로 하던 Reddit 글 선별 후 편집 준비 과정을 자동화할 수 있습니다. README와 프로젝트 설명은 이를 &amp;ldquo;one command&amp;rdquo; 성격의 흐름으로 소개합니다. (&lt;a href=&quot;https://github.com/elebumm/RedditVideoMakerBot&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;출력 포맷 표준화&lt;/b&gt;&lt;br /&gt;같은 규칙으로 댓글, 음성, 배경, 영상 구성을 처리하기 때문에 결과물 편차를 줄이기 좋습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;대량 생성 실험에 유리&lt;/b&gt;&lt;br /&gt;쇼츠 콘텐츠 자동 생성, 템플릿 기반 영상 파이프라인, AI 음성 실험에 잘 맞습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;버전 업에 따른 성능 개선 여지&lt;/b&gt;&lt;br /&gt;릴리스 3.1 설명에는 &amp;ldquo;최대 40배 더 빨라졌다&amp;rdquo;고 적혀 있습니다. 다만 이 수치는 릴리스 노트의 프로젝트 측 설명 기준이며, 모든 환경에서 동일하게 재현된다고 단정하긴 어렵습니다. (&lt;a href=&quot;https://github.com/elebumm/RedditVideoMakerBot/releases&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&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;사이드 프로젝트나 PoC에서 &amp;ldquo;콘텐츠 생성 파이프라인&amp;rdquo; 자체를 검증할 때&lt;/li&gt;
&lt;li&gt;Python 기반으로 영상 생성 자동화를 공부하고 싶을 때&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;동작 원리 / 구조&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;README와 공개 릴리스 설명 기준으로 보면, 전체 구조는 대략 이렇게 이해할 수 있습니다.&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;Reddit 앱 연결&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Reddit Apps 페이지에서 script 타입 앱을 만든다&lt;/li&gt;
&lt;li&gt;봇 실행 시 필요한 자격 정보를 입력한다&lt;/li&gt;
&lt;li&gt;봇이 Reddit API에 접근할 수 있게 설정한다 (&lt;a href=&quot;https://github.com/elebumm/RedditVideoMakerBot/blob/master/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;콘텐츠 선택&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 subreddit 또는 랜덤 스레드 흐름을 바탕으로 게시글과 댓글을 가져온다&lt;/li&gt;
&lt;li&gt;릴리스 내역상 story mode, random posts filtering 같은 기능이 여기에 연결됩니다. (&lt;a href=&quot;https://github.com/elebumm/RedditVideoMakerBot/releases&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;텍스트를 영상 요소로 변환&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;게시글/댓글 내용을 음성으로 읽기 위한 TTS를 생성한다&lt;/li&gt;
&lt;li&gt;버전에 따라 TikTok TTS, ElevenLabs TTS 같은 옵션이 반영되었습니다. (&lt;a href=&quot;https://github.com/elebumm/RedditVideoMakerBot/releases&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;화면 요소 생성&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Playwright 기반 환경을 사용해 스크린샷 관련 처리를 수행한다&lt;/li&gt;
&lt;li&gt;실제 설치 단계에 Playwright 설치가 필수로 안내됩니다. (&lt;a href=&quot;https://github.com/elebumm/RedditVideoMakerBot/blob/master/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;배경 영상 및 오디오 합성&lt;/b&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;릴리스 설명에는 background audio, thumbnail, custom resolution 같은 기능이 포함됩니다. (&lt;a href=&quot;https://github.com/elebumm/RedditVideoMakerBot/releases&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;최종 영상 파일 출력&lt;/b&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/elebumm/RedditVideoMakerBot/blob/master/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&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;: Reddit 스레드/댓글 수집&lt;/li&gt;
&lt;li&gt;&lt;b&gt;미디어 생성 층&lt;/b&gt;: TTS, 스크린샷, 썸네일&lt;/li&gt;
&lt;li&gt;&lt;b&gt;렌더링 층&lt;/b&gt;: 영상 합성 및 출력&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 단순 봇이라기보다 &lt;b&gt;콘텐츠 생성 파이프라인 예제 프로젝트&lt;/b&gt;에 가깝습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치 / 사용 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공개 README 기준 기본 설치 흐름은 아래와 같습니다. 요구사항으로는 &lt;b&gt;Python 3.10&lt;/b&gt;과 &lt;b&gt;Playwright&lt;/b&gt;가 명시되어 있습니다. (&lt;a href=&quot;https://github.com/elebumm/RedditVideoMakerBot/blob/master/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) 저장소 클론&lt;/h3&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;git clone https://github.com/elebumm/RedditVideoMakerBot.git
cd RedditVideoMakerBot
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) 가상환경 생성 및 활성화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;macOS / Linux:&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;python3 -m venv ./venv
source ./venv/bin/activate
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Windows:&lt;/p&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;python -m venv ./venv
.\venv\Scripts\activate
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) 의존성 설치&lt;/h3&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;pip install -r requirements.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) Playwright 설치&lt;/h3&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;python -m playwright install
python -m playwright install-deps
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5) 봇 실행&lt;/h3&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;python main.py
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6) Reddit 앱 설정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;README 안내에 따르면 Reddit Apps 페이지에서 &lt;b&gt;script 타입 앱&lt;/b&gt;을 만든 뒤, redirect URL은 임의 URL로 설정할 수 있습니다. 이후 실행 중 봇이 Reddit API 연결 정보와 각종 옵션 입력을 안내합니다. (&lt;a href=&quot;https://github.com/elebumm/RedditVideoMakerBot/blob/master/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7) 재설정이 필요할 때&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정 변경이 필요하면 config.toml에서 관련 줄을 삭제한 뒤 다시 실행하면 재구성할 수 있다고 README에 적혀 있습니다. (&lt;a href=&quot;https://github.com/elebumm/RedditVideoMakerBot/blob/master/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8) macOS / Linux 자동 설치 스크립트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서상 실험적 기능으로 bash 기반 설치 스크립트도 안내됩니다. (&lt;a href=&quot;https://github.com/elebumm/RedditVideoMakerBot/blob/master/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;bash &amp;lt;(curl -sL https://raw.githubusercontent.com/elebumm/RedditVideoMakerBot/master/install.sh)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자주 쓰는 예시 / 활용 시나리오&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 쇼츠형 Reddit 콘텐츠 자동 생성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 직접적인 사용 사례입니다. Reddit의 인기 글과 댓글을 빠르게 영상으로 변환해 짧은 포맷 콘텐츠 제작 파이프라인을 만들 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Python 기반 영상 자동화 학습용 프로젝트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 프로젝트는 API 연동, 웹 자동화, TTS, 미디어 렌더링이 한 흐름에 묶여 있어 학습용 예제로도 좋습니다. 단순 CRUD보다 훨씬 실제적인 파이프라인을 볼 수 있습니다.&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;꼭 Reddit이 아니어도 됩니다. 구조를 이해하면 다른 텍스트 소스를 받아 비슷한 형식의 영상을 만드는 자동 생성 도구로 확장할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 내부 도구 제작 참고 사례&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콘텐츠 팀이 반복하는 작업을 개발팀이 자동화해 주는 상황에서, 이런 프로젝트는 &amp;ldquo;어디까지 자동화할 수 있는가&amp;rdquo;를 보여주는 좋은 기준점이 됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. TTS 및 렌더링 옵션 실험&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;릴리스 노트 기준으로 TikTok TTS, ElevenLabs TTS, story mode, custom resolution 같은 기능 변화가 있었기 때문에, 음성 품질이나 영상 포맷 실험에도 참고할 수 있습니다. (&lt;a href=&quot;https://github.com/elebumm/RedditVideoMakerBot/releases&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&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;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;br /&gt;결과 파일 생성까지만 담당합니다. 배포 자동화까지 기대하면 안 됩니다. (&lt;a href=&quot;https://github.com/elebumm/RedditVideoMakerBot/blob/master/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;외부 서비스 의존성이 있다&lt;/b&gt;&lt;br /&gt;Reddit API, Playwright, TTS 관련 서비스나 정책 변화에 영향을 받을 수 있습니다. 실제 이슈 목록에도 설치나 스크린샷, 인증 관련 문제가 보입니다. (&lt;a href=&quot;https://github.com/elebumm/RedditVideoMakerBot/issues/1745?utm_source=chatgpt.com&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;환경 설정 난도가 아예 낮지는 않다&lt;/b&gt;&lt;br /&gt;Python, 가상환경, 브라우저 의존성, Reddit 앱 등록까지 필요합니다. 초보자에게는 &amp;ldquo;원클릭&amp;rdquo;보다 &amp;ldquo;한 번 구성해 두면 반복 실행이 쉬운 도구&amp;rdquo;에 더 가깝습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정책/저작권/플랫폼 가이드라인 고려가 필요하다&lt;/b&gt;&lt;br /&gt;자동 생성 콘텐츠는 플랫폼 정책, 원문 사용 맥락, 재가공 책임 문제를 함께 봐야 합니다. 프로젝트가 업로드 자동화를 뺀 것도 이런 리스크를 의식한 선택으로 읽을 수 있습니다. 이는 문서의 명시적 설명에 기반한 해석입니다. (&lt;a href=&quot;https://github.com/elebumm/RedditVideoMakerBot/blob/master/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프로젝트 문서와 실제 최신 동작이 완전히 같다고 보긴 어렵다&lt;/b&gt;&lt;br /&gt;README에는 &amp;ldquo;현재 상태에서 필요한 일은 한다&amp;rdquo;는 식의 설명과 함께, 앞으로 개선할 아이디어도 같이 적혀 있습니다. 즉 완성형 SaaS가 아니라 계속 발전하는 오픈소스 프로젝트로 보는 편이 맞습니다. (&lt;a href=&quot;https://github.com/elebumm/RedditVideoMakerBot/blob/master/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RedditVideoMakerBot은 &amp;ldquo;Reddit 글을 영상으로 바꾸는 봇&amp;rdquo;으로 볼 수도 있지만, 개발자 관점에서는 그보다 더 흥미롭습니다. 텍스트 데이터를 가져오고, 미디어 요소로 변환하고, 최종 영상으로 렌더링하는 전체 자동화 파이프라인을 하나의 프로젝트로 보여주기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무적으로 중요한 포인트는 분명합니다. 반복 편집 작업을 줄이고, 결과물 형식을 표준화하고, 콘텐츠 제작을 사람이 아니라 코드 중심으로 다룰 수 있게 만든다는 점입니다. 특히 쇼츠형 콘텐츠 자동화, Python 기반 미디어 자동화, 내부 툴 프로토타이핑에 관심 있는 사람에게 유용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 이 도구는 **&amp;ldquo;영상 제작 자체&amp;rdquo;보다 &amp;ldquo;반복되는 콘텐츠 생성 과정을 자동화하고 싶은 사람&amp;rdquo;**에게 특히 잘 맞습니다.&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;b&gt;RedditVideoMakerBot은 Reddit 글과 댓글을 바탕으로 쇼츠형 영상을 자동 생성하는 Python 오픈소스 프로젝트다.&lt;/b&gt; (&lt;a href=&quot;https://github.com/elebumm/RedditVideoMakerBot&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;핵심 가치는 편집 수작업을 데이터 수집 &amp;rarr; TTS &amp;rarr; 스크린샷 &amp;rarr; 합성 파이프라인으로 바꾸는 데 있다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;설치에는 Python 3.10, Playwright, Reddit 앱 등록이 필요하다.&lt;/b&gt; (&lt;a href=&quot;https://github.com/elebumm/RedditVideoMakerBot/blob/master/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자동 업로드 도구는 아니며, 최종 영상 파일 생성까지를 담당한다.&lt;/b&gt; (&lt;a href=&quot;https://github.com/elebumm/RedditVideoMakerBot/blob/master/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;릴리스 기준으로 TTS 옵션, story mode, custom resolution, 성능 개선 같은 기능 확장이 이어져 왔다.&lt;/b&gt; (&lt;a href=&quot;https://github.com/elebumm/RedditVideoMakerBot/releases&quot;&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AI</category>
      <author>행복한 수지아빠</author>
      <guid isPermaLink="true">https://javaexpert.tistory.com/1715</guid>
      <comments>https://javaexpert.tistory.com/1715#entry1715comment</comments>
      <pubDate>Wed, 8 Apr 2026 16:02:36 +0900</pubDate>
    </item>
    <item>
      <title>SEO Machine: Claude code로 작성하는 SEO 글쓰기</title>
      <link>https://javaexpert.tistory.com/1714</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;AI가 글을 써주는 시대는 이미 지났습니다. 이제 중요한 건 &lt;b&gt;&amp;ldquo;글을 한 편 생성하느냐&amp;rdquo;가 아니라, 검색 의도 분석부터 경쟁사 조사, 초안 작성, 최적화, 발행까지를 하나의 운영 시스템으로 묶을 수 있느냐&lt;/b&gt;입니다. SEO Machine은 바로 그 지점을 겨냥한 프로젝트입니다. 단순한 프롬프트 모음이 아니라, Claude Code 위에 올라가는 &lt;b&gt;콘텐츠 생산 워크스페이스&lt;/b&gt;에 가깝습니다. (&lt;a href=&quot;https://github.com/TheCraigHewitt/seomachine&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 이 저장소가 흥미로운 이유는, &amp;ldquo;AI에게 블로그 글을 써 달라&amp;rdquo; 수준에서 멈추지 않고 &lt;b&gt;리서치 &amp;rarr; 작성 &amp;rarr; 분석 &amp;rarr; 최적화 &amp;rarr; WordPress 발행&lt;/b&gt;까지를 하나의 흐름으로 설계했다는 점입니다. 저장소 설명에서도 이 프로젝트를 long-form SEO 콘텐츠 작성을 위한 Claude Code workspace로 정의하고 있고, 실제로 슬래시 커맨드, 에이전트, Python 분석 모듈, WordPress 연동이 각각 역할을 나눠 갖고 있습니다. (&lt;a href=&quot;https://github.com/TheCraigHewitt/seomachine&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;figure id=&quot;og_1775612974461&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - TheCraigHewitt/seomachine: A specialized Claude Code workspace for creating long-form, SEO-optimized blog content for a&quot; data-og-description=&quot;A specialized Claude Code workspace for creating long-form, SEO-optimized blog content for any business. This system helps you research, write, analyze, and optimize content that ranks well and ser...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/TheCraigHewitt/seomachine&quot; data-og-url=&quot;https://github.com/TheCraigHewitt/seomachine&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cNt5M6/dJMb9cBIVWH/3J6WzHoVUsaKjPYFWusv6k/img.png?width=1200&amp;amp;height=600&amp;amp;face=965_140_1068_252,https://scrap.kakaocdn.net/dn/bVYoOm/dJMb8U8UpmE/HENSHzp2eNa4YKcKNRNUT0/img.png?width=1200&amp;amp;height=600&amp;amp;face=965_140_1068_252&quot;&gt;&lt;a href=&quot;https://github.com/TheCraigHewitt/seomachine&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/TheCraigHewitt/seomachine&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cNt5M6/dJMb9cBIVWH/3J6WzHoVUsaKjPYFWusv6k/img.png?width=1200&amp;amp;height=600&amp;amp;face=965_140_1068_252,https://scrap.kakaocdn.net/dn/bVYoOm/dJMb8U8UpmE/HENSHzp2eNa4YKcKNRNUT0/img.png?width=1200&amp;amp;height=600&amp;amp;face=965_140_1068_252');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - TheCraigHewitt/seomachine: A specialized Claude Code workspace for creating long-form, SEO-optimized blog content for a&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A specialized Claude Code workspace for creating long-form, SEO-optimized blog content for any business. This system helps you research, write, analyze, and optimize content that ranks well and ser...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;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;p data-ke-size=&quot;size16&quot;&gt;SEO Machine은 TheCraigHewitt 계정에서 공개한 오픈소스 프로젝트로, Claude Code를 기반으로 기업용 SEO 콘텐츠 제작 워크플로를 구성합니다. 저장소 설명에 따르면 이 시스템은 키워드 리서치, 경쟁 콘텐츠 분석, 장문형 블로그 글 작성, SEO 품질 점검, 성과 기반 우선순위 분석, WordPress 발행까지 지원합니다. 또한 원래 Castos를 위해 개발되었고, 이후 어떤 비즈니스에도 적용할 수 있도록 공개되었습니다. (&lt;a href=&quot;https://github.com/TheCraigHewitt/seomachine&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기술적으로 보면 이 프로젝트는 전형적인 웹 애플리케이션이라기보다 &lt;b&gt;Claude Code용 오퍼레이팅 레이어&lt;/b&gt;입니다. 핵심 구성은 세 가지입니다. 첫째, .claude/commands에 들어 있는 슬래시 커맨드. 둘째, .claude/agents에 들어 있는 역할별 분석 에이전트. 셋째, data_sources/modules에 들어 있는 Python 분석 및 데이터 수집 모듈입니다. 여기에 context/ 디렉터리로 브랜드 보이스와 스타일 가이드, 키워드 전략을 주입하고, wordpress/ 디렉터리로 최종 발행 경로를 연결합니다. (&lt;a href=&quot;https://github.com/TheCraigHewitt/seomachine&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의존성도 이 구조를 잘 보여줍니다. Google Analytics Data API, Search Console API, DataForSEO, pandas, scikit-learn, nltk, textstat, BeautifulSoup, markdown 등이 요구사항에 포함되어 있어, 단순 텍스트 생성기가 아니라 &lt;b&gt;SEO 분석과 성과 기반 의사결정&lt;/b&gt;을 함께 수행하도록 설계된 것을 알 수 있습니다. (&lt;a href=&quot;https://raw.githubusercontent.com/TheCraigHewitt/seomachine/main/data_sources/requirements.txt&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;왜 이 프로젝트가 등장했을까&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 팀이 AI로 콘텐츠를 만들기 시작했지만, 실제 운영 단계에 들어가면 금방 한계가 드러납니다. 프롬프트 한두 개로는 검색 의도와 경쟁 구도, 내부 링크 전략, 메타 요소, 발행 포맷, 성과 추적을 일관되게 관리하기 어렵습니다. SEO Machine은 이 문제를 &amp;ldquo;좋은 프롬프트를 더 많이 쓰자&amp;rdquo;가 아니라, &lt;b&gt;작업을 명령 체계와 파일 구조로 표준화하자&lt;/b&gt;는 방식으로 풀고 있습니다. /research, /write, /optimize, /analyze-existing, /publish-draft 같은 명령이 그 표준화된 입구입니다. (&lt;a href=&quot;https://github.com/TheCraigHewitt/seomachine&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 하나의 배경은, SEO 콘텐츠가 이제 정적인 문서가 아니라 &lt;b&gt;지속적으로 갱신해야 하는 자산&lt;/b&gt;이 되었다는 점입니다. 이 저장소는 신규 작성뿐 아니라 기존 글 분석과 리라이트 흐름도 별도로 제공합니다. /analyze-existing는 현재 글의 건강 점수를 평가하고, /rewrite는 갱신된 정보와 SEO 개선안을 반영해 업데이트 버전을 만듭니다. 이 구조는 &amp;ldquo;새 글 생성&amp;rdquo;보다 &amp;ldquo;기존 자산 최적화&amp;rdquo;가 중요해진 콘텐츠 팀의 현실을 잘 반영합니다. (&lt;a href=&quot;https://github.com/TheCraigHewitt/seomachine&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, SEO Machine은 AI 글쓰기 도구라기보다 &lt;b&gt;콘텐츠 운영 자동화 템플릿&lt;/b&gt;에 가깝습니다. LLM을 생산 수단으로만 쓰는 것이 아니라, 리서치와 평가, 발행까지 이어지는 프로세스 안에 묶어두는 것이 핵심입니다. (&lt;a href=&quot;https://raw.githubusercontent.com/TheCraigHewitt/seomachine/main/CLAUDE.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&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 안에서 실행하는 커맨드입니다. /research는 키워드 조사와 상위 10개 경쟁 콘텐츠 분석, 콘텐츠 갭 파악, 아웃라인 생성을 수행하고 결과를 research/에 저장합니다. /write는 이를 바탕으로 2000~3000단어 이상의 장문형 글을 만들고 drafts/에 저장합니다. /optimize는 최종 점검, /publish-draft는 WordPress 발행을 담당합니다. (&lt;a href=&quot;https://github.com/TheCraigHewitt/seomachine&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식의 장점은 프롬프트를 사람이 매번 조립하지 않아도 된다는 점입니다. 개발자 관점에서 보면, 이것은 &amp;ldquo;LLM 사용법&amp;rdquo;이 아니라 &lt;b&gt;명령형 인터페이스로 캡슐화된 콘텐츠 파이프라인&lt;/b&gt;입니다. 팀원마다 프롬프트 실력이 달라도, 같은 커맨드를 실행하면 비슷한 결과 구조를 기대할 수 있습니다. (&lt;a href=&quot;https://raw.githubusercontent.com/TheCraigHewitt/seomachine/main/CLAUDE.md&quot;&gt;GitHub&lt;/a&gt;)&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;/write 이후에는 SEO Optimizer, Meta Creator, Internal Linker, Keyword Mapper 같은 에이전트가 자동으로 후속 분석을 수행하도록 설계되어 있습니다. 즉, 초안을 만든 뒤 별도의 수동 점검 없이도 온페이지 SEO, 메타 태그 옵션, 내부 링크 추천, 키워드 밀도 점검이 이어집니다. (&lt;a href=&quot;https://github.com/TheCraigHewitt/seomachine&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조는 소프트웨어 아키텍처 관점에서 꽤 중요합니다. LLM 한 번 호출해서 &amp;ldquo;최종 결과&amp;rdquo;를 기대하는 대신, &lt;b&gt;생성 단계와 검수 단계를 분리&lt;/b&gt;했습니다. 생성 모델이 초안을 만들고, 이후 전문 역할을 가진 에이전트가 서로 다른 기준으로 검토합니다. 이건 마치 한 서비스 안에 writer, reviewer, linter를 분리한 셈입니다. (&lt;a href=&quot;https://raw.githubusercontent.com/TheCraigHewitt/seomachine/main/.claude/agents/seo-optimizer.md&quot;&gt;GitHub&lt;/a&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;context/brand-voice.md, context/writing-examples.md, context/style-guide.md, context/seo-guidelines.md, context/internal-links-map.md, context/target-keywords.md 같은 파일들이 모든 생성 과정의 기준점이 됩니다. 프로젝트는 이 파일들을 채워 넣으라고 강하게 요구하고 있고, 예제로 Castos용 완성 샘플도 제공합니다. (&lt;a href=&quot;https://github.com/TheCraigHewitt/seomachine&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 설계는 RAG와 비슷하지만, 검색 기반 지식 질의보다 &lt;b&gt;운영 정책 주입&lt;/b&gt;에 더 가깝습니다. 브랜드 보이스, CTA 방식, 내부 링크 정책, 주요 기능 설명이 파일로 관리되기 때문에, 팀 차원의 일관성을 프롬프트 바깥에서 유지할 수 있습니다. 즉, 사람이 매번 &amp;ldquo;우리 톤은 이렇고, CTA는 이렇게 하고&amp;hellip;&amp;rdquo;를 길게 입력할 필요가 없습니다. (&lt;a href=&quot;https://raw.githubusercontent.com/TheCraigHewitt/seomachine/main/.claude/commands/write.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. Python 기반 SEO 분석 파이프라인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Content Analyzer 에이전트는 search_intent_analyzer.py, keyword_analyzer.py, content_length_comparator.py, readability_scorer.py, seo_quality_rater.py 같은 모듈을 조합해 글을 평가합니다. 문서상으로는 검색 의도 분류, 키워드 밀도&amp;middot;분포 분석, SERP 대비 분량 비교, 가독성 계산, 종합 SEO 점수 산정이 핵심입니다. (&lt;a href=&quot;https://raw.githubusercontent.com/TheCraigHewitt/seomachine/main/CLAUDE.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 seo_quality_rater.py는 최소 단어 수, 내부/외부 링크 수, 메타 제목&amp;middot;설명 길이, H2 개수, 문장 길이, 읽기 수준 등을 기준으로 카테고리별 점수를 계산하고, 최종적으로 publishing_ready 여부까지 반환합니다. 즉, &amp;ldquo;그럴듯한 문장&amp;rdquo;이 아니라 &lt;b&gt;배포 가능한 글인지&lt;/b&gt;를 정량적으로 판정하려는 시도입니다. (&lt;a href=&quot;https://raw.githubusercontent.com/TheCraigHewitt/seomachine/main/data_sources/modules/seo_quality_rater.py&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 실측 데이터 기반 우선순위 분석&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 프로젝트는 단순히 새 글을 잘 쓰는 데서 끝나지 않습니다. GA4, GSC, DataForSEO를 통합하는 DataAggregator가 있고, quick wins, declining content, low CTR, trending topics 같은 기회를 뽑아냅니다. 검색 노출은 높지만 CTR이 낮은 글, 11~20위에 걸쳐 있는 키워드, 트래픽이 감소하는 문서 등을 찾아내는 식입니다. (&lt;a href=&quot;https://raw.githubusercontent.com/TheCraigHewitt/seomachine/main/data_sources/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 OpportunityScorer는 볼륨 25%, 포지션 20%, 의도 20%, 경쟁도 15%, 클러스터 가치 10%, CTR 5%, 신선도 5%, 트렌드 5%라는 가중치를 사용해 SEO 기회를 점수화합니다. 이 부분은 콘텐츠 팀의 감각적 판단을 &lt;b&gt;우선순위 알고리즘&lt;/b&gt;으로 바꾸려는 시도로 볼 수 있습니다. (&lt;a href=&quot;https://raw.githubusercontent.com/TheCraigHewitt/seomachine/main/CLAUDE.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. WordPress + Yoast 메타 발행&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종 단계에서는 WordPress REST API를 통해 초안을 발행할 수 있고, 커스텀 MU-plugin 또는 functions.php 스니펫을 통해 Yoast SEO 필드를 REST API에서 읽고 쓸 수 있게 만듭니다. focus keyphrase, SEO title, meta description을 API 요청에 포함할 수 있도록 열어두는 구조입니다. (&lt;a href=&quot;https://github.com/TheCraigHewitt/seomachine&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 작은 기능처럼 보여도 실제 운영에선 매우 중요합니다. 많은 AI 콘텐츠 도구가 &amp;ldquo;글 생성&amp;rdquo;까지만 하고 끝나는데, SEO Machine은 &lt;b&gt;CMS 반영까지 자동화 범위에 포함&lt;/b&gt;합니다. 다시 말해, 이 저장소의 목적은 글쓰기 자체보다 &lt;b&gt;콘텐츠 공급망 자동화&lt;/b&gt;에 더 가깝습니다. (&lt;a href=&quot;https://github.com/TheCraigHewitt/seomachine&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;프로젝트 아키텍처 분석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 저장소를 아키텍처 관점에서 보면, 전형적인 LLM 애플리케이션보다 훨씬 운영형 구조에 가깝습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구조에서 가장 중요한 포인트는 &lt;b&gt;명령, 에이전트, 분석 모듈, 외부 데이터 소스가 느슨하게 역할 분리되어 있다는 점&lt;/b&gt;입니다. 커맨드는 워크플로를 오케스트레이션하고, 에이전트는 역할 기반 검토를 수행하고, Python 모듈은 정량 분석을 담당하며, 외부 데이터 소스는 실제 성과 데이터를 공급합니다. 저장소의 디렉터리 구조도 정확히 이 책임 분리를 반영합니다. (&lt;a href=&quot;https://github.com/TheCraigHewitt/seomachine&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 개발자식으로 표현하면, SEO Machine은 &amp;ldquo;LLM prompt pack&amp;rdquo;이 아니라 &lt;b&gt;file-based workflow engine for content ops&lt;/b&gt;입니다. 코드 실행 런타임이 메인 제품은 아니지만, Claude Code를 orchestration shell로 쓰고, 파일 시스템을 상태 저장소처럼 활용하며, Python 모듈과 외부 API를 보조 서비스처럼 붙인 구조입니다. (&lt;a href=&quot;https://raw.githubusercontent.com/TheCraigHewitt/seomachine/main/CLAUDE.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;내부 동작을 조금 더 현실적으로 풀어보면&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 사용자가 /research podcast editing software를 실행한다고 가정해 보겠습니다. 그러면 시스템은 우선 대상 토픽에 대한 키워드와 SERP를 조사하고, 상위 경쟁 문서에서 공통 섹션과 빠진 주제를 정리한 뒤, 자사 관점에서 차별화 가능한 아웃라인을 research/에 저장합니다. 그 다음 /write는 이 리서치 결과와 context/에 있는 브랜드 정보, SEO 규칙, 내부 링크 정책을 읽어 장문 초안을 만듭니다. 이후 자동 실행된 에이전트들이 키워드 배치, 메타 요소, 링크 전략을 점검하고, 필요하면 /optimize가 마지막 폴리싱을 수행합니다. 마지막으로 /publish-draft는 WordPress REST API를 통해 본문과 Yoast 메타를 함께 발행합니다. (&lt;a href=&quot;https://raw.githubusercontent.com/TheCraigHewitt/seomachine/main/.claude/commands/research.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 흐름이 좋은 이유는, 사람이 매 단계마다 &amp;ldquo;다음엔 뭘 해야 하지?&amp;rdquo;를 고민하지 않아도 되기 때문입니다. 결국 이 프로젝트는 AI를 잘 쓰는 법을 가르치기보다, &lt;b&gt;콘텐츠 팀의 업무 순서를 강제하는 도구&lt;/b&gt;에 가깝습니다. 그래서 개인 창작자보다, 여러 명이 같은 규칙으로 운영해야 하는 팀에서 더 빛날 가능성이 큽니다. (&lt;a href=&quot;https://github.com/TheCraigHewitt/seomachine&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드 예제로 보면 더 이해가 쉽다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 저장소의 핵심 중 하나는 데이터 소스를 합쳐 성과를 읽는 부분입니다. 문서에 소개된 DataAggregator 사용 예시는 대략 이런 흐름입니다. (&lt;a href=&quot;https://raw.githubusercontent.com/TheCraigHewitt/seomachine/main/data_sources/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;from data_sources.modules.data_aggregator import DataAggregator

aggregator = DataAggregator()

performance = aggregator.get_comprehensive_page_performance(
    url=&quot;/blog/podcast-monetization-guide&quot;,
    days=30
)

print(performance[&quot;ga4&quot;])
print(performance[&quot;gsc&quot;])
print(performance[&quot;dataforseo&quot;])
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드는 단일 URL에 대해 GA4 트래픽 추세, GSC 검색 성과, 그리고 상위 키워드 기반 DataForSEO 랭킹 데이터를 한 번에 모아줍니다. 블로그 운영에서는 &amp;ldquo;이 글이 왜 안 오르지?&amp;rdquo;라는 질문이 자주 나오는데, 그때 원인을 하나의 지표로 보지 않고 &lt;b&gt;트래픽, 노출, 순위&lt;/b&gt;를 함께 봐야 합니다. SEO Machine은 바로 이 지점을 기본 구조에 넣어 둡니다. (&lt;a href=&quot;https://raw.githubusercontent.com/TheCraigHewitt/seomachine/main/data_sources/modules/data_aggregator.py&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SEO 품질 점검도 코드 레벨에서 감이 옵니다. seo_quality_rater.py는 길이, 메타 요소, 구조, 링크, 가독성을 가중치로 합산해 점수를 계산합니다. 문서상 가중치는 content 20%, keywords 25%, meta 15%, structure 15%, links 15%, readability 10%입니다. (&lt;a href=&quot;https://raw.githubusercontent.com/TheCraigHewitt/seomachine/main/data_sources/modules/seo_quality_rater.py&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;from data_sources.modules.seo_quality_rater import SEOQualityRater

rater = SEOQualityRater()

result = rater.rate(
    content=article_markdown,
    meta_title=&quot;Best Podcast Editing Software for 2026&quot;,
    meta_description=&quot;Compare podcast editing tools by workflow, cost, and features.&quot;,
    primary_keyword=&quot;podcast editing software&quot;,
    secondary_keywords=[&quot;audio editing for podcasters&quot;, &quot;podcast editor tools&quot;],
    keyword_density=1.4,
    internal_link_count=4,
    external_link_count=3
)

print(result[&quot;overall_score&quot;])
print(result[&quot;publishing_ready&quot;])
print(result[&quot;critical_issues&quot;])
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 형태는 일반적인 AI 글쓰기 도구와 차이가 큽니다. 대부분은 &amp;ldquo;생성&amp;rdquo;은 잘하지만 &amp;ldquo;품질 게이트&amp;rdquo;는 약합니다. 반면 이 프로젝트는 &lt;b&gt;배포 전 점검 로직을 코드화&lt;/b&gt;해 두었습니다. 개발팀이 CI에 린터를 붙이듯, 콘텐츠 팀에 SEO 린터를 붙인 셈입니다. (&lt;a href=&quot;https://raw.githubusercontent.com/TheCraigHewitt/seomachine/main/.claude/agents/content-analyzer.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이 프로젝트를 언제 쓰면 좋을까&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SEO Machine은 다음과 같은 팀에 특히 잘 맞습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째, SaaS나 B2B 기업처럼 장문형 SEO 콘텐츠를 꾸준히 생산해야 하는 팀입니다. 저장소 자체도 Castos 사례를 예시로 들고 있고, brand voice&amp;middot;feature map&amp;middot;internal links map을 채워 넣는 구조라서 제품 중심의 콘텐츠 운영과 잘 맞습니다. (&lt;a href=&quot;https://github.com/TheCraigHewitt/seomachine&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘째, &amp;ldquo;글 생성&amp;rdquo;보다 &amp;ldquo;운영 표준화&amp;rdquo;가 더 중요한 팀입니다. 한 명의 숙련된 콘텐츠 마케터가 모든 걸 수작업으로 하는 조직보다, 여러 작성자가 같은 규칙으로 움직여야 하는 조직에서 효과가 큽니다. 슬래시 커맨드와 컨텍스트 파일이 일종의 운영 매뉴얼 역할을 하기 때문입니다. (&lt;a href=&quot;https://raw.githubusercontent.com/TheCraigHewitt/seomachine/main/CLAUDE.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;셋째, 이미 WordPress와 SEO 툴 체인을 갖고 있는 팀입니다. 이 프로젝트는 WordPress 발행, Yoast 메타 필드 제어, GA4/GSC/DataForSEO 연동을 전제로 할 때 가치가 커집니다. 반대로 Notion만 쓰거나 CMS가 전혀 다른 환경이라면, 일부 구성은 수정이 필요합니다. (&lt;a href=&quot;https://raw.githubusercontent.com/TheCraigHewitt/seomachine/main/data_sources/README.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;장점과 한계도 분명하다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점부터 보면, 이 저장소는 AI 콘텐츠를 &amp;ldquo;한 번의 생성&amp;rdquo;이 아니라 &amp;ldquo;운영 가능한 파이프라인&amp;rdquo;으로 바라봅니다. 그리고 실제로 그 파이프라인에 필요한 요소들, 즉 명령 체계, 역할형 에이전트, 분석 코드, 성과 데이터 통합, 발행 경로를 모두 넣어 두었습니다. 이 점은 꽤 강력합니다. (&lt;a href=&quot;https://github.com/TheCraigHewitt/seomachine&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 한계도 있습니다. 이 프로젝트는 범용 제품이라기보다 &lt;b&gt;Claude Code에 최적화된 워크스페이스 템플릿&lt;/b&gt;입니다. 즉, GUI 중심의 SaaS를 기대하면 안 됩니다. 제대로 쓰려면 Claude Code 사용 방식, context 파일 관리, WordPress 설정, 외부 API 자격 증명, SEO 운영 프로세스에 대한 이해가 필요합니다. 또 몇몇 문서는 템플릿 성격이 강하고, 실제 효과는 팀이 얼마나 컨텍스트 파일을 잘 채우는지에 크게 좌우됩니다. (&lt;a href=&quot;https://github.com/TheCraigHewitt/seomachine&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이 저장소는 &amp;ldquo;AI가 알아서 블로그를 운영해 준다&amp;rdquo;는 마법 상자가 아닙니다. 오히려 개발자나 기술 친화적인 마케팅 팀이 &lt;b&gt;직접 자기 회사의 콘텐츠 운영체계를 코드와 파일로 정리해 넣을 때&lt;/b&gt; 비로소 힘이 납니다. (&lt;a href=&quot;https://raw.githubusercontent.com/TheCraigHewitt/seomachine/main/.claude/commands/write.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;한 문장으로 정리하면&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SEO Machine은 AI 블로그 생성기가 아닙니다. &lt;b&gt;Claude Code 위에서 동작하는 SEO 콘텐츠 운영 시스템&lt;/b&gt;입니다. 커맨드로 워크플로를 정의하고, 에이전트로 역할을 나누고, Python 모듈로 품질과 성과를 분석하며, WordPress까지 연결합니다. AI가 글을 &amp;ldquo;써주는&amp;rdquo; 단계에서 멈추지 않고, 팀이 콘텐츠를 &amp;ldquo;운영하는&amp;rdquo; 단계로 넘어가고 싶다면 꽤 인상적인 레퍼런스가 될 수 있는 프로젝트입니다. (&lt;a href=&quot;https://raw.githubusercontent.com/TheCraigHewitt/seomachine/main/CLAUDE.md&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;</description>
      <category>AI</category>
      <author>행복한 수지아빠</author>
      <guid isPermaLink="true">https://javaexpert.tistory.com/1714</guid>
      <comments>https://javaexpert.tistory.com/1714#entry1714comment</comments>
      <pubDate>Wed, 8 Apr 2026 10:50:05 +0900</pubDate>
    </item>
  </channel>
</rss>