Rain Lag

끈끈한 기본 설정 전략: 어떤 새 머신도 금방 ‘내 환경’처럼 만드는 작은 개인 설정 디자인하기

dotfiles, Git, Chezmoi, 그리고 간단한 셋업 스크립트를 활용해, 어떤 새 머신에서도 즉시 익숙하게 느껴지는 휴대 가능하고 보안이 잘 된 ‘끈끈한 기본 설정’을 만드는 방법.

끈끈한 기본 설정 전략: 어떤 새 머신도 금방 ‘내 환경’처럼 만드는 작은 개인 설정 디자인하기

새로운 머신에는 항상 묘한 마찰이 따라옵니다. 빠르고 깨끗하지만, 낯설죠. 쉘은 어딘가 어색하고, 에디터는 절반쯤 능력을 잃은 느낌이고, 좋아하는 도구들은 설치되어 있지 않습니다. 일을 할 수는 있지만, 모든 게 조금씩… 삐걱거립니다.

끈끈한 기본 설정(Sticky Defaults) 전략은 이 마찰을 없애는 데 초점을 둡니다. 작고, 주관적인 개인 기본 설정—즉 작은 개인 설정(tiny personal configs)—을 설계하고, 그것을 휴대 가능하고, 재현 가능하며, 안전하게 만드는 겁니다. 새 노트북이든, VM이든, 컨테이너든, 원격 서버든, 어디에 손을 대더라도 몇 분 안에 내 집처럼 느껴지게 만드는 전략입니다.

이 글에서는 다음 내용을 다룹니다.

  • Chezmoi 같은 dotfiles 매니저로 설정을 여러 머신에 동기화하는 방법
  • Git으로 dotfiles를 버전 관리해 안전하게 진화시키는 방법
  • 어떤 새 환경이든 빠르게 부트스트랩하는 새 머신 셋업 스크립트 만들기
  • 레포 구조와 브랜치 전략을 유지보수가 쉽도록 설계하는 방법
  • 보안을 처음부터 일급(prioritized)으로 다루는 방법
  • 들어가는 비용은 작지만 체감 효과가 큰, 끈끈하고(high-impact) 익숙한 설정들에 집중하는 법

왜 ‘완벽한 셋업’보다 ‘끈끈한 기본 설정’이 더 나을까

많은 개발자가 한 머신을 위해 완벽한(perfect) 개발 환경을 만들려고 합니다. 수많은 플러그인, 커스텀 도구, 정교한 설정들로 가득 채우죠.

문제는, 완벽한 셋업은 잘 옮겨 다니지 못한다는 겁니다.

  • 새 노트북을 사면: 커스텀 설정 절반은 빠져 있습니다.
  • 서버에 SSH 접속하면: 로컬 환경과 전혀 다른 모습입니다.
  • 클라우드 개발 환경을 쓰면: 손이 기억하던 동작이 모두 깨집니다.

끈끈한 기본 설정은 다릅니다. 이건 작고, 어디서나 쓸 수 있는 설정 레이어입니다.

  • 어느 환경이든 쉽게 적용할 수 있고
  • 장비를 바꾸거나 직장을 옮겨도 살아남고
  • 로컬, 원격, 클라우드 어디서든 동일한 최소한의 편안함을 제공합니다.

이걸 당신 컴퓨팅 인생의 **기내 반입 가방(carry‑on bag)**이라고 생각해 보세요. 최소한이지만, 필수적이고, 항상 가지고 다니는 것들입니다.


1단계: Dotfiles를 버전 관리에 올리기

끈끈한 기본 설정의 기초는 단순합니다. 설정 파일들을 Git으로 관리하는 것입니다.

일반적인 dotfiles 예시는 다음과 같습니다.

  • 쉘: ~/.bashrc, ~/.zshrc, ~/.profile, ~/.bash_aliases
  • 에디터: ~/.vimrc, ~/.config/nvim/init.vim, ~/.config/helix/config.toml
  • Git: ~/.gitconfig, ~/.gitignore_global
  • 기타 도구: ~/.tmux.conf, ~/.config/starship.toml, ~/.config/fd/, ~/.config/ripgrep/

전용 레포를 하나 만듭니다(보통 이름은 dotfiles 정도로 많이 씁니다).

mkdir -p ~/dotfiles cd ~/dotfiles git init

그다음 무작정이 아니라, 의도적으로 설정을 옮겨옵니다.

cp ~/.zshrc . cp ~/.gitconfig . cp ~/.tmux.conf .

커밋은 빠르고 자주 합니다.

git add . git commit -m "Initial personal defaults"

Git이 중요한 이유:

  • 히스토리: 언제, 왜 특정 설정을 바꿨는지 추적할 수 있습니다.
  • 리뷰: 동기화 전에 diff를 보면서 어떤 부작용이 있을지 미리 이해할 수 있습니다.
  • 안전성: 해봤는데 별로인 실험은 쉽게 되돌릴 수 있습니다.

이것만으로도 이미 환경은 훨씬 더 안전하고 휴대 가능해집니다.


2단계: Chezmoi로 어디서든 ‘달라붙는’ 설정 만들기

dotfiles를 머신 사이에 직접 복사하거나, 수동으로 심볼릭 링크 관리만 하다 보면 금방 꼬입니다. 여기서 dotfiles 매니저Chezmoi가 문제를 해결해 줍니다.

Chezmoi는 Git 레포와 홈 디렉터리 사이에 위치합니다.

  • 템플릿과 평문 파일은 Chezmoi가 관리하는 레포에 있고
  • Chezmoi가 각 머신의 홈 디렉터리에 이를 **적용(apply)**해 주며
  • OS, 호스트, 환경별로 동작을 세밀하게 커스터마이징할 수 있습니다.

Chezmoi 기본 셋업

이미 dotfiles가 있는 머신에서 시작한다고 해봅시다.

# Chezmoi 설치 (예: macOS에서 Homebrew 사용) brew install chezmoi # 기존 원격 레포에서 초기화 chezmoi init git@github.com:yourname/dotfiles.git # 홈 디렉터리에 설정 적용 chezmoi apply

어떤 파일을 Chezmoi 관리 아래 두고 싶다면:

chezmoi add ~/.zshrc chezmoi add ~/.gitconfig chezmoi add ~/.tmux.conf chezmoi cd # chezmoi 관리 레포 디렉터리로 이동

이제 **진짜 소스 오브 트루스(source of truth)**는 다음과 같습니다.

  • Chezmoi가 관리하는 파일들 (보통 ~/.local/share/chezmoi 아래)
  • 그 뒤를 받치는 Git 레포 (로컬 + 원격, 예: GitHub/GitLab)

새 머신에 도착했을 때는 이렇게 한 줄이면 됩니다.

sh -c "$(curl -fsLS get.chezmoi.io)" -- init --apply yourname

이 한 명령으로 dotfiles가 내려받아지고, 렌더링되고, 적용까지 됩니다.


3단계: 새 머신 셋업 스크립트 작성하기

dotfiles만으로는 도구를 설치할 수 없습니다. 이를 위해서는 **부트스트랩 스크립트(bootstrap script)**가 필요합니다. 이 스크립트는 다음을 담당합니다.

  1. 패키지 매니저 설치 (Homebrew, apt, pacman 등)
  2. 핵심 도구 설치 (쉘, 에디터, 터미널 관련 유틸 등)
  3. Chezmoi 설치
  4. dotfiles 레포 클론 및 적용

예시 (단순화한) bootstrap.sh:

#!/usr/bin/env bash set -euo pipefail # 1. 패키지 매니저 (예: macOS) if ! command -v brew &>/dev/null; then /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" fi # 2. 핵심 도구 설치 brew install \ git \ zsh \ tmux \ neovim \ fzf \ ripgrep \ fd # 3. Chezmoi brew install chezmoi # 4. Dotfiles chezmoi init git@github.com:yourname/dotfiles.git chezmoi apply

이 스크립트는 Git에 함께 넣어두는 것이 좋습니다(예: setup/ 또는 bootstrap/ 디렉터리). 이렇게 하면:

  • 시간이 지나면서 자연스럽게 업데이트할 수 있고
  • dotfiles와 셋업 스크립트를 함께 맞춰 갈 수 있으며
  • 변경 이력도 Git으로 리뷰할 수 있습니다.

새 머신에서는 다음이 전부가 됩니다.

  1. Git 설치 (필요하다면)
  2. bootstrap.sh 가져오기
  3. 한 번 실행

몇 분 지나면, 익숙한 환경이 눈앞에 펼쳐집니다.


4단계: 커지는 dotfiles 레포를 위한 구조와 브랜치 전략

dotfiles 레포는 시간이 갈수록 커집니다. 구조 없이 두면 금세 ‘잡동사니 서랍’이 되어 버리죠. 몇 가지 가이드라인을 정해두면 좋습니다.

(Chezmoi 스타일) 추천 구조

Chezmoi는 보통 다음과 비슷한 구조를 이용합니다.

~/.local/share/chezmoi ├── dot_gitconfig ├── dot_zshrc ├── dot_tmux.conf ├── private_dot_ssh │ └── config.tmpl └── run_once_install-fzf.sh.tmpl

일반적인 패턴은 이렇습니다.

  • dot_foo → 실제로는 ~/.foo가 됩니다.
  • private_ → 암호화하지 않고 그대로 커밋하면 안 되는 민감한 파일
  • run_once_ → 머신당 한 번만 실행할 스크립트
  • *.tmpl → OS별, 호스트별로 조건 분기를 넣을 수 있는 템플릿 파일

Git 브랜치 & 워크플로우

굳이 복잡한 GitFlow를 쓸 필요는 없습니다. 가벼운 방식이면 충분합니다.

  • main: 항상 안정적인, 잘 동작하는 기본 설정
  • experiment/* 브랜치들: 새 도구나 큰 리팩터링을 시험하는 공간

워크플로우 예시:

  1. 설정 실험을 위해 feature 브랜치를 하나 만든다.
  2. 특정 머신에서 며칠간 그 브랜치를 써보며 검증한다.
  3. 손에 잘 맞도록 수정을 반복한다.
  4. 충분히 안정적이라고 느껴지면 main에 머지한다.

이렇게 하면 완성되지 않은 아이디어가 모든 머신에 한꺼번에 퍼지는 일을 막을 수 있습니다.


5단계: 보안을 처음부터 일급으로 다루기

dotfiles 레포는 대개 공개(public)입니다. 비밀 정보는 절대 그래서는 안 됩니다.

자주 발생하는 실수들:

  • ~/.zshrc에 API 키를 박아 넣기
  • ~/.gitconfig에 토큰 저장하기
  • ~/.ssh/config에 민감한 SSH 옵션 노출하기

대신 다음과 같은 패턴을 추천합니다.

  1. 보안 저장소에서 환경 변수 불러오기

    • pass, 1Password CLI, gopass, bitwarden-cli 같은 도구를 사용합니다.
    • 쉘이 시작될 때 Git에 커밋하지 않는 파일에서 민감한 값을 읽어오도록 합니다.
  2. Chezmoi의 비밀 관리 통합 기능 활용
    Chezmoi는 시크릿 매니저와 연동하거나 age, GPG 같은 암호화를 사용할 수 있습니다.
    예를 들어, private_dot_ssh/config.tmpl에서 외부에서 관리되는 비밀 값을 참조하도록 할 수 있습니다.

  3. 민감한 파일은 아예 Git에서 무시하기
    Chezmoi 레포의 .gitignore에 추가합니다.

    private_dot_env* private_dot_ssh/id_*
  4. 공개 레포와 비공개 레포 분리

    • 대부분의 dotfiles(무해한 기본 설정, alias, 도구 설정 등)는 공개 레포에 둡니다.
    • 정말 민감한 설정이나 특정 머신에만 필요한 오버라이드는 별도의 비공개 레포나 Chezmoi의 암호화된 시크릿 기능으로 관리합니다.

원칙은 단순합니다. Git에 올라간 것은 언젠가 공개될 수도 있다고 가정하세요.


6단계: 휴대성과 재현 가능성을 염두에 두고 설계하기

이 셋업은 다음과 같은 곳에서 잘 돌아가야 합니다.

  • 내 노트북 (macOS, Linux, 혹은 Windows WSL)
  • 원격 서버와 VM (주로 Linux)
  • 클라우드 개발 환경 (GitHub Codespaces, Gitpod, 커스텀 컨테이너 등)

이를 위해서는 몇 가지 실천이 도움이 됩니다.

  • 기능 감지(feature detection) 사용: 쉘 설정에서 도구 존재 여부를 확인한 뒤에만 설정합니다.

    if command -v fzf &>/dev/null; then [ -f ~/.fzf.zsh ] && source ~/.fzf.zsh fi
  • OS별 템플릿 분기: Chezmoi 템플릿을 사용하면 플랫폼에 따라 설정을 분기할 수 있습니다.

    {{- if eq .chezmoi.os "darwin" -}} export PATH="/opt/homebrew/bin:$PATH" {{- else if eq .chezmoi.os "linux" -}} export PATH="/usr/local/bin:$PATH" {{- end -}}
  • 가정 최소화: 특정 머신에만 있는 절대 경로를 하드코딩하지 않습니다. 대신 환경 변수와 자동 감지를 최대한 활용합니다.

목표는 레포는 하나, 환경은 여러 개입니다. 여기에 필요한 만큼만 작은 조건 분기를 더하는 식으로 접근합니다.


7단계: 작지만 효과가 큰 설정에 집중하기

집처럼 느껴지는 환경을 위해 수백 줄의 설정이 필요한 것은 아닙니다. 끈끈한 기본 설정은 레버리지가 큰 몇 가지 영역에 집중하는 편이 좋습니다.

  • 프롬프트: 모든 머신에서 통일된 프롬프트(예: Starship)를 사용합니다.
  • alias: gsgit status, llls -alF 같은 자주 쓰는 단축 명령.
  • 히스토리: 중복 제거, 충분히 큰 히스토리 사이즈 등 자신에게 맞는 히스토리 설정.

에디터

  • 커서 이동과 키 바인딩: 손이 기억하는 동작과 최대한 일치하도록.
  • 들여쓰기와 포매팅 기본값.
  • 자신의 핵심 워크플로우를 뒷받침하는 최소한의 플러그인 세트.

도구 구성

  • 항상 찾게 되는 CLI 도구들: rg, fd, jq, fzf 등.
  • Git 설정: 이름, 이메일, 유용한 alias(co, br, st 등).
  • tmux 같은 터미널 멀티플렉서의 기본 키 바인딩과 레이아웃.

스스로에게 물어보세요. “이게 없으면 이 머신이 낯설게 느껴질까?”
대답이 “그렇다”라면, 끈끈한 기본 설정 후보입니다. 아니라면, 과감히 빼거나 선택적(optional) 설정으로 두는 편이 좋습니다.


마무리: 어떤 머신이든 ‘내 머신’처럼 만들기

끈끈한 기본 설정 전략은 화려하고 복잡한 셋업을 만드는 이야기가 아닙니다. 어디서든 적용 가능한 작고, 튼튼한 개인의 편안함 레이어를 만드는 이야기입니다.

정리해 보면:

  • dotfiles를 Git으로 관리해서 안전하게 발전시킵니다.
  • Chezmoi로 여러 머신에서 설정을 관리하고 적용합니다.
  • 새 머신 셋업 스크립트 하나로 부트스트랩을 자동화합니다.
  • 커질 레포를 대비해 구조와 브랜치 전략을 잡아둡니다.
  • 시크릿과 설정을 분리하고, 안전한 저장소나 암호화를 사용합니다.
  • 휴대성과 재현 가능성을 고려해 OS 인식 템플릿과 최소한의 가정만 사용합니다.
  • 몇 가지 작지만 효과가 큰 설정에 집중해, 들어가는 노력 대비 체감을 극대화합니다.

시간이 지날수록 이 끈끈한 기본 설정은 강력한 생산성 도구가 됩니다. 새 노트북이든, 우연히 접속한 클라우드 인스턴스든 어디서 로그인하더라도, 익숙하고 빠르고, 진짜 ‘내 것’ 같은 환경이 당신을 맞이하게 될 겁니다.

끈끈한 기본 설정 전략: 어떤 새 머신도 금방 ‘내 환경’처럼 만드는 작은 개인 설정 디자인하기 | Rain Lag