자바를 빌드할 때 여러 가지 빌드 도구들을 사용할 수 있다. 현재는 Maven과 Gradle을 대표적으로 많이 사용한다. '둘 중 어느 것을 사용하는 것이 좋을까'에 대한 궁금증을 해소하기 위해 Google Trends를 이용해 두 단어의 검색량 추이를 비교해봤다. 절대적인 수치는 아니지만 사람들의 관심도를 통해 간접적으로 위 질문에 대한 해답을 얻을 수 있을 것 같다.
전세계를 상대로 검색량을 조사한 결과 2012년 Gradle 1.0이 발표된 이후 꾸준히 검색량이 증가하다가 현재는 주춤하는 모습이다. 2002년 발표된 Maven도 발표 이후 꾸준히 증가하다가 현재는 어느 정도 Gradle과 비율을 맞추고 있다. 아직까지 전세계에서는 Maven이 Gradle에 비해 3배 정도 관심도가 높은 것으로 보인다. 하지만 대한민국으로 범위를 한정하면 결과가 사뭇 다르다.
범위를 대한민국으로 한정했을 때, 전체적인 평균은 아직 Maven이 앞서고 2021년까지의 추이 또한 전세계 추이와 비슷하다. 하지만 2021년 9월을 기점으로 Maven과 Gradle이 서로 엎치락 뒤치락하는 모습을 보여준다. 결론적으로 대한민국에서는 Gradle의 상승세가 좀 더 도드라진다.
그렇다면 Gradle이 어떤 장점이 있기에 한국의 주목을 받고 있을까?
그 전에 빌드 도구가 무엇인지, 자바 빌드 도구의 발전 과정부터 차근차근 알아가는 게 왜 Maven이나 Gradle이 등장했고 많이 사용되고 있는지 이해하기 쉬울 것 같다.
01. 빌드 도구란?
빌드 도구(Build Tool)는 컴파일 언어를 빌드할 때 필요한 컴파일, 테스트, 정적 분석 등을 더 쉽게 할 수 있도록 도와주는 도구다. 최근에는 개발자들의 편의성을 위해 라이브러리를 자동 추가해주고 버전 관리을 해주는 의존성 관리도 해주는 등의 부가적인 기능도 추가되었다.
예를 들어 자바 파일이 한 두개일 때는 javac.exe test.java 등의 명령어를 통해 class파일로 컴파일해 실행할 수 있겠지만, 만약 수백 수천개의 파일을 컴파일하고 추후에 변경사항이 생기면 그 파일을 추적해 다시 컴파일해 프로그램을 만들기란 쉽지 않을 것이다. 이를 자동화해 개발 편의성을 향상시킨 것이 빌드 도구다.
02. Make ( 1976 - )
Make는 1976년 스튜어트 펠드먼에 의해 개발된 최초의 빌드 자동화 도구이며 현재도 사용하고 있다. Make는 빌드 관련 방법들을 지정하는 Makefile을 읽어 목표 파일(target)을 만든다.
실수로 업데이트 되지 않은 프로그램을 헛되게 디버깅한 동료의 경험에서 영감을 받아 만들었다고 하는데, 만약 빌드 도구가 없다면 얼마나 귀찮을지 궁금하다. Windows를 쓰고 있으므로 WSL Ubuntu를 이용해 간단한 c언어 프로그램을 빌드해보자.
빌드 툴없이 C언어로 프로그램 빌드하기
main.c 작성
c언어를 잘 모르기 때문에 기본적인 지식만을 이용해 간단한 main.c 코드를 작성했다. int형 변수 a, b를 받아서 덧셈, 뺄셈 함수인 sum(), sub() 함수를 통해 덧셈, 뺄셈 결과를 출력하는 아주 간단한 코드다. 이 때, 두 함수는 헤더파일 calculator.h에 정의되어 있다. 따라서 calculator.h를 작성하자.
calculator.h 작성
헤더파일 안에도 간단하게 두 함수를 정의해주었다. 이제 각 함수를 구현해주면 된다.
sum.c, sub.c 작성
sum함수와 sub함수는 간단하게 두 정수형 변수를 받아 각각 더하거나 뺀 뒤 다시 돌려주는 함수다.
파일 확인
이제 cTest라는 디렉토리에 위에서 작성한 네 개의 파일이 생겼다. 이제 이 파일을 각각 object파일로 컴파일한 뒤 실행파일로 만들어 줄 것이다. 컴파일러는 gcc를 사용하도록 한다.
컴파일 및 실행
gcc 컴파일러를 이용해 main.c, sum.c, sub.c 파일을 각각 object파일로 컴파일했다. 이제 각 object파일들을 링킹해서 실행 가능한 calculator.exe파일로 만들고 실행했더니 다음과 같이 실행결과가 출력됐다.
아주 간단한 예제였지만, 이보다 더 복잡하고 서로 얽혀있는 프로그램을 빌드하기 위해서는 얼마나 어려울지 대략적으로 감이 온다. 또한 저 명령어들 중에서 sum.o를 sum.c로 오타라도 낸다면 sum.c파일이 sum.c라는 이름을 가진 object파일로 대체된다. 대참사 각. 그렇다면 Make를 이용하면 어떨까.
Make를 이용해 빌드하기
Makefile 작성
Make가 참조할 정보를 다음과 같이 적어준다.
<Target>: <Dependencies>
<Recipe>
- Target : 빌드 대상 이름. 이 Rule에서 최종적으로 생성해낼 파일 이름을 적는다.
- Dependencies : 빌드 대상이 의존하는 Target이나 파일 목록
- Recipe : 빌드 대상을 생성하는 명령
아래 clean은 Makefile에 Clean 매크로를 추가하는 코드다.
Make 실행 및 최종 파일 실행
다음을 보면 Makefile에서 작성해 주었던 Clean 매크로를 통해 Make없이 프로그램을 빌드할 때 생성했던 o파일, exe파일을 한번에 제거한 것을 볼 수 있다. 이제 Makefile에 관련 정보를 작성해 주었으므로 make 명령어를 통해 빌드를 수행하면 다음과 같이 같은 결과를 얻을 수 있다.
Make를 이용해 자바 빌드하기
초창기에는 자바도 빌드 도구로 Make를 사용했다고 한다. 하지만 c언어로 개발된 Make를 자바의 빌드 도구로 사용하기에는 많은 제약이 따랐고, 필요성에 의해 자바만의 빌드 도구가 탄생하게 되었다. 아래는 Make를 이용한 자바 빌드 결과다.
main.java 작성
아주 간단한 java 파일을 만들었다.
Makefile 작성
다음과 같이 javac를 이용해 Main.java파일을 Main.class파일로 빌드하는 코드를 작성했다.
빌드 및 실행
다음과 같이 make 명령어를 실행했고 Main.class파일이 만들어졌다. 그리고 실행도 잘 된다.
03. Apache Ant ( 2000- )
"Another Neat Tool"의 약자인 Apache의 Ant는 2000년에 개발된 자바 프로젝트 빌드 도구다. Ant는 선 마이크로시스템즈의 제임스 던컨 데이비슨에 의해 최초로 구상되었다. 제임스는 자바의 JSP/Servlet 표준 구현 엔진(현재 아파치 Tomcat으로 발전)을 오픈소스화 하던 도중 make를 사용하다보니 다른 환경에서는 이를 수행할 수 없었다. 즉, Ant는 최초 톰캣을 빌드하기 위한 툴로 개발되었다.
이전의 자바 빌드 도구였던 Make와의 차이점은 빌드 환경 구성을 Makefile이 아니라 Maven처럼 XML파일로 한다는 점이다. 이전의 make보다는 조금 더 보기 편해졌다. 그럼 위에서 만들었던 Main.java파일을 다시 Ant를 이용해 빌드해보자.
Ant로 자바 빌드하기
build.xml 작성
xml로 빌드 관련 설정들을 해주었다. 우리는 Main.java에 추가적인 클래스들을 임포트하지 않으므로 관련 설정들은 다 빼고 아주 기본적인 것들만 설정해주었다. property같은 경우는 Maven의 pom.xml처럼 변수를 설정할 때 사용된다. main.dir변수는 현재 폴더, class파일을 생성할 폴더는 classes.dir변수로 설정해주었다. 그리고 컴파일한 class파일은 classes 폴더에 생성되게끔 설정해주었다.
빌드 및 실행
위와 같다. 빌드가 정상적으로 실행되어 classes폴더에 Main.class가 생성되었다. 실행도 잘 된다.
기존의 Ant는 의존성 관리 기능이 포함되어 있지 않았지만 이후에 Ivy라는 의존성 관리 프로젝트가 추가되어 의존성 관리도 가능하게 되었다. xml파일을 작성하는데 어떠한 규칙이 없기 때문에 위와 같이 소스코드의 위치, 소스코드의 산출물의 위치 등 모든 것을 정확하게 지정해주어야 하며, 어떤 순서로 빌드를 수행할 것인지까지 전부 지정해주어야 한다. 그러므로 다른 사람이 작성한 프로젝트의 의도를 이해하는데 시간이 걸린다는 단점이 있다. 또한 그러한 단점은 코드를 재사용하기 어렵다는 것으로 이어진다. 하지만 그것이 오히려 유연성이 높아 세세한 컨트롤이 가능하다는 장점이기도 하다.
'프로그래밍 > Java' 카테고리의 다른 글
[Java] Java Build Tools 발전과정 - (3) Gradle (0) | 2023.10.27 |
---|---|
[Java] Java Build Tools 발전과정 - (2) Maven (0) | 2023.10.24 |
[Java] Java기초 - (2) 기초 문법 - 연산자 (0) | 2023.10.18 |
[Java] Java기초 - (2) 기초 문법 - 변수와 리터럴 (0) | 2023.10.12 |
[Java] Java기초 - (1) 역사 (0) | 2023.10.11 |