Skip to content

Latest commit

ย 

History

History
93 lines (79 loc) ยท 3.74 KB

File metadata and controls

93 lines (79 loc) ยท 3.74 KB

Architecture

  • ์ฝ”๋“œ์˜ Architecture๋Š” Clean Architecture๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค.
  • Multi Module ๊ตฌ์กฐ๋กœ ๊ตฌ์„ฑํ•œ๋‹ค.
    • Module์˜ ๊ตฌ์กฐ๋Š” ๊ฐ Repository์˜ Readme์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • MVVM ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • SAA ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ๋‹ค.

ViewModel

  • ViewModel(Presentation Layer)์—๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ ํ”„๋ ˆ์ž„์›Œํฌ ๊ด€๋ จ ์ฝ”๋“œ๊ฐ€ ์—†์–ด์•ผํ•จ
  • import android.* ์ฝ”๋“œ๊ฐ€ ์—†๋„๋ก ์œ ์ง€(AAC๊ด€๋ จ ์ฝ”๋“œ ์ œ์™ธ, android.arch.*)
  • https://medium.com/androiddevelopers/viewmodels-and-livedata-patterns-antipatterns-21efaef74a54
  • ๋‹ค๋งŒ ๋ฐ์ดํ„ฐ์— ํ•ด๋‹น๋˜๋Š” R.string.xxx, R.dimen.xxx, R.color.xxx๋“ค์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ
    • (R.id.xxx, R.layout.xxx๋Š” ๋ถˆ๊ฐ€)
  • SavedStateHandle์€ ์ƒ์„ฑ์ž์˜ ์ฒซ๋ฒˆ์งธ์— ์œ„์น˜ํ•œ๋‹ค.

Do

@HiltViewModel
class XxxViewModel @Inject constructor(
  savedStateHandle: SavedStateHandle,
  private val getFooUseCase: GetFooUseCase,
) : ViewModel()

Do not

@HiltViewModel
class XxxViewModel @Inject constructor(
  private val getFooUseCase: GetFooUseCase,
  savedStateHandle: SavedStateHandle,
  private val getBarUseCase: GetBarUseCase,
) : ViewModel()

@HiltViewModel
class XxxViewModel @Inject constructor(
  private val getFooUseCase: GetFooUseCase,
  private val getBarUseCase: GetBarUseCase,
  savedStateHandle: SavedStateHandle,
) : ViewModel()

Event

: MVVM์˜ ViewModel์—์„œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• 6๊ฐ€์ง€

์ด๋ฒคํŠธ ์ด๋ฆ„์€ {ํ–‰์œ„}-{๋Œ€์ƒ}-{๊ฒฐ๊ณผ} ์ˆœ์„œ์˜ ์ด๋ฆ„ ๊ทœ์น™์„ ๊ฐ€์ง„๋‹ค.

object ShowCarInfo: Event() // ํ–‰์œ„: ๋ณด์—ฌ์ค€๋‹ค, ๋Œ€์ƒ: ์ฐจ๋Ÿ‰ ์ •๋ณด
object UploadImageSuccess: Event() // ํ–‰์œ„: ์—…๋กœ๋“œํ•˜๋‹ค. ๋Œ€์ƒ: ์ด๋ฏธ์ง€, ๊ฒฐ๊ณผ: ์„ฑ๊ณต
  • Event์˜ ์˜๋ฏธ์— ๋”ฐ๋ผ ๋™์‚ฌ์˜ ํ˜•ํƒœ๋Š” ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•œ๋‹ค. (๊ณผ๊ฑฐํ˜•, ํ˜„์žฌํ˜•)
  • Success, Complete์™€ ๊ฐ™์ด ์˜๋ฏธ๊ฐ€ ์ด์ค‘์ ์ผ ๋•Œ์—๋Š” ๊ธฐ๋Œ€ํ•˜๋Š” ๋™์ž‘์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ์ด๋ฆ„์„ ์„ ํƒํ•œ๋‹ค.

UseCase

  • ํด๋ž˜์Šค๋Š” ๊ฐ ํ•œ๊ฐœ์˜ usecase๋ฅผ ๊ฐ–๋Š”๋‹ค.
  • ํด๋ž˜์Šค๋ช…์€ xxxUseCase ์™€ ๊ฐ™์ด ๋ช…๋ช…ํ•œ๋‹ค.
  • List๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” UseCase์˜ ์ด๋ฆ„์€ GetXXXListUseCase์™€ ๊ฐ™์ด ์ •์˜ํ•œ๋‹ค.
    • ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ getXXXs()๋กœ ์ •์˜๋˜๋‚˜ ๋‹จ์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” UseCase์™€ ํ˜ผ๋™์˜ ์šฐ๋ ค๊ฐ€ ์žˆ๊ธฐ๋•Œ๋ฌธ์— UseCase์ด๋ฆ„์€ List๋ฅผ ๋ถ™์ธ๋‹ค.

XXXLocal

  • ๋งŒ์•ฝ Room DB๋ฅผ ์‚ฌ์šฉํ•˜๋Š” domain ํด๋ž˜์Šค์— NonNull์ธ ํ•„๋“œ๋ฅผ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด Local Class์—์„œ๋Š” ์–ด์ฉ”์ˆ˜์—†์ด Nullable๋กœ ์„ ์–ธํ•˜๊ณ  mappingํ• ๋•Œ default value๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ
  • ์˜ˆ)
- User์— email์ด ์ถ”๊ฐ€๋˜์–ด์•ผํ•จ
- email์ด NonNull์ด๊ธฐ๋•Œ๋ฌธ์— UserLocal์— ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ• ๋•Œ email์„ NonNull๋กœ ์„ ์–ธํ•ด์•ผ ํ• ๊ฒƒ ๊ฐ™์ง€๋งŒ
- ๊ธฐ์กด์— DB์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ์—๋Š” email ๊ฐ’์ด ์—†์œผ๋ฏ€๋กœ ๊ธฐ์กด์— ์ €์žฅ๋œ db๋ฅผ toData()๋กœ ํ•˜๋ ค๊ณ  ํ• ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•จ
- XXXLocal์˜ class๋Š” ์ƒˆ๋กœ ์ถ”๊ฐ€๋ ๋•Œ ํ•ญ์ƒ Nullable๋กœ ๋งŒ๋“ค๊ณ  toData()๋กœ mapping๋ ๋•Œ ๊ธฐ๋ณธ๊ฐ’์„ ์„ ์–ธํ•ด์ค˜์•ผ ํ•จ

Model Mapping ์ •์˜/๊ตฌ์กฐ

  • Model์€ ๊ฐ๊ฐ์˜ layer์— ๋งŒ๋“ค์–ด์ ธ์„œ mapping๋˜๋„๋ก ๊ตฌ์„ฑํ•œ๋‹ค
  • ์˜ˆ) User๋ผ๋Š” ๊ฐœ๋…์˜ model์— ๋Œ€ํ•œ ๊ฐ๊ฐ layer์—์„œ์˜ ์ •์˜

Data

data class UserResponseDto(){}

fun UserResponseDto.toDomain(): UserEntity

Domain

data class UserEntity(){}
 
fun User.toData(): UserResponseDto
fun UserEntity.toPresentation(): UserModel

Presentation

data class UserModel(){}
 
fun UserModel.toDomain(): UserEntity