- Published on
๐ Swift - MVVM, Clean Architecture.02
- Authors
- Name
- ์ด์ฐฝ์ค
์ด๋ฒ ํฌ์คํธ์์๋ ์ ํ๋ก์ ํธ๋ฅผ ์์๋ก iOS ํ๋ก์ ํธ์ MVVM+Clean Architecture ๊ตฌ์กฐ๋ฅผ ์ ์ฉํด๋ณด๊ฒ ์ต๋๋ค!
์ ๋ฒ ํฌ์คํ ์ ์์ฑํ๊ณ ๋ ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ๋ค์ด ๋ง์์ ๊ณ์ํด์ ์ ๋ณด๋ค์ ์ฐพ์๋ดค์ต๋๋ค. ๊ทธ๋ฌ๋ค๊ฐ ์์ฃผ ์ข์ ํฌ์คํธ๋ฅผ ๋ฐ๊ฒฌํ๋๋ฐ, ์ค๋์ ํด๋น ํฌ์คํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ด์ฉ์ ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค. ์ ํฌ์คํธ๋ฅผ ๋ณด์๋ ๋ถ๋ค๋ ์๋ ํฌ์คํธ๋ฅผ ์์ธํ ์ฝ์ด๋ณด๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค ๐
Clean Architecture and MVVM on iOS
MVVM + Clean Architecture
ํด๋น ๊ฒ์๋ฌผ์ ๋ณด๋ฉด ์์ ๊ฐ์ด ํฌ๊ฒ ์ธ ๊ฐ์ง ๋ ์ด์ด๋ก ๊ตฌ์ฑ์ ๋๋์์ต๋๋ค. ์ด๋ฐ ์๋ฌธ์ ์ด ๋ค ์ ์์ต๋๋ค. ์ ๋ฒ ํฌ์คํธ์์๋ 4๊ฐ์ง๋ก ๋๋์๋๋ฐ Clean Architecture ๊ตฌ์กฐ๊ฐ ์๋๊ฑฐ ์๋๊ฐ์?
Clean Architecture์ ํต์ฌ์ ์์กด์ฑ์ ์์ต๋๋ค. ์์ชฝ ๋ ์ด์ด๋ถํฐ ๋ฐ๊นฅ ๋ ์ด์ด๋ก์ ์์กด์ฑ ๋ฐฉํฅ์ด ์์ง๋ง ์์ผ๋ฉด ๋ ์ด์ด์ ๊ฐ์๋ ๊ตฌ์กฐ๋ ์๋ฌด ์๊ด์ด ์์ฃ . ๋ฐ๋ผ์ ์์ ๊ฐ์ ๊ตฌ์กฐ๋ ์๋ฌด ๋ฌธ์ ๊ฐ ์๋ ๊ฒ์ ๋๋ค!
์ ๊ฒ์๋ฌผ์ ๋ฐ๋ฅธ ๋ ์ด์ด์ ์ข ๋ฅ๋ ์๋๊ณผ ๊ฐ์ต๋๋ค.
- Presentation Layer
- Domain Layer
- Data Layer
Domain Layer
Domain Layer๋ ๊ฐ์ฅ ์์ชฝ์ ๋ ์ด์ด์ ๋๋ค. ๋ฐ๋ผ์ ์๋ฌด๋ฐ ์์กด์ฑ์ ๊ฐ์ง์ง ๋ง์์ผํ๊ณ , ๋ ๋ฆฝ๋์ด ์์ด์ผํฉ๋๋ค. ์ด๋ก์ ์ป์ ์ ์๋ ์ด์ ์ผ๋ก๋ ์๋ฌด๋ก ์ข ์์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ํ ์คํธํ๊ธฐ ๋งค์ฐ ๊ฐํธํ๋ค๋ ์ ์ ๋๋ค. ๋ค๋ฅธ ํ์ผ์ ์์ ์ด๋ ์ถ๊ฐ ์์ด ์ค์ง Domain Layer์๋ง ์ง์คํด๋ ๊ฒฐ๊ณผ๊ฐ ๋์ถ๋์ฃ .
Entities, Use Cases, Repository Interfaces๋ค์ด Domain Layer์ ์ํฉ๋๋ค.
Presentation Layer
Presentation Layer์๋ ๋ง ๊ทธ๋๋ก UI ์์๋ค์ด ์ํฉ๋๋ค. ๋ํ์ ์ผ๋ก View Model์ด ์ฌ๊ธฐ์ ์ํ์ฌ Use Cases์ ํจ์๋ค์ ํธ์ถํฉ๋๋ค.
Presentation Layer๋ ์ค์ง Domain Layer์๋ง ์ข ์๋์ด ์์ต๋๋ค.
Data Layer
Data Layer์๋ Repository์ Data Sources๋ค์ด ์ํฉ๋๋ค. ์ฌ๊ธฐ์ Repository๋ ์ธ๋ถ์ Data Sources๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ฌ ๋ ์ฌ์ฉ๋๊ณ , Data Sources๋ค์ ๋ก์ปฌ ๋ฐ์ดํฐ๋ค์ ์๋ฏธํฉ๋๋ค.
Data Layer ๋ํ ์ค์ง Domain Layer์๋ง ์ข ์๋์ด ์์ต๋๋ค.
โ๏ธ ์ ์ฉํ๊ธฐ
์ ํฌ์คํธ์ ์ ๊ฐ ๋ฐฐ์์จ๋๋ก ๊ทธ๋ฆผ์ ๊ทธ๋ ค๋ณด๋ฉด ์๋์ ๊ฐ์ด ๋์์ผํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ๊ตฌ์กฐ๊ฐ ์ด๋ ๊ฒ ๋๋ฉด Use Case๊ฐ Repository๋ฅผ ํธ์ถํ๋๋ฐ, ์ฐธ์กฐ ๊ด๊ณ๋ ๋ฐ๋๋ก ๋์ด ์๋ ์์ฃผ ์๋ชป๋ ํ์์ด ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค. ์์ชฝ ๋ ์ด์ด๊ฐ ๋ฐ๊นฅ ์ชฝ ๋ ์ด์ด๋ฅผ ์ฐธ์กฐํ๋ค๋, Clean Architecture์ ๊ท์น์ ๊นจ๋ถ์๊ณ ์๋ค์ ๐ซ
ํ์ง๋ง Use Case๋ ๊ผญ Repository์ Request๋ฅผ ํด์ผํฉ๋๋ค. ์ด๋ด ๋ ์ด๋ป๊ฒ ํด์ผํ ๊น์?
๋ฐ๋ก ์์ ๊ฐ์ด ์ค๊ฐ์ ํ ๋จ๊ณ๋ฅผ ๋ ๊ฑฐ์น๊ฒ ๋ง๋ค๋ฉด ๋ฉ๋๋ค. ์ ๋ ์ด์ด ์ค๋ช ์์ Domain Layer์ Repository Interface๊ฐ ํฌํจ๋์ด ์์์ฃ ? ์ด ์น๊ตฌ๊ฐ ๋ฐ๋ก ์ฌ๊ธฐ์ ์ฐ์ ๋๋ค.
Repository Interface๋ ํ๋กํ ์ฝ์ ํํ๋ก์ Use Case์ ๊ฐ์ ๋ ์ด์ด์ ์ํด์์ง๋ง, ์ค์ ๊ตฌํ์ Data ๋ ์ด์ด์ ์๊ฒ ๋ฉ๋๋ค.
๋ฐ์ดํฐ์ ํ๋ฆ์ ์ดํด๋ณด๊ณ ์ค์ ๊ตฌํ์ ๋ค์ด๊ฐ๋ณด๊ฒ ์ต๋๋ค.
- View๊ฐ View Model์ ํจ์๋ฅผ ์์ฒญํ๋ค.
- View Model์ด Use Case๋ฅผ ์คํํ๋ค.
- Use Case๊ฐ User์ Repository๋ก๋ถํฐ ์ป์ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋์ถํฉ๋๋ค.
- ์ด ๋, Repository๋ ๋คํธ์ํฌ(ex: API)์ Local DB(ex: Realm)๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ Use Case์ ์ ๊ณตํฉ๋๋ค.
- Use Case์์ ๋์ถ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฑฐ๊พธ๋ก View์ ์ ๊ณตํฉ๋๋ค.