2026-07-07

코드는 계속 바뀌는데 문서는 언제 갱신할까: 릴리즈 수동·CI 정기·MR 트리거

MW

이보라

모던웹연구소 파운더

LinkedIn ↗

코드는 계속 바뀌는데 문서는 한 번 만들어두면 며칠 만에 현실과 어긋납니다. 문서가 코드를 따라잡게 하는 세 가지 방법을 정리합니다. 릴리즈 주기 수동 갱신·CI 정기 잡 자동 재생성·MR 트리거 불일치 검사를 claude -p headless 실행을 중심으로 비교하고, 언제 자동화를 한 단계씩 올릴지 짚습니다.

지난 글에서 acquire-codebase-knowledge 스킬로 낯선 코드베이스를 docs/codebase/의 7개 문서로 정리하는 방법을 다뤘습니다. 스킬을 한 번 돌리고 나면 자연스럽게 따라오는 질문이 있습니다. 코드는 매주 바뀌는데 이 문서는 언제 다시 만들어야 할까? 한 번 만든 문서를 방치하면 며칠 만에 현실과 어긋나기 시작합니다. 그리고 어긋난 문서는 없느니만 못합니다. 앞 글에서 짚었듯 팀 전체가 틀린 지도를 들고 개발하게 되기 때문입니다.

모던웹연구소가 실제로 써보며, 고객사들과 소통하며 정리한 갱신 방식은 세 가지입니다. 결론부터 말하면 셋 중 하나를 고르는 문제가 아닙니다. 손으로 돌리는 ①로 시작해 정기 자동화인 ②를 얹고, ③은 문서를 다시 만드는 용도가 아니라 어긋남을 잡아내는 검사로 쓰는 조합이 현실적입니다. 아래에서 자동화 정도가 낮은 것부터 하나씩 살펴봅니다. 예시는 GitLab 기준이지만 원리는 다른 CI에도 그대로 옮길 수 있습니다.

① 릴리즈 주기 수동 갱신

가장 단순한 방식은 릴리즈 체크리스트에 한 줄을 더하는 것입니다. '스킬 재실행 후 변경분을 MR로 올린다' 정도면 충분합니다. 릴리즈를 준비할 때 acquire-codebase-knowledge를 다시 돌리고, 새로 생성된 문서와 기존 문서의 diff를 눈으로 확인한 뒤 MR로 병합합니다.

이 방식의 장점은 검증이 항상 사람 눈을 거친다는 점입니다. 에이전트가 새로 쓴 문서를 개발자가 diff로 확인하니 엉뚱한 내용이 그대로 들어갈 일이 없습니다. 대신 두 가지 약점이 있습니다. 릴리즈와 릴리즈 사이에 벌어진 어긋남은 다음 릴리즈까지 방치됩니다. 그리고 체크리스트의 항목은 바쁠 때 가장 먼저 잊힙니다. 도입 초기, 아직 문서를 팀이 신뢰하기 전 단계에 알맞은 방식입니다.

사람 없이 돌리는 한 줄, claude -p

아래 ②③을 이해하려면 부품 하나를 먼저 알아야 합니다. 바로 claude -p입니다. Claude Code 대화 안에서 앞에 !를 붙여 !ls처럼 치는 것은 '대화 세션 안에서 셸 명령을 실행'하는 것입니다. 반대로 claude -p "..."는 셸에서 Claude Code를 한 번 호출합니다. 대화형으로 창을 열지 않고 한 번 묻고 답을 출력한 뒤 그대로 끝나는 비대화형 모드입니다.1 문서에는 headless 모드라고 부르고, 스크립트와 CI 파이프라인에 넣으라고 안내합니다.

직접 감을 잡고 싶다면 터미널에 claude -p "다음 문장을 한국어로 번역해줘: hello world"를 한 번 쳐보길 권합니다. 창이 열리지 않고 답만 출력되고 끝나는 걸 보면 됩니다. 아래 두 방식은 이 한 줄을 CI가 대신 실행하게 만드는 것뿐입니다.

② CI 정기 잡으로 자동 재생성

GitLab의 Pipeline Schedules 기능으로 파이프라인을 주기적으로 돌릴 수 있습니다. 예를 들어 매주 월요일 새벽에 문서를 다시 생성하고, 변경이 있으면 자동으로 MR을 만들게 합니다. 사람은 올라온 MR을 리뷰만 하면 됩니다.

# .gitlab-ci.yml — 주 1회 문서 재생성 (주기는 Pipeline Schedules에서 설정)
docs-refresh:
  rules:
    - if: $CI_PIPELINE_SOURCE == "schedule"
  script:
    - claude -p --permission-mode acceptEdits "acquire-codebase-knowledge 스킬로 docs/codebase/ 문서를 다시 생성해줘"
    - |
      if ! git diff --quiet; then
        git checkout -b "docs/refresh-$CI_PIPELINE_ID"
        git add -A
        git commit -m "docs: refresh codebase knowledge"
        git push origin "docs/refresh-$CI_PIPELINE_ID"
        glab mr create --fill --yes
      fi

동작 순서를 풀면 이렇습니다. rules$CI_PIPELINE_SOURCE == "schedule"은 이 잡을 예약 실행에서만 돌게 묶는 조건입니다.2 claude -p로 스킬을 돌려 문서를 다시 쓰고, git diff --quiet로 실제로 바뀐 게 있는지 확인합니다. 이 명령은 변경이 있으면 실패 코드를 돌려주므로 if ! git diff --quiet가 곧 '바뀐 게 있으면'이라는 조건이 됩니다. 바뀐 게 있을 때만 브랜치를 파서 커밋·푸시하고 glab mr create로 MR을 엽니다. 변경이 없으면 아무 일도 하지 않습니다.

무인 실행이라 챙길 게 하나 있습니다. 파이프라인에는 사람이 없으니 권한 프롬프트가 한 번이라도 뜨면 그 자리에서 멈춥니다. 그래서 --permission-mode acceptEdits로 파일 수정을 자동 승인하게 했습니다. scan.py 실행처럼 셸이 필요한 도구는 --allowed-tools로 미리 열어둬야 합니다.

③ MR 트리거로 어긋남만 잡기

세 번째는 MR이 올라올 때마다 도는 방식입니다. 다만 MR마다 문서 전체를 재생성하면 diff 노이즈와 토큰 비용이 지나치게 커집니다. 그래서 이 자리에서는 claude -p를 문서를 다시 쓰는 용도가 아니라 '불일치 검사'로 씁니다. '이 MR의 diff가 docs/codebase/ 문서와 어긋나는 부분이 있으면 파일·라인과 함께 지적해줘'라고 시키고, 그 결과를 MR 코멘트로 남깁니다.

# .gitlab-ci.yml — MR마다 문서 불일치 검사
docs-drift-check:
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
  script:
    - |
      claude -p --permission-mode plan \
        "이 MR의 변경이 docs/codebase/ 문서와 어긋나는 부분이 있으면 파일·라인과 함께 짚어줘. 없으면 OK만 출력해줘." \
        > drift.md
    - glab mr note "$CI_MERGE_REQUEST_IID" --message "$(cat drift.md)"

--permission-mode plan은 에이전트가 파일을 고치지 못하게 묶습니다. 문서를 다시 쓰는 게 아니라 읽고 지적만 하는 검사라 이 모드가 맞습니다. 이 방식의 장점은 어긋남이 생기는 바로 그 순간에 잡힌다는 점입니다. 문서를 실제로 고치는 일은 사람이 ①이나 ②의 흐름으로 처리합니다. ③은 '지금 이 변경이 문서와 어긋난다'고 알려주는 역할까지만 맡습니다.

세 방법 비교

구분

① 릴리즈 수동

② CI 정기 잡

③ MR 트리거

신선도

릴리즈 주기만큼 뒤처짐

스케줄 주기(주 단위)

어긋나는 즉시 감지

비용

0(사람 시간만)

주기당 토큰과 러너

MR마다(가장 잦음)

사람 개입

항상(직접 실행하고 확인)

MR 리뷰만

코멘트 확인만

실패 모드

잊어버림

리뷰 없이 쌓이면 슬롭

파이프라인 지연·노이즈

적합 시점

도입 초기

팀이 문서를 신뢰하기 시작한 뒤

문서 의존도가 높아진 뒤

정리

세 방법 중 하나를 고르는 문제가 아니라 순서의 문제입니다. 처음부터 ②③을 걸어두면 아무도 읽지 않는 자동 MR과 코멘트만 쌓입니다. 먼저 ①로 문서를 손수 갱신하며 이 문서가 쓸모 있다는 경험을 만듭니다. 손으로 돌리기가 귀찮아질 무렵 ②로 정기 재생성을 자동화합니다. 그리고 팀이 이 문서에 진짜로 의존하기 시작했을 때 ③으로 어긋남을 실시간으로 잡습니다. 문서에 대한 팀의 신뢰가 자라는 만큼 자동화 수준을 한 단계씩 올리는 셈입니다.

세 방식 모두 밑바탕은 claude -p 한 줄입니다. 대화 세션에 사람이 앉아 있어야만 코딩 에이전트를 쓸 수 있는 게 아니라, CI 파이프라인이 대신 호출하게 만들면 문서 갱신 같은 반복 작업을 사람 손에서 떼어낼 수 있습니다. acquire-codebase-knowledge로 문서를 한 번 만드는 것이 시작이라면, 그 문서를 코드와 함께 살아 있게 유지하는 것은 이 세 방식의 몫입니다. 같은 claude -p로 문서 갱신을 넘어 릴리즈 노트 검수처럼 사람의 판단이 필요한 일까지 파이프라인에 맡기는 방법은 다음 글에서 다룹니다.

  1. Anthropic, Claude Code CLI reference, Claude Code Docs.

  2. GitLab, CI_PIPELINE_SOURCE predefined variable, GitLab Docs.

이 글은 모던웹연구소 (www.modernweblabs.com)에서 처음 발행되었습니다. © 모던웹연구소. 무단 전재 및 재배포를 금합니다.

공유

뉴스레터

엔터프라이즈 현장 전문가들이 검증한 노트, 격주 발행.

Claude Code, GitHub Copilot, AI 네이티브 엔지니어링 전략과 도입 사례를 격주로 정리해 보내드립니다.

스팸 없음. 언제든 수신 거부 가능.

MW

모던웹연구소 · 컨설팅 안내

글을 읽었다면, 다음은 팀에 이식할 차례입니다.

이 글에서 다룬 방식을 우리 팀에 어떻게 적용할지, 짧은 대화부터 시작하면 됩니다.

함께할 수 있는 일

  • Claude Code · GitHub Copilot

    2일 핸즈온 + AI 채점 기반 사내 인증

  • AI 네이티브 전략

    운영 표준·측정·거버넌스 재설계

  • 웹 플랫폼

    Next.js 기반 풀스택 서비스 구축