---
ai_assisted: true
title: "같은 PC에서 Claude Code 계정 여러 개 동시에 돌리기"
description: "CLAUDE_CONFIG_DIR 환경변수와 쉘 함수 한두 개로 회사·개인·실험·고객 Claude Code 계정을 같은 머신에서 독립 운영하는 셋업"
pubDate: 2026-05-20T17:01:28+09:00
category: "AI"
subcategory: "Agent"
tags: ["Claude Code", "Multi-account", "zsh", "Dotfiles", "Productivity", "Configuration", "Developer Workflow"]
heroImage: ""
series: "claude-multi-account"
seriesOrder: 1
seriesTitle: "Claude Code 멀티 계정 운영"
serial: 11
draft: false
published: true
---

Claude Code에는 rate limit이 있다. 일정량을 넘으면 대기가 걸린다. 해결책은 계정을 더 만드는 것. 거기에 회사 프로젝트는 회사 계정, 개인 프로젝트는 개인 계정으로 분리하고 싶은 니즈까지 더해지면, 결국 한 Mac에서 여러 Claude Code 계정을 동시에 운영하는 상황이 된다.

문제는 Claude Code가 기본적으로 `~/.claude` 하나만 바라본다는 점이다. 계정을 바꿀 때마다 설정 디렉토리를 통째로 교체하거나, 터미널마다 다른 계정으로 로그인하거나, 매번 API 키를 수동으로 바꾸거나 해야 한다. 어느 방법도 깔끔하지 않다.

`CLAUDE_CONFIG_DIR` 환경변수를 사용하면 같은 머신에서 여러 Claude Code 인스턴스를 독립된 설정으로 운영할 수 있습니다. 회사·개인·실험·고객 계정을 한 Mac에서 분리해서 굴리는 셋업입니다.


## CLAUDE_CONFIG_DIR이 하는 일

Claude Code는 기동 시 `CLAUDE_CONFIG_DIR` 환경변수를 읽어 설정·히스토리·세션 데이터를 저장할 루트 디렉토리를 결정합니다. 이 변수를 지정하지 않으면 기본값인 `~/.claude`를 사용합니다.

변수 하나로 분리되는 항목은 다음과 같습니다.

| 항목 | 설명 |
|---|---|
| `settings.json` | 모델·옵션·환경변수 설정 |
| `CLAUDE.md` | 프로젝트 전역 지시문 |
| `commands/`, `hooks/` | 커스텀 명령 및 훅 |
| `history.jsonl` | 대화 히스토리 |
| `projects/` | 세션 데이터 (.jsonl) |

반면 분리되지 않는 항목도 있습니다. 전역 zsh 별칭(`~/.zshrc`), 시스템 `PATH`, `~/.ssh` 같은 OS 레벨 설정은 인스턴스마다 별도로 존재하지 않습니다. Claude Code의 바이너리 자체도 하나이며, 계정별로 별도 설치가 필요하지 않습니다.


## 디렉토리 생성과 명명 규칙

기본 인스턴스(`~/.claude`)는 그대로 두고, 추가 인스턴스용 디렉토리를 `-N` 인덱스로 생성합니다.

```bash
mkdir ~/.claude-2   # 두 번째 인스턴스
mkdir ~/.claude-3   # 세 번째 인스턴스
mkdir ~/.claude-4   # 네 번째 인스턴스
```

`-1`은 기본 `~/.claude`에 대응하는 플래그로 예약합니다. 이 명명 규칙을 지키면 뒤에서 정의하는 쉘 함수의 플래그(`-1`, `-2`, `-3`, `-4`)와 디렉토리 인덱스가 1:1로 대응됩니다.


## 쉘 함수 정의

`~/.oh-my-zsh/custom/aliases.zsh`(또는 `~/.zshrc`)의 `claude()` 함수에 인스턴스 선택 플래그를 추가합니다. `-1`과 `-2` 플래그를 파싱해 `CLAUDE_CONFIG_DIR`을 결정한 뒤 `command claude`를 호출하는 구조입니다.

```zsh
claude() {
  local args=()
  local config_dir=""
  # ... 기존 플래그 처리 ...
  for arg in "$@"; do
    if [[ "$arg" =~ ^-[ycg12]+$ ]]; then
      local flags="${arg#-}"
      for (( i=0; i<${#flags}; i++ )); do
        case "${flags:$i:1}" in
          1) config_dir="$HOME/.claude"   ;;
          2) config_dir="$HOME/.claude-2" ;;
          # ... 기타 플래그 ...
        esac
      done
    else
      args+=("$arg")
    fi
  done
  if [[ -n "$config_dir" ]]; then
    CLAUDE_CONFIG_DIR="$config_dir" command claude "${args[@]}"
  else
    command claude "${args[@]}"
  fi
}
```

정의 후 사용 방법은 다음과 같습니다.

```bash
# 기본 계정 (플래그 없으면 ~/.claude)
claude

# 명시적으로 기본 계정
claude -1

# 두 번째 계정
claude -2

# 플래그 조합
claude -2y          # 두 번째 계정 + yolo
claude -2cy         # 두 번째 계정 + continue + yolo
claude -2cyg        # 두 번째 계정 + continue + yolo + 다른 플래그
```

`CLAUDE_CONFIG_DIR`은 해당 셸 세션 내에서만 유효합니다. 별도 터미널 탭마다 독립적으로 인스턴스를 지정할 수 있기 때문에, 회사 계정과 개인 계정을 탭 단위로 분리해서 동시에 운영하는 것이 가능합니다.


## 기존 설정 마이그레이션

이미 `~/.claude`를 사용 중이라면 기본 인스턴스는 그대로 유지하고, 추가 인스턴스에만 필요한 파일을 복사합니다.

```bash
# 설정 파일 복사
cp ~/.claude/settings.json   ~/.claude-2/
cp ~/.claude/CLAUDE.md       ~/.claude-2/
cp -r ~/.claude/commands     ~/.claude-2/
cp -r ~/.claude/hooks        ~/.claude-2/

# 플러그인은 심볼릭 링크 (동기화 유지 + 용량 절약)
ln -sf ~/.claude/plugins ~/.claude-2/plugins
```

`settings.json`과 `CLAUDE.md`는 복사본으로 관리하므로 인스턴스마다 다른 모델이나 옵션을 설정할 수 있습니다. `plugins`는 심볼릭 링크로 연결해 두면 한쪽에서 설치하거나 업데이트한 플러그인이 양쪽 모두에 반영됩니다.

마이그레이션 후 디렉토리 구조는 다음과 같습니다.

```
~/.claude/          ← 기본 인스턴스 (-1)
├── settings.json
├── CLAUDE.md
├── commands/
├── hooks/
├── plugins/        ← 원본
└── history.jsonl

~/.claude-2/        ← 두 번째 인스턴스 (-2)
├── settings.json   ← 복사본 (독립 수정 가능)
├── CLAUDE.md       ← 복사본
├── commands/       ← 복사본
├── hooks/          ← 복사본
├── plugins → ~/.claude/plugins  ← 심볼릭 링크
└── history.jsonl   ← 독립 히스토리
```

파일 소유권은 복사 시 자동으로 현재 사용자로 설정되므로 별도 `chown` 작업은 필요하지 않습니다. 단, 루트 권한으로 복사한 경우에는 소유권을 확인해야 합니다.


## 인스턴스별 분리되는 것들

`CLAUDE_CONFIG_DIR`로 분리되는 항목과 공유되는 항목을 정리하면 다음과 같습니다.

**인스턴스별 독립 관리**
- `settings.json`: 모델 지정, `env` 블록의 API 키, 각종 옵션
- `CLAUDE.md`: 전역 시스템 프롬프트
- `commands/`, `hooks/`: 커스텀 명령과 훅
- `history.jsonl`: 대화 히스토리 (각 디렉토리에 격리)
- `projects/`: 세션 데이터. 기본적으로 인스턴스별 독립 저장됨

**공유 상태 유지 (심볼릭 링크 방식)**
- `plugins/`: 위 마이그레이션 예시처럼 심볼릭 링크로 공유 가능
- `projects/`: 세션 공유가 필요하면 `~/.claude-shared/projects`로 공유 가능 (Ep2에서 다룸)

**분리 불가 (OS 레벨 공유)**
- `~/.zshrc`, `~/.zshenv` 등 전역 쉘 설정
- 시스템 `PATH`
- `~/.ssh`, `~/.gnupg` 등 자격증명 저장소
- Claude Code 바이너리 (`/usr/local/bin/claude` 등)


## 운영상 주의

**API 키 충돌**

`settings.json`의 `env` 블록에 API 키를 넣지 않고 셸 환경변수(`ANTHROPIC_API_KEY`)로 관리하면, 터미널 세션마다 다른 계정의 키가 노출될 위험이 있습니다. 계정별 키는 각 인스턴스의 `settings.json` `env` 블록에 명시하거나, 계정별 `.env` 파일을 분리해서 `source` 하는 방법을 권장합니다.

**쉘 별칭 충돌**

위 함수를 정의하기 전에 `alias claude=...` 형태의 별칭이 이미 있는지 확인합니다. 함수와 별칭이 동시에 존재하면 zsh는 별칭을 우선합니다. 기존 별칭은 `unalias claude`로 제거한 뒤 함수로 대체합니다.

**플래그 없이 실행 시 기본 동작**

플래그를 지정하지 않으면 `~/.claude`가 사용됩니다. 의도치 않게 기본 인스턴스로 접속하는 실수를 방지하려면 주로 사용하는 계정에 해당하는 플래그(`-2` 등)를 쉘 프롬프트나 터미널 탭 제목에 표시하는 방법이 유용합니다.

**세 번째, 네 번째 계정 추가**

`~/.claude-3`, `~/.claude-4` 디렉토리를 생성하고 함수의 `case` 블록에 `3) config_dir="$HOME/.claude-3" ;;` 항목을 추가하면 됩니다. 구조가 동일하므로 확장 비용이 낮습니다.


## 마무리

`CLAUDE_CONFIG_DIR` 하나와 쉘 함수 수십 줄로 한 Mac에서 여러 Claude Code 인스턴스를 완전히 분리해서 운영할 수 있습니다. 컨텍스트를 격리해야 하는 상황에서 설정 비용 대비 효과가 큰 방법입니다.

다음 글(Ep2)에서는 계정 간 세션 공유를 symlink 구조로 구현하는 방법을, Ep3에서는 `sync-claude.sh`를 이용한 설정 동기화를 다룹니다.
