35단계여러 일을 동시에: 작업 트리와 클라우드
서로 부딪히지 않게 일을 나눠 맡기고, 결과는 PR로 받아 사람이 확인한 뒤 합칩니다.
걸리는 시간 · 읽기 약 12분 · 따라 하기 약 60분 · 난이도 ★★★ 심화
이 단계를 마치면
- Local, Worktree, Cloud 세 실행 위치의 차이를 설명하고 일에 맞게 고를 수 있습니다.
- 저장소 하나에 클라우드 환경을 만들고, 인터넷 접근을 필요한 만큼만 열 수 있습니다.
- 두세 가지 작업을 나란히 맡기고, 결과를 diff와 PR로 받아 직접 확인한 뒤 합칠 수 있습니다.
제3부에서는 폴더 하나를 열고 에이전트에게 한 가지씩 맡겼습니다. 작업이 끝날 때까지 화면을 지켜보다가, 끝나면 다음 일을 시켰습니다. 그런데 고칠 것이 세 가지라면 어떨까요? 안내 문구 수정, 내려받기 기능, 휴대폰 화면 정리를 한 폴더에서 동시에 시키면 서로의 변경이 뒤섞입니다. 하나씩 하자니 하루가 갑니다. 여러분이라면 어떻게 나누시겠습니까?
Codex에는 이 문제를 푸는 방법이 있습니다. 작업을 어디서 돌릴지 고르는 것입니다. 이 단계에서는 세 가지 실행 위치를 비교하고, 클라우드에서 여러 작업을 나란히 돌린 뒤 결과를 PR로 받는 순서를 익힙니다.
세 가지 실행 위치
ChatGPT 데스크톱 앱 안의 Codex는 작업을 시작할 때 실행 위치를 셋 가운데 하나로 고릅니다. 공식 문서의 이름을 그대로 쓰면 Local, Worktree, Cloud입니다.
| 실행 위치 | 어디서 도나 | 원래 폴더에 주는 영향 | 어울리는 일 |
|---|---|---|---|
| Local | 지금 연 폴더 | 파일이 바로 바뀝니다 | 한 가지 일을 지켜보며 할 때 |
| Worktree | Git 워크트리로 떼어 낸 별도 작업 공간 | 원래 폴더는 그대로 있고, 변경은 따로 모입니다 | 내 컴퓨터에서 두 가지 이상을 나란히 할 때 |
| Cloud | OpenAI의 클라우드 컨테이너 | 내 폴더는 건드리지 않고, 결과가 diff와 PR로 돌아옵니다 | 오래 걸리는 일, 여러 일을 한꺼번에 맡길 때 |
Local은 32~34단계에서 해 본 방식입니다. 지금 연 폴더에서 에이전트가 파일을 읽고 고칩니다. 가장 단순하지만 한 폴더에서 두 작업을 동시에 돌리면 서로의 변경이 섞입니다.
Worktree는 Git이 원래 가진 기능을 씁니다. 워크트리(worktree)는 같은 저장소를 폴더 여러 개로 펼쳐 두고, 폴더마다 다른 브랜치를 올려 두는 방법입니다. 26단계에서 브랜치를 "원본을 건드리지 않는 연습장"으로 설명했는데, 워크트리는 그 연습장을 아예 다른 책상에 펼쳐 두는 셈입니다. 한 작업이 파일을 고치는 동안 다른 작업은 다른 책상에서 일하니 서로 섞이지 않습니다. 다만 두 작업 모두 내 컴퓨터에서 돌고, Codex의 사용량도 그만큼 씁니다.
Cloud는 작업을 OpenAI의 클라우드 컨테이너로 보냅니다. 작업마다 따로 만든 환경에서 돌기 때문에 여러 작업을 동시에 맡길 수 있고, 같은 일을 여러 번 시도하게 해서 결과를 비교할 수도 있습니다. 결과는 요약과 diff로 돌아오고, 검토한 뒤 추가 지시를 하거나 PR을 엽니다.
데스크톱 앱과 IDE 확장에는 /local, /worktree, /cloud처럼 실행 위치와 같은 이름의 명령이 있습니다. 화면에서 고르는 위치는 버전마다 달라질 수 있으니, 버튼이 안 보이면 이 명령 이름으로 공식 문서를 찾아보십시오. 터미널을 쓴다면 codex cloud로 클라우드 작업 화면을 열고, codex cloud exec로 작업을 보내고, codex cloud list로 목록을 봅니다.
클라우드 환경과 인터넷 접근
클라우드를 쓰려면 먼저 몇 가지가 갖춰져야 합니다. 클라우드는 ChatGPT 계정으로 로그인했을 때만 쓸 수 있고, API 키 로그인으로는 쓸 수 없습니다. 요금표 기준으로 웹과 클라우드 연동은 Plus 요금제부터 들어 있습니다. 이메일과 비밀번호로 가입한 계정이라면 2단계 인증(MFA)을 먼저 켜야 합니다.
준비가 되면 순서는 이렇습니다. chatgpt.com/codex에 로그인하고 GitHub를 연결합니다. 환경 설정 화면(chatgpt.com/codex/settings/environments)에서 저장소마다 환경을 하나씩 만듭니다. 환경은 "이 저장소의 작업을 어떤 조건의 컴퓨터에서 돌릴지"를 적어 둔 설정입니다.
클라우드 작업이 도는 과정을 알아 두면 막혔을 때 원인을 찾기 쉽습니다.
- 작업용 컨테이너를 만들고 저장소의 브랜치를 가져옵니다.
- 설정 스크립트를 실행합니다. 필요한 프로그램을 설치하는 단계입니다.
- 인터넷 접근 설정을 적용합니다.
- 에이전트가 명령을 실행하며 일합니다.
- 답변과 diff를 보여 줍니다.
기본 이미지는 universal이고, 만든 컨테이너는 최대 12시간 캐시되어 다음 작업이 더 빨리 시작됩니다. 환경 변수는 작업 내내 쓸 수 있지만, 시크릿(인증키처럼 숨겨야 하는 값)은 설정 스크립트 단계에서만 쓰이고 에이전트가 일하기 전에 지워집니다. 에이전트가 인증키를 들고 바깥 서비스를 부르는 시험은 클라우드에서 할 수 없다는 뜻입니다. 이 제약은 오히려 안전장치입니다.
인터넷은 에이전트 단계에서 기본으로 막혀 있습니다. 설정 스크립트 단계에서만 인터넷을 씁니다. 환경마다 Off와 On을 고를 수 있고, On으로 두면 허용할 도메인 목록(None, Common dependencies, All)과 허용할 HTTP 메서드를 정합니다. 메서드는 읽기에 해당하는 GET, HEAD, OPTIONS만 허용하도록 좁힐 수 있습니다. 공식 문서는 인터넷을 열면 웹 페이지에 숨은 지시에 에이전트가 휘둘리는 프롬프트 인젝션과, 코드나 자료가 바깥으로 새는 유출 위험이 생긴다고 경고합니다. 7단계의 원칙을 여기에도 적용합니다. 처음에는 Off로 두고, 설치할 것은 설정 스크립트로 옮깁니다. 그래도 인터넷이 필요하면 Common dependencies와 읽기 메서드만 허용하는 데서 시작합니다.
클라우드 작업도 AGENTS.md를 읽습니다. 공식 문서에 따르면 lint와 테스트 명령을 AGENTS.md에서 찾아 씁니다. 33단계에서 적은 "끝났다고 말하기 전에 할 확인"이 클라우드 작업에도 그대로 전해진다는 뜻입니다.
나란히 맡기고 PR로 받기
여러 작업을 동시에 맡길 때 가장 중요한 원칙은 하나입니다. 작업끼리 같은 파일을 건드리지 않게 나눕니다. 두 작업이 같은 파일의 같은 부분을 고치면, 나중에 합칠 때 충돌이 납니다. 충돌을 푸는 일은 비개발자에게 가장 어려운 일 가운데 하나입니다. 그래서 나누기 전에 에이전트에게 먼저 묻습니다. "이 세 가지 일이 각각 어떤 파일을 건드리는지, 겹치는 파일이 있는지 알려 줘."
작업 하나에 PR 하나를 원칙으로 합니다. PR이 작으면 읽기도 쉽고, 문제가 생겼을 때 그 PR만 되돌리면 됩니다. 같은 일을 여러 번 시도하게 하는 기능은 화면 시안처럼 정답이 하나로 정해지지 않는 일에 쓰면 좋습니다. 두 결과를 나란히 놓고 고른 쪽만 PR로 엽니다.
결과가 돌아오면 요약부터 읽고, 다음으로 diff를 봅니다. 요약에 "완료했습니다"라고 적혀 있어도 30단계의 표대로 나눠 읽습니다. 바뀐 파일 목록에 시키지 않은 파일이 있는지, 테스트를 실제로 돌렸는지 아니면 돌리지 못했는지를 확인합니다. 내 컴퓨터에서 직접 돌려 보고 싶으면 codex apply로 클라우드 결과를 로컬 폴더에 적용합니다. 적용하기 전에 새 브랜치로 옮기고 git status가 깨끗한지 확인해 두는 편이 안전합니다.
마지막으로 비용입니다. 로컬 작업과 클라우드 작업은 같은 사용량 한도를 나눠 씁니다. 작업을 동시에 여러 개 돌리면 한도도 그만큼 빨리 줄어듭니다. 남은 양은 사용량 대시보드(chatgpt.com/codex/settings/usage)나 CLI의 /status에서 확인합니다.
현장 장면
오세린 차장의 비품 신청 페이지에 고칠 것이 세 가지 쌓였습니다. 이번 달 신청 마감 안내 문구 바꾸기, 신청 목록을 CSV로 내려받는 버튼, 휴대폰에서 글자가 너무 작다는 불만. 예전 같으면 사흘에 나눠 했을 일입니다.
오 차장은 먼저 로컬에서 Codex에게 물었습니다. "이 세 가지가 각각 어떤 파일을 건드리는지 알려 줘. 고치지는 마." 답을 보니 문구 수정과 글자 크기가 같은 화면 파일을 건드렸습니다. 오 차장은 두 일을 하나로 묶고, 내려받기 버튼을 따로 떼어 작업 두 개로 나눴습니다.
클라우드 환경은 인터넷을 Off로 두고 만들었습니다. 두 작업을 보내고 회의에 들어갔다 나오니 결과가 와 있었습니다. 화면 작업은 깔끔했습니다. 그런데 내려받기 작업의 요약 끝에 이런 문장이 있었습니다. "필요한 패키지를 설치하지 못해 테스트를 실행하지 못했습니다." 인터넷이 막혀 있으니 에이전트 단계에서 설치가 안 된 것입니다. 오 차장은 인터넷을 켜는 대신, 설치 명령을 설정 스크립트로 옮기는 방법을 Codex에게 물었습니다. 설정 스크립트를 고친 뒤 같은 작업을 다시 보내자 이번에는 테스트까지 돌았다는 보고가 왔습니다.
오 차장은 두 결과를 각각 PR로 열었습니다. 화면 PR을 먼저 합치고 배포된 주소를 휴대폰으로 열어 글자 크기를 확인했습니다. 내려받기 PR은 CSV 파일을 엑셀로 열어 한글이 깨지지 않는지, 건수가 화면의 신청 건수와 같은지, 신청자가 부서명으로만 나오는지 맞춰 본 뒤 합쳤습니다. 그날 오후 오 차장은 AGENTS.md에 한 문장을 보탰습니다. "클라우드 작업에서 테스트를 돌리지 못했으면 요약 첫머리에 적는다."
따라 하기
- 내 도구의 로컬 폴더에서
git status로 변경 사항이 없는지 확인하고, 최신 커밋을 GitHub에 푸시합니다. 성공 기준: GitHub 화면의 최근 커밋과 내 폴더의 최근 커밋이 같습니다. - chatgpt.com/codex에 ChatGPT 계정으로 로그인하고 GitHub를 연결한 뒤, 환경 설정 화면에서 내 도구 저장소의 환경을 만듭니다. 인터넷 접근은 Off로 둡니다. 성공 기준: 환경 목록에 내 저장소가 보입니다.
- 첫 클라우드 작업으로 "이 저장소의 구조와 테스트 명령을 설명해 줘. 파일은 고치지 마."를 보냅니다. 성공 기준: 설명이 돌아오고 diff가 비어 있습니다. 설치 실패가 보이면 아래 두 번째 프롬프트로 설정 스크립트를 고칩니다.
- 고칠 것 두세 가지를 적고, 아래 첫 번째 프롬프트로 겹치는 파일이 없게 나눕니다. 성공 기준: 작업마다 건드릴 파일 목록이 있고, 서로 겹치지 않습니다.
- 나눈 작업을 클라우드로 나란히 보냅니다. 세 번째 프롬프트를 작업마다 붙입니다. 성공 기준: 작업마다 요약과 diff가 돌아오고, 테스트를 돌렸는지가 적혀 있습니다.
- 결과 하나를 골라 PR로 열고, 바뀐 파일과 확인한 방법을 PR 설명에 적은 뒤 합칩니다. 합친 뒤에는 배포된 주소에서 확인합니다. 성공 기준: 휴대폰으로 연 주소에서 바뀐 내용이 보이고, 나머지 작업도 같은 순서로 처리했습니다.
복사해 쓰는 프롬프트
이 저장소에서 아래 일들을 동시에 맡기려고 해. 아직 파일은 고치지 말고 나누는 계획만 보여 줘.
1. [할 일 1]
2. [할 일 2]
3. [할 일 3]
- 일마다 건드릴 파일 목록
- 두 일 이상이 같은 파일을 건드리면 표시하고, 겹치지 않게 다시 묶는 방법
- 일마다 끝난 뒤 내가 화면에서 확인할 방법 한두 가지
클라우드 작업에서 [실패한 설치나 명령]이 인터넷 차단 때문에 실패했어.
에이전트 단계의 인터넷은 계속 꺼 둔 채로 풀고 싶어.
설정 스크립트에 넣을 명령을 제안하고, 그 명령이 무엇을 설치하는지 한 문장씩 설명해 줘.
인증키나 비밀번호가 필요한 명령이면 따로 표시하고 넣지는 마.
[할 일 한 문장]을 해 줘.
- 고칠 파일은 [파일 목록]로 한정하고, 다른 파일이 꼭 필요하면 고치기 전에 이유를 적어 줘.
- AGENTS.md의 확인 절차를 따라 줘.
- 끝나면 요약 첫머리에 테스트를 실제로 돌렸는지, 못 돌렸다면 이유를 적어 줘.
- 내가 배포된 화면에서 확인할 순서를 세 단계 이내로 적어 줘.
막히면 이렇게
| 증상 | 원인 | 해결 |
|---|---|---|
| 클라우드 화면에 내 저장소가 안 보입니다 | GitHub 연결이 안 됐거나 환경을 만들지 않았습니다 | GitHub 연결을 확인하고 환경 설정 화면에서 저장소 환경을 만듭니다 |
| 클라우드를 쓰려는데 로그인에서 막힙니다 | API 키로 로그인했거나 MFA를 켜지 않았습니다 | ChatGPT 계정으로 로그인하고, 이메일 가입 계정이면 2단계 인증을 켭니다 |
| 패키지 설치 실패로 테스트를 못 돌렸습니다 | 에이전트 단계의 인터넷이 기본으로 막혀 있습니다 | 설치 명령을 설정 스크립트로 옮깁니다. 인터넷을 켜야 하면 Common dependencies와 읽기 메서드만 허용합니다 |
| 두 PR을 합치려니 충돌이 납니다 | 두 작업이 같은 파일을 건드렸습니다 | 하나를 먼저 합치고, 다른 작업은 최신 본줄을 기준으로 다시 맡깁니다. 다음부터는 파일 목록으로 먼저 나눕니다 |
| 사용량 한도에 금방 닿습니다 | 로컬과 클라우드가 같은 한도를 나눠 씁니다 | /status나 사용량 대시보드로 남은 양을 보고, 동시에 돌리는 작업 수를 줄입니다 |
스스로 점검
- ☐ Local, Worktree, Cloud의 차이를 원래 폴더에 주는 영향으로 설명할 수 있습니까?
- ☐ 클라우드 환경의 인터넷 접근을 Off로 두고, 필요한 설치는 설정 스크립트로 옮겼습니까?
- ☐ 나란히 맡긴 작업끼리 겹치는 파일이 없는지 먼저 확인하고, 결과를 PR로 받아 직접 확인한 뒤 합쳤습니까?
점검 해설 보기
- Local은 지금 연 폴더의 파일이 바로 바뀌고, Worktree는 원래 폴더를 두고 따로 떼어 낸 작업 공간에서, Cloud는 클라우드 컨테이너에서 돌아 결과가 diff와 PR로 온다고 말할 수 있으면 통과입니다. 헷갈리면 「세 가지 실행 위치」의 표에서 "원래 폴더에 주는 영향" 열만 다시 읽어 봅니다. 26단계의 브랜치 설명을 떠올리면 Worktree가 쉽게 이해됩니다.
- 환경 설정에서 인터넷 접근이 Off로 되어 있고, 필요한 설치 명령은 설정 스크립트에 들어 있으면 통과입니다. 설치 실패로 테스트를 못 돌렸다면 「복사해 쓰는 프롬프트」의 두 번째 프롬프트로 설정 스크립트를 고칩니다. 인터넷을 꼭 켜야 한다면 Common dependencies와 읽기 메서드만 허용하는 데서 시작합니다.
- 나란히 맡긴 작업마다 건드릴 파일 목록이 있고 서로 겹치지 않으며, 합친 뒤 배포된 주소에서 바뀐 내용을 직접 확인했으면 통과입니다. 충돌이 났다면 하나를 먼저 합치고 다른 작업을 최신 본줄 기준으로 다시 맡깁니다. 다음부터는 첫 번째 프롬프트로 나누기 계획을 먼저 받습니다.
기억할 것
- 나란히 맡기기 전에 파일 목록으로 나눕니다. 겹치는 파일이 없어야 합치기가 쉽습니다.
- 클라우드의 인터넷은 닫힌 상태에서 시작합니다. 설치는 설정 스크립트에서, 시크릿은 에이전트 단계에 들어가지 않습니다.
- 작업 하나에 PR 하나, 합친 뒤에는 배포된 주소에서 확인합니다.