brunch

You can make anything
by writing

C.S.Lewis

[Gradle] #3 그레이들의 의존성 관리

들어가는 글: 본 연재를 한빛 미디어의 "Channel. H "에도 동시연재하기로 하였습니다. 이미 배포한 1, 2화와 함께 앞으로는 다음의 링크에서도 볼 수 있습니다. 편집과정에서 보니 은근 맞춤법 or 문장호응 부분에서 비문이 섞여 있더라구요. 좀더 잘 쓰도록 하겠습니다 ㅎㅎㅎㅎ   


채널H의 "안드로이드를 위한 Gradle" 기획 연재 : 

http://www.hanbit.co.kr/channel/series/series_detail_list.html?hcs_idx=19 


1. 의존성 관리? 


안드로이드 앱을 개발하다보면 수많은 라이브러리를 활용하게 됩니다. 가장 손쉽게는 제이크 와튼 형님의 Butter Knife가 있고 좀더 고급 사용자들은 Dagger, RxJava나 Retrofit 같은 라이브러리를 참조하기도 합니다. 그레이들을 활용하면서 다음의 내용만 넣으면 간편하게 끝납니다.  


예를 들어 Buffer Knife 홈페이지에는 아래의 내용이 나옵니다.

http://jakewharton.github.io/butterknife/  

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)으로 올렸다고 해봅시다. 앞에서 다루었던 것 처럼 버전의 숫자만 올려주면 됩니다. 


그리고 빌드를 하게 되면 그레이들 래퍼가 동작합니다. 

"downloading Butter Knife 8.7.0 .................. " 

이런 비슷한 내용이 나옵니다. 


그레이들 래퍼가 build.gradle 파일에 지정된 버전명을 확인하고 내 로컬에 해당 버전이 있는지 확인합니다. 해당 버전이 없는 경우 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를 upgrade하면 변하고 1번은 2번을 업데이트 하기 위한 전제조건(requirement)일때 변하기 때문입니다.  


3. 어디에 다운받을까? 


이제 궁금한 것은 그레이들 래퍼가 로컬의 어느 공간에 다운받는지를 알아봅니다. 사실 그레이들은 그것을 사용자가 신경쓰지 않도록 하는 것이 목표입니다. 따라서 프로젝트 디렉토리가 아닌 되도록 눈에 띄지 않는 곳에 바이너리를 저장하고 있습니다. 윈도우 OS를 기준으로 설명드리겠습니다. (리눅스의 경우도 크게 다르지는 않습니다.) 


예를 들어 Butter Knife 8.7.0 라이브러리는 제 PC의 아래 경로에 다운로드 받았습니다. 

C:\Users\gp62\.gradle\caches\modules-2\files-2.1\com.jakewharton\butterknife\8.7.0


구체적인 경로명은 중요한 것이 아닙니다. 심지어는 위의 폴더를 보면 

[그림1] 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라는 maven 저장소입니다. 


Butter Knife 8.7.0은 실제로 아래의 경로에 존재합니다. 

http://jcenter.bintray.com/com/jakewharton/butterknife/8.7.0/ 

[그림2] JCenter 저장소에 있는 Butter Knife 8.7.0 

위의 그림에서도 4개가 있죠? [그림1]에서 8894.. 같은 해시값이 4개인 이유는 아래의 파일들을 다운받았기 때문입니다. 이제 궁금증이 해소되었나요? 


NEXT.. 


오늘은 그레이들 래퍼를 중심으로 그레이들이 어떻게 외부 라이브러리 의존성을 관리하는지 알아보았습니다. 다음엔 androidDependencies 태스크 활용과 라이브러리 버전 충돌(version conficts)에 대해서 알아보도록 하겠습니다. 

감사합니다. 


2017.8.1 

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari