Spring Gradle, Maven의 차이

ggwaang·2025년 5월 4일

Gradle : Groovy 기반으로 한 BUILD TOOL

  • Groovy란? JVM에서 실행되는 스크립트 언어
    • 문법이 Java와 아주 가깝고 java와 호환이 되어 Java 클래스 파일을 그대로 Groovy 클래스로 사용할 수 있다.
  • Gradle은 CI / CD 를 위한 아래의 TASK들을 자동화 시켜준다.
    • complie (java 파일을 바이트 코드로 변환)
    • test ( 어플리케이션이 정상작동하는 지를 판단 )
    • packaging (jar & war 파일 생성)
    • deploy & run (실행)

그래서 MAVEN이란?

  • Spring과 자주 사용된다.
  • XML 기반으로 작성된다. ( ex : pom.xml )
  • Ant의 복잡한 빌드 스크립트 개선
  • pom.xml에 필요한 라이브러리를 선언해 해당 프로젝트를 자동으로 불러온다.
  • Gradle에 비해 어렵다. (학습 장벽이 높은 편)
  • 라이브러리의 dependency가 늘어나면 매우 복잡도가 높아진다.

Gradle의 특징

  • Ant(빌드 도구) 와 Maven의 장점을 모아 만들었다.
  • 의존성 관리를 위한 다양한 방법을 제공한다.(dependencies 쵝오!)
  • JVM에서 동작하는 스크립트 언어인 Groovy기반의 DSL를 사용한다.(이전 세대 빌드 도구에서 사용하던 xml을 날림..)
  • Maven의 pom.xml을 Gradle 용으로 변환할 수 있어 Maven 라이브러리를 모두 그대로 가져다 사용할 수 있다 !!!! ( 다양한 repository 사용가능 )
  • Gradle Wrapper를 이용하면 Gadle이 설치되지 않은 시스템에서도 프로젝트를 빌드할 수 있다.
  • Groovy가 자바 문법과 유사해 자바 개발자가 쉽게 익힐 수 있다.

DSL(Domain Specific Language)이란?관련 특정 분야에 최적화된 프로그래밍 언어

Gradle이 빌드가 빨리 된다며? 👀

gradle은 다른 빌드 도구에 비해 빌드 속도가 빠른 편이다.

그 이유에 대해서 알아보자

점진적 빌드(Incremental Build)

점진적 빌드란, 이미 빌드된 파일말고 변경된 파일만 빌드하는 것을 말한다.

빌드 속도가 빠른 가장 큰 이유라고 할 수 있다.

빌드가 정상적으로 진행되지 않을 경우 cache를 clean 해준 뒤 다시 진행한다.

빌드 캐시(Build cache)

먼저 빌드된 파일이 있을 경우, 빌드 캐시를 이용해 해당 내용을 공유한다.

이로 인해 같은 파일이 다시 빌드되지 않아 빌드 시간이 줄어든다.

데몬 프로세스(Daemon Process)

Daemon Process란, 서비스의 요청에 응답하기 위해 오랫동안 살아있는 프로세스

Daemon Process는 메모리 상에 빌드 결과물을 보관한다.

이로 인해 한 번 빌드된 프로젝트는 다음 빌드에서 적은 시간만 소요된다.

gradle 기반의 Spring Boot나 안드로이드 를 실행해본 사람들은 이해할 것이다.

첫 번째 실행보다 두 번째 실행이 훨씬 적응 시간이 소요된다.

Gradle에서 데몬 프로세스를 지원하기 때문에 빌드 시간이 줄어든다.

gradle의 의존성 옵션

  • compile : 의존 라이브버리 수정 시 모든 모듈이 재빌드된다. 본 모듈을 의존하는 모듈은 해당 라이브러리의 api 를 사용할 수 있다.
  • implementation: 의존 라이브러리 수정시 본 모듈까지만 재빌드한다. 본 모듈을 의존하는 모듈은 해당 라이브러리의 api 를 사용할 수 없음
  • api: 의존 라이브러리 수정시 본 모듈을 의존하는 모듈들도 재빌드 본 모듈을 의존하는 모듈들도 해당 라이브러리의 api 를 사용할 수 있음
  • compileOnly: 이름에서 알 수 있듯이 compile 시에만 빌드하고 빌드 결과물에는 포함하지 않는다. runtime 시 필요없는 라이브러리인 경우 (runtime 환경에 이미 라이브러리가 제공되고 있는가 하는 등의 경우)
  • runtimeOnly: runtime 시에만 필요한 라이브러리인 경우
  • annotationProcessor: annotation processor 명시 (ex:lombok)
  • testImplementation : 테스트 코드를 수행할 때만 적용.

compile VS implementation

build.gradle이라는 파일을 보면

의존성 옵션 compile(), implementation()을 자주 보게된다.

compile 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-web'

compile : A모듈을 수정하게 되면 A를 의존하는 모든 모듈이 rebuild 된다. (해당 사진에서 A,B,C가 모두 재빌드되어 시간이 오래걸린다)

gradle의 장점인 빠른 빌드를 방해하기 때문인지..

gradle 3.0부터 deprecated 되었다. (gradle 3.0 이상 버전 사용불가)

implementation. : A모듈을 수정하게 되면 A를 직접적으로 의존하는 모듈까지만 rebuild 한다.(해당 사진에서 A,B가 재빌드되어 compile보다 빠르다)

0개의 댓글