<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Cloud &amp;amp; AI Engineering | 임승한</title>
    <link>https://server-engineer.tistory.com/</link>
    <description>AI Cloud 엔지니어의 실무 중심 기술 블로그입니다. AWS 기반 Cloud Native, DevSecOps, MLOps, LLMOps 환경에서의 아키텍처 설계와 트러블슈팅 노하우, 신기술 인사이트를 공유합니다.</description>
    <language>ko</language>
    <pubDate>Thu, 20 Aug 2026 04:14:38 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>ServerEngineer</managingEditor>
    <image>
      <title>Cloud &amp;amp; AI Engineering | 임승한</title>
      <url>https://tistory1.daumcdn.net/tistory/1669200/attach/c98af899e3834dba8d93d8140e9e72e4</url>
      <link>https://server-engineer.tistory.com</link>
    </image>
    <item>
      <title>AI 에이전트를 안전하게 운영하는 기술, 하네스 엔지니어링 (Harness Engineering)</title>
      <link>https://server-engineer.tistory.com/1099</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;헉쉬,, &quot;AI한테 그냥 시키면 되는 거 아닌가요~? &quot; 라고 생각하신 적 있으신가요?&lt;/p&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는 AI 에이전트를 &lt;b&gt;안전하고 신뢰성 있게 운영&lt;/b&gt;하기 위한 설계 개념인 &lt;b&gt;하네스 엔지니어링(Harness Engineering)&lt;/b&gt; 을 소개하고, 직접 만든 &lt;b&gt;&lt;a href=&quot;https://github.com/i-am-shuan/my-skill-agent&quot;&gt;샘플 프로젝트&lt;/a&gt;&lt;/b&gt;를 통해 어떻게 구현할 수 있는지 살펴보겠습니다  &lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;하네스 엔지니어링이 뭔가요?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;하네스(Harness)&lt;/b&gt; 라는 단어는 원래 자동차의 &lt;b&gt;와이어 하네스(Wire Harness)&lt;/b&gt; 에서 왔습니다. 자동차 내부의 수많은 전선을 하나의 묶음으로 정리해서, 신호가 정해진 경로로만 흐르도록 제어하는 부품이에요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI/LLM 맥락에서 하네스 엔지니어링도 같은 개념입니다. AI 모델이나 에이전트 시스템을 &lt;b&gt;감싸는 외부 제어 구조&lt;/b&gt;를 설계해서, 입력과 출력, 그리고 실행 흐름 전체를 안전하게 관리하는 것이죠.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;한 줄 요약&lt;/b&gt;: &quot;AI가 마음대로 못 놀게 울타리 치고, 그 안에서 잘 노는지 측정하는 구조 전체&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOtn1b/dJMb990uujf/OKZAfzVr4FEDrr5dUauES0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOtn1b/dJMb990uujf/OKZAfzVr4FEDrr5dUauES0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOtn1b/dJMb990uujf/OKZAfzVr4FEDrr5dUauES0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOtn1b%2FdJMb990uujf%2FOKZAfzVr4FEDrr5dUauES0%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;492&quot; height=&quot;492&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;492&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;하네스의 세 가지 역할&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하네스는 크게 &lt;b&gt;입력 제어 / 출력 제어 / 실행 제어&lt;/b&gt; 세 레이어로 구성됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;식당에 비유하면 이렇게 이해할 수 있어요:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) 입력 제어:&lt;/b&gt; 문지기 역할&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;손님이 주문을 넣기 전에 &quot;이상한 주문은 아닌지&quot;, &quot;개인정보가 포함되진 않았는지&quot; 먼저 확인합니다. AI한테 전달되기 전에 나쁜 내용이나 불필요한 정보를 미리 걸러내는 거예요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) 출력 제어&lt;b&gt;:&lt;/b&gt;&lt;/b&gt; 서빙 전 검수 역할&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;음식이 나오기 전에 &quot;제대로 만들어졌는지&quot;, &quot;주문한 것과 맞는지&quot; 확인하는 단계예요. AI가 답변을 내놓았을 때 &quot;엉뚱한 말은 아닌지&quot;, &quot;형식에 맞는지&quot; 한 번 더 체크합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) 실행 제어:&lt;/b&gt; 주방 규칙 역할&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요리사가 메뉴판에 있는 음식만 만들 수 있듯이, AI 에이전트도 허용된 작업만 수행하도록 범위를 제한합니다. &quot;이 AI는 조회만 할 수 있고, 삭제는 할 수 없어&quot; 같은 규칙이 여기에 해당해요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흐름으로 보면 요렇게~&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;[ 사용자 입력 ]
      &amp;darr;
[   입력 제어 ]  &amp;larr; &quot;이상한 내용은 없나요?&quot;
      &amp;darr;
[   AI 에이전트  ]
      &amp;darr;
[   출력 제어 ]  &amp;larr; &quot;답변이 올바른가요?&quot;
      &amp;darr;
[ 사용자 응답 ]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;실습&lt;/b&gt;&lt;/h4&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;/b&gt;: Self-Routing Multi-Agent System&lt;b&gt;&lt;br /&gt;GitHub&lt;/b&gt;: &lt;a href=&quot;https://github.com/i-am-shuan/my-skill-agent&quot;&gt;https://github.com/i-am-shuan/my-skill-agent&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 프로젝트는 &lt;b&gt;SKILL.md 파일 하나만 추가하면 새 에이전트가 자동으로 활성화되는&lt;/b&gt; 멀티 에이전트 시스템입니다. 하네스 엔지니어링의 핵심 개념인 &quot;실행 제어&quot;를 SKILL.md 기반으로 구현했어요.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;사용자: &quot;이 코드 좀 봐줘&quot;
    &amp;darr;
[Orchestrator Agent] &amp;mdash; skills/ 디렉토리 스캔 &amp;rarr; &quot;code-review&quot; 선택
    &amp;darr;
[Executor Agent] &amp;mdash; code-review/SKILL.md를 system prompt로 주입 &amp;rarr; 리뷰 생성
    &amp;darr;
사용자:   코드 리뷰 결과 수신
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;빠른 시작&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;vim&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;git clone https://github.com/i-am-shuan/my-skill-agent.git
cd my-skill-agent

python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

pip install -r requirements.txt

export ANTHROPIC_API_KEY=&quot;sk-ant-...&quot;

python main.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;실행하면 대화형 CLI가 뜨고, 자연어로 요청하면 됩니다:&lt;/p&gt;
&lt;pre class=&quot;asciidoc&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;  입력 &amp;gt; 이 글 요약해줘: 인공지능은 컴퓨터 과학의 한 분야로...

  선택된 스킬: [summarize]
──────────────────────────────────────────────────
  요약

- 인공지능은 컴퓨터 과학의 핵심 분야로 기계 학습을 포함
- 딥러닝 기술 발전으로 자연어 처리 및 이미지 인식이 비약적으로 향상
- 의료, 금융, 제조 등 다양한 산업 분야에서 실용적으로 활용 중

  한 줄 결론: AI는 특정 분야를 넘어 전 산업의 핵심 인프라로 자리잡고 있다.
──────────────────────────────────────────────────
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;아키텍처&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 기본 흐름 (SKILL.md 기반 라우팅)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 사용자가 &quot;이 코드 리뷰해줘&quot;라고 입력했을 때의 전체 흐름입니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;사용자 입력 (&quot;이 코드 리뷰해줘&quot;)
    &amp;darr;
load_skills()
  └─ skills/**/SKILL.md 자동 탐색 및 로드
  └─ summarize / translate / code-review 스킬 인식
    &amp;darr;
Orchestrator Agent  [1st API call]
  └─ 스킬 목록 + 사용자 입력 &amp;rarr; Claude API
  └─ 최적 스킬 결정: &quot;code-review&quot;
    &amp;darr;
선택된 스킬: code-review  (SKILL.md 내용 추출)
    &amp;darr;
Executor Agent  [2nd API call]
  └─ SKILL.md &amp;rarr; system prompt 주입
  └─ 사용자 입력 &amp;rarr; user message
  └─ Claude API 호출 &amp;rarr; 결과 생성
    &amp;darr;
결과 반환  { selected_skill, result }
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Orchestrator와 Executor를 &lt;b&gt;두 개의 독립된 Agent로 분리&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;Orchestrator&lt;/b&gt;: &quot;무엇을 할지&quot;만 결정 (라우팅 전용, 1st API)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Executor&lt;/b&gt;: &quot;실제로 수행&quot; (SKILL.md 기반 실행, 2nd API)&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 외부 데이터소스 연결 (MCP 확장) - &lt;span style=&quot;color: #ee2323;&quot;&gt;확장 개념&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB와 같은 데이터소스가 필요할 때는 &lt;b&gt;MCP(Model Context Protocol)&lt;/b&gt; 레이어를 추가할 수 있어요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1584&quot; data-origin-height=&quot;1282&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vL6EC/dJMb99TGgPc/7h0RSlbKBObGlHdAtVtcJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vL6EC/dJMb99TGgPc/7h0RSlbKBObGlHdAtVtcJk/img.png&quot; data-alt=&quot;MCP server는 독립 프로세스 &amp;amp;mdash; DB 자격증명은 여기서만 보관, Agent 레이어에 노출되지 않음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vL6EC/dJMb99TGgPc/7h0RSlbKBObGlHdAtVtcJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvL6EC%2FdJMb99TGgPc%2F7h0RSlbKBObGlHdAtVtcJk%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;1584&quot; height=&quot;1282&quot; data-origin-width=&quot;1584&quot; data-origin-height=&quot;1282&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;MCP server는 독립 프로세스 &amp;mdash; DB 자격증명은 여기서만 보관, Agent 레이어에 노출되지 않음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  DB 자격증명은 MCP 서버 내부 .env에서만 관리됩니다. Agent 레이어에는 노출되지 않아요. 이것 자체가 하네스 엔지니어링의 &lt;b&gt;입력 제어&lt;/b&gt; 원칙 적용이에요&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 전체 메시지 시퀀스 (10단계) - &lt;span style=&quot;color: #ee2323;&quot;&gt;확장 개념&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;① 사용자 &amp;rarr; Orchestrator       자연어 요청
② Orchestrator              1st API call (라우팅: 스킬+도구 결정)
③ Orchestrator &amp;rarr; Executor   스킬+도구 결정 전달
④ Executor                  2nd API call (SKILL.md &amp;rarr; system prompt 주입)
⑤ Executor &amp;rarr; MCP dispatcher tool_use 블록 전달
⑥ dispatcher &amp;rarr; MCP server   tools/call (JSON-RPC)
⑦ MCP server &amp;rarr; DB           SQL / DSL 실행
⑧ DB &amp;rarr; MCP server           tool_result (rows) 반환
⑨ MCP server &amp;rarr; Executor     결과 컨텍스트 주입
⑩ Executor &amp;rarr; 사용자           자연어 최종 응답&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM API는 총 두 번 호출됩니다. 1st call은 라우팅 전용이라 max_tokens=50으로도 충분하고, 2nd call에서 SKILL.md가 system prompt로 주입되어 실제 작업이 수행되어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  참고: &lt;a href=&quot;https://server-engineer.tistory.com/1078&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;추가&amp;nbsp;결제&amp;nbsp;없는&amp;nbsp;Anthropic&amp;nbsp;API&amp;nbsp;연동:&amp;nbsp;Claude&amp;nbsp;Pro&amp;nbsp;구독으로&amp;nbsp;API&amp;nbsp;Key&amp;nbsp;발급하기&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SKILL.md&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SKILL.md는 에이전트가 &lt;b&gt;어떤 상황에서, 어떤 방식으로 동작해야 하는지&lt;/b&gt;를 마크다운으로 정의한 파일입니다. 코드가 아닌 파일이기 때문에, 개발자가 아닌 사람도 에이전트의 동작 범위를 조절할 수 있어요.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# code-review / SKILL.md

## Purpose
코드를 분석하여 버그, 보안 취약점, 코드 품질을 리뷰합니다.

## Trigger
- &quot;코드 리뷰&quot;, &quot;버그&quot;, &quot;개선점&quot;
- 코드 블록이 포함된 입력과 함께 피드백을 요청하는 경우

## Instructions
1. 코드 전체를 읽고 언어와 목적을 파악한다
2. 버그, 보안, 성능, 가독성 순서로 검토한다
3. 심각도를   Critical /   Warning /   Suggestion으로 분류한다

## Output Format
  코드 리뷰 결과
...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;새 에이전트를 추가하는 방법은 딱 두 단계입니다. &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;폴더를 만들고, 그 안에 SKILL.md를 작성하는 것이 전부예요.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;별도의 코드 수정이나 에이전트 등록 작업이 필요 없고, load_skills()가 실행될 때 자동으로 새 스킬을 탐색해서 Orchestrator에 반영합니다.&lt;/p&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# Step 1. 스킬 폴더 생성
mkdir skills/sentiment-analysis

# Step 2. SKILL.md 작성 (Purpose / Trigger / Instructions / Output Format)
cat &amp;gt; skills/sentiment-analysis/SKILL.md &amp;lt;&amp;lt; 'EOF'
# Sentiment Analysis Skill

## Purpose
텍스트의 감정(긍정/부정/중립)을 분석합니다.

## Trigger
- &quot;감정 분석&quot;, &quot;sentiment&quot;, &quot;긍정인지 부정인지&quot;

## Instructions
1. 텍스트 전체의 어조와 단어를 분석한다
2. 긍정/부정/중립 비율을 계산한다
3. 핵심 감정 키워드를 추출한다

## Output Format
  감정 분석 결과
- 전체 감정: [긍정 / 부정 / 중립]
- 핵심 키워드: [키워드1, 키워드2]
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 두 단계만 완료하면, 다음 실행부터 바로 사용할 수 있습니다:&lt;/p&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;python main.py &quot;이 리뷰 감정 분석해줘: 정말 별로였어요...&quot;
#   선택된 스킬: [sentiment-analysis]
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;b&gt;&lt;u&gt;오케스트레이터 코드는 단 한 줄도 수정하지 않아도 되어요&lt;/u&gt;.&lt;/b&gt; SKILL.md의 Trigger 섹션이 곧 라우팅 기준이 되기 때문에, 트리거 키워드를 구체적으로 작성할수록 Orchestrator의 선택 정확도가 높아집니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;마치며&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하네스 엔지니어링은 &lt;b&gt;'AI를 얼마나 자유롭게 두느냐'가 아니라, '얼마나 안전한 울타리를 제공하느냐'&lt;/b&gt;의 문제입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;4,2&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4,2&quot; data-ke-size=&quot;size16&quot;&gt;AI 에이전트를 실제 서비스에 투입하는 순간, &quot;입력은 안전한가?&quot;, &quot;출력은 정확한가?&quot;, &quot;권한은 적절한가?&quot;라는 현실적인 고민에 직면하게 됩니다. 이번에 살펴본 &lt;b&gt;SKILL.md&lt;/b&gt; 기반의 구조는 복잡한 코드 수정 없이도 AI의 행동 방침을 정의하고 제어할 수 있는 가장 직관적인 '하네스'의 구현체라고 할 수 있어요.&lt;/p&gt;
&lt;p data-path-to-node=&quot;4,2&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4,3&quot; data-ke-size=&quot;size16&quot;&gt;AI가 제멋대로 튀지 않으면서도 제 실력을 발휘할 수 있도록 돕는 견고한 설계, 그것이 신뢰받는 AI 서비스를 만드는 첫걸음이 아닐까요?&lt;/p&gt;
&lt;p data-path-to-node=&quot;4,3&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4,3&quot; data-ke-size=&quot;size16&quot;&gt;꽤 매력적인 작업이죠?  &lt;/p&gt;</description>
      <category>AI Engineering/AI Strategy &amp;amp; Insights</category>
      <category>LLM 에이전트</category>
      <category>llmops</category>
      <category>mcp server</category>
      <category>Multi-Agent System</category>
      <category>SKILL.md</category>
      <category>하네스 엔지니어링</category>
      <author>ServerEngineer</author>
      <guid isPermaLink="true">https://server-engineer.tistory.com/1099</guid>
      <comments>https://server-engineer.tistory.com/1099#entry1099comment</comments>
      <pubDate>Fri, 24 Apr 2026 18:20:34 +0900</pubDate>
    </item>
    <item>
      <title>Claude Code로 코드 수정 자동화하기 (AI 코딩 에이전트)</title>
      <link>https://server-engineer.tistory.com/1098</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;&quot;이 함수 비동기로 바꿔줘&quot;, &quot;이 파일 리팩토링해줘~!&quot; 말 한마디면 AI가 직접 코드를 고쳐주는 시대가 왔습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Claude Code&lt;/b&gt;는 터미널에서 실행되는 AI 코딩 에이전트로, 채팅 명령만으로 파일 수정부터 Git 작업까지 처리해 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는 소스코드의 개선사항을 Claude Code로 수정하는 과정을 살펴보겠습니다 &lt;b&gt; &lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Claude Code가 뭔가요?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code는 Anthropic이 만든 &lt;b&gt;터미널 기반 AI 코딩 에이전트&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 AI 코딩 도구들이 IDE 플러그인이나 웹 인터페이스 형태였다면, Claude Code는 터미널에서 직접 실행되며 아래와 같은 작업을 자연어 명령으로 처리해 줍니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파일 읽기 / 수정 / 생성&lt;/li&gt;
&lt;li&gt;Git 작업 (diff, commit, branch 등)&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 data-index-in-node=&quot;27&quot; data-path-to-node=&quot;3,0&quot;&gt;든든한 AI 동료&lt;/b&gt;라고 생각하면 될 것 같아요  &amp;zwj;♂️&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;실습 배경&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 FastAPI 기반 서비스의 &quot;/review&quot; API는 모든 처리가 끝난 뒤에만 응답을 보내는 방식이었습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;5,1&quot; data-ke-size=&quot;size16&quot;&gt;그러다 보니 내부 로직은 금방 끝나는데도 GitLab CI/CD 파이프라인이 응답을 계속 기다리며 최대 10분 동안 '실행 중' 상태에 머물러 있게 되는 문제가 있었어요. 파이프라인의 효율을 높이기 위해 불필요한 대기 시간을 줄이는 개선 작업을 Claude Code를 이용하여 진행했습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[실습] Claude Code로 코드 수정 자동화하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. Claude Code 설치&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code를 설치하는 방법은 크게 두 가지가 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;방법 A: npm으로 설치&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;Node.js 환경이 구축되어 있다면 가장 확실하고 공식적인 방법입니다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjeuars29yTAxUAAAAAHQAAAAAQggE&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;# 글로벌 설치
npm install -g @anthropic-ai/claude-code

# 설치 확인
claude --version
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,0&quot;&gt;  참고&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,0,0&quot;&gt;Node.js 버전:&lt;/b&gt; npm 설치 시 Node.js 18.x 이상의 버전이 필요합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,1,0&quot;&gt;권한 문제:&lt;/b&gt; npm 설치 시 EACCES 에러가 발생한다면 명령어 앞에 sudo를 붙이거나, npm 기본 경로 설정을 확인해 주세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;방법 B: Homebrew로 설치 (macOS 사용자)&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;터미널 패키지 관리자인 Homebrew를 선호하신다면 아래 명령어를 사용합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;(최근에는 별도의 tap을 추가해야 하는 경우가 많으니 확인이 필요합니다.)&lt;/i&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjeuars29yTAxUAAAAAHQAAAAAQgwE&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;# Homebrew를 통한 설치
brew install anthropic-ai/tap/claude-code

# 설치 확인
claude --version
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AO2Wo/dJMcagd0W6e/Pn0MLeUZ2Gk9dSIpYkUTzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AO2Wo/dJMcagd0W6e/Pn0MLeUZ2Gk9dSIpYkUTzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AO2Wo/dJMcagd0W6e/Pn0MLeUZ2Gk9dSIpYkUTzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAO2Wo%2FdJMcagd0W6e%2FPn0MLeUZ2Gk9dSIpYkUTzK%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;2048&quot; height=&quot;1222&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1222&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. Git 저장소 클론 및 브랜치 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정할 프로젝트를 로컬에 받아옵니다.&lt;/p&gt;
&lt;pre class=&quot;clean&quot;&gt;&lt;code&gt;cd ~/dev  # 작업 디렉토리
git clone https://gitlab.example.com/your-team/your-project.git
cd your-project

# 수정 내용에 맞는 브랜치 생성
git checkout -b fix/code-quality-async-review
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3. Claude Code 실행 및 로그인&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;claude
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 실행하면 브라우저가 열리면서 &lt;b&gt;Anthropic 계정 로그인&lt;/b&gt;을 요청합니다. 로그인을 완료하면 터미널로 돌아오고 아래처럼 Claude Code 홈 화면이 나타납니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1682&quot; data-origin-height=&quot;1180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHxbj7/dJMcaiJBVYZ/q9KZhXU8U6aNwwXOEk50hk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHxbj7/dJMcaiJBVYZ/q9KZhXU8U6aNwwXOEk50hk/img.png&quot; data-alt=&quot;⚠️ Claude Pro 이상 구독이 필요해요 :)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHxbj7/dJMcaiJBVYZ/q9KZhXU8U6aNwwXOEk50hk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHxbj7%2FdJMcaiJBVYZ%2Fq9KZhXU8U6aNwwXOEk50hk%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;1682&quot; height=&quot;1180&quot; data-origin-width=&quot;1682&quot; data-origin-height=&quot;1180&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;⚠️ Claude Pro 이상 구독이 필요해요 :)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;워크스페이스 신뢰 여부를 묻는 화면이 나오면 &lt;b&gt;1. Yes, I trust this folder&lt;/b&gt; 를 선택하고 Enter를 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfz83i/dJMcaiQnMut/H09kpZ0wDewAAh5G5g7EwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfz83i/dJMcaiQnMut/H09kpZ0wDewAAh5G5g7EwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfz83i/dJMcaiQnMut/H09kpZ0wDewAAh5G5g7EwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcfz83i%2FdJMcaiQnMut%2FH09kpZ0wDewAAh5G5g7EwK%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;2048&quot; height=&quot;326&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;326&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. 채팅(자연어)으로 파일 수정 요청&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code 프롬프트(&amp;gt;)에서 수정 내용을 자연어로 입력합니다.&lt;/p&gt;
&lt;pre class=&quot;haml&quot;&gt;&lt;code&gt;app/main.py 파일을 수정해줘.

변경사항:
1. 첫 번째 import 라인에 BackgroundTasks 추가:
   from fastapi import FastAPI, APIRouter, HTTPException, BackgroundTasks

2. review_merge_request 함수:
   - @router.post(&quot;/review&quot;, status_code=202) 로 변경
   - 파라미터에 background_tasks: BackgroundTasks 추가
   - 기존 로직 전체를 내부 async def _run(): 으로 감싸기
   - background_tasks.add_task(_run) 호출 후 즉시 {&quot;status&quot;: &quot;accepted&quot;, &quot;message&quot;: &quot;리뷰 요청이 접수되었습니다.&quot;} 반환

3. review_feature_push 함수도 동일하게:
   - @router.post(&quot;/review/push&quot;, status_code=202) 로 변경
   - 동일한 BackgroundTasks 패턴 적용
   - 즉시 {&quot;status&quot;: &quot;accepted&quot;, &quot;message&quot;: &quot;Push 리뷰 요청이 접수되었습니다.&quot;} 반환
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a data-slideid=&quot;2075516908+261&quot; data-shapeids=&quot;12&quot; data-sessionid=&quot;6ad9a15e-b4d6-4336-b9a8-65d9d9245259&quot; data-clipservice-param=&quot;{&amp;quot;cYd&amp;quot;:[true],&amp;quot;dYd&amp;quot;:[true]}&quot; data-clipboardasbytes-url=&quot;https://powerpoint.officeapps.live.com/pods/GetClipboardBytes.ashx?Id=97072e04-7d90-4db3-926d-aba579eff2c4&amp;amp;DC=PJP1&amp;amp;pkey=0713c9c7-e18a-48bc-b297-4171854dcc06&amp;amp;wdwaccluster=PJP1&amp;amp;DataType=shape&quot; data-timestamp=&quot;Tue, 07 Apr 2026 22:00:31 GMT&quot; data-pkey=&quot;0713c9c7-e18a-48bc-b297-4171854dcc06&quot; data-clipservice-isemptyplaceholder=&quot;false&quot; data-clipservice-cut=&quot;false&quot; data-clipservice-count=&quot;1&quot; data-clipservice-type=&quot;shape&quot; data-clipservice-dc=&quot;PJP1&quot; data-clipservice-location=&quot;x3Zpm9HAwEi12ElWvRnokGNodHRwczovL29zMXBlcGYwMDAyZDM5ODo4Mi9wb2RzL3BvZENsaXAuc3ZjP1BvZFNJRD1fLl8uXy5jMmZlMDRkOC0yOTEyLWRhODQtMzI1Zi04NmNiNGIwOTViZDEtLi0uLS41&quot; data-clipservice-version=&quot;2&quot; data-clipservice-ccpid=&quot;97072e04-7d90-4db3-926d-aba579eff2c4&quot; data-copyfailedreason=&quot;0&quot; data-copystatus=&quot;32&quot;&gt;&amp;nbsp;&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;Yes, allow all edits during this session&quot;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;을 선택하면 이후 수정도 자동으로 승인됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2854&quot; data-origin-height=&quot;1244&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9GYlN/dJMcaco8UuV/rmN4h1LAbYnmDqcbkKank1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9GYlN/dJMcaco8UuV/rmN4h1LAbYnmDqcbkKank1/img.png&quot; data-alt=&quot;Yes, allow all edits during this session&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9GYlN/dJMcaco8UuV/rmN4h1LAbYnmDqcbkKank1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9GYlN%2FdJMcaco8UuV%2FrmN4h1LAbYnmDqcbkKank1%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;2854&quot; height=&quot;1244&quot; data-origin-width=&quot;2854&quot; data-origin-height=&quot;1244&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Yes, allow all edits during this session&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2516&quot; data-origin-height=&quot;1438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcgiCt/dJMcacbBtdJ/qLKjiR8mu1iXwTtMpoB5k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcgiCt/dJMcacbBtdJ/qLKjiR8mu1iXwTtMpoB5k1/img.png&quot; data-alt=&quot;Claude Code가 변경사항 diff를 보여주는 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcgiCt/dJMcacbBtdJ/qLKjiR8mu1iXwTtMpoB5k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcgiCt%2FdJMcacbBtdJ%2FqLKjiR8mu1iXwTtMpoB5k1%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;2516&quot; height=&quot;1438&quot; data-origin-width=&quot;2516&quot; data-origin-height=&quot;1438&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Claude Code가 변경사항 diff를 보여주는 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. 변경사항 확인 후 Push&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code를 종료하고 소스코드를 반영하면 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;끄읏~!&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# Claude Code 종료
/exit

# 변경 내용 확인
git diff app/main.py

# 커밋 및 push
git add app/main.py
git commit -m &quot;커밋 메시지&quot;
git push origin 브랜치명&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;마치며&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI가 코드를 짜주는 시대, 거부하고 싶을 때도 있지만 파도는 이미 밀려오고 있습니다.  &lt;/p&gt;
&lt;p data-path-to-node=&quot;5,1&quot; data-ke-size=&quot;size16&quot;&gt;변화의 파도에 올라타 즐길 것인지, 아니면 휩쓸릴 것인지는 한 끗 차이인 것 같아요.&lt;/p&gt;
&lt;p data-path-to-node=&quot;5,1&quot; data-ke-size=&quot;size16&quot;&gt;Claude Code 같은 도구를 내 보조 개발자로 활용하며 익숙해지는 연습이 꼬옥~ 필요한 시점인 것 같습니다 :)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보드 위에 올라설 준비, 되셨나요~?    &amp;zwj;♂️ &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;터미널이 낯선 분들을 위한 TIP&lt;/b&gt;&lt;br /&gt;VS Code에서 &lt;b&gt;Claude 확장 플러그인&lt;/b&gt;을 설치하면 터미널 없이도 동일한 작업을 GUI 환경에서 편하게 할 수 있어요. &lt;br /&gt;터미널 환경이 익숙치 않으시다면, VS Code를 사용하는 것을 추천드려요 :)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  Visual Studio Code Download: &lt;a href=&quot;https://code.visualstudio.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://code.visualstudio.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1775598806245&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Visual Studio Code - The open source AI code editor | Your home for multi-agent development&quot; data-og-description=&quot;Visual Studio Code redefines AI-powered coding with GitHub Copilot for building and debugging modern web and cloud applications. Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows.&quot; data-og-host=&quot;code.visualstudio.com&quot; data-og-source-url=&quot;https://code.visualstudio.com/&quot; data-og-url=&quot;https://code.visualstudio.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/OCgVn/dJMb86nYnyL/60Bvlbp7kkw4VfqmEKsxik/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cjFVgl/dJMb9bv26wM/wjrpUNtrq8hs9YxY58wOT1/img.png?width=256&amp;amp;height=256&amp;amp;face=0_0_256_256&quot;&gt;&lt;a href=&quot;https://code.visualstudio.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://code.visualstudio.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/OCgVn/dJMb86nYnyL/60Bvlbp7kkw4VfqmEKsxik/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cjFVgl/dJMb9bv26wM/wjrpUNtrq8hs9YxY58wOT1/img.png?width=256&amp;amp;height=256&amp;amp;face=0_0_256_256');&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;Visual Studio Code - The open source AI code editor | Your home for multi-agent development&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Visual Studio Code redefines AI-powered coding with GitHub Copilot for building and debugging modern web and cloud applications. Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;code.visualstudio.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2596&quot; data-origin-height=&quot;924&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C3kSG/dJMb99MGsGe/1Ao49FSrSXaSyfLMVcsiX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C3kSG/dJMb99MGsGe/1Ao49FSrSXaSyfLMVcsiX0/img.png&quot; data-alt=&quot;Claude Code with VS Code&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C3kSG/dJMb99MGsGe/1Ao49FSrSXaSyfLMVcsiX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC3kSG%2FdJMb99MGsGe%2F1Ao49FSrSXaSyfLMVcsiX0%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;2596&quot; height=&quot;924&quot; data-origin-width=&quot;2596&quot; data-origin-height=&quot;924&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Claude Code with VS Code&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>AI Engineering/LLM &amp;amp; RAG Implementation</category>
      <category>AI 개발도구</category>
      <category>AI 코딩 에이전트</category>
      <category>Anthropic</category>
      <category>claude code</category>
      <category>Claude Code 설치</category>
      <category>개발 자동화</category>
      <category>코드 자동화</category>
      <author>ServerEngineer</author>
      <guid isPermaLink="true">https://server-engineer.tistory.com/1098</guid>
      <comments>https://server-engineer.tistory.com/1098#entry1098comment</comments>
      <pubDate>Tue, 7 Apr 2026 16:27:22 +0900</pubDate>
    </item>
    <item>
      <title>뇌-컴퓨터 인터페이스(BCI), 뇌와 컴퓨터가 연결되는 시대</title>
      <link>https://server-engineer.tistory.com/1097</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: Noto Serif KR;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bT4Rmx/dJMcabjrrln/kx9mqtU2l0jl2ypwotHPyk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bT4Rmx/dJMcabjrrln/kx9mqtU2l0jl2ypwotHPyk/img.jpg&quot; data-alt=&quot;생각만으로 커서를 움직이고, 로봇 팔을 조작하고, 잃어버린 목소리를 되찾는다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bT4Rmx/dJMcabjrrln/kx9mqtU2l0jl2ypwotHPyk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbT4Rmx%2FdJMcabjrrln%2Fkx9mqtU2l0jl2ypwotHPyk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;580&quot; height=&quot;326&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;326&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;생각만으로 커서를 움직이고, 로봇 팔을 조작하고, 잃어버린 목소리를 되찾는다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;불과 몇 년 전까지만 해도 SF 영화의 장면이었던 이 이야기가, 지금 이 순간 실제 임상 현장에서 벌어지고 있습니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;회사에서 점심 식사를 하고, 동료분들과 티타임을 하며 이야기를 하다 보면 &quot;기술이 빠르게 발전하고 있다&quot;는 말을 자주 하게 됩니다. 그런데 최근 뇌-컴퓨터 인터페이스(BCI, Brain-Computer Interface) 분야의 뉴스를 접하면서, 그 '빠르다'는 감각이 완전히 다른 차원으로 넘어갔습니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;오늘은 BCI 기술의 개념과 현재 수준을 짚어보고, 이 기술이 열어갈 세상에 대한 생각을 나눠보려 합니다.&lt;/p&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot;&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. BCI란 무엇인가 — 생각과 기계를 잇는 다리&lt;/b&gt;&lt;/h4&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;840&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ekCTwk/dJMcaiJy81e/XVe3lmzyjZlk0ji3jxgkd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ekCTwk/dJMcaiJy81e/XVe3lmzyjZlk0ji3jxgkd0/img.png&quot; data-alt=&quot;Brain-Computer Interface (https://www.the-scientist.com)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ekCTwk/dJMcaiJy81e/XVe3lmzyjZlk0ji3jxgkd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FekCTwk%2FdJMcaiJy81e%2FXVe3lmzyjZlk0ji3jxgkd0%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;700&quot; height=&quot;490&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;840&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Brain-Computer Interface (https://www.the-scientist.com)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;BCI(Brain-Computer Interface)&lt;/b&gt; 는 인간의 뇌 활동에서 발생하는 신경 전달 신호를 수집·해석하여 외부 기기를 제어하거나, 반대로 외부 신호를 뇌에 전달하는 기술 및 소프트웨어를 총칭합니다. &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;i&gt;&lt;b&gt;키보드나 마우스 없이, 오직 '생각'만으로 컴퓨터를 제어할 수 있게 하는 기술&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;이죠.&lt;br&gt;&amp;nbsp;&lt;br&gt;BCI 기술은 크게 세 가지 방식으로 구분됩니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;b&gt;a. 침습형 BCI (Invasive BCI)&lt;/b&gt;&lt;br&gt;두개골을 열고 전극을 뇌 조직에 직접 이식합니다. 신호의 정밀도가 가장 높지만, 수술 위험과 면역 반응 등의 위험성이 따릅니다. 뉴럴링크(Neuralink)의 'Telepathy(텔레파시)' 칩이 대표적입니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;b&gt;b. 부분 침습형 BCI (Partially Invasive BCI)&lt;/b&gt;&lt;br&gt;뇌 조직 속이 아닌 두개골 내부에 전극을 배치하거나, 혈관을 통해 이식하는 방식입니다. Synchron(싱크론)의 Stentrode가 이 방식을 활용합니다. 수술 부담을 줄이면서도 상당한 신호 품질을 확보할 수 있습니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;b&gt;c. 비침습형 BCI (Non-invasive BCI)&lt;/b&gt;&lt;br&gt;수술 없이 두피 위에서 뇌파(EEG)를 측정하는 방식입니다. 헤드셋 형태로 착용 가능하고 접근성이 높지만, 신호 품질이 낮다는 한계가 있습니다. Neurosky, Emotiv 같은 기업들이 게임, 집중력 훈련 등 다양한 소비자 제품을 이미 출시하고 있습니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;구현 원리를 단순하게 표현하면 이렇습니다.&lt;/p&gt;&lt;pre class=&quot;gcode&quot;&gt;&lt;code&gt;뇌 신호 감지 → 신호화(Signal Processing) → AI 해독(Decoding) → 기기 명령(Output)
&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;과거에는 신호 해독 단계가 BCI의 가장 큰 병목이었습니다. &lt;i&gt;그런데&lt;/i&gt;&lt;i&gt;&lt;b&gt; &lt;/b&gt;&lt;/i&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;i&gt;&lt;b&gt;최근 AI의 폭발적인 발전이 이 해독 과정을 비약적으로 정교하게 만들면서, BCI 기술 전체의 속도가 빨라지기 시작했습니다.&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot;&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 지금 어디까지 왔는가 — 실험실을 벗어난 BCI&lt;/b&gt;&lt;/h4&gt;&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;뉴럴링크(Neuralink)의 질주&lt;/b&gt;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;BCI 분야에서 가장 주목받는 기업은 단연 뉴럴링크입니다. 2026년 4월 현재, 뉴럴링크의 주요 성과를 정리하면 다음과 같습니다.&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;&lt;b&gt;2024년 1월&lt;/b&gt;: 첫 번째 인간 임상 시작. 잠수 사고로 어깨 아래가 마비된 놀런드 아르보(Noland Arbaugh, 29세)의 뇌에 칩을 이식하고, 한 달 만에 생각만으로 마우스 커서를 움직이는 데 성공&lt;/li&gt;&lt;li&gt;&lt;b&gt;2024년 3월&lt;/b&gt;: 놀런드 아르보가 생각만으로 체스를 두는 모습을 전 세계에 처음으로 공개한 영상입니다. 영상 후반부에 이식 후 처음으로 밤을 새우며 '문명 6'를 플레이했다는 소감을 밝히기도 했습니다.&lt;/li&gt;&lt;/ul&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://youtu.be/qoKwpAz3ANM?si=yi8gfipbdv--54io&quot; target=&quot;_self&quot;&gt;&lt;span&gt;https://youtu.be/qoKwpAz3ANM?si=yi8gfipbdv--54io&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=qoKwpAz3ANM&quot; data-video-thumbnail=&quot;https://blog.kakaocdn.net/dna/eoYbNc/dJMb85vPpvP/AAAAAAAAAAAAAAAAAAAAACttt7yozeRISxKv0fW9VxvUKpUzVZF2jqj7W2wgYgGe/img.jpg?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1777561199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=QwyIpTlDzoOWpBb2V3tOCqqQY3g%3D&quot; data-video-width=&quot;600&quot; data-video-height=&quot;338&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-video-title=&quot;Brain chip patient plays online chess with his thoughts&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/qoKwpAz3ANM&quot; width=&quot;600&quot; height=&quot;338&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;figcaption&gt;Brain chip patient plays online chess with his thoughts&lt;/figcaption&gt;&lt;/figure&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;&lt;b&gt;2025년 초&lt;/b&gt;: 루게릭병(ALS)으로 전신이 마비된 브래드 스미스가 뉴럴링크를 통해 맥북을 조작하고, AI로 복원된 자신의 목소리를 사용하여 영상을 제작·내레이션하는 장면을 담고 있습니다.&lt;/li&gt;&lt;/ul&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://youtu.be/CJn0WRKwg34?si=I7dGjJ2guju_z0LG&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;https://youtu.be/CJn0WRKwg34?si=I7dGjJ2guju_z0LG&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=CJn0WRKwg34&quot; data-video-thumbnail=&quot;https://blog.kakaocdn.net/dna/nz2Zu/dJMb9b3Supe/AAAAAAAAAAAAAAAAAAAAAKe5kw-KDTFfVN1RUGFrK1A_ee5cTNPCjKa-nnterSIP/img.jpg?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1777561199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=vwSD6jBKBU7jK09jHZhKn0q4zuU%3D&quot; data-video-width=&quot;600&quot; data-video-height=&quot;338&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-video-title=&quot;Elon Musk makes ALS TALK AGAIN || Nonverbal ALS Patient Uses Neuralink to Create &amp;amp; Narrate Video&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/CJn0WRKwg34&quot; width=&quot;600&quot; height=&quot;338&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;figcaption&gt;Elon Musk makes ALS TALK AGAIN || Nonverbal ALS Patient Uses Neuralink to Create &amp;amp; Narrate Video&lt;/figcaption&gt;&lt;/figure&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;&lt;b&gt;2025년 10월&lt;/b&gt;: 닉 레이가 생각만으로 로봇 팔을 움직여 컵을 잡고, 스스로 모자를 쓰는 등 독립적인 일상 기능을 수행하는 영상입니다. 뉴럴링크 공식 X(구 트위터)와 관련 채널을 통해 공개되어 큰 화제를 모았습니다.&lt;/li&gt;&lt;/ul&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://youtu.be/UW5M-8KLOvQ?si=cZYvwjI_CkbmKbO1&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;https://youtu.be/UW5M-8KLOvQ?si=cZYvwjI_CkbmKbO1&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=UW5M-8KLOvQ&quot; data-video-thumbnail=&quot;https://blog.kakaocdn.net/dna/bakeYM/dJMb8SXydjL/AAAAAAAAAAAAAAAAAAAAAHNRdaSbT-L20nyCWyqf4ZTaMHnVdCvzeshdyb4qqj5S/img.jpg?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1777561199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=NTHe32mvstqLrJM1fJ8SQIDkIMg%3D&quot; data-video-width=&quot;600&quot; data-video-height=&quot;338&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-video-title=&quot;Elon&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/UW5M-8KLOvQ&quot; width=&quot;600&quot; height=&quot;338&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;figcaption&gt;Elon's Neuralink Patient CONTROLS Everything with His MIND !&lt;/figcaption&gt;&lt;/figure&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;&lt;b&gt;2025년&lt;/b&gt;: 영국(런던대학교병원·뉴캐슬병원), 캐나다, UAE로 임상 확대. 영국 첫 참가자는 이식 수술 후 불과 몇 시간 만에 생각만으로 컴퓨터를 조작. 2026년 1월 기준 전 세계 21명이 임상 등록&lt;/li&gt;&lt;li&gt;&lt;b&gt;2026년 1월&lt;/b&gt;: 대량 생산 및 수술 자동화 계획 공식 발표&lt;/li&gt;&lt;/ul&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br&gt;FDA는 뉴럴링크의 언어 복원 기술과 시각 회복 장치(Blindsight)를 각각 '혁신 장치(Breakthrough Device)'로 지정했으며, 뉴럴링크는 2026년부터 BCI 장치의 본격적인 양산 체제 전환을 선언한 상태입니다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;p data-ke-size=&quot;size18&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;Synchron(싱크론)&lt;/b&gt;: 제프 베조스·빌 게이츠의 투자를 받은 기업으로, 혈관 내부를 통해 Stentrode를 삽입하는 방식을 사용합니다. 뇌를 직접 개봉하지 않아도 된다는 점에서 차별화됩니다.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Paradromics&lt;/b&gt;: FDA 승인을 획득한 'Connexus' 장치로 초당 200비트 전송이라는 높은 대역폭을 자랑합니다.&lt;/li&gt;&lt;li&gt;&lt;b&gt;중국&lt;/b&gt;: 2026년 정부 업무 보고에 BCI 기술을 공식 포함하며 국가 차원의 지원을 선언했습니다. 충칭 등 주요 도시에서는 이미 뇌졸중 재활 환자를 대상으로 BCI 기반 치료를 임상에 적용하고 있습니다.&lt;/li&gt;&lt;/ul&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;시장도 빠르게 커지고 있다&lt;/b&gt;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;글로벌 BCI 시장은 2025년 약 29억 4천만 달러에서 2035년 약 138억 6천만 달러 규모로 성장할 것으로 전망됩니다(연평균 성장률 약 16.8%). 미국에서만 540조 원 규모의 시장이 형성될 것이라는 분석도 나옵니다.&lt;/p&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot;&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. AI와 BCI의 교점 — 해독(Decoding)이 핵심&lt;/b&gt;&lt;/h4&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;뇌 신호는 사람마다 다르고, 같은 사람이라도 컨디션에 따라 매번 달라집니다. 그 복잡한 신호에서 '의도'를 찾아내는 것은 마치 수십억 개의 노이즈 속에서 한 사람의 목소리를 구분해내는 일과 같습니다. 바로 이 지점에서 최근의 AI가 빛을 발합니다. 뉴럴링크의 참가자 닉은 임플란트 이식 첫 주에 일반인이 마우스를 사용하는 속도를 이미 넘어섰는데, 이것이 가능했던 것은 순전히 AI의 실시간 신호 해독 능력 덕분이었습니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;국제학술지 네이처(Nature)가 '뇌 생각 읽기 연구'를 2025년 주목할 과학 중 하나로 선정한 것도 같은 맥락입니다. BCI가 단순한 실험 기술을 넘어, 인간의 의사소통 방식을 근본적으로 바꿀 수 있는 기술로 자리잡아가고 있다는 신호이기도 합니다.&lt;/p&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot;&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. 앞으로 어떤 세상이 펼쳐질까&lt;/b&gt;&lt;/h4&gt;&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;단기 전망 (2026~2030): 의료에서 시작, 경계를 허물다&lt;/b&gt;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;현재 BCI의 주요 무대는 의료입니다. ALS, 척수 손상, 뇌졸중 후유증, 시각·언어 장애 환자들에게 BCI는 삶의 질을 크게 끌어올리는 기술로 자리잡아 가고 있습니다.&lt;br&gt;&amp;nbsp;&lt;br&gt;뉴럴링크 공동 창업자 서동진 박사님은 &lt;i&gt;&lt;b&gt;&quot;2028년 e스포츠 올림픽에서 뉴럴링크 칩을 이식받은 환자가 금메달을 딸 수도 있을 것&quot;&lt;/b&gt;&lt;/i&gt;이라고 전망했습니다. 물론 아직은 조심스러운 예측이지만, 장애와 비장애의 경계를 기술이 조금씩 허물어가고 있다는 건 분명히 느껴집니다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;중기 전망 (2030~2040): 생각의 속도로 세상과 연결&lt;/b&gt;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;지금 우리는 키보드와 마우스로 컴퓨터와 대화합니다. 그 다음은 음성이 됐고, 그 다음은 시선 추적이나 제스처가 될 것 같습니다. 그리고 그 끝에는 어쩌면 직접적인 신경 신호가 있지 않을까요~?&lt;br&gt;&amp;nbsp;&lt;br&gt;생각의 속도로 명령하고, 생각의 속도로 응답받는 세계. BCI와 가상현실(VR), 증강현실(AR)의 결합도 조금씩 연구 단계를 넘어 상용화를 향해 움직이고 있는 것 같습니다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;p data-ke-size=&quot;size18&quot;&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;/p&gt;&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot;&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. 마치며&lt;/b&gt;&lt;/h4&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://server-engineer.tistory.com/1063&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;CES 2026에서 휴머노이드 로봇&lt;/span&gt;&lt;/a&gt;을 보며 &quot;실험실이 현장이 되고 있다&quot;고 썼던 게 엊그제 같은데, BCI 역시 같은 변곡점을 넘어서고 있다는 걸 느낍니다.&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;닉이 수년 만에 처음으로 스스로 냉장고를 열고, 브래드가 잃어버렸던 자신의 목소리를 되찾는 장면을 보면서, 이건 그냥 기술 뉴스가 아니라는 생각이 들었습니다. 누군가에게는 이것이 삶 자체를 돌려받는 일이니까요.&lt;br&gt;&amp;nbsp;&lt;br&gt;기술은 생각보다 항상 조금 더 빠르게 우리 곁에 와 있었던 것 같습니다. BCI도 어느새 그렇게 되어 있는 건 아닐까요  &lt;/p&gt;</description>
      <category>AI Engineering/AI Strategy &amp;amp; Insights</category>
      <category>BCI</category>
      <category>BCITechnology</category>
      <category>BrainComputerInterface</category>
      <category>FutureOfAI</category>
      <category>NEURALINK</category>
      <category>NeuralInterface</category>
      <author>ServerEngineer</author>
      <guid isPermaLink="true">https://server-engineer.tistory.com/1097</guid>
      <comments>https://server-engineer.tistory.com/1097#entry1097comment</comments>
      <pubDate>Fri, 3 Apr 2026 15:50:56 +0900</pubDate>
    </item>
    <item>
      <title>Claude Cowork 200% 활용하기</title>
      <link>https://server-engineer.tistory.com/1093</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;지난 글(&lt;a href=&quot;https://server-engineer.tistory.com/1088&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;매일 아침 AI 뉴스 리포트 자동 생성하기: Claude Cowork&lt;/a&gt;)에서는 Cowork의 개념부터 설치, 세팅 방법, 그리고 실전 예시인 '뉴스 자동 수집 파이프라인' 구축까지 차근차근 살펴보았습니다. 혹시 아직 읽어보지 않으셨다면, &lt;b data-index-in-node=&quot;141&quot; data-path-to-node=&quot;3&quot;&gt;설치법과 기본 사용법, 그리고 일반 Chat과의 결정적인 차이&lt;/b&gt;를 다룬 이전 글을 먼저 확인하고 오시는 것을 추천드립니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;이번 글에서는 기본 세팅이 완료되었다는 가정하에, Cowork를 단순한 도구를 넘어 &lt;b data-index-in-node=&quot;47&quot; data-path-to-node=&quot;4&quot;&gt;진정한 '업무 동료' 수준으로 활용하기 위한 핵심 기능&lt;/b&gt;들을 하나씩 깊이 있게 파헤쳐 보겠습니다 :-)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2258&quot; data-origin-height=&quot;1256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckx9Zi/dJMcagrfx5K/EIBZfudkuzL0sI4UTXrePk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckx9Zi/dJMcagrfx5K/EIBZfudkuzL0sI4UTXrePk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckx9Zi/dJMcagrfx5K/EIBZfudkuzL0sI4UTXrePk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fckx9Zi%2FdJMcagrfx5K%2FEIBZfudkuzL0sI4UTXrePk%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;2258&quot; height=&quot;1256&quot; data-origin-width=&quot;2258&quot; data-origin-height=&quot;1256&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Scheduled Tasks: 뉴스 수집 말고도 써봤어요&amp;nbsp;  &lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지난 글에서 다룬 '오전 6시 뉴스 수집'이 Scheduled Tasks의 가장 기본적인 형태라면, 사실 이 기능의 &lt;b data-index-in-node=&quot;65&quot; data-path-to-node=&quot;3&quot;&gt;범용성&lt;/b&gt;은 상상 이상으로 넓습니다. 스케줄 작업은 단순 반복을 넘어 파일 접근, 웹 서칭, MCP 커넥터(Slack, Gmail, Google Drive 등), 그리고 여러 서브 에이전트를 조율하는 코디네이션까지 Cowork가 가진 모든 능력을 그대로 물려받기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;이를 활용하면 다음과 같은 자동화가 가능해집니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;매주 월요일 오전:&lt;/b&gt; 지난주 AI-News 폴더 내 마크다운 파일들을 분석해 '주간 하이라이트 요약본' 자동 생성&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;매일 오후 6시:&lt;/b&gt; 당일 작성한 문서들을 스캔하여 날짜별로 파일명 자동 정리&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,2,0&quot;&gt;주 1회:&lt;/b&gt; Stripe MCP를 연결해 트랜잭션 데이터를 추출하고 스프레드시트 정리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;여기서 지난 글에 미처 담지 못한 &lt;b data-index-in-node=&quot;19&quot; data-path-to-node=&quot;6&quot;&gt;중요한 주의사항&lt;/b&gt; 하나를 짚고 넘어가려 합니다. &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;i&gt;스케줄 작업은 클라우드가 아닌&lt;/i&gt; &lt;b data-index-in-node=&quot;62&quot; data-path-to-node=&quot;6&quot;&gt;사용자의 로컬 환경&lt;/b&gt;에서 실행됩니다. 즉, 컴퓨터가 꺼져 있거나 Claude Desktop 앱이 종료되어 있으면 정해진 시간에 작업이 수행되지 않습니다.&lt;/span&gt; 항상 켜두는 업무용 데스크탑이라면 문제없지만, 노트북 위주로 사용하신다면 이 구동 원리를 꼭 기억해 두셔야 합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;마지막으로 한 가지 팁을 더 드리자면, &lt;b data-index-in-node=&quot;22&quot; data-path-to-node=&quot;7&quot;&gt;복잡한 작업들을 하나의 스케줄에 몰아넣지 마세요.&lt;/b&gt; 결과물이 들쭉날쭉해질 수 있습니다. Slack 요약, 이메일 브리핑, 파일 정리처럼 성격이 다른 작업은 각각 별도의 스케줄로 분리해 독립적으로 관리하는 것이 결과의 일관성 측면에서 훨씬 유리합니다.  &lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;MCP 커넥터: Gmail 너머로 연결 범위 넓히기&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;1692&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3myRz/dJMcad2jBG8/PiLhKMnPFw2RhKNvN5yMQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3myRz/dJMcad2jBG8/PiLhKMnPFw2RhKNvN5yMQ0/img.png&quot; data-alt=&quot;Claude 계정 클릭 &amp;amp;gt; 설정 &amp;amp;gt; 커넥터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3myRz/dJMcad2jBG8/PiLhKMnPFw2RhKNvN5yMQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3myRz%2FdJMcad2jBG8%2FPiLhKMnPFw2RhKNvN5yMQ0%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;3000&quot; height=&quot;1692&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;1692&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Claude 계정 클릭 &amp;gt; 설정 &amp;gt; 커넥터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2026년 2월 업데이트로 Google Calendar, Google Drive, Gmail, DocuSign, Slack, Notion, WordPress 등 12개 이상의 MCP 커넥터가 새로 추가되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4&quot;&gt;[Claude in Chrome] 브라우저를 직접 조작하는 '대리인'의 등장&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;특히 이번 업데이트의 백미는 &lt;b&gt;'Claude in Chrome'&lt;/b&gt;입니다. 단순히 웹페이지의 텍스트를 읽어주는 수준을 넘어, &lt;b data-index-in-node=&quot;71&quot; data-path-to-node=&quot;5&quot;&gt;사용자의 브라우저를 직접 제어하는 강력한 에이전트&lt;/b&gt;가 생기는 셈입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;1. &quot;메일함에서 특정 영수증만 찾아 엑셀에 정리해줘&quot;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,1,0,0&quot;&gt;기존:&lt;/b&gt; 일일이 검색해서 금액 확인하고, 엑셀 창 띄워서 하나하나 타이핑하는 노가다의 연속...&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,1,1,0&quot;&gt;Claude:&lt;/b&gt; &quot;지난달 결제된 AWS, 쿠팡, 배달의민족 영수증 찾아서 구글 시트에 날짜, 품목, 금액별로 정리해줘.&quot; 한마디면 끝납니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,1,2,0&quot;&gt;핵심:&lt;/b&gt; 내가 이미 로그인해 둔 Gmail과 구글 시트 사이를 Claude가 종횡무진하며 데이터를 &lt;b data-index-in-node=&quot;54&quot; data-path-to-node=&quot;7,0,1,2,0&quot;&gt;직접&lt;/b&gt; 옮깁니다. 복잡한 API 연동 없이도 즉시 자동화가 가능하죠.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;2. &quot;신규 사이트 가입하고 프로필 정보 좀 채워줘&quot;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,1,0,0&quot;&gt;기존:&lt;/b&gt; 사이트 접속 &amp;rarr; 회원가입 &amp;rarr; 이메일 인증 &amp;rarr; 프로필 수정... 무한 반복되는 온보딩 과정.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,1,1,0&quot;&gt;Claude:&lt;/b&gt; &quot;이 URL 들어가서 내 GitHub 정보 바탕으로 가입하고, 내 블로그 링크랑 경력사항까지 다 입력해줘.&quot;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,1,2,0&quot;&gt;핵심:&lt;/b&gt; &lt;b data-index-in-node=&quot;4&quot; data-path-to-node=&quot;7,1,1,2,0&quot;&gt;컴퓨터 유즈(Computer Use)&lt;/b&gt; 기술 덕분에 버튼 위치를 인식해 클릭하고 타이핑까지 대신 합니다. 번거로운 가입 절차를 알아서 마무리해주는 거죠.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,2,0&quot;&gt;3. &quot;공식 문서 읽고 내 프로젝트에 적용해서 테스트까지 해줘&quot;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7,2,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,2,1,0,0&quot;&gt;기존:&lt;/b&gt; 문서 정독 &amp;rarr; 코드 수정 &amp;rarr; 브라우저 새로고침 &amp;rarr; 에러 확인 &amp;rarr; 재수정... 지루한 빌드 루프.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,2,1,1,0&quot;&gt;Claude:&lt;/b&gt; (Claude Code 연동 시) &quot;이 라이브러리 가이드 읽고 우리 서비스 로그인 페이지에 적용해봐. 브라우저에서 에러 나는지 끝까지 확인하고 보고해줘.&quot;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,2,1,2,0&quot;&gt;핵심:&lt;/b&gt; 문서를 읽는 데서 그치지 않고, &lt;b data-index-in-node=&quot;22&quot; data-path-to-node=&quot;7,2,1,2,0&quot;&gt;실제 브라우저 런타임 환경&lt;/b&gt;에서 동작 여부까지 검증합니다. 든든한 QA 엔지니어가 한 명 붙은 셈입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9&quot;&gt;  실무에서 바로 써먹는 조합 예시&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;이 기능들을 조합하면 업무 효율이 기하급수적으로 올라갑니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;Google Drive + Gmail:&lt;/b&gt; 드라이브에서 특정 문서를 불러와 요약한 뒤, 관련 부서에 보낼 이메일 초안까지 한 번에 작성합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,0&quot;&gt;Slack + 로컬 파일:&lt;/b&gt; Slack 채널에서 오간 논의 내용을 참고해 내 컴퓨터에 저장된 회의록 초안을 자동으로 업데이트합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,2,0&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Notion Sync&lt;/span&gt;:&lt;/b&gt; 수집한 뉴스 내용을 로컬에 마크다운 파일로 저장함과 동시에, 팀 공유용 Notion 페이지에도 즉시 동기화합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Skills: 내 스타일을 기억하는 템플릿&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Chat에서의 Skills가 답변 스타일에 영향을 주는 정도라면, Cowork에서의 Skills는 자율 작업 전체를 지배합니다. 브랜드 가이드라인 스킬을 설정해두면 Claude가 만드는 모든 파일에 그 가이드라인이 자동으로 적용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 이런 식입니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;리포트 스킬&quot;: 마크다운 헤더 구조, 요약 포맷, 파일명 규칙을 한 번 정의해두면 이후 모든 리포트 생성에 자동 적용&lt;/li&gt;
&lt;li&gt;&quot;팀 공유 스킬&quot;: 뉴스 요약 톤을 팀 공지 스타일로 고정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cowork는 pdf, docx, pptx, xlsx, canvas-design 생성을 위한 빌트인 스킬도 기본 탑재합니다. 지난 글처럼 마크다운으로 저장하다가 &quot;이번엔 Word 문서로 줘&quot;라고 하면 별도 설정 없이 바로 됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Sub-agent 병렬 실행: 왜 빠른지 이제 알겠더라구요&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지난 포스팅에서 뉴스를 4개 카테고리로 나누어 수집하는 과정을 보여드렸는데요. 여기서 중요한 점은 Cowork가 이 작업들을 순차적으로 하나씩 처리하지 않는다는 것입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;복잡한 작업을 여러 서브 태스크로 분해한 뒤, 여러 개의 서브 에이전트가 각 카테고리를 &lt;b data-index-in-node=&quot;49&quot; data-path-to-node=&quot;4&quot;&gt;병렬로 동시에 검색하고 취합&lt;/b&gt;하는 구조입니다. 덕분에 카테고리를 4개에서 6개로 늘려도 전체 처리 시간이 크게 늘어나지 않더라고요.&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;이런 구조를 이해하고 나면 프롬프트 설계의 방향도 달라집니다. 에이전트가 병렬로 움직일 수 있도록 카테고리나 항목을 명확히 구분해 주기만 해도, 결과물의 일관성이 훨씬 좋아지는 효과를 얻을 수 있습니다.  &lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;실전 팁: 써보면서 알게 된 것들&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 &lt;b data-index-in-node=&quot;3&quot; data-path-to-node=&quot;3&quot;&gt;폴더 구조를 명확하게 설정&lt;/b&gt;해 주세요. ~/Documents/AI-News/와 같이 경로를 간단명료하게 명시할수록, 파일이 엉뚱한 곳에 생성되는 실수를 방지할 수 있습니다. 프로젝트 폴더명도 /ClaudeWork/2026-03-AINews/처럼 날짜와 목적을 포함해 관리하면 나중에 다시 찾을 때 훨씬 편리합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4&quot;&gt;중요한 파일은 반드시 따로 백업&lt;/b&gt;해두는 습관이 필요합니다. Cowork가 파일을 덮어쓰기 전에 사용자에게 확인을 요청하지만, 아직 베타 단계라 조건이 복잡해지면 간혹 예상치 못한 동작을 할 때가 있거든요. 매일 쌓이는 뉴스 파일 형태라면 큰 문제가 없겠지만, 원본이 하나뿐인 중요한 파일은 별도로 보관하시길 권장합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;마지막으로 &lt;b data-index-in-node=&quot;6&quot; data-path-to-node=&quot;5&quot;&gt;보안도 꼭 챙기셔야해요.&lt;/b&gt; Anthropic에서도 출시 당시 프롬프트 인젝션(Prompt Injection) 공격 위험을 직접 경고한 바 있습니다. 즉, 외부 웹에서 수집한 콘텐츠 내용에 따라 Claude의 동작이 의도치 않게 변경될 수 있다는 뜻인데요. 뉴스 수집처럼 외부 콘텐츠를 대량으로 다루는 작업은 민감한 파일이 들어있는 폴더와 철저히 분리해서 운영하는 것이 안전합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;n8n이랑 비교하면?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지난 글 비교표에 n8n이 &quot;가장 완성도 높음&quot;으로 올라가 있어서 물어보신 분들이 있었습니다. 솔직하게 정리하면 이렇습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정기적이고 관리가 필요한 자동화라면 n8n이 더 적합합니다. Slack 알림, 조건 분기, DB 적재 같은 복잡한 처리가 필요하다면 n8n 쪽이 확장성이 압도적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;i&gt;Cowork의 장점은 진입 비용이 거의 없다&lt;/i&gt;&lt;/span&gt;는 겁니다. 서버 띄울 필요 없고, 노드 연결 방법 공부할 필요 없고, 프롬프트 하나면 파이프라인이 생깁니다. 처음 시도해보는 자동화라면 Cowork로 시작해서 한계가 느껴질 때 n8n으로 마이그레이션하는 것도 좋은 방법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a href=&quot;https://server-engineer.tistory.com/1079&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: start;&quot;&gt;n8n 사용법: 코드 없이 AI 업무 자동화 비서 만드는 방법 (LLM 연동 가이드)&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;마치며&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지난 포스팅에서 시작한 뉴스 수집 파이프라인에 이번에 소개해 드린 기능들을 하나씩 덧붙여 나가면, 꽤 근사한 &lt;b data-index-in-node=&quot;65&quot; data-path-to-node=&quot;3&quot;&gt;개인용 자동화 시스템&lt;/b&gt;이 구축됩니다. Scheduled Tasks로 주기를 설정하고, Skills로 결과물 포맷을 고정한 뒤, 커넥터를 통해 Slack이나 Notion까지 연결해 보세요. 그러면 &lt;b data-index-in-node=&quot;173&quot; data-path-to-node=&quot;3&quot;&gt;수집부터 정리, 공유까지&lt;/b&gt; 손 하나 까딱하지 않아도 물 흐르듯 돌아가는 구조가 완성됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;물론 아직은 베타 서비스 특성상 완벽하지 않은 부분도 보이지만, 코드 한 줄 없이 이 정도 수준의 자동화가 가능하다는 점은 무척 인상적입니다. 백엔드 엔지니어 관점에서도 굳이 직접 스크립트를 짤 필요가 없는 단순 반복 업무들은 이런 도구에 위임하는 것이 &lt;b data-index-in-node=&quot;142&quot; data-path-to-node=&quot;4&quot;&gt;시간 대비 효율&lt;/b&gt; 측면에서 훨씬 현명한 선택이 아닐까 싶습니다  &lt;/p&gt;</description>
      <category>AI Engineering/AI Strategy &amp;amp; Insights</category>
      <category>AI 에이전트</category>
      <category>Claude Cowork</category>
      <category>MCP 커넥터</category>
      <category>노코드 파이프라인</category>
      <category>업무 자동화</category>
      <author>ServerEngineer</author>
      <guid isPermaLink="true">https://server-engineer.tistory.com/1093</guid>
      <comments>https://server-engineer.tistory.com/1093#entry1093comment</comments>
      <pubDate>Wed, 18 Mar 2026 08:09:51 +0900</pubDate>
    </item>
    <item>
      <title>ALB와 AWS WAF를 이용한 x-api-key 기반 API 보안 강화하기</title>
      <link>https://server-engineer.tistory.com/1092</link>
      <description>&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;인프라를 만지다 보면 보안과 편의성 사이에서 참 고민이 많아지죠. 최근에 Multi Agent 사내 서비스를 구축하면서 &quot;아차&quot; 싶었던 순간이 있었습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;든든한 사내망(VPC) 안에 고이 모셔둔 서비스라 안전할 줄 알았는데, 알고 보니 방화벽이 허용된 사내 PC라면 누구나 Postman으로 API를 쿡쿡 찔러볼 수 있는 상태더라고요. &quot;에이, 우리 식구들끼리 쓰는 건데 어때?&quot;라는 안일한 생각이 자칫하면 보안의 '구멍'이 될 수도 있겠다는 직감이 왔습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;그래서 오늘은 큰 공사 없이도 인프라 레벨에서 슥~ 방어막을 칠 수 있는 방법을 가져왔습니다. AWS WAF를 활용해 x-api-key 검증 레이어를 한 겹 덧씌워, 더 안전하게 업그레이드해 본 과정을 가볍게 공유해 봅니다 :)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;193&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l4SH5/dJMcabcmWja/KKQSXKTEXD4awoQNsgKJS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l4SH5/dJMcabcmWja/KKQSXKTEXD4awoQNsgKJS1/img.png&quot; data-alt=&quot;ALB + WAF + Secrets Manager&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l4SH5/dJMcabcmWja/KKQSXKTEXD4awoQNsgKJS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl4SH5%2FdJMcabcmWja%2FKKQSXKTEXD4awoQNsgKJS1%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;800&quot; height=&quot;193&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;193&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ALB + WAF + Secrets Manager&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;왜 ALB가 아닌 WAF인가?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;ALB 리스너 규칙으로도 헤더 검사가 가능하지만, WAF를 사용하는 이유는 명확합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;중앙 관리&lt;/b&gt;: 여러 ALB에 동일한 Web ACL을 쉽게 적용할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;가시성&lt;/b&gt;: CloudWatch를 통해 어떤 요청이 차단되었는지 상세 로깅과 모니터링이 가능합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,2,0&quot;&gt;확장성&lt;/b&gt;: 향후 IP 차단, Rate Limit, SQL Injection 방어 등 복잡한 보안 요구사항을 즉시 추가할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 추측 불가능한 x-api-key 생성&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;비밀 키를 생성할 때는 추측이 불가능하도록 충분한 엔트로피(High Entropy)를 확보해야 합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;UUID v4 권장&lt;/b&gt;: 가장 범용적이고 안전합니다.&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;11,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;생성 방법: &lt;span style=&quot;color: #777777; text-align: center;&quot;&gt;(macOS, Linux etc) 터미널에서 uuidgen 명령어를 사용합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;354&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rz05V/dJMcab4wnBr/k5PEiGaUsrn7oIFYhqSPQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rz05V/dJMcab4wnBr/k5PEiGaUsrn7oIFYhqSPQk/img.png&quot; data-alt=&quot;uuidgen&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rz05V/dJMcab4wnBr/k5PEiGaUsrn7oIFYhqSPQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frz05V%2FdJMcab4wnBr%2Fk5PEiGaUsrn7oIFYhqSPQk%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;354&quot; height=&quot;57&quot; data-origin-width=&quot;354&quot; data-origin-height=&quot;57&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;uuidgen&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,0&quot;&gt;Prefix(접두사) 활용&lt;/b&gt;: company-nam-prod-...처럼 접두사를 붙여 관리 효율성을 높입니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,2,0&quot;&gt;Secrets Manager 활용&lt;/b&gt;: 키를 코드나 환경 변수에 직접 노출하지 않고 AWS Secrets Manager에 저장하여 관리합니다. 이는 나중에 &lt;b data-index-in-node=&quot;85&quot; data-path-to-node=&quot;11,2,0&quot;&gt;Terraform(IaC)&lt;/b&gt; 자동화 시 보안 노출 위험을 줄여줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-path-to-node=&quot;13&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. AWS WAF 설정&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15&quot;&gt;WAF 규칙(Rule) 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x-api-key 헤더를 검사하여 값이 정확히 일치할 때만 Allow 처리를 하는 사용자 지정 규칙을 생성합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3296&quot; data-origin-height=&quot;1546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clJy70/dJMcaiJjmDy/HlyMet7NT74BijzYccYxo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clJy70/dJMcaiJjmDy/HlyMet7NT74BijzYccYxo1/img.png&quot; data-alt=&quot;WAF 신규 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clJy70/dJMcaiJjmDy/HlyMet7NT74BijzYccYxo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclJy70%2FdJMcaiJjmDy%2FHlyMet7NT74BijzYccYxo1%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;3296&quot; height=&quot;1546&quot; data-origin-width=&quot;3296&quot; data-origin-height=&quot;1546&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;WAF 신규 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwj7_YStzJuTAxUAAAAAHQAAAAAQjAQ&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1992&quot; data-origin-height=&quot;1548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EXaV3/dJMcahXYxi9/oqb48G7GxcCtjwNTRnpdGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EXaV3/dJMcahXYxi9/oqb48G7GxcCtjwNTRnpdGK/img.png&quot; data-alt=&quot;(UI / JSON) 규칙 추가&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EXaV3/dJMcahXYxi9/oqb48G7GxcCtjwNTRnpdGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEXaV3%2FdJMcahXYxi9%2Foqb48G7GxcCtjwNTRnpdGK%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;1992&quot; height=&quot;1548&quot; data-origin-width=&quot;1992&quot; data-origin-height=&quot;1548&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(UI / JSON) 규칙 추가&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;{
  &quot;Name&quot;: &quot;check-x-api-key-rule&quot;,
  &quot;Priority&quot;: 1,
  &quot;Statement&quot;: {
    &quot;ByteMatchStatement&quot;: {
      &quot;FieldToMatch&quot;: {
        &quot;SingleHeader&quot;: {
          &quot;Name&quot;: &quot;x-api-key&quot;
        }
      },
      &quot;PositionalConstraint&quot;: &quot;EXACTLY&quot;,
      &quot;SearchString&quot;: &quot;YOUR_SECURE_API_KEY&quot;,
      &quot;TextTransformations&quot;: [
        {
          &quot;Type&quot;: &quot;NONE&quot;,
          &quot;Priority&quot;: 0
        }
      ]
    }
  },
  &quot;Action&quot;: {
    &quot;Allow&quot;: {}
  },
  &quot;VisibilityConfig&quot;: {
    &quot;SampledRequestsEnabled&quot;: true,
    &quot;CloudWatchMetricsEnabled&quot;: true,
    &quot;MetricName&quot;: &quot;check-x-api-key-rule&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2592&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M8SM9/dJMcahjpfXP/kcJlvoB8g4KpBmvXCxzo10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M8SM9/dJMcahjpfXP/kcJlvoB8g4KpBmvXCxzo10/img.png&quot; data-alt=&quot;보호 팩(웹 ACL) 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M8SM9/dJMcahjpfXP/kcJlvoB8g4KpBmvXCxzo10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM8SM9%2FdJMcahjpfXP%2FkcJlvoB8g4KpBmvXCxzo10%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;2592&quot; height=&quot;1616&quot; data-origin-width=&quot;2592&quot; data-origin-height=&quot;1616&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;보호 팩(웹 ACL) 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3224&quot; data-origin-height=&quot;1452&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dV4kCD/dJMcagdIpaX/2ce40HwpkfZai0GcJH8XPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dV4kCD/dJMcagdIpaX/2ce40HwpkfZai0GcJH8XPk/img.png&quot; data-alt=&quot;보호 팩(웹 ACL) 동작 변경하기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dV4kCD/dJMcagdIpaX/2ce40HwpkfZai0GcJH8XPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdV4kCD%2FdJMcagdIpaX%2F2ce40HwpkfZai0GcJH8XPk%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;3224&quot; height=&quot;1452&quot; data-origin-width=&quot;3224&quot; data-origin-height=&quot;1452&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;보호 팩(웹 ACL) 동작 변경하기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I20uo/dJMcagkr7vi/HzCUwdQ3L5PORVhAsdKdu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I20uo/dJMcagkr7vi/HzCUwdQ3L5PORVhAsdKdu0/img.png&quot; data-alt=&quot;허용 &amp;amp;gt; 차단&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I20uo/dJMcagkr7vi/HzCUwdQ3L5PORVhAsdKdu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI20uo%2FdJMcagkr7vi%2FHzCUwdQ3L5PORVhAsdKdu0%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;517&quot; height=&quot;285&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;허용 &amp;gt; 차단&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1940&quot; data-origin-height=&quot;1180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W8b6D/dJMcabwGgqL/QoVplkqHOlumCEbC9GZHvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W8b6D/dJMcabwGgqL/QoVplkqHOlumCEbC9GZHvK/img.png&quot; data-alt=&quot;'차단'으로 변경 후 , [저장] 버튼 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W8b6D/dJMcabwGgqL/QoVplkqHOlumCEbC9GZHvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW8b6D%2FdJMcabwGgqL%2FQoVplkqHOlumCEbC9GZHvK%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;514&quot; height=&quot;313&quot; data-origin-width=&quot;1940&quot; data-origin-height=&quot;1180&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;'차단'으로 변경 후 , [저장] 버튼 클릭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17&quot;&gt;보호 팩(Web ACL) 동작 변경&lt;/b&gt; 규칙 추가 후, Web ACL의 기본 동작(Default Action)을 &lt;b&gt;허용(Allow) &amp;gt; 차단(Block)&lt;/b&gt;으로 변경하고 저장합니다.&lt;/p&gt;
&lt;blockquote data-path-to-node=&quot;18&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;18,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,0&quot;&gt;  운영 팁: 장애 없는 배포 전략&lt;/b&gt; 갑작스러운 차단은 운영 리스크가 큽니다. 처음에는 Web ACL의 Default Action을 Allow로 두어 정상 요청이 잘 식별되는지 모니터링한 후, 검증이 완료되었을 때 '차단'으로 전환하는 것이 안전합니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;  GET&amp;nbsp;방식은&amp;nbsp;허용하고,&amp;nbsp;POST&amp;nbsp;방식만&amp;nbsp;검증하고&amp;nbsp;싶다면?&lt;/i&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;웹 서비스(UI)를 함께 운영하는 환경이라면 고민이 더 깊어집니다. 모든 접속에 API Key를 요구할 경우, 정작 일반 사용자가 브라우저로 접속하는 것조차 불가능해지기 때문입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;이럴 때는 &lt;b&gt;&quot;데이터 변경이 일어나는 POST 메서드이면서, 동시에 키가 없는 요청만 골라 차단&quot;&lt;/b&gt;하는 전략이 효율적입니다. 아래 JSON 설정을 참고해 보세요. (이 경우, 인증이 필요 없는 일반 GET 요청들을 통과시키기 위해 &lt;b data-index-in-node=&quot;131&quot; data-path-to-node=&quot;4&quot;&gt;Default Action은 Allow로 설정&lt;/b&gt;해야 합니다.)&lt;/p&gt;
&lt;pre id=&quot;code_1773793933133&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    &quot;Name&quot;: &quot;enforce-api-key-on-all-post-requests&quot;,
    &quot;Priority&quot;: 1,
    &quot;Statement&quot;: {
        &quot;AndStatement&quot;: {
            &quot;Statements&quot;: [
                {
                    &quot;ByteMatchStatement&quot;: {
                        &quot;SearchString&quot;: &quot;POST&quot;,
                        &quot;FieldToMatch&quot;: {
                            &quot;Method&quot;: {}
                        },
                        &quot;TextTransformations&quot;: [
                            {
                                &quot;Priority&quot;: 0,
                                &quot;Type&quot;: &quot;NONE&quot;
                            }
                        ],
                        &quot;PositionalConstraint&quot;: &quot;EXACTLY&quot;
                    }
                },
                {
                    &quot;NotStatement&quot;: {
                        &quot;Statement&quot;: {
                            &quot;ByteMatchStatement&quot;: {
                                &quot;SearchString&quot;: &quot;YOUR_SECURE_API_KEY&quot;,
                                &quot;FieldToMatch&quot;: {
                                    &quot;SingleHeader&quot;: {
                                        &quot;Name&quot;: &quot;x-api-key&quot;
                                    }
                                },
                                &quot;TextTransformations&quot;: [
                                    {
                                        &quot;Priority&quot;: 0,
                                        &quot;Type&quot;: &quot;NONE&quot;
                                    }
                                ],
                                &quot;PositionalConstraint&quot;: &quot;EXACTLY&quot;
                            }
                        }
                    }
                }
            ]
        }
    },
    &quot;VisibilityConfig&quot;: {
        &quot;SampledRequestsEnabled&quot;: true,
        &quot;CloudWatchMetricsEnabled&quot;: true,
        &quot;MetricName&quot;: &quot;enforce-api-key-on-all-post-requests&quot;
    },
    &quot;Action&quot;: {
        &quot;Block&quot;: {}
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;  [심화] 특정 경로(예: 로그인, 헬스체크)를 제외한 모든 POST 요청 방어하기&lt;/i&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;전체 POST 요청을 방어하고 싶지만, 이미 다른 인증 체계를 사용 중이거나 공개가 필요한 &quot;&lt;span style=&quot;background-color: #fafafa; color: #ee2323; text-align: start;&quot;&gt;/api/*&lt;/span&gt;&quot; 경로는 자유롭게 열어두고 싶을 때 아주 유용한 설정입니다. 특정 경로를 제외한 모든 데이터 변경(POST) 요청에 대해서만 API Key 검증을 강제하는 로직을 확인해 보세요 :)&lt;/p&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2&quot;&gt;&lt;b data-path-to-node=&quot;18,0&quot; data-index-in-node=&quot;0&quot;&gt;  &lt;/b&gt;운영 팁:&lt;/b&gt; 이 규칙은 조건에 맞는 '나쁜 요청'만 골라 막는 방식이므로, Web ACL 전체의 &lt;b&gt;Default Action은 Allow&lt;/b&gt;로 설정해야 일반적인 페이지 접속이 차단되지 않습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1773794129981&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;Name&quot;: &quot;enforce-api-key-on-post-except-api-path&quot;,
  &quot;Priority&quot;: 1,
  &quot;Statement&quot;: {
    &quot;AndStatement&quot;: {
      &quot;Statements&quot;: [
        {
          &quot;ByteMatchStatement&quot;: {
            &quot;FieldToMatch&quot;: {
              &quot;Method&quot;: {}
            },
            &quot;PositionalConstraint&quot;: &quot;EXACTLY&quot;,
            &quot;SearchString&quot;: &quot;POST&quot;,
            &quot;TextTransformations&quot;: [
              {
                &quot;Priority&quot;: 0,
                &quot;Type&quot;: &quot;NONE&quot;
              }
            ]
          }
        },
        {
          &quot;NotStatement&quot;: {
            &quot;Statement&quot;: {
              &quot;ByteMatchStatement&quot;: {
                &quot;FieldToMatch&quot;: {
                  &quot;UriPath&quot;: {}
                },
                &quot;PositionalConstraint&quot;: &quot;STARTS_WITH&quot;,
                &quot;SearchString&quot;: &quot;/api&quot;,
                &quot;TextTransformations&quot;: [
                  {
                    &quot;Priority&quot;: 0,
                    &quot;Type&quot;: &quot;NONE&quot;
                  }
                ]
              }
            }
          }
        },
        {
          &quot;NotStatement&quot;: {
            &quot;Statement&quot;: {
              &quot;ByteMatchStatement&quot;: {
                &quot;FieldToMatch&quot;: {
                  &quot;SingleHeader&quot;: {
                    &quot;Name&quot;: &quot;x-api-key&quot;
                  }
                },
                &quot;PositionalConstraint&quot;: &quot;EXACTLY&quot;,
                &quot;SearchString&quot;: &quot;YOUR_SECURE_API_KEY&quot;,
                &quot;TextTransformations&quot;: [
                  {
                    &quot;Priority&quot;: 0,
                    &quot;Type&quot;: &quot;NONE&quot;
                  }
                ]
              }
            }
          }
        }
      ]
    }
  },
  &quot;Action&quot;: {
    &quot;Block&quot;: {}
  },
  &quot;VisibilityConfig&quot;: {
    &quot;SampledRequestsEnabled&quot;: true,
    &quot;CloudWatchMetricsEnabled&quot;: true,
    &quot;MetricName&quot;: &quot;enforce-api-key-on-post-except-api-path&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-path-to-node=&quot;18&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. Python 호출 로직 샘플 (verify_waf_auth.py)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;19&quot; data-ke-size=&quot;size16&quot;&gt;Secrets Manager에서 키를 동적으로 가져와 API를 호출하는 코드입니다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwj7_YStzJuTAxUAAAAAHQAAAAAQjQQ&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;import boto3
import json
import requests
from botocore.exceptions import ClientError

def get_secret():
    secret_name = &quot;YOUR_SECRET_NAME&quot; 
    region_name = &quot;ap-northeast-2&quot;
    session = boto3.session.Session()
    client = session.client(service_name='secretsmanager', region_name=region_name)

    try:
        response = client.get_secret_value(SecretId=secret_name)
        secrets_dict = json.loads(response['SecretString'])
        return secrets_dict.get(&quot;API_KEY&quot;) 
    except ClientError as e:
        print(f&quot;Secret Manager 에러: {e}&quot;)
        raise e

def call_protected_api(url, api_key):
    headers = {'x-api-key': api_key, 'Content-Type': 'application/json'}
    try:
        response = requests.get(url, headers=headers, timeout=10)
        response.raise_for_status()
        return response.json()
    except requests.exceptions.HTTPError as err:
        print(f&quot;HTTP 호출 에러: {err}&quot;)

if __name__ == &quot;__main__&quot;:
    TARGET_URL = &quot;http://internal-your-alb-address.ap-northeast-2.elb.amazonaws.com/health&quot;
    retrieved_key = get_secret()
    if retrieved_key:
        result = call_protected_api(TARGET_URL, retrieved_key)
        print(f&quot;호출 결과: {result}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-path-to-node=&quot;22&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. 테스트&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;23&quot; data-ke-size=&quot;size16&quot;&gt;구성을 마친 후, WAF 방어선이 정상 작동하는지 확인합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;23&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;23&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-path-to-node=&quot;24,0,0&quot; data-index-in-node=&quot;0&quot;&gt;실패 예시 (키 미포함 시)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3284&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bblLJ7/dJMb99ZYyVh/FvO92DYqZ6OVImXJSmtriK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bblLJ7/dJMb99ZYyVh/FvO92DYqZ6OVImXJSmtriK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bblLJ7/dJMb99ZYyVh/FvO92DYqZ6OVImXJSmtriK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbblLJ7%2FdJMb99ZYyVh%2FFvO92DYqZ6OVImXJSmtriK%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;3284&quot; height=&quot;322&quot; data-origin-width=&quot;3284&quot; data-origin-height=&quot;322&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;curl -I &quot;http://internal-your-alb-address.elb.amazonaws.com/health&quot;
# 결과: HTTP/1.1 403 Forbidden (WAF에서 즉시 차단)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;24,1,0&quot;&gt;성공 예시: &lt;/b&gt;&lt;i&gt;verify_waf_auth.py&lt;/i&gt; 실행 시 정상 데이터 수신&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2776&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXkxZm/dJMcabcm2Wo/5cNcyDzQUvDo8hGXhJV0mK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXkxZm/dJMcabcm2Wo/5cNcyDzQUvDo8hGXhJV0mK/img.png&quot; data-alt=&quot;API KEY를 포함한 샘플로직(verify_waf_auth.py) 실행 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXkxZm/dJMcabcm2Wo/5cNcyDzQUvDo8hGXhJV0mK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXkxZm%2FdJMcabcm2Wo%2F5cNcyDzQUvDo8hGXhJV0mK%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;2776&quot; height=&quot;84&quot; data-origin-width=&quot;2776&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;API KEY를 포함한 샘플로직(verify_waf_auth.py) 실행 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-path-to-node=&quot;25&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;마치며&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;지금까지 WAF와 Secrets Manager를 조합해 사내 API에 '자물쇠'를 하나 채워봤습니다. 사실 사내 서비스라고 방심하기 쉽지만, 이런 최소한의 인증 장치 하나가 의외로 든든한 버팀목이 되곤 합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;기존 코드를 건드리지 않고 인프라 설정만으로 보안을 챙길 수 있다는 점이 이번 작업의 가장 큰 매력이 아닐까 싶네요. 여기에 주기적으로 키만 잘 갈아준다면 그야말로 금상첨화겠쥬~?&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;물론 지금 구성에도 약간의 숙제는 남아있습니다. 키가 변경될 때마다 연계된 컨테이너들이 Secrets Manager의 최신값을 반영하기 위해 재기동되어야 하는 번거로움이 있거든요.&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;이 부분은 향후 &lt;b data-index-in-node=&quot;110&quot; data-path-to-node=&quot;5&quot;&gt;애플리케이션이 구동 중에 API 서버를 통해 실시간으로 키를 호출하는 방식&lt;/b&gt;으로 개선해본다면, 중단 없는 더 유연한 시스템이 될 것 같습니다 :)&lt;/p&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Cloud &amp;amp; Infrastructure/AWS Cloud Architecture</category>
      <category>ALB WAF 연동</category>
      <category>API 보안 강화</category>
      <category>API 인증 시스템</category>
      <category>Secrets Manager</category>
      <category>WAF</category>
      <category>x-api-key 설정</category>
      <category>인프라 보안</category>
      <author>ServerEngineer</author>
      <guid isPermaLink="true">https://server-engineer.tistory.com/1092</guid>
      <comments>https://server-engineer.tistory.com/1092#entry1092comment</comments>
      <pubDate>Mon, 16 Mar 2026 10:43:46 +0900</pubDate>
    </item>
    <item>
      <title>n8n과 MCP로 구축하는 커스텀 AI 에이전트: 서버 연동부터 실습까지</title>
      <link>https://server-engineer.tistory.com/1091</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;지난 글(&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;a style=&quot;color: #006dd7;&quot; href=&quot;https://server-engineer.tistory.com/1079&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;n8n 사용법: 코드 없이 AI 업무 자동화 비서 만드는 방법&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;)에서는 n8n의 기본 개념과 설치 방법, 그리고 날씨와 뉴스를 가져오는 간단한 AI 에이전트를 만들어 보았습니다. 하지만 실제 실무 환경에서는 날씨나 뉴스보다 훨씬 복잡한 연동이 필요합니다. 사내 DB를 조회하거나, 특정 API를 호출하고, 때로는 인프라 파이프라인을 트리거해야 할 수도 있죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;이전에는 이런 기능들을 AI와 연결하려면 각 서비스마다 복잡한 API 연동 코드를 짜고 프롬프트를 조정해야 했습니다. 하지만 &lt;b&gt;MCP(Model Context Protocol)&lt;/b&gt;가 등장하면서 이 모든 방식이 완전히 달라졌습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;오늘은 n8n에서 공식 제공하는 템플릿을 활용해, MCP의 개념을 다져보고 직접 MCP 서버와 클라이언트를 구축해 보는 실습을 진행해 보겠습니다  &lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-path-to-node=&quot;15&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. MCP(Model Context Protocol)가 뭔가요?&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rLJRb/dJMcagrgIuN/kkpWmivckG5JRHVHAI680K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rLJRb/dJMcagrgIuN/kkpWmivckG5JRHVHAI680K/img.png&quot; data-alt=&quot;예전에는 도구마다 규격이 달라 매번 전용 어댑터 를 만들어야 했다면, 이제는 MCP라는 공통 약속 덕분에 한 번의 설정만으로 다양한 외부 정보를 자유롭게 연결할 수 있습니다 (이미지 출처: AHHA Labs)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rLJRb/dJMcagrgIuN/kkpWmivckG5JRHVHAI680K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrLJRb%2FdJMcagrgIuN%2FkkpWmivckG5JRHVHAI680K%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;1280&quot; height=&quot;720&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예전에는 도구마다 규격이 달라 매번 전용 어댑터 를 만들어야 했다면, 이제는 MCP라는 공통 약속 덕분에 한 번의 설정만으로 다양한 외부 정보를 자유롭게 연결할 수 있습니다 (이미지 출처: AHHA Labs)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;MCP는 한마디로 &lt;b&gt;&quot;AI 모델과 외부 도구(Tools)가 소통하는 표준화된 규약&quot;&lt;/b&gt;입니다. 우리가 키보드나 마우스를 PC에 연결할 때 USB-C 하나면 다 되듯이, AI 모델(Claude, GPT 등)이 외부 인프라나 데이터에 접근할 때 사용하는 '표준 연결 단자'라고 생각하면 쉽습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;17&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,0,0&quot;&gt;MCP 클라이언트:&lt;/b&gt; AI 에이전트 측 (예: n8n의 AI Agent 노드, Claude Desktop 등)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,1,0&quot;&gt;MCP 서버:&lt;/b&gt; 실제 작업을 수행하고 데이터를 제공하는 측 (예: 파일 시스템, DB 조회 스크립트, n8n 워크플로우 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-path-to-node=&quot;18&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 왜 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;i&gt;n8n&lt;/i&gt;&lt;/span&gt;으로 &lt;i&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;MCP&lt;/span&gt;&lt;/i&gt;를 구축하는 것이 강력할까?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;19&quot; data-ke-size=&quot;size16&quot;&gt;보통 MCP 서버를 만들려면 Python이나 TypeScript로 직접 코드를 작성하고 서버를 띄워야 합니다. 하지만 n8n을 사용하면 &lt;b data-index-in-node=&quot;76&quot; data-path-to-node=&quot;19&quot;&gt;워크플로우 자체가 하나의 훌륭한 MCP 서버&lt;/b&gt;가 됩니다. &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;i&gt;복잡한 코딩 없이 n8n의 수백 가지 기본 노드를 블록처럼 조립하기만 하면, 곧바로 AI가 호출할 수 있는 강력한 커스텀 도구(Tool)가 탄생&lt;/i&gt;&lt;/span&gt;하는 것이죠.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-path-to-node=&quot;20&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[실습] n8n으로 MCP Server &amp;amp; Client 만들기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;실습에 앞서, n8n을 이용하는 방법은 크게 두 가지입니다. 편한 환경을 선택해 주세요.&lt;/p&gt;
&lt;p data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6&quot;&gt;Option 1. n8n Cloud (Online) 이용하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;가장 빠르고 간편하게 MCP 기능을 테스트해 볼 수 있는 방법입니다. 별도의 설치 과정 없이 웹 브라우저에서 바로 시작할 수 있습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;8&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,0,0&quot;&gt;회원가입:&lt;/b&gt; &lt;a href=&quot;https://n8n.io/&quot; data-ved=&quot;0CAAQ_4QMahcKEwig1u2Bmq2TAxUAAAAAHQAAAAAQXw&quot; data-hveid=&quot;0&quot;&gt;n8n 공식 홈페이지&lt;/a&gt;에서 신규 가입을 진행합니다. (14일간 무료 체험이 가능합니다.)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,0&quot;&gt;템플릿 Import:&lt;/b&gt; 로그인 후, 아래의 공식 템플릿 페이지에 접속합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://n8n.io/workflows/3514-build-an-mcp-server-with-google-calendar-and-custom-functions/&quot; data-ved=&quot;0CAAQ_4QMahcKEwig1u2Bmq2TAxUAAAAAHQAAAAAQYA&quot; data-hveid=&quot;0&quot;&gt;Build an MCP Server with Google Calendar and Custom Functions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,2,0&quot;&gt;워크플로우 복사:&lt;/b&gt; 우측 상단의 &lt;b data-index-in-node=&quot;17&quot; data-path-to-node=&quot;8,2,0&quot;&gt;'Use this workflow'&lt;/b&gt; 버튼을 클릭하면, 내 n8n 계정의 캔버스로 즉시 복제됩니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2630&quot; data-origin-height=&quot;1246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/msZh0/dJMcaa5Emaa/9KGP4FtFFXJvRmC9n4rjq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/msZh0/dJMcaa5Emaa/9KGP4FtFFXJvRmC9n4rjq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/msZh0/dJMcaa5Emaa/9KGP4FtFFXJvRmC9n4rjq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmsZh0%2FdJMcaa5Emaa%2F9KGP4FtFFXJvRmC9n4rjq1%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;624&quot; height=&quot;296&quot; data-origin-width=&quot;2630&quot; data-origin-height=&quot;1246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1396&quot; data-origin-height=&quot;766&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AqMwc/dJMcahX2tKI/3utx9ErBvaSySsPn97VsdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AqMwc/dJMcahX2tKI/3utx9ErBvaSySsPn97VsdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AqMwc/dJMcahX2tKI/3utx9ErBvaSySsPn97VsdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAqMwc%2FdJMcahX2tKI%2F3utx9ErBvaSySsPn97VsdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;623&quot; height=&quot;342&quot; data-origin-width=&quot;1396&quot; data-origin-height=&quot;766&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;10&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10&quot;&gt;Option 2. Local PC (localhost)에 설치하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;보안상의 이유로 데이터를 내 PC 내에 두거나, 클라우드 비용 없이 무제한으로 사용하고 싶을 때 추천합니다. 로컬 환경에 구축할거라면, n8n 홈페이지 회원가입 필요없어요 :)&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;12&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,0,0&quot;&gt;n8n 설치:&lt;/b&gt;&amp;nbsp;&lt;a style=&quot;color: #0070d1; text-align: start;&quot; href=&quot;https://server-engineer.tistory.com/1079&quot;&gt;n8n 사용방법 &amp;amp; 로컬환경 셋팅하기&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,1,0&quot;&gt;브라우저 접속:&lt;/b&gt; 실행 후 안내되는 주소(http://localhost:5678)로 접속합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;8,1,0&quot; data-index-in-node=&quot;0&quot;&gt;템플릿 Import:&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 style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://n8n.io/workflows/3514-build-an-mcp-server-with-google-calendar-and-custom-functions/&quot; data-hveid=&quot;0&quot; data-ved=&quot;0CAAQ_4QMahcKEwig1u2Bmq2TAxUAAAAAHQAAAAAQYA&quot;&gt;Build an MCP Server with Google Calendar and Custom Functions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2630&quot; data-origin-height=&quot;1246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/msZh0/dJMcaa5Emaa/9KGP4FtFFXJvRmC9n4rjq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/msZh0/dJMcaa5Emaa/9KGP4FtFFXJvRmC9n4rjq1/img.png&quot; data-alt=&quot;localhost 에 import 버튼 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/msZh0/dJMcaa5Emaa/9KGP4FtFFXJvRmC9n4rjq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmsZh0%2FdJMcaa5Emaa%2F9KGP4FtFFXJvRmC9n4rjq1%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;648&quot; height=&quot;307&quot; data-origin-width=&quot;2630&quot; data-origin-height=&quot;1246&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;localhost 에 import 버튼 클릭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2516&quot; data-origin-height=&quot;864&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vBlvI/dJMcagY41hk/qobAqG6J71I3gCD39iLb4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vBlvI/dJMcagY41hk/qobAqG6J71I3gCD39iLb4K/img.png&quot; data-alt=&quot;로컬환경에 import 된 Temlate Project&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vBlvI/dJMcagY41hk/qobAqG6J71I3gCD39iLb4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvBlvI%2FdJMcagY41hk%2FqobAqG6J71I3gCD39iLb4K%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;761&quot; height=&quot;261&quot; data-origin-width=&quot;2516&quot; data-origin-height=&quot;864&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;로컬환경에 import 된 Temlate Project&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot; data-path-to-node=&quot;5&quot;&gt;&lt;b data-path-to-node=&quot;5&quot; data-index-in-node=&quot;0&quot;&gt;실습 전 준비 사항&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ngpYK/dJMcajaq2V3/gZJaEDwmaQYYVOxSkredaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ngpYK/dJMcajaq2V3/gZJaEDwmaQYYVOxSkredaK/img.png&quot; data-alt=&quot;Google 캘린더와 사용자 정의 함수(My Functions)를 결합한 MCP 서버 만들기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ngpYK/dJMcajaq2V3/gZJaEDwmaQYYVOxSkredaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FngpYK%2FdJMcajaq2V3%2FgZJaEDwmaQYYVOxSkredaK%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;2940&quot; height=&quot;1652&quot; data-origin-width=&quot;2940&quot; data-origin-height=&quot;1652&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Google 캘린더와 사용자 정의 함수(My Functions)를 결합한 MCP 서버 만들기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;이 예제는 AI 에이전트(Client)가 특정 워크플로우(Server)를 호출하여 텍스트를 변환하거나, 더미 데이터를 생성하는 구조로 되어 있습니다. 본격적인 실습에 앞서 에이전트의 '두뇌'와 '도구'를 활성화하기 위한 사전 설정이 필요합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;본격적인 워크플로우 구동을 위해 다음 두 가지 설정을 먼저 완료해 주세요.&lt;/p&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7&quot;&gt;1. OpenAI API Key 발급 및 등록&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;에이전트의 추론 능력을 위해 LLM 연결이 필요합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;'OpenAI4 4o' 아이콘을 더블클릭 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1388&quot; data-origin-height=&quot;926&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xaro4/dJMcaaSaPY4/12F8FBhPjEk0a8iRTBvq81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xaro4/dJMcaaSaPY4/12F8FBhPjEk0a8iRTBvq81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xaro4/dJMcaaSaPY4/12F8FBhPjEk0a8iRTBvq81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxaro4%2FdJMcaaSaPY4%2F12F8FBhPjEk0a8iRTBvq81%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;503&quot; height=&quot;336&quot; data-origin-width=&quot;1388&quot; data-origin-height=&quot;926&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;OpenAI API 무료 크레딧&quot;을 발급받습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckq19P/dJMb996MsYN/JC2tl0U0WcAgxIYYrk5rO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckq19P/dJMb996MsYN/JC2tl0U0WcAgxIYYrk5rO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckq19P/dJMb996MsYN/JC2tl0U0WcAgxIYYrk5rO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fckq19P%2FdJMb996MsYN%2FJC2tl0U0WcAgxIYYrk5rO0%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;574&quot; height=&quot;301&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;548&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;880&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zCBNw/dJMcabQ2XMP/FSWCVl1yYkH8skGKJYACdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zCBNw/dJMcabQ2XMP/FSWCVl1yYkH8skGKJYACdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zCBNw/dJMcabQ2XMP/FSWCVl1yYkH8skGKJYACdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzCBNw%2FdJMcabQ2XMP%2FFSWCVl1yYkH8skGKJYACdk%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;405&quot; height=&quot;395&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;880&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1546&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CM9xj/dJMcagx2JT6/FKeKBihuAR9caTy8NAbZGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CM9xj/dJMcagx2JT6/FKeKBihuAR9caTy8NAbZGk/img.png&quot; data-alt=&quot;'OpenAI 4o'에 ⚠️ 아이콘이 사라진 것을 확인할 수 있어요&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CM9xj/dJMcagx2JT6/FKeKBihuAR9caTy8NAbZGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCM9xj%2FdJMcagx2JT6%2FFKeKBihuAR9caTy8NAbZGk%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;1546&quot; height=&quot;502&quot; data-origin-width=&quot;1546&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;'OpenAI 4o'에 ⚠️ 아이콘이 사라진 것을 확인할 수 있어요&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9&quot;&gt;2. Google Calendar API 연동&lt;/b&gt; 에이전트가 실제 일정에 접근할 수 있도록 권한을 부여해야 합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;n8n의 &lt;b data-index-in-node=&quot;5&quot; data-path-to-node=&quot;10,0,0&quot;&gt;Google Calendar MCP&lt;/b&gt; 노드를 더블클릭 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwwpeh/dJMcagY7r4p/jfvqXRKSmJCExgu02kvPxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwwpeh/dJMcagY7r4p/jfvqXRKSmJCExgu02kvPxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwwpeh/dJMcagY7r4p/jfvqXRKSmJCExgu02kvPxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbwwpeh%2FdJMcagY7r4p%2FjfvqXRKSmJCExgu02kvPxK%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;381&quot; height=&quot;122&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;178&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Google 계정 로그인으로 Google Calendar API를 연결합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;834&quot; data-origin-height=&quot;772&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rnfKY/dJMcagkvXnS/ttOKindETgIWR36Uskp3f1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rnfKY/dJMcagkvXnS/ttOKindETgIWR36Uskp3f1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rnfKY/dJMcagkvXnS/ttOKindETgIWR36Uskp3f1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrnfKY%2FdJMcagkvXnS%2FttOKindETgIWR36Uskp3f1%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;493&quot; height=&quot;456&quot; data-origin-width=&quot;834&quot; data-origin-height=&quot;772&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용 중인 구글 계정을 연동하여 에이전트가 일정 조회, 생성, 수정 권한을 가질 수 있도록 승인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1720&quot; data-origin-height=&quot;1006&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/toZHX/dJMcahRgsZk/CC3LT6GVYloHAkQ0Dhur8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/toZHX/dJMcahRgsZk/CC3LT6GVYloHAkQ0Dhur8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/toZHX/dJMcahRgsZk/CC3LT6GVYloHAkQ0Dhur8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtoZHX%2FdJMcahRgsZk%2FCC3LT6GVYloHAkQ0Dhur8k%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;557&quot; height=&quot;326&quot; data-origin-width=&quot;1720&quot; data-origin-height=&quot;1006&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-path-to-node=&quot;14&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Step-by-Step: MCP 에이전트 구축 가이드&lt;/b&gt;&lt;/h4&gt;
&lt;h4 data-path-to-node=&quot;22&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22&quot;&gt;Step 1. 전체 아키텍처 파악하기&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1584&quot; data-origin-height=&quot;1098&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u0wio/dJMcaiikTQ3/XD1ko0BCPrhCHW6ewYKkZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u0wio/dJMcaiikTQ3/XD1ko0BCPrhCHW6ewYKkZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u0wio/dJMcaiikTQ3/XD1ko0BCPrhCHW6ewYKkZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu0wio%2FdJMcaiikTQ3%2FXD1ko0BCPrhCHW6ewYKkZK%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;1584&quot; height=&quot;1098&quot; data-origin-width=&quot;1584&quot; data-origin-height=&quot;1098&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;23&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,0,0&quot;&gt;좌측 영역:&lt;/b&gt; 사용자의 채팅을 받는 &lt;b data-index-in-node=&quot;19&quot; data-path-to-node=&quot;16,0,0&quot;&gt;AI Agent&lt;/b&gt;와, 이를 외부 서버와 연결해 주는 &lt;b data-index-in-node=&quot;47&quot; data-path-to-node=&quot;16,0,0&quot;&gt;MCP Clients&lt;/b&gt; 노드가 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,1,0&quot;&gt;우측 상단/하단 영역:&lt;/b&gt; 실제 기능을 수행하는 &lt;b data-index-in-node=&quot;25&quot; data-path-to-node=&quot;16,1,0&quot;&gt;MCP Server&lt;/b&gt; (My Functions Server) 워크플로우가 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-path-to-node=&quot;24&quot;&gt;&lt;i&gt;  워크플로우 상세 들여다보기&lt;/i&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,0,0&quot;&gt;분홍색 박스 (Interface):&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;AI 에이전트가 호출할 수 있는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;'입구(Entry Point)'&lt;/b&gt;입니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,1,0&quot;&gt;하단 회색 영역 (Implementation):&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;입구로 들어온 요청이 실제로 처리되는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;'실무 로직'&lt;/b&gt;입니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,2,0&quot;&gt;연결 고리:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;AI가 &quot;대문자로 바꿔줘&quot;라고 요청하면, 분홍색 박스의 My Functions Server가 하단의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;63&quot; data-path-to-node=&quot;13,2,0&quot;&gt;서브 워크플로우&lt;/b&gt;를 호출하고, 내부의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;83&quot; data-path-to-node=&quot;13,2,0&quot;&gt;Switch 노드&lt;/b&gt;가 해당 기능을 찾아 실행한 뒤 결과를 돌려주는 구조입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,0&quot;&gt;Step 2. 도구의 성격 이해하기 (Functions vs. Calendar)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 템플릿은 두 종류의 MCP 서버를 보여줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2298&quot; data-origin-height=&quot;968&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9ZM9I/dJMcafsmK4k/dLE0YjRhdL1rjWyMNX8xpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9ZM9I/dJMcafsmK4k/dLE0YjRhdL1rjWyMNX8xpk/img.png&quot; data-alt=&quot;My Functions / Google Calendar&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9ZM9I/dJMcafsmK4k/dLE0YjRhdL1rjWyMNX8xpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9ZM9I%2FdJMcafsmK4k%2FdLE0YjRhdL1rjWyMNX8xpk%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;753&quot; height=&quot;317&quot; data-origin-width=&quot;2298&quot; data-origin-height=&quot;968&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;My Functions / Google Calendar&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;14,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,1,0,0&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;My Functions&lt;/span&gt;:&lt;/b&gt; 예시로 작상된 로직(대소문자 변환, 랜덤 데이터 생성)을 AI의 도구로 등록합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,1,1,0&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Google Calendar&lt;/span&gt;:&lt;/b&gt; 구글 API와 연결된 외부 서비스를 AI가 직접 조작하게 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;20,0&quot;&gt;  &lt;/b&gt;MCP를 통하면 &lt;b&gt;내가 짠 코드(Custom)&lt;/b&gt;와 &lt;b data-index-in-node=&quot;43&quot; data-path-to-node=&quot;20,0&quot;&gt;외부 SaaS 서비스&lt;/b&gt;를 똑같은 '도구(Tool)'로서 AI에게 쥐여줄 수 있습니다.&lt;/i&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;24&quot;&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;24&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;24&quot;&gt;Step 3. MCP Server URL 발급&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;22&quot; data-ke-size=&quot;size16&quot;&gt;MCP 클라이언트가 서버에 접근하려면 연결 주소가 필요합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;23&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;'My Functions Server' 를 더블클릭하여 열어줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;736&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qvihX/dJMcaio7NGi/xqcw5qohuzOFtSiiN8f6w0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qvihX/dJMcaio7NGi/xqcw5qohuzOFtSiiN8f6w0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qvihX/dJMcaio7NGi/xqcw5qohuzOFtSiiN8f6w0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqvihX%2FdJMcaio7NGi%2Fxqcw5qohuzOFtSiiN8f6w0%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;426&quot; height=&quot;362&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;736&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;23&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;23,1,0&quot;&gt;Production URL&lt;/b&gt;을 복사합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1842&quot; data-origin-height=&quot;870&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnK8TU/dJMcafeTsAY/saU6KH5YSuARsL09Xw3zLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnK8TU/dJMcafeTsAY/saU6KH5YSuARsL09Xw3zLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnK8TU/dJMcafeTsAY/saU6KH5YSuARsL09Xw3zLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnK8TU%2FdJMcafeTsAY%2FsaU6KH5YSuARsL09Xw3zLk%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;686&quot; height=&quot;324&quot; data-origin-width=&quot;1842&quot; data-origin-height=&quot;870&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;24&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;24&quot;&gt;Step 4. MCP Client에 서버 연결하기&lt;/b&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;24&quot;&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;25&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다시 AI Agent가 있는 쪽의 &lt;b data-index-in-node=&quot;19&quot; data-path-to-node=&quot;3,0,0&quot;&gt;MCP Client&lt;/b&gt; 노드를 엽니다. (&lt;b data-index-in-node=&quot;40&quot; data-path-to-node=&quot;3,0,0&quot;&gt;My Functions&lt;/b&gt; 아이콘 더블클릭)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1648&quot; data-origin-height=&quot;652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bH44Kh/dJMb99TeCfA/8nJgc6x4sk9RPGhMKxhRgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bH44Kh/dJMb99TeCfA/8nJgc6x4sk9RPGhMKxhRgk/img.png&quot; data-alt=&quot;My Functions 아이콘 더블클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bH44Kh/dJMb99TeCfA/8nJgc6x4sk9RPGhMKxhRgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbH44Kh%2FdJMb99TeCfA%2F8nJgc6x4sk9RPGhMKxhRgk%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;534&quot; height=&quot;211&quot; data-origin-width=&quot;1648&quot; data-origin-height=&quot;652&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;My Functions 아이콘 더블클릭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;25&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;앞서 복사한 Server의 &lt;/span&gt;&lt;b data-index-in-node=&quot;15&quot; data-path-to-node=&quot;3,1,0&quot;&gt;Production URL&lt;/b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;을 SSE Endpoint 칸에 붙여넣습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;876&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRlAjR/dJMcahDIDVZ/TwsnyFfbiLRxyMTcYKtH7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRlAjR/dJMcahDIDVZ/TwsnyFfbiLRxyMTcYKtH7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRlAjR/dJMcahDIDVZ/TwsnyFfbiLRxyMTcYKtH7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRlAjR%2FdJMcahDIDVZ%2FTwsnyFfbiLRxyMTcYKtH7k%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;423&quot; height=&quot;380&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;876&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;25&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이제 AI 에이전트는 우측에 있는 수많은 서브 워크플로우(대소문자 변환, 농담 가져오기 등)를 자신의 도구처럼 자유롭게 사용할 수 있습니다.&lt;/li&gt;
&lt;li&gt;위와 동일한 방법으로 &quot;Calendar MCP&quot; 에도 &lt;b data-path-to-node=&quot;3,1,0&quot; data-index-in-node=&quot;15&quot;&gt;Production URL&lt;/b&gt;을 붙여넣어주세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4&quot;&gt;Step 5. 워크플로우 활성화&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;노드 설정 창을 닫고, 전체 워크플로우 화면 우측 상단의 &lt;b data-index-in-node=&quot;32&quot; data-path-to-node=&quot;5,0,0&quot;&gt;Publish&lt;/b&gt; 버튼을 클릭합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vPmqa/dJMcagERkfg/9ZCjI14mz6a61zhzQ5nisK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vPmqa/dJMcagERkfg/9ZCjI14mz6a61zhzQ5nisK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vPmqa/dJMcagERkfg/9ZCjI14mz6a61zhzQ5nisK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvPmqa%2FdJMcagERkfg%2F9ZCjI14mz6a61zhzQ5nisK%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;733&quot; height=&quot;293&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwzMkq/dJMcaf0cTlE/WkrbWkcWizKcdyh4B1j5LK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwzMkq/dJMcaf0cTlE/WkrbWkcWizKcdyh4B1j5LK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwzMkq/dJMcaf0cTlE/WkrbWkcWizKcdyh4B1j5LK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdwzMkq%2FdJMcaf0cTlE%2FWkrbWkcWizKcdyh4B1j5LK%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;730&quot; height=&quot;292&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;26&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;26&quot;&gt;Step 6. 실행 및 테스트 (Open Chat)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;27&quot; data-ke-size=&quot;size16&quot;&gt;아래는 AI가 MCP를 통해 특정 도구나 캘린더 서비스를 실제로 호출하는지 확인하기 위한 테스트 예시입니다. &quot;Open Chat&quot;을 열고 이렇게 요청해 보세요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1252&quot; data-origin-height=&quot;806&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dWGdvI/dJMcacoT0kT/fkxHdhhBjYFbYERJvMau31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dWGdvI/dJMcacoT0kT/fkxHdhhBjYFbYERJvMau31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dWGdvI/dJMcacoT0kT/fkxHdhhBjYFbYERJvMau31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdWGdvI%2FdJMcacoT0kT%2FfkxHdhhBjYFbYERJvMau31%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;672&quot; height=&quot;433&quot; data-origin-width=&quot;1252&quot; data-origin-height=&quot;806&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;28&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;28,0,0&quot;&gt;[My Functions MCP]&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;28,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;도구를 사용해서 이 텍스트를 대문자로 변환해줘: &lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: start;&quot;&gt;server-engineer.tistory.com&lt;/span&gt;&quot;&lt;/li&gt;
&lt;li&gt;&quot;무작위 사용자 데이터 5개를 생성해줘&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;28,1,0&quot;&gt;[Calendar MCP]&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;28,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;내 일주일 일정이 어떻게 돼?&quot;&lt;/li&gt;
&lt;li&gt;&quot;내일 오후 2시에 홍길동이랑 미팅이 있어. 내 캘린더에 추가해줘&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;30&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;  &lt;b data-index-in-node=&quot;3&quot; data-path-to-node=&quot;29&quot;&gt;확인 포인트:&lt;/b&gt; AI가 직접 MCP 클라이언트를 통해 워크플로우 서버를 호출하고, 그 결과를 바탕으로 답변을 생성하는 과정을 로그에서 직접 확인해 보세요.&lt;/i&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-path-to-node=&quot;31&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;마치며&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;32&quot; data-ke-size=&quot;size16&quot;&gt;이번 실습에서는 간단한 텍스트 변환이나 농담 가져오기 기능을 구현했지만, 이 아키텍처가 가진 잠재력은 무궁무진합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;33&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;33&quot; data-ke-size=&quot;size16&quot;&gt;이 'My Functions Server' 부분의 로직을 조금만 바꾸면, AI가 사내 GitLab 파이프라인 상태를 조회하거나 AWS 인프라 리소스 현황을 체크해서 슬랙으로 보고하게 만들 수도 있습니다. 즉, n8n과 MCP의 조합은 단순한 챗봇을 넘어 &lt;b&gt;'실제 인프라와 상호작용하는 DevOps 자동화 에이전트'&lt;/b&gt;를 구축하는 가장 빠른 지름길이 될 것입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;관련 글&lt;/b&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;a href=&quot;https://server-engineer.tistory.com/1079&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;n8n&amp;nbsp;사용법:&amp;nbsp;코드&amp;nbsp;없이&amp;nbsp;AI&amp;nbsp;업무&amp;nbsp;자동화&amp;nbsp;비서&amp;nbsp;만드는&amp;nbsp;방법&amp;nbsp;(LLM&amp;nbsp;연동&amp;nbsp;가이드)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AI Engineering/AI Strategy &amp;amp; Insights</category>
      <category>AI에이전트</category>
      <category>ai자동화</category>
      <category>mcp</category>
      <category>modelcontextprotocol</category>
      <category>n8n</category>
      <category>업무자동화</category>
      <category>워크플로우</category>
      <author>ServerEngineer</author>
      <guid isPermaLink="true">https://server-engineer.tistory.com/1091</guid>
      <comments>https://server-engineer.tistory.com/1091#entry1091comment</comments>
      <pubDate>Thu, 12 Mar 2026 17:36:46 +0900</pubDate>
    </item>
    <item>
      <title>24시간 일하는 AI 비서, OpenClaw 로컬 서버 구축 가이드</title>
      <link>https://server-engineer.tistory.com/1089</link>
      <description>&lt;div id=&quot;model-response-message-contentr_7a0d4e2645920d8d&quot; style=&quot;color: #1f1f1f;&quot;&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;이전 글에서는 데스크탑 환경에서 가볍게 쓸 수 있는 'Claude Cowork'를 활용해 아침 뉴스 리포트를 자동화하는 방법을 다루었습니다. 하지만 서버 아키텍처나 데이터 파이프라인을 설계하다 보면, 데스크탑 앱 종속성에서 벗어나 &lt;b data-index-in-node=&quot;129&quot; data-path-to-node=&quot;3&quot;&gt;내 서버(또는 로컬 환경)에서 24시간 백그라운드로 돌아가는 완전한 헤드리스(Headless) AI 비서&lt;/b&gt;를 구축하고 싶은 욕심이 생기기 마련입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;그래서 오늘은 최근 GitHub에서 엄청난 속도로 스타를 모으고 있는 오픈소스 AI 에이전트 프레임워크, &lt;b data-index-in-node=&quot;59&quot; data-path-to-node=&quot;4&quot;&gt;OpenClaw&lt;/b&gt;를 로컬 환경(Docker)에 올려보고, 매일 아침 뉴스를 요약해 내 이메일함에 꽂아주는 파이프라인을 직접 구축해 본 과정을 공유해 보겠습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;5&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. OpenClaw란? (그리고 언제 써야 할까)&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;OpenClaw는 단순히 질문에 대답만 하는 챗봇이 아니라, &lt;b data-index-in-node=&quot;34&quot; data-path-to-node=&quot;6&quot;&gt;실제로 작업을 수행하는 자율형 AI 에이전트 OS&lt;/b&gt;입니다. Anthropic이나 OpenAI의 모델을 두뇌로 사용하되, 파일 시스템이나 브라우저를 제어할 수 있는 손과 발을 달아준 형태라고 보시면 됩니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b data-index-in-node=&quot;2&quot; data-path-to-node=&quot;7&quot;&gt;주요 특징 및 활용 사례&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,0,0&quot;&gt;Heartbeat (능동적 스케줄링):&lt;/b&gt; 사용자가 직접 명령하지 않아도 지정된 시간에 스스로 깨어나 작업을 수행합니다. (예: 매일 아침 6시 뉴스 크롤링, 서버 에러 로그 모니터링)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,0&quot;&gt;멀티채널 메신저 연동:&lt;/b&gt; 텔레그램, 디스코드, WhatsApp 등에 봇으로 상주합니다. 터미널을 열 필요 없이 퇴근길 지하철에서 텔레그램으로 내 서버의 에이전트에게 명령을 내릴 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,2,0&quot;&gt;로컬 제어권 및 보안:&lt;/b&gt; 내 로컬 PC나 개인 서버(VPS)에 직접 설치하므로 민감한 데이터 주권을 완벽히 확보할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;단발성 리서치나 코딩 질문은 일반 LLM 웹 인터페이스로도 충분합니다. 하지만 &lt;b data-index-in-node=&quot;44&quot; data-path-to-node=&quot;9&quot;&gt;정기적인 스케줄링, 로컬 파일 시스템 제어, 서드파티 앱(이메일, 메신저)과의 파이프라인 통합&lt;/b&gt;이 필요할 때는 OpenClaw의 진가가 발휘됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;10&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 일반 AI 자동화 도구와의 비교 (Claude Cowork vs OpenClaw)&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: start;&quot;&gt;&lt;b&gt;◼︎&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;한 눈에 보는 비교표&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: start;&quot;&gt;
&lt;div style=&quot;color: #1f1f1f;&quot; data-ved=&quot;0CAAQ3ecQahgKEwiPl4y685GTAxUAAAAAHQAAAAAQ_wc&quot; data-hveid=&quot;0&quot;&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 226px;&quot; border=&quot;1&quot; data-path-to-node=&quot;12&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;&lt;b&gt;&lt;span data-path-to-node=&quot;12,0,0,0&quot;&gt;항목&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;&lt;b&gt;&lt;span data-path-to-node=&quot;12,0,1,0&quot;&gt;Claude Cowork&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;OpenClaw&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;제조사&lt;/td&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;Anthropic (공식)&lt;/td&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;오픈소스 (커뮤니티)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;설치&lt;/td&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;Claude Desktop 앱&lt;/td&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;로컬 서버 직접 설치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;인터페이스&lt;/td&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;GUI (Desktop 앱)&lt;/td&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;메신저 / 웹챗 / CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;파일 작업&lt;/td&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;✅&lt;/span&gt;&amp;nbsp;VM 샌드박스 내&lt;/td&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;✅&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;&amp;nbsp;&lt;/span&gt;로컬 직접&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;24/7&lt;/td&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;❌ 앱 실행 중에만&lt;/td&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;✅&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt; 서버 상시 운영&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;메신저 연동&lt;/td&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;❌&lt;/span&gt;&amp;nbsp;&lt;/span&gt;미지원&lt;/td&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;✅&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt; 텔레그램, whatapps 등&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;장기 메모리&lt;/td&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;⚠️ 세션 내 컨텍스트&lt;/td&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;✅&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;&lt;span&gt; MEMORY.md 영구 기억&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;확장성&lt;/td&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;플러그인 (Anthropic 생태계)&lt;/td&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;스킬 (ClawHub 3,000+)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;보안 관리&lt;/td&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;Anthropic이 정책 관리&lt;/td&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;사용자 직접 책임&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;비용&lt;/td&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;Claude 유료 플랜 필요&lt;/td&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 19px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;오픈소스 (API 비용 별도)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 17px;&quot;&gt;난이도&lt;/td&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;⭐️ &lt;/span&gt;쉬움 (비개발자 친화)&lt;/td&gt;
&lt;td style=&quot;color: #1f1f1f; text-align: left; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;⭐️&lt;/span&gt;⭐️⭐️ 설정 복잡&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;&lt;b&gt;◼︎&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;어떤 걸 선택할까?&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 152px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1f1f1f; text-align: start;&quot;&gt;Cladue Cowork 선택&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1f1f1f; text-align: start;&quot;&gt;OpenClaw 선택&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;비개발자 또는 설정 없이 바로 쓰고 싶다&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;&lt;span style=&quot;color: #1f1f1f; text-align: start;&quot;&gt;24/7 눙동적인 개인 AI비서가 필요하다&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;&lt;span style=&quot;color: #1f1f1f; text-align: start;&quot;&gt;문서/파일/스프레드 시트 중심&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;&lt;span style=&quot;color: #1f1f1f; text-align: start;&quot;&gt;WhatApps/Telegram으로 AI에 접근하고 싶다&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;&lt;span style=&quot;color: #1f1f1f; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;업무 기업 팀 단위 배포가 필요하다&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;&lt;span style=&quot;color: #1f1f1f; text-align: start;&quot;&gt;장기 메모리/습관 학습이 중요하다&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;&lt;span style=&quot;color: #1f1f1f; text-align: start;&quot;&gt;보안/컴플라이언스 관리를 Anthropic에 맡기고 싶다&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 19px;&quot;&gt;&lt;span style=&quot;color: #1f1f1f; text-align: start;&quot;&gt;ClawHub 스킬로 무한 확장을 원한다&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 57px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 57px;&quot;&gt;&lt;span style=&quot;color: #1f1f1f; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Google Drive / DicuSign 같은 엔터프라이즈 SaaS 연동이 필요하다&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 57px;&quot;&gt;기술적 커스터마이징에 대한 거부감이 없는 파워유저이다&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;◼︎ 핵심요약 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Claude Cowork = '지식노동자용 Claude Code' &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널 없이, 비개발자도 AI Agent의 자율 실행 능력을 그대로 활용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 파일/플러그인/커넥터 3박자 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬 파일 접근 + 도메인별 플러그인 + 엔터프라이즈 SaaS 연동으로 실무 업무 전반 자동화 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. Cowork와 OpenClaw, 용도가 다르다 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cowork는 기업 데스크톱 도구, OpenClaw는 24/7 개인 AI OS. 이 둘은 경쟁이 아닌 상호 보완관계&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;color: #1f1f1f;&quot;&gt;
&lt;h4 data-path-to-node=&quot;14&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. OpenClaw 설치 및 초기 세팅 방법&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;서버 환경 관리에 익숙하다면 복잡한 설정 없이 공식 Docker Compose를 활용하는 것이 가장 깔끔합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16&quot;&gt;Step 1. 리포지토리 클론 및 설치&lt;/b&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwiPl4y685GTAxUAAAAAHQAAAAAQggg&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;git clone https://github.com/openclaw/openclaw
cd openclaw
./docker-setup.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2386&quot; data-origin-height=&quot;680&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Au73u/dJMcaioZqUI/IzVxOLarU5c3tg7dnTwBHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Au73u/dJMcaioZqUI/IzVxOLarU5c3tg7dnTwBHk/img.png&quot; data-alt=&quot;docker-setup.sh 스크립트를 실행하면 ~/.openclaw 폴더가 생성되며, 이곳에 에이전트의 메모리, 환경 설정(API 키), 워크스페이스가 볼륨으로 마운트된다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Au73u/dJMcaioZqUI/IzVxOLarU5c3tg7dnTwBHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAu73u%2FdJMcaioZqUI%2FIzVxOLarU5c3tg7dnTwBHk%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;2386&quot; height=&quot;680&quot; data-origin-width=&quot;2386&quot; data-origin-height=&quot;680&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;docker-setup.sh 스크립트를 실행하면 ~/.openclaw 폴더가 생성되며, 이곳에 에이전트의 메모리, 환경 설정(API 키), 워크스페이스가 볼륨으로 마운트된다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2606&quot; data-origin-height=&quot;2474&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7GHKA/dJMcahcwHWK/rTeZieyuomz2b27Fv2UMEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7GHKA/dJMcahcwHWK/rTeZieyuomz2b27Fv2UMEK/img.png&quot; data-alt=&quot;./docker-setup.sh&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7GHKA/dJMcahcwHWK/rTeZieyuomz2b27Fv2UMEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7GHKA%2FdJMcahcwHWK%2FrTeZieyuomz2b27Fv2UMEK%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;2606&quot; height=&quot;2474&quot; data-origin-width=&quot;2606&quot; data-origin-height=&quot;2474&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;./docker-setup.sh&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-path-to-node=&quot;19&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #000000; text-align: start;&quot; data-slideid=&quot;2198016784+257&quot; data-shapeids=&quot;6&quot; data-sessionid=&quot;188c5f1b-c8c6-4dcb-a046-67fb71df9def&quot; data-clipservice-param=&quot;{&amp;quot;cYd&amp;quot;:[true],&amp;quot;dYd&amp;quot;:[true]}&quot; data-clipboardasbytes-url=&quot;https://powerpoint.officeapps.live.com/pods/GetClipboardBytes.ashx?Id=bef1f23d-8ca5-416f-879c-e6a096411dbc&amp;amp;DC=PSG4&amp;amp;pkey=664319b6-0ab9-44b6-974c-c28be90420f3&amp;amp;wdwaccluster=PSG4&amp;amp;DataType=shape&quot; data-timestamp=&quot;Tue, 10 Mar 2026 09:04:10 GMT&quot; data-pkey=&quot;664319b6-0ab9-44b6-974c-c28be90420f3&quot; data-clipservice-isemptyplaceholder=&quot;false&quot; data-clipservice-cut=&quot;false&quot; data-clipservice-count=&quot;1&quot; data-clipservice-type=&quot;shape&quot; data-clipservice-dc=&quot;PSG4&quot; data-clipservice-location=&quot;OY_gSAw430-zRRrz04olN2NodHRwczovL3NnMnBlcGYwMDAxZWViYzo4Mi9wb2RzL3BvZENsaXAuc3ZjP1BvZFNJRD1fLl8uXy5lNzhlZjYxZC01ZTBiLTU4YTAtOTdmOC1hNDhhMjgxMzg4ZjgtLi0uLS41&quot; data-clipservice-version=&quot;1&quot; data-clipservice-ccpid=&quot;bef1f23d-8ca5-416f-879c-e6a096411dbc&quot; data-copyfailedreason=&quot;0&quot; data-copystatus=&quot;32&quot;&gt;&amp;nbsp;&lt;/a&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;  &lt;a href=&quot;https://server-engineer.tistory.com/1078&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;추가&amp;nbsp;결제&amp;nbsp;없는&amp;nbsp;Anthropic&amp;nbsp;API&amp;nbsp;연동:&amp;nbsp;Claude&amp;nbsp;Pro&amp;nbsp;구독으로&amp;nbsp;API&amp;nbsp;Key&amp;nbsp;발급하기&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;19&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;19&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;  OpenClaw에 &lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;Gemini &lt;/span&gt;API&amp;nbsp;키&amp;nbsp;등록&lt;/i&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;OpenClaw가 학습된 지식을 넘어 &lt;b data-index-in-node=&quot;21&quot; data-path-to-node=&quot;3&quot;&gt;최신 웹 정보를 실시간으로 검색&lt;/b&gt;하려면 '검색 엔진(Search Provider)' 연동이 필수입니다. 여기서는 가장 활용도가 높은 Gemini (Google Search)를 기준으로 설명합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4&quot;&gt;1. API 키 발급&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://aistudio.google.com/&quot; data-ved=&quot;0CAAQ_4QMahgKEwiPl4y685GTAxUAAAAAHQAAAAAQrww&quot; data-hveid=&quot;0&quot;&gt;Google AI Studio&lt;/a&gt;에 접속합니다.&lt;/li&gt;
&lt;li&gt;사이드바의 &lt;b data-index-in-node=&quot;6&quot; data-path-to-node=&quot;5,1,0&quot;&gt;[Get API key]&lt;/b&gt; 메뉴로 이동합니다.&lt;/li&gt;
&lt;li&gt;[Create API key]를 클릭해 새로운 키를 생성하고 복사합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1056&quot; data-origin-height=&quot;422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/be8tvp/dJMcabDpaKe/uqvyo64wNgqrVVDvtq5W6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/be8tvp/dJMcabDpaKe/uqvyo64wNgqrVVDvtq5W6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/be8tvp/dJMcabDpaKe/uqvyo64wNgqrVVDvtq5W6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbe8tvp%2FdJMcabDpaKe%2Fuqvyo64wNgqrVVDvtq5W6k%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;638&quot; height=&quot;255&quot; data-origin-width=&quot;1056&quot; data-origin-height=&quot;422&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6&quot;&gt;2. OpenClaw에 API 키 등록&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;설치 과정(또는 npx openclaw configure --section web)에서 검색 제공업체를 &lt;b&gt;Gemini (Google Search)&lt;/b&gt;로 선택하고, 복사한 API 키를 붙여넣습니다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1396&quot; data-origin-height=&quot;766&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmaJnn/dJMcagq91OF/NqhMkfVz45BtX12BRqVoO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmaJnn/dJMcagq91OF/NqhMkfVz45BtX12BRqVoO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmaJnn/dJMcagq91OF/NqhMkfVz45BtX12BRqVoO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdmaJnn%2FdJMcagq91OF%2FNqhMkfVz45BtX12BRqVoO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;692&quot; height=&quot;380&quot; data-origin-width=&quot;1396&quot; data-origin-height=&quot;766&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;19&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;0 0 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;  [Troubleshooting] Docker 실행 시 'Container is restarting' 오류 해결&lt;/i&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker compose up으로 직접 컨테이너를 올리면 gateway.controlUi.allowedOrigins 값이 설정되지 않아 gateway가 뜨자마자 죽는 재시작 루프에 빠집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenClaw는 OPENCLAW_GATEWAY_BIND=lan 모드일 때 보안상 allowedOrigins를 반드시 요구하는데, 이 값은 docker-setup.sh를 통해서만 자동으로 세팅됩니다. 즉, 스크립트를 건너뛰고 직접 docker compose up을 실행하면 설정이 누락된 채로 컨테이너가 올라가게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;openclaw.json에 allowedOrigins를 직접 추가한 뒤 재시작해 주세요.&lt;/p&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;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; style=&quot;color: #14181f;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 1. config에 allowedOrigins 추가
python3 -c &quot;
import json
path = '/Users/shuan/.openclaw/openclaw.json'
with open(path) as f:
    cfg = json.load(f)
cfg.setdefault('gateway', {}).setdefault('controlUi', {})['allowedOrigins'] = ['http://127.0.0.1:18789', 'http://localhost:18789']
with open(path, 'w') as f:
    json.dump(cfg, f, indent=2)
print('Done')
&quot;

# 2. 재시작
docker compose down &amp;amp;&amp;amp; docker compose up -d&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-path-to-node=&quot;19&quot; data-index-in-node=&quot;0&quot;&gt;Step 2. 웹 UI 및 API 키 연동&lt;/b&gt;&lt;span style=&quot;color: #1f1f1f; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Docker 컨테이너가 올라가면 http://127.0.0.1:18789 를 통해 브라우저 대시보드에 접속할 수 있습니다. 여기서 Anthropic(또는 OpenAI) API 키를 입력하고, 필요에 따라 텔레그램 봇 토큰 등을 연결해 줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;URL: http://127.0.0.1:18789/&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2960&quot; data-origin-height=&quot;2356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EuKKS/dJMcaiWMDxi/YGjaNDu3Zq4QAGcFoX9D91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EuKKS/dJMcaiWMDxi/YGjaNDu3Zq4QAGcFoX9D91/img.png&quot; data-alt=&quot;OpenClaw Chat 대시보드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EuKKS/dJMcaiWMDxi/YGjaNDu3Zq4QAGcFoX9D91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEuKKS%2FdJMcaiWMDxi%2FYGjaNDu3Zq4QAGcFoX9D91%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;777&quot; height=&quot;618&quot; data-origin-width=&quot;2960&quot; data-origin-height=&quot;2356&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;OpenClaw Chat 대시보드&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;  [Troubleshooting] Dashboard 접속 시 'pairing required' 오류 해결&lt;/i&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1329&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ejD2Mg/dJMcaivIvo3/2kNHaHCkalaa40311CahJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ejD2Mg/dJMcaivIvo3/2kNHaHCkalaa40311CahJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ejD2Mg/dJMcaivIvo3/2kNHaHCkalaa40311CahJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FejD2Mg%2FdJMcaivIvo3%2F2kNHaHCkalaa40311CahJ0%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;1329&quot; height=&quot;896&quot; data-origin-width=&quot;1329&quot; data-origin-height=&quot;896&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p style=&quot;color: #1f1f1f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;토큰 URL로 접속해도 pairing required 메시지가 뜨는 경우, 별도의 기기 승인 단계가 필요합니다. OpenClaw는 처음 접속하는 기기를 자동으로 신뢰하지 않고, gateway 측에서 명시적으로 승인해야 연결됩니다.&lt;/p&gt;
&lt;p style=&quot;color: #1f1f1f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #1f1f1f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아래 명령어로 대기 중인 요청을 확인하고 승인해주세요.&lt;/p&gt;
&lt;pre class=&quot;applescript&quot; style=&quot;color: #14181f;&quot;&gt;&lt;code&gt;# 대기 중인 기기 목록 확인
docker exec -it openclaw-openclaw-gateway-1 openclaw devices list

# Request ID로 승인
docker exec -it openclaw-openclaw-gateway-1 openclaw devices approve &amp;lt;requestId&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1075&quot; data-origin-height=&quot;831&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oCeiQ/dJMcafsfAvf/fCr3jYv82hrwUCk1j9iOd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oCeiQ/dJMcafsfAvf/fCr3jYv82hrwUCk1j9iOd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oCeiQ/dJMcafsfAvf/fCr3jYv82hrwUCk1j9iOd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoCeiQ%2FdJMcafsfAvf%2FfCr3jYv82hrwUCk1j9iOd0%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;1075&quot; height=&quot;831&quot; data-origin-width=&quot;1075&quot; data-origin-height=&quot;831&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-path-to-node=&quot;20&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. 실습: 매일 아침 뉴스 기사를 요약해 Gmail로 보내기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;이제 OpenClaw를 이용해 매일 오전 6시에 글로벌 AI 및 서버/인프라 뉴스를 수집하고, 요약본을 Gmail로 전송하는 에이전트를 만들어 보겠습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;22&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22&quot;&gt;Step 1.&amp;nbsp; 에이전트 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker 환경에서는 openclaw 명령어를 매번 docker exec으로 실행해야 합니다. 매번 치기 번거로우니 &quot;~/.zshrc&quot;에 alias를 등록해두면 편리합니다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwiPl4y685GTAxUAAAAAHQAAAAAQgwg&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1773138156304&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# ~/.zshrc에 추가
alias openclaw='docker exec -it $(docker ps --filter name=openclaw-gateway --format &quot;{{.Names}}&quot;) openclaw'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1773138246970&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;source ~/.zshrc

# 에이전트 생성
openclaw agents add news-bot​&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성 후 대시보드 &lt;b&gt;Agents&lt;/b&gt; 메뉴에서 &lt;b&gt;Refresh&lt;/b&gt;를 누르면 news-bot이 목록에 나타납니다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;1249&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8PFxs/dJMcab4spkI/sBl9V4xu8Ao6RZAXpVPt90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8PFxs/dJMcab4spkI/sBl9V4xu8Ao6RZAXpVPt90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8PFxs/dJMcab4spkI/sBl9V4xu8Ao6RZAXpVPt90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8PFxs%2FdJMcab4spkI%2FsBl9V4xu8Ao6RZAXpVPt90%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;1072&quot; height=&quot;1249&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;1249&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4454&quot; data-origin-height=&quot;1744&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdgWZu/dJMcafZ4LXW/jFmqv2gPD2J0pf0GErcqO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdgWZu/dJMcafZ4LXW/jFmqv2gPD2J0pf0GErcqO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdgWZu/dJMcafZ4LXW/jFmqv2gPD2J0pf0GErcqO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdgWZu%2FdJMcafZ4LXW%2FjFmqv2gPD2J0pf0GErcqO1%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;4454&quot; height=&quot;1744&quot; data-origin-width=&quot;4454&quot; data-origin-height=&quot;1744&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-path-to-node=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;24&quot;&gt;Step 2. 정체성(IDENTITY) 및 프롬프트 부여&lt;/b&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4456&quot; data-origin-height=&quot;2304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OqP4f/dJMcaadqRYU/5g1dcNs9vQyBrqPbqen780/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OqP4f/dJMcaadqRYU/5g1dcNs9vQyBrqPbqen780/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OqP4f/dJMcaadqRYU/5g1dcNs9vQyBrqPbqen780/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOqP4f%2FdJMcaadqRYU%2F5g1dcNs9vQyBrqPbqen780%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;4456&quot; height=&quot;2304&quot; data-origin-width=&quot;4456&quot; data-origin-height=&quot;2304&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;대시보드에서 &lt;b&gt;Agents &amp;rarr; news-bot &amp;rarr; Files&lt;/b&gt; 탭으로 이동하면 IDENTITY.md 파일을 바로 편집할 수 있습니다. 기본 템플릿 내용을 지우고 아래 내용을 붙여넣은 뒤 &lt;b&gt;Save&lt;/b&gt; 버튼을 클릭해주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 챗봇의 시스템 프롬프트 역할을 넘어, 에이전트의 행동 지침서가 됩니다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwiPl4y685GTAxUAAAAAHQAAAAAQhAg&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# IDENTITY.md

너는 나의 개인 뉴스 큐레이터 에이전트다.

## 역할
매일 아침 AI 및 서버/인프라 분야의 주요 뉴스를 수집하고 요약해서 보고한다.

## 정기 작업
- [AI 트렌드, MLOps, 서버 인프라 동향] 카테고리로 지난 24시간 내의 주요 뉴스를 웹에서 검색한다.
- 카테고리별로 가장 중요한 뉴스 3개를 선정해 핵심 내용 3줄과 원문 링크를 마크다운으로 정리한다.
- 정리가 완료되면 결과를 세션에 출력한다.

## 출력 형식
**[카테고리명]**
1. 뉴스 제목
   - 핵심 내용 요약 (3줄)
   - 원문 링크: URL&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;26&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cron Job은 별도로 등록해줘야 해요:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대시보드에서 Task 등록&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4464&quot; data-origin-height=&quot;2332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciqxqo/dJMcajg4WzK/c8Vu2eTnbqW9TZS0Pz1YR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciqxqo/dJMcajg4WzK/c8Vu2eTnbqW9TZS0Pz1YR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciqxqo/dJMcajg4WzK/c8Vu2eTnbqW9TZS0Pz1YR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fciqxqo%2FdJMcajg4WzK%2Fc8Vu2eTnbqW9TZS0Pz1YR0%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;4464&quot; height=&quot;2332&quot; data-origin-width=&quot;4464&quot; data-origin-height=&quot;2332&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1564&quot; data-origin-height=&quot;1900&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Xby1i/dJMcadnDTDG/cEGMArSRQCkq97II7LaCrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Xby1i/dJMcadnDTDG/cEGMArSRQCkq97II7LaCrK/img.png&quot; data-alt=&quot;대시보드에서 Cron Job 등록하기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Xby1i/dJMcadnDTDG/cEGMArSRQCkq97II7LaCrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXby1i%2FdJMcadnDTDG%2FcEGMArSRQCkq97II7LaCrK%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;445&quot; height=&quot;541&quot; data-origin-width=&quot;1564&quot; data-origin-height=&quot;1900&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;대시보드에서 Cron Job 등록하기&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;또는 CLI 이용하기&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1773139328411&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;openclaw cron add \
  --name &quot;daily-news&quot; \
  --cron &quot;0 6 * * *&quot; \
  --tz &quot;Asia/Seoul&quot; \
  --agent news-bot \
  --session isolated \
  --message &quot;정기 작업을 수행해줘&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-path-to-node=&quot;26&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;1043&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6KR3K/dJMcafsfMYG/jnP719OXE6tkG9fyJK9x00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6KR3K/dJMcafsfMYG/jnP719OXE6tkG9fyJK9x00/img.png&quot; data-alt=&quot;CLI로 Cron Job 등록하기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6KR3K/dJMcafsfMYG/jnP719OXE6tkG9fyJK9x00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6KR3K%2FdJMcafsfMYG%2FjnP719OXE6tkG9fyJK9x00%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;668&quot; height=&quot;651&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;1043&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CLI로 Cron Job 등록하기&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-path-to-node=&quot;26&quot;&gt;Task 수행 결과&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2380&quot; data-origin-height=&quot;2038&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGhkJP/dJMcagEJn6Z/4PmsdkiNpJZbk70wwn98r1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGhkJP/dJMcagEJn6Z/4PmsdkiNpJZbk70wwn98r1/img.png&quot; data-alt=&quot;뉴스 수집 Cron Job 수행결과 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGhkJP/dJMcagEJn6Z/4PmsdkiNpJZbk70wwn98r1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGhkJP%2FdJMcagEJn6Z%2F4PmsdkiNpJZbk70wwn98r1%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;2380&quot; height=&quot;2038&quot; data-origin-width=&quot;2380&quot; data-origin-height=&quot;2038&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;뉴스 수집 Cron Job 수행결과 예시&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-path-to-node=&quot;26&quot;&gt;사용량 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4454&quot; data-origin-height=&quot;2294&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8VoT0/dJMcabpTfRU/p06fZrAAe7aYx0XAhsDTr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8VoT0/dJMcabpTfRU/p06fZrAAe7aYx0XAhsDTr1/img.png&quot; data-alt=&quot;토큰 사용량, API 비용, 세션 활동 등 에이전트의 운용 현황을 한눈에 파악할 수 있는 OpenClaw 웹 대시보드(Usage) 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8VoT0/dJMcabpTfRU/p06fZrAAe7aYx0XAhsDTr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8VoT0%2FdJMcabpTfRU%2Fp06fZrAAe7aYx0XAhsDTr1%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;4454&quot; height=&quot;2294&quot; data-origin-width=&quot;4454&quot; data-origin-height=&quot;2294&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;토큰 사용량, API 비용, 세션 활동 등 에이전트의 운용 현황을 한눈에 파악할 수 있는 OpenClaw 웹 대시보드(Usage) 화면&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-path-to-node=&quot;26&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;26&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,0&quot;&gt;Step 3. 메신저 연동 및 모니터링 (선택)&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;26&quot; data-ke-size=&quot;size16&quot;&gt;이번 글에서는 다루지 않았지만, 추후 대시보드에서 텔레그램이나 WhatsApp 같은 메신저 채널을 추가로 연동해 두면 활용도가 더욱 높아집니다. 연동이 완료되면 출근길 지하철에서 메신저 앱을 열고 @news-bot에게 &quot;오늘 뉴스 요약본 잘 보냈어?&quot;라고 상태를 체크할 수 있습니다. OpenClaw는 외부 메신저와 로컬 터미널의 컨텍스트를 완벽히 공유하므로, 외부에서도 폰을 통해 곧바로 추가 리서치나 파이프라인 실행을 지시하는 것도 가능해집니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;26&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-path-to-node=&quot;28&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;마치며&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;29&quot; data-ke-size=&quot;size16&quot;&gt;반복되는 파이프라인을 자동화하는 것은 단순한 시간 절약을 넘어, 개발자가 더 중요한 아키텍처 고민에 집중할 수 있게 해줍니다. 처음 Docker로 컨테이너를 올리고 권한을 연동하는 과정이 조금 번거로울 수는 있지만, 한 번 세팅해 두면 나만의 훌륭한 백그라운드 워커 1명을 채용한 것과 같은 든든함을 느낄 수 있습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;30&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;30&quot; data-ke-size=&quot;size16&quot;&gt;매일 아침 브라우저 탭을 여러 개 띄워가며 포털 뉴스를 훑는 대신, 나만의 자율형 AI 비서가 정리해 준 깔끔한 이메일 브리핑으로 하루를 시작해 보는건 어떨까요~? :)&lt;/p&gt;
&lt;/div&gt;</description>
      <category>AI Engineering/LLM &amp;amp; RAG Implementation</category>
      <category>AI에이전트</category>
      <category>ClaudeCowork</category>
      <category>openclaw</category>
      <category>뉴스자동화</category>
      <category>로컬ai</category>
      <category>인프라자동화</category>
      <category>파이프라인구축</category>
      <category>헤드리스AI</category>
      <author>ServerEngineer</author>
      <guid isPermaLink="true">https://server-engineer.tistory.com/1089</guid>
      <comments>https://server-engineer.tistory.com/1089#entry1089comment</comments>
      <pubDate>Tue, 10 Mar 2026 07:11:01 +0900</pubDate>
    </item>
    <item>
      <title>매일 아침 AI 뉴스 리포트 자동 생성하기: Claude Cowork</title>
      <link>https://server-engineer.tistory.com/1088</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;매일 쏟아지는 글로벌 AI 트렌드와 기술 동향을 파악하는 것은 이제 선택이 아닌 필수입니다. 하지만 바쁜 아침마다 직접 뉴스를 검색하고, 요약하고, 팀원들에게 공유할 내용을 정리하는 과정은 꽤나 번거로운 반복 작업이죠. 백엔드 아키텍처나 파이프라인을 설계하다 보면 이런 단순 반복 작업은 어떻게든 자동화해버리고 싶은 욕구가 생기기 마련입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: start;&quot;&gt;그래서 오늘은 복잡한 설명보다는, &lt;/span&gt;&lt;b&gt;Claude Cowork를 활용해 매일 아침 AI 뉴스를 알아서 수집해 주는 '자동화 스케줄러'를 직접 만들어 본 과정&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: start;&quot;&gt;을 가볍게 공유해 보려고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 한눈에 보는 AI 리서치 도구 비교&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 도구 중 내 목적에 맞는 것을 고르기 위해, 주요 서비스들의 특징을 간단히 정리해 보았습니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;서비스&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;자동 스케줄링&amp;nbsp;&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;웹 검색&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;한 줄 평&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Perplexity&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;직접 실행&lt;/td&gt;
&lt;td&gt;네이티브 지원&lt;/td&gt;
&lt;td&gt;강력한 AI 검색 엔진&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Claude Cowork&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;i&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;스케줄 태스크&lt;/span&gt;&lt;/i&gt;&lt;/td&gt;
&lt;td&gt;웹 서치 지원&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;i&gt;완성형 자동화 리포트&lt;/i&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;GPT Deep Research&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;수동 실행&lt;/td&gt;
&lt;td&gt;지원&lt;/td&gt;
&lt;td&gt;깊이 있는 단발성 리서치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Gemini&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Workspace 한정&lt;/td&gt;
&lt;td&gt;지원&lt;/td&gt;
&lt;td&gt;구글 생태계 내 제한적 활용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Grok&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;수동 실행&lt;/td&gt;
&lt;td&gt;X(Twitter)&lt;/td&gt;
&lt;td&gt;실시간 SNS 트렌드 특화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;n8n + Claude API&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;i&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;파이프라인&lt;/span&gt;&lt;/i&gt;&lt;/td&gt;
&lt;td&gt;Perplexity 연동&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;i&gt;가장 완성도 높음&lt;/i&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실무 추천 가이드&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빠르게 시작하고 싶고 코드 한 줄 없이 자동화하고 싶다면 &lt;b&gt;Claude Cowork&lt;/b&gt;가 가장 무난한 선택입니다. 슬랙이나 이메일 연동까지 고려한다면 &lt;b&gt;n8n + 상용 LLM API&lt;/b&gt; 조합이 확장성 면에서 압도적입니다. X(트위터) 실시간 트렌드까지 리포트에 포함하고 싶다면 &lt;b&gt;Grok API&lt;/b&gt;를 보조로 붙여주면 됩니다.&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. Claude Cowork란?&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Cowork는 Claude Code의 에이전트 아키텍처를 비개발자도 쉽게 쓸 수 있도록 데스크탑 앱에 구현한 기능입니다. 일반 채팅과 달리 Claude가 직접 파일을 읽고, 편집하고, 생성할 수 있어서 단순히 방법을 알려주는 게 아니라 직접 작업을 완료해줍니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;* Claude App Download: &lt;a href=&quot;https://claude.com/download&quot;&gt;https://claude.com/download&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;946&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A7uDq/dJMcadHVdEy/Oz6p2Jrjxw6288ide80mz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A7uDq/dJMcadHVdEy/Oz6p2Jrjxw6288ide80mz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A7uDq/dJMcadHVdEy/Oz6p2Jrjxw6288ide80mz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA7uDq%2FdJMcadHVdEy%2FOz6p2Jrjxw6288ide80mz0%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;569&quot; height=&quot;421&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;946&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 필수 조건&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Claude Desktop 앱(macOS 또는 Windows)이 필요하며,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Pro, Max, Team, Enterprise 유료 플랜에서 사용 가능&lt;/span&gt;&lt;/i&gt;합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. Cowork 모드 진입&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Claude 앱 상단에 Chat, Cowork, Code 탭이 있습니다. &quot;Cowork&quot;를 클릭하면 Cowork 워크스페이스로 전환됩니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 폴더 지정&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;전용 폴더를 별도로 만들어서 그 폴더만 Claude에게 접근 권한을 주는 것을 권장&lt;/span&gt;합니다. 전체 Documents 폴더나 드라이브 전체를 지정하지 마세요. 프로젝트별 하위 폴더를 만들어 활용할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 작업 지시&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;작업을 설명하면 Claude가 계획을 세우고, 복잡한 작업을 세부 태스크로 나눠서 처리하며, 진행 상황을 확인하거나 중간에 방향을 조정할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 주요 활용 사례&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;파일 정리&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;mdash; 다운로드 폴더 분류 및 이름 정리&lt;/li&gt;
&lt;li&gt;&lt;b&gt;문서 생성&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;mdash; 흩어진 메모를 보고서/초안으로 자동 작성&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 분석&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;mdash; 영수증/스크린샷에서 데이터 추출해 스프레드시트로 정리&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Excel &amp;harr; PowerPoint 연동&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;mdash; Excel 데이터를 분석해 차트를 PowerPoint로 직접 이동하는 등 앱 간 컨텍스트를 전달할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✅ 주의사항&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Cowork는 일반 채팅보다 사용량을 더 많이 소비합니다. 복잡한 멀티스텝 작업은 compute를 많이 쓰기 때문에, 간단한 작업은 일반 Chat을 쓰고 Cowork는 파일 접근이나 장시간 실행이 필요한 복잡한 작업에 사용하는 게 좋습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;파일 삭제 전에는 반드시 명시적인 권한 확인이 있으며, 민감한 정보가 담긴 파일이 있는 폴더는 접근 권한을 주지 않는 것을 권장합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-path-to-node=&quot;15&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. 왜 굳이 'Claude Cowork'를 써야 할까?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i data-index-in-node=&quot;21&quot; data-path-to-node=&quot;16&quot;&gt;&quot;그냥 일반 Claude 창 열어서 검색해달라고 하면 되는 거 아니야?&quot;&lt;/i&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;솔직히 단순히 한 번 동향을 파악할 목적이라면 일반 Claude로도 충분합니다. 하지만 업무 자동화 관점에서 &lt;b data-index-in-node=&quot;61&quot; data-path-to-node=&quot;17&quot;&gt;Cowork의 진가는 수집한 내용을 '자동으로', '로컬 파일에 누적'할 때 빛을 발합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;매일 아침 브라우저를 열고 질문을 복붙할 필요 없이,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b data-path-to-node=&quot;19&quot; data-index-in-node=&quot;33&quot;&gt;알아서 데이터를 모으고 파일로 쌓아주는 파이프라인&lt;/b&gt;을 원한다면 Cowork가 답이될 수 있습니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 95px;&quot; border=&quot;1&quot; data-path-to-node=&quot;18&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px; width: 41.5116%;&quot;&gt;&lt;b&gt;기존 Claude 채팅&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px; width: 58.3721%;&quot;&gt;&lt;b&gt;Claude Cowork&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px; width: 41.5116%;&quot;&gt;질문하면 텍스트로 답변&lt;/td&gt;
&lt;td style=&quot;height: 19px; width: 58.3721%;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;목표 설명하면 스스로 계획/실행&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px; width: 41.5116%;&quot;&gt;파일 직접 조작 불가&lt;/td&gt;
&lt;td style=&quot;height: 19px; width: 58.3721%;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot; data-path-to-node=&quot;18,2,2,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,2,2,0&quot;&gt;로컬 폴더 파일 직접 읽기/수정&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px; width: 41.5116%;&quot;&gt;&lt;span data-path-to-node=&quot;18,4,1,0&quot;&gt;한 번에 한 작업만&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px; width: 58.3721%;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot; data-path-to-node=&quot;18,4,2,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,4,2,0&quot;&gt;병렬 작업 큐 실행&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;  지시하고 물러나면 claude cowork가 완성해서 돌아온다&lt;/i&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-path-to-node=&quot;21&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. 실전: 매일 아침 글로벌 AI 트렌드 리포트 받기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;22&quot; data-ke-size=&quot;size16&quot;&gt;실제로 Cowork를 활용해 &lt;b data-index-in-node=&quot;16&quot; data-path-to-node=&quot;22&quot;&gt;&quot;매일 오전 6시, AI 뉴스를 수집해 내 PC에 마크다운으로 저장하고 Gmail 임시보관함에 넣어두는&quot;&lt;/b&gt; 스케줄링 작업을 구축해 보겠습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;22&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;23&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Step 1. 프롬프트 작성 및 실행&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;먼저 Cowork 채팅창에 상세한 작업 지시서(프롬프트)를 입력합니다. 뉴스 카테고리, 마크다운 저장 형식, Gmail 드래프트 생성 조건까지 명확하게 구조화하여 지시합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1736&quot; data-origin-height=&quot;2112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4ibLA/dJMcadnCLAO/x4ch9Ve2nwYDEFKU2gSAf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4ibLA/dJMcadnCLAO/x4ch9Ve2nwYDEFKU2gSAf1/img.png&quot; data-alt=&quot;자동화를 위한 세부 스케줄링 프롬프트 입력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4ibLA/dJMcadnCLAO/x4ch9Ve2nwYDEFKU2gSAf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4ibLA%2FdJMcadnCLAO%2Fx4ch9Ve2nwYDEFKU2gSAf1%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;620&quot; height=&quot;754&quot; data-origin-width=&quot;1736&quot; data-origin-height=&quot;2112&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;자동화를 위한 세부 스케줄링 프롬프트 입력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;스케줄링 프롬프트 예시:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;## 작업 개요
매일 오전 6시, 지난 7일간의 주요 AI 뉴스를 웹 검색으로 수집하고
마크다운 파일로 저장한 뒤, 내 Gmail 임시보관함에 드래프트를 생성한다.

## 실행 순서

### 1단계 &amp;mdash; 뉴스 수집 (웹 검색)
다음 카테고리별로 최근 7일 이내 주요 뉴스를 각 3~5건 검색한다:
- LLM/모델 업데이트 (신규 모델 출시, 벤치마크, 성능 개선)
- AI 스타트업 및 빅테크 동향 (투자, 인수, 전략 발표)
- 국내 AI 산업 동향 (한국 기업, 정책, 규제)
- AI 논문 및 연구 (주목할 만한 기술 발전)

각 뉴스 항목은 다음 정보를 포함한다:
- 제목 (한국어 번역 포함)
- 출처 및 날짜
- 핵심 내용 3줄 요약 (한국어)
- 원문 링크

### 2단계 &amp;mdash; 마크다운 파일 저장
아래 형식으로 파일을 생성하고 지정 폴더에 저장한다.

파일명: ai-news-YYYY-MM-DD.md
저장 경로: ~/Documents/AI-News/

파일 구조:
---
# AI 주간 뉴스 브리핑 &amp;mdash; YYYY년 MM월 DD일

##   이번 주 핵심 요약
(전체 뉴스에서 가장 중요한 3가지를 2~3문장으로 요약)

##   LLM / 모델 업데이트
...

##   스타트업 &amp;amp; 빅테크 동향
...

##   국내 AI 동향
...

##   주목할 논문 &amp;amp; 연구
...

---
*생성일시: YYYY-MM-DD 06:00 | 자동 생성by Claude Cowork*
---

### 3단계 &amp;mdash; Gmail 드래프트 생성
Gmail 커넥터를 사용해 다음 형식으로 임시보관함에 드래프트를 생성한다.

- 수신자: @gmail.com
- 제목: [AI 뉴스] YYYY년 MM월 DD일 주간 브리핑
- 본문: 2단계에서 작성한 마크다운 내용을 그대로 붙여넣기
  (이메일 클라이언트에서 가독성을 위해 섹션 간 빈 줄 유지)

## 완료 조건
- [ ] 마크다운 파일이 ~/Documents/AI-News/ 에 저장됨
- [ ] Gmail 임시보관함에 드래프트 1건 생성됨
- [ ] 뉴스 항목이 카테고리별 최소 3건 이상 포함됨

## 주의사항
- 중복 뉴스(같은 사건을 다룬 여러 기사)는 1건으로 통합
- 7일 이전의 오래된 기사는 제외
- 파일 저장 전 내용 미리보기 없이 바로 저장 진행&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Step 2. 권한 허용 및 스케줄링 등록&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령을 내리면 Cowork가 내 로컬 폴더와 Gmail에 접근하기 위한 권한을 요청합니다. 권한을 승인하면 매일 지정된 시간에 작동하는 자동화 파이프라인 구축이 완료됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1778&quot; data-origin-height=&quot;1249&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIJQnL/dJMcaadpVcd/wpnNOT59kGT84LkqzQwKmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIJQnL/dJMcaadpVcd/wpnNOT59kGT84LkqzQwKmk/img.png&quot; data-alt=&quot;작성된 리포트를 이메일로 전송하기 위한 Gmail 연동&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIJQnL/dJMcaadpVcd/wpnNOT59kGT84LkqzQwKmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIJQnL%2FdJMcaadpVcd%2FwpnNOT59kGT84LkqzQwKmk%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;728&quot; height=&quot;511&quot; data-origin-width=&quot;1778&quot; data-origin-height=&quot;1249&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;작성된 리포트를 이메일로 전송하기 위한 Gmail 연동&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1808&quot; data-origin-height=&quot;1250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bz5FDn/dJMcafZ3QAH/4KDdqj5eDGxR7CzkvZP210/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bz5FDn/dJMcafZ3QAH/4KDdqj5eDGxR7CzkvZP210/img.png&quot; data-alt=&quot;Gmail 커넥터 연결해줘&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bz5FDn/dJMcafZ3QAH/4KDdqj5eDGxR7CzkvZP210/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz5FDn%2FdJMcafZ3QAH%2F4KDdqj5eDGxR7CzkvZP210%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;649&quot; height=&quot;449&quot; data-origin-width=&quot;1808&quot; data-origin-height=&quot;1250&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Gmail 커넥터 연결해줘&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;705&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvzlaJ/dJMcaiib9hV/mXUdzCiDB1LmwO29SuG7UK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvzlaJ/dJMcaiib9hV/mXUdzCiDB1LmwO29SuG7UK/img.png&quot; data-alt=&quot;연결&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvzlaJ/dJMcaiib9hV/mXUdzCiDB1LmwO29SuG7UK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvzlaJ%2FdJMcaiib9hV%2FmXUdzCiDB1LmwO29SuG7UK%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;313&quot; height=&quot;409&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;705&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;연결&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nYX03/dJMcajnNZE7/xBvkaDkFFlxn72kduSNRbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nYX03/dJMcajnNZE7/xBvkaDkFFlxn72kduSNRbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nYX03/dJMcajnNZE7/xBvkaDkFFlxn72kduSNRbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnYX03%2FdJMcajnNZE7%2FxBvkaDkFFlxn72kduSNRbK%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;327&quot; height=&quot;602&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;1620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;마치며&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백엔드 엔지니어로 일하다 보면, 반복되는 수작업을 볼 때마다 자연스럽게 &quot;이거 자동화할 수 없을까?&quot;라는 생각이 먼저 듭니다. AI 뉴스 수집도 마찬가지였습니다. 매일 아침 브라우저 탭을 여러 개 열고, 검색하고, 요약해서 팀 채널에 공유하는 루틴 &amp;mdash; 딱히 어렵지는 않지만, 쌓이면 꽤 피곤한 일이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Cowork는 그 루틴을 조용히 대신해줍니다. 복잡한 API 연동이나 서버 구축 없이도, 프롬프트 하나로 수집 &amp;rarr; 정리 &amp;rarr; 저장 &amp;rarr; 초안 발송까지 이어지는 파이프라인이 완성된다는 점이 인상적이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 n8n 같은 워크플로우 툴과 비교하면 확장성 면에서는 아직 한계가 있습니다. Slack 알림, 데이터 DB 적재, 조건 분기 같은 복잡한 처리가 필요하다면 그쪽이 더 적합할 수 있습니다. 하지만 &lt;b&gt;&quot;빠르게 시작하고 싶다&quot;&lt;/b&gt;, &lt;b&gt;&quot;노코드로 로컬 환경에 바로 붙이고 싶다&quot;&lt;/b&gt;는 분들에게는 Cowork가 꽤 좋은 선택지가 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 트렌드는 빠르게 움직입니다. 그 흐름을 놓치지 않기 위한 첫 번째 습관을, 이번 기회에 자동화로 만들어 보시는 건 어떨까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AI Engineering/LLM &amp;amp; RAG Implementation</category>
      <category>ai agent</category>
      <category>ai업무자동화</category>
      <category>Claude Cowork</category>
      <category>ClaudeCowork</category>
      <author>ServerEngineer</author>
      <guid isPermaLink="true">https://server-engineer.tistory.com/1088</guid>
      <comments>https://server-engineer.tistory.com/1088#entry1088comment</comments>
      <pubDate>Mon, 9 Mar 2026 14:27:02 +0900</pubDate>
    </item>
    <item>
      <title>Vector DB와 Graph DB</title>
      <link>https://server-engineer.tistory.com/1086</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;LLM 기반 애플리케이션을 개발하다 보면 한 번쯤 마주치는 질문이 있습니다. &quot;데이터를 어떻게 저장하고, 어떻게 가져올 것인가?&quot; 특히 RAG(Retrieval-Augmented Generation) 시스템을 구축할 때 이 고민은 &lt;b data-index-in-node=&quot;129&quot; data-path-to-node=&quot;6&quot;&gt;Vector DB&lt;/b&gt;와 &lt;b data-index-in-node=&quot;140&quot; data-path-to-node=&quot;6&quot;&gt;Graph DB&lt;/b&gt;라는 구체적인 선택지로 좁혀집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;저 역시 RAG 시스템을 설계하다가 이 두 기술 앞에서 멈칫했던 적이 있습니다. 둘 다 데이터를 검색하는 도구인 건 알겠는데, 막상 &quot;그래서 뭐가 다르고 언제 뭘 써야 해?&quot;라고 물으면 명확하게 답이 안 나오더라고요.&lt;/p&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;이 글에서는 저와 같은 고민을 하셨을 분들을 위해, 두 기술의 핵심 차이와 실제 AI 아키텍처에서의 활용법을 정리해 보았습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 한눈에 보는 차이점&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;두 데이터베이스는 데이터를 바라보는 관점과 목적 자체가 다릅니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;11&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Vector DB&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Graph DB&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;11,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,0,0&quot;&gt;핵심 저장 단위&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;11,1,1,0&quot;&gt;의미 (숫자 벡터)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;11,1,2,0&quot;&gt;관계 (노드-엣지)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;11,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,2,0,0&quot;&gt;핵심 질문&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;11,2,1,0&quot;&gt;&quot;이것과 비슷한 게 뭐야?&quot;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;11,2,2,0&quot;&gt;&quot;이것과 연결된 게 뭐야?&quot;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;11,3,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,3,0,0&quot;&gt;대표 제품&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;11,3,1,0&quot;&gt;Pinecone, OpenSearch, Chroma&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;11,3,2,0&quot;&gt;Neo4j, Amazon Neptune&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-path-to-node=&quot;12&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. Vector DB: &quot;의미의 유사도&quot;를 찾는 사냥꾼&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;Vector DB는 텍스트나 이미지를 고차원 숫자 배열인 '임베딩(Embedding)'으로 변환하여 저장합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;14&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,0,0&quot;&gt;작동 원리:&lt;/b&gt; &quot;강아지&quot;와 &quot;puppy&quot;를 벡터 공간상에서 아주 가까운 좌표에 배치합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,1,0&quot;&gt;강점:&lt;/b&gt; 방대한 비정형 데이터 속에서 사용자의 질문과 의미적으로 가장 가까운 문서를 순식간에 찾아냅니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,2,0&quot;&gt;용도:&lt;/b&gt; 시맨틱 검색, 문서 Q&amp;amp;A, 기본 RAG 시스템&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;15&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. Graph DB: &quot;데이터의 연결 고리&quot;를 파헤치는 탐정&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;473&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5YdFO/dJMcad2bMLK/CyJ1mkcgp0234wSGD3cPXK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5YdFO/dJMcad2bMLK/CyJ1mkcgp0234wSGD3cPXK/img.jpg&quot; data-alt=&quot;출처: https://wikidocs.net/50716&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5YdFO/dJMcad2bMLK/CyJ1mkcgp0234wSGD3cPXK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5YdFO%2FdJMcad2bMLK%2FCyJ1mkcgp0234wSGD3cPXK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;594&quot; height=&quot;473&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;473&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: https://wikidocs.net/50716&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;Graph DB는 데이터를 '노드(엔티티)'와 '엣지(관계)'라는 구조로 저장합니다. 데이터가 서로 어떻게 연결되어 있는지 그 관계성을 보존하는 데 최적화되어 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;17&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,0,0&quot;&gt;작동 원리:&lt;/b&gt; (철수) -[친구]&amp;rarr; (영희) -[근무]&amp;rarr; (삼성)과 같이 개체 간의 복잡한 연결을 구조화합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,1,0&quot;&gt;강점:&lt;/b&gt; 단순히 유사한 문서를 찾는 것을 넘어, 연결된 사실 관계를 따라가며 깊이 있는 추론이 가능합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,2,0&quot;&gt;용도:&lt;/b&gt; 지식 그래프(Knowledge Graph), 복잡한 추천 시스템, 사기 탐지(Fraud Detection)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;18&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. 왜 둘을 함께 쓰는가? (GraphRAG의 등장)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;19&quot; data-ke-size=&quot;size16&quot;&gt;최근 엔터프라이즈 환경에서는 이 두 기술을 결합하는 &lt;b data-index-in-node=&quot;29&quot; data-path-to-node=&quot;19&quot;&gt;GraphRAG&lt;/b&gt; 방식이 주목받고 있습니다. 단순히 의미가 비슷한 문서를 가져오는 것(Vector DB)만으로는, 데이터 간의 복잡한 맥락이나 사실 관계(예: A가 B의 상사이고 B가 C 프로젝트 담당자)를 놓칠 수 있기 때문입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;19&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;20&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;20&quot;&gt;[이상적인 하이브리드 워크플로우]&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;21&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;21,0,0&quot;&gt;Vector DB:&lt;/b&gt; 질문과 의미가 유사한 문서 청크를 빠르게 검색하여 후보군을 뽑습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;21,1,0&quot;&gt;Graph DB:&lt;/b&gt; 뽑힌 후보군들 사이의 사실 관계(Who, Where, Why)를 연결하여 컨텍스트를 풍부하게 만듭니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;21,2,0&quot;&gt;LLM:&lt;/b&gt; 두 정보를 조합하여 단순 검색보다 훨씬 정확하고 깊이 있는 답변을 생성합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-path-to-node=&quot;22&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. 그래서 무엇을 써야 할까?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;23&quot; data-ke-size=&quot;size16&quot;&gt;솔직히 말하면 &quot;정답&quot;은 없고, &lt;b data-index-in-node=&quot;18&quot; data-path-to-node=&quot;23&quot;&gt;내가 풀려는 문제가 뭔지에 따라&lt;/b&gt; 달라집니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;24&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단순히 문서를 검색하거나 FAQ를 처리하는 수준이라면 &lt;b data-index-in-node=&quot;30&quot; data-path-to-node=&quot;24,0,0&quot;&gt;Vector DB&lt;/b&gt;로 충분합니다. 굳이 Graph DB까지 도입할 필요 없어요.&lt;/li&gt;
&lt;li&gt;반면 조직도나 지식 관계처럼 &quot;A는 B와 연결되고, B는 C 소속&quot;이라는 구조적인 데이터를 다뤄야 한다면 &lt;b data-index-in-node=&quot;59&quot; data-path-to-node=&quot;24,1,0&quot;&gt;Graph DB&lt;/b&gt;가 훨씬 적합합니다.&lt;/li&gt;
&lt;li&gt;질문이 복잡하고 사실 관계 기반의 정확한 답변이 중요한 엔터프라이즈 환경이라면, Vector DB와 Graph DB를 함께 쓰는 &lt;b data-index-in-node=&quot;72&quot; data-path-to-node=&quot;24,2,0&quot;&gt;GraphRAG&lt;/b&gt;를 한번 검토해 보세요. 구현 난이도는 올라가지만, 그만한 가치가 있는 케이스들이 분명 존재합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;25&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;마치며&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;26&quot; data-ke-size=&quot;size16&quot;&gt;정리하고 나니까 생각보다 명확하더라고요. &lt;b data-index-in-node=&quot;23&quot; data-path-to-node=&quot;26&quot;&gt;Vector DB는 &quot;의미&quot;를 찾고, Graph DB는 &quot;관계&quot;를 추적합니다.&lt;/b&gt; 내가 풀려는 문제가 유사한 걸 찾는 건지, 연결된 걸 따라가는 건지만 구분하면 선택이 훨씬 쉬워집니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;27&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;27&quot; data-ke-size=&quot;size16&quot;&gt;저처럼 헷갈렸던 분들에게 이 글이 조금이나마 도움이 되었기를 바랍니다 :)&lt;/p&gt;</description>
      <category>AI Engineering/AI Strategy &amp;amp; Insights</category>
      <category>graphDB</category>
      <category>graphrag</category>
      <category>LLM</category>
      <category>Rag</category>
      <category>vectordb</category>
      <author>ServerEngineer</author>
      <guid isPermaLink="true">https://server-engineer.tistory.com/1086</guid>
      <comments>https://server-engineer.tistory.com/1086#entry1086comment</comments>
      <pubDate>Fri, 6 Mar 2026 18:36:21 +0900</pubDate>
    </item>
    <item>
      <title>RAG 성능의 핵심: 방대한 문서, 어떻게 쪼개고 검색해야 할까?</title>
      <link>https://server-engineer.tistory.com/1085</link>
      <description>&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;RAG 시스템을 직접 구축하면서 가장 크게 부딪혔던 난관 중 하나는 바로 '데이터 쪼개기'였습니다. &lt;u&gt;&lt;i&gt;&lt;b&gt;처음에는 &quot;그냥 문서를 500자씩 자르거나 문단 단위로 뭉텅뭉텅 넣으면 되는 거 아냐?&quot;라고 가볍게 생각했습니다.&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;하지만 실제 업무에서 마주하는 복잡하고 방대한 문서를 다뤄보니, 단순히 글자 수나 길이를 기준으로 쪼개는 방식은 핵심 문맥이 엉뚱한 곳에서 잘려나가는 &lt;b&gt;'문맥 파편화(Context Fragmentation)'&lt;/b&gt;라는 문제를 일으키더라구요.&lt;/p&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;디버깅을 하며 깨달은 점은, 데이터가 커질수록 RAG는 &lt;b&gt;'어떻게 쪼갤 것인가(Indexing)'&lt;/b&gt;와 &lt;b&gt;'어떻게 찾아올 것인가(Retrieval)'&lt;/b&gt;를 철저히 분리해서 설계해야 한다는 것이었습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;오늘은 RAG 시스템을 고도화하며 겪은 시행착오를 바탕으로, 4가지 핵심 전략을 간단히 정리해 봅니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 의미 중심의 '시맨틱 청킹(Semantic Chunking)'&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;글자 수로 자르는 대신, 문장의 '&lt;b&gt;의미적 경계&lt;/b&gt;'를 활용하세요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;원리:&lt;/b&gt; 문장 간의 임베딩 거리를 계산하여, 의미가 급격히 바뀌는 지점(예: 서론에서 본론으로 넘어갈 때)에서 청크를 나눕니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;효과:&lt;/b&gt; 청크 하나하나가 독립적인 의미를 갖게 되어, 검색 시 모호함이 사라집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2040&quot; data-origin-height=&quot;1022&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvyvkv/dJMcacvwK4A/lLT7R2F7obvianksCBDaZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvyvkv/dJMcacvwK4A/lLT7R2F7obvianksCBDaZ0/img.png&quot; data-alt=&quot;[실무 적용 예시] Amazon Bedrock Knowledge Base 환경에서 PDF 내 복잡한 표 데이터 처리를 위해, 파서(Parser)로 Claude Sonnet 4.5를 결합하고 '의미 체계 청킹(Semantic Chunking)' 전략을 적용한 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvyvkv/dJMcacvwK4A/lLT7R2F7obvianksCBDaZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcvyvkv%2FdJMcacvwK4A%2FlLT7R2F7obvianksCBDaZ0%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;2040&quot; height=&quot;1022&quot; data-origin-width=&quot;2040&quot; data-origin-height=&quot;1022&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[실무 적용 예시] Amazon Bedrock Knowledge Base 환경에서 PDF 내 복잡한 표 데이터 처리를 위해, 파서(Parser)로 Claude Sonnet 4.5를 결합하고 '의미 체계 청킹(Semantic Chunking)' 전략을 적용한 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 정밀도와 맥락의 균형: 'Parent-Child Retrieval' (Small-to-Big)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;검색은 날카롭게, 답변은 풍부하게&lt;/span&gt; 하고 싶다면 이 전략이 정답입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,0,0&quot;&gt;Child (검색용):&lt;/b&gt; 원본을 잘게 쪼갠 작은 조각입니다. 임베딩하여 벡터 DB에 저장합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,0&quot;&gt;Parent (맥락용):&lt;/b&gt; 쪼개기 전의 큰 문단이나 섹션입니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,2,0&quot;&gt;흐름:&lt;/b&gt; 질문으로 Child를 검색하고, 실제 LLM에게는 그와 연결된 Parent를 통째로 전달합니다. 검색은 정밀하게, 답변을 위한 맥락은 충분하게 제공할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. 문맥 주입(Contextual Retrieval): 청크에 '족보'를 붙여라&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;큰 문서에서 문단 하나만 떼어내면, 그 문단이 무엇에 대한 내용인지 알기 어렵습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,0,0&quot;&gt;전략:&lt;/b&gt; 청크를 생성할 때 해당 청크의 &lt;b data-index-in-node=&quot;21&quot; data-path-to-node=&quot;13,0,0&quot;&gt;상위 제목, 문서명, 요약 정보&lt;/b&gt;를 앞부분에 강제로 삽입하세요.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,1,0&quot;&gt;효과:&lt;/b&gt; &quot;삼성전자 2026 1분기 보고서 &amp;gt; 반도체 부문 &amp;gt; [본문: 10% 증가]&quot;와 같이 &lt;span style=&quot;color: #ee2323;&quot;&gt;맥락이 문장 자체에 녹아들어 검색 정확도가 비약적으로 상승&lt;/span&gt;합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;14&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. 검색의 마침표: '리랭킹(Reranking)'&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;벡터 검색으로 뽑아온 문서가 항상 정답은 아닙니다. 검색 직후, 리랭커(Reranker) 모델을 통과시키세요.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;원리 (LLM이 직접 채점할까?):&lt;/b&gt; 결론부터 말씀드리면, 답변을 만들어내는 무거운 LLM(GPT, Claude 등)이 직접 문서를 채점하는 것이 아닙니다. 대신 &lt;b&gt;'문서와 질문의 연관성 평가'에만 특화된 별도의 가벼운 AI 알고리즘(주로 Cross-Encoder 모델)&lt;/b&gt;을 사용합니다. &lt;br /&gt;1차 벡터 검색이 질문과 문서를 각각 따로 임베딩해 '좌표상의 거리'만 빠르게 계산한다면, 리랭커 모델은 질문과 문서를 한 세트로 묶어 동시에 깊이 읽어냅니다. 무거운 LLM에게 검색된 수십 개의 문서를 다 읽게 하면 비용과 속도 문제가 발생하므로, 문맥을 꼼꼼히 따져 진짜 정답만 골라내는 '전문 평가관' 알고리즘을 중간에 두는 원리입니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;효과:&lt;/b&gt; 벡터 검색의 단순한 '의미적 유사도'에만 의존하지 않고, 진짜 정답인 데이터만 1~2개로 압축해 최종 LLM에게 전달함으로써 할루시네이션을 막고 API 토큰 비용도 크게 절약할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;1131&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chYf0E/dJMcahQ6EdU/JbFUi8vTRf639EIkaMcKu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chYf0E/dJMcahQ6EdU/JbFUi8vTRf639EIkaMcKu1/img.png&quot; data-alt=&quot;이미지 출처: https://www.pondhouse-data.com/blog/advanced-rag-colbert-reranker&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chYf0E/dJMcahQ6EdU/JbFUi8vTRf639EIkaMcKu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchYf0E%2FdJMcahQ6EdU%2FJbFUi8vTRf639EIkaMcKu1%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;648&quot; height=&quot;458&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;1131&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이미지 출처: https://www.pondhouse-data.com/blog/advanced-rag-colbert-reranker&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;마치며: 완성도 높은 RAG를 위한 파이프라인&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;정리하자면, 대용량 문서를 다루는 고도화된 RAG 파이프라인의 표준은 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,0&quot;&gt;Indexing:&lt;/b&gt; 글자 수가 아닌 의미 단위로 문서를 쪼개고(Semantic Chunking), 문맥을 담은 메타데이터를 덧붙여(Contextual Retrieval) 작은 단위(Child)로 임베딩한다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,0&quot;&gt;Retrieval:&lt;/b&gt; 하이브리드 서치로 후보를 뽑고, Reranker를 거쳐 상위 정답만 필터링한다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,2,0&quot;&gt;Generation:&lt;/b&gt; 필터링된 원본 데이터(Parent)를 LLM에 전달하여 정확한 답변을 생성한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;단순히 문단을 나누는 것을 넘어, 데이터의 맥락을 살리고 검색 후 검증(Reranking)하는 과정을 추가하는 것만으로도 RAG 서비스의 성능은 이전과 확연히 달라질 것 같습니다 :)&lt;/p&gt;</description>
      <category>AI Engineering/AI Strategy &amp;amp; Insights</category>
      <category>ai엔지니어링</category>
      <category>LangChain</category>
      <category>LLM</category>
      <category>ParentChildRetrieval</category>
      <category>Rag</category>
      <category>reranker</category>
      <category>SemanticChunking</category>
      <category>데이터파이프라인</category>
      <category>청킹전략</category>
      <author>ServerEngineer</author>
      <guid isPermaLink="true">https://server-engineer.tistory.com/1085</guid>
      <comments>https://server-engineer.tistory.com/1085#entry1085comment</comments>
      <pubDate>Fri, 6 Mar 2026 07:33:38 +0900</pubDate>
    </item>
  </channel>
</rss>