Skip to content

Latest commit

Β 

History

History
95 lines (64 loc) Β· 4.81 KB

File metadata and controls

95 lines (64 loc) Β· 4.81 KB

πŸ“š GitHub μ‚¬μš©μž 검색 및 μ €μž₯μ†Œ 리슀트 μ•± (Flutter with Clean Architecture and BLoC)

λ³Έ ν”„λ‘œμ νŠΈλŠ” μ΅œμ‹  Flutter ν”„λ ˆμž„μ›Œν¬μ™€ Google Architecture νŒ¨ν„΄μ„ 기반으둜 개발된 GitHub μ‚¬μš©μž 검색 및 μ €μž₯μ†Œ 리슀트 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μž…λ‹ˆλ‹€. BLoC 및 Riverpod μƒνƒœ 관리 νŒ¨ν„΄μ„ μ‚¬μš©ν•˜μ—¬ μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€μ™€ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ λΆ„λ¦¬ν•˜λ©°, 둜컬 데이터 캐싱, νŽ˜μ΄μ§• 처리, κ΄‘κ³  λ°°λ„ˆ ν‘œμ‹œ λ“± λ‹€μ–‘ν•œ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜μ˜€μŠ΅λ‹ˆλ‹€.


μ£Όμš” κΈ°λŠ₯ ✨

  1. GitHub μ‚¬μš©μž λͺ©λ‘ 검색 및 ν‘œμ‹œ 🌐

    • GitHub APIλ₯Ό μ‚¬μš©ν•˜μ—¬ μ‹€μ‹œκ°„μœΌλ‘œ μ‚¬μš©μž 데이터λ₯Ό κ²€μƒ‰ν•˜κ³ , 아바타와 μ‚¬μš©μžλͺ…을 리슀트둜 λ³΄μ—¬μ€λ‹ˆλ‹€.
    • μ‚¬μš©μž λ¦¬μŠ€νŠΈλŠ” λ¬΄ν•œ μŠ€ν¬λ‘€μ„ 톡해 λ™μ μœΌλ‘œ λ‘œλ“œλ˜λ©°, GitHub API의 νŽ˜μ΄μ§€λ„€μ΄μ…˜μ„ ν™œμš©ν•˜μ—¬ μ„±λŠ₯ μ΅œμ ν™”λ₯Ό κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.
    • κ΄‘κ³  λ°°λ„ˆλŠ” 10번째, 20번째, 30번째 ν•­λͺ©λ§ˆλ‹€ ν‘œμ‹œλ˜λ©°, 클릭 μ‹œ νŠΉμ • URL둜 μ΄λ™λ©λ‹ˆλ‹€.
  2. μ‚¬μš©μž μ €μž₯μ†Œ λͺ©λ‘ πŸ”

    • νŠΉμ • μ‚¬μš©μžμ˜ GitHub μ €μž₯μ†Œ λͺ©λ‘μ„ κ²€μƒ‰ν•˜μ—¬ 이름, μ„€λͺ…, 별 수, μ‚¬μš© μ–Έμ–΄ λ“±μ˜ 정보λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
  3. νŽ˜μ΄μ§• 처리 πŸ”„

    • 원격 APIμ—μ„œ 데이터λ₯Ό κ°€μ Έμ˜¬ λ•Œ, νŽ˜μ΄μ§€ λ‹¨μœ„λ‘œ 데이터λ₯Ό λ‘œλ“œν•˜λ©°, λ¬΄ν•œ μŠ€ν¬λ‘€μ„ κ΅¬ν˜„ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 둜컬 캐싱과 ν•¨κ»˜ μ‚¬μš©λ˜μ–΄ API 호좜 μ΅œμ ν™” 및 μ„±λŠ₯ ν–₯상을 λ‹¬μ„±ν–ˆμŠ΅λ‹ˆλ‹€.
  4. 둜컬 데이터 캐싱 🏠

    • SQLiteλ₯Ό μ‚¬μš©ν•˜μ—¬ μ‚¬μš©μž 정보와 κ΄‘κ³  데이터λ₯Ό λ‘œμ»¬μ— μΊμ‹±ν•©λ‹ˆλ‹€. λ„€νŠΈμ›Œν¬ 연결이 λŠκΈ°λ”λΌλ„, λ‘œμ»¬μ— μ €μž₯된 데이터λ₯Ό μ΄μš©ν•΄ μ‚¬μš©μž κ²½ν—˜μ„ μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  5. μƒνƒœ 관리 🧠

    • BLoC νŒ¨ν„΄κ³Ό Riverpodλ₯Ό μ‘°ν•©ν•˜μ—¬ λ³΅μž‘ν•œ μƒνƒœ 관리 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€. μ‚¬μš©μž 이벀트 기반 데이터 흐름 관리와 μ „μ—­ μƒνƒœ 관리λ₯Ό λ™μ‹œμ— μ²˜λ¦¬ν•  수 μžˆλ„λ‘ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
  6. ν…ŒμŠ€νŠΈ πŸ§ͺ

    • JUnit, Mockitoλ₯Ό μ‚¬μš©ν•˜μ—¬ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직, 둜컬 및 원격 데이터 μ†ŒμŠ€μ— λŒ€ν•œ μœ λ‹› ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€. μ£Όμš” κΈ°λŠ₯에 λŒ€ν•œ ν…ŒμŠ€νŠΈλ₯Ό ν¬ν•¨ν•˜μ—¬ 높은 μ•ˆμ •μ„±μ„ 보μž₯ν•©λ‹ˆλ‹€.

기술 μŠ€νƒ πŸ› οΈ

  • μ–Έμ–΄: Dart
  • ν”„λ ˆμž„μ›Œν¬: Flutter
  • μƒνƒœ 관리: Riverpod, BLoC
  • 둜컬 λ°μ΄ν„°λ² μ΄μŠ€: SQLite
  • λ„€νŠΈμ›Œν¬ 톡신: Dio
  • ν…ŒμŠ€νŠΈ: JUnit, Mockito

Google Architecture 적용 πŸš€

이 ν”„λ‘œμ νŠΈλŠ” 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         # μ•± μ§„μž…μ 

μƒνƒœ 관리 νŒ¨ν„΄ 선택 이유 🎯

  1. BLoC νŒ¨ν„΄: 이벀트 기반 데이터 흐름과 μƒνƒœ 변경을 μ²˜λ¦¬ν•˜κΈ°μ— μ ν•©ν•œ νŒ¨ν„΄μœΌλ‘œ, μ‚¬μš©μž μ΄λ²€νŠΈμ— λ”°λ₯Έ λͺ…ν™•ν•œ μƒνƒœ 변경을 보μž₯ν•©λ‹ˆλ‹€.

  2. Riverpod: μ „μ—­ μƒνƒœ κ΄€λ¦¬μ˜ νŽΈλ¦¬ν•¨μ„ μ œκ³΅ν•˜μ—¬ λ³΅μž‘ν•œ μƒνƒœ 관리 문제λ₯Ό κ°„λ‹¨ν•˜κ²Œ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


Mediator νŒ¨ν„΄ 및 νŽ˜μ΄μ§• 처리 κ°•μ‘° πŸ”„

이 ν”„λ‘œμ νŠΈλŠ” Paging Mediator νŒ¨ν„΄μ„ μ μš©ν•˜μ—¬ λŒ€λŸ‰μ˜ 데이터λ₯Ό 효율적으둜 κ΄€λ¦¬ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 원격 API와 둜컬 데이터 μ†ŒμŠ€ κ°„μ˜ 동기화λ₯Ό μœ μ§€ν•˜κ³ , λ„€νŠΈμ›Œν¬ μž₯μ•  μ‹œμ—λ„ μ‚¬μš©μžκ°€ 앱을 μ›ν™œν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ„λ‘ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€. νŽ˜μ΄μ§• μ²˜λ¦¬μ™€ ν•¨κ»˜ 데이터λ₯Ό μΊμ‹±ν•˜μ—¬ μ„±λŠ₯을 μ΅œμ ν™”ν•˜κ³ , μ‚¬μš©μž κ²½ν—˜μ„ κ°œμ„ ν–ˆμŠ΅λ‹ˆλ‹€.


ν…ŒμŠ€νŠΈ μ „λž΅ πŸ§ͺ

  • JUnitκ³Ό Mockitoλ₯Ό μ‚¬μš©ν•˜μ—¬ μœ λ‹› ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€.
  • 둜컬 및 원격 데이터 μ†ŒμŠ€, λΉ„μ¦ˆλ‹ˆμŠ€ 둜직의 ν…ŒμŠ€νŠΈλ₯Ό 톡해 μ•±μ˜ μ•ˆμ •μ„±μ„ 보μž₯ν•©λ‹ˆλ‹€.