์ค๋์ ์ ๊ฐ Android ๊ฐ๋ฐ์๋ก ํ๋ํ๋ MARU์ ๊ด๋ จ๋ ์ฃผ์ ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค! MARU์ Android ๊ฐ๋ฐ์๋ค์ Clean Architecture๋ฅผ ์งํฅํ๋ฉฐ ์ด์ฌํ ๊ฐ๋ฐํ๊ณ ์๋๋ฐ์, ์ค๋์ ์ด Clean Architecture๊ฐ ๋ฌด์์ธ์ง ์์๋ณด๊ณ , MARU๊ฐ ์ด๋ฅผ ์ด๋ป๊ฒ ์ํํ๊ณ ์๋์ง ์๊ฐํด๋ณด๋ ค๊ณ ํฉ๋๋ค. ์ฌ์ค ์ต๊ทผ๊น์ง Clean Architecture์ ๋ํด์ ์ ๋ชฐ๋์๋๋ฐ, MARU๋ผ๋ ์ข์ ๊ธฐํ๋ก Clean Architecture๋ฅผ ๊ณต๋ถํ๊ณ ๊ฒฝํํ ๊ธฐํ๊ฐ ์๊ฒจ ๊ธฐ์ฉ๋๋ค. ์ฉ์ด๊ฐ ๋ค์ํ๊ณ , ์ถ์์ ์ธ ๊ฐ๋ ๋ค์ ์ดํดํ๊ธฐ ์ด๋ ค์ ์ง๋ง, ์ต๋ํ ๊ณต์ ๋ ฅ ์๋ ์๋ฃ๋ฅผ ๋ณด๊ณ ์ํํ๋ ค ๋ ธ๋ ฅํ์ต๋๋ค ! ๊ธ์ ๋ํ ํผ๋๋ฐฑ ํญ์ ํ์์ ๋๋ค :) ๊ทธ๋ผ ์ค๋๋ ํ์ดํ ์ ๋๋ค ๐ฟ
๊ฐ๋ฐ์๋ค ์ฌ์ด์์, ๊ณผ๋ ๋ชจ์ ๊ทธ๋ฆผ ์ด๋ผ๋๊ฐ, ์ํ ๋ชจ์ ๊ตฌ์กฐ๋๋ผ๋ ํํ์ ์ฐ๊ณคํ๋๋ฐ์. ๋ฐ๋ก Robert C. Martin (Uncle Bob)์ Clean Architecture ๊ทธ๋ฆผ์ ์ง์นญํ๋ ๋ง์ ๋๋ค ๐คช
Clean Architecture์ ์ ๋ถ๋ฅผ ์๋ ๊ทธ๋ฆผ์ด ํํํ๊ณ ์๋ค๊ณ ํ ์ ์์ต๋๋ค.
- Independent of Frameworks. The architecture does not depend on the existence of some library of feature laden software. This allows you to use such frameworks as tools, rather than having to cram your system into their limited constraints.
- Testable. The business rules can be tested without the UI, Database, Web Server, or any other external element.
- Independent of UI. The UI can change easily, without changing the rest of the system. A Web UI could be replaced with a console UI, for example, without changing the business rules.
- Independent of Database. You can swap out Oracle or SQL Server, for Mongo, BigTable, CouchDB, or something else. Your business rules are not bound to the database.
- Independent of any external agency. In fact your business rules simply donโt know anything at all about the outside world.
(์ ๊ทธ๋ฆผ ์ถ์ฒ) ์ ๊ทธ๋ฆผ์์ ์์กด์ฑ ๋ฒ์น์ Entites๋ก ํฅํ๋ ํ์ดํ๋ฅผ ์๋ฏธํฉ๋๋ค. ์ฆ, ํญ์ ์์ ์์ชฝ ๋ฐฉํฅ์ผ๋ก๋ง ์์กด์ฑ์ด ์กด์ฌํด์ผํ๊ณ , ๋ฐ๊นฅ์ชฝ ๋ฐฉํฅ์ผ๋ก์ ์์กด์ฑ์ ์กด์ฌํ์ง ์์์ผํ๋ค๋ ์๋ฏธ๋ก ํด์ํ ์ ์์ต๋๋ค.
๊ทธ๋ฆผ์ ๋ฐ๋ฅด๋ฉด, ๋ฐ๊นฅ ์ชฝ์ ์์ A๋ ์์ชฝ์ ์์ B๋ฅผ ํ์๋ก ํฉ๋๋ค.
"A๊ฐ B๋ฅผ ํ์๋ก ํ๋ค." ๋ผ๋ ์์กด ๊ด๊ณ๋ฅผ UML ์ ํํ์ ๋น๋ ค, A - - -> B๋ก ํํํ ์ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๊ณผ์ฐ, ์์ชฝ์ ์์ B๋ ๋ฐ๊นฅ ์ชฝ์ ์์ A๋ฅผ ์ ๋ ํ์๋ก ํ์ง ์์๊น์?
์์กด์ ๋ฐฉํฅ์ ๋ณ๊ฒฝ์ ์ ์ฐ์ฑ๊ณผ๋ ๊ด๋ จ์ด ์์ต๋๋ค. Clean Architecture์์ , ์์กด์ ๋ฐฉํฅ์ด ์์ชฝ์ผ๋ก๋ง ํฅํ๊ธฐ ๋๋ฌธ์, ๋ฐ๊นฅ์ชฝ์ ์์์๋ก ๋ณํ๊ธฐ ์ฌ์ด, ์์ชฝ์ ์์์๋ก ๋ณํ๊ธฐ ์ด๋ ค์ด ์์๋ผ ์ดํดํ ์ ์์ต๋๋ค.
(์๋ ๊ทธ๋ฆผ ์ถ์ฒ) ์๋ ๊ทธ๋ฆผ์ ์์์ ๋ณด์๋ Clean Architecture ๊ทธ๋ฆผ์ 90๋ ํ์ ํ ๋ชจ์ต์ ๋๋ค. Clean Architecture์ ๊ฐ Layer๋ค์ ์ค๋ช ํ๊ธฐ ์ํด ์๋์ ๊ฐ์ด ํ์ฉ๋์์ต๋๋ค.
์ ๊ทธ๋ฆผ์ Presenter๋ฅผ Presenters๋ฟ๋ง ์๋๋ผ, ViewModels๋ ํฌ๊ดํ๊ธฐ ์ํ ๋ง๋ก, Controllers๋ผ ๋ถ๋ฅด๊ฒ ์ต๋๋ค.
UI (Activities & Fragments), Controllers (Presenters/ViewModels) ๋ฅผ ํฌํจํฉ๋๋ค.
Controllers (Presenters/ViewModels)์ 1๊ฐ ์ด์์ Use cases๋ฅผ ์คํํฉ๋๋ค.
UI์ UI ๊ฐ๊ฐ์ Controllers (Presenters/ViewModels)์ ์ํด ์กฐ์ ๋ฉ๋๋ค.
Presentation Layer๋ Domain Layer์ ๋์์ผ๋ก ์์กด์ฑ์ ๊ฐ์ง๋๋ค.
Presentation Layer - - - > Domain Layer
Entities, Use cases, Repository Interfaces๋ฅผ ํฌํจํฉ๋๋ค.
Use cases๋ data์ 1๊ฐ ์ด์์ Repository Interfaces๋ฅผ ๊ฒฐํฉํฉ๋๋ค.
Domain Layer๋ ๊ฐ์ฅ ์์ชฝ์ ๋ ์ด์ด์ ๋๋ค. ์์ ์ธ๊ธํ ์์กด์ฑ ๋ฒ์น์ ์ํด, Domain Layer๋ ๋ค๋ฅธ ๋ ์ด์ด๋ฅผ ๋์์ผ๋ก ์์กด์ฑ์ ๊ฐ์ง์ง ์์ต๋๋ค. ๋ค๋ฅธ ๋ ์ด์ด๊ฐ Domain Layer๋ฅผ ๋์์ผ๋ก ์์กด์ฑ์ ๊ฐ์ง ๋ฟ์ ๋๋ค.
์ด๋ป๊ฒ Domain Layer๋ Data Layer์ ๋ํ ์์กด์ฑ๋ ๊ฐ์ง์ง ์์ ์ ์๋์?
ํ๋ง๋๋ก ๋ต๋ณํ์๋ฉด, SOLID ์์น ์ค ์์กด์ฑ ์ญ์ ๋ฒ์น์ ํด๋นํ๋ interface๋ฅผ ์ฌ์ฉํ ์ถ์ํ ๋๋ถ์ ๋๋ค.
Interface ์ถ์ํ๊ฐ ์์๋ค๋ฉด, Domain Layer์ Use cases๊ฐ Data Layer์ Repository๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค. ์ฆ, Domain Layer - - - > Data Layer ๋ผ๋ ์์กด์ด ์๊ฒจ๋๊ฒ ๋ฉ๋๋ค.
ํ์ง๋ง Domain Layer๋ Repository๋ฅผ ์ถ์ํ์์ผ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์, ์์ ๊ฐ์ ์์กด์ด ์๊ฒจ๋์ง ์๊ฒ ๋๋ ๊ฒ์ ๋๋ค. ์ฆ, Domain Layer๋ Data Layer์์ ๊ตฌํ๋ Repository Interfaces๋ฅผ ์ฌ์ฉํ๋ฉด์, ์์กด์ ํํผํ๊ฒ ๋ฉ๋๋ค.
์ด๊ฒ์ด ๋ฐ๋ก Repository Interfaces๊ฐ Domain Layer์ ํฌํจ๋๋ ์ด์ ์ด์, Repository Implementations๊ฐData Layer์ ํฌํจ๋๋ ์ด์ ๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค.
์์กด์ฑ ์ญ์ ๋ฒ์น์ ํ๋ง๋๋ก ?
High-level modules should not depend on low-level modules, both should depend on abstractions.
Repository Implementations, 1๊ฐ ์ด์์ Data Sources๋ฅผ ํฌํจํฉ๋๋ค.
Data Layer์ Repository Implementations
Data Layer๊ฐ ๊ฐ์ง ์ฑ ์ ์ค ํ๋๋ก, Domain Layer๊ฐ ์ฌ์ฉํ๋ Repository Interfaces์ ๋ํ ๊ตฌํ์ ์ด์ผ๊ธฐ ํ ์ ์์ต๋๋ค. Domain Layer๋ Data Layer๊ฐ ๊ตฌํํด์ค๊ฑฐ๋ผ ์๊ฐํ๊ณ Repository Interfaces๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
Repository๋ ๋ค๋ฅธ Data Source๋ค์ ๊ฒฐํฉ/์กฐ์ ํฉ๋๋ค.
Repository ์ฌ๋ฌ Data Source๋ค์ ๊ฒฐํฉํ๋ ๊ฒฝ์ฐ๋ก, Local Data Source๊ณผ Remote Data Source์ ๊ฒฐํฉ์ ๋ํด ์ด์ผ๊ธฐํ ์ ์์ต๋๋ค.
dataSource์ dataSourceImpl
Data Layer์ Data Source๋, ์์์ ๋ดค๋ ์์กด์ฑ ์ญ์ ๋ฒ์น์ ์ ์ฉ์ผ๋ก, ์ถ์ํ ๋์ด interface์ Implementations์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
์ฆ, Repository - - -> Data Source์ ์์กด์ ๋ํ ํํผ์ ๋๋ค.ํํธ, ์ด๋ ๊ฒ ์์กด์ ์์ ๋ฉด, Data Source์ ๋ณ๊ฒฝ์, Repository์ ๋ํ ์ํฅ์ ์ค์ผ ์ ์์ต๋๋ค.
Repository ํจํด์ ํ๋ง๋๋ก ?
๋ฐ์ดํฐ ์ถ์ฒ (data source)์ ๊ด๊ณ ์์ด, ๋์ผํ ์ธํฐํ์ด์ค๋ก ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ ํจํด์ ์๋ฏธํฉ๋๋ค.
์๋ฅผ ๋ค๋ฉด, Repository ํจํด์ Room(๋ด๋ถ์ ์ฅ์)์ผ๋ก ๊ด๋ฆฌ๋๋ ๋ฐ์ดํฐ์ (local data source data) , Retrofit2๋ฅผ ํตํด ๋ฐ์์ค๋ ๋ฐ์ดํฐ(remote data source data)์ ๊ตฌ๋ถ์ ์์ , ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ Domain Layer๊ฐ ๋ฐ์ดํฐ ์ถ์ฒ(data source)๋ฅผ ์ ํ์ ์๊ฒ ํด์ค๋๋ค.
Data Layer๋ Domain Layer์ ๋์์ผ๋ก ์์กด์ฑ์ ๊ฐ์ง๋๋ค.
Data Layer - - - > Domain Layer
์ฝ๊ณผ ์คํธ๋ฆผ ๋ฐฉ์์ ๋ํด ๊ณต๋ถ ์ค์ ๋๋ค ~,~
์ ์ฝ๊ณ ๊ฐ๋๋ค!
Android TV๋ฅผ ํ๊ธฐ ์ ์ ์ด ํฌ์คํธ๋ฅผ ๋ดค๋๋ผ๋ฉด ์ข ๋ ์ ๊ฒฝ์จ์ ํ์ํ ๋ฐ! ใ ใ