Appendix D: Home Manager 기초

D.1 Home Manager 개념

사용자 환경 관리

Home Manager는 사용자 레벨의 환경과 설정을 Nix로 선언적으로 관리하는 도구입니다.

# 목적: 개인 환경을 코드로 정의
# 핵심 개념: 사용자 레벨 설정, dotfiles 관리
{
  # 패키지 설치
  home.packages = with pkgs; [
    git vim curl python3
  ];

  # 프로그램 설정
  programs.git = {
    enable = true;
    userName = "Developer";
    userEmail = "dev@example.com";
  };

  # 환경 변수
  home.sessionVariables = {
    EDITOR = "vim";
    BROWSER = "firefox";
  };
}

적용 범위:

  • 개인 패키지 관리
  • dotfiles 버전 관리
  • 프로그램 설정 통합

D.2 설치와 설정

Flake 기반 설치

# 목적: Home Manager Flake 구성
# 핵심 개념: 사용자별 구성, 모듈화
{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-23.11";
    home-manager = {
      url = "github:nix-community/home-manager/release-23.11";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs = { nixpkgs, home-manager, ... }: {
    homeConfigurations.developer = home-manager.lib.homeManagerConfiguration {
      pkgs = nixpkgs.legacyPackages.x86_64-linux;
      modules = [ ./home.nix ];
    };
  };
}

기본 설정

# 목적: Home Manager 기본 구성
# 핵심 개념: 사용자 정보, 상태 버전
{ config, pkgs, ... }:

{
  home.username = "developer";
  home.homeDirectory = "/home/developer";
  home.stateVersion = "23.11";

  programs.home-manager.enable = true;
}

D.3 개발 환경 구성

Python 개발 환경

# 목적: Python 개발자용 환경 설정
# 핵심 개념: 언어별 도구, 개발 워크플로우
{ config, pkgs, ... }:

{
  home.packages = with pkgs; [
    # Python 도구
    python3
    python3Packages.pip
    python3Packages.virtualenv

    # 개발 도구
    python3Packages.black
    python3Packages.flake8
    python3Packages.pytest

    # 에디터와 유틸리티
    git curl wget tree htop
  ];

  # Python 환경 변수
  home.sessionVariables = {
    PYTHONPATH = "$HOME/.local/lib/python3.11/site-packages";
    PIP_USER = "true";
  };

  # 별칭
  home.shellAliases = {
    py = "python3";
    pip = "pip3";
    venv = "python3 -m venv";
  };
}

웹 개발 환경

# 목적: 웹 개발자용 환경 설정
# 핵심 개념: 다중 언어, 빌드 도구
{
  home.packages = with pkgs; [
    # 런타임
    nodejs yarn
    python3

    # 도구
    git docker-client

    # 에디터 지원
    nodePackages.typescript
    nodePackages.eslint
  ];

  # 프로젝트별 설정
  programs.direnv = {
    enable = true;
    enableBashIntegration = true;
    nix-direnv.enable = true;
  };
}

D.4 프로그램 설정 관리

Git 설정

# 목적: Git 전역 설정 관리
# 핵심 개념: 버전 관리 설정, 워크플로우
{
  programs.git = {
    enable = true;
    userName = "Developer Name";
    userEmail = "dev@company.com";

    extraConfig = {
      init.defaultBranch = "main";
      push.default = "simple";
      pull.rebase = true;

      core.editor = "vim";
      merge.tool = "vimdiff";
    };

    aliases = {
      st = "status";
      co = "checkout";
      br = "branch";
      cm = "commit -m";
      lg = "log --oneline --graph";
    };

    ignores = [
      "*.pyc"
      "__pycache__/"
      ".venv/"
      ".DS_Store"
      "node_modules/"
    ];
  };
}

셸 환경

# 목적: 셸 환경 커스터마이징
# 핵심 개념: 생산성 향상, 자동화
{
  programs.bash = {
    enable = true;

    shellAliases = {
      ll = "ls -la";
      grep = "grep --color=auto";
      ".." = "cd ..";
    };

    initExtra = ''
      # 프롬프트 설정
      export PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

      # 히스토리 설정
      export HISTSIZE=10000
      export HISTFILESIZE=20000
    '';
  };

  programs.zsh = {
    enable = true;
    enableCompletion = true;
    enableAutosuggestions = true;
    syntaxHighlighting.enable = true;

    oh-my-zsh = {
      enable = true;
      theme = "robbyrussell";
      plugins = [ "git" "python" "node" ];
    };
  };
}

에디터 설정

# 목적: 에디터 환경 설정
# 핵심 개념: 개발 도구 통합
{
  programs.vim = {
    enable = true;

    extraConfig = ''
      set number
      set tabstop=4
      set shiftwidth=4
      set expandtab

      syntax on
      filetype plugin indent on

      set hlsearch
      set incsearch
    '';
  };

  programs.vscode = {
    enable = true;
    extensions = with pkgs.vscode-extensions; [
      ms-python.python
      ms-vscode.vscode-typescript-next
      esbenp.prettier-vscode
    ];

    userSettings = {
      "editor.formatOnSave" = true;
      "python.defaultInterpreterPath" = "${pkgs.python3}/bin/python";
      "editor.tabSize" = 2;
    };
  };
}

D.5 프로젝트별 환경

direnv 통합

# 목적: 프로젝트별 자동 환경 전환
# 핵심 개념: 디렉토리 기반 환경
{
  programs.direnv = {
    enable = true;
    enableBashIntegration = true;
    enableZshIntegration = true;
    nix-direnv.enable = true;
  };
}

프로젝트에서 사용:

# .envrc 파일 생성
echo "use flake" > .envrc
direnv allow

개발 템플릿

# 목적: 일관된 프로젝트 구조 제공
# 핵심 개념: 템플릿화, 자동화
{
  home.file = {
    # 프로젝트 템플릿
    "templates/python/.envrc".text = "use flake";
    "templates/python/flake.nix".text = ''
      {
        inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-23.11";
        outputs = { nixpkgs, ... }:
          let pkgs = nixpkgs.legacyPackages.x86_64-linux;
          in {
            devShells.x86_64-linux.default = pkgs.mkShell {
              buildInputs = with pkgs; [
                python3
                python3Packages.pytest
              ];
            };
          };
      }
    '';

    # 스크립트
    "bin/new-python-project" = {
      text = ''
        #!/bin/bash
        mkdir -p "$1"
        cd "$1"
        cp -r ~/templates/python/* .
        direnv allow
      '';
      executable = true;
    };
  };
}

D.6 환경 동기화

설정 백업

# Git 저장소로 설정 백업
cd ~/.config/home-manager
git init
git add .
git commit -m "초기 Home Manager 설정"
git remote add origin https://github.com/user/dotfiles.git
git push -u origin main

새 시스템에서 복원

# 설정 복제
git clone https://github.com/user/dotfiles.git ~/.config/home-manager
cd ~/.config/home-manager

# 환경 적용
home-manager switch --flake .

업데이트 관리

# 설정 업데이트
home-manager switch

# Flake 업데이트
nix flake update
home-manager switch --flake .

# 세대 관리
home-manager generations
home-manager switch --switch-generation 42

D.7 모듈화와 재사용

공통 모듈

# 목적: 재사용 가능한 설정 모듈
# 파일: common.nix
{ pkgs, ... }:

{
  home.packages = with pkgs; [
    git curl wget tree htop
  ];

  programs.git = {
    enable = true;
    extraConfig.init.defaultBranch = "main";
  };

  home.shellAliases = {
    ll = "ls -la";
    ".." = "cd ..";
  };
}

환경별 구성

# 목적: 환경별 특화 설정
# 파일: work.nix
{
  imports = [ ./common.nix ];

  home.packages = with pkgs; [
    docker-client kubectl
    slack discord
  ];

  programs.git = {
    userName = "Work Name";
    userEmail = "work@company.com";
  };
}

D.8 특징과 활용

장점

  • 사용자 레벨 선언적 관리
  • 시스템 관리자 권한 불필요
  • dotfiles 버전 관리
  • 프로젝트별 환경 자동화

제한사항

  • 시스템 레벨 설정 불가
  • GUI 프로그램 설정 제한적
  • 일부 프로그램 미지원

요약: Home Manager는 개인 개발 환경과 dotfiles를 체계적으로 관리하는 도구입니다. 사용자 레벨에서 재현 가능한 환경을 제공하여 개발 워크플로우를 표준화할 수 있습니다.