CPN 한국어 자습서 · Claude Certified Developer — Foundations Prep
5-2 · 재사용을 위한 포장
Packaging a working build so the next engagement starts from an asset
앞 모듈에서 실제로 작동하는 빌드를 하나 완성했습니다. 에이전트 루프, 설정을 마친 MCP 서버, 프롬프트가 제대로 동작함을 증명하는 평가까지 갖춘 빌드였죠. 그런데 팀에서 가장 많은 시간과 비용이 드는 일은, 다음 고객을 위해 같은 것을 처음부터 다시 만드는 일인 경우가 많습니다. 이 레슨에서는 그렇게 다시 만드는 대신, 다음 프로젝트가 자산에서 시작하도록 포장하는 방법을 살펴봅니다.
이 장에서 배우는 것What you'll learn
약 24분액셀러레이터란 무엇이고, 왜 빌드가 신선할 때 포장하는지
재사용 자산 세 유형 — 에이전트 템플릿 · MCP 서버 패키지 · 평가 세트
코드만이 아니라 가정도 문서로 남겨야 하는 이유
감사 로그를 패키지에 함께 담는 이유
포장 체크리스트 — 파라미터화 · 문서화 · 감사 번들
빨리 냈지만 재사용하지 못한 템플릿 — 실패의 형태
액셀러레이터는 한 번 만든 솔루션을 다음에도 그대로 쓸 수 있게 포장해 둔 것입니다. 덕분에 다음 프로젝트는 빈 저장소에서 출발하는 대신, 이미 작동하는 토대 위에서 곧장 이어 갑니다.
포장은 두 가지를 나누는 데서 시작합니다. 특정 고객에게만 해당하는 코드와, 어디서든 다시 쓸 수 있는 핵심을 갈라내고, 나머지는 설정값으로 빼냅니다. 작동하는 빌드를 하나 놓고, 고객마다 달라지는 부분을 찾아 파라미터로 노출하되 기본값을 함께 문서로 적어 둡니다. 그러면 다음 팀은 자산을 통째로 다시 쓰는 대신, 설정만 바꿔서 씁니다.
이 작업은 빌드가 아직 신선할 때 해 두는 편이 좋습니다. 몇 달이 지나면 어떤 값을 왜 고정해 두었는지 알던 사람이 이미 자리를 옮겼을 수 있고, 그때 의도를 되짚어 복원하는 비용이 훨씬 큽니다.
포장은 완성한 요리를 레시피로 정리해 두는 일과 비슷합니다. 다음 사람이 같은 요리를 처음부터 다시 만드는 대신, 재료와 분량만 자기 상황에 맞게 바꾸면 되도록 해 두는 것이죠.
재사용할 수 있는 작업은 대부분 세 가지 유형 중 하나에 들어갑니다. 이 모듈 전체에서 쓰는 분류인데, 유형마다 담는 내용이 다르고 포장하는 방법도 다릅니다.
유형을 잘못 고르면 겉보기에는 재사용할 수 있어 보여도, 막상 적용하기는 어려운 자산이 되기 쉽습니다.
THREE ASSET TYPES — 유형별로 담는 것과 포장법
| 자산 유형 | 무엇을 담나 | 제대로 포장하려면 |
|---|---|---|
| 에이전트 템플릿 Agent Template | 시스템 프롬프트, 도구 스키마, 루프 구조. | 도메인에만 해당하는 값을 기본값과 함께 설정으로 빼냅니다. 새 팀이 루프를 고치는 대신 값만 정하도록요. |
| MCP 서버 패키지 MCP Server Package | 서버가 노출하는 도구들 — 각 입력값과, 설치하는 팀이 정하는 범위(scope). | 도구 입력마다 설명을 달고, 범위는 설치하는 팀이 정하게 둡니다. 그러면 코드를 고치지 않고도 새 환경에 설치됩니다. |
| 평가 세트 Eval Suite | 자산이 제대로 동작함을 증명하는 채점 테스트 묶음과 판정 기준(루브릭). | 데이터와 루브릭을 함께 담아, 새 팀이 자기 환경에서 돌려 자산이 거기서도 동작하는지 확인하게 합니다. 같은 평가 세트는 배포 때 관문 역할도 합니다 — 새 모델 버전을 프로덕션에 올릴 때, 고정해 둔 기준 점수(베이스라인)와 먼저 견줘 본 뒤 반영합니다. |
가장 흔한 실수는 에이전트를 템플릿이 아니라 흩어진 스크립트 묶음으로 내보내는 것입니다. 스크립트가 작동하니 재사용할 수 있어 보이지만, 고객마다 다른 값이 파일마다 흩어져 있어서 다음 팀은 자산 하나를 설정해 쓰는 대신 복사한 뒤 조금씩 갈라 나가게 됩니다.
코드는 자산이 무엇을 하는지를 보여 줍니다. 하지만 코드만 읽어서는 다음 사람이 확실히 알아내기 어려운 것들이 있습니다.
자산이 자기 환경에 대해 전제하는 가정, 기대하는 입력, 이미 처리해 둔 실패 상황, 그리고 자산이 여전히 제대로 동작하는지 판단하는 평가 — 이런 것은 소스만 봐서는 짚어 내기 어렵습니다. 문서가 없으면 다음 팀은 자산을 속을 알 수 없는 상자처럼 다루게 되고, 결국 다시 만드는 쪽을 택합니다.
문서가 없는 자산은 설명서 없는 기계와 비슷합니다. 버튼이 몇 개 달렸는지는 보여도 왜 그렇게 만들었는지는 알 수 없어서, 다음 사람이 결국 새로 만들게 되죠.
여기에 하나가 더 붙습니다. 규제를 받는 고객이라면 검토자가 이런 것을 묻습니다. 이 자산이 어떤 데이터를 건드리는지, 어떤 자격으로 동작하는지, 어떤 기록을 남기는지. 이 세 가지가 준비돼 있지 않으면 자산은 데모까지는 통과해도 첫 보안 검토에서 멈춰 섭니다. 그래서 감사 로그도 패키지의 일부로 함께 담아 둡니다.
포장하는 동안 이 표를 빌드 옆에 두고 봅니다. 각 칸은 자산 하나에 대해 한 번씩 내리는 결정입니다.
PACKAGING CHECKLIST — 유형별로 한 번씩 정하는 결정
| 자산 유형 | 무엇을 파라미터로 뺄까 | 무엇을 문서로 남길까 |
|---|---|---|
| 에이전트 템플릿 | 고객마다 달라지는 모든 값 — 프롬프트, 경로, 범위(scope), 참조로 넘기는 자격 증명, 임계값. | 환경 가정, 기대 입력, 처리해 둔 실패 상황, 그리고 '동작함'을 정의하는 평가. |
| MCP 서버 | 범위(scope), 참조로 넘기는 자격 증명, 고객별 경로. | 도구별 기대 입력, 범위 경계, 처리해 둔 실패 상황. |
| 평가 세트 | 고객·환경마다 달라지는 임계값과 데이터 경로. | 루브릭의 판정 논리, 점수의 의미, 자산이 고정해 둔 베이스라인. |
감사용으로 담는 항목은 세 유형 모두 같습니다 — 건드린 데이터, 동작한 자격, 그리고 자산이 무엇을 했는지의 기록.
포장을 언제 하고 언제 건너뛰면 좋을지는 상황에 따라 갈립니다.
HANDLES WELL · ADDS COST · USE A DIFFERENT APPROACH
| 잘 맞는 경우 | 빌드가 신선할 때 파라미터로 빼 두면, 한 번의 납품이 다음 프로젝트에서 몇 시간 만에 설정해 쓸 수 있는 자산이 됩니다. |
|---|---|
| 비용·복잡도가 느는 부분 | 일반화할 부분과 고객 특정 부분을 갈라내고 가정을 문서로 남기는 일은, 첫 빌드에 실제로 시간을 더 들이게 합니다. |
| 다른 방법이 나은 경우 | 고객이 다시 쓸 일이 없는 일회성 작업이라면 포장에 드는 시간이 아깝습니다. 그냥 빌드를 내보내고 넘어갑니다. |
하드코딩하면 더 빨리 낼 수 있고, 마침 마감이 있었습니다. 그래서 데모를 작동하게 만든 값들을 코드에 그대로 적어 넣었습니다. 템플릿은 잘 작동했죠. 바로 그래서, 다음 팀이 재사용하려 들기 전까지는 아무도 그 템플릿을 다시 들여다보지 않았습니다.
아래는 재사용 시도가 실패한 뒤 팀이 정리하는 방식 그대로 옮긴 사후 기록입니다. 누군가 이것을 '실수'라고 부르기 전에, 실패가 어떤 모양으로 나타나는지 먼저 볼 수 있게요.
무슨 일이 있었나. 한 팀이 고객 프로젝트를 위해 에이전트 템플릿을 만들어 기한에 맞춰 냈습니다. 마감을 지키려고 고객마다 달라지는 값들을 코드에 곧장 적어 넣었습니다 — 저장소 경로, 모델 이름, 검토 임계값, 그리고 그 고객 도메인에만 해당하는 프롬프트 조각 몇 개였죠. 템플릿은 잘 작동했고, 프로젝트는 마무리됐고, 빌드는 '재사용 가능'이라는 이름표를 달고 공용 저장소로 들어갔습니다.
몇 달 뒤, 두 번째 팀이 비슷한 프로젝트를 맡으며 그 템플릿을 꺼냈습니다. 그런데 설정을 할 수가 없었습니다. 설정할 것이 아예 없었기 때문입니다. 바꿔야 할 값은 전부 루프 안에 적혀 있었고, 파일 전체를 읽지 않고서는 그 값들이 어디 있는지조차 보이지 않았습니다. 어떤 값이 고객 특정 값이고 어떤 값이 함부로 건드리면 안 되는 값인지 알려 주는 문서도 없었습니다. 번들로 담긴 평가도 없어서, 값을 짐작으로 고쳐 본 뒤에도 템플릿이 새 환경에서 여전히 동작하는지 확인할 길이 없었습니다. 결국 처음부터 다시 만들어야 했습니다.
왜 그렇게 됐나. 빌드를 작동하는 순간 끝났다고 본 것이 원인입니다. 재사용할 수 있는 순간이 아니라요. 마감 앞에서 하드코딩은 합리적인 선택이었습니다. 다만 그 뒤로 다시 손보지 않았습니다. 겉으로 작동하는 템플릿만 봐서는 그것이 재사용될 수 없다는 걸 알아채기 어렵습니다. 그래서 비용은 두 번째 팀이 그 템플릿을 다시 만들 때가 되어서야 드러났습니다. 포장이 막아 줬어야 할 재작업 비용에, 템플릿이 막다른 길이었음을 알아채기까지 잃은 시간까지 더해서요.
원문의 점검 과제는 직접 코드를 고쳐 보는 서술형입니다. 아래는 다른 팀이 재사용해야 하는 에이전트 템플릿인데, 결함이 하나 있습니다 — 파라미터가 들어갈 자리에 고객 특정 값이 하드코딩돼 있습니다. 하드코딩된 값이 무엇인지 먼저 짚어 보고, 고친 함수 시그니처와 그 값을 대체할 파라미터화한 줄을 직접 써 보세요.
THE TEMPLATE AS SHIPPED — 결함이 하나 있는 재사용 템플릿
# agent_template.py : "reusable" code-review agent def build_review_agent(): return Agent( model="claude-opus-4-8", system_prompt=SYSTEM_PROMPT, tools=[read_file, run_linter], repo_path="/home/acme/checkout-service", # customer repo )
모델 ID claude-opus-4-8은 빌드 시점에 최신 값을 확인하세요 — platform.claude.com/docs/en/about-claude/models
MODEL ANSWER — 원문이 제시한 모범 답안
def build_review_agent(repo_path): return Agent( model="claude-opus-4-8", system_prompt=SYSTEM_PROMPT, tools=[read_file, run_linter], repo_path=repo_path, # set per engagement )
하드코딩된 repo_path가 결함이었습니다. 재사용할 수 있는 템플릿은 고객 특정 값을 파라미터로 받습니다. 그러면 다음 팀은 코드를 고치는 대신 자산을 설정해서 씁니다. 이것이 그냥 작동하는 템플릿과, 실제로 재사용되는 템플릿의 차이입니다.
이어서 객관식으로 점검합니다. 정답을 먼저 떠올려 본 뒤 골라 보세요. 맞히면 설명이 나옵니다.
Q1위 템플릿의 결함은 무엇이었을까요?
빠진 것은 파라미터입니다. repo_path="/home/acme/checkout-service"는 고객사(acme)에만 해당하는 경로인데, 다른 팀이 그대로 쓰면 남의 저장소를 가리키게 됩니다. 역할을 정하는 SYSTEM_PROMPT와 도구 목록은 이미 갖춰져 있었고, 모범 답안도 이 한 값을 함수 인자로 승격하는 것으로 고칩니다.
Q2사후 기록이 말하는, '그냥 작동하는 템플릿'과 '재사용되는 템플릿'을 가르는 신호는 무엇일까요?
사후 기록이 든 경고 신호가 정확히 이 셋입니다 — 고객 특정 값 자리에 파라미터가 없고, 가정을 설명하는 문서가 없고, 다른 환경에서 동작함을 증명하는 번들 평가가 없습니다. 문제의 템플릿은 잘 작동했지만 이 셋이 모두 빠져 있었고, 그래서 두 번째 팀은 처음부터 다시 만들어야 했습니다.
Q3규제를 받는 고객의 검토자가 액셀러레이터에 대해 확인하는 세 가지로 원문이 든 것은?
이 셋이 준비돼 있지 않으면 자산은 데모까지는 통과해도 첫 보안 검토에서 멈춰 섭니다. 그래서 감사 로그 — 건드린 데이터, 동작한 자격, 자산이 한 일의 기록 — 를 패키지의 일부로 함께 담아 둡니다.
모듈 5의 다음 레슨은 만든 것을 기여로 되돌리는 방법(Contributing Back)을 다룹니다. → 5-3 · 기여로 되돌리기
전 코스는 계속 무료입니다. 등록하면 이 코스의 남은 38개 레슨을 끝까지 읽을 수 있습니다.
이미 등록하셨다면 그때 쓰신 이메일을 넣어 주세요.