ํด๋ฆฐ ์ํคํ ์ฒ๋
์ฌ๋ฌ ์ํคํ ์ฒ๋ฅผ ํ๋๋ก ํตํฉํ๋ ์๋์ด๋ฉฐ(ํฅ์ฌ๊ณ ๋ , BCE, DCI ๋ฑ), ์ํํธ์จ์ด๋ฅผ ๊ณ์ธต์ผ๋ก ๋๋์ด ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ ๋๋ค. ์ฌ๋ฌ ์ํคํ ์ฒ๋ค์ ๊ณตํต์ ๋ชฉํ์ด๊ธฐ๋ ํฉ๋๋ค.
ํด๋ฆฐ ์ํคํ ์ฒ๋ ํ๋ก์ ํธ ์ ์ฒด๊ฐ DB์ ์์กดํ๋ ๊ตฌ์กฐ๋ฅผ ํด๊ฒฐํ๊ณ ์, ์์กด์ฑ ์ญ์ ์ ํตํด ๋๋ฉ์ธ์ด ์ค์ฌ์ด ๋๋ ๋ฐฉ๋ฒ์ผ๋ก ์์กด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
๊ณตํต์ ํต์ฌ ๊ท์น
- ์ค์๋์ ๋ฐ๋ผ ๊ณ์ธต์ ๋๋๋๋ค.
- ์์กด์ฑ์ ๋ฐฉํฅ์ ์์ชฝ/๊ณ ์์ค์ ํฅํฉ๋๋ค. (๋คํ์ฑ์ ์ด์ฉํ์ฌ ์์กด์ฑ์ ์ด๋์๋ ์ญ์ ๊ฐ๋ฅ)
ํด๋ฆฐ ์ํคํ ์ฒ์ ํน์ง
- ํต์ฌ ๊ท์น์ ๋ด๊ณ ์๋ ๋๋ฉ์ธ์ด ์ค์ฌ์ด ๋๋ฏ๋ก, ๋น์ฆ๋์ค ๊ท์น์ ์ง์คํ ์ ์์ต๋๋ค.
- ๋๋ฉ์ธ์ด ์ธ๋ถ ์ฌํญ(์ ์ถ๋ ฅ ์ฅ์น, DB, ์๋ฒ, ํ๋ ์์ํฌ, ํต์ ํ๋กํ ์ฝ ๋ฑ)์ ์์กดํ์ง ์์ต๋๋ค.
- ํจํค์ง ๊ตฌ์กฐ๊ฐ ๊ณ์ธต๋ณด๋ค ๋ณต์กํฉ๋๋ค.
- ๊ฒฝ๊ณ๋ฅผ ๋๋ ทํ๊ฒ ๊ธ๊ธฐ ์ํด์๋ ํจํค์ง์ ํด๋์ค๊ฐ ๋ ํ์ํฉ๋๋ค.
- ์ต์ํ์ง ์์ ์ ์๊ณ ๋ ํผ๋ฐ์ค๊ฐ ์ ์ต๋๋ค.
๋ ์ด์ด
Domain Layer
๋๋ฉ์ธ ๊ณ์ธต์ ๋๋ฉ์ธ ์ง์๊ณผ ์๊ตฌ์ฌํญ์ ๋ฐ์ํ ๋น์ฆ๋์ค ๋ก์ง์ ๋ด๋นํ๋ ๊ณ์ธต์ ๋๋ค.
๋๋ฉ์ธ ๊ณ์ธต์ ๋ ์ด์ด์ ๊ฐ์ฅ ์์ชฝ์ ์์นํด ์์ผ๋ฉฐ, ๋ค๋ฅธ ๊ณ์ธต์ ๋ํ ์ข ์์ฑ ์์ด ์์ ํ ๊ฒฉ๋ฆฌ๋์ด ์์ต๋๋ค. ๋ํ ์ด ๊ณ์ธต์๋ ๋ค๋ฅธ ๊ณ์ธต์ ์ด๋ค ๊ฒ๋ ํฌํจํด์๋ ์๋ฉ๋๋ค.
- UseCase: ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น์ฆ๋์ค ๋ก์ง์ด ํฌํจ๋์ด ์์ต๋๋ค. ์ฌ์ฉ์ ๊ด์ ์ ์๋๋ฆฌ์ค์ด๋ฉฐ, ์์คํ ์ด ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ๋ฌ์ฌํฉ๋๋ค.
- Entity: ์ ํ๋ฆฌ์ผ์ด์ ์ ํต์ฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋๋ค. Model ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ธํด๋์ ์ ์ ๋ชจ๋ธ์ ๋๋ค.
- Repository Interfase: ์์กด์ฑ ์ญ์ ์ ์ํ ์ธํฐํ์ด์ค๋ฅผ ์๋ฏธํ๋ฉฐ, ์ธ๋ถ ๊ณ์ธต์ ์ง์ ํธ์ถํ๋ ๊ฒ์ด ์๋ Protocol ํ์ ์ ํ์ฉํ์ฌ ํธ์ถํฉ๋๋ค.
๋๋ฉ์ธ์ด๋โ
์ํํธ์จ์ด ์์คํ ์ ๊ฐ๋ฐํ๋ ๋์ ์์ญ์ผ๋ก, ์ฑ์ด ์ ๊ณตํ๋ ๊ธฐ๋ฅ๊ณผ ์๋น์ค์ ๋ฒ์๋ฅผ ์๋ฏธํฉ๋๋ค.
Presentation Layer
ํ๋ ์ ํ ์ด์ ๊ณ์ธต์ UI View๊ฐ ํฌํจ๋์ด ์๋ ๊ณ์ธต์ ๋๋ค. UI์ ๊ด๋ จ๋ ์ด๋ฒคํธ ํธ๋ค๋ง๊ณผ ๊ฐ์ ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํฉ๋๋ค.
- View: ์ฌ์ฉ์ ์ด๋ฒคํธ๋ฅผ ํตํด UI View์ ์ํ๋ฅผ ํ์ํฉ๋๋ค.
- Presenter: View์ ์ด๋ฒคํธ ์์ฒญ์ ๋ฐ์ UseCase๋ฅผ ์คํํ๊ณ , UseCase์์ ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ View๋ก ์ ๋ฌํฉ๋๋ค. MVVM์ ๊ฒฝ์ฐ์ ViewModel์ด ์ด์ ํด๋นํฉ๋๋ค.
Data Layer
๋ฐ์ดํฐ ๊ณ์ธต์ ์ ์ฅ์ ๊ตฌํ๊ณผ ํ๋ ์ด์์ ๋ฐ์ดํฐ ์์ค๊ฐ ํฌํจ๋์ด ์๋ ๊ณ์ธต์ ๋๋ค. ํต์ ๋ฐ ๋ฐ์ดํฐ ๊ด๋ฆฌ ๋ก์ง์ ๋ด๋นํฉ๋๋ค.
- Repository Implement: ์ ์ค์ผ์ด์ค๊ฐ ํ์๋ก ํ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ํด๋์ค์ ๋๋ค.
- Data Source: ์ค์ ๋ฐ์ดํฐ์ ์ ์ถ๋ ฅ์ ์คํํฉ๋๋ค. API๋ฅผ ํตํ JSON ๋ฐ์ดํฐ๋ DB๋ฅผ ์๋ฏธํฉ๋๋ค.
๋ฐ์ดํฐ ํ๋ฆ
- View๋ ViewModel์์ ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค.
- ViewModel์ด Use Case๋ฅผ ์คํํฉ๋๋ค.
- Use Case๋ User์ Repository์ ๋ฐ์ดํฐ๋ฅผ ๊ฒฐํฉํฉ๋๋ค.
- ๊ฐ Repository๋ ๋คํธ์ํฌ, ๋ฐ์ดํฐ๋ฒ ์ด์ค, ๋ฉ๋ชจ๋ฆฌ ๋ด ๋ฐ์ดํฐ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
- ๋ณํ๋ ๋ฐ์ดํฐ๋ View(UI)๋ก ๋ค์ ํ๋ฆ ๋๋ค.
์์กด์ฑ ๋ฐฉํฅ
Presentation Layer -> Domain Layer <- Data Layer
- Presentation Layer (MVVM) = ViewModels(Presenters) + Views(UI)
- Domain Layer = Entities + Use Cases + Repositories Interfaces
- Data Repositories Layer = Repositories Implementations + API(Network) + Persistence DB
ํด๋ฆฐ ์ํคํ ์ฒ ๋์ ํ๊ธฐ
๊ฐ์ธ ํ๋ก์ ํธ์ ํด๋ฆฐ ์ํคํ ์ฒ๋ฅผ ๋์ ํ๋ฉด์
ํ๋ก์ ํธ ์๊ฐ๊ฐ์ธ ํ๋ก์ ํธ๋ ๊ฐ๋จํ๊ณ ์์ ๊ท๋ชจ์ ์ฑ์ผ๋ก, Firebase Firestore์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ๋ณด์ฌ์ฃผ๋ ์ฑ์ ๋๋ค. ํด๋ฆฐ ์ํคํ ์ฒ๋ฅผ ๋์ ํ ์ด์ ์ฒ์์๋ ์ํคํ ์ฒ์ ๋ํ ์ง์ ์์ด ๋ฐ์ดํฐ
kiuun.tistory.com
์ฐธ๊ณ
https://tech.olx.com/clean-architecture-and-mvvm-on-ios-c9d167d9f5b3
https://blog.coderifleman.com/2017/12/18/the-clean-architecture/
https://qiita.com/koutalou/items/07a4f9cf51a2d13e4cdc#ไปใฎarchitectureใจใฎๆฏ่ผ