티스토리 뷰

iOS

Framework 개념 및 적용(Static,Dynamic)

Basic Developer 2021. 9. 7. 17:58

Framework / Library / module 은 왜 사용할까?

"분업 협업 빠른개발 효율적인 개발을 위함이다"

"재사용성 코드" 

"코드 공유를 쉽게 하기 위함이다"

"관련 코드를 그룹화(모듈화)하고 코드에 대한 엑세스를 제한(캡슐화) 하는 메커니즘도 제공한다"


Library

정의

"하나 이상의 코드 자체의 모음이다"

"프로그램이 연결 할 수 있는 패키징된 객체 파일들의 모임이다"

"소프트웨어를 개발하기 쉽게 어떤 기능을 제공하는 도구들이다"

 

Static Library [ * .A ]

컴파일 시간동안 앱에 사용될 코드가 Static Linker에 의해 실행파일에 복사된다.

 

Static Lybrary는 응용 프로그램 실행 파일에 연결된 컴파일된 코드이다.응용 프로그램 실행 파일의 일부이다

 

Dynamic Library [ * . dylib ]

Static Linker에 Library의 참조만 저장한다.결과적으로 실행파일이 더 작고 필요할 때만 코드가 로드되기 때문에 시작 시간이 일반적으로 더 빠르다.Symbol 과 참조를 결정짓고 해당 Library를 사용한다.

 

Dynamic Lybrary는 런타임 중에 응용 프로그램 실행 파일에 의해 로드되고 호출되는 실행 코드이다.응용 프로그램 실행 파일과 별개이다

 

차이점 : "정적과 동적이라는 단어는 대상 응용프로그램에서 컴파일된 코드를 참조하는 방식을 나타낸다"


Framework

정의

"라이브러리에는 헤더파일,현지화파일,이미지,문서와 같은 추가 리소스가 있을 수도 있다.이 모든 것을 하나의 번들로 묶을 수 있으며 이를 Framework라고 한다"

"번들(bundle)이란..서브 디렉토리 내부의 파일 디렉토리이다.iOS에서 번들은 관련 파일을 하나의 패키지(ex: 이미지,nibs 또는 컴파일된 코드)로 편리하게 함께 제공하는 역할을 한다"

"라이브러리,이미지파일,nib파일,실행 바이너리 등을 단일 패키지 형태로 담고 있는 디렉토리이다"

"코드 및 기타 재사용 가능한 자산을 전달하여 코드가 작동하도록 하는 패키지이다"

 

Static Framework(정적 프레임워크)

"Source File + Static Library + Static Linker"

Static Framework는 Static Linker을 통해 Static Library 코드가 응용 프로그램 실행 파일 내로 들어가 Heap 메모리에 상주한다.

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

Library는 Framework가 아니라 Static Library가 복사된 곳으로 위치하므로, Bundle의 위치는 Static Framework가 아닌 Static Library가 위치해 있는곳이 된다.

 

그림 1 ) Static Framework

Dynamic Framework(동적 프레임워크)

"Source File + Dynamic Library References + Dynamic Library + Static Linker"

Dynamic Framework는 동시에 여러 프레임워크 또는 응용 프로그램 실행 파일에서 동일한 코드 사본을 공유하고 사용을 하므로, 메모리를 효율적으로 사용한다.동적으로 연결되어 있으므로, 전체 빌드를 다시 하지 않아도 새로운 프레임워크 사용이 가능하다.

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

그림 2 ) Dynamic Framework

 

장점 / 단점 Static Framework Dynamic Framework
장점 응용 프로그램 실행 파일에 직접적으로 코드가 올라가있어서 런타임 속도가 빠르고 코드 자체가 복사되어 안정적이다 Static에 비해 메모리가 적게 사용되고 컴파일 시에 참조를 응용 프로그램 실행 파일에 올려놓기 때문에 컴파일 속도가 단축된다
단점 메모리가 Dynamic에 비해 많이 사용된다 Static에 비해 런타임 속도가 느리다

컴파일 속도 : 고급코드(우리가 쓰는 Swift)를 기계어로 바꾸는 과정의 시간 대비 속도이다(컴파일 오류로는 신택스오류,타입체크 오류 등)

런타임 속도 : 컴파일 과정을 마친 프로그램은 사용자에 의해 실행되는데 실행되는 시간 대비 속도이다(런타임 오류로는 0나누기 오류,NULL 참조 오류,메모리 부족 오류 등)


Framework 적용하기

위의 원리와 개념을 잡았다면 메인 앱에 프레임워크를 제공해보자

Static Framework 적용

1. 메인 앱 준비

2. 프레임워크 준비

3. 프레임워크 메인 앱으로 드래그 및 추가

4. 프레임워크 Build Settings -> Mach-O Type -> Static Library 로 변경

5. 메인 앱 Build Phases -> Dependencies -> 프레임워크 추가

 


1. 메인 앱 준비


2 - 1 프레임워크 준비
2 - 2 프레임워크 준비

 

프레임워크에 테스트를 위해 RequestData를 구현한다. -> 메인 앱 ViewController에서 사용 할 예정이다

 


3. 프레임워크 드래그 및 추가

 

추가를 했는데 No such module "ServerRequestData" 라고 에러가 난다면 프레임워크를 아직 한번도 빌드하지 않아서 그렇다.

Product는 프로젝트의 결과물인데 프로젝트 자체를 빌드하지 않았으니 결과물이 아직 없는 것이다.

Product안에 프레임워크가 빨간색이면 메인 앱 프로젝트 안에 프레임워크가 없다는 뜻이다.

 

3. 프레임워크 드래그 및 추가

메인 앱 ViewController에 모듈을 import 하고 RequestData를 생성했다.

근데 여기서 Cannot find 'RequestData' in scope 에러가 발생한다.이는 당연한 결과이다 접근제어를 설정해줘야 하기 때문이다.

접근제어의 default값은 internal로써 프로젝트 안에서만 참조를 할 수 있기 때문이다.

Public으로 접근제어를 설정해준다.

3. 프레임워크 드래그 및 추가


4. Build Settings 설정

Framework를 생성하면 처음에 Dynamic Library로 세팅되어있다.

지금은 Static Framework를 만드는거니 세팅을 바꿔준다.

 

4. Build Settings


빌드 세팅 후 실행을 해본 결과


"메인 앱 Build Phases -> Dependencies -> 프레임워크 추가 "이건 무슨 뜻일까?

Dependencies -> 종속성을 추가한다

그럼 종속성이란 무엇일까?

Xcode Dependencies - 종속

Dependencies에 프레임워크 추가

Dynamic Framework 적용

1. 메인 앱 준비

2. 프레임워크 준비

3. 프레임워크 메인 앱으로 드래그 및 추가

4. 메인 앱 Frameworks, Libraries , and Embedded Content 프레임워크 추가

5. 메인 앱 Build Phases -> Link Binary With Libraries -> 프레임워크 추가 되었는지 확인

6. 메인 앱 Build Phases -> Embed Frameworks -> 프레임워크 추가 되었는지 확인

 

Static Framework 적용 과정과 1,2,3은 동일하다


 

Mach-O Type -> Dynamic Library로 변경

 


Frameworks, Libraries, and Embedded Content에 프레임워크 추가

Frameworks, Libraries, and Embedded Content에 프레임워크 추가하면,

자동적으로

메인 앱 Build Phases -> Link Binary With Libraries -> 프레임워크 추가되고

메인 앱 Build Phases -> Embed Frameworks -> 프레임워크 추가된다

그래도 확인 한번 해보자


추가 되었나 확인
실행결과 화면

만약! Frameworks, Libraries, and Embedded Content를 하지않는다면?

동적프레임워크 개념에서 보았듯이 빌드가 되면 동적 프레임워크에서 필요한 코드의 "참조"만을 응용 프로그램 실행 파일에 담는다.

참조를 담았는데 막상 응용 프로그램 실행 파일가 실행될때 참조를 따라가보니 프레임워크가 없는 것이다.

정적프레임워크는 참조를 담는게 아니고 라이브러리 자체 필요한 코드를 담는다.그래서 프레임워크를 또 추가하게 되면 

중복이 일어나 에러가 발생한다.

 

동적프레임 Frameworks, Libraries, and Embedded Content에 프레임워크를 추가하지 않았을 때

다음 포스트에서는

"nm명령어 - 오브젝트 파일의 심볼 리스트를 보는 명령어"

통해서 정적프레임워크 와 동적프레임워크의 동작원리를 확인한다

https://gwang-developer.tistory.com/26

 

Xcode binary executable file - nm Command

정적 프레임워크와 동적 프레임워크의 실행파일은 어떻게 다를까 프레임워크에는 두개의 클래스가 있다고 가정한다. Response Class Request Class 메인앱에서 정적프레임워크의 Response Class를 사용 할

gwang-developer.tistory.com

 


 

다양한 피드백 주시면 정말 감사하겠습니다.


 

참 조

https://www.runtastic.com/blog/en/frameworks-ios/

 

Overview: iOS Static and Dynamic Frameworks and Libraries

What’s the difference? Static & dynamic frameworks and libraries on iOS. Get an overview plus Q&A

www.runtastic.com

https://hcn1519.github.io/articles/2019-11/framework_basic

 

Framework 이해하기

Framework에 대해 학습한 내용을 정리합니다.

hcn1519.github.io

https://minsone.github.io/ios/mac/ios-framework-part-1-static-framework-dynamic-framework

 

[iOS][Xcode] Framework Part 1 : Static Framework와 Dynamic Framework

서론 Xcode에서는 Framework 라는 것을 통해 모듈화 단위의 코드 및 리소스를 사용할 수 있습니다. 그리고 외부 소스를 가져다 사용할 때 Cocoapods, Carthage 같은 도구를 사용하거나 혹은 직접 git submodule

minsone.github.io

'iOS' 카테고리의 다른 글

UIGraphicsImageRenderer Memory Leak  (0) 2023.03.10
Xcode binary executable file - nm Command  (0) 2021.11.19
Xcode Dependencies - 종속  (2) 2021.09.07
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함