인텔리제이(InteliJ)
의 IDEA
를 사용하다보면 아래 이미지와 같은 부분을 볼 수 있는데 이 부분의 차이를 오늘에서야 알게 되었다! 이 부분에 대해 진작 궁금했지만, 제대로 알아볼 생각은 미처 하지 못했었다. Spring
으로 넘어오면서 이들에 대해 알게 되었는데 아래에 정리해보았다.
새 프로젝트를 생성할 때 Build system
을 선택하도록 되어있는 부분을 확인해볼 수 있다.
메이븐과 그레이들, 이 둘은 모두 자바 생태계에서 사용하는 빌드 관리 도구
이다.
우리가 사용하는 소스 코드는 사용자가 바로 사용할 수 없는 형태이기 때문에 사용자가 애플리케이션 형태로 사용할 수 있는 모습을 갖추려면 빌드
라는 과정을 거쳐야한다고 한다. 이런 빌드 과정에서 필요한 것들을 관리하고 자동화하는 도구를 빌드 관리 도구
라고 한다.
이 과정에는 의존성 내려받기
, 코드 패키징
, 컴파일
, 테스트 실행
등이 포함되어 있다.
그리고 예전에는 메이븐을 많이 사용했지만, 요즘은 그레이들을 많이 사용하는 추세라고 한다.
그레이들(Gradle)의 특징
- 메이븐에 비해 가독성이 좋고 설정이 간단하다.
- 자바, 코틀린, 그루비 등 다양한 언어를 지원하며 원하는대로 빌드 스크립트를 작성할 수 있다.
- 빌드와 테스트 속도가 메이븐에 비해 더 빠르다.
하지만 이런 간단한 특징 3가지만으로 메이븐에서 그레이들로 이동한 이유를 납득하지 못했다.
내가 사용하는 모든 도구와 행동에는 이유가 명확해야한다고 생각하기 때문에 우선, 메이븐이 무엇인지에 대해 알아보기로 했다.
앞서 설명한 것과 동일하게 Java프로젝트를 위한 빌드 자동화 도구로 빌드
, 패키징(jar 또는 war 생성)
, 테스트
, 외부 라이브러리 관리 및 배포
등을 한 번의 명령으로 간편하게 처리할 수 있다.
과거에는 필요한 라이브러리를 직접 다운로드하고 프로젝트 폴더에 수동으로 배치해 관리해야 했기에 라이브러리의 버전이 변경될 때마다 다시 다운로드하고 업데이트해야하는 번거로움이 많았다고 한다.
Maven
이 등장하기 이전에는 Ant
라는 빌드 관리 도구를 사용했지만, Ant
에는 외부 라이브러리 관리 기능이 부족해서 부족한 점을 보완해 나온 것이 Maven
이 등장한 것이었다. 단점을 보완하는 동시에 표준화된 프로젝트 구조와 빌드 방식을 지원해 빌드 작업을 더욱 간소화하고 효율적으로 만들어주었다고 한다.
메이븐 간단 정리
자동으로 빌드 및 테스트, 패키징을 자동으로 수행해주어 개발 생산성 향사!
Maven
은POM.xml(Project Object Model)
파일을 사용해 빌드 설정을 관리함
다양한 프로젝트를 빠르게 생성하기 위한 아키타입(archeType)을 제공함
단점 : XML기반의 빌드 파일을 사용해 가독성이 떨어짐
2007년 JetBrains
회사의 Hans Docter
가 개발한 오픈 소스 빌드 자동화 도구로 Apache Ant
와 Apache Maven
의 장점을 결합하여 만들어졌다. Groovy
기반 스크립트 방식을 사용하여 build.gradle
이라는 빌드 파일을 만들기 때문에 가독성이 좋고 스크립트를 통해 여러가지 상황에 적합한 빌드를 만들어낼 수 있다. (유연함!)
이러한 유연성 덕에 빌드 과정에서 병렬 처리와 캐싱을 활용해 Maven
보다 10~100배
까지 향상된 성능을 구현할 수 있게 되었다. 이런 장점 덕에 안드로이드 개발을 위한 공식 빌드 도구로 지정되었고 안드로이드 애플리케이션을 빌드하고 관리할 때 많이 사용되고 있다고 한다.
그레이들(Gradle) 간단정리
- 메이븐에 비해 가독성이 좋고 설정이 간단하다.
- 자바, 코틀린, 그루비 등 다양한 언어를 지원하며 원하는대로 빌드 스크립트를 작성할 수 있다.
- 빌드와 테스트 속도가 메이븐에 비해 더 빠르다.
항목 | Maven | Gradle |
---|---|---|
설정 언어 | XML | Groovy 또는 Kotlin |
빌드 스크립트 | 선언적 | 선언적 + 명령적 |
성능 | 상대적으로 느림 | 캐싱 및 병렬 빌드로 인해 더 빠름 |
의존성 관리 | 고정된 생명 주기와 의존성 관리 방식 | 유연한 생명 주기와 의존성 관리 방식 |
플러그인 생태계 | 방대한 플로그인 생태계 | 풍부한 플러그인 생태계, 다양한 커뮤니티 플러그인 |
빌드 구성 | 표준화된 구성 | 구성 가능성 높음 |
학습 곡선 | 상대적으로 완만함 | 다소 가파름 |
확장성 | XML 기반으로 확장에 제한적임 | Groovy, Kotlin 스크립트를 통해 높은 확장성 |
도구 통합 | IDE 및 CI 도구와의 통합이 잘 되어 있음 | IDE 및 CI 도구와의 통합이 잘 되어 있음, 특히 Gradle Wrapper 지원 |
안드로이드 지원 | 기본 지원하지 않음 | 안드로이드 스튜디오의 기본 빌드 시스템 |
생명주기 | 고정된 빌드 생명주기 | 유연한 생명주기 및 사용자 정의 테스크 가능 |
Maven과 Gradle을 알아보니, 보완하여 나온 관계이지만 각각의 장점과 특성이 명확하한 빌드 도구라는 생각이 들었다. 그렇다면 이 둘을 어떨 때 사용해야 효율적으로 쓸 수 있을지 고민해보았다!
Maven : 간단한 프로젝트 or 명확한 구조와 표준화가 요구되는 프로젝트
Maven은 단순하고 일관된 빌드 생명 주기를 제공하고 표준화된 프로젝트 관리에 뛰어나기 때문
Gradle : 성능 최적화가 필요하거나 복잡한 빌드 프로세스를 관리해야하는 경우
Gradle은 유연한 구성과 뛰어는 성능을 제공하기에 Groovy 스크립트 언어를 사용해 복잡한 빌드 요구사항을 효과적으로 처리할 수 있기 때문
각각 최적의 용도에 맞춰 프로젝트에 활용한다면 프로젝트 관리와 빌드 프로세스의 효율성을 크게 향상시킬 수 있을 것 같아서 반드시 기억해두어야할 것 같다고 생각이 들었다.