Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 전체빌드와 증분빌드 차이점 본문

iOS 응용 (swift)

[iOS - swift] 전체빌드와 증분빌드 차이점

jake-kim 2025. 12. 10. 01:36

전체빌드 개념

  • 단어 그대로 캐싱 없이, a부터 z까지 모든 파일을 빌드하는 것 
  • cf) 빌드란?
    • 소스 코드들을 실행 가능한 형태로 메모리에 올리는 것

https://ios-development.tistory.com/1336

증분빌드 개념

  • 증분 빌드(Incremental Build)는 “변화가 영향을 미치는 범위만 찾아서 필요한 파일만 재컴파일”하는 방식
  • Xcode는 이를 위해 “의존성 그래프(Dependency Graph)”와 “인터페이스 파일(.swiftinterface / .dia)”을 사용

증분빌드 원리

  • 빌드 시스템은 파일마다 해시(hash) 또는 timestamp를 기록해 두고 있다가 사용
FileA.swift → 해시값 0xA2B3 
FileB.swift → 해시값 0xC883
  • Swift는 모든 .swift 파일 내부의 타입, 프로토콜, extension 등을 분석해 파일 간의 의존성 그래프를 만듦
    • User.swift를 변경하면 → ProfileView.swift, SettingsView.swift도 다시 빌드되어야 함
    • 하지만 SettingsView 안에서 User를 쓰지 않으면 → 건드릴 필요 없음
User.swift ← ProfileView.swift ← SettingsView.swift
  • Swift 컴파일러는 각 파일의 인터페이스 파일을 생성

예) 인터페이스 파일 (인터페이스: Stored property, function signature, protocol 정의)

MyType.swift MyType~partial.swiftmodule
외부 모듈 .swiftinterface
  • 만약? 함수 내부(body)만 바뀌면?
    • 인터페이스는 그대로 → 다른 파일은 영향 없음 → 증분 빌드 가능
  • stored property, public API 변경되면?
    • 인터페이스가 바뀜 → 영향을 받는 모든 파일 재컴파일 → 증분 빌드 불가

전체 빌드로 되는 경우?

  • 다음 중 하나라도 일어나면 전체빌드로 됨
    • 이런 경우엔 “의존성 그래프” 자체가 다시 계산되기 때문
모듈 public interface 변경
struct stored property 변경
protocol 변경
extension에 public method 추가
Swift version 변경
optimization level 변경
Package / Pod 업데이트
DerivedData 삭제
Build setting 변경
bridging header(ObjC) 변경

ex) 증분빌드인지 알아내는 방법

  • xcresult 결과를 보면 핵심 파일인 ContentView.swift 파일이 있는데, 이 파일 이컴파일 될때 wasFetchedFromCache가 true인 것을 보면 캐싱되어서 증분빌드 되었다는 것을 추측 가능

Comments