Published on

๐ŸŽ Swift - ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ-ํ”„๋ ˆ์ž„์›Œํฌ-ํŒจํ‚ค์ง€ ๋ฌด์Šจ ์ฐจ์ด์ธ๋ฐ?

Authors
  • avatar
    Name
    ์ด์ฐฝ์ค€
    Twitter

๋ฐฐ๊ฒฝ

ํ‚ค์›Œ๋“œ: Library, Framework, Package

๋ญ”๊ฐ€ ๊ต‰์žฅํžˆ ๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฐ๊ด€๋˜์–ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์€ ์ด ์…‹.. ๋ฌด์Šจ ์ฐจ์ด๊ฐ€ ์žˆ์„๊นŒ?

๊ณผ์ •

Static๊ณผ Dynamic

์ด ๋‘˜์€ ๋งํฌ ๋ฐฉ์‹์˜ ์ฐจ์ด์— ๋Œ€ํ•œ ๊ตฌ๋ถ„์ด๋‹ค.

Link: ๋ชจ๋“ˆ๊ณผ ์•ฑ์˜ ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๋Š” ๊ณผ์ •

์•ฑ์˜ ์‹คํ–‰ ํŒŒ์ผ (executable)์— ๋ชจ๋“ˆ์˜ ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋˜๋ฉด Static

  • ์•ฑ ์‹คํ–‰ ํŒŒ์ผ ํฌ๊ธฐ ์ฆ๊ฐ€
    • ์‹คํ–‰ ์‹œ๊ฐ„ ์ฆ๊ฐ€
  • ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ์ฆ๊ฐ€
  • ์ปดํŒŒ์ผ ์†๋„ ํ•˜๋ฝ

์•ฑ์˜ ์‹คํ–‰ ํŒŒ์ผ (executable)์— ๋ชจ๋“ˆ์˜ ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š๊ณ 

๋ชจ๋“ˆ์˜ ์‹คํ–‰ ํŒŒ์ผ (executable)์˜ ์ฐธ์กฐ๊ฐ€ ํฌํ•จ๋˜๋ฉด Dynamic

  • ์•ฑ ์‹คํ–‰ ํŒŒ์ผ ํฌ๊ธฐ ๊ฐ์†Œ
    • ์‹คํ–‰ ์‹œ๊ฐ„ ๊ฐ์†Œ
  • pre-main ์‹œ๊ฐ„ ์ฆ๊ฐ€
  • ์ปดํŒŒ์ผ ์†๋„ ์ฆ๊ฐ€

Static Library vs Dynamic Library

Library

Xcode Target์˜ ์ผ๋ถ€๋กœ ๋นŒ๋“œ๋˜์ง€ ์•Š์€ ์ฝ”๋“œ ๋ฐ ๋ฐ์ดํ„ฐ ์กฐ๊ฐ์„ ์ •์˜ํ•œ ๊ฒƒ

โ†’ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ฆฌ์†Œ์Šค ํŒŒ์ผ์„ ํฌํ•จํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. (์ด๋ฏธ์ง€, ์—์…‹ ๋“ฑ)

Static Library

์ปดํŒŒ์ผ ๋•Œ ํ•„์š”ํ•œ ์ฝ”๋“œ๋“ค์„ ๋ชจ๋‘ Execute ํŒŒ์ผ๋กœ ๋ณต์‚ฌํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

.a ํ˜•์‹์˜ ํŒŒ์ผ๋กœ ์‚ฌ์šฉ

Dynamic Library

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ฐธ์กฐ ๊ฐ’๋งŒ ์ €์žฅํ•˜๊ณ , ์‹ค์ œ ์ฝ”๋“œ๋Š” Execute ํŒŒ์ผ์—์„œ ์ œ์™ธํ•œ๋‹ค.

๋Ÿฐํƒ€์ž„์— Dynamic Linker๊ฐ€ Dynamic Library๋“ค์„ ๋งํฌํ•œ๋‹ค.

.dylib ํ˜•์‹์˜ ํŒŒ์ผ๋กœ ์‚ฌ์šฉ

๐Ÿ’ก CoreData, CoreBlutooth์™€ ๊ฐ™์€ Apple ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์€ ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ์™ธ์—๋Š” ํ”„๋ ˆ์ž„์›Œํฌ ์™ธ๋ถ€์— ๋…๋ฆฝ๋œ ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Static Library๋งŒ ์žˆ์ฃ ?

Static Framework vs Dynamic Framework

Framework

์†Œ์ŠคํŒŒ์ผ ์™ธ์—๋„ ์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค๊นŒ์ง€ ๋ชจ๋“  ๊ฒƒ์„ ํ•˜๋‚˜์˜ Bundle๋กœ ๋ฌถ์–ด๋†“์€ ๊ฒƒ

โ†’ Nib, ์ด๋ฏธ์ง€, ํ—ค๋” ํŒŒ์ผ, Localization ํŒŒ์ผ ๋“ฑ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋Ÿฐํƒ€์ž„ ์ค‘ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ค์ง ํ•˜๋‚˜๋งŒ ์˜ฌ๋ผ๊ฐ‘๋‹ˆ๋‹ค.

๐Ÿ’ก ํ”„๋ ˆ์ž„์›Œํฌ์˜ Static / Dynamic ์„ค์ • ๋ฐฉ๋ฒ•

Build Settings์˜ Mach-O Type์„ ์ง€์ •ํ•ด ์„ค์ •ํ•ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ†’ Mach-O ํƒ€์ž…์— ๋Œ€ํ•ด ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ์„œ ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ ๋“ฏ ์‹ถ์Šต๋‹ˆ๋‹ค.

Framework๊ฐ€ Static ์ผ ๋•Œ๋Š” Embed ์„ค์ •์„ โ€œDo not Embedโ€๋กœ ๋ฐ”๊ฟ”์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ ์‹คํ–‰ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์— ํฌํ•จ๋œ ์ฝ”๋“œ๊ฐ€ ์ค‘๋ณต๋˜์–ด ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋Œ€๋กœ Dynamic์ผ ๋•Œ๋Š” ์‹คํ–‰ ํŒŒ์ผ์— ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Embed & Sign์œผ๋กœ ์„ค์ •ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด..?

dyld[63497]: Symbol not found

์˜ˆ.. ์ด ์—๋Ÿฌ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿ‘

Package

Package๋Š” ์†Œ์Šค ํŒŒ์ผ, ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ, ๊ทธ๋ฆฌ๊ณ  ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฒˆ๋“ค๋งํ•˜๋Š” WWDC18์—์„œ ์ƒˆ๋กญ๊ฒŒ ๊ณต๊ฐœ๋œ ์ฝ”๋“œ ๊ณต์œ  ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๊ธฐ์กด xcframework์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ, ์•„์ฃผ ํฐ ์ฐจ์ด์ ์ด ํ•˜๋‚˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ”๋กœ ๋ฒˆ๋“ค์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์ด ์•„๋‹ˆ๋ผ, ์†Œ์Šค์ฝ”๋“œ๋“ค๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— Package๋Š” ์˜คํ”ˆ์†Œ์Šค์— ๋” ์–ด์šธ๋ฆฌ๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ SPM์„ ์ง€์›ํ•˜๋Š” ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ๋ณด๋ฉด Package.swift ํŒŒ์ผ๊ณผ Sources ์•ˆ์˜ ์†Œ์Šค ํŒŒ์ผ๋“ค์ด ์˜จ์ „ํžˆ Swfit ํŒŒ์ผ๋กœ ๋“ค์–ด์žˆ์ฃ .

๊ทธ๋ฆฌ๊ณ  Package์˜ ํฐ ์žฅ์  ์ค‘ ํ•˜๋‚˜๋Š” ๋ฒˆ๋“ค์— ๋Œ€ํ•œ ์„ค์ •์„ ๋ฌด๋ ค Swift ์–ธ์–ด๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋˜ Package.swift ํŒŒ์ผ์ด ์ผ์ข…์˜ manifest ํŒŒ์ผ๋กœ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

ํ•ด๋‹น ํŒŒ์ผ์—๋Š” ํŒจํ‚ค์ง€์˜ ์ด๋ฆ„, ์˜์กด์„ฑ, ๋ฆฌ์†Œ์Šค ๋“ฑ์— ๋Œ€ํ•œ ๋ช…์‹œ๋ฅผ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

SPM์€ GitHub์— ์˜ฌ๋ผ๊ฐ€์žˆ๋Š” remote ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋งŽ์ด ์“ฐ์ด์ง€๋งŒ, ๋กœ์ปฌ์— ์žˆ๋Š” ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Package๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์€ ์• ํ”Œ์ด ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ์‹์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

Organizing your code with local packages | Apple Developer Documentation

๊ฒฐ๊ณผ

MusicSpot ํŒ€์€ ๋ชจ๋“ˆํ™”์— Swift Package Manager์™€ Package๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ์ • ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. GitHub์— ๊ณต๊ฐœ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋กœ ์˜ฌ๋ผ๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ๋กœ ๊ณต์œ ํ•˜๋Š” xcframework์˜ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ์ 
  2. ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ์„ค์ •์„ Swift ์–ธ์–ด๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, xcodeproj ํŒŒ์ผ์—์„œ ์ผ์–ด๋‚˜๋Š” ํž˜๊ฒจ์šด ์ปจํ”Œ๋ฆญํŠธ ๋Œ€์‹  Swift ์–ธ์–ด๋กœ ์ปจํ”Œ๋ฆญํŠธ์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ 
  3. Package๋Š” ๋‚ด๋ถ€์— Library, Framework๋ฅผ ํฌํ•จํ•˜์—ฌ ์‚ฌ์šฉ๋œ๋‹ค๋Š” ์ 

์ฐธ๊ณ  ๋ฌธ์„œ