에러가 터지면 어디서부터 손댈지 막막한 경험, 다들 있을 것이다. 에러 메시지만 달랑 복사해 AI에 붙여넣는 방식으로는 한계가 명확하다. 이 글은 Claude Code를 활용해 에러 감지부터 수정, 검증까지 사람 손이 최소한으로 개입되는 루프를 직접 구축하는 방법을 다룬다.
에러 로그를 통째로 넘겨야 하는 이유
에러 문구 한 줄만 복사해서 "이게 왜 안 돼요?"라고 물어보는 건 의사에게 "어딘가 아픈데요"라고 말하는 것과 같다. Claude Code가 진짜 힘을 발휘하려면 맥락 전체가 필요하다.
터미널 출력을 파이프로 파일에 저장한 뒤 Claude에 넘기는 방법이 가장 효과적이다.
# 에러 로그를 파일로 저장
npm test 2>&1 | tee error.log
# Claude Code에 통째로 넘기기
claude "error.log 파일을 읽고, 프로젝트 구조와 연결해서 근본 원인을 분석해줘"
단순히 Cannot read property of undefined 같은 문구만 전달하면 Claude는 일반론적인 답변밖에 못 한다. 스택 트레이스 전체, 직전에 실행한 명령어, 환경 변수 상태까지 함께 넘기면 "어떤 파일 몇 번째 줄에서 어떤 이유로 터졌는지"까지 정확하게 짚어낸다.
실제로 내가 Node.js 프로젝트에서 겪은 케이스다. TypeError: Cannot read properties of undefined (reading 'map') 오류가 발생했는데, 에러 메시지만 넘겼을 때는 "변수가 undefined인지 확인하세요"라는 뻔한 답변이 돌아왔다. 로그 파일 전체를 넘기자 "api/users/route.ts 47번째 줄에서 비동기 응답 전에 .map()을 호출하고 있어서 생기는 문제"라고 바로 집어냈다.
CLAUDE.md로 팀 규칙을 주입하는 방법
Claude Code가 수정 제안을 할 때 우리 팀의 규칙을 모르면 엉뚱한 방식으로 고친다. 예를 들어, 팀이 async/await 스타일을 강제하는데 Claude가 .then().catch() 체인으로 수정 제안을 내놓으면 코드 리뷰에서 다시 반려된다. 이 문제를 원천 차단하는 것이 CLAUDE.md다.
프로젝트 루트에 CLAUDE.md 파일을 만들고 아래 항목들을 명시한다.
# 프로젝트 코딩 컨벤션
## 에러 처리 규칙
- 모든 비동기 함수는 try/catch로 감싼다
- catch 블록에서 console.error 대신 logger.error를 사용한다
- 사용자에게 노출되는 에러 메시지는 반드시 한글로 작성한다
## 코드 스타일
- async/await 방식만 허용 (Promise 체인 금지)
- 함수 하나당 책임 하나 (단일 책임 원칙)
- 변수명은 camelCase, 상수는 UPPER_SNAKE_CASE
## 테스트 규칙
- 수정 후 반드시 npm test 실행
- 테스트 커버리지 80% 이하로 떨어지면 배포 금지
이 파일이 있으면 Claude Code는 수정 제안 전에 자동으로 이 규칙을 참조한다. 추가로 명시적으로 언급하면 더 확실하다.
claude "CLAUDE.md 규칙에 따라 error.log의 에러를 수정해줘. async/await 스타일 유지하고, logger 모듈 사용해야 해"
한 가지 팁이 있다. CLAUDE.md에 "이건 하지 마"를 명시하는 것도 중요하다. 예를 들어 any 타입을 남발하는 TypeScript 수정 제안이 계속 나온다면, ## 금지 사항 섹션에 TypeScript any 타입 사용 금지를 추가하면 된다.
자율 수정 루프 실제 구현
핵심은 수정 → 테스트 → 재수정의 루프를 Claude가 스스로 돌리게 만드는 것이다. 사람이 중간에 개입해서 "테스트 돌려봐" 같은 말을 할 필요가 없어야 진짜 자동화다.
claude "
다음 순서로 작업해줘:
1. error.log를 읽고 근본 원인을 파악해
2. CLAUDE.md 규칙을 확인해
3. 규칙에 맞게 코드를 수정해
4. npm test를 실행해서 결과를 확인해
5. 테스트가 실패하면 원인을 분석하고 2번부터 반복해
6. 모든 테스트가 통과하면 수정 내용을 요약해줘
"
이 명령 하나로 Claude Code는 전체 루프를 돌린다. 실제로 내가 이 방식으로 작업했을 때의 출력 흐름이다.
> Reading error.log...
> Found issue: Null reference in UserService.getById() at line 89
> Checking CLAUDE.md conventions...
> Applying fix with try/catch and logger.error...
> Running: npm test
> FAIL src/services/UserService.test.ts
> ● UserService › getById › should handle null case
> Analyzing test failure...
> Test expects Error to be thrown, fix returns null instead
> Updating fix to throw custom error...
> Running: npm test
> PASS src/services/UserService.test.ts
> All tests passed. Summary: ...
두 번째 반복에서 테스트 기대값을 읽고 수정 방향을 바꾼 게 핵심이다. 사람이 개입 없이 스스로 판단했다.
운영 환경별 주의사항
Mac/Linux 환경에서는 tee 명령어로 로그를 파일에 동시 저장하는 방식이 잘 동작한다. Windows라면 PowerShell의 Tee-Object를 쓰거나 Git Bash를 경유하는 게 깔끔하다.
Docker 컨테이너 안에서 작업한다면 로그를 컨테이너 밖으로 마운트하거나, docker logs 명령어로 추출해서 넘기면 된다.
# Docker 컨테이너 로그 추출
docker logs my-app 2>&1 > error.log
claude "error.log의 컨테이너 에러를 분석하고 CLAUDE.md 규칙에 따라 수정해줘"
한 가지 함정이 있다. CLAUDE.md가 너무 길면 Claude가 핵심 규칙을 놓치는 경우가 생긴다. 실제로 200줄짜리 CLAUDE.md를 쓰다가 하위 항목의 규칙이 무시되는 걸 경험했다. 가장 중요한 규칙을 파일 상단에, 50줄 이내로 압축하는 게 효과가 훨씬 좋다.
에러 로그 전체를 넘기고, 팀 규칙을 CLAUDE.md에 담고, 테스트 통과까지 루프를 돌리게 만드는 것 — 이 세 가지가 붙으면 단순 디버깅이 자율 주도형 수정 엔진으로 바뀐다.
다음 글은 이 루프를 CI/CD 파이프라인에 연결해 PR 단계에서 자동으로 돌아가게 만드는 방법을 다룬다.
🐦 X에서 더 빠르게: @baegseungh7061
📚 이 시리즈 더 보기: Code 활용
💌 새 글 알림: X 팔로우 또는 블로그 RSS 구독
'Code 활용' 카테고리의 다른 글
| Claude Code 커스텀 커맨드에 프로젝트 정보를 자동으로 심는 법 (0) | 2026.05.11 |
|---|---|
| 병렬 에이전트 결과를 하나로 합치는 MapReduce 설계 — Claude Code 실전 패턴 (0) | 2026.05.10 |
| Claude Code 에이전트 네트워크 샌드박스 — Docker 격리로 외부 트래픽 완전 차단하기 (0) | 2026.05.09 |
| 작업 무게에 따라 Haiku·Sonnet·Opus를 골라 쓰는 Claude 모델 티어 라우팅 비용 설계 (0) | 2026.05.07 |
| CLAUDE.md로 시작하는 Claude Code 프로젝트 장악 전략 (0) | 2026.04.29 |