์๋ ํ์ธ์ ์ ์ธ์ ๋๋ค :)
์ ์ฐํ ์ค๊ณ์ ๊ด์ฌ์ด ๋ง์์ง๋ฉด์ ํด๋ฆฐ ์ํคํ ์ฒ์ ๋ํด ์ซ์ซ๋ฐ๋ฆฌ๋ก ๊ณต๋ถ๋ ํ๊ณ ์์์ง๋ง, ๋จธ๋ฆฟ์์ ํ์คํ๊ฒ ๊ฐ๋ ์ด ์กํ์์ง ์์ ์ํ์๋๋ฐ.. ์ด์ ๋ ํ๋ก์ ํธ์ ์ ์ฉ๊น์ง ํด๋ณด๊ณ ์ถ์ด์ ํด๋ฆฐ ์ํคํ ์ฒ์ ๋ํด ์ ๋ฆฌ๋ฅผ ํด๋ณด๋ ค๊ณ ํฉ๋๋ค!
์ด๋ฒ ๊ฒ์๊ธ์์๋ Robert C. Martin์ The Clean Architecture ๋ผ๋ ๊ธ์ ๋ฒ์ญํด๋ณด๋ฉด์ ํด๋ฆฐ ์ํคํ ์ฒ ๊ฐ๋ ์ ๋ํ ์ ๋ฆฌ๋ฅผ ํด๋ณด๊ฒ ์ต๋๋ค.
Clean Architecture๋?
ํด๋ฆฐ ์ํคํ ์ฒ๋ Robert C. Martin(aka ์ํด๋ฐฅ, ๋ฐฅ์์ ์จ)์ ์ํด ๊ณ ์๋ ์ํํธ์จ์ด ์ํคํ ์ฒ ํจํด์ ๋๋ค.
๋ฐฅ์์ ์จ๊ฐ ํด๋ฆฐ ์ํคํ ์ฒ๋ฅผ ๋์ฒด ์ ๋ง๋ค๊ฒ ๋์๋.. ํ๋ฉด! ๊ธฐ์กด์ ์ฌ๋ฌ ์ํคํ ์ฒ์์ ์ ์ฌ์ฑ์ ์ฐพ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ธฐ์กด์ ์ํคํ ์ฒ๋ค์ ์ธ๋ถ์ ์ธ ์ฌํญ์ ๋ค๋ฅด์ง๋ง ๋ชจ๋ ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ(separation of concerns)๋ผ๋ ๋์ผํ ๋ชฉํ๋ฅผ ๊ฐ์ง๊ณ ์์์ต๋๋ค.
์ด๋ค์ ๋ชจ๋ ์ํํธ์จ์ด๋ฅผ ๊ณ์ธต(layer)๋ก ๋๋์ด ๋ถ๋ฆฌ๋ฅผ ๋ฌ์ฑํ๊ณ ์์๋๋ฐ, ๊ฐ ์ํคํ ์ฒ๋ ๋น์ฆ๋์ค ๋ก์ง์ ์ํ ๊ณ์ธต๊ณผ ์ธํฐํ์ด์ค๋ฅผ ์ํ ๊ณ์ธต์ ์ ์ด๋ ํ๋์ฉ ๊ฐ์ง๊ณ ์์์ต๋๋ค.
์ด๋ฌํ ์ํคํ ์ฒ๋ค์ ๋ค์์ ํน์ง์ ๊ฐ์ง ์์คํ ์ ์์ฑํฉ๋๋ค.
1. Independent of Frameworks. ํ๋ ์์ํฌ์ ๋ ๋ฆฝ์
์ํคํ ์ฒ๋ ๊ธฐ๋ฅ์ด ํฌํจ๋ ์ํํธ์จ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์กด์ฌ ์ฌ๋ถ์ ์์กดํ์ง ์๊ณ , ํ๋ ์์ํฌ๋ฅผ ๋๊ตฌ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
2. Testable. ํ ์คํธ ๊ฐ๋ฅ
๋น์ค๋์ค ๋ก์ง์ UI, ๋ฐ์ดํฐ๋ฒ ์ด์ค, ์น ์๋ฒ ๋๋ ๊ธฐํ ์ธ๋ถ ์์ ์์ด ํ ์คํธํ ์ ์์ต๋๋ค.
3. Independent of UI. ๋ ๋ฆฝ์ ์ธ UI
์์คํ ์ ๋๋จธ์ง ๋ถ๋ถ์ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ UI๋ฅผ ์ฝ๊ฒ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
ex. ๋น์ฆ๋์ค ๋ก์ง์ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ์น UI๋ฅผ ์ฝ์ UI๋ก ๊ต์ฒด ๊ฐ๋ฅ
4. Independent of Database. ๋ ๋ฆฝ์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค
๋น์ฆ๋์ค ๋ก์ง์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ธ๋ฉ๋์ง ์์ต๋๋ค.
5. Independent of any external agency. - ์ธ๋ถ ์ธ๊ณ๋ก๋ถํฐ ๋ ๋ฆฝ์
๋น์ฆ๋์ค ๋ก์ง์ ์ธ๋ถ ์ธ๊ณ์ ๋ํด ์ ํ ์์ง ๋ชปํฉ๋๋ค.
์ด๋ฌํ ์ํคํ ์ฒ๋ค์ ๋จ์ผ ๊ฐ๋ ์ผ๋ก ํตํฉํ๊ณ ์ ๊ณ ์๋ ์ํคํ ์ฒ๊ฐ ๋ฐ๋ก Clean Architecture์ ๋๋ค.
The Dependency Rule
๋งํด์ ์ํํธ์จ์ด๋ฅผ ์ด 4๊ฐ์ ๋ ์ด์ด๋ก ๋๋ด์ต๋๋ค.
์ด ์ํคํ ์ฒ๋ฅผ ์๋์ํค๋ ๊ฐ์ฅ ์ฐ์ ์ ์ธ ๊ท์น์ ์ข ์์ฑ ๊ท์น(Dependency Rule)์ ๋๋ค.
์ข ์์ฑ ๊ท์น์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. ์์ค์ฝ๋ ์ข ์์ฑ์ ์์ชฝ์ผ๋ก๋ง ๊ฐ๋ฆฌํฌ ์ ์๋ค. (๊ทธ๋ฆผ์์๋ ํ์ดํ๊ฐ ์์ชฝ์ผ๋ก๋ง ํฅํจ)
2. ๋ด๋ถ์ ์ด๋ค ๊ฒ๋ ์ธ๋ถ์ ์ ์์ ์๋ ๊ฒ์ ๋ํด์๋ ์ ํ ์ ์ ์๋ค.
3. ์ธ๋ถ์ ์ ์์ ์๋ ์ด๋ค ๊ฒ๋ ๋ด๋ถ์ ์ ์์ ์ฝ๋์์ ์ธ๊ธ๋์ด์๋ ์๋๋ค. (ํจ์, ํด๋์ค, ๋ณ์ ๋ฑ)
์ข ์์ฑ ๊ท์น์ ํต์ฌ์ ์์ชฝ ์์ ๋ฐ๊นฅ์ชฝ ์์ ๋ํด ์๋ฌด๊ฒ๋ ๋ชฐ๋ผ์ผ ํ๋ค๋ ๊ฒ! ์ ๋๋ค.
์ฆ, ๋ด๋ถ ๋ ์ด์ด๋ ์ธ๋ถ ๋ ์ด์ด์ ์์กด์ฑ(dependency)๋ฅผ ๊ฐ์ง๋ฉด ์๋ฉ๋๋ค.
๊ฐ ๋ ์ด์ด์ ๋ํด ์์ชฝ ์๋ถํฐ ํ๋์ฉ ์ดํด๋ด ์๋ค.
Entities
์ ์ฒด์ ๋น์ฆ๋์ค ๊ท์น๋ค์ ์บก์ํํฉ๋๋ค. ์ํฐํฐ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง ๊ฐ์ฒด์ผ ์๋ ์๊ณ , ๋ฐ์ดํฐ ๊ตฌ์กฐ ๋ฐ ํจ์์ ์งํฉ์ผ ์๋ ์์ต๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ ๋น์ฆ๋์ค ๊ฐ์ฒด๋ค(business objects)๋ก, ๊ฐ์ฅ ์ผ๋ฐ์ ์ด๊ณ ๋์ ์์ค์ ๊ท์น๋ค์ ์บก์ํํฉ๋๋ค.
ํด๋น ๊ณ์ธต์ ๊ฐ์ฅ ๋ ๋ณ๊ฒฝ๋๋ฉฐ, ์ธ๋ถ์ ๋ณ๊ฒฝ์๋ ์ํฅ ๋ฐ์ง ์๋ ๋ ์ด์ด์ ๋๋ค.
๋ฒ์ญ์ ํ๋ ์ค๋ช ์ด ์ด๋ ต๊ฒ ๋์ด์๋ ๊ฒ ๊ฐ์๋ฐ, ํ๋ง๋๋ก ์ํฐํฐ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ ๋ฐ ํจ์์ ์งํฉ์ ๋๋ค.
๋ทฐ๋ ๋น์ฆ๋์ค ๋ก์ง์ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ(๋น์ฆ๋์ค ๋ชจ๋ธ)๋ผ๊ณ ๋ ํ ์ ์์ ๊ฒ ๊ฐ์๋ฐ์,
์ธ๋ถ ๋ก์ง์ ๋ณ๊ฒฝ์๋ ๋ฐ์ดํฐ ์์ฒด๋ ๊ฑฐ์ ๋ณํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ด๊ณ ๋์ ์์ค์ ๊ท์น์ด๋ผ๊ณ ๋งํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
Use Cases
ํด๋น ๊ณ์ธต์์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ๋น์ฆ๋์ค ๊ท์น์ ํฌํจํฉ๋๋ค.
์ํฐํฐ์์ ๋ฐ์ดํฐ ํ๋ฆ์ ์กฐ์ ํ๊ณ , ํด๋น ์ํฐํฐ๊ฐ Use Case์ ๋ชฉํ๋ฅผ ๋ฌ์ฑํ๋๋ก ์ง์ํ๋ ์ญํ ์ ํฉ๋๋ค.
Use Case์ ๋ณํ๋ ์์ชฝ ์์ธ Enitity์ ์ํฅ์ ๋ฏธ์น์ง ์์ผ๋ฉฐ, Use Case ๋ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค, UI ํน์ ํ๋ ์์ํฌ์ ๊ฐ์ ์ธ๋ถ์ ๋ณํ์ ์ํฅ๋ฐ์ง ์์ต๋๋ค. (์ข ์์ฑ ๊ท์น)
ํ์ง๋ง, ์ฑ ์ ์ฒด์ ๋์์ ๋ํ ๋ณ๊ฒฝ์ Use Case์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. (์ธ๋ถ ๋ ์ด์ด๊ฐ ์๋๋ผ ์ฌ์ฉ์ ์๋๋ฆฌ์ค ๋ณ๊ฒฝ์ด๋๊น..์ด๋ฐ ๋ป์ธ ๊ฒ ๊ฐ์ต๋๋ค...)
Use Case๋ ๋น์ฆ๋์ค ๋ก์ง์ด ์์นํ๋ ๊ณณ์ผ๋ก, ์ํฐํฐ๋ก ๋ค์ด์ค๊ณ ๋๊ฐ๋ ๋ฐ์ดํฐ ํ๋ฆ์ ์กฐ์ ํ๋ ์ญํ ์ ํฉ๋๋ค.
์ฌ์ค MVVM ๊ตฌ์กฐ์์ Use Case๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒ์ด ์ ์ผ ๊ณ ๋ฏผ๋๋ ๋ถ๋ถ์ด๋ผ๊ณ ์๊ฐํ๋๋ฐ์,, ๋จ์ํ ๋ทฐ์ ๋ทฐ๋ชจ๋ธ์ ๋ค๋ฆฌ ์ญํ ์ ํ๋ ๊ฒ์ธ์ง...์ด ๋ถ๋ถ์ ์ ์ฉํด๋ณด๋ฉด์ ๋ ๊ณ ๋ฏผํด๋ด์ผ๊ฒ ์ต๋๋ค! (MVVM+Clean Architecture ๊ด๋ จ ๊ฒ์๊ธ๋ก ๋ด์ฉ ์ ๋ฆฌํด๋ณด๋๋ก ํ ๊ฒ์)
Interface Adapters
Controllers, Gateways, Presenters๋ฅผ ํฌํจํ๋ ๋ ์ด์ด๋ก, Presentation Layer ๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํฉ๋๋ค.
๋ฐ์ดํฐ๋ฅผ Use Case ๋ฐ Enitity์ ๊ฐ์ฅ ํธ๋ฆฌํ ํฌ๋งท์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์น๊ณผ ๊ฐ์ ์ธ๋ถ์์ ํธ๋ฆฌํ ํฌ๋งท์ผ๋ก ๋ณํํด์ฃผ๋ ์ญํ ์ ํ๋ ๊ณ์ธต์ ๋๋ค. ์์ชฝ ์์ ์ฝ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํด ๋ชฐ๋ผ์ผ ํ๋๋ฐ, ํด๋น ๋ ์ด์ด์์ ์๋ง์ ํ์์ผ๋ก ๋งคํํด์ค ์ ์์ต๋๋ค.
Frameworks and Drivers
๊ฐ์ฅ ๋ฐ๊นฅ์ชฝ ๋ ์ด์ด๋ก, DB, UI, ํ๋ ์์ํฌ ๋ฑ๊ณผ ๊ฐ์ ๋๊ตฌ์ ํ๋ ์์ํฌ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
Only Four Circles?
์ฌ๊ธฐ๊น์ง 4๊ฐ์ ๋ ์ด์ด์ ๋ํด ์ ๋ฆฌํด๋ณด์๋๋ฐ, ๊ณ์ธต์ ๊ผญ 4๊ฐ๋ก๋ง ๊ตฌ์ฑ๋์ด์ผ ํ๋์?
์ ๋ต์ ๋น์ฐํ ์๋๋๋ค! ๋ ์ด์ด๊ฐ ๋ช๊ฐ๋ก ๊ตฌ์ฑ๋๋ dependency rule ๋ง ์ ์ฉ๋๋ฉด ๋ฉ๋๋ค.
์ฆ, ์์ค ์ฝ๋ ์์กด์ฑ์ด ์์ชฝ์ผ๋ก๋ง ํฅํ๋ฉด ๋๋ค๋ ๋ป์ด๊ฒ ์ฃ ??
๊ธฐ์ตํด์ผ ํ ๊ฒ์ ์์ชฝ์ผ๋ก ๊ฐ ์๋ก ์ถ์ํ ์์ค์ด ์ฆ๊ฐํ๋ค๋ ๊ฒ์ ๋๋ค.
์์ชฝ์ผ๋ก ๊ฐ์๋ก ์ถ์์ ์ด๊ณ ์ผ๋ฐ์ ์ธ ๊ณ ์์ค์ ์ ์ฑ ์ด ์์นํ๊ณ , ๋ฐ๊นฅ์ผ๋ก ๊ฐ์๋ก ์ ์์ค์ ๊ตฌ์ฒด์ ์ธ ์ธ๋ถ์ฌํญ์ด ์กด์ฌํฉ๋๋ค.
Crossing boundaries
์์ ๊ฒฝ๊ณ๋ฅผ ๋๋๋๋ ๋ฐฉ๋ฒ์ ๋ํ ์์๊ฐ ๋ค์ด์ด๊ทธ๋จ ์ฐ์ธก ํ๋จ์ ํฌํจ๋์ด์์ต๋๋ค.
์ ์ ๋ฐ๋ผ๊ฐ๋ณด๋ฉด Controller -> Use Case -> Presenter ์ ํ๋ก์ฐ๋ก ์คํ๋๊ณ ์๋๋ฐ์,
Use Case๊ฐ ๋ ์์ชฝ ์์ธ๋ฐ Use Case์์ Presenter๋ก ์คํ๋๋ ํ๋ก์ฐ๊ฐ ๊ฐ๋ฅํ ๊น์?
Dependency Rule์ ์๋ฐฐ๋๋ ๊ฒ ์๋๊ฐ,, ํ ์ ์๋๋ฐ!
DIP(์์กด ๊ด๊ณ ์ญ์ ๋ฒ์น)์ผ๋ก ์์ชฝ์์ ๋ฐ๊นฅ์ชฝ์ผ๋ก ๊ฐ์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๊ฒ ํ ์ ์์ต๋๋ค!
Use Case๊ฐ ์์ชฝ ์์ ์๋ ์ธํฐํ์ด์ค(= Use Case Output Port)๋ฅผ ํธ์ถํ๋๋ก ํ๊ณ ๋ฐ๊นฅ์ชฝ ์์์๋ Presenter์๊ฒ ์ด๋ฅผ ๊ตฌํํ๋๋ก ํ๋ ๋ฐฉ์์ ํตํด ์ํ๋ ํ๋ก์ฐ๋ก ์คํ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฐ๊นฅ์ชฝ ๋ ์ด์ด์ธ Presenter์ ๋ํด ๋ชฐ๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ ๊ทผ์ด ๊ฐ๋ฅํ ๊ฒ์ ๋๋ค. (iOS์์๋ ํ๋กํ ์ฝ๋ก ๊ตฌํ ๊ฐ๋ฅ)
Clean Architecture์ ์ฅ์
์ํํธ์จ์ด๋ฅผ ์ฌ๋ฌ ์ธต์ผ๋ก ๋ถ๋ฆฌํ๊ณ ์ข ์์ฑ ๊ท์น(dependency rule)์ ์ค์ํจ์ผ๋ก์จ, ์ญํ ๋ถ๋ฆฌ๊ฐ ๋ช ํํ ์ฝ๋๋ก ์์คํ ์ ์ค๊ณํ ์ ์์ต๋๋ค. ์ญํ ๋ถ๋ฆฌ๊ฐ ๋ช ํํ ์ฝ๋๋ ํ ์คํธ๊ฐ ํธ๋ฆฌํ๊ณ ํ์ฅ๊ณผ ์์ ์ ์ ์ฐํ๊ธฐ ๋๋ฌธ์ ์ ์ฒด์ ์ผ๋ก ์ ์ฐํ ์ค๊ณ๊ฐ ๋ ๊ฒ ๊ฐ๋ค์!
๋ฐฅ์์ ์จ์ ๋ธ๋ก๊ทธ ๊ธ์ ๋ฒ์ญํ๋ฉด์ ํด๋ฆฐ ์ํคํ ์ฒ์ ๊ฐ๋ ๊ณผ ๊ฐ ๋ ์ด์ด์ ๋ํด ์ ๋ฆฌํด๋ณด์๋๋ฐ์,
๋ค์ ๊ฒ์๊ธ์์๋ ์์ ์ฝ๋ ๋ถ์์ ํตํด์ ๊ตฌ์ฒด์ ์ธ ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉฐ ์ดํดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค!
'๐ iOS > Architecture' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS/Architecture] UseCase ํ์ฉ๊ธฐ (0) | 2024.08.28 |
---|---|
[Architecture] VIPER ํจํด (1) | 2022.04.15 |
[Architecture] MVC, MVP, MVVM ์ํคํ ์ฒ ํจํด (2) | 2022.03.25 |