dependencies 블록이란?
dependencies 블록은 프로젝트를 구성하기 위해 받아와야 할 라이브러리를 정의해놓는 공간이다. dependencies 블록에는 보통 다음과 같은 문법이 들어간다.
dependencies {
implementation("androidx.navigation:navigation-compose:2.4.0-rc01")
}
*위는 build.gradle.kts 기준이다. groovy에서는 보통 접은글과 같이 쓴다.
groovy에서는 보통 다음과 같이 쓴다.
dependencies {
implementation "androidx.navigation:navigation-compose:2.4.0-rc01"
}
위와 같은 implementation을 정의하면 앱 실행, 패키징, 테스팅 등 모든 task에서 androidx.navigation 라이브러리를 받아온다. 자 이것이 어떻게 동작하는지 하나하나 살펴보자.
implementation, testImplementation, androidTestImplementation, debugImplementation의 차이는 무엇인가?
예를 들어 다음과 같은 dependencies가 있다고 해보자. 여기서 라이브러리 앞에 붙은 implementation, testImplementation, androidTestImplementation, debugImplementation 은 각 라이브러리들이 적용될 범위(scope)를 뜻한다.
dependencies {
implementation("androidx.compose.ui:ui-tooling-preview:$compose_version")
testImplementation("org.jetbrains.kotlin:kotlin-test-junit")
androidTestImplementation("androidx.compose.ui:ui-test-junit4:$compose_version")
debugImplementation("androidx.compose.ui:ui-tooling:$compose_version")
}
implementation은 전 범위에 걸쳐서 적용되며, testImplementation 은 테스트 시에만 적용되고, androidTestImplementation은 안드로이드 테스트가 수행될 때만 적용되며, debugImplentation은 디버그 모드에서만 적용된다.
어플리케이션을 개발할 때(웹앱, 모바일 앱, 백앤드 앱 등) 릴리즈, 디버그, 테스트 범위(scope)별로 다른 라이브러리가 들어가야 하는데 범위(scope) 별로 라이브러리를 넣는 것을 쉽게 하기 위해 Gradle에서 미리 정해놓은 키워드가 바로 implementation, testImplementation, androidTestImplementation, debugImplementation인 것이다. 만약 라이브러리가 적용될 범위를 정하지 못한다면, 릴리즈를 위한 앱 번들에 테스트용 라이브러리, 디버그용 라이브러리들이 들어가 앱 번들의 크기가 매우 커질 것이다.
*대표적인 scope는 다음과 같다.
Scope | keyword |
compile | implementation, api |
compile only | compileOnly |
debug | debugImplementation |
runtime | runtimeOnly |
test | testImplentation, testCompileOnly, testRunTimeOnly |
android test | androidTestImplementation |
라이브러리의 구성
라이브러리가 적용될 범위를 정했으면 어떤 라이브러리를 넣을지 정해야 한다. 라이브러리 이름은 Package, Artifact, Version 세가지로 이루어진다. package에는 소스코드가 작성된 패키지 명이 오며, Artifact Id에는 이 라이브러리의 고유한 명칭(Id)이 온다, Version에는 버전 명칭이 온다. Package와 Artifact를 둘다 쓰는 이유는 일부 라이브러리들의 경우 Package명이 같은 경우가 있기 때문이다. 예를 들어 WebRTC 라이브러리의 경우 인터페이스만이 정의되어 있어서 그 내부를 구현한 회사 또는 개인에 따라 Artifact Id를 다르게 써서 구분한다.