Gradle도 잘 모르면서 Spring Boot 하는 인간.. 나야 나

SOUTH DARIA·2022년 6월 25일
16
post-thumbnail

Gradle에 대해서 파헤져보게 된 이유 👀

개인적으로 Spring boot 프로젝트 세팅을 하면서

Could not find method compile() for arguments [org.slf4j:slf4j-api] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.

에러를 마주쳤다.

예전 프로젝트를 참고해서 만들던 탓일까..

구글링을 해보니 compile -> implementation 으로 수정하면 된다는 글을 보고..
두 개의 차이점이 뭐지..?

나는 gradle을 알고 사용하고 있는가?

라는 생각이 들어.. 급하게 공부를 시작했다.
(이럴 때 진짜 즉흥적인 걸 보면 나는 정말 P다.. 라는 생각이 들곤 한..)

Gradle 이란?

Gradle이란, Groovy 기반으로 한 BUILD TOOL이다.

Gradle은 CI / CD 를 위한 아래의 TASK들을 자동화 시켜준다.

  • complie (java 파일을 바이트 코드로 변환)
  • test ( 어플리케이션이 정상작동하는 지를 판단 )
  • packaging (jar & war 파일 생성)
  • deploy & run (실행)

Maven과 같은 이전 세대 빌드 도구의 단점을 보완하여 구성되어졌다.

그래서 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'

출처 : https://bluayer.com/13

compile : A모듈을 수정하게 되면 A를 의존하는 모든 모듈이 rebuild 된다. (해당 사진에서 A,B,C가 모두 재빌드되어 시간이 오래걸린다)
gradle의 장점인 빠른 빌드를 방해하기 때문인지..
gradle 3.0부터 deprecated 되었다. (gradle 3.0 이상 버전 사용불가)

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

끝으로..

아직은 너무 공부할 내용이 많은 것 같다..😭
앞으로 gradle에 대해서 조금씩 더 다가가 보는.. 시간을 가져야겠다...

다음에는 build script를 작성하는 방법에 대해서 더 집중적으로 해봐야겠다.

profile
고양이와 함께 - 끄적끄적 개발하고 이씁니다 ~!

7개의 댓글

comment-user-thumbnail
2022년 6월 26일

헐 이건 진짜 궁금했던 내용인데 :! 유니짱 ჱ̒ ー̀֊ー́ )

1개의 답글
comment-user-thumbnail
2022년 7월 1일

감사합니다 :)
compile과 implementation 차이점을 모르고 무지성으로 썼었는데 확실히 알고 가네요 😀
gradle 3.0 이상부터는 compile을 사용을 권장하지 않는다는 사실도 처음 알았네요

1개의 답글
comment-user-thumbnail
2022년 8월 8일

저도 개인적으로 spring boot를 다루면서
같은 궁금증이 있었지만 모르고 넘어갔던 부분이 였는데,
정리해주신 내용이 유익했습니다. 감사합니다 !!

1개의 답글
comment-user-thumbnail
2023년 6월 7일

Thank you for sharing a very meaningful article, I think it will be very helpful for me and everyone.
Play game the baby in yellow online.

답글 달기