Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

iOS Bundle & Package & Framework & Library & Sandbox #10

Open
simoniful opened this issue Mar 8, 2022 · 0 comments
Open

iOS Bundle & Package & Framework & Library & Sandbox #10

simoniful opened this issue Mar 8, 2022 · 0 comments
Labels

Comments

@simoniful
Copy link
Owner

simoniful commented Mar 8, 2022

Bundle

추상화

패키지는 누군가가 봉인해둔 객체로 인식되는 하나의 박스(📦)라고 생각할 수 있다. 번들은 비교하자면 사용성에 맞게 칸이 잘 나누어진 백팩(🎒)이라고 할 수 있다.

실행가능한 코드와 관련 리소스(이미지, 사운드 등)을 한 공간에 묶는 파일시스템에 있는 디렉토리. 애플리케이션의 성공적인 작동에 필요한 모든 것을 저장하며, 실행가능한 코드와 코드에 의해 사용되는 리소스를 갖는 일반적인 계층구조적인 디렉토리. 코드나 자원의 예측 가능한 로딩뿐만 아니라 지역화 같은 시스템 차원의 기능도 허용한다. 번들은 크게 앱 번들, 프레임워크 번들, Loadable 번들로 나눌 수 있다.

번들의 컨텐츠는 Bundle.main을 사용해서 접근할 수 있으며 대부분의 경우 url(forResource:withExtension:)메서드를 사용하여 특정 자원의 위치를 알아낼 수 있다.

Bundle.main.url(forResource: "Photo", withExtension: "jpg")

모든 앱 번들은 앱에 대한 정보가 담긴 Info.plist 파일을 가지며 bundleURL과 bundleIdentifier를 포함한 몇 몇 메타 데이터는 아래와 같이 접근할 수 있다.

let bundle = Bundle.main
bundle.bundleURL        // 앱의 저장위치
bundle.bundleIdentifier // identifier

번들의 가장 중요한 기능 중 하나는 지역화. 지역화된 리소스 에셋의 위치는 어느정도 컨벤션이 정해져 있어 시스템이 추상화하는 로직에 따라 필요 시 가져와 사용이 가능하다. (하지만, genstrings 와 같은 도구를 사용해서 자동으로 추출해서 .strings 파일에 붙여주는 방식이 더 적합 - 차후 현지화에 대해서 다룰 예정)

let bundle = Bundle.main
bundle.localizedString(forKey: "Hello, %@",
                       value: "Hello, ${username}",
                       table: nil)
NSLocalizedString("Hello, %@", comment: "Hello, ${username}")

App Bundle

App Bundle은 개발자가 생성하는 가장 일반적인 유형의 번들로, 어플리케이션의 성공적인 작동에 필요한 모든 것들을 저장한다. 구조는 어플리케이션 플랫폼이 iOS냐 MacOS냐에 따라 다르지만, 사용하는 방법은 동일하다. App Bundle에 있는 대부분의 리소스는 선택 사항이지만 항상 그렇지는 않다. 예를 들어 iOS에는 일반적으로 앱의 아이콘 및 기본 화면에 대한 추가 이미지 리소스가 필요하다.

  • Info.plist 필수
    응용 프로그램에 대한 구성 정보를 포함하는 구조화된 파일. 시스템은 이 파일에 존재에 의존하여 런타임 시 애플리케이션 및 모든 관련 파일에 대한 관련 정보를 식별함

  • Executable 필수 - AppDelegate, SceneDaelegate
    모든 응용 프로그램의 필수적인 실행 파일. 애플리케이션의 기본 진입점과 애플리케이션 대상에 정적으로 링크된 모든 코드가 포함되어있음

  • Resources 파일
    리소스는 애플리케이션의 실행 파일 외부에 있는 데이터 파일. 리소스는 일반적으로 이미지, 아이콘, 소리, nib 파일, 문자열 파일, 설정 파일 및 데이터 파일(기타) 등으로 구성. 대부분의 리소스 파일은 특정 언어 또는 지역에 대해 현지화하거나 모든 지역에서 공유할 수 있음. 현지화 된 파일이라면 리소스 서브 디렉토리 내에 대응하는 언어나 지역 정보에 lproj 확장자를 가진 파일을 가짐

  • Other Support 파일
    iOS에서는 커스텀 데이터 리소스를 포함하는 것이 가능하지만 커스텀 프레임 워크, 플러그인은 포함 불가

Framework Bundle

프레임워크 번들은 dynamic shared library 라 불리는 동적 공유 라이브러리에서 사용되는 코드와 리소스를 포함하고 있다.

Loadable Bundle

Loadable 번들은 앱의 기능성을 확장시켜주는 실행 가능한 코드와 리소스를 포함하고 있고 플러그인이 대표적인 예시이다.


Q. App Bundle의 구조와 역할에 대해 설명하시오
Bundle 은 실행가능한 코드와 관련 리소스를 한공간에 묶는 디렉토리 모음을 말하고 App Bundle 은 앱을 실행시키기위해 필요한 것들을 저장하고 있습니다.이에는 실행파일, app Icon, info.plist, launch images, mainWindow.nib, setting.bundle, 사용자 지정 리소스 파일들이 포함되어 있습니다. 이는 코드나 리소스의 에측가능한 로딩과 지역화 기능을 가능하게 해주는 역할을 하고 APK 용량이 감소되고 배포 관리가 쉽다는 장점이 있습니다.


Package

파인더를 통해 봤을 때 파일처럼 보이는 디렉토리. 패키지는 관련있는 리소스들을 하나의 유닛으로 압축시키고 연결시키는 작업을 통해 구성.

  • app, .playground, .plugin 등 특별한 확장자를 가지고 있는 파일일 경우
  • 디텍터리 내 도큐먼트 타입으로 등록된 확장자가 존재
  • 디렉터리에 그 자체를 패키지*로 보여지게하는 확장된 어트리뷰트가 존재

Framework

  • 공유자원 (dynamic library, nib 파일, 이미지 파일)을 단일 패키지 형태로 담고 있는 디렉토리
  • framework는 library와 달리 리소스를 포함할 수 있고 framework을 모듈 배포에 있어서 더 많은 활용이 가능
  • framework는 파일 시스템의 Bundle로 패키징되어 Core Foundation Bundle Service를 이용할 수 있음
  • NSBundle class로 접근 가능
  • 일반적으로 리소스를 스스로 가지고 있거나 전체 소스를 제공하는 경우 Dynamic Framework를, 그렇지 않고 SDK 형태로 배포하는 경우는 Static Framework를 선택

Dynamic Framework

Xcode에서 Framework를 만들면 기본적으로 Dynamic Framework으로 만들어진다. Dynamic Framework는 동시에 여러 프레임워크 또는 프로그램에서 동일한 코드 사본을 공유하고 사용을 하므로, 메모리를 효율적으로 사용. 동적으로 연결되어 있으므로, 전체 빌드를 다시 하지 않아도 새로운 프레임워크 사용이 가능. Static Linker를 통해 Dynamic Library Reference가 어플리케이션 코드에 들어가고 모듈 호출시 Stack에 있는 Library에 접근하여 사용합니다. 또한, 여러 버전의 library가 존재할 수 있기 때문에 다음과 같이 symbolic links를 구성하기도 합니다.

Static Framework

Static Framework는 Static Linker를 통해 Static Library 코드가 어플리케이션 코드 내로 들어가 Heap 메모리에 상주합니다. 따라서 Static Library가 복사되므로, Static Framework를 여러 Framework에서 사용하게 되면 코드 중복이 발생하게 된다. Library는 Framework가 아니라 Static Library가 복사된 곳 위치하므로, Bundle의 위치는 Static Framework가 아닌 Static Library가 위치해 있는 곳이 된다. 때문에 번들을 접근할 때는 스스로가 접근하는 것 보단 외부에서 Bundle의 위치를 주입받는 것이 좋다.


Library

Library란 활용가능한 도구들의 집합을 말합니다. 개발자는 라이브러리의 도구를 가지고 개발에 이용합니다. 라이브러리와 프레임워크는 제어 흐름에 대한 주도성이 누구에게 있냐에 차이가 있습니다. 라이브러리는 개발자가 호출할 수 있는 클래스들의 집합입니다. 그래서 주도성은 그것을 어떤 식으로 사용할지에 대해 고민하는 개발자에게 있습니다.

반면에 프레임워크는 전체적인 흐름에 대한 주도를 가지고 있으며 (가이드라인이 있다고 생각하면 될 듯?) 개발자는 그 흐름 내에서 필요한 코드를 추가합니다. 여기서 Inversion of Control(제어의 역전)이 적용되었다고도 하는데 이것은 기존에 클라이언트 코드가 갖고있던 제어권을 프레임워크에게 넘긴다고 하는 의미입니다.


SandBox

iOS는 기본적으로 앱마다 별도의 파일을 생성해서 공유되지 않도록 하고 외부로부터 들어온 접근에 대해서 보호되는 영역으로 시스템이 부정적으로 조작되는 것을 막는 보안 형태를 갖고있다. 왼쪽 그림처럼 앱이 샌드박스화 되지 않는다면 앱은 실행하는 사용자의 모든 권한을 갖게되고 사용자가 접근할 수 있는 모든 리소스에 동일하게 접근이 가능하다. 따라서 보안적 위험성이 있다.

샌드박스는 파일, 환경설정, 네트워크 리소스, 하드웨어 등에 대한 앱의 접근을 제한하는 세분화된 제어 집합, 커널 수준에서 시행되는 접근 제어 기술이라고 할 수 있다. 이렇게 관리함으로써 데이터를 분리하여 고립시키고, 보안 침해의 가능성을 낮출 수 있다. 이렇게 샌드박스화 시킴으로써 하나의 앱은 그 앱 안에 있는 데이터 이외에는 접근할 수 없게된다. 앱 외부 데이터를 어렵지 않게 접근할 수 있는 이유는 “접근 권한”을 기반으로 구현

  1. 앱 샌드박스를 사용하면 앱이 시스템과 상호작용하는 방식을 설명할 수 있다. 시스템에서 작업을 완료하는 데 필요한 접근권한을 앱에 부여한다.
  2. 앱 샌드박스를 사용하면 열기 및 저장, 드래그 앤 드롭 등 친숙한 사용자 상호작용을 통해 앱에 투명하게 추가 접근 권한을 부여할 수 있다.

@simoniful simoniful changed the title App Bundle iOS Bundle & Package Mar 8, 2022
@simoniful simoniful added the swift label Mar 8, 2022
@simoniful simoniful changed the title iOS Bundle & Package iOS Bundle & Package & Framework & Library Mar 8, 2022
@simoniful simoniful changed the title iOS Bundle & Package & Framework & Library iOS Bundle & Package & Framework & Library & Sandbox Mar 9, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant