lgvv98

Library vs Framework 정리 본문

apple/Docs, iOS, Swift

Library vs Framework 정리

lgvv 2024. 8. 29. 02:44

Library vs Framework 정리

 

모듈화의 개념을 이해하기 전 기초 지식으로 정리.

 

Library란?

  • 개발자가 만들 클래스들의 집합으로 다른  프로그램에서 사용할 수 있도록 제공

Framework란?

  • 소프트웨어를 개발하는데 있어서 개발 시간을 줄이고, 코드의 재사용성을 증가시키기 위해 묶음이나 뼈대(틀)을 라이브러리 형태로 제공되는 것.
  • 제어의 역전 개념이 적용된 대표적 기술

 

Library와 framework의 차이

  • 라이브러리와 프레임워크의 차이는 제어 흐름의 주도성이 누구 / 어디에게 있는가가 포인트
  • 즉, 애플리케이션의 흐름(Flow)를 누가 갖고 있느냐의 차이

프레임워크는 스스로 제어 흐름의 주도성을 갖는 반면, 라이브러리는 개발자가 가짐.

 

 

StaticLibrary / Dynamic Libarary / Megable Library

 

해당 부분을 이해하기 위해선 운영체제 지식이 선행되어야 함.

 

컴파일이란?

원시 코드를 컴퓨터가 이해할 수 있는 언어로 번역해주는 과정

 

컴파일 과정

 

  • 전처리기(preprocessor): 소스코드의 주석제거, define을 치환하는 기능
  • 컴파일러(compiler): 어셈블리 파일로 변환(어셈블리어는 CPU 명령어 조합으로 CPU에 의존적)
  • 어셈블러(assembler): object 코드 파일로 변환. object 파일은 0과 1로 이루어진 바이너리 코드(아직 주소 정보가 확정되지 않음)
  • 링커(linker): object 파일을 묶어 실행 코드 파일로 변환. 운영체제가 로딩할 수 있도록 주소 정보를 할당한 파일을 만들어 냄.(링커는 운영체제에 의존적)

이 과정을 모두 거치면 실행파일 생성.

 

링커는 링킹 과정을 거치는데, 이 과정에서 라이브러리가 앱에 링킹되는 방식에 따라 Static 또는 Dynamic으로 구분

 

Static Library

  • 빌드 타임에 앱의 소스코드와 필요한 라이브러리들을 실행파일에 병합
  • static library는 실행파일의 크기에 영향을 주어 앱 사이즈가 커질 수도 있음

Dynamic Library

  • 앱 빌드 시 라이브러리의 reference(참조)를 실행파일에 포함.
  • 런타임에 필요한 라이브러리를 로딩하여, 동적 라이브러리를 로딩시간에 영향을 줄 수 있음.

Mergable Library

  • 동적 라이브러리를 사용할 경우 디버그 모드에서는 동적 라이브러리 처럼 동작
  • 동적 라이브러리를 릴리즈 모드에서는 정적 라이브러리 처럼 동작
  • 디버그 빌드에서 빌드 시간을 단축하면서도 릴리즈 빌드에서는 정적 링크를 사용하는 것과 유사한 앱 실행 시간을 얻기 위함.

해당 부분은 별도의 포스팅으로 정리할 예정.

 

Mergable Library

 

 

Do Not Embed / Embed & Sign / Embed Without Signing

 

Xcode 프로젝트 설정에서 Do Not Embed, Embed & Sign, Embed Without Signing 옵션은 앱에서 사용하는 프레임워크의 포함 방식을 설정하는 데 사용.

Embed 예제

 

 

Do Not Embed

  • 이 옵션은 프레임워크를 앱 번들에 포함하지 않는다는 뜻. 즉, 앱이 실행될 때 프레임워크를 찾아서 로드하지 않으며, 이 설정은 일반적으로 시스템 프레임워크나 이미 시스템에 설치된 프레임워크에 대해 사용.
  • 정적 라이브러리의 경우 이미 실행 파일에 필요한 라이브러리 코드가 존재하기 때문에, Frameworks 폴더에 라이브러리가 있을 필요가 없음. 번들을 라이브러리가 가질 경우에는 예외

 

Embed & Sign

  • 이 옵션은 프레임워크를 앱 번들에 포함, 앱 서명 과정에서 해당 프레임워크도 함께 서명된다는 뜻
  • 앱이 실행될 때 이 프레임워크는 포함된 상태로 로드되며, 이 옵션은 사용자 정의 프레임워크나 외부 프레임워크를 포함할 때 주로 사용되며, iOS 앱 배포 시 필수적인 설정
  • 동적 라이브러리의 경우 Frameworks 경로에 코드를 포함시켜서 임베드 하지 않으면 크래시 발생

 

Embed Without Signing

  • 이 옵션은 프레임워크를 앱 번들에 포함하되, 서명 과정에서 제외된다는 의미이며, 개발 과정에서는 이 옵션이 유용할 수 있지만, 배포를 위해서는 대부분의 경우 서명이 필요하므로 주의해서 사용.
  • 주로 macOS 앱에서 서명이 필요 없는 경우에 사용.

 

이 옵션들은 앱의 빌드 및 실행 방식에 큰 영향을 미치므로, 사용하는 프레임워크와 앱 배포 전략에 따라 적절히 선택해야 함

 

 

 

 

xcframwork

여러 아키텍처를 동시에 지원할 수 있는 프레임워크 패키지. 빌드 옵션에 따라 정적 혹은 동적으로 만들 수 있음.

 

 

 

 

 

 

(참고)
https://sharonprogress.tistory.com/169

 

프레임워크(Framework)와 라이브러리(Library)의 차이점

1. 프레임워크(Framework)란? 개발자가 소프트웨어를 개발함에 있어 코드를 구현하는 개발 시간을 줄이고, 코드의 재사용성을 증가 시키기 위해 일련의 클래스 묶음이나 뼈대, 틀을 라이브러리 형

sharonprogress.tistory.com

https://charles098.tistory.com/102

 

[ 운영체제 ] 컴파일(Compile)과 링킹(Linking), 런타임(Runtime), 로딩(Loading)

이 글에서는 주소 바인딩(Address Binding)을 이해하기 위해 꼭 알아야 하는 용어들을 설명한다. 원래 주소 바인딩을 바로 다루려고 했으나 정리하다가 용어가 헷갈려서 공부할겸 정리한다. 컴파일,

charles098.tistory.com

https://medium.com/@jc3wrld999/gcc-compiler-manual-a309c8f9d8f6

 

GCC Compiler Manual

컴파일 과정

medium.com

https://developer.apple.com/documentation/xcode/configuring-your-project-to-use-mergeable-libraries

 

Configuring your project to use mergeable libraries | Apple Developer Documentation

Use mergeable dynamic libraries to get app launch times similar to static linking in release builds, without losing dynamically linked build times in debug builds.

developer.apple.com

https://neogurhub.tistory.com/entry/%EB%B0%B0%ED%8F%AC-%EA%B0%80%EB%8A%A5%ED%95%9C-FrameWork-%EB%A7%8C%EB%93%A4%EA%B8%B0-XCFramework

 

배포 가능한 FrameWork 만들기 (XCFramework)

XCFrameWork 란 무엇인가 https://help.apple.com/xcode/mac/11.4/#/dev6f6ac218b 공식문서에 따르면 XCFrameWork 란 “An XCFramework is a distributable binary package created by Xcode that contains variants of a framework or library so that it can

neogurhub.tistory.com

 

'apple > Docs, iOS, Swift' 카테고리의 다른 글

Swift @TaskLocal  (3) 2024.08.28
Swift KeyPath 정리  (0) 2024.08.28
SwiftUI .swipeActions not working  (0) 2024.08.28
iOS Translation Framework  (0) 2024.08.28
swift @_spi (System Programming Interfaces)  (0) 2024.08.20
Comments