๋ฒ์ ์นดํ๋ก๊ทธ๋ฅผ ๋ฒ ํ๋ก ๋ฐ๊ณ ์๋ค๊ฐ ์์ ๋ฒ๋ฆฌ๊ณ , ์๋ก ๋ง๋๋ ํ๋ก์ ํธ์ ๋ฌด์กฐ๊ฑด ๋ฒ์ ์นดํ๋ก๊ทธ + gradle๋ก ์ ์ฉํ๋๋ก ๋ฐ๋์๋ค... ๋ฐ๋ผ์ toml์ ์ด์ ํ์์ ์ผ๋ก ์์์ผํ๋ค.
๋ jellyfish์์ ์์ฑํ View ํ๋ก์ ํธ์์ ๋ฌ๋ผ์ง ์ฝ๋๋ค์ด ๋งค์ฐ ๋ง์์ ์ด ๋ถ๋ถ๋ค ๋จผ์ ์ก๊ณ ๊ฐ์ผ๊ฒ ๋ค. ์ฌ์ง์ด ๋ฉ์ธ ์กํฐ๋นํฐ๋ ๋ณํ๊ฐ ์๊ฒผ๋ค.
# edge-to-edge ๋์คํ๋ ์ด ๋์
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContentView(R.layout.activity_main)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
}
}
id๊ฐ main์ธ ๊ฒ์ ์ ์ฒด๋ MainActivity์ ์ ์ผ ๋ฐ๊นฅ์ชฝ ConstraintLayout์ด๋ค. ๋๋ฌด ๋ง์ด ๋ฐ๋์ด์ ์ข ํผ๋์ค๋ฌ์ด๋ฐ Activity๊ฐ ๋ฐ๋ ๊ฒ๋ถํฐ ์ดํด๋ณด๊ฒ ๋ค.
์ฐ์ enableEdgeToEdge๋ edge-to-edge ๋์คํ๋ ์ด ๋ชจ๋(์ํ๋ฐ๊น์ง ํ์ฅ๋๋)๋ฅผ ํ์ฑํ ์์ผ์ฃผ๋ ๋ถ๋ถ์ด๋ค. ์ํ๋ฐ์ ์์๋ ์์์ ํฌ๋ช ํ๊ฒ ์กฐ์ ํด์ฃผ๋ ๊ธฐ๋ฅ์ด๋ค.
์ง๊ธ ์ฝ๋์์ setOnApplyWindowInsetsListener๋ ํ์ฌ ๋ ์ด์์์ ํจ๋ฉ์ ๋์ ์ผ๋ก ๊ฒฐ์ ํด์ฃผ๋ ์์๋ค. ์ด๊ฒ ์ ํ์ํ๋๋ฉด ์ง๊ธ edge-to-edge๋ฅผ ํ์ฑํ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ํ๋ฐ๋ ๋ฌผ๋ก ์ด๊ณ ์์คํ ๋ค๋น๊ฒ์ด์ ๋ฐ ์์น๊น์ง ํ์ฅ๋ ๊ฑด๋ฐ ๊ทธ๋ฌ๋ฉด ์ฑ์ UI ์ค ๋ค๋น๊ฒ์ด์ ๋ฐ ๋๋ฌธ์ ์ฌ์ฉํ ์ ์๋ ๋ถ๋ถ์ด ์๊ธด๋ค. ๊ทธ๊ฑธ ๋ง๊ธฐ์ํด inset ์ค์ ์ ํ๋๊ฒ ์ด ๋ฆฌ์ค๋๋ค.
insets๋ฅผ ๊ผญ ๋ฐํํด์ค์ผ ์์คํ ์ด ์์๋จน๋๋ค. insets์ ๋ฐํํ๋ฉด ๋ค๋ฅธ ๋ทฐ(๊ณ์ธต๊ตฌ์กฐ์์ผ๋ก ์กด์ฌํ๋)๋ค๋ ์ด id๋ก ์ง์ ํด๋ insets์ ๊ฐ์งํ๋ค๋ ์๋ฏธ์ด๊ณ WindowInsetsCompat.CONSUMED๋ฅผ ๋ฐํํ๋ฉด ๋ค๋ฅธ ๋ทฐ๋คํํ inset ๋ณ๊ฒฝ์ฌํญ์ ์๋ฆฌ์ง์๋๋ค๋ ์๋ฏธ๊ฐ ๋๋ค.
๊ผญ ๋ ์ด์์์ผ๋ก ๋ฌ ํ์์์ด ์์คํ ์์์ ๊ฐ๋ ค์ง์ง ์๊ธธ ์ํ๋ฉด ์ด๋ ๊ฒ ์ฌ์ฉํ ์ ์๋ค. systemBars์ ์ํ๋ ์์๋ ์ํํ์์ค, ๋ค๋น๊ฒ์ด์ ๋ฐ, ์บก์ ๋ฐ๊ฐ ์๋ค. ํค๋ณด๋์ ํด๋นํ๋ IME๋ ์ฌ๊ธฐ์ ๋ค์ด๊ฐ์ง์๋๋ค.
https://developer.android.com/develop/ui/views/layout/edge-to-edge?hl=ko
# toml(Tom's Obvious Minimal Language) + version catalog
gradle ๋ฌ๋ผ์ง๊ฑฐ ๋จผ์ ๋ณด์... ๋ค alias๋ก toml์ ์ ์ธ๋ ๊ฐ์ ๊ฐ์ ธ์ค๋ ๋ฐฉ์์ด๋ค. ๋ฒ์ ์นดํ๋ก๊ทธ๋ฅผ ์ฌ์ฉํ ๋๋ buildscript ๋ธ๋ก๊ณผ classpath๋ฅผ ์ง์ ์ฌ์ฉํ์ง ์๋๋ค. ๋์ plugins ๋ธ๋ก์ ์ฌ์ฉํ์ฌ ํ๋ฌ๊ทธ์ธ์ผ๋ก ๋ค ์ฒ๋ฆฌํ๋ค๊ณ ํ๋ค...
// project ์์ค gradle
plugins {
alias(libs.plugins.android.application) apply false
alias(libs.plugins.jetbrains.kotlin.android) apply false
}
// app ์์ค gradle
plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.jetbrains.kotlin.android)
}
android {
namespace = "com.kimmandoo.hilt"
compileSdk = 34
defaultConfig {
applicationId = "com.kimmandoo.hilt"
minSdk = 28
targetSdk = 34
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
}
dependencies {
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.appcompat)
implementation(libs.material)
implementation(libs.androidx.activity)
implementation(libs.androidx.constraintlayout)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
}
buildSrc๋ฅผ ์ฌ์ฉํ ๋ ๋ณด๋ค ๋ ๊ฐ๋จํด์ง ๊ฒ ๊ฐ๋ค. libs.versions.toml ํ์ผ ํ๋์์ ๋ชจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์กด์ฑ์ ๊ด๋ฆฌํ๋ค.
versions, libraries, plugins ์ธ ๋ถ๋ถ์ผ๋ก ๋๋์ด์ ธ ์๊ณ , ๋ณด๊ณ ์ดํด๋ชปํ ์ ๋๋ก ๋ณต์กํ๊ฒ ๊ธฐ์ ๋์ด์์ง ์๋ค.
[versions]
agp = "8.4.1"
kotlin = "1.9.0"
coreKtx = "1.10.1"
junit = "4.13.2"
junitVersion = "1.1.5"
espressoCore = "3.5.1"
appcompat = "1.6.1"
material = "1.10.0"
activity = "1.8.0"
constraintlayout = "2.1.4"
[libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
junit = { group = "junit", name = "junit", version.ref = "junit" }
androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" }
androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" }
androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" }
material = { group = "com.google.android.material", name = "material", version.ref = "material" }
androidx-activity = { group = "androidx.activity", name = "activity", version.ref = "activity" }
androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" }
[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
์ด์ ์ด๋ป๊ฒ ์๊ธด์ง๋ ํ์ธํ๊ณ , gradle์ ์ด๋ป๊ฒ ์ถ๊ฐํ ์ง๋ฅผ ์ค์ตํด๋ด์ผํ๋ค. hilt๋ฅผ ์ถ๊ฐํด๋ณด๋ฉด์ ์ ์ฉํด๋ณด๊ฒ ๋ค.
# Hilt ์ถ๊ฐํ๊ธฐ
Hilt๋ ์์กด์ฑ ์ฃผ์ (DI) ๋๊ตฌ๋ก ์ด๋ ธํ ์ด์ ๊ธฐ๋ฐ์ด๊ณ ๋ฏธ๋ฆฌ ์ ํด์ง ์ปดํฌ๋ํธ(ํ์ค ์ปจํ ์ด๋)๊ฐ ์์ด์ ๊ทธ๊ฑธ ์ด๋ ธํ ์ด์ ์ผ๋ก ์ง์ ํด์ ์ฐ๋ ํํ์ด๋ค.
https://dagger.dev/hilt/gradle-setup
๋๋ ์ด๋ ธํ ์ด์ ํ๋ก์ธ์๋ก ksp๋ฅผ ์ฌ์ฉํ๋ค.
hilt๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด ๋ฃจํธ์์ค, ๋ชจ๋ ์์ค gradle ํ์ผ์ ํ๋ฌ๊ทธ์ธ์ ์ถ๊ฐํ๊ณ , ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ dependency์ ์ถ๊ฐํด์ค์ผํ๋ค. toml ๋ฐฉ์์ ์ฌ์ฉํ๋ค๊ณ ํด์ ์ด์ ์ ์ฌ์ฉํ๋ ๋ฐฉ์์ ์ฌ์ฉํ์ง ๋ชปํ๋ ๊ฑด ์๋๋ผ์, ๋ณต์กํ๊ฒ ์ซ๋ค๋ฉด ๊ทธ๋ฅ ๋ฌธ์๋๋ก ์ถ๊ฐํ๋ฉด ๋๋ค.
[versions]
hilt = "2.51.1"
ksp = "1.9.0-1.0.13"
[libraries]
hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt" }
hilt-compiler = { group = "com.google.dagger", name = "hilt-compiler", version.ref = "hilt" }
hilt-android-testing = { group = "com.google.dagger", name = "hilt-android-testing", version.ref = "hilt" }
[plugins]
hilt-gradle-plugin = { id = "com.google.dagger.hilt.android", version.ref = "hilt" }
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
๋ฌธ์์ ์๋ ๊ฑธ toml๋ฐฉ์์ผ๋ก ๋ฐ๊ฟ์ ์ถ๊ฐํ๋ค. ์ฌ์ฉ๋ dash(-)๋ ๋์ค์ (.)์ผ๋ก ์ฐธ์กฐํ๊ฒ๋๋ค. ๋๋ ์ฝํ๋ฆฐ ๋ฒ์ ์ด 1.9.0์ด๋ผ์ ksp๋ฒ์ ์ 1.9.0-1.0.13์ผ๋ก ๋ง์ถฐ์คฌ๋ค.
์ด๋ ๊ฒ ์ถ๊ฐํด์คฌ๋ค๋ฉด ํ๋ก์ ํธ ์์ค gradle์ ์๋์ฒ๋ผ ์ถ๊ฐํ๋ค. apply false๋ ํ๋ก์ ํธ ๋ด ๋ชจ๋์ ์ ์ฒด์ ์ฉํ ์ง ๋ฌผ์ด๋ณด๋๊ฑด๋ฐ ๋ณดํต false๋ก ๋๋ค.
plugins {
alias(libs.plugins.android.application) apply false
alias(libs.plugins.jetbrains.kotlin.android) apply false
alias(libs.plugins.hilt.gradle.plugin) apply false
alias(libs.plugins.ksp) apply false
}
๋ชจ๋ ์์ค gradle์ plugin์๋ ์๋์ฒ๋ผ ์ถ๊ฐํ๋ค.
plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.jetbrains.kotlin.android)
alias(libs.plugins.ksp)
alias(libs.plugins.hilt.gradle.plugin)
}
๊ทธ๋ฆฌ๊ณ dependeny๋ฅผ ์๋์ฒ๋ผ ์ถ๊ฐํ๋ฉด ๋์ด๋ค.
dependencies {
...
// hilt
implementation(libs.hilt.android)
ksp(libs.hilt.compiler)
androidTestImplementation(libs.hilt.android.testing)
kspAndroidTest(libs.hilt.compiler)
}
ํ๊ฐ์ง ์ฃผ์ํ ์ ์ tomlํ์ผ์ ์ ์ธํ๊ณ ๋์ gradle sync๋ฅผ ํด์ค์ผ gradle ํ์ผ์ plugin ์ถ๊ฐํ ๋ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ๋ผ๊ฐ๋ค.
์ด๋ฌ๋ฉด ํ์์ฌํญ์ ๋ค ๋ง์ณค๋ค(test๋ ์ ํ์ฌํญ).
kapt๋ฅผ ๊ธฐ์กด์ ์ด์ฉํ๋ ์ฌ๋๋ค์ corretErrorTypes๊น์ง ์ฒ๋ฆฌํด์คฌ์ํ ๋ฐ ksp๋ ์๋ฐ ๋ณํ ๊ณผ์ ์ด ์์ด์ ์ด๊ฑธ ์๋ฌ์ ์ค๋ ๋๋ค.
toml... ๋ญ๊ฐ ํธํ๋ฏ ์ํธํ๊ธดํ๋ฐ renovatebot๊ฐ์ ๋๊ตฌ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ํ๋ค๋ฉด ๊ผญ ํ์ํ ๊ธฐ๋ฅ์ฒ๋ผ ๋ณด์ธ๋ค.
๋์์ด ๋๋ค๋ฉด ๋๊ธ์ด๋ ๊ณต๊ฐ ๋ฒํผ ํ ๋ฒ์ฉ ๋๋ฅด๊ณ ๊ฐ์ฃผ์ธ์!
'Android ๐ฅ๏ธ > DI๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
@Provides ์ @Binds (0) | 2024.08.02 |
---|---|
Hilt(3) - ๋ฉํฐ ๋ฐ์ธ๋ฉ (0) | 2024.07.05 |
Hilt(2) - ๋ฐ์ธ๋ฉ๊ณผ ์์กด์ฑ ์ฃผ์ (0) | 2024.07.05 |
Hilt(1) (0) | 2024.06.22 |
DI ์ ๋ฌธ - ์ข ์ ํญ๋ชฉ ์ฝ์ (0) | 2024.03.07 |