살아있는 아키텍처 문서: 항상 최신 상태로 유지하기 - Archyl Blog

아키텍처 문서에는 유통기한 문제가 있습니다. 작성을 끝내는 순간 부패가 시작됩니다. 살아있는 아키텍처 문서는 문서를 자동 업데이트되고, 코드 기반이며, 지속적으로 검증되도록 만들어 이 문제를 해결합니다. 그 실현 방법을 소개합니다.

살아있는 아키텍처 문서: 항상 최신 상태로 유지하기

모든 엔지니어링 팀이 경험한 적 있습니다. 새 프로젝트에 합류하여 아키텍처 문서를 찾아 읽기 시작합니다. 시스템 맥락 다이어그램에는 외부 통합이 3개 표시되지만, 코드베이스는 7개와 통신합니다. 컨테이너 다이어그램에는 6개월 전에 폐기된 "Legacy Auth Service"가 나열되어 있습니다. PostgreSQL 사용에 관한 ADR은 PoC 후 중단된 CockroachDB 마이그레이션을 참조합니다.

문서가 잘못된 것은 누군가 부주의했기 때문이 아닙니다. 문서 부패가 기본 상태이기 때문입니다. 시스템은 지속적으로 발전합니다 -- 새 서비스가 추가되고, 오래된 것이 제거되고, 통신 패턴이 바뀌고, 기술 스택이 업데이트됩니다. 문서가 같은 속도로 발전하지 않으면 뒤처집니다. 뒤처지면 신뢰가 무너집니다. 개발자들이 참조하지 않게 됩니다. 새 팀원은 무시하는 법을 배웁니다. 문서는 아키텍처 소설이 됩니다.

살아있는 아키텍처 문서가 해결책입니다. 특정 도구나 형식이 아닌, 문서를 설명하는 시스템과 동기화된 상태로 유지하는 일련의 관행과 원칙입니다. 이 가이드는 살아있는 문서가 실제로 무엇을 의미하는지, 이를 가능하게 하는 전략, Archyl이 각 전략을 어떻게 지원하는지 다룹니다.

문서를 "살아있게" 만드는 것

살아있는 문서에는 전통적인 정적 문서와 구별되는 세 가지 핵심 특성이 있습니다.

자동 업데이트

살아있는 문서는 인간이 업데이트하는 것을 기억하는 것에만 의존하지 않습니다. 문서의 적어도 일부는 시스템 자체 -- 코드, 배포, 인프라, API 정의 -- 에서 도출됩니다. 시스템이 변하면 수동 개입 없이 문서가 그 변경을 반영합니다.

이것이 모든 것이 자동화된다는 뜻은 아닙니다. 아키텍처 의도, 설계 근거, 전략적 결정은 여전히 인간의 저작이 필요합니다. 하지만 문서의 사실적, 구조적 측면 -- 어떤 서비스가 존재하며, 어떤 기술을 사용하고, 어떻게 연결되는지 -- 은 자동화될 수 있고 자동화되어야 합니다.

지속적 검증

살아있는 문서에는 현실에서 벗어날 때를 감지하는 메커니즘이 포함됩니다. 누군가 읽고 잘못됐다고 깨달을 때가 아니라, 검증이 드리프트를 선제적으로 잡습니다.

이는 문서화된 아키텍처를 실제 인프라와 비교하는 적합성 검사를 실행하는 것일 수 있습니다. 아키텍처 정의를 코드베이스와 대조하여 검증하는 CI/CD 파이프라인일 수 있습니다. 드리프트 점수를 표면화하고 정확도가 임계값 아래로 떨어지면 알림을 보내는 대시보드일 수 있습니다.

개발 워크플로의 일부

살아있는 문서는 별도의 프로세스에서 유지되지 않습니다. 코드가 작성되고, 리뷰되고, 배포되는 것과 같은 개발 워크플로에 통합됩니다. 아키텍처 변경은 Pull request를 통과합니다. 문서 업데이트는 코드 변경과 함께 이루어집니다. 문서는 개발자가 이미 작업하는 곳에 있습니다.

정적 문서의 문제

살아있는 문서가 왜 중요한지 이해하기 위해, 전통적인 문서가 어떻게 실패하는지 살펴봅시다.

생성-부패 순환

전통적 문서는 예측 가능한 순환을 따릅니다:

  1. 생성: 의욕적인 팀원(또는 아키텍트, 컨설턴트)이 포괄적인 문서를 만듭니다. 정확하고, 상세하며, 잘 정리되어 있습니다.
  2. 유용성: 몇 주 또는 몇 달간 문서가 가치를 발휘합니다. 팀원이 참조합니다. 새 입사자가 배웁니다.
  3. 첫 번째 드리프트: 변경이 발생합니다 -- 새 서비스, 이름이 바뀐 컴포넌트, 변경된 의존성. 변경한 개발자가 생각하지 않았거나, 문서가 어디 있는지 몰랐거나, 시간이 없어서 문서가 업데이트되지 않습니다.
  4. 가속화된 부패: 첫 번째 부정확성이 나타나면, 부패 속도가 가속화됩니다. 이후의 각 변경이 문서에 반영될 확률이 낮아집니다. 신뢰가 비례하여 감소합니다.
  5. 포기: 결국 문서가 너무 구식이어서 아무도 신뢰하지 않습니다. 시스템이 실제로 어떤 모습인지가 아니라 "예전에 어떤 모습이었는지"의 참고 자료가 됩니다.
  6. 재생성: 누군가 문제를 인식하고 처음부터 새 문서를 만듭니다. 순환이 다시 시작됩니다.

이 순환은 대부분의 조직에서 6-18개월마다 반복됩니다. 각 생성 단계에 투자된 노력은 문서가 현실과의 접촉에서 살아남지 못하기 때문에 대부분 낭비됩니다.

인간 병목

정적 문서는 전적으로 인간이 추가적인 일을 하는 것에 의존합니다. 기능을 끝낸 후 개발자가 아키텍처 다이어그램을 업데이트하는 것을 기억해야 합니다. 설계 세션 후 누군가 화이트보드 논의를 구조화된 문서로 변환해야 합니다. 리팩토링 후 누군가 영향받는 모든 다이어그램이 여전히 정확한지 확인해야 합니다.

이 각각은 다른 우선순위와 경쟁하는 수동 단계입니다. 대부분의 조직에서 문서 업데이트는 코드 작성, 버그 수정, 마감 준수보다 우선순위가 낮습니다. 결과는 예측 가능합니다: 문서가 뒤처집니다.

발견 문제

문서가 정확하더라도 찾기 어려운 경우가 많습니다. 아키텍처 다이어그램은 Confluence에 있습니다. API 스펙은 별도 도구에 있습니다. ADR은 Git 저장소에 있습니다. 기술 선택은 위키에 문서화되어 있습니다. 완전한 그림을 제공하는 단일 장소가 없고, 개발자는 여러 도구를 검색하며 시간을 낭비합니다 -- 만약 검색한다면.

살아있는 아키텍처 문서를 위한 전략

문서를 진정으로 살아있게 만들려면 여러 전략을 결합해야 합니다. 어떤 단일 접근도 그 자체로 충분하지 않지만, 함께하면 최소한의 수작업으로 문서를 최신으로 유지하는 시스템이 만들어집니다.

전략 1: 코드 기반 문서

문서를 최신으로 유지하는 가장 효과적인 방법은 코드에서 도출하는 것입니다. 문서가 시스템의 소스 코드, 설정, 인프라 정의에서 생성되면 드리프트할 수 없습니다 -- 항상 현재 상태에서 재구축되기 때문입니다.

Architecture as code가 이 전략의 가장 직접적인 구현입니다. 시각적 도구에서 다이어그램을 그리고 누군가 업데이트하길 바라는 대신, Git 저장소에 있는 YAML 파일로 아키텍처를 정의합니다. 파일이 소스 오브 트루스이고, 시각적 다이어그램이 거기서 생성됩니다.

개발자가 새 서비스를 추가하면, 같은 Pull request에서 아키텍처 파일에 몇 줄을 추가합니다. 변경이 구현과 함께 코드 리뷰를 거칩니다. CI/CD 파이프라인이 업데이트된 파일을 문서 플랫폼에 동기화합니다. 다이어그램이 항상 코드에서 재생성되므로 항상 최신입니다.

API 계약 생성도 코드 기반 문서의 한 형태입니다. OpenAPI 생성기와 같은 도구가 주석이 달린 코드에서 API 명세서를 생성할 수 있습니다. API 문서를 별도로 유지하는 대신, 구현에서 문서가 추출됩니다. 코드가 변하면 문서가 변합니다.

Archyl에서 archyl.yaml 파일이 코드 기반 소스 오브 트루스 역할을 합니다. REST API나 MCP 서버를 사용하여 빌드 파이프라인에서 프로그래밍 방식으로 아키텍처 요소를 업데이트하여, 자동화된 프로세스가 문서를 동기화 상태로 유지하도록 할 수도 있습니다.

전략 2: AI 기반 발견

코드 기반 문서가 있더라도, 코드에 명시적이지 않은 아키텍처 측면이 있습니다. 서비스가 환경 변수를 통해 설정된 데이터베이스를 사용할 수 있습니다. 두 서비스가 인프라 코드에 정의된 공유 Kafka 토픽을 통해 통신할 수 있습니다. 새 서비스가 배포 파이프라인에 존재하지만 아키텍처 파일에는 아직 없을 수 있습니다.

AI 기반 발견이 코드베이스, 인프라, 배포 아티팩트를 분석하여 아키텍처 문서에 대한 업데이트를 제안함으로써 이러한 격차를 메웁니다.

Archyl의 AI 발견 기능은 저장소를 스캔하여 식별합니다:

  • 아직 문서화되지 않은 새 서비스
  • 코드에 존재하지만 아키텍처 모델에 반영되지 않은 의존성
  • 마지막 문서 업데이트 이후 변경된 기술 스택
  • 문서와 다른 통신 패턴

AI가 자동으로 문서를 수정하지 않습니다 -- 인간이 검토하고 승인하는 변경을 제안합니다. 이는 인간의 감독 원칙을 유지하면서 문서 격차를 찾는 데 필요한 노력을 극적으로 줄입니다.

전략 3: 적합성 규칙과 드리프트 감지

살아있는 문서에는 문서가 현실에서 벗어날 때를 감지하는 가드레일이 포함됩니다. 적합성 규칙은 "올바른" 문서가 어떤 모습인지 정의하고, 드리프트 감지는 현재 문서가 그 규칙에서 얼마나 벗어나는지 측정합니다.

적합성 규칙 예시:

  • 모든 컨테이너에 최소 하나의 기술이 문서화되어야 함
  • 모든 외부 시스템에 설명이 있어야 함
  • 데이터베이스 의존성이 있는 모든 서비스에 문서화된 데이터 소유권 설명이 있어야 함
  • 고아 컨테이너 금지 (모든 컨테이너가 최소 하나의 관계에 참여해야 함)
  • 모든 ADR이 최소 하나의 아키텍처 요소를 참조해야 함
  • 모든 API 유형 컨테이너에 연결된 API 계약이 있어야 함

이 규칙이 위반되면 드리프트가 자동으로 표면화됩니다. 팀은 드리프트 점수 -- 문서 정확도의 수치적 측정 -- 를 볼 수 있고, 정확히 어떤 영역에 주의가 필요한지 식별할 수 있습니다.

Archyl의 적합성 엔진이 이 규칙을 지속적으로 평가합니다. 드리프트 점수가 프로젝트 대시보드에 나타나며, 팀은 점수가 임계값 아래로 떨어지면 알림을 설정할 수 있습니다. 이것은 피드백 루프를 만듭니다: 문서 드리프트가 신뢰를 훼손할 만큼 심각해지기 전에 조기 감지됩니다.

전략 4: 완료 정의의 일부로서의 문서

살아있는 문서를 위한 가장 효과적인 조직적 전략은 아키텍처에 영향을 미치는 모든 작업의 완료 정의에 문서 업데이트를 포함시키는 것입니다.

이것은 다음을 의미합니다:

  • Pull request가 새 서비스를 추가하면, 같은 PR에서 아키텍처 파일이 업데이트되어야 함
  • 설계 세션에서 결정이 나오면, 결정이 구현되기 전에 ADR이 만들어져야 함
  • API 계약이 변경되면, 문서화된 계약이 업데이트되어야 함
  • 서비스가 폐기되면, 아키텍처 모델에서 제거되어야 함

이것은 관료주의가 아닙니다 -- "변경이 발생하는 시점"과 "문서가 업데이트되는 시점" 사이의 격차를 0으로 줄이는 것입니다. 문서가 코드 변경과 같은 워크플로의 일부이면, 별도의 노력이 필요하지 않습니다.

Archyl은 architecture-as-code 통합을 통해 이를 지원합니다. 아키텍처 파일이 코드와 같은 저장소에 있으면, 같은 Pull request에서 둘 다 업데이트하는 것이 자연스럽습니다. 코드 리뷰어가 아키텍처 변경이 구현과 함께 문서화되었는지 확인할 수 있습니다.

전략 5: 지속적 시각화

살아있는 문서는 접근하기 쉽고 시각적으로 유용해야 합니다. 개발자가 아키텍처를 이해하기 위해 YAML 파일을 파싱해야 한다면, 도입률이 떨어집니다. 코드 기반 정의는 항상 최신이고, 항상 접근 가능하며, 항상 유용한 시각적 출력을 생산해야 합니다.

이것은 다음을 의미합니다:

  • 소스 오브 트루스에서 자동으로 재생성되는 아키텍처 다이어그램
  • 시스템 맥락에서 컨테이너, 컴포넌트로 줌할 수 있는 인터랙티브 탐색
  • 특정 측면(소유권, 기술 스택, 통신 패턴)을 강조하는 오버레이
  • 모든 아키텍처 요소, 관계, 문서에 걸친 검색

Archyl의 시각적 레이어는 항상 기본 모델과 동기화됩니다. YAML 파일, MCP 서버, REST API, 시각적 편집기 중 어디서 모델이 업데이트되든 다이어그램이 현재 상태를 반영합니다. 이것은 대부분의 개발자가 실제로 상호작용하는 시각적 문서가 항상 정확하도록 보장합니다.

문서 신선도 측정

살아있는 문서는 측정 가능해야 합니다. 중요한 메트릭을 소개합니다.

드리프트 점수

드리프트 점수는 문서가 정의된 규칙에 얼마나 부합하는지 측정합니다. 100점은 모든 규칙이 충족되었다는 뜻입니다. 70점은 규칙의 30%에 위반이 있다는 뜻입니다. 이 점수를 시간에 따라 추적하여 문서가 더 정확해지고 있는지 덜 정확해지고 있는지 이해합니다.

Archyl은 적합성 규칙에 기반하여 자동으로 드리프트 점수를 계산하고 프로젝트 대시보드에 표면화합니다.

문서화 소요 시간

아키텍처 변경이 문서에 나타나기까지 걸리는 시간을 측정합니다. 잘 작동하는 살아있는 문서 시스템에서 이것은 거의 0이어야 합니다 -- 문서 업데이트가 코드 변경과 같은 Pull request에서 발생하기 때문입니다. 일관된 지연이 있으면, 워크플로 통합을 개선해야 합니다.

커버리지

아키텍처의 몇 퍼센트가 문서화되어 있는지 추적합니다. 얼마나 많은 서비스에 설명이 있나요? 얼마나 많은 관계에 레이블이 있나요? 얼마나 많은 컨테이너에 문서화된 기술 스택이 있나요? 커버리지 메트릭이 격차가 어디 있는지 알려줍니다.

신뢰 설문

정기적으로 개발자에게 묻습니다: "아키텍처 문서를 신뢰하십니까?" 답이 아니오이면, 정량적 메트릭이 무엇을 말하든 살아있는 문서 관행을 개선해야 합니다. 개발자 신뢰가 문서 품질의 궁극적 측정입니다.

흔한 실수

모든 것을 자동화하기

모든 것이 자동화될 수 있거나 되어야 하는 것은 아닙니다. 아키텍처 의도, 설계 근거, 트레이드오프 분석, 전략적 방향은 인간의 저작이 필요합니다. 살아있는 문서는 사실적, 구조적 측면을 자동화하면서 인간의 통찰을 위한 공간을 보존합니다.

적합성을 규정 준수로 취급하기

적합성 규칙은 처벌적이 아니라 도움이 되어야 합니다. 의도하지 않은 드리프트를 잡기 위해 존재하며, 관료적 오버헤드를 만들기 위한 것이 아닙니다. 팀이 유용한 작업보다 적합성 규칙을 충족하는 데 더 많은 시간을 쓴다면, 규칙이 너무 엄격합니다.

온보딩 유스케이스 무시하기

살아있는 문서는 시스템을 한 번도 본 적 없는 사람에게도 접근 가능해야 합니다. 문서를 이해하기 위해 깊은 맥락이 필요하다면, 가장 중요한 목적 중 하나를 제대로 수행하지 못하고 있는 것입니다. 정기적으로 신규 입사자의 관점에서 문서를 살펴보며 테스트하세요.

완벽을 좋은 것의 적으로 만들기

유용한 살아있는 문서를 위해 100% 커버리지와 완벽한 드리프트 점수가 필요하지 않습니다. 서비스의 80%를 다루고 주간으로 업데이트되는 Container 다이어그램이 6개월 전에 정확했던 포괄적인 문서 세트보다 훨씬 가치 있습니다.

Archyl이 살아있는 아키텍처 문서를 지원하는 방법

Archyl은 처음부터 살아있는 문서 관행을 지원하도록 구축되었습니다. 각 기능이 기여하는 방식입니다.

Architecture as Code가 문서를 코드 기반으로 만듭니다. archyl.yaml 파일이 Git에 있고, 코드 리뷰를 거치며, CI/CD를 통해 자동으로 동기화됩니다. 아키텍처 파일 변경이 시각적 다이어그램에 즉시 업데이트를 생성합니다.

AI 발견이 코드베이스를 분석하고 업데이트를 제안하여 문서 격차를 식별합니다. 새 서비스, 변경된 의존성, 업데이트된 기술 스택을 잡아냅니다.

적합성 규칙이 올바른 문서가 어떤 모습인지 정의하고 현재 상태를 지속적으로 검증합니다. 드리프트 점수가 문서 정확도의 단일 숫자 요약을 제공하며, 위반이 선제적으로 표면화됩니다.

MCP 서버가 아키텍처 문서를 AI 지원 개발 워크플로에 통합합니다. 개발자가 별도 도구로 맥락 전환하지 않고 IDE에서 문서를 쿼리하고 업데이트할 수 있습니다.

소유권 맵이 모든 아키텍처 요소를 책임 팀에 매핑하여 책임을 만듭니다. 문서가 드리프트하면 소유 팀이 식별되어 조치를 취할 수 있습니다.

협업 기능 -- 코멘트, 변경 요청, 실시간 공동 편집 -- 이 문서를 혼자 하는 부담이 아닌 팀 활동으로 만듭니다.

릴리스 추적과 DORA 메트릭이 아키텍처 문서를 딜리버리 성과에 연결하여, 아키텍처 결정이 팀의 소프트웨어 배포 능력을 개선하고 있는지 방해하고 있는지에 대한 지속적인 신호를 제공합니다.

시작하기

아키텍처 문서가 현재 정적이라면, 살아있게 만드는 실용적인 경로입니다:

  1. Container 다이어그램부터 시작하세요. 서비스, 기술, 핵심 관계를 문서화합니다. Archyl에 넣고 정식 참조로 만듭니다.

  2. 아키텍처를 코드로 이동하세요. 모델을 archyl.yaml로 내보내고, 저장소에 커밋하고, CI/CD 동기화를 설정합니다.

  3. 적합성 규칙을 추가하세요. 기본 규칙(모든 컨테이너에 기술 필요, 모든 컨테이너에 최소 하나의 관계 필요)으로 시작하고 시간에 따라 확장합니다.

  4. 문서를 PR 워크플로의 일부로 만드세요. PR 템플릿에 체크리스트 항목을 추가합니다: "필요한 경우 아키텍처 문서 업데이트."

  5. MCP 서버를 설정하세요. AI 어시스턴트에게 아키텍처 모델에 대한 접근을 제공하여 문서 쿼리와 업데이트가 개발 중에 자연스럽게 이루어지도록 합니다.

  6. 월간 드리프트 점수를 검토하세요. 추세를 추적하고 정확도가 떨어지면 조사합니다.

살아있는 아키텍처 문서는 목적지가 아닙니다 -- 관행입니다. 목표는 완벽한 문서가 아니라, 신뢰를 받을 만큼 충분히 정확하고 그 상태를 유지할 만큼 일관되게 유지되는 문서입니다.

Archyl로 시작하기로 아키텍처 문서를 항상 최신으로 유지하세요.