brunch

You can make anything
by writing

C.S.Lewis

[Gradle] #2 구성요소로 바라본 그레이들

들어가는 글: 오늘은 그레이들을 다른 면에서 바라보겠습니다. 그레이들을 이루는 요소 파일들을 보고 설계자의 입장에서 '나라면 안드로이드를 위한 Gradle'을 어떻게 구성했을까'를 적어보겠습니다.  


1. 그레이들을 구성하는 파일들 


첫번째 이야기에서 그레이들을 채택한 이유에 대해서 알아보았습니다. 간단히 키워드로 요약을 하면 


1) 모듈화 개발 

2) One source Multi APK 실현 

3) 라이브러리 의존성 관리 

입니다. 


이와같은 목표를 이루기 위한 구성 요소 파일들은 무엇이 있을까요? 

settings.gradle : 모듈 목록을 추가함 

(프로젝트) build.gradle : 빌드 스크립트 & 전체 프로젝트 대상  

(모듈) build.gradle : 개별 모듈을 위한 빌드 스크립트 

gradle.properties : 속성 파일 

local.properties : 로컬 속성 파일 


우리는 일반적으로 이렇게 알고 있습니다. 설계자의 입장으로 관점을 바꿔보겠습니다. 


2. 그레이들이 생각하는 모듈화 개발 


안드로이드로 모듈화 개발을 하려면 먼저 모듈을 정의해야 합니다. 

그래서 Android Studio를 설치해서 처음 HelloWorld를 만들면 app 이라는 모듈이 생깁니다.  


Android Studio 3.0의 Hello World 프로젝트

이클립스에서 개발할 때는 프로젝트에 AndroidManifest.xml 하고 src 폴더와 libs 폴더만 있으면 되는데.. 갑자기 너무 많아졌습니다. 


그리고 src 폴더도 한층더 복잡해졌습니다. 

- BEFORE: src 폴더에 com.helloworld 이면 충분했는데.. 

- AFTER: src/main/java 폴더에 com.helloworld 패키지가 들어가게 됩니다. 


오늘의 전반적인 논의는 (1) 모듈화 개발 (2) one source multi APK (3) 의존성 관리를 계속 생각해주세요~ 


>>> src/main/java 폴더는 무슨 의미일까? 

main은 build variant를 의미합니다. (2)라는 목적을 달성하기 위해서는 product flavors 와 build type을 재정의할 수 있는데요 그것에 맞도록 재정의할 수 있습니다. 

예를 들면 src/web/java 도 가능하고 src/customer_01/java 도 정의할 수 있도록 개념화해놓은 것입니다. 


java는 우리가 아는데로 java언어입니다. 그레이들은 폴리글랏(polyglot)을 지향합니다. 예를 들어 웹 분야에서 그레이들을 활용하여 서비스를 빌드하는 페이스북의 경우에는 20가지가 넘는 언어를 활용한다고 하더라구요. 따라서 말은 안되지만.. 

src/main/groovy/ 폴더 

src/main/cpp/ 라는 폴더가 (논리적으로는) 가능한 것입니다. 저도 안드로이드를 개발할 때 자바 언어외에 다른 언어(NDK는 제외)를 함께 섞어서 프로젝트를 해본 적은 없습니다. 하지만 개념적으로 그렇다고 이해해주시면 됩니다. 


3. settings.gradle과 build.gradle 파일 


(1) 모듈화 개발의 관점에서 다른 구성 파일들도 함께 살펴보겠습니다. 

위에서 만든 Hello World 프로젝트의 settings.gradle을 열어보면 아래와 같이 달랑 한 줄만 있습니다. 


include ':app' 


이것으로 끝입니다. 만약 새로운 모듈을 추가한다면 거기에 콤마로 추가하면 됩니다. 


include ':app', ':engine' , 등등 

아니면 

include ':app'

include ':engine' 

이렇게 추가하시면 됩니다. 


다음은 가장 중요한 build.gradle 파일입니다. 어찌보면 그레이들 빌드 시스템의 핵심 파일입니다. 그런데.. 우리는 이것이 (프로젝트) build.gradle 파일과 (모듈별) build.gradle 파일로 나누어져있다고 알고 있습니다. 왜 나누어야 했을까요? 


사실 멀티 모듈로 개발을 하게 되면 프로젝트 build.gradle 파일은 거의 변경할 일이 없습니다. 프로젝트 build.gradle 파일은 아래의 역할을 담당합니다. 

1) 안드로이드 그레이들 플러그인 정보 설정

- 예) classpath 'com.android.tools.build:gradle:3.0.0-alpha3' 

이 경우 그레이들 플러그인 3.0.0-알파3 버전으로 지정하게 됩니다. 되도록이면 최신 버전을 따라가시면 좋습니다. 


2) allprojects 설정 

allprojects 와 비슷한 용어로는 subprojects 라는 것이 있습니다. 말 그래도 all은 전체 프로젝트를 의미하고 sub은 최상위 모듈은 제외한 나머지 하위 모듈에 관한 설정을 의미합니다. 보통 처음 생성된데로 그대로 두는 경우가 많습니다. 


4. 모듈 build.gradle 파일 


사실상 개발자가 변경할 가능성이 높은 파일은 app 모듈의 build.gradle 파일입니다. 

새로 만든 Hello World에서는 아주 기본적인 것만 설정되어 있습니다. 파일을 열어보면... 


크게 3개의 블럭(block)이 보입니다. 


apply plugin 블럭 (사실 이것은 블럭이라기 보다는 문장(statement)라고 부릅니다) 

android 블럭 

dependencies 블럭 


1) apply plugin 블럭 


구글은 안드로이드를 위한 그레이들을 확장성있게 만들고 싶었습니다. 그래서 모듈 build.gradle의 문법이나 특수 목적을 선언할 수 있도록 플러그인 구조로 만들었습니다. 저도 사실 plugin 자체를 만들어보거나 수정해본적은 없지만 프로젝트를 하면서 몇가지 plugin 은 경험해봤습니다. 


a) APK냐? AAR이냐? 

=> 'com.android.application' , 'com.android.library' 플러그인 적용 

b) Retrolambda 활용  

=> 'me.tatarka.retrolambda' 플러그인 적용 

2) android 블럭 


기본적으로 AndroidManifest.xml 의 속성을 재정의하는 목적으로 활용합니다. AndroidManifest.xml 보다 우선순위가 높습니다. 많은 문서에서 다루고 있으므로 따로 다루지는 않습니다. 


3) dependencies 블럭 


앞서 말한 (3) 항목에 해당합니다. 외부 라이브러리 관리를 하기 위한 블럭입니다. 

이것에 대해서는 3화에서 좀더 알아보도록 할께요 


NEXT.. 


1, 2화는 주로 (1) 모듈화 개발의 측면에서 알아보았다면 3화부터는 '외부 라이브러리 관리' 측면에서 그레이들을 알아보도록 하겠습니다. 재밌게 읽어주세요. 

감사합니다. 


2017.7.23 

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