Skip to content

[Framework & Library] 무엇이 맞을까

김성훈 edited this page Dec 13, 2023 · 1 revision

OpenList의 프레임워크와 라이브러리

OpenList 프로젝트를 진행하면서 2가지 라이브러리와 1가지 프레임워크를 직접 만들어 사용했습니다.

Tuist 같은 프레임워크를 사용할 수 있지만, No Library 정책상 Xcode에서 제공하는 Custom Framework와 Library를 사용하여 다음과 같은 모듈을 구성했습니다.

  • CustomNetwork Library
  • CustomSocket Library
  • CRDT Framework

모듈을 분리한 이유

  1. 빌드는 기본적으로 코드가 수정된 모듈만 빌드가 되기 때문에, 모듈화를 통해 빌드를 하게되면 빌드속도가 줄어듭니다.

사실 OpenList가 빌드속도를 신경쓸 만큼의 규모는 아니긴 합니다.

  1. 모듈간 결합도를 낮추고, 다른 프로젝트에서도 재활용하여 사용하기 용이합니다.

다른 프로젝트에서 Socket과 Network를 잘 이해하고 재사용하면 좋겠죠?

따라서 Network, Socket, CRDT 를 따로 모듈로 관리하기로 결정하였습니다.


모듈

iOS에서 Xcode로 모듈화 할 수 있는 방법

  • Library
  • Framework
  • Swift Package

모듈이란

코드 구조화와 접근 제어에 대한 논의를 할 때 모듈이라는 단어를 사용합니다.
간단하게 저는 모듈은 하나의 코드 배포 단위라고 생각하기로 했습니다.
보통 하나의 모듈은 해결하려는 특정 문제의 도메인 을 가지고 있습니다. Network, AVFoundation와 같은 모듈을 생각하시면 될 듯 합니다.


라이브러리

Library는 타겟(앱)에서 사용될 코드와 데이터들의 모임입니다

단 이미지, 에셋 같은 리소스는 포함되지 않습니다

Static Library와 Dynamic Library

Static Library와 Dynamic Library를 구분하는 기준은 타겟, 즉 앱에 어떻게 링킹하는가 입니다

Static Library

  • object file의 묶음, .a의 파일 익스텐션
  • 여러개의 아카이빙 된 object file == Static Library

앱에서 사용하는 코드는 컴파일 시점에 static linker를 통해 execuatable file로 복사가 됩니다. 앱 런타임 전체 시간동안 Heap 영역에 로드되어 사용됩니다!

2023-12-13_19-16-30

한계

  • 사용될 타겟의 프로세서 아키텍쳐와 같게 빌드를 해야함
  • 리소스 파일들을 포함할수가 없음


Dynamic Library

  • Static Library와 달리 컴파일 시점에 executable file에 복사되지 않음
  • 필요한 시점에 동적을 로드되어 사용 -> 매번 컴파일 할 필요가 없음
  • 대신 앱 컴파일 시점에 메모리에 로드 해놓지 않기 때문에 상대적으로 느림
2023-12-13_19-19-11

프레임워크

계층 구조를 갖는 디렉토리를 의미! 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의 구현 기준은 위와 같았습니다.

오리들의 애자일한 개발 여정

📜 기획

💢 규칙

🐥 1주차 회의록, 회고

데일리 스크럼

회의록

회고

🐥 2주차 회의록, 회고

데일리 스크럼

회의록

회고

🐥 3주차 회의록, 회고

데일리 스크럼

회고

🐥 4주차 회의록, 회고

데일리 스크럼

회고

🐥 5주차 회의록, 회고

데일리 스크럼

회고

🐥 6주차 회의록, 회고

데일리 스크럼

회고

🍎 iOS

아키텍처 의사 결정 기록

Clone this wiki locally