우선 이 둘은 빌드 관리 도구이다.
소스코드 파일을 컴파일에서 실행할 수 있는 가공물로 변환하는 과정 또는 결과물이다. 다시말하면 우리 작성한 소스코드(java), 프로젝트에서 쓰인 각각의 파일 및 자원등(.xml,jpa,jpg,properties)을 jvm이나 톰캣같은 WAS가 인식할 수 있는 패키징하는 과정 및 결과물이라고 할 수 있다.
소스코드에서 어플리케이션 생성을 하면서 여러가지 여부 라이브러리를 사용하는데, 이 빌드 관리 도구는 사용자가 직접 관리할 필요 없이 필요한 라이브러리들을 자동으로 관리한다.
프로젝트를 진행하게 되면 단순히 자신이 작성한 코드만으로 개발하는 것이 아니라 많은 라이브러리들을 활용해서 개발을 하게 된다. 이 때 사용되는 라이브러리들의 수가 수십개가 훌쩍 넘어버리는 일이 발생해 이 많은 라이브러리들을 관리하는 것이 힘들어지는 경우가 종종 발생하곤 한다.
Maven은 이러한 문제를 해결해 줄수 있는 도구이다. Maven은 내가 사용할 라이브러리 뿐만 아니라 해당 라이브러리가 작동하는데 필요한 다른 라이브러리들까지 관리하여 네트워크를 통해 자동으로 다운 받아준다.
Maven은 프로젝트의 전체적인 라이프사이클을 관리하는 도구이며, 많은 편리함과 이점이 있어 널리 사용되고 있다. 기존에는 Ant가 많이 사용되었지만 Maven이 Ant를 넘어서 더 많은 개발자들이 사용하게 되었고 비교적 최근에는 Gradle이 새롭게 나와 사용되고 있다.
Maven은 JDK설치와 같이 설치할 수 있다. 환경변수 잡아주고 하면 cmd에서 mvn –version을 통해 버전을 알 수 있고 설치가 가능하다. 설치는 메이븐 홈페이지 에서 할 수 있다.
Gradle이란 기본적으로 빌드 배포 도구(Build Tool)이다. 안드로이드 앱을 만들때 필요한 공식 빌드시스템이기도 하며 JAVA, C/C++, Python 등을 지원한다.
빌드툴인 Ant Builder와 그루비 스크립트를 기반으로 구축되어 기존 Ant의 역할과 배포 스크립트의 기능을 모두 사용가능하다.
기본 메이븐의 경우 XML로 라이브러리를 정의하고 활용하도록 되어 있으나, Gradle의 경우 별도의 빌드스크립트를 통하여 사용할 어플리케이션 버전, 라이브러리등의 항목을 설정 할 수 있다.
장점으로는 스크립트 언어로 구성되어 있기때문에, XML과 달리 변수선언, if, else, for등의 로직이 구현가능하여 간결하게 구성 가능하다.
라이브러리 관리 : 메이븐 레파지토리를 동일하게 사용할 수 있어서 설정된 서버를 통하여 라이브러리를 다운로드 받아 모두 동일한 의존성을 가진 환경을 수정할 수 있다. 자신이 추가한 라이브러리도 레파지토리 서버에 올릴 수 있다.
프로젝트 관리 : 모든 프로젝트가 일관된 디렉토리 구조를 가지고 빌드 프로세스를 유지하도록 도와준다.
단위 테스트 시 의존성 관리 : junit 등을 사용하기 위해서 명시한다.
지금 시점에서 Gradle을 사용하지 않을 이유는 익숙함 뿐인 것 같다. Gradle이 출시되었을 때는 Maven이 지원하는 Scope를 지원하지 않았고 성능면에서도 앞설것이 없었다. Ant의 유연한 구조적 장점과 Maven의 편리한 의존성 관리 기능을 합쳐놓은 것만으로도 많은 인기를 얻었던 Gradle은 버전이 올라가며 성능이라는 장점까지 더해지면서 대세가 되었다.
물론 그동안 사용해왔던 Maven과 이제는 익숙해진 XML을 버리고 Gradle과 Groovy문법을 배우는 것은 적지않은 비용이 든다. 특히 협업을 하는 경우, 프로젝트 구성과 빌드만을 위해 모든 팀원이 Groovy 문법을 익혀야 한다는 사실은 Gradle을 사용하는데 큰 걸림돌이 된다.
실제로 여전히 Maven의 사용률은 Gradle을 앞서고 있으며, 구글 트랜드 지수도 Maven이 Gradle을 앞선다.
협업과 러닝커브를 고려하여 여전히 Maven을 사용하는 팀이 많고 부족함 없이 잘 사용하고 있지만, 빌드타임 비용문제로 이어질경우 Gradle을 사용해야 할 것 같다. 왜냐하면 Gradle이 Maven보다 최대 100 배 빠르기 때문이다.