공부

Bundle

Zedd0202 2021. 9. 19. 18:07
반응형

 

안녕하세요 :) Zedd입니다.

큭ㅋㅋㅋㄱ킄ㄱㅋㅋㅋㅋㅋㄱ크킄ㅋㄱㅋㅋㅎㅎㅎㅎ

추석...그저 빛..

공부해보고 싶은 것들이 많은데..이번 연휴에 할 수 있는데까지 차근차근 해볼려고 합니다 🤧

 

# Bundle

executable code와 해당 코드에서 사용하는 리소스를 보유하는 표준화된 계층 구조를 가진 디렉토리

조금 더 풀어서 말하면, 

디스크의 Bundle Directory에 저장된

1. executable code

2. images, sound, nib 파일과 같은 리소스

3. info.plist

의 표현(representation) 

 

- 대부분의 Xcode Project들은 빌드할 때 Bundle을 생성. (직접 Bundle을 생성하는 일은 거의 없음) 

- 각 Application에는 main bundle이 있음.

main bundle : 현재 실행중인 코드가 포함된 bundle directory

사용자가 앱을 실행하면 main bundle에서 즉시 필요한 코드와 리소스를 찾아 메모리에 로드. 

그 후 앱은 필요에 따라 main bundle 또는 하위 bundle에서 코드와 리소스를 동적으로 + lazily 로드할 수 있다. 

 

자! 우리가 프로젝트에 리소스를 추가했다고 칩시다. 

이렇게요. 

이 리소스를 가져올 때 보통

Bundle.main.url(forResource: "someText", withExtension: "txt")

이렇게 Bundle.main으로 가져왔을 텐데요. 

저 Bundle.main이 위에서 말한 main bundle입니다.

 

# Bundle Directory살펴보기 

print(Bundle.main)

이렇게하면, 

/Users/zedd/Library/Developer/CoreSimulator/Devices/..../data/Containers/Bundle/Application/.../BundleTest.app

뭐 이런식으로 Path가 나오는데요.

저 Path로 이동해보면 

Bundle Directory가 있습니다. 

자, 왼쪽그림처럼 Bundle Name의 응용프로그램이 있을텐데요.

이 친구의 확장자는 .app입니다. 응용프로그램이니까요!

/Users/zedd/Library/Developer/CoreSimulator/Devices/..../data/Containers/Bundle/Application/.../BundleTest.app

Bundle.main을 Print하니 저게 나왔죠. 

BundleTest.app이 main bundle인 것입니다.

 

BundleTest.app을 우클릭하면 패키지 내용보기를 할 수 있는데요.

우리가 추가한 image, txt, nib, storyboard, info.plist가 들어있는 것을 볼 수 있습니다. 

(왼쪽 그림은 Assets.xcassets에 아무것도 추가안해서 그런데요, Assets.xcassets에 리소스를 추가하게 되면 오른쪽처럼 Assets.car가 만들어집니다.) 

Bundle.  디스크의 Bundle Directory에 저장된 executable code / images, sound, nib 파일과 같은 리소스 / info.plist 의 표현


다시 정의를 보면 어느정도 이해가시죠!? 

 

# Package 

About Bundles 문서를 읽다가 발견..

🤔 : 그래. 내 BundleTest.app이 main bundle인건 알겠어!!

그니까 bundle이잖아!? 

그럼 "번들 내용 보기"라고 나와야하는거 아니야? 

"패키지 내용 보기"는 뭐야? 얘 패키지야?

🧑‍💻 : Bundle과 Package는 때때로 같은 의미로 언급되지만, 실제로는 매우 다른 개념입니다!

🔹 Bundle : executable code와 해당 코드에서 사용하는 리소스를 보유하는 표준화된 계층 구조를 가진 디렉토리 

🔹 Package : Finder가 단일 파일인 것 처럼 사용자에게 제공하는 모든 Directory

자, macOS에서 응용프로그램에 들어가면 

이렇게 단일 파일들이 나오잖아요?

근데 사실!!! 이 친구들은 Directory입니다. (더 정확히 말하면 Bundle이지만) 

이 Directory 내부에 앱들을 실행하는데 필요한 코드와 리소스 파일이 있습니다.

Directory면 

뭐 대충 왼쪽 그림처럼 나와야할 것 같은데, Finder에서는 이를 단일 파일처럼 취급합니다. 

일반 사용자가 Package에 부정적인 영향을 줄 수 있는 변경을 하려는 것을 방지하기 위해 이렇게 했다고 합니다.

ex. 리소스 또는 코드 모듈 재배열 or 삭제하여 앱이 이상하게 실행되는 것을 방지. 

그래서 Package는 

우클릭을 하면 이렇게 "패키지 내용 보기"가 나옵니다. 

🤔 : 아니 그럼.. 

얘 main bundle이라며..얘도 Package라는 소리야? 

 🧑‍💻 : 맞습니다! Bundle과 Package가 interchangeable(상호교환) 가능한 것으로 간주되는 이유는 많은 유형의 Bundle이 Package이기 때문입니다.

Finder는 다음 조건 중 하나라도 해당하는 경우 Directory를 Package로 간주합니다.

1. Directory가 .app, .bundle, .framework, .plugin, .kext등의 파일 확장자를 가진 파일을 가지고 있는 경우

2. Directory에 있는 Application이 Package 타입을 나타내는 확장자가 있는 경우

3. Directory에 Package bit set이 있는 경우(?) 

 

🚨 [주의] 🚨

모든 Bundle이 Package다. → 아님

모든 Package가 Bundle이다  아님 

 

즉, BundleTest.app은 1번조건에 의해 

Bundle이자 Package입니다. 

 

🤔 : 두번째 질문! text, image, info.plist가 있는건 알겠는데..executable code는 어딨어? 

얘네 있어야 하는거아냐? 근데 없는 것 같애

🧑‍💻 : 있습니다! 이 친구들은 executable code이기 때문에 

실행 파일안에 들어있습니다.

nm 명령어로 볼 수 있는데요. 그냥 보면 안와닿으니..파일 하나를 만들어주겠습니다. 

파일을 만들고 Bundle.main의 path로 이동해준 뒤,

아니 화질구지..

터미널에

nm 실행파일 Path

를 실행해주세요. 

nm(name mangling)  : 바이너리 실행파일에서 symbol table과 해당 attribute를 덤프하는데 사용되는 Unix 명령어. 

그럼 대충 이렇게 내 앱 코드들이 실행파일 안에 들어갔구나~~를 추측할 수 있습니다.

 

[참고]

- About Bundles

- Bundle

반응형