๐ iOS (38) ์ธ๋ค์ผํ ๋ฆฌ์คํธํ [Architecture] Clean Architecture ์๋ ํ์ธ์ ์ ์ธ์ ๋๋ค :) ์ ์ฐํ ์ค๊ณ์ ๊ด์ฌ์ด ๋ง์์ง๋ฉด์ ํด๋ฆฐ ์ํคํ ์ฒ์ ๋ํด ์ซ์ซ๋ฐ๋ฆฌ๋ก ๊ณต๋ถ๋ ํ๊ณ ์์์ง๋ง, ๋จธ๋ฆฟ์์ ํ์คํ๊ฒ ๊ฐ๋ ์ด ์กํ์์ง ์์ ์ํ์๋๋ฐ.. ์ด์ ๋ ํ๋ก์ ํธ์ ์ ์ฉ๊น์ง ํด๋ณด๊ณ ์ถ์ด์ ํด๋ฆฐ ์ํคํ ์ฒ์ ๋ํด ์ ๋ฆฌ๋ฅผ ํด๋ณด๋ ค๊ณ ํฉ๋๋ค! ์ด๋ฒ ๊ฒ์๊ธ์์๋ Robert C. Martin์ The Clean Architecture ๋ผ๋ ๊ธ์ ๋ฒ์ญํด๋ณด๋ฉด์ ํด๋ฆฐ ์ํคํ ์ฒ ๊ฐ๋ ์ ๋ํ ์ ๋ฆฌ๋ฅผ ํด๋ณด๊ฒ ์ต๋๋ค. Clean Architecture๋? ํด๋ฆฐ ์ํคํ ์ฒ๋ Robert C. Martin(aka ์ํด๋ฐฅ, ๋ฐฅ์์ ์จ)์ ์ํด ๊ณ ์๋ ์ํํธ์จ์ด ์ํคํ ์ฒ ํจํด์ ๋๋ค. ๋ฐฅ์์ ์จ๊ฐ ํด๋ฆฐ ์ํคํ ์ฒ๋ฅผ ๋์ฒด ์ ๋ง๋ค๊ฒ ๋์๋.. ํ๋ฉด! ๊ธฐ์กด์ ์ฌ๋ฌ ์ํคํ ์ฒ์์ ์ ์ฌ์ฑ์ ์ฐพ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ธฐ์กด์ ์ํคํ ์ฒ๋ค์ ์ธ.. [iOS] TDD์ Unit Test TDD(Test-Driven Development) ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ(Test-driven development TDD)์ด๋, ๋ฐ๋ณต ํ ์คํธ๋ฅผ ์ด์ฉํ ์ํํธ์จ์ด ๋ฐฉ๋ฒ๋ก ์ผ๋ก, ๋งค์ฐ ์งง์ ๊ฐ๋ฐ ์ฌ์ดํด์ ๋ฐ๋ณตํ๋ ์ํํธ์จ์ด ๊ฐ๋ฐ ํ๋ก์ธ์ค ์ค ํ๋์ ๋๋ค. TDD ๊ฐ๋ฐ์ฃผ๊ธฐ Red: ์คํจํ๋ ํ ์คํธ ์ฝ๋ ์์ฑ Green: ์คํจํ ํ ์คํธ๋ฅผ ํต๊ณผํ๊ธฐ ์ํ ์ต์ํ์ ์ฝ๋ ๋ณ๊ฒฝ (ํ ์คํธ์ ์ฑ๊ณต) Refactor: ํ ์คํธ์ ์ฑ๊ณต์ ์ ์งํ๋ฉด์ ์ฝ๋๋ฅผ ๋ ๋์ ๋ฐฉํฅ์ผ๋ก ๊ฐ์ ์ผ๋ฐ ๊ฐ๋ฐ ๋ฐฉ์ vs. TDD ๊ฐ๋ฐ ๋ฐฉ์ ์ผ๋ฐ์ ์ธ ๊ฐ๋ฐ ๋ฐฉ์์ ์๊ตฌ์ฌํญ ๋ถ์ → ์ค๊ณ → ๊ฐ๋ฐ → ํ ์คํธ → ๋ฐฐํฌ์ ํํ์ ๊ฐ๋ฐ ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ต๋๋ค. ํด๋น ๋ฐฉ์์์๋ ์ค๊ณ์ ๋ฐ๋ผ ๊ธฐ๋ฅ ๊ฐ๋ฐ์ ์๋ฃํ ํ ๋ฐฐํฌํ๊ธฐ ์ , ํด๋น ์ฝ๋์ ์์ ์ฑ์ด๋ ๋ฒ๊ทธ๊ฐ ์๋์ง๋ฅผ ๊ฒ์ฌํ.. [Swift] Generic ์๋ ํ์ธ์ ์ ์ธ์ ๋๋ค :)์์ ์ TIL๋ก ์ ๋ฆฌํ๋ Generic์ ๋ํ ๋ด์ฉ์ ๋ธ๋ก๊ทธ์๋ ํฌ์คํ ํด๋๋ฉด ์ข์ ๊ฒ ๊ฐ์ ์ฝ์ฅ ํด์์ต๋๋ค ใ ใ Generic์ ๋ํด Apple์ Swift๋ฌธ์๋ฅผ ์ฐธ๊ณ ํด์ ์ ๋ฆฌํด๋ณด๋ ค ํฉ๋๋ค!Generic์ด๋? generic์ ํฌ๊ด์ ์ธ, ํต์นญ์ ์ ๋์ ์ฌ์ ์ ์ธ ์๋ฏธ๋ฅผ ๊ฐ์ง๋๋ค.๊ทธ๋ ๋ค๋ฉด, Apple์์ ์๊ฐํ๋ generic์ ๋ํด ํ๋ฒ ์ดํด๋ณด๊ฒ ์ต๋๋ค!Generic์ด๋ ํ์ ์ ์์กดํ์ง ์๋ ๋ฒ์ฉ ์ฝ๋๋ฅผ ์์ฑํ ๋ ์ฌ์ฉํฉ๋๋ค.Generic์ ์ฌ์ฉํ๋ฉด ์ค๋ณต์ ํผํ๊ณ , ์ ์ฐํ๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.Generic์ Swift์ ๊ฐ์ฅ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ ์ค ํ๋๋ก, Swift ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ถ๋ถ์ Generic ์ฝ๋๋ก ์์ฑ๋์ด์์ต๋๋ค.์ค์ ๋ก, Generic์ ์ฌ์ฉํ๋ค๋ ๊ฒ์.. [iOS] iOS ํ์ผ ์์คํ File System ํ์ผ ์์คํ ์ ๋ฐ์ดํฐ ํ์ผ, ์ฑ ๋ฐ ์ด์ ์ฒด์ ์์ฒด์ ๊ด๋ จ๋ ํ์ผ์ ์๊ตฌ ์ ์ฅ์ ์ฒ๋ฆฌํฉ๋๋ค. ๋ฐ๋ผ์ ํ์ผ ์์คํ ์ ๋ชจ๋ ํ๋ก์ธ์ค์์ ์ฌ์ฉ๋๋ ๊ธฐ๋ณธ ๋ฆฌ์์ค ์ค ํ๋์ ๋๋ค. iOS File System Apple ์ํ๊ณ์ ๊ธฐ๋ณธ ํ์ผ ์์คํ ์ APFS๋ก, macOS, iOS, watchOS ๋ฐ tvOS์ ๊ธฐ๋ณธ ํ์ผ ์์คํ ์ ๋๋ค. (iOS 10.3 ์ด์, macOS HighSierra ์ด์) iOS ํ์ผ ์์คํ ์ ์์ฒด์ ์ผ๋ก ์คํ๋๋ ์ฑ์ ๋ง์ถฐ์ ธ ์์ต๋๋ค. ์์คํ ์ ๋จ์ํ๊ฒ ์ ์งํ๊ธฐ ์ํด iOS ์ฅ์น ์ฌ์ฉ์๋ ํ์ผ ์์คํ ์ ์ง์ ์ก์ธ์คํ ์ ์์ผ๋ฉฐ ์ฑ์ ํด๋น ๊ท์น์ ๋ฐ๋ผ์ผ ํฉ๋๋ค. (์ฌ์ฉ์๊ฐ ํ์ผ ์์คํ ์ ์ง์ ์ก์ธ์ค ํ ์ ์๋ค๋ฉด ํ์ผ ์์คํ ์ด ๋ด๋ถ ๊ท์น์ ํตํด์๋ง ๊ด๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ์ .. [Swift] Optional ์๋ ํ์ธ์ ์ ์ธ์ ๋๋ค :) TIL์ ์์ฑํ๋ค๊ฐ ์ต์ ๋์ ๋ํด ์ ๋ฆฌ๋ฅผ ํ๊ฒ ๋์๋๋ฐ์, ๊ทธ๋ฅ ์ต์ ๋ ๋ฝ๊ฐ๊ธฐ๋ก ์ ๋๋ก ์ ๋ฆฌ๋ฅผ ํ์ ์ถ์ด์ Optional์ ๋ํ ๊ณต์๋ฌธ์์ ๊นํ๋ธ์ ์คํ๋ Optional ๋ด๋ถ ๊ตฌ์กฐ ์ฝ๋๋ฅผ ํ ๋๋ก ์ต์ ๋์ ๋ํด ์ ๋ฆฌ๋ฅผ ์ญ ํด๋ณด๋ ค ํฉ๋๋ค! Optional (์ต์ ๋) ์ต์ ๋์ ๊ฐ์ด '์์ ์๋, ์์ ์๋ ์์' ์ ๋ํ๋ด๋ ํํ์ ๋๋ค. ์ด๋ '๋ณ์๋ ์์ ๋ฑ์ ๊ผญ ๊ฐ์ด ์๋ค๋ ๊ฒ์ ๋ณด์ฅํ ์ ์์ต๋๋ค. ์ฆ, ๋ณ์ ๋๋ ์์์ ๊ฐ์ด nil์ผ ์๋ ์๋ค'๋ ๊ฒ์ ์๋ฏธ @frozen enum Optional: ExpressibleByNiliteral { case none // nil case some(Wrapped) // optional value } ์ต์ ๋์ ์ ๋ค๋ฆญ์ด ์ ์ฉ๋ ์ด๊ฑฐํ.. [Swift] ์ ๋ ฌ ๋ฉ์๋ ์ ๋ณตํ๊ธฐ (sort(), sorted()) ์๋ ํ์ธ์ ์ ์ธ์ ๋๋ค :) ์ด๋ฒ ๊ฒ์๊ธ์์๋ Swift์ ์ ๋ ฌ ๋ฉ์๋์ ๋ํด ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํฉ๋๋ค. ์ ๋ ฌ ๋ฉ์๋์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ๋ด์ฉ ์ ๋ฆฌ์ ๋๋ถ์ด ์ ๋ ฌ ์กฐ๊ฑด ์ค์ , ๋ค์ค ์ ๋ ฌ ๋ฑ ํ์ฉ ๋ฐฉ๋ฒ๊น์ง ์ด์ ๋ฆฌ๋ฅผ ํด๋ณด๊ณ ์ ์ ๋ชฉ์ ์ ๋ณตํ๊ธฐ๋ก ์ง์ด๋ณด์์ต๋๋ค ๐ ์ ๋ ฌ ๋ฉ์๋๋ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด ์์๋ ๋ง์ด ํ์ฉ์ด ๋๋ ๋งํผ ํ์คํ ์ ๋ฆฌ๋ฅผ ํด๋๊ณ ๊ธฐ์ตํด๋ก์๋ค!!! ์ ๋ ฌ ๋ฉ์๋ ๋ค ๊ฐ์ง ๋น๊ต ๋จผ์ , ๊ณต์ ๋ฌธ์๋ฅผ ํตํด ๊ธฐ๋ณธ์ ์ธ ๋ด์ฉ๋ถํฐ ์ ๋ฆฌํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์ ๋ ฌ ๋ฉ์๋๋ ๊ณต์๋ฌธ์์ Array ๋ถ๋ถ์ ๋์์๋๋ฐ์, ๊ณต์ ๋ฌธ์์ ๋์์๋ ๋ค ๊ฐ์ง ๋ฉ์๋๋ฅผ ํ๋ฒ ์ดํด๋ด ์๋ค. (์ ๋ ฌ ๋ฉ์๋๋ Array์์๋ง ์ฌ์ฉ๊ฐ๋ฅํ ๋ฉ์๋๋ ์๋๊ณ , RandomAccessCollection ํ๋กํ ์ฝ์ ์ค์ํ๋ ์ปฌ๋ ์ ํ์ ์ด๋ผ๋ฉด ์ฌ์ฉ ๊ฐ๋ฅํฉ๋.. [iOS] ํค์ฒด์ธ(Keychain)์ ์ด์ฉํ ๋ฐ์ดํฐ ์ ์ฅ ๋ฐ ๊ด๋ฆฌ ์๋ ํ์ธ์ ์ ์ธ์ ๋๋ค :) ์ต๊ทผ์ ํ๋ก์ ํธ ๊ฐ๋ฐ์ ํ๋ฉฐ ํ ํฐ๊ณผ ๊ฐ์ ์ค์ํ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ข ๋ ์์ ํ๊ฒ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๊ณ ์ ํค์ฒด์ธ์ ์ด์ฉํด๋ณด์๋๋ฐ์, ํค์ฒด์ธ์ ๋ํ ๋ด์ฉ๋ ์ ๋ฆฌํ ๊ฒธ, ํค์ฒด์ธ์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ๊ณต์ ํด๋ณด๋ ค๊ณ ํฉ๋๋ค ! Keychain Service ํค์ฒด์ธ ์๋น์ค๋ Apple์ด ์ ๊ณตํ๋ ๋ณด์ ํ๋ ์์ํฌ์ ๋๋ค. ๊ณต์๋ฌธ์์ ๋ฐ๋ฅด๋ฉด, ํค์ฒด์ธ ์๋น์ค API๋ ์ฑ์ ํค์ฒด์ธ์ด๋ผ๋ ์ํธํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ ์ฌ์ฉ์ ๋ฐ์ดํฐ ๋นํธ๋ฅผ ์ ์ฅํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ฌ ์ํธ์ ๊ฐ์ด ๋ณด์์ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ์ ์ฅํ๋ ๋ฐ ๋์์ ์ค๋๋ค. ์ฆ, ์ํธํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ธ Keychain์ ์ ๋ณด๋ฅผ ์ ์ฅํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ์ ์ฅํ ์ ์๋๋ก ํฉ๋๋ค. ํค์ฒด์ธ์ ์ํธ์๋ง ๊ตญํ๋์ง ์์ต๋๋ค. ์ ์ฉ ์นด๋ ์ ๋ณด๋ ๊ฐ๋จํ ๋ฉ.. [RxSwift] Traits - Driver, Signal, Control Property/ControlEvent ์๋ ํ์ธ์ ์ ์ธ์ ๋๋ค :) ์ง๋ ๊ฒ์๊ธ์ ์ด์ด ์ด๋ฒ ๊ฒ์๊ธ์์๋ RxCocoa์ Traits์ ๋ํด ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฒ ๊ฒ์๊ธ๋ ReactiveX/RxSwift์ Traits ๋ฌธ์ ๋ฒ์ญ์ ํตํด ์์ฑํ๊ฒ ์ต๋๋ค! RxCocoa Traits์ ์ข ๋ฅ RxCocoa์ Traits๋ก๋ Driver, Signal, Control Property/ControlEvent๊ฐ ์์ต๋๋ค. ํ๋์ฉ ์ดํด๋ณด๊ฒ ์ต๋๋ค! Driver Driver๋ ๊ฐ์ฅ ์ ๊ตํ trait์ ๋๋ค. UI ๊ณ์ธต์์ reactive ์ฝ๋๋ฅผ ์์ฑํ๋ ์ง๊ด์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๊ฑฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ๋(driving)ํ๋ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๋ชจ๋ธ๋งํ๋ ค๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. + Driver๋ผ๋ ์ด๋ฆ์ด ๋ถ์ ์ด์ ? Driver์ ๋ชฉ์ ์์ฒด๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ.. ์ด์ 1 2 3 4 5 ๋ค์