Devin.KR

병렬 작업과 자동화 - worktree·통합·CI

개발자KR 조회 1

이 장에서 배우는 것

작업 공간을 분리하고 파일 소유 범위·통합 순서·검사 명령을 정해 동시 작업의 충돌을 관리한다.

분담보다 먼저 파일 경계를 정한다

대출 요약 도구에서 파서와 도움말을 동시에 고친다고 하자. 파서 작업은 parser.py와 그 검사, 도움말 작업은 README.md만 수정하도록 범위를 나눈다. 두 작업이 같은 파일을 만져야 한다면 선행 변경을 먼저 통합하거나 담당자를 하나로 정한다. 두 작업자가 서로의 메시지를 봤다는 사실만으로 충돌이 없어지지는 않는다.

Git worktree는 한 저장소에 추가 작업 디렉터리를 만들 수 있게 한다. 작업 폴더가 분리되어도 Git 저장소의 일부 관리 정보는 공유된다. 데이터베이스, 같은 포트, 전역 캐시, 외부 파일 같은 실행 자원까지 자동으로 격리해 주는 것은 아니다. 특히 실제 서비스 DB를 쓰는 검사는 작업 폴더가 다르다고 안전해지지 않는다.

로컬 더미 저장소로 분리와 통합을 시험한다

교재의 worktree-smoke.sh는 새 임시 폴더에서 Git 저장소를 만들고 parser와 docs 브랜치에 각각 파일을 커밋한다. 기본 브랜치에 둘을 순서대로 병합한 뒤 파일 내용과 깨끗한 상태를 확인한다. 네트워크·원격 push·기존 저장소 초기화는 하지 않는다. 실습 경로를 출력해 결과를 직접 확인할 수 있게 한다.

실제 협업에서는 통합할 커밋과 검사 결과를 함께 넘긴다. 서로 다른 파일이라 Git 병합에 충돌이 없더라도 기능 계약이 달라질 수 있다. 파서의 반환값을 바꾸면 도움말 예제나 호출부가 틀릴 수 있으므로 통합된 상태에서 검사를 다시 실행한다. 각 분담자의 단위 검사 통과와 통합 성공은 다른 단계다.

CI에서는 실행 조건을 기록한다

비대화형 에이전트 작업을 CI에 넣을 때는 모델 결과뿐 아니라 변경 내역, 실행 로그, 종료 상태를 회수해야 한다. 이 장의 예제는 에이전트를 호출하지 않고 Git 분리·통합 과정을 고정 절차로 시험한다. 단순한 검사로 충분한 일을 굳이 모델 호출로 바꿀 필요는 없다.

동시 작업 수는 CPU와 메모리뿐 아니라 검수할 수 있는 변경량에 맞춰 정한다. 몇 개가 언제나 최적이라는 수치는 제시하지 않는다. 출력이 밀리거나 통합 검토가 지연되면 작업을 더 나누기보다 진행 중인 작업을 끝내는 편이 나을 수 있다. 완료 판정과 중단 조건을 먼저 정하는 것이 자동화의 일부다.

작업 공간을 분리하고 파일 소유 범위·통합 순서·검사 명령을 정해 동시 작업의 충돌을 관리한다.
개념을 관찰 항목 세 가지로 나누어 본다.
작업에서 구분할 항목
항목관찰·기대값판단할 때 주의
작업 폴더worktree로 분리DB·포트는 별도 격리
소유 범위수정 파일과 계약 지정같은 파일은 순서 조율
통합 검사병합된 코드로 실행분담 결과만으로 완료 금지

완성 코드

다음 파일을 worktree-smoke.sh로 저장한 뒤 bash worktree-smoke.sh로 실행한다. 새 임시 경로만 사용하고 검토를 위해 결과 폴더를 남긴다. Git과 Python 3이 필요하다.

#!/usr/bin/env bash
# 새 임시 저장소 안에서만 실행. 결과 검토를 위해 폴더를 남긴다.
set -euo pipefail
practice_dir=$(mktemp -d "${TMPDIR:-/tmp}/devinkr-worktree.XXXXXX")
git init -q -b main "$practice_dir/main"
cd "$practice_dir/main"
git config user.name 'Book Practice'
git config user.email 'practice@example.invalid'
git config commit.gpgsign false
printf '%s\n' '대출 요약 연습' > README.md
git add README.md
git commit -qm '연습 시작'
git worktree add -q -b parser "$practice_dir/parser"
git worktree add -q -b docs "$practice_dir/docs"
printf '%s\n' 'def count_rows(rows):' '    return len(rows)' > "$practice_dir/parser/parser.py"
git -C "$practice_dir/parser" add parser.py
git -C "$practice_dir/parser" commit -qm '파서 함수'
printf '%s\n' '대출 요약 연습' '입력은 더미 데이터만 사용한다.' > "$practice_dir/docs/README.md"
git -C "$practice_dir/docs" add README.md
git -C "$practice_dir/docs" commit -qm '실습 안내'
git merge -q --no-edit parser
git merge -q --no-edit docs
PYTHONDONTWRITEBYTECODE=1 python3 -c 'from parser import count_rows; assert count_rows([1, 2]) == 2'
test -z "$(git status --porcelain)"
printf 'PASS: 분리된 두 작업을 통합했습니다. 연습 경로: %s\n' "$practice_dir"

실행 결과

정상 종료하면 PASS: 분리된 두 작업을 통합했습니다. 문장과 임시 연습 경로가 출력된다. Git의 종료 코드가 0이고 통합 저장소의 git status --porcelain 결과가 비어 있는지도 스크립트가 확인한다. 실제 경로는 실행할 때마다 달라지며 결과 폴더는 직접 검토할 수 있도록 남는다.

직접 해 보기

동봉 worktree-smoke.sh를 개인 PC에서 실행한다. 출력된 임시 저장소에서 git log --oneline --all과 git worktree list를 읽는다. 두 작업이 서로 다른 파일을 바꿔도 호출 계약이 어긋나는 사례를 하나 적는다.

텍스트 병합과 기능 통합 구분
병합 충돌 없음 상황에서 확인과 판정을 분리한다.

해설과 확인 기준

예를 들어 파서가 목록 대신 사전을 반환하도록 바뀌었는데 도움말의 호출 예제는 목록 합계를 구하면 텍스트 병합은 성공해도 프로그램 계약이 깨진다. 통합 후 예제를 실행하는 검사가 필요하다. worktree가 분리한다고 외부 DB까지 분리된다고 답하면 틀리다.

장 끝 확인표
질문완료 증거
핵심 구분을 설명할 수 있는가분리와 개별 검증의 차이를 자기 말로 설명
실습의 판단 근거가 있는가반환값·호출 계약 검사의 관찰 기록
확인하지 않은 부분을 구분했는가출처 확인·실행 확인·미확인 상태를 구분

근거와 기준일

제품·자료 확인일: 2026-11-08. 설명 틀·대출 도구·연습·해설은 교재의 자체 구성이다. 제품별 세부 조건은 아래 공식 문서에서 해당 실행 방식과 계정 범위를 다시 확인한다.

댓글 0

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

댓글을 남기려면 로그인이 필요합니다.