Clean Architecture
์ํํธ์จ์ด ์์คํ ์ ํน์ ๋ชฉ์ ๊ณผ ์ฑ ์์ ๊ฐ์ง ๊ณ์ธต์ผ๋ก ๋ถ๋ฆฌํ๋ ๋์์ธ ์ ๊ทผ๋ฐฉ์
ํด๋ฆฐ ์ํคํ ์ฒ์ ์ฃผ์ ๋ชฉํ๋ ๊ฐ ๊ณ์ธต์ ๋ ๋ฆฝ์ ์ผ๋ก ๊ฐ๋ฐ, ํ ์คํธ ๋ฐ ๋ฐฐํฌํ ์ ์๋๋กํ์ฌ ์ ์ฐํ๊ณ ์ ์ง ๋ณด์๊ฐ ์ฉ์ดํ ์์คํ ์ ๋ง๋๋ ๊ฒ์ด๋ค.
์ผ์ชฝ์ ๊ทธ๋ํ๋ฅผ ๋ณด๋ฉด ์ฌ๋ฌ๊ฐ์ ๋ ์ด์ด๋ค์ด ์กด์ฌํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด ๊ทธ๋ํ์์ ํต์ฌ์ ์์ชฝ ๋ ์ด์ด๋ค์ ๋ฐ๊นฅ ๋ ์ด์ด์ ์๋ ๊ฒ๋ค์ ๋ชฐ๋ผ์ผ ํ๋ค. ์ฆ ์์ชฝ ๋ ์ด์ด์์ ๋ฐ๊นฅ ์ชฝ์ ์์กดํ์ง ๋ง์์ผํ๋ค.
๋ ๊ฒ์ด๋ค.
๋ค์๋งํ๋ฉด, ๋ฐ๊นฅ์ชฝ ๋ ์ด์ด์ ๊ฐ์ฒด๋ฅผ ๋ด๋ถ์์ ์์ฑํ๋ฉด ์๋๋ค๋ ๋ง์ด๋ค.
๊ทธ๋์ Dependency Rule ํ์ดํ๊ฐ ์์ชฝ์ ํฅํ๊ณ ์๋ค.
์์ชฝ ๋ ์ด์ด์ ์์กดํด์ผ ํ๋ค๋ ์๋ฏธ๋ค.
Layers
์ด๋ ๊ฒ ๋ ์ด์ด๋ฅผ ๋๋ด๋๋ฐ, ์ฌ๊ธฐ์ ๊ทธ๋ฃน์ ์ง์ ์ ์๋ค.
Domain ๋ ์ด์ด, Presentation ๋ ์ด์ด, ๊ทธ๋ฆฌ๊ณ Data ๋ ์ด์ด๊ฐ ์๋ค.
Domain Layer(Business Logic)
๊ทธ๋ํ์ ๊ฐ์ฅ ์์ชฝ์ ์์นํ ๋ถ๋ถ์ด๋ค.
๊ฐ์ฅ ์์ชฝ์ ์์ผ๋ฏ๋ก ์์ ํ ๊ณ ๋ฆฝ๋์ด ์์ผ๋ฉฐ, ๋ฐ๊นฅ์ ์ ๋ณด๋ค์ ์๋ฌด ๊ฒ๋ ์ ์ ์๋ค.
Entity(Business Model), Use Case, Repository Interface๋ฅผ ํฌํจํ๋ค.
์ด ๋ ์ด์ด๋ ๋ค๋ฅธ ํ๋ก์ ํธ์์๋ ์ฌ์ฌ์ฉ ๋ ์ ์๋ค.
์ด๋ ๊ฒ ๋ ์ด์ด๊ฐ ๋ถ๋ฆฌ๋๋ฉด ๋ค๋ฅธ ์์กด์ฑ์ด๋ ์๋ํํฐ๊ฐ ํ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ํ ์คํธ๋ฅผ ์ฝ๊ฒ ํ ์ ์๋ค.
Domain Layer์ ํต์ฌ์ ๋ค๋ฅธ ๋ ์ด์ด(Presentation์ UI๋ Data์ Mapping Codable)์ ์ด๋ค ๊ฒ๋ ํฌํจ์ํค๋ฉด ์๋๋ค.
Presentation Layer
UI(UIViewController / SwiftUI View)๋ฅผ ํฌํจํ๋ค.
๊ฐ View๋ ํ๋ ์ด์์ UseCase๋ฅผ ์คํ์ํค๋ ViewModel(Presenters)์ ๋์๋๋ค.
์ฆ ํ view์ ๋์๋๋ ํ๋์ viewModel์ด ์๋ค.
์์ ๊ณผ๋ ๋ชจ์ ๊ทธ๋ํ์์๋ ๋ดค๋ฏ์ด, ๋๋ฉ์ธ ๋ ์ด์ด์๋ง ์์กดํ๊ณ ์๋ค.
Data Layer
Repository Implementation, ๊ทธ๋ฆฌ๊ณ ํ๋ ์ด์์ Data Source๋ฅผ ํฌํจํ๋ค.
Data Source๋ ์๊ฒฉ์ด๊ฑฐ๋ ๋ก์ปฌ์ผ ์ ์๋ค.
์๊ฒฉ์ผ ๊ฒฝ์ฐ API ํธ์ถ์ ํตํด JSON ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ค๋ฐ๋ ๊ฒฝ์ฐ์ด๊ณ , ๋ก์ปฌ์ผ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ผ ๊ฒ์ด๋ค.
Data Layer๋ ์ค๋ก์ง Domain Layer์๋ง ์์กดํ๊ณ ์๋ค.
๊ณผ๋ ๋ชจ์์ ๊ทธ๋ํ์์๋ ์์ชฝ์ Presenters, ๋ฐ๊นฅ์ DB, API, UI ๋ฑ์ด ์์๋๋ฐ Presenters๋ Presentation Layer์ ๋์๋๊ณ Data Layer์ ๋์๋๋ ๊ฒ์ ์๋๋ค.
Data Layer์๋ ๋คํธ์ํฌ๋ก ๋ฐ์ JSON ๋ฐ์ดํฐ๋ฅผ Domain Model๋ก ๋งคํํ๋ ๊ฒ์ ํฌํจ์ํฌ ์ ์๋ค.
Data Flow
์ ๊ทธ๋ฆผ์์๋ ์์กด์ฑ ๋ฐฉํฅ์ด Domain Layer๋ก ํฅํ๊ณ ์๋ค.
ํนํ Repository Interface(protocol)์์ ์์กด์ฑ ์ญ์ ์ด ์ผ์ด๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๊ทผ๋ฐ ์์กด์ฑ ์ญ์ ์ด ๋ญ์ง?
์์กด์ฑ ์ญ์ ์์น
์์ ๋ชจ๋์ด ํ์ ๋ชจ๋์ ์์กดํ๋ ๊ฒ์ด ์๋๋ผ, ๋ ๋ชจ๋๊ฐ ์ถ์ํ์ ์์กดํด์ผ ํ๋ค๋ ์ํํธ์จ์ด ๋์์ธ ์์น
์์กด์ฑ ์ญ์ ์์น์์๋ ํ์ ๋ชจ๋์ด ์์๋ชจ๋์ ์์กดํ๋๋ก ์ค๊ณํ๋ค.
๊ทธ๋์ ์ธํฐํ์ด์ค(Swift์์๋ ํ๋กํ ์ฝ)์ ํตํด ์ ๊ทผํ๋ค.
์์ ๋ชจ๋๊ณผ ํ์ ๋ชจ๋์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ , ๋ชจ๋ ๊ฐ ์์กด์ฑ์ ์ ์ดํ์ฌ ์ํํธ์จ์ด ์์คํ ์ ์ ์ฐํ๊ณ ํ์ฅ ๊ฐ๋ฅํ๊ฒ ๋ง๋ ๋ค.
์๋์ ์์๋ฅผ ๋ณด์.
protocol Printer {
func printMessage(message: String)
}
class ConsolePrinter: Printer {
func printMessage(message: String) {
print(message)
}
}
class Message {
let printer: Printer
init(printer: Printer) {
self.printer = printer
}
func printMessage(message: String) {
printer.printMessage(message: message)
}
}
let printer = ConsolePrinter()
let message = Message(printer: printer)
message.printMessage(message: "Hello, World!")
Messageํด๋์ค(์์๋ชจ๋)๋ ConsolePrinterํด๋์ค(ํ์๋ชจ๋)์ ์ง์ ์ ์ผ๋ก ์์กดํ์ง ์๊ณ ,
Printerํ๋กํ ์ฝ์ ์์กดํ๊ฒ ๋์ด ์์กด์ฑ ์ญ์ ์์น์ด ์ ์ฉ๋๋ค.
์ด๋ ๊ฒ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํด์ ๋ชจ๋ ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ ์์กด์ฑ์ ์ ์ดํ๋ค.
๋ค์ ๋ณธ๋ก ์ผ๋ก ๋์์์,
ํด๋ฆฐ์ํคํ ์ฒ์์๋ Domain UseCase์์ Data Repository์ ์์กดํ๊ณ ์์ผ๋ฉด ์๋๋ค.
์ ์์กดํ๋ฉด ์๋๋ ์ง ๊ถ๊ธํด์ ChatGPT์ ๋ฌผ์ด๋ดค๋ค.
ํ ์คํธ๊ฐ ์ด๋ ค์์ง๊ณ Data Repository์ ๋ณ๊ฒฝ์ด UseCase์ ์ํฅ์ ๋ฏธ์ณ์ ๊ทธ๋ ๋ค๊ณ ํ๋ค.
์.. ๊ทธ๋ฌ๋ฉด UseCase๊ฐ ์ํฅ์ ๋ฐ๊ฒ๋๋๊น ์์กดํ๋ฉด ์๋๋ค๋ ๊ฒ์ ์์๋ค.
๊ทธ๋ ์ง๋ง Data Repository(์์๋ชจ๋)์์๋ request์ response๋ฅผ ๋ฐ์์์ผํ๋ค.
์ด๋ฐ ์ํฉ์์ Data Repository๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์์กด์ฑ ์ญ์ ์์น์ ํตํด ์์กด์ฑ์ ์์ ๋ฉด์(์์ ์์ ์์ ํ๋กํ ์ฝ ์ด ๊ฒ์ฒ๋ผ) Domain์์ Data Repository๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํ ๊ฒ์ด๋ค.
๊ทธ๋์ ๋ฐ์ดํฐ๊ฐ ์ค๊ณ ๊ฐ๋ ํ๋ฆ์ ์๋์ ๊ฐ๋ค.
1. ์ฌ์ฉ์๊ฐ ๋ฒํผ์ ๋๋ฌ View(UI)๊ฐ ViewModel(Presenter)์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
2. ViewModel์ด UseCase๋ฅผ ์คํ์ํจ๋ค.
3. UseCase๊ฐ User์ Repository์์ ๋ฐ์ดํฐ๋ฅผ ์ทจํฉํ๋ค.
4. ๊ฐ Repository๋ Remote Data(NW), Persistent DB์ ์ฅ์๋ ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ค.
5. ๋ฐํ๋ ๋ฐ์ดํฐ๊ฐ ์ฐ๋ฆฌ๊ฐ ์์ดํ ๋ค์ ํ๋ฉด์ ์ถ๋ ฅํ View์ ์ ๋ฌ๋๋ค.
์์กด์ฑ ๋ฐฉํฅ
Presentation Layer โก๏ธ Domain Layer โฌ ๏ธ Data Layer
- Presentation Layer(MVVM) = ViewModel(Presenters) + Views(UI)
- Domain Layer = Entities + UseCases + Repositories Interfaces(์์กด์ฑ ์ญ์ ์์น์ ์ํ Protocol)
- Data Layer = Repositories Implementations + API(NW) + Persistence DB
๋ค์ ํฌ์คํ ์์ ์์ ํ๋ก์ ํธ๋ฅผ ๋ค๋ค๋ณด๊ฒ ์ต๋๋ค.
Ref
https://yoojin99.github.io/app/%ED%81%B4%EB%A6%B0-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98/
'๐ iOS > ๋์์ธํจํด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ฝ๋๋ค์ดํฐ ํจํด (0) | 2023.05.07 |
---|---|
๋ธ๋ฆฌ๊ฒ์ดํธ ํจํด (0) | 2023.03.22 |