Spring/Spring Boot

[Build] Build Tool - Maven vs Gradle

푸라멘 2024. 4. 5. 00:25

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으로 떠있는다.

 

 

 

 

 

 

 

 

참고 문헌