Jiseob Kim

iOS Developer

Swift - SPM ๋งŒ๋“ค๊ธฐ

31 Jul 2021 » Swift


์ง€๋‚œํŽธ์œผ๋กœ Property Wrapper ํฌ์ŠคํŒ…์ด ๋๋‚ฌ๋‹ค.

๋๋‚˜๋ฉด์„œ ๋งˆ์ง€๋ง‰ ๋ฌด๋ ต ์ด๊ฒƒ์„ CocoaPod์ด๋‚˜ SPM ์œผ๋กœ ๋งŒ๋“ค๋ฉด ์–ด๋–จ๊นŒ?

๋ผ๋Š” ์ƒ๊ฐ์„ ํ•˜์˜€์—ˆ๊ณ , ์ด ๊ธฐํšŒ์— SPM์œผ๋กœ ๋งŒ๋“ค์–ด๋ณด๊ธฐ๋กœ ํ•˜์˜€๋‹ค.


๊ทธ๋ž˜์„œ ์ด๋ฒˆํŽธ์€ SPM ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์ฃผ์ œ๋กœ ํ•˜์˜€๋‹ค.


SPM์ด๋ž€?

Swift Package Manager์˜ ์•ฝ์ž๋กœ์จ ์—ญํ• ์€ ์‰ฝ๊ฒŒ ๋งํ•ด CocoaPod๊ณผ Cartage์™€ ๊ฐ™๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.


์นด๋ฅดํƒ€๊ณ ๋Š” ์–ผ๋งˆ์ „์— ํ•œ์ฐฝ ์ด์Šˆ๊ฐ€ ๋œ ๊ฒƒ ๊ฐ™๊ณ ,

๊ทธ์ „๋ถ€ํ„ฐ ์žฅ์ ์€ ์žˆ์—ˆ์ง€๋งŒ ์‚ฌ์šฉ์˜ ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ์–ด

์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋‹ค.


์ฝ”์ฝ”์•„ํŒŸ์˜ ๊ฒฝ์šฐ ์“ฐ๊ธฐ๊ฐ€ ์‰ฌ์› ๋‹ค.

podfile์— ํ•œ์ค„ ์ถ”๊ฐ€ํ•˜๊ณ  pod install ๋งŒ ํ•ด์ฃผ๋ฉด ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ–ˆ์œผ๋‹ˆ๊น!

ํ•˜์ง€๋งŒ, pod install์„ ํ•˜๊ฒŒ ๋˜๋ฉด ๋ฐ”๋กœ workspace ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค๋Š”๊ฒŒ ์กฐ๊ธˆ ์•„์‰ฌ์› ๋‹ค.

ํ•˜๋‚˜๋ผ๋„ ์„ค์น˜ํ•˜๊ฒŒ ๋˜๋ฉด workspace๊ฐ€ ์ƒ๊ฒจ๋ฒ„๋ฆฌ๋‹ˆ ๋ญ”๊ฐ€ ๋ฌด๊ฑฐ์›Œ์ง„๋‹ค๋Š” ๊ธฐ๋ถ„์ด ๋“ค์—ˆ๋‹ค.


๋‘๊ฐœ์˜ ๊ณตํ†ต์ ์€ ์จ๋“œํŒŒํ‹ฐ๋ผ๋Š” ์ ์ด๋‹ค.


์• ํ”Œ์—์„œ๋„ ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ง์ ‘ SPM์„ ๋‚ด๋†“์•˜๋‹ค. ์ฆ‰ ํผ์ŠคํŠธํŒŒํ‹ฐ๋ผ๋Š”๊ฒƒ!

์• ํ”Œ์€ ๋„์ž…์ด ๋Šฆ๊ธดํ•ด๋„ ํ•œ๋ฒˆ ๋„ฃ์œผ๋ฉด ์ œ๋Œ€๋กœ ํ•ด์ฃผ๋‹ˆ ๊ธฐ๋Œ€๊ฐ€ ๋˜์—ˆ๋‹ค.

์š”์ฆ˜์—” Xcode Cloud๊ฐ€ ๊ธฐ๋Œ€๋œ๋‹ค. ์ธ์ฆ์„œ ๊ด€๋ฆฌ, ์ฝ”๋“œ ๊ด€๋ฆฌ ๋“ฑ์ด ๋”์šฑ ์‰ฌ์›Œ์งˆ ๊ฒƒ ๊ฐ™์•„์„œ!


SPM ์ƒ์„ฑ

ํผ์ŠคํŠธ ํŒŒํ‹ฐ์ธ ๋งŒํผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์•„์ฃผ ์‰ฝ๋‹ค.


Xcode์˜ New์— ๋ณด๋ฉด ์‚ฌ์ง„๊ณผ ๊ฐ™์ด Swift Package๊ฐ€ ์กด์žฌํ•œ๋‹ค.


๋งŒ๋“ค๊ณ ๋‚˜๋ฉด ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.


์—ฌ๊ธฐ์—์„œ ์ด๊ฒƒ ์ €๊ฒƒ ์„ค์ •์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

dependencies์—๋Š” ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์˜์กดํ•˜๊ฒŒ ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ช…์‹œํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

ํ†ต์‹  ๊ด€๋ จ์ด๋ผ๋ฉด Alamofire๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฒ ์ง€?


๊ทธ๋ฆฌ๊ณ , ์ง€๊ธˆ ์ƒํƒœ๋Š” iOS๋งŒ ๊ตญํ•œ๋˜์–ด์žˆ์ง€ ์•Š๋‹ค.

macOS, tvOS, watchOS ๋“ฑ๋„ ํ•ด๋‹น์ด ๋œ๋‹ค.

ํ•„์š”ํ•˜๋‹ค๋ฉด platforms๋„ ์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” ๊ทธ๋Ÿฐ ํ™”๋ฉด์ด๋‹ค.


์†Œ์Šค ์ฝ”๋“œ

๊ฐ€์ ธ๋‹ค ์“ธ ์ฝ”๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ณณ์€ ์œ„์˜ ์‚ฌ์ง„ ์ฒ˜๋Ÿผ

Source - ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ช… ํด๋” ์•ˆ์— swiftํŒŒ์ผ์ด ์ƒ์„ฑ๋˜์–ด ์žˆ์„ ๊ฒƒ์ด๋‹ค.


์—ญ์‹œ ์‹œ์ž‘์€ ํ—ฌ๋กœ์›”๋“œ์ง€


GitHub์— Repository ์ƒ์„ฑ ํ›„ ํ‘ธ์‹œ

์ด ๋ถ€๋ถ„์€ ๊ฐ„๋‹จํ•˜๋‹ˆ๊น ๋ฐฉ๋ฒ•์€ ์ƒ๋žต,,,


SPM ์ ์šฉ

์ค€๋น„๋Š” ๋๋‚ฌ๋‹ค. ์ด์ œ ์‚ฌ์šฉ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค!


์œ„ ์‚ฌ์ง„ ๊ฒฝ๋กœ๋Œ€๋กœ ๋“ค์–ด๊ฐ€๋ณด๋ฉด ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฝ”์ฝ”์•„ํŒŸ์„ ์“ธ๋•Œ์™€ ๋‹ฌ๋ฆฌ Xcode ๋‚ด์—์„œ ํ•ด๊ฒฐ์ด ๋œ๋‹ค๋Š” ์ ์ด ๋งค๋ ฅ์ ์ด๋‹ค.


์ƒ์„ฑํ–ˆ๋˜ ๊นƒํ—™ ์ฃผ์†Œ๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ  Next๋ฅผ ๋ˆ„๋ฅด์ž.


์—ฌ๊ธฐ๋Š” ์‚ด์ง ์งš๊ณ  ๋„˜์–ด๊ฐ€์ž๋ฉด,

ํ•ด๋‹น ์ €์žฅ์†Œ์— ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฐ›์•„ ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.


๋ฒ„์ „์„ ์ •ํ•œ๋‹ค๊ฑฐ๋‚˜, ํŠน์ • ๋ธŒ๋žœ์น˜๋ฅผ ๋ฐ›๊ฑฐ๋‚˜, ํŠน์ • ์ปค๋ฐ‹์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ด๋ฒˆ์— ๋‚˜๋Š” ๋ธŒ๋žœ์น˜๋กœ ํฌ์ŠคํŒ…!


Next


์ ์šฉํ•  ํŒจํ‚ค์ง€์™€ ์ถ”๊ฐ€๋  ํƒ€๊ฒŸ์„ ํ™•์ธํ•˜๊ณ  finishํ•ด์ฃผ๋ฉด ๋! ์‰ฝ๋‹ค


๊ทธ๋Ÿผ ์œ„์™€ ๊ฐ™์ด ๋‹ฌ๋ผ์ง„์ ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


๋นจ๊ฐ„ ๋ถ€๋ถ„์„ ๋ณด๋ฉด ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์•ˆ์—์„œ ์ถ”๊ฐ€๋œ ์ ์„ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‚ญ์ œ๋„ ์—ฌ๊ธฐ์„œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŒŒ๋ž€ ๋ถ€๋ถ„์„ ๋ณด๋ฉด SPM์œผ๋กœ ์ถ”๊ฐ€๋œ ๊ฒƒ๋“ค๋„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


์‚ฌ์šฉ

์œ„์™€ ๊ฐ™์ด import ํ•ด์ฃผ๊ณ  ์จ์ฃผ๋ฉด ๋ฐ”๋กœ ์‹คํŒจ ใ… 


์™œ๋ƒ๋ฉด ์ ‘๊ทผ์ œ์–ด์ž๊ฐ€ public, open์ด ์•„๋‹ˆ๋ผ internal ๋•Œ๋ฌธ์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์—†๋‹ค.

์ž๋™ ์ƒ์„ฑ๋œ ์ฝ”๋“œ๋Š” ํผ๋ธ”๋ฆญ์œผ๋กœ ํ•ด์ค˜์•ผํ•˜๋Š”๊ฑฐ ์•„๋‹Œ๊ฐ€!?


๋‹ค์‹œ SPM ํŒŒ์ผ๋กœ ๋Œ์•„๊ฐ€์„œ ๋ฐ”๊ฟ”์ฃผ์ž


์œ„์ฒ˜๋Ÿผ struct ์•ž์— ๋ถ™์—ฌ์ฃผ๊ณ 

init()๋„ ๋ถ™์—ฌ์ฃผ๊ณ 

๋น„๊ตํ•˜๊ฒŒ ํ”„๋กœํผํ‹ฐ๋„ ํ•˜๋‚˜ public์„ ๋ถ™์—ฌ์„œ ๋งŒ๋“ค์–ด์คฌ๋‹ค.


๋”ฐ๋ผ์„œ ํ”„๋กœํผํ‹ฐ๋Š” internal์ธ text์™€ public์ธ publicText ๋‘๊ฐœ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ‘ธ์‹œ๋ฅผ ํ•ด์ฃผ์ž.


๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ ์›๋ž˜ ์‚ฌ์šฉํ•˜๋˜ ํ”„๋กœ์ ํŠธ๋กœ ์ด๋™ํ•˜์ž,


๊ทธ๋Ÿผ ์ด์ „ ๋ฒ„์ „์„ ์—…๋ฐ์ดํŠธ ํ•ด์ค˜์•ผํ•œ๋‹ค.

์ด ๋˜ํ•œ ํผ์ŠคํŠธํŒŒํ‹ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์—…๋ฐ์ดํŠธํ•˜๊ธฐ ๋ˆŒ๋Ÿฌ์ค€๋‹ค!


๊ทธ๋Ÿผ ์ด์ œ ๋‹ค์‹œ ์ฝ”๋“œ๋กœ ๊ฐ€์„œ ์‚ฌ์šฉํ•ด๋ณด์ž


init๊นŒ์ง€ ์•„์ฃผ ์ž˜๋˜์—ˆ๊ณ , ์œ„์— ๋งํ–ˆ๋“ฏ์ด internal์ธ text๋Š” ๋ณด์ด์ง€ ์•Š์ง€๋งŒ

public์ธ publicText๋Š” ์ž˜ ๋ณด์ธ๋‹ค.


์ถœ๋ ฅ๊นŒ์ง€ ํ•ด๋ณด์ž


์˜ค์˜ค ์•„์ฃผ ๊ฐ„๋‹จํ•˜๋‹ค ๊ฐ„๋‹จํ•ด.


๋‹ค์Œ๋ฒˆ์—” Property Wrapper ๋งŒ๋“  ๊ฒƒ์„ SPM์œผ๋กœ ์ ์šฉํ•ด๋ณด์ž!