The Clean Swift Handbook์ ๋ฐํ์ผ๋ก ์ ๋ฆฌ๋ฅผ ์งํํ์ต๋๋ค. ๋ถ๋งํฌ์ The Clean Swift Handbook ๋งํฌ๋ฅผ ์ฐ๊ฒฐํด๋์์ต๋๋ค.
ย Clean Swift
iOS ๊ฐ๋ฐ์ ์์ํ์ ๋, ์ฝ๊ฒ ์ ์ฉํ ์ ์๋ Architecture๋ ์๋ฌด๋๋ MVC ํจํด์ผ ๊ฒ๋๋ค.
์์ ํ๋ก์ ํธ์์ MVC ํจํด์ ์ ์ฉํ๋ ๊ฒ์ ํฐ ๋ฌด๋ฆฌ๊ฐ ์๊ฒ ์ง๋ง, ํด๋น ํ๋ก์ ํธ๊ฐ ์ฑ์ฅํ๋ฉด์ MVC ํจํด์ด ํ๋ก์ ํธ์ ์ฑ์ฅ์ ์ ์ฝ์ ์ค ์ง๋ ๋ชจ๋ฆ
๋๋ค.
์ด๋ฐ ๊ฒฝ์ฐ, ์ฐ๋ฆฌ๋ ์๋ก์ด ํจํด์ ์ฐพ๊ฒ ๋ฉ๋๋ค. MVVM, MVP ๋ฑ ๋ค์ํ ํจํด์ด ์กด์ฌํฉ๋๋ค.
์ ์๋ Clean Swift๋ฅผ ์ ์ฉํ๋ผ๊ณ ๋งํฉ๋๋ค.
์ Clean Swift๋ฅผ ์ ์ฉํ๋ผ๋ ๊ฑธ๊น์?
Clean Swift๋ ๋น์ ์ ์ฝ๋๊ฐ ๋
ผ๋ฆฌ์ ์ผ๋ก ์๋ง๋ ์์น์ ์๋ฆฌ์ก์ ์ ์๋๋ก ๋์์ค๋๋ค.
[ Massive View Controller ]
MVC ํจํด์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ViewController๊ฐ ๋น๋ํด์ง๋ ๊ฒฝ์ฐ๋ฅผ ๋ง์ด ๋ณด๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋น๋ํด์ง ViewController ๋ด๋ถ์๋ ๋ค์ํ ์ญํ ์ ํ๋ ๋ฉ์๋๋ค์ด ๋ชจ์ด๊ฒ ๋ฉ๋๋ค.
์ฆ, Testableํ์ง ๋ชปํ ํํ๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์, ๋จ์ ํ
์คํธ๋ฅผ ์์ฑํ์ง ๋ชปํ๋ ์ฝ๋๋ฅผ ์์ฑํ๊ฒ ๋ฉ๋๋ค.
๋ํ, SRP(Single Responsibility Principle)๋ฅผ ์๋ฐฐํ๋ ํํ๋ฅผ ๊ฐ์ง๋๋ค. ViewController๊ฐ ๋ค์ํ ์ฑ
์์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ด์ฃ .
Clean Swift๋ ์ฑ
์์ ๋ช
ํํ๊ฒ ๋ถ๋ฆฌํ์ฌ ViewController ๋ด์ ์๋ ๋ค์ํ ์ฑ
์์ ๊ฐ์ง ์ฝ๋๋ฅผ Interactor, Presenter, Router ๋ฑ์ผ๋ก ๋ถ๋ฆฌํ๊ฒ ๋ฉ๋๋ค.
์ฝ๋์ ๊ฐ๋
์ฑ์ด ํฅ์ํ ๋ฟ๋ง ์๋๋ผ ๋จ์ ํ
์คํธ๋ฅผ ์์ฑํ๊ธฐ ์๋ง์ ์ฝ๋๊ฐ ์์ฑ๋ฉ๋๋ค.
[ Minimize Context Switching ]
Clean Swift๋ Context Switching๋ฅผ ์ต์ํ์์ผ ์ค๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์ ๋ง์ Zone์ ๋จธ๋ฌด๋ฅผ ์ ์๋๋ก(getting in the zone) ๋์์ ์ค๋๋ค. ๊ทธ ์ด์ ๋ ํ์ผํ๋ ํ
ํ๋ฆฟ์ ์ ๊ณตํด์ฃผ๊ธฐ ๋๋ฌธ์
๋๋ค.
ViewController-Interactor-Presenter ํ์์ผ๋ก ๊ตฌ์ฑ๋ Clean Swift๋ ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ ์งค ๋ ์ด๋์ ์ฝ๋๋ฅผ ๋ฃ์ด์ผ ํ ์ง ๊ณ ๋ฏผํ๋ ์๊ฐ์ ์ค์ฌ์ฃผ๊ณ , ํจ๊ป ํ๋ ํ์๋ค์ด ๋ชจ๋ ๊ฐ์ ํํ๋ก ์ฝ๋๋ฅผ ์์ฑํ ์ ์๊ฒ ๋ง๋ค์ด ์ฝ๋๋ฅผ ์ดํดํ๋ ์๊ฐ ๋ํ ์ค์ฌ์ค๋๋ค.
์ฆ, ๊ฐ๋ฐ์์ ํจ์จ์ 2๋ฐฐ ์ด์ ๋ํ์ค๋๋ค.
[ Optimize Code For Human Consumption ]
์ฐ๋ฆฌ๊ฐ ์์ฑํ ์ฝ๋๋ฅผ ์ปดํ์ผํ๋ ์ผ์ ์ปดํจํฐ์๊ฒ ๊ต์ฅํ ์ฌ์ํ ์ผ์
๋๋ค.
ํ์ง๋ง, ๋ด๊ฐ ์์ฑํ ์ฝ๋๋ฅผ ๋ค๋ฅธ ์ฌ๋์ด ์ดํดํ๋ ์ผ์ ์ฌ์ํ์ง ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ฌ๋์ด ์ดํดํ ์ ์๋๋ก ์ฝ๋๋ฅผ ์ต์ ํํด์ผ ํฉ๋๋ค.
MVC ํจํด์ ViewController ํ๋์ ๋ชจ๋ ๋ด์ฉ๋ค์ ๋๋ ค ๋ฃ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์ฌ๋์ด ViewController ๋ด๋ถ์ ์๋ ์ฝ๋๋ฅผ ์ดํดํ๋๋ฐ ๋๋ ๋น์ฉ์ด ํฝ๋๋ค.
ํ์ง๋ง, Clean Swift๋ ๋ชฉ์ ์ ๋ง์ถฐ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ์ฝ๋๋ฅผ ์ดํดํ๋ ๋ฐ ๋๋ ์๊ฐ์ด ์ ์ต๋๋ค.
๊ฐ์ ๊ณ์ฐํ๋ ์ฝ๋์ธ์ง, UI์ ๊ด๋ จ๋ ์ฝ๋์ธ์ง์ ๋ฐ๋ผ ์์นํด์ผ ํ๋ ๋ถ๋ถ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ Clean Swift ๊ฐ๋
์ ์ดํดํ๊ณ ์๋ค๋ฉด ๋๊ตฌ๋ ์ฝ๊ฒ ์ฝ๋๋ฅผ ์ดํดํ ์ ์๊ณ , ์ด๋ ํ์ผ, ์ด๋ ๋ถ๋ถ์ ๋ณด๋ฉด ๋ ์ง๊ฐ ๋ช
ํํ๊ฒ ๊ทธ๋ ค์ง๊ฒ ๋ฉ๋๋ค.
์ ์๊ฐ Clean Swift์ ์ฅ์ ์ 48ํ์ด์ง ๋ด๋ด ์ฅํฉํ๊ฒ ๋์ด๋์ง๋ง, ๊ฐ๋จํ ์ ๋ฆฌํ๋ฉด:
Clean Swift๊ฐ ์ ๊ณตํ๋ boiler plate๋ง์ ์ฌ์ฉํด์ ๋๊ตฌ๋ ์์ฑํ๊ธฐ ์ฝ๊ณ , ์ดํดํ๊ธฐ ์ฝ๊ณ , ์ ์ง๋ณด์ํ๊ธฐ ์ข์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
ย Clean Architecture
Clean Swift๋ Clean Architecture์์ ์ ๋๋์๋ค๊ณ ์ ์๋ ๋งํฉ๋๋ค.
ํด๋ฆฐ ์ํคํ
์ฒ๋ App Level์ UseCase๋ฅผ ๋ ์์ ์ฝ๋ ์์ค์ UseCase๋ก ๋ถํดํ์ฌ ์ ์ ํ ๋ ์ด์ด๋ก ๋ถ๋ฆฌํฉ๋๋ค. ๊ทธ๋ก ์ธํด ๊ฐ ๋ ์ด์ด์ ๊ด์ฌ์ฌ๊ฐ ๋ถ๋ฆฌ(Separation of Concerns)๋ฉ๋๋ค.
์ฆ, ๊ฐ ์ฝ๋๊ฐ ๊ด์ฌ์ฌ์ ๋ง์ถ ๋ ์ด์ด์ ์์นํ๊ฒ ๋ฉ๋๋ค.
Clean Swift๋ ํด๋ฆฐ ์ํคํ
์ฒ์ ๋ ์ด์ด์ VIP Cycle๋ฅผ ์ถ๊ฐํฉ๋๋ค.
VIP Cycle์ Clean Swift์ ํต์ฌ ๊ฐ๋
์ผ๋ก ViewController - Interactor - Presenter๋ฅผ ์๋ฏธํฉ๋๋ค.
ํด๋น Cycle์ ViewController๋ก๋ถํฐ ์์๋ฉ๋๋ค.
ViewController์์ ๋ฐ์ํ ์ด๋ฒคํธ๊ฐ Interactor๋ฅผ ํธ์ถํ๊ณ , Interactor๋ Presenter๋ฅผ ํธ์ถํ๊ฒ ๋ฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก Presenter๊ฐ ViewController๋ฅผ ํธ์ถํ๋ฉด์ Cycle์ ๋๋๊ฒ ๋ฉ๋๋ค.
ViewController โ Interactor โ Presenter โ ViewController ์์๋ก ํ๋ฅด๊ธฐ ๋๋ฌธ์ ๋จ๋ฐฉํฅ์ผ๋ก ํ๋ฆ์ด ํ๋ฌ๊ฐ๊ฒ ๋ฉ๋๋ค.
ViewController โ Interactor โ Presenter โ ViewController๊ฐ ์๋ก๋ฅผ ํธ์ถํ ๋ ์ด๋ค ๋ฐฉ์์ผ๋ก ํธ์ถํ๊ฒ ๋๋๊ฐ?
Clean Swift๋ ๋ ์ด์ด์์ ๋ค์ ๋ ์ด์ด๋ก ๋์ด๊ฐ ๋, Clean Architecture์ ๋ง์ฐฌ๊ฐ์ง๋ก DIP(Dependency Inversion Principle)๋ฅผ ์ ์ฉํด์ Protocol method๋ฅผ ํธ์ถํ๋๋ก ๊ตฌํํฉ๋๋ค.
Interactor๋ BusinessLogin Protocol๋ฅผ, Presenter๋ PresentationLogic Protocol๋ฅผ, ViewController๋ DisplayLogic Protocol๋ฅผ conformํ๊ฒ ๋๊ณ , ์ด์ ํด๋์ค์ ๋ค์ ์์์ ํด๋์ค๋ฅผ ํธ์ถํ ๋ ํด๋์ค๊ฐ conformํ๊ณ ์๋ Protocol ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค.
๊ทธ๋์ผ ์ถํ์ ๋ค๋ฅธ ํด๋์ค๋ก ๋ณ๊ฒฝ์ด ๋ฐ์ํด๋ protocol๋ฅผ ๋ฐ๋ผ๋ณด๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ณ๊ฒฝ ๋ฒ์๊ฐ ์ ์ด์ง๊ฒ ๋ฉ๋๋ค.
ย VIP Cycle
VIP Cycle๊ณผ Clean Architecture๋ฅผ ํฉ์น๋ฉด ์ด๋ฌํ ์์ด ๋์ค๊ฒ ๋ฉ๋๋ค.
โข ViewController
Clean Swift์์ ViewController๋ ๋๊ฐ์ง ์ญํ ์ ํฉ๋๋ค.
โข
View : Cycle์ ๊ฒฐ๊ณผ๋ฌผ์ ํ๋ฉด์ ๋์์ ์ ์ ์๊ฒ ๋ณด์ฌ์ค
ViewController๋ DisplayLogic๋ฅผ conformํ๊ณ ์์ด Presenter๋ก๋ถํฐ input์ด ๋ค์ด์ค๋ฉด ์ด๋ฅผ ์คํํฉ๋๋ค.
โข
Controller : Interactor๋ฅผ ์๋ํ๊ฒ ๋ง๋ค์ด business logic๋ฅผ ์ํํ ์ ์๋๋ก ๋์
Controller๋ BusinessLogic Protocol method๋ฅผ ํธ์ถ์์ผ output๋ฅผ Interactor๋ก ์ ๋ฌํฉ๋๋ค.
์ ๋ฌ๋ output์ business logic protocol๋ฅผ conformํ๋ ๋ถ๋ถ์ผ๋ก ๋์ด ๊ฐ๊ธฐ ๋๋ฌธ์ ๋๊ฐ, ์ด๋ป๊ฒ ๊ฐ์ ์ฒ๋ฆฌํ๋์ง๋ ViewController๊ฐ ๊ด์ฌ๊ฐ์ง์ง ์์๋ ๋ฉ๋๋ค.
โข Interactor
Interactor๋ ๋น์ฆ๋์ค ๋ก์ง์ ์ํํ๋ ์ญํ ์ ํฉ๋๋ค.
๋น์ฆ๋์ค ๋ก์ง์ ์ํํ ๋, Worker๋ฅผ ๋๊ณ ๋ณต์กํ ๋ก์ง์ ๋์ ์ํํ๋๋ก ๋ง๋ค ์๋ ์์ต๋๋ค.
๋ค์ํ Interactor์์ ๋น์ผ๋น์ฌํ๊ฒ ์ฌ์ฉ๋๋ ๋น์ฆ๋์ค ๋ก์ง์ ๊ฒฝ์ฐ ํ๋์ Worker๊ฐ ๋ด๋นํ๋๋ก ํ์ฌ ์ค๋ณต ์ฝ๋๋ฅผ ์ค์ผ ์๋ ์์ต๋๋ค.
๋ํ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๋ก์ง์ Worker๋ก ๋ถ๋ฆฌํ์ ๊ฒฝ์ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์กด ๋ก์ง์ด Worker๋ก ํ์ ๋์ด ์ํฅ ๋ฒ์๊ฐ ์ค์ด๋ค๊ฒ ๋๋ ์ด์ ์ด ์์ต๋๋ค.
โข Presenter
ํ๋ฉด์ ๋ณด์ฌ์ค ํํ๋ก ๊ฐ๊ณตํ๋ ์ญํ ์ ํฉ๋๋ค.
ย Next Step
Clean Swift๋ฅผ ์กฐ๊ธ ๋ ์๋ฟ๊ฒ ์ดํดํ๊ธฐ ์ํด์ Clean Swift๋ฅผ ์ ์ฉํ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด๋ณด๋ ค๊ณ ํฉ๋๋ค.
์ด์ ์ MVVM, MVP ํจํด ๊ณต๋ถ์ ์ฌ์ฉํ๋ ImageExample_Pattern ํ๋ก์ ํธ์ Clean Swift๋ฅผ ์ ์ฉํด๋ณผ ์์ ์
๋๋ค.
๋ด์ฉ์ด ๋ฐฉ๋ํ์ฌ ๋ค์ ๊ฒ์๋ฌผ์์ ์ด์ด์ ์งํํด๋ณด๊ฒ ์ต๋๋ค.