macOS 디렉토리 구조 이해하기

macOS로 개발하고 계신 분들, 터미널에서 ls /를 실행해보신 적 있으신가요? Linux를 써봤다면 어딘가 익숙하면서도 좀 다르다는 느낌을 받으실 텐데요. bin, usr, etc 같은 친숙한 이름들 사이에 Applications, Library, System 같은 macOS만의 디렉토리가 섞여 있기 때문입니다.

macOS가 BSD Unix를 기반으로 만들어진 운영체제라서 그런 건데요. Unix의 전통적인 디렉토리 구조를 계승하면서도 GUI 중심의 사용자 경험을 위해 Apple만의 디렉토리를 추가한 거죠. Unix/Linux 디렉토리 구조를 이미 알고 계신다면 이번 글이 더 수월할 겁니다.

macOS에서 ls / 해보기

먼저 터미널을 열고 루트 디렉토리를 살펴볼까요?

결과
$ ls /
Applications  System  Users  Volumes  bin  cores  dev
etc           home    Library  opt     private  sbin  tmp  usr  var

Linux에서 보던 bin, etc, usr, var도 있고, Applications, Library, System, Volumes, private 같은 macOS 고유의 디렉토리도 보입니다. 하나씩 알아보겠습니다.

/Applications — 응용 프로그램

macOS에서 가장 친숙한 디렉토리죠. GUI 앱들이 설치되는 곳입니다.

$ ls /Applications
Safari.app  Mail.app  Xcode.app  Visual Studio Code.app
Google Chrome.app  iTerm.app  Slack.app  Docker.app

macOS의 앱은 .app 확장자를 가진 번들(bundle)인데요. Finder에서는 하나의 아이콘처럼 보이지만 실제로는 실행 파일, 리소스, 설정 파일 등을 담고 있는 디렉토리입니다.

$ ls "Visual Studio Code.app/Contents"
Frameworks  Info.plist  MacOS  PkgInfo  Resources  _CodeSignature

/Applications에 설치된 앱은 시스템의 모든 사용자가 사용할 수 있습니다. 특정 사용자만 사용하는 앱은 ~/Applications에 설치할 수 있고요. Homebrewbrew install --cask 명령어로 설치하는 앱도 기본적으로 /Applications에 들어갑니다.

$ brew install --cask visual-studio-code
==> Moving App 'Visual Studio Code.app' to '/Applications/Visual Studio Code.app'

/Users — 사용자 홈 디렉토리

Linux에서 /home에 해당하는 곳인데요. 사용자별 개인 디렉토리가 모여 있습니다.

$ ls /Users
dale  Shared

~(틸드)는 현재 사용자의 홈 디렉토리를 가리킵니다. cd ~cd /Users/dale은 같은 곳이죠.

$ echo $HOME
/Users/dale

$ ls ~
Applications  Desktop  Documents  Downloads  Library
Movies  Music  Pictures  Public

macOS에서는 Desktop, Documents, Downloads 같은 디렉토리가 홈 아래에 자동으로 만들어지는데요. 개발자라면 이 외에도 dotfile(.zshrc, .gitconfig)과 프로젝트 코드를 여기서 관리하게 됩니다.

한 가지 재미있는 점은 macOS에도 /home 디렉토리가 존재하긴 하지만 비어 있다는 겁니다. 네트워크 홈 디렉토리를 위해 예약된 경로이고, 실제 사용자 홈은 /Users 아래에 있습니다.

$ ls /home
$

/Users/Shared는 모든 사용자가 접근할 수 있는 공유 디렉토리입니다. 여러 사용자 간에 파일을 주고받을 때 쓸 수 있습니다.

/Library — 시스템 라이브러리와 설정

/Library는 macOS에서 가장 독특한 디렉토리 중 하나인데요. 비슷한 이름의 디렉토리가 세 곳에 있어서 처음에는 헷갈리기 쉽습니다.

경로범위접근 권한
/System/LibraryApple 시스템 전용읽기 전용 (SIP 보호)
/Library시스템 전체 (모든 사용자)관리자 권한 필요
~/Library현재 사용자 전용자유롭게 접근 가능

가장 자주 접하게 되는 건 ~/Library인데요. 앱의 설정, 캐시, 로그 등이 이 안에 저장됩니다.

$ ls ~/Library
Application Support  Caches  Containers  Fonts
LaunchAgents  Logs  Preferences  Saved Application State

주요 하위 디렉토리를 살펴보면…

~/Library/Application Support에는 앱별 데이터 파일이 들어갑니다. VS Code의 확장 프로그램이나 Chrome의 프로필 데이터 같은 것들이죠.

$ ls ~/Library/Application\ Support/Code
User  extensions  logs

~/Library/Preferences에는 앱 설정이 .plist(Property List) 파일로 저장됩니다. defaults 명령어로 읽고 쓸 수 있습니다.

$ defaults read com.apple.finder ShowPathbar
1

~/Library/Caches에는 앱이 성능을 위해 저장하는 캐시 데이터가 있고, ~/Library/Logs에는 앱별 로그 파일이 쌓입니다.

$ ls ~/Library/Logs
DiagnosticReports  Homebrew

~/Library/LaunchAgents에는 로그인할 때 자동으로 실행되는 서비스 정의 파일이 들어갑니다. 시스템 전체에 적용되는 서비스는 /Library/LaunchDaemons에 위치합니다.

/System — 시스템 파일

macOS의 핵심 시스템 파일이 있는 곳입니다. macOS Catalina(10.15)부터 읽기 전용 시스템 볼륨으로 분리되어 SIP(System Integrity Protection)에 의해 보호받고 있습니다.

$ ls /System
Applications  Developer  DriverKit  Library  Volumes  iOSSupport

/System/Library에는 Apple의 프레임워크와 시스템 구성 요소가 들어 있습니다.

$ ls /System/Library/Frameworks
AppKit.framework  CoreFoundation.framework  Foundation.framework
Security.framework  SwiftUI.framework  WebKit.framework

이 디렉토리를 직접 수정하려고 하면 SIP가 차단합니다. csrutil status로 SIP 상태를 확인할 수 있습니다.

$ csrutil status
System Integrity Protection status: enabled.

SIP 덕분에 악성 소프트웨어가 시스템 파일을 변조하는 것을 방지할 수 있죠.

/Volumes — 마운트 포인트

macOS에서 디스크와 파티션이 마운트되는 곳입니다. Linux의 /mnt/media에 해당한다고 보면 됩니다.

$ ls /Volumes
Macintosh HD  Macintosh HD - Data  USB_Drive

macOS Catalina 이후로는 시스템이 두 개의 볼륨으로 나뉘어 있는데요. Macintosh HD는 읽기 전용 시스템 볼륨이고, Macintosh HD - Data는 사용자 데이터가 저장되는 볼륨입니다.

USB 드라이브나 외장 하드를 연결하면 자동으로 /Volumes 아래에 마운트됩니다. 터미널에서 외장 디스크의 파일을 다룰 때 이 경로를 사용하면 됩니다.

$ cp ~/Documents/backup.tar.gz /Volumes/USB_Drive/

마운트를 해제할 때는 diskutil 명령어를 씁니다.

$ diskutil unmount /Volumes/USB_Drive
Volume USB_Drive on disk2s1 unmounted

/private — 숨겨진 Unix 디렉토리

macOS를 쓰다 보면 /etc, /tmp, /var가 Linux처럼 존재하는 것 같은데, 사실 이것들은 심볼릭 링크입니다. 실제 파일은 /private 아래에 있습니다.

$ ls -la /etc /tmp /var
lrwxr-xr-x  1 root  wheel  11 Jan  1 00:00 /etc -> private/etc
lrwxr-xr-x  1 root  wheel  11 Jan  1 00:00 /tmp -> private/tmp
lrwxr-xr-x  1 root  wheel  11 Jan  1 00:00 /var -> private/var

이렇게 해 놓은 이유는 Unix 호환성을 유지하면서도 macOS 고유의 파일 시스템 구조를 깔끔하게 분리하기 위해서인데요. 일상적으로 쓸 때는 /etc/hosts라고 하든 /private/etc/hosts라고 하든 같은 파일에 접근합니다.

$ cat /etc/hosts
##
# Host Database
##
127.0.0.1       localhost
255.255.255.255 broadcasthost
::1             localhost

/private/var/log에는 macOS의 시스템 로그가 쌓이지만, macOS에서는 log 명령어나 Console 앱을 통해 통합 로깅 시스템을 사용하는 것이 일반적입니다.

$ log show --last 5m --predicate 'process == "kernel"'

/usr, /bin, /sbin — Unix 호환 디렉토리

이 디렉토리들은 Linux와 공유하는 전통적인 Unix 디렉토리인데요. macOS에서도 기본적인 역할은 동일합니다.

$ ls /bin
bash  cat  cp  date  dd  echo  expr  hostname
kill  ln   ls  mkdir  mv  pwd  rm  rmdir  sh  sleep  zsh
$ ls /usr/bin | head
afconvert  afinfo  afplay  atos  automator  awk

다만 macOS에서는 이 디렉토리들이 읽기 전용 시스템 볼륨에 위치해 있어서 파일을 추가하거나 수정할 수 없습니다. 직접 프로그램을 설치하고 싶다면 Homebrew를 사용하는 것이 macOS에서의 표준적인 방법입니다.

각 디렉토리의 자세한 역할은 Unix/Linux 디렉토리 구조 이해하기에서 설명하고 있으니 참고해보세요.

/opt/homebrew — Homebrew (Apple Silicon)

Homebrew를 사용하고 계신다면 이 디렉토리가 익숙하실 텐데요. Apple Silicon(M1, M2, M3, M4) Mac에서 Homebrew가 설치되는 기본 경로입니다.

$ brew --prefix
/opt/homebrew

$ ls /opt/homebrew
bin  Caskroom  Cellar  etc  Frameworks  include
lib  opt  sbin  share  var

/opt/homebrew/bin에 Homebrew로 설치한 프로그램들의 실행 파일이 들어가는데요. git, node, python3 같은 명령어가 여기에 있습니다.

$ which git
/opt/homebrew/bin/git

$ which node
/opt/homebrew/bin/node

Intel Mac에서는 Homebrew가 /usr/local에 설치됩니다. Apple Silicon으로 넘어오면서 경로가 바뀐 이유는 /usr/local이 읽기 전용 시스템 볼륨에 영향을 줄 수 있기 때문인데요. /opt는 원래 “서드파티 소프트웨어”를 위한 디렉토리이니 의미상으로도 더 적합합니다.

아키텍처Homebrew 경로
Apple Silicon (M1/M2/M3/M4)/opt/homebrew
Intel/usr/local

한눈에 보기

macOS의 주요 디렉토리를 정리하면 이렇습니다.

디렉토리용도Linux 대응
/ApplicationsGUI 앱 (.app 번들)해당 없음
/Users사용자 홈 디렉토리/home
/Library시스템/앱 설정, 캐시, 로그해당 없음
/SystemApple 시스템 파일 (읽기 전용)해당 없음
/Volumes디스크 마운트 포인트/mnt, /media
/private/etc, /tmp, /var의 실제 위치해당 없음
/opt/homebrewHomebrew 패키지 (Apple Silicon)/opt
/usr, /bin, /sbinUnix 기본 실행 파일과 라이브러리동일
/etc/private/etc시스템 설정 파일/etc
/tmp/private/tmp임시 파일/tmp
/var/private/var가변 데이터 (로그, 캐시)/var
/dev장치 파일/dev

마치며

macOS는 Unix의 뿌리 위에 Apple만의 체계를 덧입힌 운영체제입니다. /bin, /usr, /etc 같은 전통적인 Unix 디렉토리를 유지하면서도 /Applications, /Library, /System 같은 macOS 고유의 구조를 추가해서 GUI와 CLI 양쪽 모두를 아우르고 있죠.

macOS에서 개발하고 Linux 서버에 배포하는 워크플로우가 일반적인 요즘, 양쪽 디렉토리 구조를 모두 알아두면 환경 전환이 한결 수월해집니다. Linux 디렉토리 구조가 더 궁금하시다면 Unix/Linux 디렉토리 구조 이해하기를 참고하시고, macOS의 패키지 관리가 궁금하시다면 Homebrew 완벽 가이드도 함께 읽어보세요.

This work is licensed under CC BY 4.0 CC BY

개발자를 위한 뉴스레터

달레가 정리한 AI 개발 트렌드와 직접 만든 콘텐츠를 전해드립니다.

Discord