개발 공부 기록
[JAVA] Maven과 Gradle이란? - 개념과 차이점 본문
스프링부트 프로젝트를 만들 때마다 JAVA의 대표적인 빌드 관리 도구인 Maven과 Gradle을 선택해야하는 상황이 옵니다.
여태까지지 Gradle을 사용하는 것이 트렌드라고 하여 별다른 생각없이 Gradle을 사용하였지만, "스프링부트 쇼핑몰 프로젝트 with JPA"란 책에서 Maven을 사용하는 것을 보고 둘의 개념과 차이점을 명확히 알고 넘어가야겠다는 생각이 들어서 글을 작성하게 되었습니다.
🔨빌드 관리 도구란?
빌드 관리 도구는 대표적으로 아래와 같은 작업을 수행합니다.
- 프로젝트에서 필요한 xml, properties, jar 파일들과 우리가 작성한 java 코드를 JVM이나 WAS가 인식할 수 있도록 빌드
- 소스 코드의 컴파일, 테스트 실행, 문서 생성, 패키징, 배포 등의 작업을 담당하며 실행가능한 앱으로 빌드
- 프로젝트에 필요한 외부 라이브러리를 참조하여 자동으로 다운로드 및 업데이트를 관리
1️⃣ Maven이란?
Maven은 JAVA 전용 프로젝트 관리 도구로, JAVA의 대표적인 관리 도구였던 Ant를 대체하기 위해 개발되었습니다. 'pom.xml' 파일을 사용하여 프로젝트의 구조와 의존성, 플러그인, 프로파일 등을 정의하고, 이때 Maven은 필요한 라이브러리와 그 라이브러리에 의존하는 다 라이브러리들까지 자동으로 다운로드 및 관리를 합니다. 기존에 사용하던 Ant는 빌드의 기능만 가지고 있던 반면, Maven은 라이브러리를 자동으로 관리해주는 기능이 추가되어 많이 사용되기 시작하였습니다.
또한 Maven은 미리 정의된 Lifecycle에 따라 빌드 과정을 진행하기 때문에, 빌드를 하기위한 전반적인 단계들을 Maven에 의해 컨트롤할 수 있습니다. 예를 들어, 사용자가 Lifecycle의 특정 단계만 지정하여 실행하면, 해당 단계와 이전 단계들이 자동으로 연쇄적으로 실행됩니다. Lifecycle은 표준화된 프로세스를 제공하여 프로젝트의 빌드와 관련된 일련의 작업들을 일관되게 관리할 수 있게 합니다. 기본적으로 compile, test, package, install, deploy 등의 단계를 포함하며, 각 단계에서 필요한 작업은 플러그인을 통해 수행됩니다.
2️⃣ Gradle이란?
Gradle은 Groovy 스크립트를 활용한 빌드 관리 도구로, 대규모인 멀티 프로젝트(Multi-project)의 빌드에 최적화 하여 설계되었습니다. Gradle은 Groovy 또는 Kotlin을 기반으로 한 DSL을 사용하여 빌드 스크립트를 작성하여 XML과 달리 복잡한 빌드 로직을 쉽고 간결하게 표현할 수 있습니다. 또한 Maven을 완전히 지원하면서도 Maven에 비해 더 빠른 속도로 빌드가 가능합니다. Gradle은 업데이트가 이미 반영된 빌드 부분은 더이상 재실행되지않고 패스하기 때문입니다.
멀티 프로젝트(Multi-project)란? - 여러 하위 프로젝트가 포함된 프로젝트
3️⃣ Maven과 Gradle
Maven의 경우에는 'pom.xml' 파일을 사용하고 Gradle의 경우에는 'build.gradle'을 사용합니다.
프로젝트의 의존성(외부 라이브러리나 모듈)이 많아질수록, 빌드 스크립트의 품질이 중요해집니다. 이때 Maven은 프로젝트 규모가 커질수록 스크립의 내용이 길어지고 가독성이 떨어지는 반면, Gradle은 상대적으로 적은 양의 스크립트로 짧고 간결하게 작성할 수 있습니다.
Maven과 Gradle은 멀티 프로젝트의 설정을 공유하는 방식이 다릅니다.
Maven은 상위 프로젝트의 설정을 하위 프로젝트에 적용하기 위해 '상속'을 사용합니다. 이 방식은 중앙화된 설정 관리에는 유리할 수 있지만, 특정 하위 프로젝트만 다르게 설정하고 싶은 경우에는 제약이 있을 수 있습니다.
Gradle은 '설정 주입'을 통하여 중앙에서 정의한 설정을 필요한 하위 프로젝트에게만 주입하는 방식을 사용합니다. 이 방식은 각 하위 프로젝트에게 유연하게 설정을 적용할 수 있어 멀티 프로젝트 구조에 더 적합할 수 있습니다.
프로젝트의 규모와 복잡도가 증가함에 따라 빌드 도구의 선택이 중요해지는 거 같습니다. 가독성이나 속도 반면에서 Gradle을 사용하는 것이 나을 것 같아 사이드 프로젝트를 진행할 때는 Gradle을 사용하겠지만, Maven을 사용해서 토 프로젝트를 한 번 진행해볼 생각입니다.
References
'JAVA > Concept' 카테고리의 다른 글
[JAVA] 예외 처리에 대해서 (0) | 2023.10.13 |
---|---|
[JAVA] 비트마스크(Bit Mask)란? (0) | 2023.09.20 |
[JAVA] 인접 행렬과 인접 리스트 (0) | 2023.08.09 |
[Java] BufferedReader, StringTokenizer 클래스 사용방법 (0) | 2023.08.04 |