Gradle 이란?

Gradle 이란?

Gradle에 대해 공부하기 전에 Gradle의 배경에 대해 알아봅시다

 

🤔 빌드 툴이란?


소프트웨어 개발에서 대부분의 작업 순서는 정형화되어 있다.

정적타이핑 언어자바로 작성된 애플리케이션을 예로 들면 다음과 같은 작업 순서를 따른다.

 

  • 소스코드(.java)를 컴파일해 클래스파일(.class)을 생성한다
  • 클래스파일을 기계어로 번역한다
  • 기계어로 번역된 코드를 테스트를 하고 테스트 결과를 출력한다
  • Javadoc과 같은 문서를 작성한다
  • 클래스파일과 리소스파일을 패키징한다 (jar 또는 war)
  • 패키징한 파일을 배포하거나 저장소에 등록한다

 

파이썬, 자바스크립트, 루비같은 스크립트 언어들의 경우 컴파일 과정은 생략되지만 이외의 작업은 모두 동일하게 가져간다.

빌드 툴이란 이렇게 코드를 작성하는 것 외의 작업들을 자동화하기 위한 소프트웨어다.

메이븐(Maven), 그레이들(Gradle) 등의 빌드 툴을 사용하지 않으면 외부 라이브러리를 자신의 프로젝트에 포함시키려 할때마다 jar등의 패키징된 파일을 직접 구해서 프로젝트의 클래스패스에 넣어줘야만 한다.

하지만 메이븐 이후의 빌드 툴을 사용 할 경우 빌드 툴 설정에 의존성 설정만 해주면 모든 라이브러리를 자동으로 다운받고 설정해준다.

이 외의 컴파일을 CLI환경에서 모두 수작업으로 해줘야 한다거나 배포를 하기가 매우 힘들어진다거나 하는 어려움들도 있다.

더욱이 최근에는 젠킨스(Jenkins), 트래비스(Travis CI) 등의 CI/CD툴의 발전과 이러한 CI/CD 툴과 빌드 툴의 호환으로 인해 빌드 툴을 잘 다루는 것이 매우 중요해졌다.

 

즉, 빌드 툴을 잘 다루게 되면 개발자는 자신이 개발해야 하는 중요한 비즈니스 로직에만 더욱 더 집중할 수 있게된다.

프로젝트 구성, 컴파일, 의존성 설정, 테스트, 빌드, 배포, 저장소 등록 등의 모든 작업을 빌드 툴이 자동화해줄 수 있기 때문이다.

간단한 예로 아직도 많은 팀들이 배포날에 야근, 철야를 하는 경우가 매우 많다는 것을 상기해보자.

CI/CD 환경이 완벽하게 자동화 된 팀은 배포에 대한 리스크가 아주 미미하다.

 

📕 빌드 툴의 역사

 

🚀 메이크(Make)


 

https://www.gnu.org/software/make/

 

메이크 이전에는 모든 작업을 수작업이나 약간의 스크립트를 작성해서 처리했다고 한다.

메이크의 등장이후 Makefile이라는 것으로 모든 구조를 통일하여 처리할 수 있게 되었고, 소프트웨어 세계예 빌드라는 개념이 처음으로 생겼다고 한다.

C언어는 아직도 메이크를 사용하여 빌드한다고 한다.

 

🚀 앤트(Ant)


 

http:/ant.apache.org/

 

메이크가 등장한 이후 오랫동안 큰 변화가 없다가 1990년대에 자바가 등장하면서 문제가 생겼다고 한다.

자바에 메이크를 적용하려니 매우 많은 문제가 발생했기 때문이란다.

그래서 자바만을 위한 빌드 툴이 등장하게 됐는데, 이것이 아직도 유명한 앤트다.

 

앤트는 당시 혁신적이었던 JVMXML을 도입하여 메이크의 단점이었던 플랫폼 의존 문제를 해결했다고 한다.

그렇게 자바의 유행과 함께 앤트는 자바 생태계에서 독보적인 빌드 툴로 자리잡았고, 아직까지도 사용되고 있다.

 

앤트는 진입장벽이 매우 낮다는 장점이 있지만, 프로젝트가 약간만 복잡해져도 빌드 스크립트가 장황해져 관리하기가 어려웠다고 한다.

그리고 가장 큰 단점으로 라이브러리간의 의존관계를 관리할 수 없어서 이로인한 문제가 고질적이었단다.

 

🚀 메이븐(Maven)


 

http://maven.apache.org/

 

메이븐은 자바에 XML을 사용해 플랫폼 독립성을 확보한 것은 앤트와 같으나, 빌드 생명주기와 프로젝트 객체 모델(POM)이라는 새로운 개념을 도입하였다.

또한 앤트의 약점이었던 장황한 빌드 스크립트와 라이브러리 의존관계를 모두 해결한 혁명적인 빌드툴이었다고 한다.

메이븐은 POM에 메타데이터를 적용하여 라이브러리 의존관계를 자동으로 관리해주는 기능을 구현했으며, 이 기능을 구현하기 위해 위해 메이븐 중앙 저장소(Maven Central Repository)를 구축했다.

메이븐은 이 글을 작성하는 2021년 7월 현재에도 전 세계적으로 매우 활발하게 사용되고 있으며, Gradle은 아주 많은 의존 라이브러리를 메이븐 중앙 저장소에서 받아온다.

 

// file: 'build.gradle'
repositories {
    mavenCentral() // 메이븐 중앙 저장소
}

 

메이븐은 소프트웨어 역사에 위대한 업적을 세운 빌드 툴이지만 큰 단점도 존재한다.

먼저 XML로 작성된다는 특징으로 인해 프로젝트의 유연한 구조 변경이 매우 어렵다.

그리고 기능이 매우 다양한 만큼 제약또한 매우 강력하며, 이러한 규칙을 어겨가며 사용하게 될 경우 빌드 툴의 사용 난이도가 말도안되게 높아진다.

 

👍 그레이들(Gradle)


 

From mobile apps to microservices, from small startups to big enterprises, Gradle helps teams build, automate and deliver better software, faster.

 

그레이들 홈페이지

그레이들 - 사용자 가이드

그레이들 - 깃허브

 

그레이들은 위의 모든 빌드 툴의 단점을 타파하고 모든 장점을 가져왔으며, 위 모든 빌드 툴의 생태계를 적극적으로 활용할 수 있게 만들어졌다.

우선 위의 내용을 정리하면 다음과 같다.

 

빌드 툴타입언어상세
메이크동적스크립트오직 처리에 중점을 둠
앤트정적XML오직 처리에 중점을 둠
메이븐정적XML구조규칙에 중점을 둠
그레이들동적스크립트구조규칙에 중점을 둠

 

각 빌드 툴은 소프트웨어 생태계에 다음과 같은 족적을 남겼다.

 

  • 메이크: 소프트웨어 생태계에 빌드라는 개념을 확립시켰다
  • 앤트: 플랫폼에 대한 범용성을 크게 늘렸다 (크로스 플랫폼)
  • 메이븐: 빌드 스크립트의 혁신을 가져왔다 (규칙 기반의 빌드 툴)
  • 그레이들: 모든 장점을 가지면서 유연성을 대폭 늘렸다 (스크립트 언어로의 회귀)

 

그레이들은 이러한 진화를 위해 JVM 생태계의 스크립트 언어인 그루비(Groovy)를 기반 언어로 선택하였으며, 그루비로 작성된 프로그램 중 가장 성공적인 프로그램이 그레이들이기도 하다.

그레이들은 그루비DSL을 도입하여 독자적인 영역을 구축했고, 그레이들은 현존하는 대부분의 언어를 빌드할 수 있다.

 

💡 DSL ?

DSL은 Domain Specific Language의 약자로, 도메인에 특화된 언어를 말한다. 그루비DSL은 그루비와는 약간 다르며 오로지 그레이들에만 특화된 언어이다.

 

그레이들의 특징


  • 자유롭게 확장 가능한 그레이들 전용 언어(그루비DSL)
  • 빌드 분할 등의 작업을 체계화 하기 쉬움(태스크)
  • IDE와 연계하여 그레이들을 외부에서 제어할 수 있는 API 제공(Gradle Wrapper)
  • 병렬 빌드를 도입하여 빌드의 속도를 대폭 증가시킴
  • 멀티 프로젝트를 아주 쉽게 구축할 수 있음
  • 메이븐/아이비 저장소 뿐만 아니라 사설 저장소까지 활용하여 다양한 의존관계를 관리할 수 있게 해줌
  • 앤트 프로젝트를 통합할 수 있음
  • 빌드 스크립트를 그루비로 작성하여, 자바 개발자라면 쉽게 그레이들 빌드 스크립트를 작성할 수 있음
  • 그레이들 래퍼(Gradle Wrapper)를 이용하여 그레이들이 설치되지 않았더라도 그레이들의 태스크를 사용 가능
  • 호환성을 최대한 배려해줌

© 2022. All rights reserved.