CleanArchitecture

๐Ÿ’ก ํ”„๋กœ์ ํŠธ ์ฃผ์ œ

  • ํ˜„์žฌ ์ƒ์˜์ค‘์ธ ์˜ํ™” ์‚ดํŽด๋ณด๊ธฐ.
  • ํ˜„์žฌ ์ƒ์˜์ค‘์ธ ์˜ํ™” ๋ฆฌ์ŠคํŠธ ๊ฐ€์ ธ์˜ค๊ธฐ API ๋ฐ ์ƒ์„ธ ์˜ํ™” ๊ฐ€์ ธ์˜ค๊ธฐ API๋ฅผ ํ†ตํ•ด ๋„คํŠธ์›Œํฌ ํ†ต์‹ .
  • ์œ ์ €๊ฐ€ ์•ฑ์„ ํ‚ค๋ฉด, ์ƒ์˜์ค‘์ธ ์˜ํ™” ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋‚˜์˜ด.
  • ๋ฆฌ์ŠคํŠธ์˜ ์˜ํ™”๋ฅผ ์„ ํƒํ•˜๋ฉด ์ƒ์„ธ์ •๋ณด๊ฐ€ ๋‚˜์˜ด.
  • ํƒญ๋ฐ”์˜ '์ €์žฅ'๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋กœ์ปฌ ์ €์žฅ์†Œ์— ์ €์žฅ ๋˜๊ณ , ๋ณด๊ด€ํ•จ ํ™”๋ฉด์—์„œ ์ €์žฅ๋œ ์˜ํ™” ์ •๋ณด ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋‚˜์˜ด.
  • ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ ๋ฐ Swipe๋ฅผ ํ†ตํ•œ ๋ทฐ ์ƒˆ๋กœ๊ณ ์นจ.
  • ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ์ด ์—†๋Š” ๊ฒฝ์šฐ ์บ์‹ฑ๋œ ์ƒ์˜ ์ค‘์ธ ์˜ํ™” ์ •๋ณด ๋ฆฌ์ŠคํŠธ ๋…ธ์ถœ.

๐Ÿ’ก ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๊ธฐ์ˆ 

  • MVVM
  • CleanArchitecture
  • Repository pattern ( Remote / Local )
  • Dependency injection ( Swinject )
  • DataBinding( RxSwift )
  • Local Database ( RxCoreData )

๐Ÿ’ก ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ ์ง„ํ–‰๋ฐฉ์‹

  1. MVVM ํŒจํ„ด์„ ์ ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœํ•œ๋‹ค.
  2. CleanrArchitecture ๋ฆฌํŒฉํ† ๋ง ํ•œ๋‹ค.

๐Ÿ’ก MVVM (MVVM branch)

MVVM Dependency Map

1

2

View

  • ํ™”๋ฉด ๋ฐ์ดํ„ฐ ์ž…์ถœ๋ ฅ ๋ฐ ์‚ฌ์šฉ์ž ์ธํ„ฐ๋ ‰์…˜์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ๋Š” ViewModel์—๊ฒŒ ์œ„์ž„ํ•ฉ๋‹ˆ๋‹ค.
  • RxSwift๋ฅผ ์ด์šฉํ•˜์—ฌ ViewModel์„ ๊ตฌ๋…ํ•˜๊ณ  ViewModel ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๊ฐ’์„ ์ „๋‹ฌ๋ฐ›์•„ ํ™”๋ฉด์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”์ธ๋”ฉํ•ด์ค๋‹ˆ๋‹ค.

ViewModel

  • ์•ฑ์˜ ๋น„์ฆˆ๋‹ˆ์Šค๋กœ์ง ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋ฉฐ View์™€์˜ ์˜์กด์„ฑ์ด ์ „ํ˜€ ์—†์Šต๋‹ˆ๋‹ค.
  • RxSwift๋ฅผ ์ด์šฉํ•˜์—ฌ ViewModel์„ ๊ตฌ๋…ํ•œ View์—๊ฒŒ ๋น„์ฆˆ๋‹ˆ์Šค๋กœ์ง ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ ๊ฐ’์„ Notify ํ•ด์ค๋‹ˆ๋‹ค.
  • Remote / ์˜์†์„ฑ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ž‘์—…์€ ๊ฐ๊ฐ RemoteDataSource / LocalDataSource์—๊ฒŒ ์œ„์ž„ํ•ฉ๋‹ˆ๋‹ค.
  • ์ธํ„ฐํŽ˜์ด์Šค์ธ RemoteDataSource / LocalDataSource๋ฅผ ์˜์กดํ•˜๊ฒŒ ํ•˜๊ฒŒ ํ•˜๊ณ  Main์—์„œ ๊ฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ตฌ์ฒด ํด๋ž˜์Šค(RemoteDataSourceImpl, LocalDataSourceImpl)๋ฅผ ์ฃผ์ž…ํ•ด์คŒ์œผ๋กœ์จ DIP(์˜์กด์„ฑ ์—ญ์ „ ์›์น™)์„ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

Model

  • Remote / ์˜์†์„ฑ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋กœ์ง ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • RxSwift๋ฅผ ์ด์šฉํ•˜์—ฌ ์ž์‹ ์„ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋Š” ViewModel์—๊ฒŒ ์—ฐ์‚ฐ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ Notify ํ•ด์ค๋‹ˆ๋‹ค.

๐Ÿ’ก CleanArchitecture (CleanArchitectrue branch)

CleanArchitecture Dependency Map

  • ๋ณ€ํ™”๊ฐ€ ๋งŽ์€ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์ธ Prersentation Layer์™€ Data Layer์˜ ์˜์กด์„ฑ์ด ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์ธ Domain Layer๋ฅผ ํ–ฅํ•ฉ๋‹ˆ๋‹ค.

3

Presentation Layer

  • ์‹ค์ œ ๋ทฐ๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•œ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ชจ์•„๋†“์€ ๋ ˆ์ด์–ด ์ž…๋‹ˆ๋‹ค.
  • ๋ทฐ์—์„œ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๋ฅผ Domain Layer์— ์ „๋‹ฌํ•˜๊ณ , Domain Layer๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ๋ทฐ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์—ญํ• ์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ViewModel์€ MVVM์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜์˜€์œผ๋‚˜, CleanArchitecture์—์„œ๋Š” Domain Layer์—๊ฒŒ ๋‹จ์ˆœํžˆ ๋กœ์ง ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜, Domain Layer์—์„œ ์ฒ˜๋ฆฌํ•œ ๊ฒฐ๊ณผ๋ฅผ View์— ํ•„์š”ํ•œ ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•ด์ฃผ๋Š” ์—ญํ• ๋งŒ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
    • CleanArchitecture์—์„œ Presentation Layer์™€ Domain Layer๊ฐ„ ๋ฐ์ดํ„ฐ ํ†ต์‹ ์€ Controller์™€ Presentation์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง€์ง€๋งŒ ํŽธ์˜์ƒ ๋‘ ๊ฐœ๋…์„ ํ•ฉ์นœ ViewModel๋กœ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ViewModel์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ๋ฅผ Domain Layer์˜ UseCase์—๊ฒŒ ์œ„์ž„ํ•ฉ๋‹ˆ๋‹ค.
    • DIP๊ตฌํ˜„์„ ์œ„ํ•ด ์ธํ„ฐํŽ˜์ด์Šค์ธ UseCase๋ฅผ ์˜์กดํ•˜๊ณ  Main์—์„œ UseCaseImpl์„ ์ฃผ์ž…ํ•˜์—ฌ ๋Š์Šจํ•œ ๊ด€๊ณ„๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
    • ๋ฐ์ดํ„ฐ ํ†ต์‹ ์€ UseCase๊ฐ€ ์ฐธ์กฐํ•˜๋Š” Request Model๊ณผ Response Model์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

Domain Layer

  • ์—”ํ‹ฐํ‹ฐ์™€ ์œ ์ฆˆ์ผ€์ด์Šค๋ฅผ ์ •์˜ ํ•ด ๋†“์€ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ชจ์•„๋†“์€ ๋ ˆ์ด์–ด ์ž…๋‹ˆ๋‹ค.
  • Presentation Layer๋กœ ๋ถ€ํ„ฐ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๋ฅผ Data Layer์— ์ „๋‹ฌํ•˜๊ณ , Data Layer๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ Presentation Layer๋กœ ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • Repository๋ฅผ ํ†ตํ•ด Data Layer์™€ ์†Œํ†ตํ•˜๊ณ , UseCase๋ฅผ ํ†ตํ•ด Presentation Layer์™€ ์†Œํ†ตํ•ฉ๋‹ˆ๋‹ค.
  • ๋น„์ฆˆ๋‹ˆ์Šค ์—…๋ฌด ๊ทœ์น™์„ ๋‹ด๋‹นํ•˜๋Š” ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์ธ Domain Layer์—์„œ๋Š” ์–ด๋– ํ•œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— ์˜์กดํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.
    • ๋”ฐ๋ผ์„œ Domain Layer์—์„œ๋Š” Data Layer์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋”๋ผ๋„ Remote/Local์—์„œ ๊ฐ€์ง€๊ณ  ์˜ค๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ๋ฉด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— Repository ํŒจํ„ด์„ ์ ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

Data Layer

  • ์‹ค์ œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๋“ค์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ชจ์•„๋†“์€ ๋ ˆ์ด์–ด ์ž…๋‹ˆ๋‹ค.
  • ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜, ์ €์žฅํ•˜๋Š” ์—ญํ• ์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.