๋ชฉํ: Kotlin ๋ฌธ๋ฒ ์ด์ง ๋ณต์ต + Compose ๋ ์ด์์ ์ตํ๊ธฐ
๊ณต๋ถ ๋ฒ์:
- Kotlin: val/var ์ฐจ์ด, ? (Null Safety) ์ฌ์ฉ๋ฒ ๋ค์ ๋ณด๊ธฐ.
- Compose Layout: Column, Row, Box๋ฅผ ์ค์ฒฉํด์ ๊ฐ๋จํ 'ํ๋กํ ์นด๋' ๋ ์ด์์ ๋ง๋ค์ด๋ณด๊ธฐ.
- Modifier: padding, fillMaxWidth, clickable ๊ฐ์ ์์ฃผ ์ฐ๋ ์์ฑ ์์ ์ตํ๊ธฐ.
ํ: ๋์์ธ์ ์์๊ฒ ํ๊ธฐ๋ณด๋ค "์ด๋ป๊ฒ ๋ฐฐ์น๋๋๊ฐ"์ ์ง์คํ์ธ์.
๋ชฉํ: "์ํ๊ฐ ๋ณํด์ผ UI๊ฐ ๋ฐ๋๋ค"๋ ๊ฐ๋ ๋จธ๋ฆฌ์ ๋ฐ๊ธฐ (๊ฐ์ฅ ์ค์ โญ)
๊ณต๋ถ ๋ฒ์:
- remember & mutableStateOf: ๋ฒํผ์ ๋๋ฅผ ๋๋ง๋ค ์ซ์๊ฐ ์ฌ๋ผ๊ฐ๋ ์นด์ดํฐ ๋ง๋ค๊ธฐ.
- State Hoisting: ์ํ๋ฅผ ์์ ํจ์๋ก ์ฌ๋ฆฌ๋ ์ด์ ์ดํดํ๊ธฐ (์ฌ์ฌ์ฉ์ฑ ๋๋ฌธ!).
- TextField: ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ๋ ๊ธ์๊ฐ ํ๋ฉด์ ์ค์๊ฐ์ผ๋ก ๋ฐ์๋๊ฒ ํ๊ธฐ.
ํ: remember๋ฅผ ์ ์ผ์ ๋ ํ๋ฉด์ด ์ ์ ๋ฐ๋๋์ง ์ง์ ํ์ธํด๋ณด์ธ์.
๋ชฉํ: ํ๋ฉด ํ์ ์๋ ๋ฐ์ดํฐ ์ ์งํ๊ธฐ + ๋ฉ์ถ์ง ์๋ ์ฑ ๋ง๋ค๊ธฐ
๊ณต๋ถ ๋ฒ์:
- ViewModel: ์นด์ดํฐ ์ซ์๋ฅผ ViewModel๋ก ์ฎ๊ธฐ๊ธฐ. (ํ๋ฉด์ ๋๋ ค๋ ์ซ์๊ฐ ์ ์ง๋๋์ง ํ์ธ!)
- Coroutines ๊ธฐ์ด: viewModelScope.launch๋ฅผ ์ฌ์ฉํด์ 2์ด ๋ค์ ํ ์คํธ๊ฐ ๋ฐ๋๋ ๊ฐ์ง ๋ก๋ฉ ๊ตฌํํด๋ณด๊ธฐ.
ํ: ๋น๋๊ธฐ๋ "๋คํธ์ํฌ ํต์ ์ด๋ ๋ฌด๊ฑฐ์ด ์์ ์ ๋ฐ๋ก ์ฒ๋ฆฌํ๋ค"๋ ๊ฐ๋ ๋ง ํ์คํ ๊ฐ์ ธ๊ฐ๋ ์ฑ๊ณต์ ๋๋ค.
๋ชฉํ: ์ฑ์ด ๋ฉ์ถ์ง(Freeze) ์๊ฒ ๋ฌด๊ฑฐ์ด ์์ ์ ๋ท๋จ์์ ์ฒ๋ฆฌํ๋ ๋ฒ ์ตํ๊ธฐ
๊ณต๋ถ ๋ฒ์:
- viewModelScope.launch: ViewModel ์์์ ์์ ํ๊ฒ ๋น๋๊ธฐ ์์ ์ ์์ํ๋ ๋ฒ ๋ฐฐ์ฐ๊ธฐ.
- delay(): ๊ฐ์ง ๋ก๋ฉ ์๊ฐ์ ์ฃผ์ด (์: 2์ด) ๋ก๋ฉ ์คํผ๋๊ฐ ๋ํ๋ฌ๋ค ์ฌ๋ผ์ง๋ ํ๋ฆ ๊ตฌํํ๊ธฐ.
- ๋คํธ์ํฌ ํต์ ๋ง๋ณด๊ธฐ: ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ํฉ์ ๊ฐ์ ํ๊ณ , ๋น๋๊ธฐ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ๋ฆฌ์คํธ๋ฅผ ์ ๋ฐ์ดํธํ๋ ๊ตฌ์กฐ ์ดํดํ๊ธฐ.
ํ: "๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋์์๋ ์ฌ์ฉ์๋ ํ๋ฉด์ ๋ง์ง ์ ์์ด์ผ ํ๋ค"๋ ์ ์ ๊ผญ ๊ธฐ์ตํ์ธ์!
๋ชฉํ: ์ฌ๋ฌ ํ๋ฉด์ ๊ฐ์ง ์ฑ์ ๋ผ๋ ๊ตฌ์ฑํ๊ธฐ
๊ณต๋ถ ๋ฒ์:
- NavHost & NavController: ํ๋ฉด ์ด๋์ ์ด๊ดํ๋ ์กฐ์ข ์ฌ์ ์ง๋(Graph) ์ค์ ํ๊ธฐ.
- composable ์ ์: ๊ฐ ํ๋ฉด(์: ๋ฉ์ธ ํ๋ฉด, ์์ธ ํ๋ฉด)์ ๊ฒฝ๋ก(Route) ์ด๋ฆ์ผ๋ก ๋ฑ๋กํ๊ธฐ.
- ๋ฐ์ดํฐ ์ ๋ฌ: ํ๋ฉด์ ๋๊ธธ ๋ ํน์ ์์ด๋๋ ํ ์คํธ๋ฅผ ํจ๊ป ๋ณด๋ด๋ ๊ธฐ์ด ๋ฐฉ๋ฒ ์ตํ๊ธฐ.
ํ: 5๊ต์๊ฐ ๋๋๋ฉด ์๊น ๋ง๋ 'ํ๋กํ ์นด๋'๋ฅผ ํด๋ฆญํ์ ๋ '์์ธ ํ๋กํ ํ๋ฉด'์ผ๋ก ๋์ด๊ฐ๋ ๊ธฐ๋ฅ์ ์์ฑํด ๋ณด์ธ์.
๋ชฉํ: ๊ฐ์ฒด๋ฅผ ๋ด๊ฐ ์ง์ ๋ง๋ค์ง ์๊ณ ์ธ๋ถ์์ ์ฃผ์ ๋ฐ๋ '์๋ ๋ฐฐ๋ฌ ์์คํ ' ๊ตฌ์ถํ๊ธฐ
๊ณต๋ถ ๋ฒ์:
- @HiltAndroidApp & @AndroidEntryPoint: ์ฐ๋ฆฌ ์ฑ์ Hilt๋ผ๋ '์๋ ๋ฐฐ๋ฌ ๋ณธ๋ถ'๋ฅผ ์ค์นํ๊ณ , ๊ฐ ํ๋ฉด(Activity/Fragment)์ด ๋ฐฐ๋ฌ์ ๋ฐ์ ์ ์๋ ์ํ๋ก ์ค์ ํ๋ ๋ฒ ๋ฐฐ์ฐ๊ธฐ.
- @HiltViewModel & inject:
ViewModel์ด ํ์ํ ๋ถํ(Repository ๋ฑ)์ ๋ด๊ฐ ์ง์ newํ๊ฑฐ๋ ์์ฑํ์ง ์๊ณ , Hilt๊ฐ ์์ฑ์(Constructor)๋ฅผ ํตํด ์๋์ผ๋ก ๋ผ์ ๋ฃ์ด ์ฃผ๋ ๊ตฌ์กฐ ์ตํ๊ธฐ. - Repository ํจํด ๊ฒฐํฉ: ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ ์ ๋ด ํด๋์ค(
Repository)๋ฅผ ๋ง๋ค๊ณ , ์ด๋ฅผViewModel์ ์ฃผ์ ํ์ฌ **"๋ฐ์ดํฐ ๊ด๋ฆฌ - ๋น์ฆ๋์ค ๋ก์ง - UI"**๊ฐ ์๋ฒฝํ๊ฒ ๋ถ๋ฆฌ๋ ๊น๋ํ ์ฝ๋ ๋ง๋ค๊ธฐ.
ํ: "๊ฐ์ฒด๋ฅผ ์ง์ ๋ง๋๋ ์๊ณ ๋ฅผ ๋๊ณ , ์ธ๋ถ์์ ๋ฃ์ด์ฃผ๋ ๋ฐฉ์(DI)์ ์ฐ๋ฉด ๋์ค์ ์ฝ๋๋ฅผ ํ ์คํธํ๊ฑฐ๋ ๋ถํ์ ๊ฐ์ ๋ผ์ฐ๊ธฐ๊ฐ ํจ์ฌ ์ฌ์์ง๋ค"๋ ์ ์ ๊ธฐ์ตํ์ธ์!