공유 모듈에서 데이터 클래스 필드 이름 하나를 바꾸면 플랫폼별 구현체, 매퍼, 테스트 코드까지 십여 개 파일이 함께 바뀝니다. Claude Code 기본 모드에서는 파일을 수정할 때마다 승인 프롬프트가 뜨는데, 같은 패턴의 단순 치환이 반복되는 작업에서도 매번 엔터를 눌러야 해서 리팩터링 하나에 승인만 스무 번 넘게 하는 일이 잦았습니다.

이 문제를 권한 모드를 상황별로 바꿔가며 풀었습니다. Claude Code는 세션 권한 모드로 default(매 도구 호출마다 승인), acceptEdits(파일 편집은 자동 승인하되 명령 실행은 여전히 물어봄), plan(읽기 전용으로 계획만 세우고 실행은 별도 승인), bypassPermissions(전부 자동 실행)를 제공합니다. 탐색 단계에서는 plan 모드로 전환해서 "이 필드를 쓰는 곳을 전부 찾아서 변경 범위를 먼저 정리해줘"라고 시켰고, 변경 범위가 예상한 파일들로 한정된 걸 확인한 다음에만 acceptEdits로 바꿔서 실제 치환을 진행했습니다.

acceptEdits에서도 빌드나 배포처럼 되돌리기 어려운 명령까지 자동으로 실행되면 안 되기 때문에, 프로젝트 .claude/settings.json에 허용·차단 목록을 따로 정의했습니다.

{
  "permissions": {
    "allow": [
      "Bash(git status)",
      "Bash(git diff:*)",
      "Bash(./gradlew test:*)"
    ],
    "deny": [
      "Bash(git push --force:*)",
      "Bash(git reset --hard:*)",
      "Bash(rm -rf:*)"
    ]
  }
}

이렇게 설정해두면 acceptEdits 모드에서도 deny 목록에 걸린 명령은 세션 권한 모드와 무관하게 항상 승인 프롬프트가 뜨거나 거부됩니다. 반대로 allow 목록에 있는 읽기 위주 명령은 default 모드에서도 승인 없이 바로 실행되어서, 상태만 확인하는 git statusgit diff 같은 명령까지 매번 승인하는 번거로움이 줄었습니다.

실제로 적용해보니 탐색(plan)과 반복 편집(acceptEdits)을 오가는 방식이 가장 효율적이었습니다. 처음부터 bypassPermissions로 몰아서 쓴 적도 있었는데, 의도하지 않은 파일까지 한 번에 바뀐 뒤 뒤늦게 diff를 보고 되돌리는 경우가 있어서 지금은 되돌리기 쉬운 파일 편집에만 자동 승인 범위를 열어두고, git push나 배포 관련 명령은 deny 목록에 고정해두는 쪽으로 정리했습니다. 세션 시작할 때 모드를 매번 고르기보다 작업 단계(탐색/편집/검증)에 맞춰 모드를 바꾸는 습관을 들이는 편이 승인 피로도와 실수 위험 사이에서 균형을 잡기 좋았습니다.