1. 의존성 관리?
안드로이드 앱을 개발하다 보면 수많은 라이브러리를 활용하게 됩니다. 가장 손쉽게는 제이크 와튼 형님의 Butter Knife가 있고 좀 더 고급 사용자들은 Dagger, RxJava나 Retrofit 같은 라이브러리를 참조하기도 합니다. build.gradle 파일에 다음 내용만 넣으면 간편하게 끝납니다.
예를 들어, Buffer Knife 홈페이지에는 다음과 같은 내용이 나옵니다.
compile 'com.jakewharton:butterknife:8.7.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.7.0'
보통은 그대로 따라하면 잘됩니다. 앞의 내용은 ‘아.. 최신 버전이 8.7.0이구나’라고 생각하면 됩니다. 그 내부에는 어떤 내용이 있을까요?
2. 누가 다운로드해주지?
build.gradle 파일에 지정한 의존성을 처리하는 것은 그레이들 래퍼(Gradle Wrapper)가 담당합니다. 정확하게 구분하면 그레이들 래퍼는 그레이들 바이너리의 버전만 담당하고 나머지 버전 관리는 로컬에 있는 그레이들 바이너리에서 담당하지만, 버전 관리 맥락에서 보면 동일한 동작이므로 그레이들 래퍼에서 모두 담당한다고 보셔도 됩니다. 예를 들어, 이전에는 7.0.1을 사용하다 Butter Knife 버전을 최신 버전(8.7.0)으로 올렸다고 해봅시다. 이런 비슷한 내용이 나옵니다.
그레이들 래퍼가 build.gradle 파일에 지정된 버전명을 확인하고 내 로컬에 해당 버전이 있는지 확인합니다. 해당 버전이 없으면는 경우 8.7.0 버전을 다운로드하게 됩니다. 그레이들 래퍼는 크게 세 가지 프로그램의 버전 관리를 담당합니다. 앞에서 다룬 것처럼 버전의 숫자만 올려주면 됩니다.
그리고 빌드하게 되면 그레이들 래퍼가 동작하며 다음과 비슷한 내용이 나옵니다.
"downloading Butter Knife 8.7.0 .................. "
1) 그레이들 버전 : 예) 안드로이드 스튜디오 3.0 버전은 최소 gradle 3.5를 요구합니다.
2) 안드로이드 플러그인 버전 : 예) 안드로이드 스튜디오 버전에 맞춰 3.0 버전으로 올라가게 됩니다.
3) 외부 라이브러리 버전 : 예) Butter Knife 8.7.0 등
첫 번째는 프로젝트의 /gradle/wrapper/gradle-wrapper.properties 파일에 기술합니다.
두 번째는 프로젝트의 build.gradle 파일에 적습니다.
세 번째는 모듈(예, app)의 build.gradle 파일에 적습니다.
사용자 입장에서는 한 곳에서 모두 적으면 좋겠다는 생각이 듭니다. 아마도 나눠놓은 이유는 3 > 2 > 1 순으로 활용빈도가 다르기 때문에 그런 것 같습니다. 3번은 수시로 변하고 2번은 안드로이드 스튜디오나 OS를 업그레이드하면 변하고 1번은 2번을 업데이트하기 위한 전제조건(requirement)일 때 변하기 때문입니다.
3. 어디에 다운로드할까?
다음으로 궁금한 그레이들 래퍼가 로컬의 어느 공간에 다운로드하는지를 알아봅니다. 사실 그레이들은 이것을 사용자가 신경쓰지 않게 하는 것이 목표입니다. 따라서 프로젝트 디렉터리가 아닌 되도록 눈에 띄지 않는 곳에 바이너리를 저장하고 있습니다. 윈도 OS를 기준으로 설명드리겠습니다.(리눅스도 별로 다르지는 않습니다.)
예를 들어, 제 PC에서는 Butter Knife 8.7.0 라이브러리를 다음 경로에 다운로드했습니다.
구체적인 경로명은 중요한 것이 아닙니다. 심지어는 이 폴더를 보면 다음과 같이 알 수 없는 폴더들이 함께 추가되어 있습니다.
8894...
b42823...
d9e327...
eeaddd...
이것은 무엇일까요? 그레이들 관련 문서를 보면 이것은 다운로드한 바이너리의 해시(hash) 값입니다. 이는 내가 받은 라이브러리의 바이너리가 오염되지 않았다는 증거 자료로 생각하면 됩니다. 어쩌다 보면 라이브러리의 동일한 버전이 로컬에 있는데 다시 다운로드하는 경우가 있습니다. 그때는 해시값이 맞지 않았기 때문입니다.
4. 어떻게 다운로드할까?
이제 마지막 궁금증으로 왔습니다. 그레이들 래퍼는 어떤 정보를 참고하여 라이브러리를 다운로드할까요? 라이브러리 홈페이지라도 알고 있는 것일까요? (실제로 그럴 수는 없겠죠^^;;;)
그레이들 래퍼는 저장소(repositories)를 참조합니다. 무심코 넘어간 build.gradle 파일에 해답이 있습니다.
Hello World의 프로젝트 build.gradle 파일에 보면 다음 내용이 있습니다.
repositories {
maven { url 'https://maven.google.com' }
jcenter()
}
이것은 어떤 내용일까요? 다운로드할 때 다음 저장소를 참조하라는 것입니다. 즉, 다음 저장소에 내가 원하는 Butter Knife 8.7.0이 없으면 다운로드에 실패하게 됩니다.
1) https://maven.google.com
2) jcenter() ???
첫 번째 저장소는 URL 명시되어 있으므로 이해가 됩니다. 그런데 두번째 jcenter()는 무엇일까요? 이것은 JCenter라는 메이븐저장소입니다.
Butter Knife 8.7.0은 실제로 다음 경로에 존재합니다.
http://jcenter.bintray.com/com/jakewharton/butterknife/8.7.0/
[그림 2]에서도 4개가 있죠? [그림 1]에서 8894.. 같은 해시값이 4개인 이유는 [그림 2]의 파일들을 다운로드했기 때문입니다.
이제 궁금증이 해소되었나요?
오늘은 그레이들 래퍼를 중심으로 그레이들이 어떻게 외부 라이브러리 의존성을 관리하는지 알아보았습니다. 다음에는 androidDependencies 태스크 활용과 라이브러리 버전 충돌(version conficts)에 대해서 알아보겠습니다.
저자 블로그(원본 링크) https://brunch.co.kr/@yudong/73
최신 콘텐츠