azhy의 iOS 이야기

[iOS] Static Framework & Dynamic Framework (feat. Tuist) 본문

iOS

[iOS] Static Framework & Dynamic Framework (feat. Tuist)

azhy 2024. 11. 14. 21:16

2024년 1월 26일에 작성됨

 

Static Framework & Dynamic Framework에 대해 한번 정리하려 합니다. Tuist 세팅할 때 고생한 부분이기도 하고.. 공부하면서 정리해 두면 좋겠다 싶은 부분이라서요!

Framework

간단하게 설명하면 프레임워크는 위에서 프로그램을 구현하는 틀 이라고 생각하시면 됩니다. 또한 여러 요소들도 제공해 주는데,

예를 들어 에셋, nib 파일 등등을 제공해 주고 이를 사용합니다. 그리고 이 요소들과 위의 가이드 규칙을 꼭 지켜서 만들어야 합니다.

프레임워크를 이야기하면 꼭 나오는 라이브러리는 도와주는 도구일 뿐 사용해도 상관없고 사용 안 해도 상관이 없습니다.

 

그래서 이렇게 정의할 수 있습니다.
Framework = Library + Asset(Bundle)

Static Framework

스태틱 프레임워크는 이름 그대로 정적으로 연결되어 있습니다. 빌드 시 링킹이 이루어지고 Static Linker를 통해 힙 메모리 영역에 들어갑니다.

따라서 Static Library가 복사되므로 , Static Framework를 여러 Framework에서 사용하면 코드 중복이 발생합니다.

쉽게 설명하면 스태틱 프레임워크는 초기에 모든 걸 다 고정으로 두고 갑니다.

전체 소스를 제공하지 않고 SDK 형태를 가지면 이 설정으로 하는 것이 좋습니다.

Dynamic Framework

반대로 다이나믹 프레임워크는 동적으로 연결되어 있습니다. 즉 앱을 런타임 하고 사용 시 Dynamic 하게 링크해 줍니다. 기본으로 프레임워크 생성하면 다이나믹으로 설정됩니다.

Static Linker을 통해 Dynamic Library Reference가 응용 프로그램 실행 파일에 들어가고 모듈 호출 시 Stack에 있는 Library에 접근하여 사용합니다.

리소스를 스스로 가지고 있거나 전체 에셋을 제공한다면 이 설정을 하는 것이 좋습니다.

Mach-O Type, Embed vs Do Not Embed

사실 이 부분 때문에 framework에 대해서 열심히 공부하게 됐습니다..
이 두 친구들은 프레임워크 관련해서 굉장히 중요 옵션입니다.

 

Mach-O Type

 

프레임워크를 제공하는 쪽에서 선택해줘야 하는 옵션

  1. Executable - 메인 프로젝트인지 (프레임워크가 아닌 메인 실행 프로젝트)
  2. Dynamic Library - 동적 라이브러리 (런타임 중에 링크)
  3. Bundle - 단순 이미지와 같은 리소스를 제공해 주는 목적인 프로젝트인지
  4. Static Library - 정적 라이브러리 (빌드 타임에 링크)
  5. Relocatable Object File - 동적 라이브러리의 다른 단어

Embed vs Do Not Embed

 

프레임워크를 사용하는 쪽에서 선택해줘야 하는 옵션

우선 Embed는 이 프레임워크를 앱에 넣어라는 뜻입니다. 반면 Do Not Embed는 앱에 이 프레임워크를 넣지 말라는 뜻이고요.

Static Library는 build time에 연결되고 Dynamic Library는 runtime에 연결되어서 Dynamic Library는 runtime에 코드들을 embed 시켜서 사용합니다.

위에서 말한 Dynamic은 런타임에 의존되는데 만약 Do Not Embed로 하게 되면 런타임에서 이 프레임워크가 필요할 때 호출해도 없으니 에러가 납니다. 반면 Static은 이미 빌드 시 넣어줬기에 Do Not Embed를 해야 합니다. 다시 Embed 하는 것은 중복입니다.

 

Tuist

여담으로.. 애플 디벨로퍼 아카데미 마지막 프로젝트에서 tuist를 사용했었는데요.. 전체 에셋을 제공하는 DesignSystem 모듈에 staticFramework로 세팅한다거나, Feature 모듈에 dynamicFramework로 세팅한다거나.. 처음에는 이런 개념도 모르고 막 하다가 에러로 고생한 경험이 있습니다.. ㅎㅎㅎㅎ;

 

Tuist 세팅하실 때 이 부분은 꼭 주의해서 세팅해 주세요!! :)