-
Notifications
You must be signed in to change notification settings - Fork 0
[Framework & Library] 무엇이 맞을까
OpenList 프로젝트를 진행하면서 2가지 라이브러리와 1가지 프레임워크를 직접 만들어 사용했습니다.
Tuist
같은 프레임워크를 사용할 수 있지만, No Library 정책상 Xcode에서 제공하는 Custom Framework와 Library를 사용하여 다음과 같은 모듈을 구성했습니다.
- CustomNetwork Library
- CustomSocket Library
- CRDT Framework
- 빌드는 기본적으로 코드가 수정된 모듈만 빌드가 되기 때문에, 모듈화를 통해 빌드를 하게되면 빌드속도가 줄어듭니다.
사실 OpenList가 빌드속도를 신경쓸 만큼의 규모는 아니긴 합니다.
- 모듈간 결합도를 낮추고, 다른 프로젝트에서도 재활용하여 사용하기 용이합니다.
다른 프로젝트에서 Socket과 Network를 잘 이해하고 재사용하면 좋겠죠?
따라서 Network
, Socket
, CRDT
를 따로 모듈로 관리하기로 결정하였습니다.
- Library
- Framework
- Swift Package
코드 구조화와 접근 제어에 대한 논의를 할 때 모듈이라는 단어를 사용합니다.
간단하게 저는 모듈은 하나의 코드 배포 단위라고 생각하기로 했습니다.
보통 하나의 모듈은 해결하려는 특정 문제의 도메인
을 가지고 있습니다. Network, AVFoundation와 같은 모듈을 생각하시면 될 듯 합니다.
Library는 타겟(앱)에서 사용될 코드와 데이터들의 모임입니다
단 이미지, 에셋 같은 리소스는 포함되지 않습니다
Static Library와 Dynamic Library를 구분하는 기준은 타겟, 즉 앱에 어떻게 링킹하는가 입니다
Static Library
- object file의 묶음,
.a
의 파일 익스텐션 - 여러개의 아카이빙 된 object file == Static Library
앱에서 사용하는 코드는 컴파일 시점에 static linker를 통해 execuatable file로 복사가 됩니다. 앱 런타임 전체 시간동안 Heap 영역에 로드되어 사용됩니다!
한계
- 사용될 타겟의 프로세서 아키텍쳐와 같게 빌드를 해야함
- 리소스 파일들을 포함할수가 없음
Dynamic Library
- Static Library와 달리 컴파일 시점에 executable file에 복사되지 않음
- 필요한 시점에 동적을 로드되어 사용 -> 매번 컴파일 할 필요가 없음
- 대신 앱 컴파일 시점에 메모리에 로드 해놓지 않기 때문에 상대적으로 느림
계층 구조를 갖는 디렉토리를 의미! Dynamic Library, header file, resources 등을 하나의 패키지에 감싸서 가지고 있다!
Framework를 사용할 때는 앱 번들안에 포함 시켜야함!
라이브러리와의 차이
- 리소스를 포함할 수 있다 (image, asset, strings 등)
- 오직 하나의 Framework 코드, 리소스를 메모리에 올릴 수 있다
- 이 때문에 메모리 풋프린트를 줄이고, 성능 향상이 가능
- 여러 앱이 Framework가 필요한 경우, 공유되어 사용된다
위에서는 어느정도 이론적인 정의들에 대해 설명했다면, 아래에서는 오리팀이 Framework와 Library를 선택한 기준에 대해 정리해보겠습니다.
둘의 가장 큰 차이
코드 흐름의 제어에 대한 주도성
Framework
프레임워크는 전체적인 흐름 제어의 주도권이 프레임워크에 있음!
즉 프레임워크가 개발자의 코드를 호출한다는 의미!
오리 앱의 CRDT
프레임워크는 기본적인 CRDT 알고리즘의 대해 뼈대를 제공하고 우리는 여기에 몇 코드로 살을 붙였습니다.
CRDT에 대한 알고리즘은 CRDT Framework에 있으니깐요!
Library
라이브러리의 주도권은 개발자에게 있습니다. 즉 호출부에 있죠.
오리앱의 CustomNetwork
, CustomSocket
은 Repository에서 필요할 때 호출이 됩니다. 즉 도구일 뿐 입니다!
오리앱의 Library와 Framework의 구현 기준은 위와 같았습니다.
- [ADR] 아키텍처 의사 결정 기록: iOS 애플리케이션 아키텍처 채택하기
- [ADR] 아키텍처 의사 결정 기록: SwiftLint 채택
- [ADR] 아키텍처 의사 결정 기록: UI 영역에서 Combine 사용 결정
- [ADR] 아키텍처 의사 결정 기록: Presentation영역의 ViewModel에서 Input Output 패턴 도입 결정
- [ADR] 아키텍처 의사 결정 기록: 코디네이터 패턴 도입 결정
- [ADR] 아키텍처 의사 결정 기록: 로컬 스토리지로 코어 데이터 사용 결정
- [ADR] 아키텍처 의사 결정 기록: Custom Network Foundation 라이브러리 구현 및 모듈화 결정
- [ADR] 아키텍처 의사 결정 기록: 이미지캐셔 라이브러리 구현 및 모듈화 결정