막혔을 때: 화면을 찍어서 던진다
자동 배포는 걸었습니다. 그런데 배포가 되지 않았습니다. 오류 메시지를 옮겨 적을 수도, 로그를 복사할 수도 없는 웹 화면 안에만 있는 문제 입니다. 이럴 때 가장 빠른 방법은 — 그 화면을 그대로 찍어서 던지는 것입니다.
이 레슨은 6분짜리입니다. 그런데 이 6분에 “막혔을 때 어떻게 푸는가”가 통째로 들어 있습니다. 화면 캡처 한 장, 글자 두 단어로 시작해서 원인 진단과 수정, 재배포까지 끝납니다.
설명하지 말고 보여 준다
화면에 뜬 오류를 “옮겨 적으려” 하지 마세요. 캡처해서 붙여넣는 편이 빠르고 정확합니다. Claude Code는 이미지를 읽습니다.
겉의 원인과 진짜 원인
화면에는 “요금제를 올리세요”라고 적혀 있었습니다. 그런데 진짜 원인은 다른 데 있었고, 돈을 쓰지 않고 해결됐습니다.
앞에서 심은 씨앗
2교시에서 설정한 커밋 이메일 이 여기서 문제를 일으킵니다. 그때 대수롭지 않게 넘긴 한 줄이 배포를 막았습니다.
① 되긴 됐는데, 안 됐다
1. 터미널은 “빌드 중”이라고 합니다

푸시가 자동 배포를 걸었고, 완료될 때까지 기다리겠다고 합니다. 여기까지는 정상입니다. 하지만 “트리거됐다”와 “배포됐다”는 다릅니다.
2. 대시보드를 열어 보니 차단돼 있습니다

Vercel 대시보드에 Deployment Blocked 가 떠 있습니다. 요약하면 “커밋 작성자가 이 프로젝트에 기여할 권한이 없다. 무료 플랜은 비공개 저장소 협업을 지원하지 않는다”이고, 화면에는 큼직한 Upgrade to Pro 버튼이 있습니다.
여기서 결제 버튼을 누르면 이 수업은 끝납니다. 그런데 잠깐 — 이 프로젝트에 “협업자”가 있었나요? 혼자 만든 앱입니다. 화면이 말하는 원인과 실제 상황이 맞지 않습니다. 맞지 않는다고 느껴지면 그게 물어볼 신호 입니다.
3. 화면을 그대로 찍습니다

Windows에서는 ⊞ Win + Shift + S (macOS는 ⌘ + Shift + 4 )로 필요한 영역만 잘라 찍습니다. 오류 문구, 상태, 그리고 “누가 만든 배포인지”까지 한 장에 담기게 찍는 것이 좋습니다.
4. 하던 대화를 이어서 씁니다

터미널을 닫았다면 다시 claude 를 실행하면 됩니다. 화면에 “이 세션을 이어서 하려면”이라며 재개 명령을 알려 줍니다.
claude --resume이어서 하면 지금까지의 맥락이 그대로 남아 있어서 “무엇을 만들었고 어디까지 했는지”를 다시 설명할 필요가 없습니다.
② 붙여넣고, 두 단어
5. 이미지를 입력창에 붙여넣습니다

캡처한 뒤 입력창에서 Ctrl + V 로 붙여넣으면 [Image #1] 이라는 표시가 생깁니다. 이미지가 실제로 첨부됐다는 뜻입니다.
6. 설명은 두 단어면 충분합니다

붙여넣은 뒤 적은 말은 “Block됨” 이 전부입니다. 상황을 장황하게 설명할 필요가 없습니다. 화면에 다 적혀 있고, 지금까지의 맥락은 대화에 남아 있으니까요. 사람에게 화면을 보여 주며 “이거 왜 이래?”라고 묻는 것과 똑같습니다.
언제 캡처를 쓰는 게 좋은가
복사할 수 없는 웹 화면의 오류, 레이아웃이 깨진 화면, 그래프나 대시보드 수치, 설정 화면의 토글 상태 — “글로 옮기면 뉘앙스가 사라지는 것” 은 전부 캡처가 낫습니다. 반대로 터미널 로그처럼 복사가 되는 것은 텍스트로 붙여넣는 편이 정확합니다.
③ 겉의 원인 말고 진짜 원인
7. 화면을 읽고, 그 너머를 짚습니다

진단은 두 단계로 나옵니다.
- 화면에 적힌 것 — 커밋 작성자에게 기여 권한이 없고, 무료 플랜은 비공개 저장소 협업을 지원하지 않는다.
- 실제 원인 — 커밋 author 이메일을 개인 메일 주소로 설정해 뒀는데, 그 주소가 Vercel에 연결된 GitHub 계정과 매칭되지 않았다. 그래서 시스템이 “남이 만든 커밋”으로 본 것이다.
그리고 결론이 붙습니다 — “Pro 업그레이드 없이 해결하려면 커밋 author를 GitHub 계정과 일치시키면 됩니다.” 화면이 권한 대로 결제 버튼을 누르는 대신, 조건을 다시 읽어 우회로를 찾은 것입니다.
2교시에서 심어 둔 씨앗이 이겁니다. 그때 커밋 이메일을 설정하면서 “이 이메일이 나중에 한 번 더 문제를 일으킨다”고 적어 뒀습니다. Git 커밋의 author 이메일은 단순한 표기가 아니라, 여러 서비스가 “누구의 작업인지”를 판단하는 열쇠 입니다.
8. 올바른 이메일을 찾아 고칩니다

GitHub 계정이 실제로 인정하는 식별용 이메일(noreply 주소)을 조회한 뒤, 그 값으로 커밋 설정을 바꾸고 새 커밋을 만들어 올립니다. “이 커밋은 내가 만든 것”이라고 시스템이 알아볼 수 있는 형태 로 맞춰 준 것입니다.
noreply 이메일이란 — GitHub이 계정마다 발급하는 “공개해도 되는” 이메일 주소입니다. 커밋에 개인 메일 주소를 그대로 남기면 저장소를 공개했을 때 주소가 노출됩니다. noreply 주소를 쓰면 신원 확인은 되면서 실제 메일 주소는 감춰집니다.
④ 다시 올리고, 확인
9. 차단된 배포와 새 배포가 나란히 보입니다

대시보드에 두 줄이 남습니다 — 아래는 Blocked 로 막힌 이전 배포, 위는 Building 으로 도는 새 배포. 무엇을 바꿨더니 무엇이 달라졌는지가 한눈에 보입니다.
10. 이번에는 통과합니다

author를 고친 커밋을 올리자 새 배포가 걸리고, 이번에는 차단되지 않습니다. 요금제를 올리지 않고 해결됐습니다.
⑤ 완성 — 인터넷에 올라간 내 앱
11. 진짜 주소로 열립니다

이제 localhost 가 아니라 인터넷 주소입니다. 이 주소는 누구에게나 보낼 수 있습니다. 폰으로 열어도 됩니다.
12. 새 사람이 가입합니다

다른 이메일로 가입해 봅니다. 내 컴퓨터가 아니라 인터넷에 올라간 서비스에서 실제로 계정이 만들어집니다.
13. 대화가 됩니다

두 사람이 주고받는 대화가 그대로 흐릅니다. 처음 프롬프트에 적었던 “가족 단톡방”이 완성된 순간입니다.
14. 로컬에서 보낸 메시지가

내 컴퓨터의 개발 서버에서 메시지를 씁니다. 주소는 다르지만 바라보는 데이터베이스는 같습니다.
15. 배포된 사이트에 실시간으로 나타납니다

로컬에서 보낸 메시지가 인터넷 주소의 화면에 바로 올라옵니다. 프런트엔드는 둘, 백엔드는 하나 — 8장에서 배운 구조가 눈앞에서 확인되는 장면입니다.
이번 레슨에서 남길 것
- 설명하지 말고 보여 줘라 — 화면에만 있는 문제는 캡처해서 붙여넣으세요. 옮겨 적는 것보다 빠르고 정확합니다.
- 말은 짧아도 된다 — 이미지 한 장에 “Block됨” 두 단어면 충분했습니다. 맥락은 이미 대화에 남아 있습니다.
- 복사되는 건 텍스트로, 안 되는 건 이미지로 — 터미널 로그는 붙여넣기가 정확하고, 웹 화면·레이아웃·설정 상태는 캡처가 낫습니다.
- 화면이 말하는 원인이 진짜 원인이 아닐 때가 있다 — “요금제를 올리세요”가 답이 아니었습니다. 상황과 안 맞으면 결제 버튼을 누르기 전에 한 번 물어보세요.
- 커밋 author 이메일은 신분증이다 — 여러 서비스가 이 값으로 “누구의 작업인지”를 판단합니다. GitHub의 noreply 주소를 쓰면 신원 확인은 되고 개인 메일은 감춰집니다.
- 대화는 이어 쓸 수 있다 — 터미널을 닫았어도 세션을 재개하면 맥락이 남아 있습니다. 처음부터 다시 설명하지 마세요.
- “트리거됐다”는 “배포됐다”가 아니다 — 마지막 확인은 항상 실제 주소를 열어 보는 것입니다.
부록 2를 마치며
폴더 하나에서 시작해, 프롬프트 하나로 앱을 만들고, GitHub에 올리고, 인터넷에 배포하기까지 — 전부 터미널 안에서 끝냈습니다. 사람이 한 일을 세어 보면 얼마 되지 않습니다. 프롬프트 하나, 승인 몇 번, 로그인 두 번, 방향을 되잡는 한 줄 , 그리고 화면 캡처 한 장.
그런데 이 “얼마 안 되는 일”이 전부입니다. AI가 우회로로 새려 할 때 붙잡고, 같은 벽에 반복해 부딪힐 때 끊고, 화면이 시키는 대로가 아니라 실제 상황에 맞게 판단하는 것 — 이것이 1장에서 말한 “오케스트라의 지휘자” 가 실제로 하는 일입니다.
강의로 이어서 보고 싶다면
이 부록에서 만든 앱은 5장에서 만든 바로 그 단톡방 입니다. 여기서는 Claude Code로, 5장에서는 AI 편집기(Cursor)로 만들었을 뿐입니다. 같은 앱을 만드는 전 과정을 영상 강의로 처음부터 보고 싶다면 아래 인프런 강의에서 이어서 볼 수 있습니다.
