---
title: "Claude Code가 강한 진짜 이유, 모델이 아닌 6가지 구조에 있다"
date: 2026-04-07
author: "Spark"
featured_image: "https://i0.wp.com/aisparkup.com/wp-content/uploads/2026/04/https3A2F2Fsubstack-post-media.s3.amazonaws.com2Fpublic2Fimages2F49b97718-57f4-4977-99c8-8ad5c4d32af3_1548x862.jpg?fit=1200%2C675&ssl=1"
categories:
  - name: "AI 기술 분석"
    url: "/posts/category/ai-solutions.md"
tags:
  - name: "AI개발도구"
    url: "/posts/tag/ai%ea%b0%9c%eb%b0%9c%eb%8f%84%ea%b5%ac.md"
  - name: "Claude Code"
    url: "/posts/tag/claude-code.md"
  - name: "Codex"
    url: "/posts/tag/codex.md"
  - name: "LLM"
    url: "/posts/tag/llm.md"
  - name: "Sebastian Raschka"
    url: "/posts/tag/sebastian-raschka.md"
  - name: "에이전트하네스"
    url: "/posts/tag/%ec%97%90%ec%9d%b4%ec%a0%84%ed%8a%b8%ed%95%98%eb%84%a4%ec%8a%a4.md"
  - name: "코딩에이전트"
    url: "/posts/tag/%ec%bd%94%eb%94%a9%ec%97%90%ec%9d%b4%ec%a0%84%ed%8a%b8.md"
---

# Claude Code가 강한 진짜 이유, 모델이 아닌 6가지 구조에 있다

Claude Code를 처음 써본 사람들이 공통적으로 하는 말이 있습니다. “그냥 채팅할 때랑 다르게, 뭔가 알아서 한다.” 같은 Claude 모델인데 왜 이렇게 다르게 느껴질까요?

![](https://i0.wp.com/aisparkup.com/wp-content/uploads/2026/04/https3A2F2Fsubstack-post-media.s3.amazonaws.com2Fpublic2Fimages2F49b97718-57f4-4977-99c8-8ad5c4d32af3_1548x862.jpg?resize=1024%2C576&ssl=1)사진 출처: Sebastian Raschka머신러닝 연구자이자 《Build a Large Language Model (From Scratch)》 저자인 Sebastian Raschka 박사가 코딩 에이전트의 핵심 구조 6가지를 직접 구현하고 분석한 글을 발표했습니다. Claude Code나 Codex가 동일한 LLM을 쓰고도 채팅 UI보다 훨씬 강력하게 느껴지는 이유는, 모델이 아니라 모델을 감싸는 소프트웨어 구조, 즉 **코딩 하네스(coding harness)** 덕분이라는 게 핵심 주장입니다.

**출처:** [Components of A Coding Agent](https://magazine.sebastianraschka.com/p/components-of-a-coding-agent) – Sebastian Raschka

  

## 에이전트는 모델과 다릅니다

먼저 개념을 정리하면 이렇습니다.

- LLM: 다음 토큰을 예측하는 기본 모델
- 추론 모델: 중간 추론 과정을 더 거치도록 학습된 LLM (더 강력하지만 더 비쌈)
- 에이전트: 모델 위에 얹힌 제어 루프. 목표를 받아서 어떤 도구를 쓸지, 어디를 볼지, 언제 멈출지를 결정
- 코딩 하네스: 코딩에 특화된 에이전트 하네스. 레포 컨텍스트, 도구 실행, 반복 피드백을 관리

Raschka 박사가 흥미롭게 제기하는 가설이 있습니다. GLM-5 같은 최신 오픈웨이트 모델을 Claude Code와 동일한 하네스에 넣으면, Codex나 Claude Code와 엇비슷한 성능이 나올 수 있다는 것입니다. 즉, 지금 우리가 “모델이 좋다”고 느끼는 경험의 상당 부분이 실제로는 하네스의 공이라는 뜻입니다.

## 코딩 하네스를 구성하는 6가지 요소

### 1. 레포 컨텍스트 수집

에이전트가 가장 먼저 하는 일은 환경 파악입니다. “테스트 고쳐줘”라는 지시는 그 자체로 완결된 명령이 아닙니다. 에이전트는 현재 Git 브랜치, 레포 구조, AGENTS.md나 README 같은 프로젝트 문서를 먼저 훑고 “워크스페이스 요약”을 만들어 둡니다. 그래야 어떤 테스트 명령을 실행해야 하는지, 어떤 파일을 봐야 하는지 추측이 아닌 사실에 근거해서 판단할 수 있습니다.

### 2. 프롬프트 캐싱

매 턴마다 모든 정보를 처음부터 조합하면 비용도 크고 속도도 느립니다. 실제로 코딩 세션에서 바뀌는 건 주로 세 가지뿐입니다. 최신 사용자 요청, 최근 대화 내역, 단기 메모리. 에이전트 지침, 도구 설명, 워크스페이스 요약 같은 “안정적인 부분”은 따로 묶어서 캐시해두고 재사용합니다. 매 대화마다 통째로 재처리하지 않는 것이죠.

### 3. 구조화된 도구 사용과 권한 체계

에이전트가 명령을 실행하기 전에, 하네스는 다음을 차례로 검사합니다.

1. 알려진 도구인가?
2. 인자 형식이 올바른가?
3. 사용자 승인이 필요한가?
4. 요청 경로가 워크스페이스 내부인가?

모든 검사를 통과해야 실제 실행이 됩니다. 이 구조 덕분에 모델이 임의 명령을 자유롭게 실행하는 대신, 예측 가능한 범위 안에서만 동작합니다. 자유를 제한하지만 신뢰성은 올라가는 트레이드오프입니다.

### 4. 컨텍스트 압축

파일 읽기, 도구 출력, 로그가 쌓이다 보면 컨텍스트 창이 빠르게 찹니다. 코딩 에이전트는 두 가지 전략으로 이를 관리합니다. 첫째, 긴 출력을 잘라냅니다(클리핑). 둘째, 오래된 대화는 요약하고, 여러 번 읽힌 같은 파일은 중복 제거합니다. 최근 이벤트일수록 더 풍부하게, 오래된 이벤트일수록 더 압축해서 처리합니다. Raschka 박사는 이 부분을 “겉으로 드러나지 않는 코딩 에이전트 설계의 핵심”이라고 강조합니다. 많은 경우 “모델 품질”처럼 보이는 것이 사실은 “컨텍스트 품질”이라는 것입니다.

### 5. 세션 메모리와 재시작 지원

에이전트는 상태를 두 계층으로 나눠 저장합니다. **전체 트랜스크립트**는 모든 요청·도구 출력·응답을 담은 완전한 기록이고, **워킹 메모리**는 현재 작업, 중요 파일, 최근 메모 등 핵심 정보를 추려낸 압축본입니다. 두 파일 모두 JSON으로 디스크에 저장되므로, 세션을 닫았다가 다시 열어도 맥락이 이어집니다.

### 6. 서브에이전트 위임

주 에이전트가 한 작업을 진행하면서 “이 심볼이 어느 파일에 정의됐지?” 같은 부수적인 질문이 생길 수 있습니다. 이럴 때 별도의 서브에이전트에게 그 작업을 위임하면 병렬 처리가 가능합니다. Claude Code는 오래전부터 이 기능을 지원해왔고, Codex는 더 최근에 추가했습니다. 중요한 설계 과제는 서브에이전트를 *어떻게 생성하느냐*보다 *어떻게 제한하느냐*입니다. 서브에이전트가 너무 많은 권한을 갖거나 무한히 중첩되면 오히려 혼란이 생기기 때문입니다.

  

## 하네스가 모델만큼 중요한 시대

이 6가지 요소는 독립적으로 작동하지 않습니다. 레포 컨텍스트는 프롬프트 캐싱에 들어가고, 도구 출력은 컨텍스트 압축의 대상이 되며, 세션 메모리는 서브에이전트에게도 전달됩니다. Raschka 박사는 이 구조를 직접 순수 Python으로 구현한 [Mini Coding Agent](https://github.com/rasbt/mini-coding-agent)를 오픈소스로 공개해두었습니다. 구성 요소가 코드 레벨에서 어떻게 연결되는지 보고 싶다면 원문의 코드 주석과 함께 살펴보는 걸 추천합니다.

**참고자료:** [Mini Coding Agent (GitHub)](https://github.com/rasbt/mini-coding-agent)



[ Like?](https://aisparkup.com/wp-admin/admin-ajax.php?action=oacs_spl_process_like&post_id=10836&nonce=8271f6cd1a&is_comment=0&disabled=true "Like")