본문 바로가기

iOS

[iOS] Bundle과 Package에 대해서

오늘은 Bundle, Package에 대해서 배워보겠습니다.

두 용어 모두 디렉토리를 추상화한 용어인데요, iOS에서 가장 중요한 디렉토리 추상화라고 할 수 있습니다.

 

Bundle은 iOS 코딩을 하면서 많이 만나볼 수 있습니다. 어디서 만나볼 수 있었냐면..?

[사진 1]

이런 Nib을 만들때 파라미터에서도 찾아볼 수 있었고,

파라미터에서 많이 봤었는데, 그때마다 nil을 의미없이 집어넣었던 것 같습니다.

번들에 대해서 알아보겠습니다.

Bundle

A Bundle is a directory with a standardized hierarchical structure that holds executable code and the resources used by that code.
 - 실행 가능한 코드와, 그 코드에 의해 사용되는 리소스를 가진 디렉토리

그렇다면 번들은 코드를 담고 있으니, 번들 내에 접근해서 코드를 사용할 수 있어야 합니다.

마음에 드는 사용하고싶은 번들이 있다면, 다음과 같이 접근할 수 있습니다.

[사진 2]

그렇다면 여기에서, main은 무엇을 의미하는 것일까요? 그리고 어떻게 저장된 값을 가져오는 것일까요?

우선, main Bundle은 다음과 같이 정의되어 있습니다.

 

그럼, main에서 가져올 수 있는 형태는 무엇이 있을까요? 알아보겠습니다.

위에서 보았던 [사진 2]와 코드에서, object 형태와 url 형태를 가져올 수 있었습니다.

주로, path, url, object의 값들을 저장하고 가져오는 용도로 사용합니다.

developer.apple.com/documentation/foundation/bundle

 

Apple Developer Documentation

 

developer.apple.com

더 많은 프로퍼티가 궁금하다면? 링크 고고

 

 

그렇다면, bundle은 어디에 저장되어 있을까요?

Bundle의 저장경로를 찍어보면

file:///Users/iseungho/Library/Developer/CoreSimulator/Devices/55FC2A4B-D366-48D1-B89A-1F7294AF9CBA/data/Containers/Bundle/Application/9A7EAE78-E16E-4DA6-A5FD-4AF580B06A51/Test_CollectionViewXib.app/

마지막 저장경로가 app으로 되어있는것을 알 수 있습니다.

 

이제 Bundle이 무엇인지 공부했으니, Bundle을 실제로 어떻게 사용하는지 알아보겠습니다.

모든 앱 번들은 Info.plist 파일을 가지고 있는데요, BundleIdentifier와 같은 몇몇 프로퍼티들은 다음과 같이 직접 접근할 수 있습니다.

let bundleIdentifier = Bundle.main.bundleIdentifier
print(bundleIdentifier)

 // Optional("elesahich.kr.Test-CollectionViewXib")

Identifier를 찍어보면 Optional이 찍히는데요, 이유는 왜 그러냐면,,,

info.plist는 Dictionary 타입으로 저장되는것을 기억하시나요? Dictionary의 value를 꺼내오는 것이므로 Optional이 찍히게 됩니다.

 

사용자 임의대로 이 bundle 파일에 값을 추가해줄 수도 있습니다.

Project Target > Build Settings > + 버튼 클릭 (add User Defined Setting)

 

이곳에 입력되는 값들은 [사진 1]과 같은 방법으로 사용할 수 있습니다.

번들에는 세 종류가 있지만, 사용하기에 유용한 앱번들 Bundle.main 을 알아보았습니다!

 

Package

package 역시 많이 보았던 친구입니다. 어디에서 많이 보냐면, 

응용프로그램(앱) 역시 패키지의 일종이기 때문입니다. 내용 보기를 타고 들어가면, 그냥 폴더가 나오게 됩니다. 

패키지는 디렉토리이면서 Opaque Directory라고 표현하는데, 맥에서는 이를 단일 프로그램으로 인식하게 됩니다.

 

.app을 비롯하여, .bundle, .framework 등을 하나의 패키지로 인식하는데요, 일반 디렉토리처럼 출입이 자유롭지 않은 이유는

패키지내 실행코드들의 임의 수정 방지를 위해서라고 합니다.

 

이렇게 보니, 패키지와 번들의 차이가 명확해보이지 않습니다. 굉장히 유사한데요,

실제로도 패키지는 번들일 수 있고, 그 반대일 수도 있기 때문입니다. 

응용프로그램의 경우를 위에서 예를 들었는데요,

Finder에서 사용자에게 단일한 파일로 노출되는 Package이면서,

실행 코드와 리소스를 포함하고 있는 Bundle이기도 합니다.

 

충분한 이해가 필요해 보입니다. 아래 출처에 좋은 글 두개(공식문서 말고)를 링크해 두겠습니다.

 

오늘은 여기까지입니다. 감사합니다!

 

 

 

 

 

 

 

 

출처
developer.apple.com/documentation/foundation/bundle

nshipster.co.kr/bundles-and-packages/

hcn1519.github.io/articles/2018-12/bundle