[Build] Build Tool - Maven vs Gradle
Build 란?
Build는 작성된 코드를 실제 기기에서 실행 될 수 있는 소프트 웨어로 변환시키는 과정을 의미한다.
Build 과정의 세분화
- 라이브러리 다운로드
- 소스코드 컴파일
- 컴파일한 코드 패키징
- 테스트 코드 실행
- product 배포
Build Tool이란?
규모가 작은 프로젝트라면 간단하지만 큰 프로젝트라면 위 과정을 수동으로 진행하면 많은 시간이 걸리게 된다.
이러한 Build 과정을 자동으로 진행 시키는것이 Build Tool이다. (+ 외부 라이브러리 버전 관리)
Java에서 사용하는 Build Tool 종류
Ant
- XML을 사용
- 간단하고 사용하기 쉬움
- 자유로운 빌드 단위 지정
- 복잡한 프로젝트 경우 장황해짐
- 외부 라이브러리 관리 기능이 없음
- 라이프 사이클 없음
Maven
- XML 사용
- 외부 라이브러리 관리 기능 추가 (pom.xml)
- Ant보다 작성법 체계화
- 라이브러리 저장 장소 : ~/.m2
- 라이프 사이클 도입
- default : 프로젝트 빌드 및 배포
- validate : 빌드를 위한 프로젝트 정보의 유효성 체크
- compile : 코드를 컴파일
- test : 컴파일된 소스코드를 사용하여, 단위 테스트 수행
- package : 배포할 파일 형시으로 패키징 (jar, war)
- verify : 패키지의 유효성을 검사하고, 품질 기준을 만족하는지 체크
- install : 로컬 repository에 패키지를 설치 (다른 프로젝트가 참조가능)
- deploy : 최종 패키지를 원격 repository에 복
- clean : 이전 빌드에서 생성된 파일들을 삭제
- site : 프로젝트 사이르르 생성
pom.xml
- modelVersion : Maven 버전
- groupId : 프로젝트의 그룹 Id, 일반적으로 대표하는 사이트 도메인의 역순
- artifactId : 다른 프로젝트 와 구분되는 프로젝트 Id
- version : 프로젝트의 버전
- properties : pom.xml 파일 내 자주 사용되는 중복상수를 정의하는영역 properties 태그안의 지정된 태그를 ${태그명} 형태로 사용 -> ex) ${java.version}
- dpendencies : 해당 프로젝트에서 의존성을 가지고사용하는 라이브러리를 정의하는 영역 (의존된 라이브러리를 모두 다운로드 한다.)
ex)
dependencies에는 spring-boot-starter-web 과 spring-boot-starter-thymeleaf 만 존재하지만 관련있는 다양한 라이브러리가 다운받아짐
- build : 프로젝의 빌드와 관련된 정보를 설정
Gradle
- Groovy 언어 사용 (JVM에서 사용하는언어)
- 외부 라이브러리 관리 (build.gradle)
- 유연하게 빌드 스크립트 작성 가능
- Maven 보다 성능이 좋음
- 멀티프로젝트의 빌드에 최적화 하여 설계
- 라이브러리 저장 장소 : ~/.gradle
build.gradle
- plugins : Gradle에 기본적으로 포함되지 않는 tasks 들의 집합 -> ex) java를 추가하여 소스 코드 빌드, 스프링 프레임워크를 추가하여 의존관계 관리 task를 추가한다.
- repositoreis : dependencies에서 지정한 라이브러리를 가져올 저장소를 지정한다.
- dependecies : 의존성 라이브러리를 추가 할 때 사용
- implementation : 의존성 라이브러리 수정 시 본 모듈까지만 재빌드한다.
- api 의존 라이브 러리 수정시 본 모듈을 의존하는 모든 모듈을 재빌드한다.
- compileOnly : compile시에만 빌드하고 결과물에 포함하지 않는다.
- testImplementation : 테스트 코드를 수행 할 때만 적용한다
- test : test task시 수행할 동작 설정
gradle과 gradlew의 차이
- gradle : task 실행시 로컬에 설치된 gradle로 실행하게 gradle이 설치되어있지 않거나 버전이 맞지 않을 경우 Error가 날 수도...
- gradlew : task 실행시 grade-wrapper에 명시된 gradle 설정 정보를 이용하여 해당 버전이 없으면 다운로드 하여 조건에 맞게 실행시킨다.
gradle-wrapper.properties
gradlew workflow
gradle의 buidl 속도가 빠른이유
- 병렬 처리 (--parellal 옵션)
- 빌드 되는 모듈순서는 기본적으로 하위 모듈 -> 상위 모듈 순이지만 --parellal 옵션을 사용하여 병렬 처리가 가능하다.
- 점진적 빌드(Incremental Build)
- 이미 빌드된 파일들을 모두 다시 빌드하는 것이 아닌 바뀐 파일들만 빌드
- gradle은 빌드 실행 중 마지막 빌드 호출 이후에 task 입력, 출력 혹은 구현이 변경됬는지 확인
- 최신 상태로 간주하지 않는다면 빌드는 실행되지 않음 -> ex) java파일 20개중 5개만 변경되었다면 5개만 컴파일 한다.
- Build Cache
- 두 개 이상의 빌드가 돌아가고 하나의 빌드에서 사용되는 파일들이 다른 빌드들에 사용된다면 Gradle은 빌드 캐시를 이용해 이전 빌드의 결과물을 다른 빌드에서 사용
- Daemon Process
- 한번 빌드 된 프로젝트를 메모리에 올려놓아 다음 빌드시 소모시간이 단축된다. -> gradle은 한번 실행 시 죽지 않고 daemon으로 떠있는다.
참고 문헌
- https://doing7.tistory.com/56
- https://www.youtube.com/watch?v=L19wXSpv5cs
- https://www.youtube.com/watch?v=3Jp9kGDb01g&t=912s
- https://hmdev.vercel.app/Gradle-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0:-%EC%B4%88%EB%B3%B4%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%99%84%EB%B2%BD%ED%95%9C-%EA%B0%80%EC%9D%B4%EB%93%9C
- https://hianna.tistory.com/769
- https://sabarada.tistory.com/198
- https://v3.leedo.me/devs/67