티스토리 뷰
iOS 앱을 개발하다 보면 Xcode에서 빌드를 수행하는 과정이 어떻게 진행되는지 궁금할 때가 있다.
빌드 속도가 느려질 때 최적화하는 방법을 찾거나, 빌드 오류가 발생했을 때 원인을 정확히 파악하려면 Xcode의 빌드 프로세스를 이해하는 것이 중요하다.
이번 글에서는 Xcode 빌드 프로세스의 주요 단계를 정리하고, 각 단계에서 무슨 일이 일어나는지 살펴보자
1️⃣ Xcode 빌드 프로세스 개요
Xcode에서 프로젝트를 빌드할 때는 여러 단계를 거쳐 최종 실행 가능한 앱(Binary)이 생성된다.
이 과정은 다음 5단계로 정리할 수 있다.
| 단계 | 설명 |
| Preprocessing (전처리) | 소스 코드에서 #import, #define 등의 전처리를 수행 |
| Compiling (컴파일) | 소스 코드를 LLVM을 사용해 중간 코드(LLVM IR)로 변환 |
| Assembling (어셈블) | 중간 코드(IR)를 기계어로 변환 |
| Linking (링킹) | 여러 개의 오브젝트 파일(.o)과 라이브러리를 하나의 실행 파일로 합침 |
| Code Signing & Packaging (코드 서명 및 패키징) | 앱 번들을 생성하고 서명하여 실행 가능하도록 준비 |
이제 각 단계에서 무슨 일이 일어나는지 좀 더 자세히 살펴보자
2️⃣ Xcode 빌드 단계별 과정
✅ 1. Preprocessing (전처리)
C/C++ 기반의 Objective-C 코드에서만 해당되는 과정으로, Swift에서는 별도로 수행되지 않는다.
이 단계에서는 #import, #define 등의 전처리기 지시문이 처리된다.
📌 이 단계에서 발생할 수 있는 문제
- #import로 인한 중복 포함 문제
- #define이 예상과 다르게 치환되는 문제
💡 Preprocessor 결과를 확인하는 방법
clang -E main.m
위 명령어를 실행하면 전처리된 코드를 확인할 수 있다.
✅ 2. Compiling (컴파일)
Swift 또는 Objective-C 코드를 중간 코드(LLVM IR) 로 변환하는 과정이다.
Xcode는 LLVM(Clang + Swift Compiler) 을 사용해 소스 코드 → LLVM IR → 기계어 순서로 변환한다.
📌 이 단계에서 발생할 수 있는 문제
- Syntax Error: 문법 오류
- Type Error: 타입 불일치 오류
- Undefined Symbol: 정의되지 않은 변수나 함수 사용
💡 Swift 컴파일러가 어떻게 코드를 변환하는지 확인하는 방법
swiftc -emit-llvm main.swift
이 명령어를 실행하면 LLVM IR 코드를 확인할 수 있다.
✅ 3. Assembling (어셈블)
컴파일된 중간 코드(LLVM IR)를 실제 CPU가 이해할 수 있는 기계어 코드로 변환하는 과정이다.
이 과정에서는 .o (Object File) 형태의 바이너리 파일이 생성된다.
📌 이 단계에서 발생할 수 있는 문제
- Undefined Reference 오류: 다른 모듈에서 정의된 함수/변수를 찾지 못하는 경우 발생
💡 어셈블된 바이너리 파일 확인하는 방법
swiftc -emit-assembly main.swift
이 명령어를 실행하면 기계어(어셈블리) 코드를 볼 수 있다.
✅ 4. Linking (링킹)
여러 개의 .o (Object File)을 하나의 실행 가능한 바이너리로 합치는 과정이다.
이 과정에서는 라이브러리(.dylib, .a) 및 시스템 프레임워크를 포함한 모든 코드가 하나로 결합된다.
📌 이 단계에서 발생할 수 있는 문제
- Undefined Symbols 오류: 링크할 파일에서 해당 기호(symbol)를 찾을 수 없을 때 발생
- Duplicate Symbols 오류: 같은 기호가 여러 번 정의되었을 때 발생
💡 링크 과정에서 포함된 파일 확인하는 방법
ld -v
이 명령어를 실행하면 사용된 링커 버전 및 라이브러리 정보를 확인할 수 있다.
✅ 5. Code Signing & Packaging (코드 서명 및 패키징)
마지막으로 앱을 배포할 수 있도록 코드 서명을 수행하고, 최종적으로 .app 번들을 생성한다.
이 과정에서는 Apple의 보안 정책을 준수하는지 검사하고, 앱이 정상적으로 실행될 수 있도록 한다.
📌 이 단계에서 발생할 수 있는 문제
- Code Signing 오류: 인증서가 올바르게 설정되지 않으면 발생
- Provisioning Profile 오류: 앱 실행에 필요한 프로비저닝 프로필이 없을 경우 발생
💡 Code Signing 로그 확인하는 방법
codesign -vvv --deep MyApp.app
이 명령어를 실행하면 서명이 올바르게 적용되었는지 확인할 수 있다.
3️⃣ Xcode 빌드 속도 최적화 방법
Xcode 빌드가 너무 느려지는 경우, 다음과 같은 방법으로 최적화할 수 있다.
1. 병렬 빌드 활성화
File > Workspace Settings에서 "Parallelize Build" 옵션을 활성화하면 여러 파일을 동시에 빌드할 수 있다.
2. 불필요한 Debug 로그 비활성화
디버그 로그(print(), NSLog())가 많으면 빌드 속도가 느려질 수 있으므로 필요 없는 로그는 제거하는 것이 좋다.
3. Derived Data 삭제
빌드 캐시가 쌓이면 빌드 속도가 느려질 수 있다. Derived Data를 주기적으로 삭제하면 성능이 개선된다.
rm -rf ~/Library/Developer/Xcode/DerivedData
4. Whole Module Optimization 활성화
Build Settings > Swift Compiler - Code Generation에서 "Whole Module Optimization"을 활성화하면 Swift 컴파일 속도를 크게 향상시킬 수 있다.
정리
✅ Xcode의 빌드 프로세스는 전처리 → 컴파일 → 어셈블 → 링크 → 코드 서명의 5단계로 진행된다.
✅ 컴파일 단계에서는 LLVM을 사용해 소스 코드 → LLVM IR → 기계어 코드로 변환된다.
✅ 링크 단계에서는 여러 개의 오브젝트 파일과 라이브러리가 하나의 실행 파일로 결합된다.
✅ 최종적으로 코드 서명과 패키징을 거쳐 앱이 실행 가능한 상태로 만들어진다.
✅ 빌드 속도를 최적화하려면 병렬 빌드, Derived Data 삭제, Whole Module Optimization 등의 방법을 활용할 수 있다.
Xcode 빌드는 단순히 버튼 하나로 끝나는 과정처럼 보이지만, 내부적으로는 꽤 복잡한 단계를 거친다.
이 과정들을 이해하면 빌드 속도를 최적화하고, 발생하는 오류를 빠르게 해결할 수 있다.
이제 직접 빌드 과정을 분석하고, 더 빠르고 안정적인 iOS 앱 개발에 도전해보자
'iOS' 카테고리의 다른 글
| TCA(The Composable Architecture): iOS 개발의 새로운 패러다임 (0) | 2025.03.11 |
|---|---|
| iOS 스태틱 vs 다이나믹 라이브러리, 뭐가 다를까? (0) | 2025.03.05 |
| iOS 앱 생명주기(App Lifecycle) 제대로 알아보기 (0) | 2025.03.03 |
| OperationQueue - iOS에서 비동기 작업을 효율적으로 관리하는 방법! (0) | 2025.02.27 |
| Async/Await 완벽 정리 – 왜 써야 할까? 어떻게 써야 할까? (0) | 2025.02.26 |