๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ ๊ธฐ๋ก/TIL

[TIL] 20231207

Trouble Shooting - ์‹ฑ๊ธ€ํ„ด ์ธ์Šคํ„ด์Šค์˜ ์ดˆ๊ธฐํ™” ์‹œ์ 

๋ถ€์บ  ๋™๋ฃŒ๋ถ„์—๊ฒŒ ๋ฐ›์€ ์งˆ๋ฌธ!

์‹ฑ๊ธ€ํ„ด ์ธ์Šคํ„ด์Šค๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ ์ „์—ญ ๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜์— ํ• ๋‹นํ•ด๋‘๊ณ  ํ•ด๋‹น ๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜์— ์ ‘๊ทผํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋˜๋‚˜์š”???

์˜ค์—ฅ?? ๋˜๋Š”๋ฐ์—ด,, but ๋™๋ฃŒ์˜ ํ”Œ์ ์—์„œ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์—ˆ์Œ... whyrano....

์ฝ”๋“œ๋ฅผ ๋ด…์‹œ๋‹ค. ๋ ˆ์ญˆ๊ณ . (์ œ๊ฐ€ ์ง  ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋‹ˆ ์ฝ”๋“œ ๋ธ”๋Ÿญ์ด ์•„๋‹Œ ์Šค์ƒท์œผ๋กœ ๋ณด์—ฌ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค..!)

 

GamePlayer๋ผ๋Š” ํด๋ž˜์Šค์—์„œ static ํ”„๋กœํผํ‹ฐ๋กœ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด๋‘๊ณ ,

init() ์ƒ์„ฑ์ž์— private์œผ๋กœ ์ ‘๊ทผ์ œ์–ด๋ฅผ ํ•จ์œผ๋กœ์จ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋Š” ํ•˜๋‚˜๋งŒ ์ƒ์„ฑ๋จ์„ ๋ณด์žฅํ•ด์ฃผ์…จ์Œ!!!

์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์„ ์‚ฌ์šฉํ•ด์„œ ํด๋ž˜์Šค๋ฅผ ์•„์ฃผ ์ž˜ ์ƒ์„ฑํ•˜์…จ์ฃ ??

์ด์ œ GamePlayer ๋ผ๋Š” ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•˜๋ ค๋ฉด shared ๋ผ๋Š” ์ด๋ฆ„์˜ ํ”„๋กœํผํ‹ฐ๋กœ ์ ‘๊ทผํ•ด์•ผํ•จ!!!

 

RockPaperScissorsController ๋ผ๋Š” ๊ตฌ์กฐ์ฒด ์•ˆ์—์„œ ์•„๊นŒ ์ƒ์„ฑํ•ด๋‘” ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด์— ์ ‘๊ทผํ•ด์„œ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ํ”„๋กœํผํ‹ฐ์ธ attackPlayer์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•ด์ฃผ๊ณ  ์‹ถ์Œ.

๊ทธ๋Ÿฌ๋ฉด GamePlayer.shared๋กœ ์•„๊นŒ ์ƒ์„ฑํ•ด๋‘” ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•ด์„œ ์‚ฌ์šฉํ•ด์ค„ ์ˆ˜ ์žˆ๊ฒ ์ฃ ??

์—ฌ๊ธฐ๊นŒ์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.. ์‹คํ–‰ํ•ด๋ด๋„ ํ”„๋กœ๊ทธ๋žจ์ด ์ž˜ ์ž‘๋™๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

 

but ์‹ฑ๊ธ€ํ„ด ๊ฐ์ฒด์— ์ ‘๊ทผํ•  ๋•Œ๋งˆ๋‹ค ํด๋ž˜์Šค ์ด๋ฆ„.shared ์ด๋ ‡๊ฒŒ ์ ‘๊ทผํ•ด์•ผ๋˜๋ƒ๊ณ ..... ๋„˜ ๊ท€์ฐฎ์ž–์•„์š”......(์‹ค์ œ๋กœ ํ•ด๋‹น ๊ตฌ์กฐ์ฒด ๋‚ด์—์„œ ๊ฝค๋‚˜ ์—ฌ๋Ÿฌ๋ฒˆ ์‹ฑ๊ธ€ํ„ด ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•ด์ฃผ๊ณ  ์žˆ๋Š” ์ƒํ™ฉ)

 

์œ„์™€ ๊ฐ™์ด ์ ‘๊ทผํ•˜๋ ค๋Š” ํด๋ž˜์Šค or ๊ตฌ์กฐ์ฒด ๋‚ด์— ์ „์—ญ์ ์œผ๋กœ ์„ ์–ธํ•ด๋‘๊ณ  ๋ฐ”๋กœ๋ฐ”๋กœ ์ ‘๊ทผํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹จ ๋ง์ž„. ์ด๋ ‡๊ฒŒ ํ•˜๋Š”๊ฒŒ ๊ฐ€๋Šฅํ•œ๊ฐ€์š”??

๋‹น์—ฐํžˆ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค!!! ์‹ค์ œ๋กœ ์ปดํŒŒ์ผ ์—๋Ÿฌ๋ฅผ ๋งŒ๋‚˜์ง€ ์•Š์„ ๊ฒƒ์ž„!!

 

์—ฌ๊ธฐ์„œ ๋“œ๋Š” ์˜๋ฌธ.. ์‹ฑ๊ธ€ํ„ด์€ ์•ฑ ๋‚ด์— ์ธ์Šคํ„ด์Šค ์ž์ฒด๊ฐ€ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•˜๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋‚˜ ๊ตฌ์กฐ์ฒด์—์„œ ํ”„๋กœํผํ‹ฐ ํ•˜๋‚˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ํ• ๋‹นํ•ด๋‘๊ณ  ์ด ํ”„๋กœํผํ‹ฐ๋กœ ์ ‘๊ทผํ•˜๋ฉด ์ธ์Šคํ„ด์Šค ์—ฌ๋Ÿฌ ๊ฐœ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ ์•„๋‹Œ๊ฐ€??? ๋ฐ์ดํ„ฐ์˜ ๋™๊ธฐํ™” ๋ฌธ์ œ๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š๋‚˜์š”??

์ •๋‹ต์€ ์•„๋‹™๋‹ˆ๋‹ค!! ์‹ฑ๊ธ€ํ„ด ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์— private์œผ๋กœ ์ ‘๊ทผ์ œ์–ด๋ฅผ ํ•ด๋‘์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์„ ๋ฟ๋”๋Ÿฌ ์œ„์˜ ์ฝ”๋“œ์—์„œ ๋ณ€์ˆ˜์— ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด ํ• ๋‹นํ•ด์ฃผ๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ shared์— ์ €์žฅ๋œ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ๋งŒ ํ•˜๊ณ  ์žˆ์ ธ??? ๊ฑฑ์ • ๋…ธ๋…ธ

์ปดํŒŒ์ผ ์—๋Ÿฌ๋„ ์•ˆ๋‚˜๋‹ˆ,, ์‹คํ–‰์„ ํ•ด๋ด…์‹œ๋‹ค.

 

์–ด๋ผ๋ผ ๋Ÿฐํƒ€์ž„์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ด ๊ฐ•์ œ ์ข…๋ฃŒ๊ฐ€ ๋˜๋„ค์š”..

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‹ˆ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ๋ฐœ์ƒํ–ˆ๊ณ ,, ์™ผ์ชฝ ์ฝœ ์Šคํƒ์„ ๋ณด๋ฉด,, ํด๋ž˜์Šค.init() or ๊ตฌ์กฐ์ฒด.init() ์ด ๋œจ๋Š”๊ฑธ ๋ณด๋‹ˆ ์ดˆ๊ธฐํ™” ์‹œ์ ๊ณผ ๊ด€๋ จํ•œ ์—๋Ÿฌ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

์–ด๋–ค ์ธ์Šคํ„ด์Šค๊ฐ€ ์ดˆ๊ธฐํ™” ๋˜๊ธฐ ์ „์— ์ ‘๊ทผ์„ ํ•ด์ฃผ๊ณ  ์žˆ๋Š” ๋“ฏ ํ•˜๋„ค์š”,,  ์ฐพ์•„๋ด…์‹œ๋‹ค ,,

 

์ผ๋‹จ ์ฒ˜์Œ์— GamePlayer.shared.~ ๋กœ ์ ‘๊ทผํ–ˆ์„ ๋•Œ ์•„๋ฌด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š์•˜๋˜ ์ด์œ ๋Š”?

๋ฐ”๋กœ๋ฐ”๋กœ ์šฐ๋ฆฌ๊ฐ€ shared๋ฅผ staticํ•˜๊ฒŒ ์„ ์–ธํ•ด๋‘์—ˆ๊ธฐ ๋•Œ๋ฌธ!!

Swift์—์„œ static์„ ์‚ฌ์šฉํ•ด ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ „์—ญ์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋ฉด, ์‚ฌ์šฉ ์‹œ์ ์— ์ดˆ๊ธฐํ™”๊ฐ€ ๋จ!!!

์ฆ‰, lazy ํ•˜๊ฒŒ ์ดˆ๊ธฐํ™”๋œ๋‹ค๋Š” ์ ..๊ฐ์ฒด์— ์ ‘๊ทผํ•  ๋•Œ ์ดˆ๊ธฐํ™”๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ๊ฐ„๋‹ค! shared์— ์ฒ˜์Œ ์ ‘๊ทผํ•  ๋•Œ ์ดˆ๊ธฐํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง!!

+ Swift์—์„œ๋Š” dispatch_once ๋กœ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ํ™˜๊ฒฝ์—์„œ๋„ ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด๊ฐ€ ํ•œ๋ฒˆ๋งŒ ์ดˆ๊ธฐํ™”๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•จ!!

์ฆ‰, Thread-Safeํ•˜๊ฒŒ ์ดˆ๊ธฐํ™”๊ฐ€ ๋œ๋‹ค๋Š” ๊ฒƒ์ž„ (์ข‹๋‹ค..ใ…Ž)

๊ทธ๋ž˜์„œ ์—ฌ๊ธฐ์ €๊ธฐ์„œ GamePlayer.shared.~๋ฅผ ํ˜ธ์ถœํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ๋˜ ๊ฒƒ!!! (swift์—์„œ๋Š” ์ „์—ญ, ์ •์  ๋ณ€์ˆ˜์˜ ์ดˆ๊ธฐํ™” ๊ณผ์ •์ด atomic, thread-safe ํ•จ์„ ๋ณด์žฅํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์—)

 

But, ๋ฌธ์ œ ์ƒํ™ฉ์€ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๊ณ  ์—ฌ๊ธฐ์— ์ ‘๊ทผํ•  ๋•Œ ์ƒ๊ธฐ๊ณ  ์žˆ์—ˆ์ฃ ??

์ด ๋ฐฉ์‹์€ thread-safe ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž„!!!

๋‹ค๋ฅธ ํ”„๋กœํผํ‹ฐ์— shared๋ฅผ ํ• ๋‹นํ•˜๋ฉด ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ์˜ ์ดˆ๊ธฐํ™” ์‹œ์ ์€ shared์˜ ์ดˆ๊ธฐํ™” ์‹œ์ ๊ณผ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ shared๋ฅผ ์–ด๋–ค ํ”„๋กœํผํ‹ฐ์— ํ• ๋‹นํ•˜๋ ค๋Š” ์‹œ์ ์— shared์— ๋Œ€ํ•œ ์ดˆ๊ธฐํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์€ ์ƒํƒœ๋ผ๋ฉด??

์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š์€ ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•ด๋ฒ„๋ฆฌ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒ ์ฃ ???

์œ„์˜ ์ƒํ™ฉ์ด ๋”ฑ ๊ทธ๋Ÿฐ ์ƒํ™ฉ์ธ ๊ฒƒ์ž„! 

 

์ด ๊ตฌ์กฐ์ฒด ๋‚ด์—์„œ GamePlayer.shared ๋ฅผ gamePlayer ๋ผ๋Š” ์ „์—ญ๋ณ€์ˆ˜(์ƒ์ˆ˜๋„ ๊ฐ€๋Šฅ)์—๋‹ค๊ฐ€ ํ• ๋‹นํ•ด์ฃผ๊ณ  ์žˆ์ฃ ??

๊ทผ๋ฐ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ ํ™˜๊ฒฝ์—์„œ shared๊ฐ€ GamePlayer.shared๊ฐ€ ์ดˆ๊ธฐํ™” ์•ˆ๋˜์–ด์žˆ๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด?? 

์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•˜๊ฒŒ ๋˜์–ด ๊ด€๋ จ๋œ ๋ถ€๋ถ„์—์„œ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ๋‹ค๋ผ๋ผใ…ใ„นใ„ฑ ์ƒ๊ธฐ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์ฃ ..

๊ทธ๋Ÿผ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜๊ฒ ์ฃ ??? ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜ or ์ƒ์ˆ˜์— ํ• ๋‹น ํ•ด์ค„ ๋•Œ๋„ lazy๋ฅผ ๋ถ™์—ฌ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค!!!!

์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์‹œ์ ์— ์ง€์—ฐ ์ดˆ๊ธฐํ™” ํ•ด์ค˜!!!!

 

์ด์ œ ํ”„๋กœ๊ทธ๋žจ์ด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰์ด ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!!!

์ฐธ๊ณ ๋กœ lazy๋Š” ๋ณ€์ˆ˜์—๋งŒ ๋ถ™์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! (์ƒ์ˆ˜์—๋Š” ๋ถˆ๊ฐ€..)

 

ํ˜ธํ•˜ํ•˜ใ… ์žฌ๋ฐŒ๋„ค์š”.. ์‹œ๋””๊ฐ€ ์ด๊ฑฐ ๋ณด๊ณ  ์ดํ•ดํ–ˆ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.. ์ดํ•ดํ•  ๊ฒƒ์ž„ ๊ทธ๋Š” ์ฒœ์žฌ๋‹‰๊นŒ.....

์ดํ•ด ์•ˆ๊ฐ€๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ๋‹ฌ๋ ค์˜ค์„ธ์š”,,

๊ธ€๊ณ  ์ด๊ฑฐ ๋ณด๋Š” ์„ ๋ฐฐ๋“ค.. ์—ฌ๊ธฐ์„œ ํ‹€๋ฆฐ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์…”..๋Œ“๊ธ€ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!!!

Tuist๋ฅผ ์ด์šฉํ•œ ๋ชจ๋“ˆํ™” - ์™ธ๋ถ€ ์˜์กด์„ฑ ์ถ”๊ฐ€ํ•˜๊ธฐ

Xcode native Swift Package Manager๋ฅผ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•

๊ฒฝ๋กœ๋ฅผ ์ž…๋ ฅํ•ด์„œ local๋กœ package๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ์‹!

remote๋Š” url๊ณผ requirement๋ฅผ ๋ฐ›๋Š”๋‹ค.

url์€ SPM์„ ์ง€์›ํ•˜๋Š” ๋ ˆํฌ์˜ Remote Git URL, requirement๋Š” ๋ฒ„์ „ ์ •๋ณด!!!

 

ThirdPartyLib > Project.swift (SnapKit ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€ ์˜ˆ์‹œ)

import ProjectDescription
import ProjectDescriptionHelpers

let project = Project.makeModule(
    name: "ThirdPartyLib",
    product: .framework,
    packages: [
        .remote(url: "<https://github.com/SnapKit/SnapKit.git>", 
                requirement: .upToNextMajor(from: "5.0.0"))
    ],
    dependencies: [
        .package(product: "SnapKit")
    ]
)

 

tuist edit ๋ช…๋ น์–ด ์ž…๋ ฅ ํ›„ ์œ„์˜ ์ฝ”๋“œ ๋„ฃ์–ด์ฃผ๋ฉด ๋จ!!

generate ํ•ด๋ณด๋ฉด??

package๊ฐ€ ์ถ”๊ฐ€๋˜๊ณ  ์ถ”๊ฐ€ํ•ด์ค€ ํŒจํ‚ค์ง€๋ฅผ import ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ!!!

์ด๋ ‡๊ฒŒ ๊ทธ๋ž˜ํ”„์—๋„ ์ถ”๊ฐ€๊ฐ€ ๋ฉ๋‹ˆ๋‹ค!!!

โš ๏ธ ์ฃผ์˜ํ•  ์ !!!

SPM, Carthage๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค… cocoapods๋Š” ์ง€์›์„ ํ•˜์ง€ ์•Š์•„์„œ ๋”ฐ๋กœ Podfile์„ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์Šˆ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜๋„ค์š”..

'๐Ÿ“ ๊ธฐ๋ก > TIL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[TIL] 20240102  (0) 2024.01.03
[TIL] 20231215  (1) 2023.12.18
[TIL] 20231206  (0) 2023.12.08
[TIL] 20231205  (2) 2023.12.05
[TIL] 20231204  (1) 2023.12.04