개발자를 위한 효율적인 MacOS 백업 방법

아이맥(iMac) 또는 맥북(Macbook)을 새로 구입해서 기존 데이터를 마이그레이션 하거나, 기존 사용하던 맥에 문제가 생겨서 AS 센터를 방문해야할 경우 데이터 백업이 필수이다. 이때 어떻게 하면 꼭 필요한 파일만 백업해서 백업 소요시간과 디스크 용량을 절약 할 수 있을지 알보도록 하자.

작업을 진행하기 전에 Mac OS 쓸모없는 파일 정리를 통한 하드 공간 확보 글을 보고 필요없는 파일들을 먼저 정리해두자.

자주 사용하지 않는 앱들도 미리 삭제하면 백업을 좀더 빠르게 할 수 있다.
앱 바이너리 파일 뿐만 아니라 관련해서 생성되는 설정/캐시파일까지 깨끗하게 삭제하려면 AppCleaner를 이용해서 앱을 삭제하는 것을 추천한다.

타임머신(Time Machine) 이용한 백업 방법

타임머신을 사용하면 특별히 신경쓸 것 없이 편리하게 백업을 수행해주지만 원하지 않는 불필요한 파일들까지 백업(backup)되면서 공간도 낭비되고 속도가 느려질 수 있다.

특히 개발자의 경우 사용하는 언어별로 보통 패키지 관리자(package manager) 또는 의존성 관리자(dependency manager)를 사용해서 다른 소스파일 또는 바이너리들을 다운로드 한다. 이때 패키지 관리자에서 받아온 파일들을 보통 사용자의 홈디렉토리에 캐시하게 되고, 특별한 설정을 해주지 않으면 이 캐시(cache) 디렉토리들이 백업할 목록에 포함되기 때문에 백업 속도가 느려지게 된다. 이러한 파일들은 백업에 포함시키지 않더라도 나중에 언제든지 다시 다운로드가 가능하기때문에 백업에서 제외하는것이 좋다.

홈 디렉토리의 불필요한 파일 제외하기

아래 목록은 대표적인 캐시 디렉토리 들이니 시스템 설정 > 타임머신 > 설정 메뉴에서 제외할 경로에 추가해주면 된다.

  • ~/.android
  • ~/.asdf/installs
  • ~/.bundle
  • ~/.cache
  • ~/.cocoapods
  • ~/.composer
  • ~/.gem
  • ~/.gradle
  • ~/.ivy
  • ~/.m2
  • ~/.node-gyp
  • ~/.npm
  • ~/.pnpm-store
  • ~/.yarn

여러 프로젝트들에서 각각 불필요한 파일 제외하기

위에 살펴본 홈디렉토리의 불필요한 파일들은 고정된 경로라서 타임머신 설정 UI를 통해서도 손쉽게 제외가 가능하다. 하지만 프로젝트 디렉토리별로 생기는 불필요한 파일들은 하나하나 찾아서 등록하는것이 쉽지 않으며, 경로가 바뀌거나 새로 추가되는 경우 매번 변경해줘야하는 불편함이 있다.

언어별로 살펴보면 대표적으로 다음과 같은 의존성 모듈 디렉토리들이 프로젝트 내부에 생성된다.

  • PHP (composer) – vendors
  • nodejs (npm or yarn) – node_modules
  • iOS (cocoapods) – Pod

의존성 모듈 외에도 빌드시에 프로젝트 내부에 생성되는 파일들이 존재하는데 대표적으로 다음과같은 디렉토리 들이 있다.

  • Java/Kotlin (maven) – target
  • Java/Kotlin (gradle) – build

타임머신의 백업 제외 UI에서 이러한 경로들을 제외할 수 있게 정규식 패턴 매칭 (regex pattern matching) 등의 기능을 제공해주면 좋겠지만, 해당 기능은 안타깝게도 존재하지 않는다.

대신 asimov 라는 스크립트를 사용하여 홈 디렉토리 내에서 지정한 패턴들을 찾아 해당 디렉토리들을 백업하지 말라고 태깅을 하는 방법이 있다. (스크립트 내부적으로 tmutil 이라는 애플에서 제공하는 타임머신 CLI 명령어를 이용하여 태깅을 진행한다)

설치스크립트를 통해서 launchd에 등록하여 주기적으로 자동으로 태깅 할 수도 있지만, 꼭 설치할 필요는 없고 타임머신 백업 직전에 한번 실행만 하는것으로도 충분하다.

  • 필자의 경우 gradle 빌드 시스템을 많이 사용하는데 해당 스크립트에서 gradle 지원하지 않아서 아래 패턴을을 asimov 스크립트를 열어서 readonly ASIMOV_VENDOR_DIR_SENTINELS에 직접 추가했다.
    'build build.gradle'
    'build build.gradle.kts'
    '.gradle settings.gradle'
    '.gradle settings.gradle.kts'
  • 그 외에도 protobuf로 생성된 파일이나 prisma로 생성된 파일 등을 제외시켰다
    • 'client schema.prisma'
      'generated _project.proto'
      '.yarn package.json'
  • 주의: 타임머신 설정화면에서는 추가된 ‘경로’ 기준으로 백업에서 제외하지만, 위 스크립트를 사용해서 태깅된 파일들은 해당 파일(디렉토리)에 백업하지 말라는 메타정보가 저장되어있기 때문에 해당 파일을 다른곳으로 옮기더라도 여전히 백업에서 제외된다. (asimov를 이용해서 백업 제외된 디렉터리의 목록은 타임머신 설정화면에는 나타나지 않는다.)

타임머신(Time Machine)을 사용하지 않는 수동 백업 방법

가끔 맥을 너무 오랫동안 사용해서 불필요한 파일들이 어쩔 수 없이 많이 쌓이게 되지만, 어떤 파일들이 불필요한지 구분이 힘들어지는 경우가 있다. 이럴 때 모든것을 리셋하고 처음부터 깨끗하게 다시 시작하면 좋다. 이 경우 타임머신을 사용해서 모든 파일을 클론하기 보다는 꼭 필요한 파일들만 복사해두었다가 완전히 리셋된 맥에 하나씩 옮겨주는 방법을 사용하는 것이 좋다.

아래 디렉토리 목록은 필자가 실제 백업할 때 이용했던 목록이고, 아래 목록의 파일들을 잘 옮겨주니 새로운 맥에서도 기존에 쓰던 환경과 다르지 않게 잘 사용할 수 있었다.

  • /Applications
    • 앱스토어 또는 웹사이트에서 손쉽게 새로 내려받을 수 있는 어플리케이션은 굳이 백업하지 않아도 괜찮다.
  • 홈 디렉토리(~)
    • ~/Library
      • Application Support
        • 다 옮겨도 되지만 앞으로도 계속 사용할 Application의 이름을 확인한 후 하나씩 옮겨도 된다.
      • Preferences
      • Fonts
        • 추가로 설치된 폰트가 있는경우 같이 옮긴다.
      • KeyChains
        • Wifi비번, 인증서, 저장된 로그인 비밀번호 등을 옮겨가고 싶다면 이 폴더도 같이 백업한다.
    • 홈 디렉토리의 숨겨진 파일들을 주의해서 백업
      * 보통 CLI 도구의 인증정보나 shell 관련 파일들이 많아서 누락되게 되면 다시 일일히 설정하는데 시간이 많이 걸리기 때문에 꼭 잘 백업해야 한다.

      • ex) .ssh, .bash_profile, .aws, …
  • 기타 설정 파일
    • /etc/hosts
  • 맥에 기본 설치되어있는 아파치 웹서버 사용시 백업 필요
    • /Library/Webserver/Document
    • /etc/apache2
  • mysql 로컬 서버 사용시 DB 파일 백업 필요
    • /usr/local/var/mysql/
  • /opt/homebrew
    • brew 명령어로 설치된 프로그램들이 모여있음
    • 직접 복사해서 백업해도 문제 없음.
    • 새 컴퓨터에서 클린 설치 하고싶은 경우 아래 명령어를 통해 기존 설치 목록을 저장해뒀다가 새 컴퓨터에서 해당 목록 기준으로 설치 진행.
    • brew bundle dump --file=~/Brewfile

참고로 외장 하드 등으로 파일들을 수동으로 복사 할 때 외장하드의 파티션 종류에 따라서 파일/디렉토리들의 권한(permission) 설정이 틀어질 수 있다. 몇몇 파일/디렉토리를 을 실험삼아 외장 하드에 복사한 후 shell에서 ls -al 명령어를 이용하여 원래 파일과 백업된 파일의 권한이 동일한지 꼭 확인해보도록 하자.