Files
2nd/10_Wiki/Topics/Architecture/Executable_Documentation.md
T

16 KiB

category, tags, title, last_updated
category tags title last_updated
Unified
auto-consolidated
technical-documentation
Executable Documentation 2026-05-02

Executable Documentation

📌 Brief Summary

Executable Documentation(실행 가능한 문서)은 시스템의 기대 동작을 명시함과 동시에 실제 코드로 실행되어 검증될 수 있는 형태의 문서를 의미합니다 [1]. 소스 코드 생태계에서는 주로 '테스트 코드(Test Code)'가 가장 신뢰할 수 있는 실행 가능한 문서의 역할을 수행합니다 [1]. 이 외에도 기계가 읽을 수 있는 API 명세 기반의 대화형(Interactive) 문서나 코드로 작성되어 버전 관리가 가능한 다이어그램(Diagrams as Code) 등 코드의 변경과 실시간으로 동기화되는 문서 체계도 이에 해당합니다 [2, 3].


실행 가능한 문서는 소프트웨어 시스템의 기대 동작을 명확히 명시하는 신뢰할 수 있는 수단으로, 대표적으로 '테스트 코드'를 의미합니다 [1, 2]. 새로운 코드베이스를 탐색할 때 테스트 코드는 코드가 시스템에서 어떻게 사용되어야 하는지를 보여주는 훌륭한 무료 사용 설명서 역할을 합니다 [3]. 개발자는 이러한 테스트 코드를 통해 개별 컴포넌트의 논리부터 시스템 전반의 상호작용 흐름까지 파악할 수 있습니다 [2].

📖 Core Content

  • 테스트 코드를 통한 실행 가능한 문서화: 대규모 코드베이스에서 테스트 코드는 시스템의 설계 철학과 기대 동작을 명시하는 가장 신뢰할 수 있는 실행 가능한 문서입니다 [1]. 개발자는 단위 테스트(Unit Test)를 통해 개별 컴포넌트의 국소적 논리를 이해하고, 통합 테스트(Integration Test)를 통해 시스템 전반의 상호작용 흐름을 파악할 수 있습니다 [4].
  • 동적 동작 관찰과 기술적 통찰: 새로운 시스템에 온보딩하거나 코드를 분석할 때, 정적인 독해만으로는 시스템의 전체를 파악하기 어렵습니다 [4, 5]. 테스트 코드에서 특정 값을 임의로 변경해 보고 시스템의 반응을 관찰하는 실험적 접근은, 문서 읽기만으로는 얻을 수 없는 깊은 기술적 통찰을 제공합니다 [4].
  • API 명세 기반의 문서 자동화: API-First 아키텍처 환경에서는 OpenAPI나 AsyncAPI와 같은 명세(Specification)를 통해 서버 스텁, 클라이언트 SDK 및 대화형 문서를 사양 파일에서 직접 자동 생성할 수 있습니다 [2, 6]. 이 과정은 수동 작업의 노력을 줄이고 시스템 변경 시 문서가 낙후되는 것을 방지합니다 [2].
  • 다이어그램의 코드화 (Diagrams as Code): 시스템 아키텍처를 시각적으로 이해하기 위해 Structurizr(C4 모델 기반), Mermaid, PlantUML과 같은 텍스트 및 마크다운 기반 구문을 사용하여 다이어그램을 생성할 수 있습니다 [3, 7]. 이는 버전 관리 시스템을 통해 코드와 함께 관리되므로 항상 최신 상태를 유지하는 문서의 역할을 합니다 [3].

  • 코드의 사용법을 보여주는 진입점: 새로운 코드베이스의 복잡성에 직면했을 때, HTTP 컨트롤러나 CLI 명령어와 같은 메인 진입점과 함께 가장 먼저 찾아야 할 것이 바로 테스트 코드입니다 [3]. 테스트는 시스템 로직이 어떻게 사용되도록 의도되었는지 보여주는 명확한 가이드 역할을 합니다 [3].
  • 단위 및 통합 테스트를 통한 흐름 파악: 단위 테스트를 분석하면 개별 컴포넌트의 논리를 이해할 수 있으며, 통합 테스트를 살펴보면 시스템 전반에 걸친 상호작용의 흐름을 파악하는 데 큰 도움이 됩니다 [2].
  • 실험적 접근을 통한 동적 통찰: 정적인 독해만으로는 코드베이스를 깊이 있게 파악하기 어렵습니다 [2]. 테스트 코드 내에서 특정 값을 인위적으로 변경해 보고 시스템의 반응을 관찰하는 실험적인 접근 방식은 시스템 동작에 대한 깊은 기술적 통찰을 제공합니다 [2].
  • 온보딩과 학습의 도구: 복잡한 시스템에 새롭게 합류했을 때, 단순히 코드를 눈으로 읽는 것을 넘어 일부 테스트를 추가하거나 변경해 보는 행위는 코드가 실제로 어떻게 작동하는지를 체득하는 데 매우 효과적인 방법입니다 [4].

⚖️ Trade-offs & Caveats

소스에 "Executable Documentation" 자체에 대한 직접적이고 포괄적인 제약 사항 정보가 부족합니다. 다만, 소스에서 다루는 실행 가능한 문서의 구체적 구현체(테스트 코드, 도구화된 문서 등)와 관련된 부작용 및 제약 사항은 다음과 같습니다:

  • 테스트 스위트의 복잡성 및 유지보수 부담: 테스트 코드를 논리적 구조로 그룹화(Test Suites)하여 실행 가능한 문서로 사용할 때, 과도하게 조직화하면 각각이 하위 테스트 집합을 포함하게 되어 유지보수가 매우 어려워질 수 있습니다 [8].
  • 잘못된 경계 설정의 위험성: 모호하게 코딩되어 경계가 명확하지 않은 테스트 스위트는 테스트를 제대로 격리하지 못하여 실행 가능한 문서로서의 정확성과 신뢰도를 떨어뜨립니다 [8].
  • 상호 의존성 문제: 시스템이 커지면서 상호 의존성을 가진 테스트 스위트가 늘어나면 복잡성이 증가하며, 올바른 순서로 시퀀싱하지 않을 경우 누락이 발생하거나 실패할 수 있습니다 [9].
  • 초기 설정 및 지속적 관리 요구: 도구를 활용해 문서와 코드를 동기화하고 API 목(Mock) 서버를 구성하는 등 실행 가능한 상태를 유지하기 위해서는 팀의 규율과 지속적인 유지보수 작업이 요구됩니다 [2, 8].

테스트 코드를 시스템을 이해하기 위한 실행 가능한 문서로 활용할 때, 테스트 파일과 스위트(Test Suites)의 구성 방식에 따라 오히려 이해를 방해하는 제약이 생길 수 있습니다 [5].

  • 테스트 스위트가 모호하게 코딩되어 있거나 경계가 불명확할 경우, 개별 테스트를 적절히 격리(isolate)하지 못하여 시스템의 정확한 동작을 파악하기 어렵게 만듭니다 [5].
  • 프로젝트가 커짐에 따라 테스트 파일들을 모듈 타입에 맞춰 너무 파편화하여 분리해두면, 모듈 간의 상호작용을 테스트하는 통합 테스트 과정이 매우 복잡해져 전체 맥락을 잃기 쉽습니다 [6].
  • 과도하게 얽힌 불필요한 테스트 스위트들의 묶음은 유지보수를 매우 어렵게 만들고, 테스트 실행의 논리적 시퀀스를 맞추는 데 불필요한 복잡성을 더할 수 있습니다 [5, 7].

🔗 Knowledge Connections

[테스트 및 검증 기반 기술]

  • 단위 테스트 (Unit Testing)
    • 연결 이유: 개별 컴포넌트의 논리와 예상되는 입출력 데이터를 실행 가능한 형태로 문서화하는 가장 기초적인 수단입니다 [4].
    • 이 개념을 통해 더 깊게 이해할 수 있는 부분: 격리된 모듈의 책임(Responsibility)과 정확한 동작 원리.
  • 통합 테스트 (Integration Testing)
    • 연결 이유: 모듈 간의 결합과 통신 흐름을 검증하여, 분산된 시스템 전반의 상호작용을 파악하는 실행 가능한 문서 역할을 합니다 [4].
    • 이 개념을 통해 더 깊게 이해할 수 있는 부분: 아키텍처 내 컴포넌트 간의 인터페이스 및 전체 기능 작동 메커니즘.

[설계 및 명세 자동화 도구]

  • OpenAPI / AsyncAPI
    • 연결 이유: API-First 설계에서 사용하는 기계 해독 가능(Machine-readable) 명세로, 대화형 문서와 코드를 자동 생성하는 기반입니다 [2].
    • 이 개념을 통해 더 깊게 이해할 수 있는 부분: 시스템 외부 및 클라이언트와의 계약(Contract) 기반 통신과 병렬 개발 파이프라인.
  • Diagrams as Code
    • 연결 이유: Mermaid나 PlantUML을 사용하여 시스템 구조를 텍스트 구문으로 정의하고, 소스 코드와 함께 버전 컨트롤로 관리하는 시각적 문서 체계입니다 [3, 7].
    • 이 개념을 통해 더 깊게 이해할 수 있는 부분: 소스 코드의 변경 사항과 아키텍처 다이어그램 간의 동기화 및 형상 관리 기법.

Deeper Research Questions

  • 실행 가능한 문서(테스트 코드)가 실제 운영 코드의 변경 사항과 동기화되지 않고 방치될 때, 코드베이스 이해도와 기술적 부채에 어떠한 악영향을 미치는가?
  • OpenAPI와 같은 명세를 통한 자동 생성 문서가 사람이 직접 작성하는 전통적인 기술 문서에 비해 가지는 인지적, 맥락적 한계점은 무엇인가?
  • Diagrams as Code를 적용하여 아키텍처 문서를 버전 관리할 때, 거대한 마이크로서비스 아키텍처에서 발생하는 시각적 복잡성을 어떻게 제어하고 추상화할 수 있는가?
  • 낯선 레거시 코드베이스를 탐색할 때, 단위 테스트와 통합 테스트 중 시스템의 초기 멘탈 모델을 형성하는 데 더 효율적인 '실행 가능한 문서'는 무엇이며 그 이유는 무엇인가?
  • 강하게 결합되어 테스트가 불가능한 레거시 코드를 실행 가능한 문서(테스트 스위트)가 존재하는 안정적인 구조로 리팩토링하기 위한 가장 안전한 접근법은 무엇인가?

Practical Application Contexts

  • Implementation: 백엔드 API 개발 시 OpenAPI 명세를 먼저 작성하고 이를 바탕으로 대화형 문서와 Mock 서버를 자동 생성하여, 프론트엔드 팀이 백엔드 구현 완료를 기다리지 않고 병렬로 개발을 진행할 수 있습니다 [2, 6].
  • System Design: 소프트웨어 아키텍처를 그릴 때 정적인 이미지 도구가 아닌 Mermaid나 Structurizr를 사용하여 설계하고 Git 저장소에 커밋함으로써, 코드 리뷰 시 설계 변경 사항을 함께 검토하고 문서를 최신 상태로 유지합니다 [3].
  • Operation / Maintenance: 방대한 시스템을 유지보수할 때 테스트 스위트를 기능과 모듈에 따라 논리적으로 그룹화하여 관리함으로써, 운영 중인 시스템에 변경을 가할 때 발생할 수 있는 부수 효과(Side effect)를 즉시 파악하는 안전망이자 가이드 문서로 활용합니다 [8, 10].
  • Learning Path: 새로운 코드베이스나 팀에 합류(Onboarding)할 때, 방치된 문서 파일을 읽는 대신 잘 작성된 테스트 코드를 직접 찾아 값을 변경해 보고 디버거로 실행하며 시스템의 런타임 반응을 관찰하는 방식으로 시스템 구조를 학습합니다 [1, 4, 5].
  • My Project Relevance: 복잡한 시스템이나 레거시 코드의 비즈니스 로직을 파악해야 할 때, 코드를 하향식 혹은 상향식으로 탐색하는 것과 병행하여 해당 도메인을 다루는 테스트 코드(실행 가능한 문서)를 확인하여 코드 작성자의 원래 의도를 가장 신뢰성 있게 도출할 수 있습니다 [1, 4].

Adjacent Topics

  • API-First Architecture
    • 확장 방향: 제품 구현 전 API 명세(실행 가능한 계약)를 우선적으로 설계하여 프론트엔드와 백엔드 간의 결합도를 낮추고 문서화를 자동화하는 접근법으로 이해를 확장합니다 [2, 6, 11].
  • Version Control Systems (Git)
    • 확장 방향: 소스 코드 및 Diagrams as Code의 변경 이력을 추적하고, 과거의 PR 설명과 커밋 메시지라는 맥락 데이터를 통해 현재 코드의 의도를 유추하는 방법론으로 학습을 확장합니다 [12, 13].

Last updated: 2026-05-02


[코드 탐색 및 분석 전략]

  • 하향식 및 상향식 접근법 (Top-Down and Bottom-Up Approaches)
    • 연결 이유: 대규모 코드베이스의 정보 흐름을 파악하는 가장 근본적인 두 가지 탐색 방향입니다 [8].
    • 이 개념을 통해 더 깊게 이해할 수 있는 부분: 테스트 코드를 분석의 시작점(진입점)으로 삼아, 하향식으로 비즈니스 의도를 파악하거나 상향식으로 기술적 한계 및 동작을 역추적하는 전략을 세울 수 있습니다 [8, 9].

[프로젝트 구조화 도구]

  • 테스트 파일 조직화 (Test File Organization)
    • 연결 이유: 실행 가능한 문서로서의 테스트 코드가 저장소 내에 어떻게 배치되고 분류되는지(예: 테스트 타입별, 모듈별, 애플리케이션 계층별)를 의미합니다 [10-12].
    • 이 개념을 통해 더 깊게 이해할 수 있는 부분: 방대한 테스트 코드들이 어떤 논리(단위, E2E, UI 등)로 그룹화되어 있는지 파악함으로써, 특정 비즈니스 로직이나 모듈의 문서를 어디에서 찾아야 할지 빠르게 매핑할 수 있습니다 [10, 11, 13].

Deeper Research Questions

  • 테스트 코드(실행 가능한 문서)가 부족하거나 거의 없는 레거시 시스템 환경에서, 어떤 전략을 통해 점진적으로 시스템을 탐색하고 실행 가능한 문서를 보강할 수 있는가?
  • 경계가 불명확하고 모호하게 작성되어 격리(isolation)에 실패한 테스트 스위트를 어떻게 리팩토링하여 명확한 실행 가능한 문서로 탈바꿈시킬 수 있는가? [5]
  • 테스트 코드에서 특정 값을 임의로 변경하며 시스템의 반응을 살피는 '실험적 접근법'을 디버깅 과정의 중단점(Breakpoints) 설정 등 동적 분석 기법과 어떻게 효과적으로 결합할 수 있는가? [2, 14]
  • Qodo(CodiumAI)와 같이 테스트 생성에 특화된 AI 도구를 활용하여, 방대한 코드베이스의 실행 가능한 문서(테스트 코드)를 자동 생성할 때 발생하는 환각(Hallucination) 위험을 어떻게 통제할 것인가? [15, 16]

Practical Application Contexts

  • Implementation: 새로운 기능을 개발하거나 수정하기 전, 해당 모듈에 작성된 단위/통합 테스트 코드를 먼저 읽고 시스템의 의도된 입력과 출력을 파악합니다 [2, 3].
  • System Design: 소프트웨어 설계 단계에서부터 테스트 코드가 미래의 유지보수 담당자를 위한 살아있는 설명서가 될 수 있도록, 테스트 스위트의 범위를 명확히 격리하고 직관적인 명명 규칙(Naming conventions)을 적용합니다 [5, 7].
  • Operation / Maintenance: 기존 기능의 버그를 추적하거나 로직을 수정할 때, 테스트 코드의 특정 값을 변경해 보면서 시스템 동적 반응의 부수 효과를 사전에 실험합니다 [2].
  • Learning Path: 낯선 대규모 코드베이스를 처음 배정받았을 때 코드 전체를 완벽히 이해하려 하기보다는, 가장 먼저 단위 테스트가 위치한 디렉토리를 찾아 시스템의 동작 방식을 파악하는 훈련을 합니다 [3, 4].
  • My Project Relevance: 문서화가 빈약한 오픈소스나 내부 레거시 프로젝트를 분석할 때, 별도의 외부 문서에 의존하기보다 소스 코드와 함께 제공된 테스트 코드를 신뢰할 수 있는 단일 진실 공급원(Single Source of Truth)으로 삼아 구조를 해독합니다 [1, 3].

Adjacent Topics

  • 버전 관리 이력 (Version Control History)
    • 확장 방향: 테스트 코드가 시스템이 '어떻게(How)' 동작하는지 보여주는 문서라면, 버전 관리 시스템(Git)의 커밋 메시지나 PR 기록은 코드가 '왜(Why)' 그렇게 설계되었는지를 알려줍니다. 이 두 가지를 결합하여 코드베이스의 역사적 맥락과 현재 동작의 상호 관계를 종합적으로 이해하는 방향으로 학습을 확장할 수 있습니다 [17, 18].

Last updated: 2026-05-02