05. 막혔을 때
이 페이지는 사람들이 가장 자주 멈추는 자리를 모아 둔 곳입니다. 본인이 보고 있는 증상과 가까운 항목을 찾아 그 아래의 안내를 따라가 보세요. 이 페이지에 없는 증상이라면 에러 메시지를 그대로 복사해서 Claude Code에 붙여 넣고 "이거 어떻게 고쳐?" 라고 물으면 다음에 시도할 만한 한 수가 보통 따라옵니다.
환경 설정에서 막힐 때
Node가 설치되지 않습니다
대개 nvm install 20 이 도중에 멎거나 그냥 실패한 상태입니다.
macOS와 Linux에서는 새 터미널을 열고 command -v nvm 을 실행해 봅니다. 출력이 비어 있다면 nvm 자체는 설치됐지만 셸 시작 파일(.zshrc 또는 .bashrc)에 로더가 안 들어간 상태입니다. nvm 설치 출력 끝부분에 적혀 있던 두 줄(export NVM_DIR="$HOME/.nvm" ...)을 그 파일 안에 손으로 붙여 넣고 새 터미널을 엽니다.
Windows에서는 WSL2 설치를 끝까지 마쳤는지 다시 한번 확인합니다. 이 가이드의 명령은 PowerShell에서 동작하지 않습니다. 모든 단계는 WSL2 위 Ubuntu 셸 안에서 실행해야 합니다.
node --version 이 v20보다 낮은 숫자를 출력합니다
여러 Node 버전이 깔려 있고 시스템 기본이 옛 버전을 가리키는 상태입니다.
nvm use 20
nvm alias default 20
이 두 줄을 실행한 다음 새 터미널을 열고 node --version 을 다시 확인합니다.
pnpm install 이 권한 에러로 실패합니다
EACCES 또는 permission denied 가 보인다면 npm 글로벌 설치 위치 권한이 가장 흔한 원인입니다. 이 base는 글로벌 설치가 필요 없으니 다음을 순서대로 시도해 봅니다.
sudo로 다시 시도하지 마세요. 보통 문제를 더 키웁니다.- 이전 시도에서 만들어진
node_modules/가 있다면 지우고 다시:rm -rf node_modules pnpm-lock.yaml. - 그래도 안 풀리면 nvm으로 깐 Node를 다시 설치:
nvm uninstall 20 && nvm install 20.
init.sh 가 멈췄습니다
bash init.sh 가 도중에 멈춘 자리는 화면에 마지막으로 출력된 줄이 알려 줍니다.
| 어디서 멈췄나 | 어디를 보면 되나 |
|---|---|
pnpm install 자리 | 위의 "pnpm install이 권한 에러로 실패합니다" 항목 |
pnpm run typecheck 자리 | 타입 에러 출력을 복사해 Claude Code에 붙여 넣습니다. 보통 원인은 tsconfig.json 의 path alias 불일치이거나 의존성 버전 불일치입니다. |
pnpm run build 자리 | 빌드 로그를 끝까지 읽어 봅니다. CRXJS 에러가 보인다면 manifest.config.ts 의 entry-point 경로가 틀린 경우가 가장 많습니다. |
Chrome이 확장을 로드하지 못합니다
"압축해제된 확장 프로그램을 로드합니다" 에서 내 폴더가 안 보입니다
dist/ 폴더를 가리켜야 합니다. 빌드를 아직 한 번도 안 돌렸다면 pnpm run build 부터 실행하세요. 폴더는 보이는데 회색으로 흐릿하게 떠서 못 고른다면 dist/ 안에 manifest.json 이 있는지 확인합니다. 없으면 빌드가 끝까지 가지 못한 상태입니다.
"manifest 파일이 누락되었거나 읽을 수 없습니다"
dist/manifest.json 이 생성되지 않았거나 깨진 상태입니다. pnpm run build 를 다시 실행하고 빌드 로그에서 누락된 에러가 없는지 확인합니다.
확장은 로드됐는데 아이콘이 안 보입니다
Chrome 우측 상단의 퍼즐 모양 아이콘을 누르면 설치된 확장 목록이 펼쳐집니다. 거기서 본인 확장을 찾아 핀 아이콘을 누르면 툴바에 고정됩니다.
첫 실행이 아무 반응도 없습니다
사이드패널이 안 열립니다
먼저 Chrome 버전이 114 이상인지 확인합니다 (chrome://version). sidepanel API는 Chrome 114에 들어왔습니다. 버전이 충분한데도 안 열린다면 manifest.json 을 열어 permissions 배열에 sidePanel 이 있는지 확인합니다. 빠져 있다면 트리거 UI 모드 설정이 반영되지 않은 상태입니다.
"Analyze and send" 가 콘솔에 아무것도 안 찍습니다
옵션 페이지(chrome://extensions → 본인 확장 → 세부정보 → 확장 프로그램 옵션)에서 백엔드 모드가 console-log 로 설정돼 있는지 먼저 확인합니다.
다음으로, 어느 콘솔을 보고 있는지가 처음에 흔히 헷갈리는 자리입니다. 사이드패널 자체의 콘솔은 사이드패널 안에서 우클릭 → "검사" → Console 탭으로 들어갑니다. background service worker는 콘솔이 따로 있습니다. chrome://extensions 의 본인 확장 카드에서 세부정보를 누른 다음 "Service Worker" 링크를 클릭하면 따로 떠오릅니다. 분석된 페이로드는 보통 background 콘솔 쪽에 찍힙니다.
백엔드 연결에서 막힐 때
401 또는 403 에러
supabase-direct 라면 Supabase의 Settings → API 페이지에서 anon key (anon public 행)를 다시 복사합니다. service_role 키는 절대 확장 안에서 쓰지 마세요. 이 키는 데이터에 전권을 가지므로 확장에 박아 배포하는 순간 보안 사고가 됩니다.
server-relay 라면 토큰 끝에 공백이나 줄바꿈이 따라 붙었는지 확인합니다. 옵션 페이지에 붙여 넣을 때 흔한 원인입니다.
Supabase에 데이터가 들어오지 않습니다
Table Editor를 열고 page_contents 가 실제로 존재하는지 먼저 확인합니다. SQL Editor에서 만든 테이블이 다른 스키마에 들어가 있을 수 있으니 public 스키마인지 확인하세요. 이상이 없다면 Authentication → Policies 로 가서 만들어 둔 RLS 정책이 INSERT를 허용하는지 확인합니다. 둘 다 정상이라면 DevTools의 Network 탭을 열고 supabase.co 로 향한 요청의 응답 본문을 읽어 봅니다. 거절된 이유가 거기 적혀 있습니다.
CORS 에러 — server-relay 전용
서버가 확장의 origin을 허용해야 합니다. 확장의 origin은 chrome-extension://<extension-id> 이고, extension-id는 chrome://extensions 의 본인 확장 카드에 표시됩니다. 그 origin을 서버의 Access-Control-Allow-Origin 에 추가합니다. private 배포 가정 아래라면 모든 chrome-extension:// origin을 허용해도 됩니다.
빌드와 패키징에서 막힐 때
pnpm run package 가 zip을 못 만듭니다
pnpm run build 가 먼저 정상으로 끝나야 합니다. dist/ 폴더가 없거나 비어 있으면 package가 만들 자리가 없습니다. 빌드 로그를 끝까지 읽고, 에러가 보이면 그 메시지를 Claude Code에 붙여 넣습니다.
dev 서버가 갑자기 안 뜹니다
pnpm run dev 실행 시 포트가 이미 사용 중이라는 메시지가 보일 수 있습니다. 이전에 실행해 둔 dev 서버가 종료되지 않은 경우입니다. 새 터미널을 열고 lsof -ti:5173 | xargs kill 같은 명령으로 그 포트를 잡고 있는 프로세스를 종료한 다음 다시 실행하세요. 포트 번호가 5173이 아닐 수 있으니 화면의 메시지를 한 번 더 확인합니다.
코드를 수정했는데 확장에 반영이 안 됩니다
크게 두 가지 자리를 의심해 봅니다. 먼저 dev 서버가 돌고 있는지 확인하세요. pnpm run dev 가 멎어 있다면 새 빌드가 떨어지지 않은 상태입니다. 다음으로 background service worker는 자동 리로드가 다른 진입점보다 늦게 따라옵니다. chrome://extensions 의 본인 확장 카드에서 새로고침 아이콘을 한 번 누르면 강제로 재기동됩니다.
content script 수정은 페이지를 새로고침해야 반영되는 경우가 많습니다. 같은 탭에서 F5를 누르면 새 content script가 다시 주입됩니다.
권한 변경 후 자동으로 비활성화됩니다
Chrome이 manifest의 권한이 바뀐 것을 감지하면 사용자에게 다시 동의를 받기 위해 확장을 일시적으로 비활성화합니다. chrome://extensions 에서 본인 확장 카드를 보고 토글이 꺼져 있다면 다시 켭니다. 새 권한에 대한 안내가 한 번 뜨면 동의를 누른 다음 정상 동작합니다.
확장 ID가 갑자기 바뀌었습니다
이런 일이 생기면 거의 항상 .crx 패키징 키 (.pem)가 바뀌었거나 unpacked 로 다시 로드한 경우입니다. unpacked로 로드된 확장은 폴더 경로 기반으로 ID가 정해지고, 다른 폴더로 옮기면 새 ID가 됩니다. self-host .crx 배포 중이라면 06-distribution의 ".pem 키 만들기와 보관" 항목을 다시 확인하세요. 같은 키로 같은 폴더에서 패킹해야 ID가 유지됩니다.
그 밖에
이 페이지에 같은 증상이 없다면 두 가지를 더 시도해 볼 수 있습니다.
먼저, 에러 메시지 전체를 복사해 Claude Code에 붙여 넣고 "이거 고쳐 줘" 라고 입력합니다. 다음에 시도할 한 수를 보통 잘 짚어 줍니다.
그래도 풀리지 않는다면 GitHub 이슈를 열거나 팀 Slack에 글을 올립니다. 다음 세 가지를 함께 적어 주세요.
- 어디서 막혔는지 (어느 파일, 어느 명령)
- 에러 메시지 전체
- 환경 정보 (macOS / Linux / Windows, Node 버전, Chrome 버전)