개발 환경 자동화 — dotfiles로 새 PC 30분 안에 셋업하기
회사 노트북이 바뀔 때마다 이틀이 걸렸던 이유
예전에 회사 노트북이 바뀌면 2일을 날렸다. OS 설치부터 개발 환경 구축, 설정 파일 복사... 이 모든 게 수동 작업이었다. 하드드라이브 SSD로 바뀌면서 이 문제가 더 심해졌다. 새 SSD는 깨끗하니까 처음부터 다시 해야 했다.
3년 전부터 dotfiles로 자동화했다. 이제 새 노트북을 받으면 스크립트 하나 실행하면 끝이다. 30분이면 충분하다.
Dotfiles 저장소 구조
먼저 GitHub에 dotfiles 저장소를 만든다:
<?xml version="1.0"?>
dotfiles/
.gitignore
README.md
install.sh
bootstrap.sh
defaults.sh
symlink.sh
brew/
Brewfile
shell/
.zshrc
.zprofile
.functions
.aliases
git/
.gitconfig
.gitignore_global
vscode/
settings.json
keybindings.json
extensions.json
ssh/
config
설치 스크립트
단일 진입점 스크립트:
<?xml version="1.0"?>
#!/bin/bash
# install.sh
set -e
echo "Starting dotfiles setup..."
# 1. Xcode Command Line Tools 설치
if ! command -v xcode-select &> /dev/null; then
echo "Installing Xcode Command Line Tools..."
xcode-select --install
sleep 10
fi
# 2. Homebrew 설치
if ! command -v brew &> /dev/null; then
echo "Installing Homebrew..."
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
fi
# 3. Dotfiles 저장소 클론
DOTFILES_REPO="https://github.com/yourusername/dotfiles.git"
DOTFILES_DIR="${HOME}/.dotfiles"
if [ ! -d "$DOTFILES_DIR" ]; then
echo "Cloning dotfiles..."
git clone "$DOTFILES_REPO" "$DOTFILES_DIR"
fi
cd "$DOTFILES_DIR"
# 4. 각 설정 스크립트 실행
bash "$DOTFILES_DIR/bootstrap.sh"
bash "$DOTFILES_DIR/defaults.sh"
bash "$DOTFILES_DIR/brew/install.sh"
bash "$DOTFILES_DIR/symlink.sh"
echo "Setup complete!"
Homebrew 번들
설치할 패키지들을 관리:
<?xml version="1.0"?>
# brew/Brewfile
tap "homebrew/cask"
tap "homebrew/cask-fonts"
# 개발 도구
brew "git"
brew "node"
brew "pnpm"
brew "rust"
brew "python@3.11"
# 유틸리티
brew "tmux"
brew "vim"
brew "zsh"
brew "zsh-completions"
brew "fzf"
brew "ripgrep"
brew "exa"
# 애플리케이션
cask "visual-studio-code"
cask "docker"
cask "slack"
cask "figma"
cask "spotify"
# 폰트
cask "font-jetbrains-mono-nerd-font"
cask "font-fira-code-nerd-font"
# 앱 스토어
mas "1Password 7", id: 1333542190
mas "Keynote", id: 409183694
# brew/install.sh
#!/bin/bash
brew bundle --file="$(dirname "$0")/Brewfile"
쉘 설정 심링크
설정 파일들을 심링크로 연결:
<?xml version="1.0"?>
#!/bin/bash
# symlink.sh
DOTFILES_DIR="${HOME}/.dotfiles"
# 쉘 설정
ln -sf "$DOTFILES_DIR/shell/.zshrc" "$HOME/.zshrc"
ln -sf "$DOTFILES_DIR/shell/.zprofile" "$HOME/.zprofile"
ln -sf "$DOTFILES_DIR/shell/.functions" "$HOME/.functions"
ln -sf "$DOTFILES_DIR/shell/.aliases" "$HOME/.aliases"
# Git 설정
ln -sf "$DOTFILES_DIR/git/.gitconfig" "$HOME/.gitconfig"
ln -sf "$DOTFILES_DIR/git/.gitignore_global" "$HOME/.gitignore_global"
# SSH 설정
mkdir -p "$HOME/.ssh"
ln -sf "$DOTFILES_DIR/ssh/config" "$HOME/.ssh/config"
chmod 600 "$HOME/.ssh/config"
# VS Code 설정
VS_CODE_DIR="$HOME/Library/Application Support/Code/User"
mkdir -p "$VS_CODE_DIR"
ln -sf "$DOTFILES_DIR/vscode/settings.json" "$VS_CODE_DIR/settings.json"
ln -sf "$DOTFILES_DIR/vscode/keybindings.json" "$VS_CODE_DIR/keybindings.json"
echo "Symlinks created"
쉘 설정 파일
<?xml version="1.0"?>
# shell/.zshrc
# 기본 설정
export ZSH="${HOME}/.oh-my-zsh"
ZSH_THEME="powerlevel10k/powerlevel10k"
plugins=(git zsh-syntax-highlighting zsh-autosuggestions fzf)
source $ZSH/oh-my-zsh.sh
# 함수 및 별칭 로드
source ~/.functions
source ~/.aliases
# 개발 환경
export LANG=en_US.UTF-8
export EDITOR=vim
export PAGER=less
# Node.js
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
# 커스텀 프롬프트
eval "$(starship init zsh)"
<?xml version="1.0"?>
# shell/.aliases
alias ll='exa -la'
alias ls='exa'
alias cat='bat'
alias vim='nvim'
alias cd..='cd ..'
alias cc='clear'
# Git aliases
alias gs='git status'
alias ga='git add'
alias gc='git commit'
alias gp='git push'
alias gl='git log'
alias gd='git diff'
# 프로젝트 네비게이션
alias projects='cd ~/Projects'
alias work='cd ~/Work'
VS Code 설정 동기화
<?xml version="1.0"?>
// vscode/settings.json
{
"editor.fontFamily": "JetBrains Mono",
"editor.fontSize": 13,
"editor.tabSize": 2,
"editor.insertSpaces": true,
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"files.exclude": {
"**/node_modules": true,
"**/.next": true
},
"search.exclude": {
"**/node_modules": true,
"dist": true
},
"extensions.ignoreRecommendations": false,
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
}
}
// extensions.json에 필수 확장 목록
[
"esbenp.prettier-vscode",
"dbaeumer.vscode-eslint",
"ms-vscode.vscode-typescript-next",
"GitHub.copilot",
"GitHub.github-vscode-theme",
"eamodio.gitlens"
]
// 설치 스크립트
#!/bin/bash
while IFS= read -r extension; do
code --install-extension "$extension"
done < "$(dirname "$0")/extensions.json"
Git 설정
<?xml version="1.0"?>
# git/.gitconfig
[user]
name = Your Name
email = your.email@example.com
[core]
editor = vim
excludesfile = ~/.gitignore_global
ignorecase = false
[init]
defaultBranch = main
[pull]
rebase = true
[alias]
st = status
co = checkout
br = branch
cm = commit
unstage = reset HEAD --
last = log -1 HEAD
visual = log --graph --oneline --all
[rerere]
enabled = true
macOS 기본 설정
<?xml version="1.0"?>
#!/bin/bash
# defaults.sh
# 트랙패드 속도
defaults write NSGlobalDomain com.apple.trackpad.scaling -float 3.0
# 감지 속도
defaults write NSGlobalDomain InitialKeyRepeat -int 15
defaults write NSGlobalDomain KeyRepeat -int 2
# Dock 자동 숨김
defaults write com.apple.dock autohide -bool true
# Finder 기본 보기 (리스트)
defaults write com.apple.finder FXPreferredViewStyle -string "Nlsv"
# Hidden 파일 표시
defaults write com.apple.finder AppleShowAllFiles -bool true
# 변경사항 적용
killall Finder Dock
SSH 설정
<?xml version="1.0"?>
# ssh/config
Host *
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_ed25519
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_github
Host work-server
HostName work.example.com
User ubuntu
IdentityFile ~/.ssh/id_work
Port 2222
초기 실행
새 Mac을 받았을 때:
<?xml version="1.0"?>
# 1. Safari에서 GitHub 접속
# 2. SSH 키 생성 및 등록
$ ssh-keygen -t ed25519 -C "your.email@example.com"
$ cat ~/.ssh/id_ed25519.pub # GitHub에 등록
# 3. Dotfiles 클론 및 설치
$ git clone git@github.com:yourusername/dotfiles.git ~/.dotfiles
$ cd ~/.dotfiles
$ bash install.sh
# 4. 완료! 모든 설정이 자동으로 적용됨
마무리
Dotfiles는 개발 환경을 코드로 관리한다는 아이디어다. 한 번 설정해두면, 새 컴퓨터에서도 몇 분이면 모든 게 준비된다. 팀원들과도 공유할 수 있다.
회사 노트북 바꿀 때마다 2일을 날렸던 것을 생각하면, dotfiles는 정말 좋은 투자다.