Library์— ๋Œ€ํ•ด์„œ๋Š” ์•Œ์•„๋ณด์•˜๋‹ค. ๊ทธ๋Ÿผ Framework๋Š” ๋ฌด์—‡์ผ๊นŒ?

Framework

Shared Resources(dynamic shared library, nib, image)๋ฅผ Package ํ˜•ํƒœ๋กœ ๋‹ด๊ณ  ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ

๋Œ€ํ‘œ์ ์ธ Framework๋กœ๋Š” UIKit, Foundation ๋“ฑ์ด ์žˆ๋‹ค. import๋ฅผ ํ†ตํ•ด์„œ Framework์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ๋“ค์„ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ๊นŒ์ง€๋งŒ ์ฝ์œผ๋ฉด library์™€ ๋น„์Šทํ•œ ์—ญํ• ์„ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์‹ค์ œ๋กœ Framework๋Š” library + resources๋ผ ์ƒ๊ฐํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค. ํ•˜์ง€๋งŒ Resource๋„ ํฌํ•จํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“ˆ ๋ฐฐํฌ์— ์žˆ์–ด์„œ ๋” ๋งŽ์ด ํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. library์™€์˜ ์ฐจ์ด์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ํšจ์œจ์  ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ
  • ์†Œ์Šค์ฝ”๋“œ์™€ ๋”๋ถˆ์–ด ๋ฆฌ์†Œ์Šค ์—ญ์‹œ ํŒจํ‚ค์ง•ํ•˜์—ฌ ์ œ๊ณต
  • ์—ฌ๋Ÿฌ ๋ฒ„์ „์„ ๋™์ผํ•œ Bundle์— ํฌํ•จํ•˜์—ฌ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ ์ง€์›
  • ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์˜ ํ•œ ๊ตฐ๋ฐ์—์„œ๋งŒ read-only ํ˜•ํƒœ๋กœ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ผ ์ˆ˜ ์žˆ์Œ

Bundle์˜ ํ•œ ์ข…๋ฅ˜

์ด์ „์— Bundle์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ–ˆ์„ ๋•Œ, ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ Package๋ผ ํ–ˆ์—ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Framework๋„ ์ด ๋ถ„๋ฅ˜์— ์†ํ•œ๋‹ค. ์†Œ์Šค์ฝ”๋“œ ๋ ˆ๋ฒจ์—์„œ๋Š” NSBundle, Bundle ํด๋ž˜์Šค๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ ์ด์ œ๋Š” ์‹คํ–‰ํ•˜๋Š” ํ”„๋กœ์ ํŠธ ๋‚ด๋ถ€ Bundle์— ์ ‘๊ทผํ•ด์„œ Resource๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, Framework ๋‚ด๋ถ€์˜ Resource๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋Š” Custom Bundle์„ ์‚ฌ์šฉํ•˜์—ฌ ์ ‘๊ทผํ•ด์•ผ ํ•œ๋‹ค. (main Bundle์ด ์•„๋‹ˆ๋ž€ ์–˜๊ธฐ)

let bundle = Bundle(identifier: "com.wansook.CustomFramework") // Framework์˜ Bundle Identifier
let image = UIImage(named: "default_egg", in: bundle, compatibleWith: nil)

Not Opaque Data Type

์ด์ „๊ธ€์—์„œ Bundle์€ Opaque Data Type์ด๋ผ ํ–ˆ์—ˆ๋‹ค. ์ฆ‰ directory์ด์ง€๋งŒ Finder์—์„œ ์‹คํ–‰ ํŒŒ์ผ์ฒ˜๋Ÿผ ์ทจ๊ธ‰๋จ์„ ์˜๋ฏธํ•œ๋‹ค.(Package์˜ ์˜๋ฏธ) Bundle์—์„œ .app์˜ ๊ฒฝ์šฐ finder์—์„œ ์‹คํ–‰ํŒŒ์ผ๋กœ ์ธ์‹๋˜์–ด ํด๋ฆญํ•˜๋ฉด ์•ฑ์ด ์‹คํ–‰๋˜๋‚˜, โ€œํŒจํ‚ค์ง€ ๋‚ด์šฉ ๋ณด๊ธฐโ€๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•˜์—ฌ ๋‚ด๋ถ€ ํŒŒ์ผ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ–ˆ๋‹ค. ์ด๋ ‡๊ฒŒ finder์—์„œ ๋””๋ ‰ํ† ๋ฆฌ์ง€๋งŒ ๋‹จ์ผ ํŒŒ์ผ์ฒ˜๋Ÿผ ์ธ์‹ํ•˜๋Š” ๊ฒƒ์„ Opaque Data Type์ด๋ผ ํ•˜๋Š”๋ฐ, framework์˜ ๊ฒฝ์šฐ ์ผ๋ฐ˜ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ทจ๊ธ‰๋˜์–ด Opaque Data Type์ด ์•„๋‹ˆ๋‹ค.

Framework์˜ ๊ตฌ์กฐ

Binary file

Framework ํ”„๋กœ์ ํŠธ์™€ ์ด๋ฆ„์ด ๊ฐ™์€ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์„ ๋งํ•œ๋‹ค. Library์˜ ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, Static ํ˜น์€ Dynamic library๋ฅผ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Build Setting โ†’ Mach-O Type์—์„œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

Header ํด๋” ์•ˆ์— ์ƒ์„ฑ๋˜๋Š” ํŒŒ์ผ์€, ํ•ด๋‹น Framework์— ์–ด๋–ค file์ด ์žˆ๋Š๋ƒ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํŒŒ์ผ์ด ํฌํ•จ๋œ๋‹ค. ๋งŒ์•ฝ Objective C ํŒŒ์ผ์ด ์žˆ์—ˆ๋‹ค๋ฉด testFramework.h ํ•˜๋‚˜๋งŒ ์ƒ์„ฑ๋œ๋‹ค. ํ•˜์ง€๋งŒ swift ํŒŒ์ผ๋„ ์žˆ์—ˆ๋‹ค๋ฉด, testFramework-Swift.h ์—ญ์‹œ ์ƒ์„ฑ๋œ๋‹ค.

ํ•ด๋‹น Framework์— ์ž‘์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ ‘๊ทผ ์ œ์–ด์ž๊ฐ€ ํ•„์š”ํ•˜๋‹ค. Swift์˜ ๊ฒฝ์šฐ ์ ‘๊ทผ ์ œ์–ด ๊ทœ์น™์— ๋”ฐ๋ผ ์™ธ๋ถ€ Framework์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅ ์—ฌ๋ถ€๊ฐ€ ์ •ํ•ด์ง„๋‹ค. Objective-C์˜ ๊ฒฝ์šฐ ๊ด€๋ จ header๋ฅผ public์œผ๋กœ ์ „ํ™˜ํ•ด์ฃผ์–ด์•ผ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

modulemap

swift๋Š” code๋ฅผ module๋กœ ์ •๋ฆฌํ•œ๋‹ค. ๊ฐ module์€ namespace๋ฅผ ์ง€์ •ํ•˜๊ณ , ํ•ด๋‹น ์ฝ”๋“œ์˜ ์–ด๋–ค ๋ถ€๋ถ„์„ module ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ์ ‘๊ทผ ์ œ์–ด๋ฅผ ์ง€์ •ํ•œ๋‹ค. (์œ„์˜ header ์„ค๋ช…) import ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋˜ ๊ฒƒ๋“ค์ด๋‹ค.

module ์ด์ „์— framework๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” header๋ฅผ ์ฝ”๋“œ๋กœ ์ง์ ‘ ๊ฐ€์ ธ์™€์•ผ ํ–ˆ๋‹ค. Xcode๋‚ด์—์„œ framework์˜ binary๋ฅผ ์ˆ˜๋™์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ์ž‘์—… ์—ญ์‹œ ์š”๊ตฌ๋˜์—ˆ๋‹ค. #import ๋งคํฌ๋กœ๋Š” ๋ง ๊ทธ๋Œ€๋กœ ๋ชจ๋“  ํ•ด๊ฒฐ๋œ ์ข…์†์„ฑ ๊ตฌ์กฐ๋ฅผ ์ฝ”๋“œ์— ๋ณต์‚ฌํ•œ ํ›„ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ทธ ํฐ ์†Œ์Šค ํŒŒ์ผ์— ์ž‘์—…์„ ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ์ ์ด ๋ฐœ์ƒํ–ˆ๋‹ค.

  • Macro ์ •์˜์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.
  • ํƒ€ Framework๋ฅผ ์‰ฝ๊ฒŒ ๋ง๊ฐ€ํŠธ๋ฆด ์ˆ˜ ์žˆ์—ˆ๋‹ค. (Macro ์ด๋ฆ„ ์ค‘์ฒฉ..)

์ด๋Ÿฐ ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ์ฑ…์œผ๋กœ ๋‚˜์˜จ ๊ฒƒ์ด modulemap์ด๋‹ค. module๊ณผ header์˜ ์—ฐ๊ฒฐ๊ณ ๋ฆฌ ์—ญํ• ์„ ํ•˜๋Š” ํŒŒ์ผ๋กœ, module์— ํฌํ•จ๋˜๋Š” header๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ •์˜ํ•˜๊ณ , ์–ด๋–ค implementation(.a(static), .dylib(dynamic))์ด module์— ํฌํ•จ๋˜๋Š”์ง€ ์•Œ๋ ค์ฃผ๋Š” ํŒŒ์ผ์ด๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ์ƒ๊ฒผ๋‹ค.

Reference