ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Build] Build Tool - Maven vs Gradle
    Spring/Spring Boot 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으로 떠있는다.

     

     

     

     

     

     

     

     

    참고 문헌

     

Designed by Tistory.