2022. 6. 20. 01:33ใFlutter
https://devmuaz.medium.com/flutter-clean-architecture-series-part-1-d2d4c2e75c47
Flutter Clean Architecture Seriesโ—โPart 1
Sounds awesome? well, wait till we finish the app ๐!
devmuaz.medium.com
ํ๋ฌํฐ ํจํด์ ๋๋ฌด ๋ฌด์์๋ก ํ๊ธฐ๋ณด๋ค ์ข์ ๊ตฌ์กฐ๋ก ์ก๊ณ ์ฝ๋ฉ์ ํ๋๊ฒ ์ข์ ๊ฑฐ ๊ฐ๋ค ์๊ฐํด์ ์ข์ ๊ธ์ด ์๋ ๊ฒ ๊ฐ์ ๋ฒ์ญํ๋ฉด์ ์ ๋ฆฌํด๋ณด๋ ค ํฉ๋๋ค.(์์ด ์ผ๋ฏผ์ดใ )
๊ธฐ๋ณธ์ ์ธ ํ๋ก์ ํธ ์์ฑ
counter_app
|-- android // ์ปดํ์ผ๋ android์ฑ
|-- ios // ์ปดํ์ผ๋ ios์ฑ
|-- lib // 99ํผ์ ์๊ฐ์ ํ ์ ํ๋ ์ฅ์
|-- main.dart // ํ๋ก์ ํธ ์ง์
์ . ๋ฐ๋์ ์กด์ฌํด์ผ ํ๋ฉฐ main() ๋ฉ์๋๋ฅผ ํฌํจํด์ผํจ
|-- test // 50ํผ์ ์๊ฐ์ ํ ์ ํด์ผ ํ์ง๋ง (^^;;) ๋ณดํต 0.1ํผ์ผํธ์ ์๊ฐ์ ์ฌ์ฉ
|-- widget_test.dart
.gitignore
pubspec.yaml // ๋ชจ๋ dartํ๋ก์ ํธ์ ํ์ํ๋ฉฐ ์์กด์ฑ๊ณผ ๋ฉํ๋ฐ์ดํฐ ๊ด๋ฆฌ
pubspec.lock // ํธ์งํ๋ฉด ์๋๋ ์ ๊ธ(lock)ํ์ผ ์์ฑ. pubspec.yaml์ ์
๋ํ ๋ ์ด ์ ๊ธ ํ์ผ์ ๊ฐฑ์ ํ๋ฉฐ
// ํธํ๋์ง ์๋ ํจํค์ง ๋ฒ์ ์ ์ฌ์ฉํ์ง ์๋๋ก ํ๋ค.
README.md
ํด๋ฆฐ ์ํคํ ์ณ๋ฅผ ์ก๊ณ ๊ฐ๋ฉด
์ฅ์
- ํ ์คํฐ๋ธํ ์ฝ๋ ๋ฐ ํ์ฅ์ฑ ์๋ ๊ตฌ์กฐ
- ์ฝ๊ฒ ์ ์ง ๋ณด์
- ํ๋ ์์ํฌ / ํด์ ๋ ๋ฆฝ์ฑ
- ํฐ ๊ท๋ชจ, ๋ง์ ๊ฐ๋ฐ์๋ค์ด ๋ค์ด๊ฐ ํฐ ํ๋ก์ ํธ์ ์ ํฉ(๋ ๋ฆฝ์ ์ธ ํํ๋ก ๊ตฌ์กฐํ ๋์ด ๋ถ์ ํ์ ์ฉ์ดํจ)
- ์ ๊ตฌ์กฐํ ๋จ
๋จ์
- ๋ณด์ผ๋ฌ ํ๋ ์ดํธ ์ฝ๋(ํ์ผ์ฑ)
- ๋ชจ๋ ํ๋ก์ ํธ(ํ์ฌ ํ๋ก์ ํธ์ ๋ฐฉํฅ์ฑ)์ ์ ํฉํ์ง ์์ ์ ์๋ค (๊ฐ์์ ์คํ์ผ๊ณผ ์๊ตฌ์ฌํญ์ด ๋ค๋ฅผ ์ ์์ผ๋)
ํ๋ก์ ํธ
news ์ฑ ( REST API)์ ๋ฐ์ดํฐ ์์ฒญํด์ ๊ฐ์ ธ์ค๊ณ ๋๋ฐ์ด์ค์์ ๋ก์ปฌ๋ก ๋ฐ์ดํฐ๋ฅผ ์บ์ํ๋ ๋ด์ค์ฑ์ ๋ง๋ฆ.
์ด ์ฑ์์ ์ฌ์ฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ํด๋ ๊ตฌ์กฐ , ํ๋ก์ ํธ ์ค์ ๋ฐ ์ฃผ์ ์ํคํ ์ฒ ์๊ฐ
๊ธฐ๋ฅ
- ๋ฐ์ผ๋ฆฌ ๋ด์ค List ๊ฐ์ ธ์ค๊ธฐ
- ์์ธ ๊ธฐ์ฌ ๋ณด๊ธฐ
- ๊ด์ฌ ๊ธฐ์ฌ save
์ฌ์ฉํ ํจํค์ง(๋ผ์ด๋ธ๋ฌ๋ฆฌ)
- retrofit
Dio(https://pub.dev/packages/dio) ๋ฅผ http ํด๋ผ์ด์ธํธ๋ก ์ฌ์ฉํ๋ ์์ค์ฝ๋ ์์ฑ ํจํค์ง๋ก REST APIs ๋ฉ์๋๋ฅผ ์ ์ ํ๊ฒ ์์ฑํ๋๋ก ์ถ์ํ ๋์ด์๋ค! (์๋๋ก์ด๋ Retrofit์์ ์๊ฐ์ ๋ฐ์)
- floor
Sqlite๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ก์ปฌ๋ก ์ ์ฅํ๋ typesafeํ๊ณ reactiveํ ๊ฒฝ๋ ์์ค ์ฝ๋ ์์ฑ๊ธฐ ํจํค์ง. (์๋๋ก์ด๋ Room์์ ์๊ฐ ๋ฐ์)
- flutter_bloc
์ํ ๊ด๋ฆฌ ํจํค์ง (react์ ๋ฆฌ๋์ค ๊ฐ์) Provider๊ฐ์ด ์ ์ญ์ ์ผ๋ก ์ ๊ทผํด์ผํ ์ํ๋ฅผ ๊ด๋ฆฌ
- equtable
dart๊ฐ์ฒด๋ฅผ ๋๋ฑํ๊ฒ ๋น๊ตํ๋ ํ๋ฌํฐ ํจํค์ง?
- get_it
์๋น์ค ๋ก์ผ์ดํฐ. DI ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก (์๋๋ก์ด๋ Dagger๋ผ๋ DI ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์๊ฐ) ์ข ์์ฑ์ ์๋์ผ๋ก ์ฃผ์ . ์ฆ, ์ข ์์ฑ ์ฃผ์ ๊ธฐ..
- flutter_hooks
react hooks์์ ์๊ฐ์ ๋ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ํ์ ๋ถ๋ณ์ฑ์ ์งํค๋ฉฐ ์ํ ๋ณ๊ฒฝ
- lint
dart์ ์คํ์ผ ์ง์นจ์ ๋ฐ๋ผ ๊น๋ํ ์ฝ๋๋ก ์์ฑํ๋๋ฐ ๋์์ ์ฃผ๋ ํจํค์ง
- ionicons
์์ ์์ด์ฝ ์ธํธ
REST API
https://newsapi.org/docs/get-started์ ๋ด์ค API๋ฅผ ์ฌ์ฉํด json์ผ๋ก ๊ฒ์. ๋ก๊ทธ์ธํด์ APIํค ์ป์ด์ ์ฌ์ฉํ๋ค.
๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ
lib/src ๋ฐ์ผ๋ก
DI (Dependency Injection) ํ๋ ๋ฒ
src๋ด์ injector.dartํ์ผ์ get_it ํจํค์ง๋ฅผ ์ฌ์ฉํด DI (์ข ์์ฑ ์ฃผ์ )์ ํ๋ ์ญํ ์ ํจ
์ํคํ ์ณ ์ค๋ช
* config
์ฑ์ ๋ํ ๊ตฌ์ฑ์ด ํฌํจ๋์ด ์์ต๋๋ค. (ํ ๋ง , ๊ฒฝ๋ก ๋ฑ๋ฑ)
* core
์ฑ ์ ์ญ์ผ๋ก ํ์ํ ํต์ฌ ํ๋ชฉ์ด ํฌํจ๋์ด ์์. ๊ธฐ๋ฅ์ ํ์ํ ์์ / ์ก์ ๊ฐ์ ๊ฒ์ core์ ๊ตฌํ
resources , utilities ๋ฑ๊ณผ ๊ฐ์ ํด๋๋ค๋ ํฌํจํ ์ ์๋ค.
data ๊ณ์ธต
๋งจ ์๋ ๋ ์ด์ด์ธ Data๊ณ์ธต์ REST API, GraphQL ๊ฐ์ httpํต์ ์ผ๋ก ๋ฐ์ data , sqlite๊ฐ์ local DB์ raw data๋ฅผ <br>
์ง์ ์ฒ๋ฆฌํ๋ ๊ฒ. ๊ทธ ๋ค์ raw data(Json, Xml ..๋ฑ)์ ๋งคํํ๊ฑฐ๋ ์ง๋ ฌํํ๋ ๋ฐฉ๋ฒ์ผ๋ก Model(dart๊ฐ์ฒด)๋ก ๋ณํํด ๋งคํํฉ๋๋ค.
data๊ณ์ธต์ models์ Domain๊ณ์ธต์ entities์ ๋ค๋ฆ
๋๋ค.
์ด๋ฐ ๊ณ์ธต์ผ๋ก ๋๋๋ ์ด์ ๋ raw data ์ง๋ ฌํ๋ฅผ Json์์ xml๋ก ๋ณ๊ฒฌํ๋ ค๋ ๊ฒฝ์ฐ ์ด๋ฐ ๋ณ๊ฒฝ์ฌํญ์ด ๋ด๋ถ entity (domain๊ณ์ธต์ entity)์
์ํฅ์ ๋ผ์น์ง ์๊ธฐ ๋๋ฌธ.
Data๊ณ์ธต์ Model์ Domain๊ณ์ธต์ entities์์ property(์์ฑ)๋ค์ ํ์ฅํ๊ณ Model์ด entities์์ ๋ชจ๋ ์์ฑ์ ํ์ฅํ๋ฏ๋ก
ํญ์ Domain๊ณ์ธต์ ์ข
์๋จ.
domain๊ณ์ธต์์ ์ธํฐํ์ด์ค(์ถ์ํ๋ ํด๋์ค)๋ฅผ ์ ์.
data๊ณ์ธต์์ repository๋ฅผ ํฌํจํ๋ domain๊ณ์ธต์ ์ถ์ํ ํด๋์ค์ ์ค์ ๊ตฌํ.
domain๊ณ์ธต๊ณผ ์ํธ์์ฉํ์ง ์๊ณ ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํด ์ฌ๋ฌ ๊ตฌํ์ ๋ณ๊ฒฝ, ์ถ๊ฐํ ์ ์์ด์ ์์กด์ฑ์ ๋ฎ์ถ ์ ์์ต๋๋ค.
presentation๊ณ์ธต
์ด ๊ณ์ธต์ 2๊ฐ์ง ์ค์ํ ๋ถ๋ถ์ด ์์ต๋๋ค. Bloc(ViewModel ํฌํจ)๊ณผ UI (widgets, state, animation..)
* Bloc
Bloc์์๋ ์ธ๋ถ(remote๋๋ local)๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ํ์๋ก ํ๋ ๋ชจ๋ ์ํธ์์ฉ์ ์ด bloc์ด ์ฒ๋ฆฌํจ (redux๊ฐ์..)
bloc์ ํจํด์ ๋จ์ผ ํด๋์ค๋ฅผ ๊ฐ๋ ๋์ ์ด๋ฌํ ์ํธ ์์ฉ์ Event๋ก ๋ถ๋ฆฌํ๊ณ event๋ฅผ ์ฒ๋ฆฌํ๊ณ state์ ๊ฒฐ๊ณผ๋ฅผ UI๋ก ๋ฆฌํด
UI์ชฝ์์ state์ ์ํ๋ฅผ (stream of states) ๋ฐ์ actionํ๊ณ ์์ ฏ์ ๋น๋ํด์ ์
๋ฐ์ดํธ
bloc์ ์จ์ event, state, bloc์ผ๋ก role์ ๋๋๊ณ ๋ ํด๋ฆฐํ ์ฝ๋ ๋ฒ ์ด์ค๋ฅผ ๊ฐ์ ธ๊ฐ.
presentation๊ณ์ธต๋ domain๊ณ์ธต์ ์์กด - bloc์ด ์ฃผ์
(injected)๋ domain์ข
์์ฑ(ex. usecase)๋ฅผ ์ฌ์ฉํด์ ์์
์ฒ๋ฆฌํด์.
domain ๊ณ์ธต
- domain๊ณ์ธต์ ๋ด์ entities๋ง ํฌํจํ๊ณ , ์ฐ๋ฆฌ domain์ entities๊ฐ domain ๊ณ์ธต ์ธ๋ถ์์ ๋ฐ์ํ ๋ณ๊ฒฝ ์ฌํญ๊ณผ
์์ ํ ๋
๋ฆฝ์ ์.
- persentation ๊ณ์ธต๊ณผ data๊ณ์ธต๋ชจ๋ domain๊ณ์ธต์ ์์กดํจ. (ํ์์ ์ธ ์์กด์ฑ)
- data๊ณ์ธต์ domain๊ณ์ธต์์ ์์ฑ๋ ๊ณ์ฝ(์ถ์ํด๋์ค)๋ฅผ ์ค์ ๊ตฌํ / presentation๊ณ์ธต์ ์ฃผ์
๋ ์ข
์์ฑ์ผ๋ก ์ฌ์ฉํ ๋ ์ด๋ฐ ๊ณ์ฝ๋ค์ ์ฌ์ฉ.
- presentation๊ณ์ธต์ model์ด ์๋ entity๋ก๋ง ๋ฐ์ดํฐ๋ฅผ ์ป์ด ๊ฐ ๊ณ์ธต์ ๋
๋ฆฝ์ ์ผ๋ก ๋ถ๋ฆฌํด์ผํจ.
- ๋ํ ํ๋ก์ ํธ๋ ๊ฐ ๊ณ์ธต์ ๋งคํ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด ๊ฐ ๊ณ์ธต๋ณ๋ก ์ํธ์์ฉํ๊ณ ์๋ก ์ข
์๋์ง ์๋๋ก ํ๋๊ฒ ์ข์ (ํด๋น ํ๋ก์ ํธ๋ ์์์ ๊ทธ๋ ๊ฒ๊น์ง์ ์ํจ!)
* usecase
usecase๋ ์ด๋ป๊ฒ ์ฌ์ฉ๋๋๋ฉด repository์ ์์กดํ๋ ๊ฐ๋ณ ํด๋์ค๋ก, ํ๋์ ์ ํํ ์์
(๊ธฐ์ฌ ๊ฐ์ ธ์ค๊ธฐ, data ๊ฒ์, ๋ก๊ทธ์ธ ๋ฑ)๋ง์ ์ํ.
usecase์ ์ฃผ์
๋ ์ฌ๋ฌ repository๋ฅผ ์ทจํ ์ ์๊ณ bloc(viewmodel)์ ๊ทธ๊ฒ์ ์ฃผ์
๋ ์ฌ๋ฌ usecase๋ฅผ ์ฌ์ฉํ ์ ์์.
'Flutter' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Flutter] Dart ๋ฌธ๋ฒ Null์ธ์์ฐ์ฐ์ (0) | 2021.01.01 |
---|---|
[Flutter] Stateful ์์ ฏ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋ (0) | 2020.12.31 |
[Flutter] Routes ์ Navigation (feat. ๋ฉํฐ์คํฌ๋ฆฐ) (0) | 2020.12.26 |
[Flutter] Flutter์์ Dart ๋ฌธ๋ฒ(2) - Functions as First Order Objects (2) | 2020.12.19 |
[Flutter] Flutter์์ Dart ๋ฌธ๋ฒ (enum ํ์ , ์ผํญ ์ฐ์ฐ์, Map ํ์ ) (0) | 2020.12.13 |