개요

macOS에서 개발 환경을 처음부터 구축하거나 여러 Mac을 동일하게 설정하는 것은 번거로운 작업입니다. Homebrew와 Dotfiles를 활용하면 패키지 설치와 설정을 자동화하여 몇 분 안에 개발 환경을 재현할 수 있습니다. 이 글에서는 재사용 가능한 개발 환경 자동화 전략을 다룹니다.

핵심 개념

Homebrew는 macOS의 패키지 관리자로, CLI 도구와 GUI 앱을 쉽게 설치할 수 있습니다. Dotfiles는 쉘 설정(.zshrc, .bashrc), Git 설정(.gitconfig), Vim/Neovim 설정 등을 Git으로 관리하여 여러 머신에서 동일한 환경을 유지하는 방법입니다.

1. Homebrew 설치 및 기본 사용

# Homebrew 설치
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# PATH 설정 (Apple Silicon Mac)
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"

# 패키지 검색
brew search git

# 패키지 설치
brew install git node python3 neovim tmux fzf ripgrep

# GUI 앱 설치 (Cask)
brew install --cask visual-studio-code docker iterm2 notion

# 설치된 패키지 목록
brew list

# 업데이트
brew update  # Homebrew 자체 업데이트
brew upgrade  # 모든 패키지 업그레이드

# 정리 (오래된 버전 제거)
brew cleanup

2. Brewfile로 패키지 일괄 관리

Brewfile은 설치할 패키지를 선언적으로 관리하는 파일입니다.

# ~/Brewfile
tap "homebrew/bundle"
tap "homebrew/cask-fonts"

# CLI 도구
brew "git"
brew "zsh"
brew "node"
brew "python@3.12"
brew "go"
brew "neovim"
brew "tmux"
brew "fzf"
brew "ripgrep"
brew "jq"
brew "gh"  # GitHub CLI
brew "awscli"
brew "kubectl"
brew "docker"
brew "terraform"

# GUI 앱
cask "visual-studio-code"
cask "iterm2"
cask "docker"
cask "notion"
cask "slack"
cask "google-chrome"
cask "figma"

# 폰트
cask "font-jetbrains-mono-nerd-font"
cask "font-fira-code"

# Mac App Store 앱 (mas 필요)
brew "mas"
mas "Xcode", id: 497799835
mas "Things", id: 904280696
# Brewfile로 설치
brew bundle install --file=~/Brewfile

# 설치된 패키지를 Brewfile로 내보내기
brew bundle dump --file=~/Brewfile --force

# Brewfile과 다른 패키지 확인
brew bundle check --file=~/Brewfile

# Brewfile에 없는 패키지 제거
brew bundle cleanup --file=~/Brewfile --force

3. Dotfiles 구조 설계

Git 저장소로 설정 파일을 관리합니다.

# Dotfiles 저장소 구조
~/dotfiles/
├── install.sh           # 자동 설치 스크립트
├── Brewfile             # Homebrew 패키지 목록
├── zsh/
│   ├── .zshrc
│   └── aliases.zsh
├── git/
│   └── .gitconfig
├── nvim/
│   └── init.lua
└── tmux/
    └── .tmux.conf

# Git 저장소 생성
cd ~
mkdir dotfiles
cd dotfiles
git init
git remote add origin https://github.com/yourusername/dotfiles.git

4. Zsh 설정 (.zshrc)

# ~/dotfiles/zsh/.zshrc

# Homebrew 경로 (Apple Silicon)
eval "$(/opt/homebrew/bin/brew shellenv)"

# Oh My Zsh 설치 (선택)
# sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
# export ZSH="$HOME/.oh-my-zsh"
# ZSH_THEME="robbyrussell"
# plugins=(git docker kubectl fzf)
# source $ZSH/oh-my-zsh.sh

# 히스토리 설정
HISTSIZE=10000
SAVEHIST=10000
HISTFILE=~/.zsh_history
setopt SHARE_HISTORY
setopt HIST_IGNORE_ALL_DUPS

# 자동 완성
autoload -Uz compinit
compinit

# fzf 통합
[ -f ~/.fzf.zsh ] && source ~/.fzf.zsh
export FZF_DEFAULT_COMMAND='rg --files --hidden --follow --glob "!.git/*"'

# 별칭
alias ls="ls -G"
alias ll="ls -lah"
alias g="git"
alias vim="nvim"
alias k="kubectl"
alias dc="docker-compose"

# 개발 도구 PATH
export PATH="$HOME/.local/bin:$PATH"
export EDITOR="nvim"

# Node.js (nvm)
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"

# Python (pyenv)
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"

5. Git 설정 (.gitconfig)

# ~/dotfiles/git/.gitconfig
[user]
    name = Your Name
    email = your.email@example.com

[core]
    editor = nvim
    autocrlf = input
    excludesfile = ~/.gitignore_global

[alias]
    st = status -sb
    co = checkout
    br = branch
    cm = commit -m
    lg = log --oneline --graph --all --decorate
    last = log -1 HEAD
    unstage = reset HEAD --
    undo = reset --soft HEAD~1

[pull]
    rebase = true

[push]
    default = current
    autoSetupRemote = true

[init]
    defaultBranch = main

[diff]
    tool = vimdiff

[merge]
    conflictstyle = diff3

실전 예제

자동 설치 스크립트 (install.sh)

#!/bin/bash
# ~/dotfiles/install.sh

set -e

echo "=== macOS Development Environment Setup ==="
echo ""

# 1. Xcode Command Line Tools 설치
if ! xcode-select -p &> /dev/null; then
    echo "[1/5] Installing Xcode Command Line Tools..."
    xcode-select --install
    read -p "Press Enter after Xcode installation completes..."
else
    echo "[1/5] Xcode Command Line Tools already installed"
fi

# 2. Homebrew 설치
if ! command -v brew &> /dev/null; then
    echo "[2/5] Installing Homebrew..."
    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
    eval "$(/opt/homebrew/bin/brew shellenv)"
else
    echo "[2/5] Homebrew already installed"
fi

# 3. Brewfile로 패키지 설치
echo "[3/5] Installing packages from Brewfile..."
brew bundle install --file=~/dotfiles/Brewfile

# 4. 심볼릭 링크 생성
echo "[4/5] Creating symlinks..."
ln -sf ~/dotfiles/zsh/.zshrc ~/.zshrc
ln -sf ~/dotfiles/git/.gitconfig ~/.gitconfig
ln -sf ~/dotfiles/nvim ~/.config/nvim
ln -sf ~/dotfiles/tmux/.tmux.conf ~/.tmux.conf

# 5. 추가 설정
echo "[5/5] Final setup..."

# fzf key bindings
$(brew --prefix)/opt/fzf/install --all

# macOS 시스템 설정
defaults write com.apple.finder AppleShowAllFiles -bool true  # 숨김 파일 표시
defaults write NSGlobalDomain AppleShowAllExtensions -bool true  # 확장자 표시
defaults write com.apple.dock autohide -bool true  # Dock 자동 숨김
killall Finder
killall Dock

echo ""
echo "✅ Setup complete! Please restart your terminal."
# 실행 권한 부여 및 실행
chmod +x ~/dotfiles/install.sh
~/dotfiles/install.sh

새 Mac에서 환경 복원

# 1. 저장소 클론
git clone https://github.com/yourusername/dotfiles.git ~/dotfiles

# 2. 자동 설치 실행
cd ~/dotfiles
./install.sh

# 3. 터미널 재시작
exec zsh

활용 팁

  • 민감 정보 분리: .gitconfig에 이메일이나 토큰을 넣지 말고, ~/.gitconfig.local을 별도로 만들어 [include] path로 불러옵니다.
  • macOS 버전별 분기: install.sh에서 sw_vers로 macOS 버전을 확인하고 조건부 설치를 구현할 수 있습니다.
  • 백업 자동화: cron이나 launchd로 정기적으로 brew bundle dump를 실행하여 Brewfile을 최신 상태로 유지합니다.
  • Secrets 관리: 1Password CLI나 pass를 사용해 API 키 같은 민감 정보를 안전하게 관리합니다.
  • iTerm2 프로파일: iTerm2 설정도 ~/Library/Preferences/com.googlecode.iterm2.plist를 dotfiles에 포함할 수 있습니다.
  • Ansible 통합: 복잡한 설정은 Ansible playbook으로 작성하면 더 체계적으로 관리할 수 있습니다.

마무리

Homebrew와 Dotfiles를 활용하면 개발 환경을 코드로 관리할 수 있습니다. 새 Mac을 구입하거나 재설치할 때 단 한 번의 명령으로 모든 도구와 설정을 복원할 수 있어 생산성이 크게 향상됩니다. Dotfiles 저장소를 만들어 두면 팀원들과 Best Practice를 공유하거나, 여러 머신에서 일관된 환경을 유지하기도 쉽습니다. 처음에는 최소한의 설정만 넣고, 시간이 지나면서 자주 쓰는 설정을 점진적으로 추가하는 것이 좋습니다.