토이 프로젝트 진행과 TDD에 대해 공부하기 위해 초기 프로젝트 세팅을 해야 했고, 그 과정 가운데 JAVA빌드 툴에 대해 알아야겠다는 생각이 들어 공부를 시작하게 되었다. 기존 알고 있던 빌드 툴은 Maven과 gradle이었고 Google Trendes 지수에 따르면 아직은 Maven에 관심이 많으나 Gradle이 좋다는 말이 많이 들려 간단하게 공부해보게 되었다.
빌드 툴 이란 무엇일까?
빌드 툴을 간단히 정의하자면 소스 코드의 빌드 과정을 자동으로 처리해주며 외부 소스코드(외부 라이브러리)를 자동 추가 및 관리해주는 프로그램 입니다.
빌드 툴 왜 사용할까?
빌드 툴을 사용하는 이유는 다양한 개발이 가능해지면서 필요한 라이브러리들이 많아지게 되었습니다. 만약 이 라이브러리들을 직접 다운로드하고 추가하면 개발자들 간의 버전 관리 및 다운로드한 jar파일의 보안 위험의 문제가 있고 번거로울 것입니다. 또한 빌드 프로세스를 수동으로 호출할 시 무엇을 빌드할지, 어떤 순서를 가지고 빌드할지, 어떤 의존성이 있는지 모두 파악하기 쉽지 않아 실용적이지 않습니다. 그렇기에 빌드 툴을 사용하여 이러한 문제들을 방지하고 해결하는 것입니다.
빌드란?
소스코드 파일을 실행 가능한 소프트웨어 산출물로 만드는 일련의 과정을 말합니다.
(간단히 말해 내가 개발한 앱을 실행 가능한 애플리케이션으로 만들어 Web Server에 배포하기 위한 과정입니다.)
그리고 이 과정을 도와주는 도구를 빌드 툴이라고 합니다.
컴파일이란?
개발자가 작성한 소스코드를 바이너리 코드로 변환하는 과정, 즉 컴퓨터가 이해할 수 있는 기계어(0과 1로 이루어진 코드)로 변환하는 작업입니다. 이 작업을 해주는 프로그램을 컴파일러라고 합니다. 자바의 경우 자바 가상 머신(Java Virtual Machine, JVM)에서 실행 가능한 바이트코드 형태의 클래스 파일이 생성됩니다. 빌드의 단계 중 컴파일이 포함되어 있습니다.
JAVA의 빌드 툴
현재 자바에서 사용하는 빌드 툴은 총 3가지이다. Ant, Maven, Gradle이며 출시 순서 또한 1.Ant, 2.Maven, 3.Gradle 순이다. 처음에는 단순한 빌드 도구로써 Ant가 이용되었지만, Maven에 빌드 + 라이브러리 관리 기능이 추가되어 Maven으로 많이 옮겨갔고 현재는 Gradle을 많이 사용한다고 한다. 다들 아시겠지만 출시 순서에 따라 이전 빌드 툴의 단점이라고 여겨지던 것들이 보안되어 출시되었다. 그렇게 생각하면 당연히 Gradle을 사용해야겠다고 생각하지만 아직 잘 모르기에 한번 알아보자.
Apache Ant
Apache Ant는 제일 처음 출시되었던 만큼 빌드 도구로써의 목적만을 두고 출시되었었다.
특징
- 유연성 : 어떠한 코딩 규칙이나 프로젝트 구조를 강조하지 않는다.
- xml을 기반으로 스크립트를 작성한다.(build.xml)
- Ant의 하위 프로젝트인 Apache lvy를 통해 의존성 관리가 가능하다.
단점
- 어떠한 코딩 규칙이나 프로젝트 구조를 강조하지 않지만 그 말은 즉, Ant를 사용하여 프로젝트를 빌드하는 개발자가 모든 명령을 스스로 작성해야 하며 lvy의 등장 전에는 종속성 관리가 되지 않기에 개발자가 파악해야 했다.
- 규칙이 없기 때문에, 다른 개발자가 작성한 Ant의 빌드 파일을 이해하는데 시간이 더 소요된다.
- 때때로는 유지 보수하기 어려운 거대한 XML 파일(lvy 출시 전 기준으로 종속성 관리까지 직접 한다면... 생각만 해도 무섭다)
Apache Maven
Apache Maven은 주로 JAVA 애플리케이션에 사용되는 종속성 관리 + 빌드 도구이며 Ant를 사용하던 개발자들의 불편함을 해소하며 Apache Ant의 대안으로 출시되었습니다.
특징
- 규칙성 : 규칙에 의존하고 사전 정의된 목표를 제공합니다.
- xml을 기반으로 스크립트를 작성한다.(pom.xml)
- 정해진 라이프사이클에 의해 작업을 수행하며, 전반적인 프로젝트 관리 기능을 포함하고 있다.
- 종속성 관리를 해준다.(프로젝트에 필요한 라이브러리를 pom.xml파일에 작성해두면 네트워크를 통해서 라이브러리들을 자동으로 다운받아주며, 특정 라이브러리가 실행되는데 필요한 라이브러리들까지 다운받아줍니다.)
잠깐! 종속성 관리란 무엇일까?
예를 들어 A라는 라이브러리가 진행하는 프로젝트에 필요하여 추가하였습니다. 그런데 A 라이브러리는 B 라이브러리가 있어야 동작을 합니다. 즉, Maven의 종속성 관리란 A라이브러리를 pom.xml에 명시하여 라이브러리를 다운로드할 때에 A라이브러리가 동작하는데 필요한 B 라이브러리까지 다운받아주는 것입니다. 예시를 들었기에 큰 불편함이 아닌 것 같지만 A가 B를 필요로 하고 B가 C를 필요로 하며 꼬리를 계속 문다면...
단점
- 엄격한 프로젝트 구조를 규정하여 Ant에 비해 유연성이 떨어집니다.
- Maven에서 지원하지 않는 빌드 과정을 추가해야 하는 경우 상당히 복잡해집니다.
- 정적인 데이터를 저장하는 xml파일이기에 동적인 정의가 어렵다.
Gradle
Gradle은 Ant와 Maven의 개념을 기반으로 구축된 종속성 관리 + 빌드 도구입니다. Groovy 기반 DSL(Domain-Specific Language)로 작성된 빌드 도구이며 Ant와 Maven의 단점을 보완하고 장점을 취합해 만들어지게 되었습니다. 또한 안드로이드의 공식 빌드 시스템으로 사용되고 있습니다.
특징
- Ant와 Maven의 개념을 기반으로 구축되어 Ant와 Maven의 단점을 보완하고 장점을 취합하였다.
- Ant와 Maven과는 달리 xml파일을 사용하지 않습니다.
- 특정 도메인에 맞는 언어를 사용하여 특정 도메인의 문제를 해결 Groovy를 기반으로 하는 DSL(Domain-Specific Language)을 사용
- xml의 구조적인 틀에서 벗어나 간결한 정의가 가능하며, 언어가 특정 도메인 문제를 해결하도록 설계되었기 때문에 구성 파일의 크기가 작아졌습니다.(build.gradle에 작성)
- Groovy언어를 기반으로 동적인 정의가 가능하여 공통 설정 조건을 특정 프로젝트에만 주입할 수 있다.
잠깐! 특정 도메인에 맞는 언어란 무엇일까?
특정 도메인(산업, 분야 등 특정 영역)에 특화된 언어를 말한다. 도메인 문제를 해결할 때, 문제 해결 아이디어와 최대한 유사한 형태의 문법으로 프로그래밍할 수 있도록 하는 것이 주요 콘셉트이다(특정 영역의 문제를 해결하기 위해 그 영역에 맞는 도구를 사용한다는 것이다). 즉, Gradle에 사용되는 언어는 Groovy를 기반으로 작성된 Gradle dsl이다. (DSL : 도메인 고유언어라 불리며 "특정한 용도에 한정된 언어"를 뜻합니다.
Groovy란? (간단하게 알아보자)
JVM 상에서 실행되는 스크립트 언어이다.
JAVA와 유사한 문법 구조를 가지고 있다.
JAVA와 호환성이 아주 좋다.
마무리
Gradle은 Ant와 Maven의 단점을 보완하고 장점을 합쳐 만들어졌으므로 장점이 많고, xml에서는 동적인 요소를 정의하기 어려우나 gradle은 Groovy 스크립트로 동적인 정의가 가능한 큰 장점이 있다. 이러한 장점들이 있음에도 Maven의 사용률이 높은 이유는 새로 배워야 한다는 단점, 아직까지는 Maven의 사용률이 높다는 점이 있다. Groovy언어를 새로 학습해야 하지만 JAVA 언어와 비슷하고 Gradle의 장점이 많으니 Gradle을 사용해야 할 필요성을 느낀다. 잘못 이해하거나 설명한 개념이 있다면 언제든지 말씀 해주시면 참고해서 공부하겠습니다.
참고했던 블로그들
https://gptjs409.github.io/java/2019/08/06/build-tool.html
https://www.baeldung.com/ant-maven-gradle