λ³Έ νλ‘μ νΈλ μ΅μ Flutter νλ μμν¬μ Google Architecture ν¨ν΄μ κΈ°λ°μΌλ‘ κ°λ°λ GitHub μ¬μ©μ κ²μ λ° μ μ₯μ 리μ€νΈ μ ν리μΌμ΄μ μ λλ€. BLoC λ° Riverpod μν κ΄λ¦¬ ν¨ν΄μ μ¬μ©νμ¬ μ¬μ©μ μΈν°νμ΄μ€μ λΉμ¦λμ€ λ‘μ§μ λΆλ¦¬νλ©°, λ‘컬 λ°μ΄ν° μΊμ±, νμ΄μ§ μ²λ¦¬, κ΄κ³ λ°°λ νμ λ± λ€μν κΈ°λ₯μ ꡬννμμ΅λλ€.
-
GitHub μ¬μ©μ λͺ©λ‘ κ²μ λ° νμ π
- GitHub APIλ₯Ό μ¬μ©νμ¬ μ€μκ°μΌλ‘ μ¬μ©μ λ°μ΄ν°λ₯Ό κ²μνκ³ , μλ°νμ μ¬μ©μλͺ μ 리μ€νΈλ‘ 보μ¬μ€λλ€.
- μ¬μ©μ 리μ€νΈλ 무ν μ€ν¬λ‘€μ ν΅ν΄ λμ μΌλ‘ λ‘λλλ©°, GitHub APIμ νμ΄μ§λ€μ΄μ μ νμ©νμ¬ μ±λ₯ μ΅μ νλ₯Ό ꡬννμ΅λλ€.
- κ΄κ³ λ°°λλ 10λ²μ§Έ, 20λ²μ§Έ, 30λ²μ§Έ νλͺ©λ§λ€ νμλλ©°, ν΄λ¦ μ νΉμ URLλ‘ μ΄λλ©λλ€.
-
μ¬μ©μ μ μ₯μ λͺ©λ‘ π
- νΉμ μ¬μ©μμ GitHub μ μ₯μ λͺ©λ‘μ κ²μνμ¬ μ΄λ¦, μ€λͺ , λ³ μ, μ¬μ© μΈμ΄ λ±μ μ 보λ₯Ό μ 곡ν©λλ€.
-
νμ΄μ§ μ²λ¦¬ π
- μ격 APIμμ λ°μ΄ν°λ₯Ό κ°μ Έμ¬ λ, νμ΄μ§ λ¨μλ‘ λ°μ΄ν°λ₯Ό λ‘λνλ©°, 무ν μ€ν¬λ‘€μ ꡬννμμ΅λλ€. λ‘컬 μΊμ±κ³Ό ν¨κ» μ¬μ©λμ΄ API νΈμΆ μ΅μ ν λ° μ±λ₯ ν₯μμ λ¬μ±νμ΅λλ€.
-
λ‘컬 λ°μ΄ν° μΊμ± π
- SQLiteλ₯Ό μ¬μ©νμ¬ μ¬μ©μ μ 보μ κ΄κ³ λ°μ΄ν°λ₯Ό λ‘컬μ μΊμ±ν©λλ€. λ€νΈμν¬ μ°κ²°μ΄ λκΈ°λλΌλ, λ‘컬μ μ μ₯λ λ°μ΄ν°λ₯Ό μ΄μ©ν΄ μ¬μ©μ κ²½νμ μ μ§ν μ μμ΅λλ€.
-
μν κ΄λ¦¬ π§
- BLoC ν¨ν΄κ³Ό Riverpodλ₯Ό μ‘°ν©νμ¬ λ³΅μ‘ν μν κ΄λ¦¬ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€. μ¬μ©μ μ΄λ²€νΈ κΈ°λ° λ°μ΄ν° νλ¦ κ΄λ¦¬μ μ μ μν κ΄λ¦¬λ₯Ό λμμ μ²λ¦¬ν μ μλλ‘ μ€κ³λμμ΅λλ€.
-
ν μ€νΈ π§ͺ
- JUnit, Mockitoλ₯Ό μ¬μ©νμ¬ λΉμ¦λμ€ λ‘μ§, λ‘컬 λ° μ격 λ°μ΄ν° μμ€μ λν μ λ ν μ€νΈλ₯Ό μμ±νμ΅λλ€. μ£Όμ κΈ°λ₯μ λν ν μ€νΈλ₯Ό ν¬ν¨νμ¬ λμ μμ μ±μ 보μ₯ν©λλ€.
- μΈμ΄: Dart
- νλ μμν¬: Flutter
- μν κ΄λ¦¬: Riverpod, BLoC
- λ‘컬 λ°μ΄ν°λ² μ΄μ€: SQLite
- λ€νΈμν¬ ν΅μ : Dio
- ν μ€νΈ: JUnit, Mockito
μ΄ νλ‘μ νΈλ Clean Architecture ν¨ν΄μ μ μ©νμ¬ κ°κ°μ μ± μ μμμ λΆλ¦¬νκ³ , μ μ§λ³΄μμ νμ₯μ±μ κ·Ήλννμ΅λλ€.
-
Data Layer:
- GithubLocalDataSource: SQLiteλ₯Ό ν΅ν΄ λ‘컬 λ°μ΄ν°λ₯Ό κ΄λ¦¬ν©λλ€.
- GithubRemoteDataSource: GitHub APIμμ λ°μ΄ν°λ₯Ό λΆλ¬μ΅λλ€.
-
Domain Layer:
- GithubRepositoryImpl: λ°μ΄ν°λ₯Ό κ΄λ¦¬νκ³ Presentation Layerμ μ 곡ν©λλ€. μ격 λ°μ΄ν° μμ€μ λ‘컬 λ°μ΄ν° μμ€ κ°μ λκΈ°νλ₯Ό κ΄λ¦¬ν©λλ€.
-
Presentation Layer:
- BLoC ν¨ν΄κ³Ό ν¨κ» μν κ΄λ¦¬λ₯Ό μννλ©°, Flutter UIμμ λ°μ΄ν°λ₯Ό νμν©λλ€.
lib/
βββ data/
β βββ constants/
β βββ model/ # λ°μ΄ν° λͺ¨λΈ μ μ
β βββ repository/ # λ ν¬μ§ν 리 ꡬν
β βββ source/
β β βββ local/ # λ‘컬 λ°μ΄ν° μμ€ (SQLite)
β β βββ remote/ # μ격 λ°μ΄ν° μμ€ (GitHub API)
βββ presentation/
β βββ bloc/
β βββ screens/
β βββ widgets/
βββ main.dart # μ± μ§μ
μ
-
BLoC ν¨ν΄: μ΄λ²€νΈ κΈ°λ° λ°μ΄ν° νλ¦κ³Ό μν λ³κ²½μ μ²λ¦¬νκΈ°μ μ ν©ν ν¨ν΄μΌλ‘, μ¬μ©μ μ΄λ²€νΈμ λ°λ₯Έ λͺ νν μν λ³κ²½μ 보μ₯ν©λλ€.
-
Riverpod: μ μ μν κ΄λ¦¬μ νΈλ¦¬ν¨μ μ 곡νμ¬ λ³΅μ‘ν μν κ΄λ¦¬ λ¬Έμ λ₯Ό κ°λ¨νκ² ν΄κ²°ν μ μμ΅λλ€.
μ΄ νλ‘μ νΈλ Paging Mediator ν¨ν΄μ μ μ©νμ¬ λλμ λ°μ΄ν°λ₯Ό ν¨μ¨μ μΌλ‘ κ΄λ¦¬ν©λλ€. μ΄λ₯Ό ν΅ν΄ μ격 APIμ λ‘컬 λ°μ΄ν° μμ€ κ°μ λκΈ°νλ₯Ό μ μ§νκ³ , λ€νΈμν¬ μ₯μ μμλ μ¬μ©μκ° μ±μ μννκ² μ¬μ©ν μ μλλ‘ μ€κ³λμμ΅λλ€. νμ΄μ§ μ²λ¦¬μ ν¨κ» λ°μ΄ν°λ₯Ό μΊμ±νμ¬ μ±λ₯μ μ΅μ ννκ³ , μ¬μ©μ κ²½νμ κ°μ νμ΅λλ€.
- JUnitκ³Ό Mockitoλ₯Ό μ¬μ©νμ¬ μ λ ν μ€νΈλ₯Ό μμ±νμ΅λλ€.
- λ‘컬 λ° μ격 λ°μ΄ν° μμ€, λΉμ¦λμ€ λ‘μ§μ ν μ€νΈλ₯Ό ν΅ν΄ μ±μ μμ μ±μ 보μ₯ν©λλ€.