- macOS 애플리케이션은 명령줄 프로그램보다 복잡한 구성 요소를 가지며, 창과 메뉴 등 인터페이스 자원을 별도 구조로 관리함
-
Classic Mac OS에서는 실행 코드와 리소스가 파일의 리소스 포크에 저장되었으나, Mac OS X부터는 번들(bundle) 구조로 전환됨
- 앱 번들은 Contents 디렉터리를 중심으로, MacOS·Resources·Frameworks 등의 하위 폴더와 Info.plist 같은 핵심 파일로 구성됨
- 이후 코드 서명·App Store 영수증·공증(notarization) 등이 추가되며, 보안과 무결성을 강화한 구조로 발전함
- 이러한 자급적(app bundle) 구조는 설치·업데이트·삭제를 단순화하고, 보안성과 유지관리 효율성을 높이는 핵심 기반이 됨
Classic Mac OS의 앱 구조
- 초기 Mac OS에서는 창, 메뉴 등 UI 리소스를 실행 파일과 분리해 리소스 포크(resource fork) 에 저장
- 예시로 QuarkXPress 4.11의 리소스가 ResEdit에서 표시됨
- 실행 코드는 CODE 리소스에 포함되며, Finder가 인식할 수 있도록 파일 유형(type)과 생성자(creator) 정보가 함께 저장됨
Mac OS X의 번들 구조
-
Mac OS X는 NeXTSTEP에서 유래한 번들(bundle) 구조를 도입
- 앱은 .app 확장자를 가진 디렉터리 형태이며, 내부에 Contents 폴더를 포함
-
MacOS 폴더에는 GUI 앱의 실행 파일과 명령줄 도구가 포함됨
-
Resources 폴더에는 앱 아이콘, GUI 구성 요소 등 리소스 파일이 저장됨
- 일부 앱은 Frameworks 폴더를 포함해 dylib(동적 라이브러리) 를 내장함
-
Info.plist 파일은 필수이며, 실행 파일 이름, 아이콘, 최소 macOS 버전, 문서 유형, 버전 번호 등을 정의
-
PkgInfo 파일은 Classic Mac OS의 유형·생성자 정보를 유지하지만 필수는 아님
- 앱 실행 시 launchd가 실행 코드를 시작하며, LaunchServices와 RunningBoard가 Info.plist 정보를 기반으로 초기화 절차를 수행
macOS에서의 보안 및 확장
-
Mac OS X 10.5 Leopard(2007) 부터 코드 서명(Code Signature) 이 도입되어 _CodeSignature 폴더가 추가됨
-
CodeResources 파일에 코드 디렉터리 해시(CDHash)가 포함되어 앱 무결성을 검증
-
App Store 배포 앱은 _MASReceipt 폴더에 스토어 영수증을 포함
-
2018년 이후에는 공증(notarization) 이 도입되어, Apple이 발급한 티켓(ticket) 을 CodeResources 파일로 번들에 ‘스테이플(staple)’ 가능
- 현대 앱 번들은 과거에 시스템 폴더에 설치되던 구성 요소를 자체 포함
-
Library 폴더: LaunchDaemons, LoginItems 등
-
XPCServices 폴더: 앱이 사용하는 별도 실행 서비스
-
Plugins / Extensions 폴더: 앱 확장 기능 및 App Intents 포함
- 일부 앱에는 version.plist 파일도 존재
앱 번들의 이점
- 모든 구성 요소를 번들 내부에 통합함으로써 설치·업데이트·삭제가 간편해짐
- 구성 요소 누락 가능성이 줄고, 서명 및 공증 보호를 통해 보안성이 강화됨
-
App Store 앱은 추가적으로 영수증 및 공증 티켓을 포함해 신뢰성을 확보
-
Intel과 Arm 아키텍처 간 구조 차이는 없으며, Mach-O 실행 파일이 두 플랫폼용 코드를 모두 포함하는 유니버설(fat) 바이너리 형태로 저장됨
- 동일 파일 내에 각 아키텍처별 서명(signature) 이 함께 존재
앱 구조의 시각적 개요
- 다이어그램에서 연노란색은 필수 또는 거의 모든 앱에 존재하는 구성 요소
-
녹색은 App Store 배포 앱에서만 존재하는 항목, 파란색은 선택적 공증 티켓을 의미
- 추가적으로 Automator 워크플로우, 스크립트 등 부가 요소가 포함될 수 있음
- 전체적으로 macOS 앱은 자급적·보안 중심 구조로 진화해 왔음