๋ก๊ทธ์ธ์ด ๊ตฌํ๋ fragment์์ ๊ฐ์ ๋์ง์์ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ ์๋๋ฅผ ํ ๋, ์นด์นด์ค ๋ก๊ทธ์ธ์์ ๋ฐํ ๋ฐ์ access token์ ํ์๊ฐ์ ํ์ด์ง๋ก ๋๊ฒจ์ผํ๋๋ฐ, ์ด๋ ์๋ก ๋ค๋ฅธ Fragment๋ก ์์ฑ๋์ด ์๋๋ฐ๋ค viewmodel๋ ๊ณต์ ํ๊ณ ์์ง์์์ ๊ณจ์น๊ฐ ์ํ ๋ค. datastore๋ฅผ ์ด์ฉํด access token์ ์ ์ฅํ๋ ๊ฑด ๋ฏธ๋ฆฌ ์ง ๋์์ง๋ง, ๊ฐ๋จํ๊ฒ ํ๋๊ทธ๋จผํธ๋ผ๋ฆฌ ๊ฐ์ ๋๊ธฐ๋ ๋ฐฉ๋ฒ์ด ์์๊น ๊ณ ๋ฏผํ๋ ์ค, ํ๋ก์ ํธ ํ์ฅํ์ด safe args๋ผ๋ ํค์๋๋ฅผ ์๋ ค์ฃผ์ จ๋ค.
safe args๋ android jetpack navigation component์ ์ํ ํ๋ฌ๊ทธ์ธ ์ค ํ๋์ด๊ณ , navigation์ ํ์ ๊ทธ๋ํ ์์ค์ฝ๋์ action์ ๊ฐ์ ๋ด์์ ๋๊ธฐ๋ ์์ฃผ ํ๊ธฐ์ ์ธ ๊ธฐ๋ฅ์ ๊ฐ๊ณ ์๋ค.
๋์ ์ฌ์ด์์ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๊ณ ์ ๋ฌํ ๋ ์ ํ ์์ ์ฑ์ ์ ๊ณตํ๋ ๊ทธ๋ํ ํ๋ฌ๊ทธ์ธ์ ๋๋ค. ์ธ์๋ฅผ ํตํด ๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ์ํฐํจํด์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ๊ฐ ๋์์ ํญ๋ชฉ ID์ ๊ฐ์ด ํ์ํ ์ต์ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก UI ๋ฐ์ดํฐ ๋ก๋๋ฅผ ๋ด๋นํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ํ๋ก์ธ์ค ์ฌ์์ฑ์ด ๊ฐ์ํ๋๊ณ ์ ์ฌ์ ๋ฐ์ดํฐ ๋ถ์ผ์น๊ฐ ๋ฐฉ์ง๋ฉ๋๋ค.
๋ด ๊ฒฝ์ฐ์๋ string์ผ๋ก ๋ ๊ฐ์ ๋๊ธฐ๋ฉด ๋๋ ์ํฉ์ด๋ผ ์ฌ์ฉํ๊ธฐ ์ ํฉํ ์กฐ๊ฑด์ด๋ค. ์ด์ ์ฌ์ฉ๋ฐฉ๋ฒ์ ์์๋ณด์
Safe Args ์ฌ์ฉ๋ฒ
gradle ํ๋ฌ๊ทธ์ธ์ด๋ค ๋ณด๋, gradle์ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ์๋ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ด๊ณ , ๊ทธ ๋๋ bundle์ ์ด์ฉํด ๊ฐ์ ๋๊ฒจ์ผํ๋ค.
์ต์์ gradle ํ์ผ(ํ๋ก์ ํธ ์์ค)์ classpath ์ค์ ์ ์ถ๊ฐํ๋ค.
buildscript {
repositories {
google()
}
dependencies {
val nav_version = "2.5.3"
classpath("androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version")
}
}
nav_version์ ๊ณ์ ์ ๋ฐ์ดํธ ๋ ๊ฒ์ด๋ฏ๋ก version catalog๋ ๋ฐ๋ก buildSrc ๋ชจ๋์ ๋ง๋ค์ด์ ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ ์ง ๋ณด์์ ์ข๋ค.
์ฌ์ฉํ app / presentation ๋ชจ๋์ ์๋ dependency๋ฅผ ์ถ๊ฐํด์ค๋ค.
plugins {
id("androidx.navigation.safeargs.kotlin")
}
AndroidX ํจํค์ง์ด๊ธฐ ๋๋ฌธ์ gradle.propertiesํ์ผ์ android.useAndroidX=true๊ฐ ์์ด์ผํ๋ค. ์ต๊ทผ ์์ฑํ ํ๋ก์ ํธ๋ผ๋ฉด ์ด๋ฏธ ๋ค์ด๊ฐ ์์ ๊ฒ์ด์ง๋ง ์์ ์ ์์ฑํ ํ๋ก์ ํธ๋ผ๋ฉด ์์ ์๋ ์๋ค.
์ด์ ์ฝ๋๋ก ๋์๊ฐ๋ฉด, ์ก์ (๋ฐ์ )๋์ ํ๋๊ทธ๋จผํธ์์ ํ๋๊ทธ๋จผํธ ์ด๋ฆ + Directions๊ฐ ์์ฑ๋๋ค. ์ด์ ๊ฐ์ ๋๊ธธ ์ค๋น๋ฅผ ํ๊ฒ ๋ค. ๋จผ์ ๊ฐ์ ๋ด์์ ๋๊ธธ action์ ์ธ์๋ฅผ ์ค์ ํ๋ค.
<action
android:id="@+id/action_loginFragment_to_signupFragment"
app:destination="@id/signupFragment">
<argument
android:name="acToken"
app:argType="string"/>
</action>
์ด action์ ๋ฐ์ ๋์์์ ์ฌ์ฉํ๋ action์ด๋ค. ์์ ๋์๋ argument๋ฅผ ์ค์ ํด์ค์ผํ๋๋ฐ, ์์ ๋์์ fragment์์ ๊ฐ์ ๋ฐ๊ธฐ ๋๋ฌธ์ argument์ ์์น๊ฐ action์ด ์๋ fragment์ด๋ค.
<fragment
android:id="@+id/signupFragment"
android:name="com.shypolarbear.presentation.ui.join.JoinFragment"
android:label="SignupFragment"
tools:layout="@layout/fragment_signup">
<argument
android:name="acToken"
app:argType="string"/>
</fragment>
์ด๊ฒ ์์ ๋์์ ์ค์ ์ด๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํ๋๊ทธ๋จผํธ์ด๋ฆ + Args์ฝ๋๊ฐ ์์ฑ๋์ด ์ ๊ทผํ ์ ์๋ค.
์ฝ๋๋ก ๋์๊ฐ์, action์ argument๊ฐ์ ๋ฃ์ด์ ์ฌ์ ์ํ๋ค.
sendTokenToJoin = LoginFragmentDirections.actionLoginFragmentToSignupFragment(token.accessToken)
Directions์ ๋ฉ์๋๋ก action id๊ฐ ์กํ๊ณ , ์ธ์์ ์ฌ์ฉํ ๊ฐ์ ๋ฃ์ผ๋ฉด ๋๋ค. ๋ด ์ฝ๋์์ sendTokenToJoin์ NavDirection Type์ผ๋ก, ๋ฐ๋ก navigateํ๋ ์ฝ๋๊ฐ ์๊ธฐ๋๋ฌธ์ ๊ฑฐ๊ธฐ์ ์ฌ์ฉํ๊ธฐ ์ํดlateinit var ์ ์ธํด๋๋ค.
์์ ์ชฝ์์๋ ๋ ๊ฐ๋จํ๋ค. ktx๊ณ์ด dependency๋ฅผ ์ฌ์ฉ์ค์ด๋ผ๋ฉด(์๋ง ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉ์ค์ด๋ผ๋ฉด android-ktx๋ฅผ ์ฐ๊ณ ์์ ํ๋ฅ ์ด ๋๋ค.) by navArgs()๋ฅผ ์ด์ฉํด ๊ฐ์ ๋ฐ์์ฌ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค.
private val args: JoinFragmentArgs by navArgs()
val acToken = args.acToken
์์ ๋์์ ์ฝ๋๋ค. ํ์ ๊ทธ๋ํ ui์์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง ๋๋ ์ฝ๋๋ก ์์ ํ๋ ๊ฒ ํธํด์ ์ด๋ ๊ฒ ์งํํ๋ค.
Safe Args ์ฌ์ฉ์ด์
๊ณต์๋ฌธ์๋ฅผ ๋ณด๋ฉด ์ ํ ์์ ์ฑ์ด๋ผ๋ ๋จ์ด๊ฐ ๋์จ๋ค. ์ด๊ฒ ๋ฒ์ญ์ด ์ด์ํด์ ๊ทธ๋ฐ๊ฑด๋ฐ Type Safety๊ฐ ์๋ฌธ์ ์ ํ์๋ ๋จ์ด๋ค.
safe args๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ ๊ทธ๋ํ ์ธ์์ ๋ํ ์ ๋ณด๋ฅผ ์ปดํ์ผ๋ฌ๊ฐ ํ์ธํ๊ธฐ ๋๋ฌธ ์ปดํ์ผ ์์ ์ ์๋ฌ๋ฅผ ๋ฐ๊ฒฌ ํ ์ ์์ด์ ๋ฐํ์ ์๋ฌ๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
(10/11 ์ถ๊ฐ) Safe Args๋ฅผ ์ฐ๋ฉด์ DataClass๋ฅผ ๋๊ธฐ๋ ๋ฒ
์์ํ์ ๋ง ๋๊ธฐ๋ ๊ฒ ์๋๋ผ DataClass๋ก ๋๊ธฐ๊ณ ์ถ๋ค๋ฉด Parcelable๋ก ์ ์ธํ๋ ๊ณผ์ ์ด ํ์ํ๋ค.
@Parcelize
data class StoreDataArgs(
val storeId: Int,
val storeName: String,
val imageUrl: String
): Parcelable
Parcelable๋ก ์ ์ธํด์ค์ ์ง๋ ฌํ/์ญ์ง๋ ฌํ ๊ณผ์ ์๋ ์ฌ์ฉํ ์ ์๊ฒ data class๋ฅผ ์์ฑํ๋ค์
<action
android:id="@+id/action_navigation_map_to_navigation_detail"
app:destination="@id/navigation_detail">
<argument
android:name="storeInfo"
app:argType="com.suchelin.android.util.parcelable.StoreDataArgs"/>
</action>
argType์ data class ์์น๋ฅผ ๋ฃ์ผ๋ฉด ๋๋ค. ์๋์ผ๋ก ํ๋ฉด ํท๊ฐ๋ฆด์๋ ์์ผ๋ ์ด๋๋ ๋๊ตฌ๋ฅผ ์ฐ๋ ๊ฒ์ ์ถ์ฒํ๋ค.
Attributes์ add arguments๋ฅผ ๋๋ฅด๋ฉด ์ด๋ ๊ฒ custom parcelable๋ฅผ ์ง์ ํ ์ ์๊ณ IDE๊ฐ ์ฐพ์์ค๋ค.
์ฐธ์กฐ:
https://developer.android.com/guide/navigation/navigation-pass-data?hl=ko
"๋๊ธ, ๊ณต๊ฐ ๋ฒํผ ํ ๋ฒ์ฉ ๋๋ฅด๊ณ ๊ฐ์ฃผ์๋ฉด ํฐ ํ์ด ๋ฉ๋๋ค"