개발 환경 자동화 — dotfiles로 새 PC 30분 안에 셋업하기

게시일: 2025년 6월 20일 · 13분 읽기

회사 노트북이 바뀔 때마다 이틀이 걸렸던 이유

예전에 회사 노트북이 바뀌면 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는 정말 좋은 투자다.

iL
ian.lab

실무 개발자입니다. 현장에서 겪은 문제와 해결 과정을 기록합니다. 오류 제보는 연락처로 보내주세요.