Skip to content

Latest commit

ย 

History

History
70 lines (41 loc) ยท 3.85 KB

File metadata and controls

70 lines (41 loc) ยท 3.85 KB

1๊ต์‹œ: UI ๊ธฐ๋ณธ๊ธฐ ์žก๊ธฐ

๋ชฉํ‘œ: Kotlin ๋ฌธ๋ฒ• ์‚ด์ง ๋ณต์Šต + Compose ๋ ˆ์ด์•„์›ƒ ์ตํžˆ๊ธฐ

๊ณต๋ถ€ ๋ฒ”์œ„:

  • Kotlin: val/var ์ฐจ์ด, ? (Null Safety) ์‚ฌ์šฉ๋ฒ• ๋‹ค์‹œ ๋ณด๊ธฐ.
  • Compose Layout: Column, Row, Box๋ฅผ ์ค‘์ฒฉํ•ด์„œ ๊ฐ„๋‹จํ•œ 'ํ”„๋กœํ•„ ์นด๋“œ' ๋ ˆ์ด์•„์›ƒ ๋งŒ๋“ค์–ด๋ณด๊ธฐ.
  • Modifier: padding, fillMaxWidth, clickable ๊ฐ™์€ ์ž์ฃผ ์“ฐ๋Š” ์†์„ฑ ์†์— ์ตํžˆ๊ธฐ.

ํŒ: ๋””์ž์ธ์„ ์˜ˆ์˜๊ฒŒ ํ•˜๊ธฐ๋ณด๋‹ค "์–ด๋–ป๊ฒŒ ๋ฐฐ์น˜๋˜๋Š”๊ฐ€"์— ์ง‘์ค‘ํ•˜์„ธ์š”.

2๊ต์‹œ: ์ƒํƒœ ๊ด€๋ฆฌ์™€ ํ™”๋ฉด ์—…๋ฐ์ดํŠธ

๋ชฉํ‘œ: "์ƒํƒœ๊ฐ€ ๋ณ€ํ•ด์•ผ UI๊ฐ€ ๋ฐ”๋€๋‹ค"๋Š” ๊ฐœ๋… ๋จธ๋ฆฌ์— ๋ฐ•๊ธฐ (๊ฐ€์žฅ ์ค‘์š” โญ)

๊ณต๋ถ€ ๋ฒ”์œ„:

  • remember & mutableStateOf: ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค ์ˆซ์ž๊ฐ€ ์˜ฌ๋ผ๊ฐ€๋Š” ์นด์šดํ„ฐ ๋งŒ๋“ค๊ธฐ.
  • State Hoisting: ์ƒํƒœ๋ฅผ ์ƒ์œ„ ํ•จ์ˆ˜๋กœ ์˜ฌ๋ฆฌ๋Š” ์ด์œ  ์ดํ•ดํ•˜๊ธฐ (์žฌ์‚ฌ์šฉ์„ฑ ๋•Œ๋ฌธ!).
  • TextField: ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•˜๋Š” ๊ธ€์ž๊ฐ€ ํ™”๋ฉด์— ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜๋˜๊ฒŒ ํ•˜๊ธฐ.

ํŒ: remember๋ฅผ ์•ˆ ์ผ์„ ๋•Œ ํ™”๋ฉด์ด ์™œ ์•ˆ ๋ฐ”๋€Œ๋Š”์ง€ ์ง์ ‘ ํ™•์ธํ•ด๋ณด์„ธ์š”.

3๊ต์‹œ: ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„๊ณผ ๋น„๋™๊ธฐ

๋ชฉํ‘œ: ํ™”๋ฉด ํšŒ์ „์—๋„ ๋ฐ์ดํ„ฐ ์œ ์ง€ํ•˜๊ธฐ + ๋ฉˆ์ถ”์ง€ ์•Š๋Š” ์•ฑ ๋งŒ๋“ค๊ธฐ

๊ณต๋ถ€ ๋ฒ”์œ„:

  • ViewModel: ์นด์šดํ„ฐ ์ˆซ์ž๋ฅผ ViewModel๋กœ ์˜ฎ๊ธฐ๊ธฐ. (ํ™”๋ฉด์„ ๋Œ๋ ค๋„ ์ˆซ์ž๊ฐ€ ์œ ์ง€๋˜๋Š”์ง€ ํ™•์ธ!)
  • Coroutines ๊ธฐ์ดˆ: viewModelScope.launch๋ฅผ ์‚ฌ์šฉํ•ด์„œ 2์ดˆ ๋’ค์— ํ…์ŠคํŠธ๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฐ€์งœ ๋กœ๋”ฉ ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ.

ํŒ: ๋น„๋™๊ธฐ๋Š” "๋„คํŠธ์›Œํฌ ํ†ต์‹ ์ด๋‚˜ ๋ฌด๊ฑฐ์šด ์ž‘์—…์€ ๋”ฐ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค"๋Š” ๊ฐœ๋…๋งŒ ํ™•์‹คํžˆ ๊ฐ€์ ธ๊ฐ€๋„ ์„ฑ๊ณต์ž…๋‹ˆ๋‹ค.

4๊ต์‹œ: ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์™€ Coroutines

๋ชฉํ‘œ: ์•ฑ์ด ๋ฉˆ์ถ”์ง€(Freeze) ์•Š๊ฒŒ ๋ฌด๊ฑฐ์šด ์ž‘์—…์„ ๋’ท๋‹จ์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฒ• ์ตํžˆ๊ธฐ

๊ณต๋ถ€ ๋ฒ”์œ„:

  • viewModelScope.launch: ViewModel ์•ˆ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฒ• ๋ฐฐ์šฐ๊ธฐ.
  • delay(): ๊ฐ€์งœ ๋กœ๋”ฉ ์‹œ๊ฐ„์„ ์ฃผ์–ด (์˜ˆ: 2์ดˆ) ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ๊ฐ€ ๋‚˜ํƒ€๋‚ฌ๋‹ค ์‚ฌ๋ผ์ง€๋Š” ํ๋ฆ„ ๊ตฌํ˜„ํ•˜๊ธฐ.
  • ๋„คํŠธ์›Œํฌ ํ†ต์‹  ๋ง›๋ณด๊ธฐ: ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•˜๊ณ , ๋น„๋™๊ธฐ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€ ๋ฆฌ์ŠคํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ตฌ์กฐ ์ดํ•ดํ•˜๊ธฐ.

ํŒ: "๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋™์•ˆ์—๋„ ์‚ฌ์šฉ์ž๋Š” ํ™”๋ฉด์„ ๋งŒ์งˆ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค"๋Š” ์ ์„ ๊ผญ ๊ธฐ์–ตํ•˜์„ธ์š”!

5๊ต์‹œ: Navigation - ํ™”๋ฉด ์ด๋™

๋ชฉํ‘œ: ์—ฌ๋Ÿฌ ํ™”๋ฉด์„ ๊ฐ€์ง„ ์•ฑ์˜ ๋ผˆ๋Œ€ ๊ตฌ์„ฑํ•˜๊ธฐ

๊ณต๋ถ€ ๋ฒ”์œ„:

  • NavHost & NavController: ํ™”๋ฉด ์ด๋™์„ ์ด๊ด„ํ•˜๋Š” ์กฐ์ข…์‚ฌ์™€ ์ง€๋„(Graph) ์„ค์ •ํ•˜๊ธฐ.
  • composable ์ •์˜: ๊ฐ ํ™”๋ฉด(์˜ˆ: ๋ฉ”์ธ ํ™”๋ฉด, ์ƒ์„ธ ํ™”๋ฉด)์„ ๊ฒฝ๋กœ(Route) ์ด๋ฆ„์œผ๋กœ ๋“ฑ๋กํ•˜๊ธฐ.
  • ๋ฐ์ดํ„ฐ ์ „๋‹ฌ: ํ™”๋ฉด์„ ๋„˜๊ธธ ๋•Œ ํŠน์ • ์•„์ด๋””๋‚˜ ํ…์ŠคํŠธ๋ฅผ ํ•จ๊ป˜ ๋ณด๋‚ด๋Š” ๊ธฐ์ดˆ ๋ฐฉ๋ฒ• ์ตํžˆ๊ธฐ.

ํŒ: 5๊ต์‹œ๊ฐ€ ๋๋‚˜๋ฉด ์•„๊นŒ ๋งŒ๋“  'ํ”„๋กœํ•„ ์นด๋“œ'๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ '์ƒ์„ธ ํ”„๋กœํ•„ ํ™”๋ฉด'์œผ๋กœ ๋„˜์–ด๊ฐ€๋Š” ๊ธฐ๋Šฅ์„ ์™„์„ฑํ•ด ๋ณด์„ธ์š”.

6๊ต์‹œ: Hilt๋ฅผ ์ด์šฉํ•œ ์˜์กด์„ฑ ์ฃผ์ž… (Dependency Injection)

๋ชฉํ‘œ: ๊ฐ์ฒด๋ฅผ ๋‚ด๊ฐ€ ์ง์ ‘ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ์™ธ๋ถ€์—์„œ ์ฃผ์ž…๋ฐ›๋Š” '์ž๋™ ๋ฐฐ๋‹ฌ ์‹œ์Šคํ…œ' ๊ตฌ์ถ•ํ•˜๊ธฐ

๊ณต๋ถ€ ๋ฒ”์œ„:

  • @HiltAndroidApp & @AndroidEntryPoint: ์šฐ๋ฆฌ ์•ฑ์— Hilt๋ผ๋Š” '์ž๋™ ๋ฐฐ๋‹ฌ ๋ณธ๋ถ€'๋ฅผ ์„ค์น˜ํ•˜๊ณ , ๊ฐ ํ™”๋ฉด(Activity/Fragment)์ด ๋ฐฐ๋‹ฌ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๋กœ ์„ค์ •ํ•˜๋Š” ๋ฒ• ๋ฐฐ์šฐ๊ธฐ.
  • @HiltViewModel & inject: ViewModel์ด ํ•„์š”ํ•œ ๋ถ€ํ’ˆ(Repository ๋“ฑ)์„ ๋‚ด๊ฐ€ ์ง์ ‘ new ํ•˜๊ฑฐ๋‚˜ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ , Hilt๊ฐ€ ์ƒ์„ฑ์ž(Constructor)๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ ๋ผ์›Œ ๋„ฃ์–ด ์ฃผ๋Š” ๊ตฌ์กฐ ์ตํžˆ๊ธฐ.
  • Repository ํŒจํ„ด ๊ฒฐํ•ฉ: ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ „๋‹ด ํด๋ž˜์Šค(Repository)๋ฅผ ๋งŒ๋“ค๊ณ , ์ด๋ฅผ ViewModel์— ์ฃผ์ž…ํ•˜์—ฌ **"๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ - ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง - UI"**๊ฐ€ ์™„๋ฒฝํ•˜๊ฒŒ ๋ถ„๋ฆฌ๋œ ๊น”๋”ํ•œ ์ฝ”๋“œ ๋งŒ๋“ค๊ธฐ.

ํŒ: "๊ฐ์ฒด๋ฅผ ์ง์ ‘ ๋งŒ๋“œ๋Š” ์ˆ˜๊ณ ๋ฅผ ๋œ๊ณ , ์™ธ๋ถ€์—์„œ ๋„ฃ์–ด์ฃผ๋Š” ๋ฐฉ์‹(DI)์„ ์“ฐ๋ฉด ๋‚˜์ค‘์— ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ฑฐ๋‚˜ ๋ถ€ํ’ˆ์„ ๊ฐˆ์•„ ๋ผ์šฐ๊ธฐ๊ฐ€ ํ›จ์”ฌ ์‰ฌ์›Œ์ง„๋‹ค"๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”!