Contents
see List개요
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를 공유하거나, 여러 머신에서 일관된 환경을 유지하기도 쉽습니다. 처음에는 최소한의 설정만 넣고, 시간이 지나면서 자주 쓰는 설정을 점진적으로 추가하는 것이 좋습니다.