토마토바구니
590
2020-08-10 19:50:57 작성 2020-08-14 14:27:42 수정됨
0
1181

Gradle이란?


저는 컴공과 복수전공하는 학생으로서, 스스로 공부 겸 복습을 하기 위해서 블로그를 하고 있습니다.

분명히 틀린 내용이 있을 수 있습니다. 잘 못된 내용을 발견 후 지적해주시면, 감사히 수정하겠습니다.


https://yeon-kr.tistory.com/127



---------------------------------------------------------------------------------------------------


1. Gradle이란?

Gradle은 빌드 자동화 툴 중 대표적인 오픈소스입니다.


그런데 "빌드 자동화 툴"이 뭘까요? 무슨 빌드를, 어떻게 자동화해준다는 것일까요?


위키피디아에서는 실행 가능한 프로그램을 만들어주는 과정으로써 소스를 바이너리 코드로 컴파일하고, 바이너리 코드를 패키징 하고, 자동화된 테스트를 실행하는 것이라고 설명하고 있습니다. 미리 말씀드리면 Gradle 자체가 작성한 소스를 컴파일하는 것은 아닙니다. 


자바에서 컴파일을 하게 되면, Javac에 의해서 JVM이 읽을 수 있는 클래스 파일로 변환됩니다. 이러한 클래스 파일은 링킹과 기계어로 변환이 되는 인터프리트 과정을 거치는데요. 이때 마지막으로 실행 가능한 파일로 만들어 주는 것이 빌드입니다. 사실 빌드라는 것은 특정 단계라기보다는 컴파일을 포함하는 개념입니다. 즉 소스코드가 사용할 수 있는 소프트웨어로 전환되는 모든 과정을 말하는데요.


좀 더 특징적으로 이야기하자면, Gradle은 컴파일한 파일에 필요한 라이브러리 같은 것들을 주입시켜 주는 역할을 하고 있습니다. 즉 이러한 의존성, 라이브러리를 대신 넣어주면서 관리까지 해주는 툴을 "빌드 자동화 툴"이라고 하며, Gradle과 Maven이 대표적입니다. 


1. 1. Build

앞서 빌드라는 것은 컴파일까지 포함한 모든 개념을 포함한다고 했습니다. 하지만 자바는 Javac에 의해서 컴파일이 됩니다. Gradle은 이 과정에 어떻게 관여를 하게 될까요?


Gradle에서는 Java Library Plugin을 지원합니다. 즉 자바가 제공하는 "compileJava" task가 main/java폴더 아래의 소스들을 컴파일하게 됩니다. 즉 Gradle 자체가 컴파일을 한다기보다는, 자바 라이브러리와 상호작용 하면서 전체적인 빌드 과정에 포함시키고 있습니다. 이러한 자바 라이브러리에는 main/java 아래의 소스들과 main/resources 아래의 파일들을 하나의 jar 파일로 패키징 하는 기능도 제공합니다. 이러한 자바 라이브러리의 정보들은 Gradle의 build script에 정의가 되어 있습니다. 즉 자바 라이브러리와 관련해서 하나의 script만 보면 되기 때문에 편리합니다. 


Gradle 빌드들은 수많은 build.gradle 파일들로 이루어집니다. 한 개의 빌드 파일은 한 개의 프로젝트를 가리키게 됩니다. 여기서 말하는 프로젝트는 이미 빌드가 끝난 것을 말합니다. 그리고 이 빌드들은 여러 개의 Task들로 이루어집니다. 


Gradle 빌드들은 수많은 build.gradle 파일들로 이루어집니다. 한 개의 빌드 파일은 한 개의 프로젝트를 가리키게 됩니다. 여기서 말하는 프로젝트는 이미 빌드가 끝난 것을 말합니다. 그리고 이 빌드들은 여러 개의 Task들로 이루어집니다. 


여기서 Gradle의 빌드는 여러 개의 Task로 이루어진다는 것에 주목해야 할 필요가 있습니다. 자바를 컴파일 하는 라이브러리도 하나의 Task로서 빌드의 과정에 참여시키고 있습니다. 


이러한 Task가 어떻게 서로 상호작용을 하는지 아래에서 살펴보겠습니다.

2. Directed Acyclic Graph of tasks

Gradle 모델은 기본적으로 DAG방향성 비 사이클로 불리는 알고리즘으로 만들어져 있습니다. 이는 루프를 생성하지 않는 그래프입니다. 여러 개의 작업을 하나의 블록으로 묶는 것이 아닌, 개별의 작업(task)들이 의존성으로 가지고, 상호 연결되게 하는 알고리즘입니다.


순환 그래프에서는 어떤 특정 부분에서 넘어가지 않고 계속적으로 순환하는 문제가 발생할 수 있습니다. 예를 들어 A-G가 있는데, B-D가 계속적으로 순환하는 구조를 가지는 문제가 발생할 수 있습니다. 비 사이클, 비 순환 그래프에서는 이러한 문제점이 발생하지 않습니다. 왜냐하면 순환하지 않기 때문에 결국 A-G까지 한 번씩 거쳐서 가야 합니다. 즉 Gradle에서 모든 Task는 딱 한 번만 실행됩니다. 그리고 이 의존성 그래프는 Task가 실행되기 전에 만들어집니다. 


Build configuration scripts는 이 의존성 그래프를 참고하게 됩니다. 




3. 빌드 단계 (Build phases)

Gradle은 3단계의 빌드 단계가 있습니다.


3. 1. 초기화 (Initialization)

Gradle은 여러 개의 프로젝트를 동시에 빌드할 수 있습니다. 그 말은 여러 개의 프로젝트 중 어떤 프로젝트를 선택해서 빌드할 지 결정해야 합니다. Gradle은 어떤 프로젝트를 빌드할 지 선택하고 여러개의 프로젝트 인스턴스를 생성하게 됩니다. 

3. 2. 구성(Configuration)

생성된 프로젝트가 Configuration 될 때 모든 프로젝트의 build scripts의 해당 부분이 실행됩니다. 

3. 3. 실행(Execution)

Configuration의 마지막 과정에서 선택된 task들이 실행됩니다. 


4. Gradle Wrapper

Wrapper는 스크립트 파일로서, 스크립트에 작성된 Gradle 버전을 사용자가 프로젝트를 사용하려고 할 때 미리 필요한 버전을 주입시키고 다운로드합니다. 

 

프로그래머가 build.gradle 파일에 Wrapper task를 정의해주면, wrapper 스크립트를 생성합니다. Wrapper 스크립트는 gradle wrapper 커멘드를 이용해서, *nix에서는 gradlew, Window에서는 gradlew.bat 이름으로 생성됩니다. 

 

좀 더 자세히 이야기를 하자면, Gradle의 Wrapper 클래스가 스크립트 파일(gradlew)을 만듭니다. 그리고 이 스크립트 파일은 Gradle을 로컬 머신에 설치하지 않아도, 프로젝트를 Gradle과 함께 빌드할 수 있게 해 줍니다. 프로그래머가 이 Wrapper 스크립트를 실행하면, 스크립트에 나와있는 적합한 버전의 Gradle을 찾아 다운로드하고 실행시켜 줍니다. 그리고 빌드합니다. 즉 로컬에 이미 설치된 다른 버전이 존재하더라도, 무시하고 해당 스크립트에 있는 버전을 사용해서 빌드합니다. 

 

프로그래머는 항상 버전에 민감합니다. 같은 툴이라도 버전이 다르다는 이유로 수많은 에러가 발생합니다. 이러한 스트레스로부터 자유로워집니다.

 

위에서 말했듯이 Gradle이 로컬머신에 설치되어 있지 않더라도, wrapper 스크립트(gradlew)를 이용해서 사용할 수 있습니다. 또한 적합한 버전으로 Gradle이 알아서 모든 사용자에게 주입합니다. 즉 버전이 달라서 문제가 생길 일이 없습니다.



5. 수정사항

8월 11일

오타 수정


8월 14일

1.1. Build 내용 추가


2
  • 댓글 0

  • 로그인을 하시면 댓글 을 등록할 수 있습니다.