์•ž์œผ๋กœ ์ง„ํ–‰ํ•  ๊ธ‡์—์„œ๋Š”, Library์™€ Framework์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค. ์ฒซ๋ฒˆ์งธ ์ˆœ์„œ๋กœ๋Š” Library์ด๋‹ค.

Library & Framework

์ผ๋‹จ ๊ฐ„๋‹จํ•˜๊ฒŒ Library์™€ Framework์— ๋Œ€ํ•œ ์ฐจ์ด๋ฅผ ์•Œ์•„๋ณด๊ณ  ๊ฐ€์ž.

  • Library: Linkable binary
    • ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ๊ณผ linkํ•˜์—ฌ ์‚ฌ์šฉํ•  ๋ชฉ์ ์œผ๋กœ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘” ํด๋ž˜์Šค, ํ•จ์ˆ˜์˜ ์ง‘ํ•ฉ
    • ๋ณดํ†ต ์†Œ์Šค์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผ๋œ ๋ชฉ์  ํŒŒ์ผ์˜ ๋ฌถ์Œ
    • ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
    • ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ, 22.04๊ธฐ์ค€ Library๋ฅผ ํด๋ฆญํ•˜๋ฉด ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
  • Framework: Library + Resource
    • ๊ณ„์ธตํ™”๋œ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ์•ˆ์—, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด package๋กœ ๋‹ด๊ฒจ์žˆ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.
      • library
      • nib file
      • image file
      • localized string
      • header files
      • reference documentation
    • ์ž์ฒด๊ฐ€ bundle์ด๋‹ค. NSBundle class๋กœ ์ปจํ…์ธ ์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅ, Swift์—์„œ๋Š” Bundle class๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ
    • ์ •์  ๋˜๋Š” ๋™์  ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๊ฐ™์€ ๋ชฉ์ ์œผ๋กœ ์ œ๊ณต๋œ๋‹ค.
      • ์ฆ‰, ์•ฑ์—์„œ ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฃจํ‹ด์„ ์ œ๊ณตํ•œ๋‹ค.
    • ๊ณง, ํ”„๋ ˆ์ž„ ์›Œํฌ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๊ฐ™์€ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋˜๋Š”๋ฐ, ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค ํŒŒ์ผ์„ ํ•จ๊ป˜ ๋‹ด๊ณ  ์žˆ๊ณ , ๊ทธ ๋ฆฌ์†Œ์Šค ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด Bundle ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ, 22.04๊ธฐ์ค€ Framework๋ฅผ ํด๋ฆญํ•˜๋ฉด ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์•Œ ์ˆ˜ ์žˆ๋Š” ์ ์€, ๊ฐœ๋…์ ์œผ๋กœ Framework๊ฐ€ library๋ฅผ ํฌํ•จํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์ด๋‹ค.

Static Library

Static library๋Š” ์•„์นด์ด๋น™๋œ object file(.o ํ™•์žฅ์ž)์˜ ๋ชจ์Œ์œผ๋กœ .a ํ™•์žฅ์ž ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง„๋‹ค. Static library๋Š” Static archive library, static linked shared library๋ผ๊ณ ๋„ ๋ถˆ๋ฆฐ๋‹ค.

macOS/iOS ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜๋ฉด object files๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. object file์€ Mach-O ํ˜•์‹์˜ binary ๋ฐ์ดํ„ฐ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ •๋ณด๋ฅผ ํฌํ•จํ•œ๋‹ค. Mach-O๋Š” ์‹คํ–‰ ํŒŒ์ผ ํฌ๋งท์˜ ์ผ์ข…์ด๋‹ค. ํ•ด๋‹น ๋‚ด์šฉ์€ ๋‹ค์Œ ๊ธ€๋กœ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค. ์ง€๊ธˆ์€ ํŒŒ์ผ์˜ ๊ตฌ์„ฑ๋งŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ์•Œ์•„๋ณด์ž.

  1. Header: ํ•ด๋‹น ํŒŒ์ผ์ด ๋™์ž‘ํ•˜๋Š” CPU Architecture ์ •๋ณด๋ฅผ ๋ช…์‹œํ•œ๋‹ค.
  2. Load Commands: ํŒŒ์ผ์˜ ๋…ผ๋ฆฌ์  ํ๋ฆ„์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ช…์‹œ
  3. Raw Segment Data: Raw code์™€ Data

์šฐ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ์•ฑ์„ ๋นŒ๋“œํ•œ ํ›„, ์•ฑ ๋ฒˆ๋“ค ๊ฒฝ๋กœ๋กœ ์ฐพ์•„๊ฐ€์„œ โ€œํŒจํ‚ค๊ธฐ ์ •๋ณด ๋ณด๊ธฐโ€๋ฅผ ํ†ตํ•ด ์—ด์–ด๋ณด๋ฉด ํ”„๋กœ์ ํŠธ ์ด๋ฆ„๊ณผ ๊ฐ™์€ ์‹คํ–‰ํŒŒ์ผ์ด ์žˆ๋‹ค.

ํŒŒ์ผ ์†์„ฑ์„ ์ณ๋ณด๋ฉด, Mach-O ํŒŒ์ผ์ด๋ผ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋™์ž‘ ๊ณผ์ •

์œ„์˜ ๊ทธ๋ฆผ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์šฉ์–ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์„ค๋ช…ํ•ด๋ณด์•˜๋‹ค.

  • ์•ฑ์„ ๋นŒ๋“œํ•˜๊ฒŒ ๋˜๋ฉด..
    • source file์ด ์ปดํŒŒ์ผ๋˜์–ด Static linker๋กœ ๋“ค์–ด๊ฐ
    • ์ด ๋•Œ app์˜ executable file๋กœ ๋ณต์‚ฌ๋œ๋‹ค.
  • ์•ฑ์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด..
    • library๊ฐ€ executable file์— ๋ณต์‚ฌ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋Ÿฐํƒ€์ž„์— ๋ฉ”๋ชจ๋ฆฌ์— ํ•ญ์ƒ ๋กœ๋“œ๋œ๋‹ค.

์žฅ๋‹จ์ 

์žฅ์ ๋‹จ์ 
- ์•ฑ์˜ ์ฃผ์†Œ ๊ณต๊ฐ„์— ํ•ญ์ƒ ๋กœ๋“œ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ ์‹คํ–‰์†๋„๊ฐ€ ๋งค์šฐ ๋น ๋ฆ„- ์•ฑ์˜ executble file์— ํ•ญ์ƒ ํฌํ•จ๋˜์–ด์•ผ ํ•จ
- ์ดˆ๊ธฐ ๋Ÿฐ์นญ ์†๋„ ์ €ํ•˜
- ์•ฑ์˜ ์ดˆ๊ธฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ฆ๊ฐ€
- library์˜ ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ์‹œ ์•ฑ์˜ object files๋ฅผ ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ library๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•จ. ์ฆ‰, ์ƒˆ๋กœ ๋นŒ๋“œ๋˜์–ด์•ผ ์—…๋ฐ์ดํŠธ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ๊ฐ€๋Šฅ

Dynamic Library

static library๊ฐ€ compile time์— executable file์— ํฌํ•จ๋œ๋‹ค๋Š” ์ ์€ ์•ฑ์ด ์ปค์งˆ ์ˆ˜๋ก ๋” ํฐ ๋ฌธ์ œ๋กœ ์ž‘์šฉํ–ˆ๋‹ค. ๋ณต์žก๋„๊ฐ€ ๋Š˜์–ด๋‚˜ ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์ด ๋งŽ์ด ์š”๊ตฌ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์˜จ ๊ฒƒ์ด Dynamic library์ด๋‹ค. ํ•ต์‹ฌ์€ executable files์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์ด๋‹ค. ์ฆ‰, Dynamic library๋Š” compile๊ณผ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— compile ์—†์ด dynamic library์˜ ์ฝ”๋“œ๋Š” ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ์†์„ฑ ๋–„๋ฌธ์— dynamic shared libraries, shared objects, dynamically linked libraries๋ผ ๋ถˆ๋ฆฐ๋‹ค. (dll, sodll)

๋™์ž‘ ๊ณผ์ •

  • ์•ฑ์„ ๋นŒ๋“œํ•˜๊ฒŒ ๋˜๋ฉด..
    • source file์ด compile๋œ๋‹ค.
    • ์ปดํŒŒ์ผ๋œ ํŒŒ์ผ์—์„œ ํ•„์š”๋กœํ•˜๋Š” library๋ฅผ linkํ•œ๋‹ค.
    • ์ด ๋งํฌ๊ณผ์ •์—์„œ executable file์ด ํ•„์š”๋กœ ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ฃผ์†Œ๋ฅผ Dynamic linker๊ฐ€ ์ œ๊ณตํ•œ๋‹ค.
  • ์•ฑ์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด..
    • ํ•„์š”ํ•œ ์‹œ์ ์— ์ฃผ์†Œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์›ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋กœ๋“œํ•œ๋‹ค.

์žฅ๋‹จ์ 

์žฅ์ ๋‹จ์ 
- ์•ฑ์˜ compile๊ณผ ๋ณ„๊ฐœ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— compile์—†์ด library์˜ ๋ณ€ํ™”๋œ ์ฝ”๋“œ ๋ฐ˜์˜๊ฐ€๋Šฅ
- ๋ถˆํ•„์š”ํ•˜๋‹ค๋ฉด memory์— ๋กœ๋“œ๋˜์ง€ ์•Š์Œ
- ์—ก ์ดˆ๊ธฐ ์‹คํ–‰ ์†๋„ ๊ฐœ์„  - ์•ฑ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๊ฐ์†Œ
- ๋Ÿฐํƒ€์ž„ ์•ฑ ์‹คํ–‰ ์†๋„ ๊ฐ์†Œ
- Library ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฑฐ๋‚˜, ์‚ฌ์šฉ์€ ๊ฐ€๋Šฅํ•˜๋‚˜ ๋ฒ„์ „ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์•ฑ์ด ์ฃฝ์„ ์ˆ˜ ์žˆ๋‹ค.

Xcode์—์„œ ์ฐพ์•„๋ณด๊ธฐ

Xcode > Build Phase > Link Binary With Libraries

link ํ•ด์•ผํ•  ๋ชจ๋“  libraries, Frameworks(๋‹ค์Œ๊ธ€)๋ฅผ ์ ๋Š”๋‹ค.

Embed Frameworks

Xcode > Build Phase > Embed Frameworks

App Bundle์— ๋ฌถ์—ฌ์„œ Copy ๋˜์–ด์•ผ ํ•  Frameworks๋ฅผ ์ ๋Š”๋‹ค.

๋นŒ๋“œ๊ฐ€ ์™„๋ฃŒ๋œ๋‹ค๋ฉด products ํด๋”์— ์ƒ๊ธฐ๋Š”๋ฐ, ํ•ด๋‹น ๋ฒˆ๋“ค์˜ package ํด๋”๋ฅผ ์—ด์–ด๋ณด๋ฉด, frameworks ํด๋”๊ฐ€ ์žˆ๊ณ , ์ด ์•ˆ์— dynamic framework๋กœ ๊ตฌ์„ฑํ•ด๋‘” ํƒ€๊ฒŸ์˜ ์‹คํ–‰ํŒŒ์ผ์ด ์œ„์น˜ํ•ด ์žˆ๋‹ค. pod์œผ๋กœ ์„ค์ •ํ•œ ๊ฒƒ๋“ค์€ pod project์— ์œ„์น˜ํ•ด์žˆ๋‹ค.

์ •๋ฆฌ

StaticDynamic (shared)
์‚ฌ์šฉ ๊ฐ€๋Šฅ ํƒ€์ด๋ฐBuild time ์ดํ›„ ๊ณง๋ฐ”๋กœ ๊ฐ€๋Šฅ
(application์— ๋ชจ๋‘ ๋ฐ˜์˜๋จ)
Run tim์— ๋ฉ”๋ชจ๋ฆฌ ์˜ฌ๋ฆฐ ํ›„ ๊ฐ€๋Šฅ
(App Launch Time)
binary ํ™•์žฅ์ž.a.dylib (Framework์ธ ๊ฒฝ์šฐ ํŠน๋ณ„ํ•œ ํ™•์žฅ์ž ์—†์Œ)
target file ํฌ๊ธฐtarget size ์ฆ๊ฐ€
์‚ฌ์šฉํ•˜๋Š” ์‹คํ–‰ํŒŒ์ผ ๊ฐ๊ฐ์— ์ปดํŒŒ์ผ๋˜์–ด ์ถ”๊ฐ€๋จ
target size ๋ณ€๋™ ์—†์Œ
๊ณต์œ  ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ถˆ๊ฐ€๋Šฅ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
(์—ฌ๋Ÿฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉ์€ ๋ถˆ๊ฐ€๋Šฅ, sandbox๋‚ด์— ๋“ค์–ด๊ฐ€ ์žˆ์–ด ๋ณด์•ˆ์ ์œผ๋กœ ๋ง‰ํ˜€์žˆ์Œ, ๋Œ€์‹  app extension์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅ)
iOS ์•ฑ ํฌ๊ธฐ์ตœ์†Œ (๋‹ค ์ปค์งˆ ์ˆ˜๋„ ์žˆ์Œ) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํฌ๊ธฐ ๋งŒํผ ์ฆ๊ฐ€๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํฌ๊ธฐ ๋งŒํผ๋งŒ ์ฆ๊ฐ€
์•ฑ ํŒจํ‚ค์ง€์— embed ๋˜์–ด ์‚ฌ์šฉ๋˜๋ฏ€๋กœ)

์ฒ˜์Œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์„ ๋•Œ ๋ณด์ด๋Š” New target ์„ค์ •์˜ Framework๋Š” dynamic ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์•ผ๊ธฐ ํ•œ๋‹ค. iOS 8.0๋ถ€ํ„ฐ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ–ˆ๋‹ค. static library๋Š” ์—ฌ์ „ํžˆ ์ผ๋ฐ˜์ ์œผ๋กœ ๋งํ•˜๋Š” static library์ด๋ผ ๋งํ•œ๋‹ค.

Reference