What is Gradle ?

Gradle 이란

Gradle은 차세대 빌드 tool로 주목받는 오픈 소스 제품이다. 아니 이미 많은 프로젝트에서 사용하고 있다해도 과언이 아니다.

2007년부터 개발이 시작된 Gradle을 스프링 관련 제품 개발이나 기업 솔루션을 중심으로 도입되는 사례가 점점 늘고 있다.

Gradle이 주목받는 이유는 기존 빌드 툴보다 우수한 점이 많기 때문이다. 가장 큰 특징은 빌드 스크립트를 간단하게 작성할 수 있다는 점이다. 또한, 배우기도 쉽고 읽기도 쉬워 처리 내용을 금방 이해할 수 있다.

또 다른 특징으로 Ant나 Maven 같은 기존 빌드 툴의 기능과 시스템도 활용할 수 있다는 점을 들 수 있다. Gradle은 Ant나 Maven의 build script나 Task를 이용할 수 있어서 과거에 축적한 자원을 활용할 수 있다.

즉, 자원을 최대한 활용하면서 단계적으로 Gradle로 이전할 수 있다는 얘기다.

빌드 툴이란

소프트웨어 개발에서 대부분의 작업은 정형화되어 있다. 자바 어플리케이션 개발을 예로 들면 다음과 같은 일련의 작업이 필요하다.

  • 소스코드(.java)를 컴파일해서 클래스 파일(.class)을 생성
  • 코딩 규약에 맞게 작성했는지 확인
  • 코드를 정적으로 해석
  • 테스트하고 테스트 결과나 커버리지 측정 결과를 리포트로 출력
  • Javadoc과 같은 문서를 작성
  • 클래스 파일과 리소스 파일을 패키징해서 압축 파일을 만듬(.jar or .war)
  • 압축 파일을 BETA 환경이나 STAGING 환경에 배포
  • 압축 파일을 저장소에 등록

빌드 툴이란 이런 정형화된 작업을 자동화하여 배포 과정에서 실수를 줄이고 보다 빠른 배포를 할 수 있게 하는데 그 뜻을 둔다.

보통 자바로 웹 어플리케이션을 개발한다면 이클립스를 많이 사용할 것이다. 이클립스의 마법사 도구로 새 프로젝트를 만들면 이클립스에서의 빌드를 전제로 한 프로젝트가 생성된다.

이 말은 이클립스에서만 빌드가 가능하다는 얘기다. 이클립스가 없으면 코드를 배포 가능한 어플리케이션 형태로 만들 수 없다는 것이다.

이런 개발 스타일은 개인 또는 소규모 프로젝트에서는 문제가 없지만 어느 정도 규모가 있는 팀이라면 여러가지 문제가 발생할 수 있다.

왜 Gradle이어야 하나

빌드 스크립트의 생산성

Gradle은 Maven과 마찬가지로 규칙 기반 빌드 접근법을 사용한다. 즉, 규칙을 따라 프로젝트 구조를 만들면 빌드 스크립트 내용을 크게 줄일 수 있다. 또한, 규칙을 벗어난다 해도 필요에 따라 스크립트를 추가할 수 있어서 유연하게 대응 가능하다.

더욱이 Gradle은 JVM 기반의 Groovy로 구축되어 있어 크로스 플랫폼에 유리하고 Groovy의 장점을 그대로 활용할 수 있다. 뿐만 아니라 맵 리터럴, 클로저 등 자바에는 없는 편리한 기능이 있어서 빌드 스크립트를 간단하게 작성할 수 있다.

빌드 순서 제어가 쉽다

Maven의 빌드 순서는 추가나 변경이 불가능해서 Maven에 빌드 순서에 맞지 않는 프로젝트에는 적용할 수 없다. 빌드 스크립트 단순화 전략에 따라 불필요한 기능을 제거했기 때문이다.

Gradle은 Maven처럼 빌드 순서가 정해져 있지 않다. 하지만 이는 빌드 스크립트를 복잡하게 만들어 기존 Ant의 문제점과 같다. Gradle은 이런 문제점을 플러그인을 사용해서 빌드 스크립트를 간단하게 유지한다.

멀티 프로젝트에 대응한다

프로젝트 규모가 어느 정도 커져서 여러 개발 팀이 작업을 분담해야 할 상황이 되면 보통 한 프로젝트를 서브 프로젝트로 나눈다. 하지만 이때 문제가 되는 것은 서브 프로젝트 간 의존관계나 서브 프로젝트들의 공통 빌드 설정을 어떻게 효율적으로 관리하느냐다.

Gradle은 다음과 같은 기능을 통해서 서브 프로젝트로 구성된 전체 프로젝트의 빌드를 지원한다.

  • 멀티 프로젝트에 있는 서브 프로젝트를 정의하는 기능
  • 서브 프로젝트에 공통 빌드 스크립트를 집약하는 기능
  • 서브 프로젝트 간 의존관계를 정의하는 기능
  • 의존관계를 고려해서 변경 내역만 빌드하는 기능

컴포넌트로 만들기 쉽다

빌드 스크립트로 프로그램의 일종이므로 ‘공통 기능을 컴포넌트로 만들어서 재사용하고 싶다’는 요구가 있을 수 있다. Gradle은 쉽게 사용할 수 있는 것부터 컴포넌트로 제대로 만들어서 공개 저장소에 등록할 수준의 것까지 유연하게 대응할 수 있는 컴포넌트 구조를 제공한다.

  • 빌드 스크립트에서 메서드나 클래스 추출
  • 빌드 스크립트의 분할과 재사용
  • 프로젝트에서만 사용할 수 있는 확장 모듈
  • 여러 프로젝트에서 범용적으로 재사용할 수 있는 라이브러리

별도로 설치할 필요가 없다

Ant나 Maven을 사용하려면 사용자 환경에 Ant나 Maven을 설치해야 하는 불편함이 있다. 이것은 사용자에게 부담을 줄 수도 있고, 관리 측면에서도 바람직하지 못하다. 예를 들어 사용자가 다른 버전의 Maven을 설치하면 A에서는 빌드가 성공하지만 B에서는 실패하는 문제가 생길 수도 있다.

이와 같은 문제에 대처하기 위해 Gradle은 래퍼라는 구조를 제공한다. 래퍼는 프로젝트 안에 그레이들의 부트스트랩을 심어서 지정한 버전의 Gradle을 자동으로 설치해주는 기능이다.

다른 빌드 툴과의 비교

Make vs Gradle

C언어를 중심으로 한 네이티브용 소프트웨어 개발 현장에서 Make는 아직도 많이 사용된다.

Make의 특징은 Makefile이라는 빌드 스크립트를 작성해서 결과물을 생성하기 위한 작업과 각 작업 간 관련성을 정의할 수 있다는 것이다. 이 방식에는 다음과 같은 장점이 있다.

  • 빌드 순서를 Shell 스크립트로 처음부터 작성할 필요가 없다.
  • 갱신된 C 코드와 그에 의존하는 코드만을 선택적으로 빌드하는 방식이 가능하다.

Make는 비교적 단순해서 결과물 생성 명령 또는 Shell 스크립트만 정의해도 빌드가 가능하다. 하지만 플랫폼 의존성이 커서 크로스 플랫폼 대응이 어렵다. 그리고 Make에는 의존관계 해결 기능이 없다.

Gradle에는 Make의 이러한 ‘스크립트 기반 유연성’이라는 장점을 취하면서 크로스 플랫폼 대응, 의존관계 해결, 규칙 기반 빌드와 같은 최신 빌드 툴이 요구하는 기능들이 충실하게 반영되어 있다.

Ant vs Gradle

Make의 문제였던 크로스 플랫폼 대응을 해결하기 위해 플랫폼에 의존하지 않는 자바와 XML을 기반으로 구축했다. Ant의 기능은 Make보다 많지만, 빌드 툴로서는 매우 단순하다. 또한, 확장이 쉬워서 많은 확장 Task들이 만들어졌고, 이로 인해 에코시스템이 강화됐다.

하지만 Ant는 다음과 같은 문제가 있다.

  • 기본 기능이 단순해서 복잡한 것을 만들려면 빌드 스크립트가 길어진다.
  • 디렉터리 구조와 관련된 표준 규칙이 없고 프로젝트 단위로 다른 빌드 스크립트를 사용해야하므로 재사용이 어렵다.
  • 라이브러리 의존관계 관리 기능이 없어서 의존 라이브러리를 직접 받아야 한다.

Ant의 단순함과 크로스 플랫폼 특성을 도입한 Gradle의 특징은 다음과 같다.

  • Groovy 기반의 DSL을 도입해서 빌드 스크립트를 사용한 유연한 처리가 가능하다.
  • 의존관계 해결이나 규칙 기반 빌드 기능을 도입해서 사용하기 쉽다.

Maven vs Gradle

Maven이 도입한 규칙 기반 빌드 접근법은 프로젝트 종류별로 디렉터리 구조와 빌드 순서를 표준화한다. 이 표준 규칙을 따르면 빌드 내용을 상세하게 지시하지 않아도 빌드가 된다. 즉, 빌드 스크립트를 간략하게 하고 프로젝트의 재사용성을 높이는데 크게 공헌했다.

반면 다음과 같은 단점이 있다.

  • 제대로 사용하려면 복잡한 Maven 규칙을 이해해야 하므로 진입 장벽이 높다.
  • 규칙에 맞지 않는 프로젝트에서는 사용 난이도가 높아진다.

원칙적으로 Maven은 스크립트에 로직을 직접 작성할 수 없다. 이 때문에 기존 플러그인이 제공하지 않는 기능을 구현하려면 플러그인을 직접 만들어야 한다. 플러그인을 직접 개발하기란 상당히 어려울 것이다.

한편 Gradle은 Groovy 기반이므로 다음과 같이 간단히 구현할 수 있다.

  • 빌드 스크립트에 처리를 직접 작성한다.
  • 빌드 스크립트에서 자바 클래스를 직접 이용한다.

Gradle은 Maven처럼 규칙 기반 빌드 및 의존관계 관리 기능을 제공하면서 Maven보다 유연하게 기능을 변경하거나 확장할 수 있는 빌드 툴이다.

Share