본문 바로가기
  • 오늘도 한걸음. 수고많았어요.^^
  • 조금씩 꾸준히 오래 가자.ㅎ
IT기술/개발툴

[Gradle] Gradle 의존성 옵션 정리(Compile VS implementation,옵션)

by 미노드 2023. 5. 17.

내가 일하는 곳은 Gradle로 프로젝트를 빌드합니다.

그래들(Gradle)은 가장 최근에 나온 자바 빌드 도구로 '그루비(Groovy)' 문법을 사용하고,
Build.gradle에 스크립트를 작성하며, 
대규모 프로젝트에서 복잡해지는 경향이 있는 XML 기반 스크립트에 비해 관리가 편하다는 장점이 있습니다.

때문에 maven처럼 xml 기반으로 dependency를 관리하는 것 보다 관리가 편하다고 하는데, 가시성 때문이지
적응되면 큰 차이는 없다고 생각합니다.

그럼에도 gradle이 더 좋다고 쓰는 분들이 많은 것 같습니다.
결국 gradle의 설정도 만질 줄 알아야 되는 부분인지라 이번 기회에 정리해보려 합니다.

* Spring boot에서 사용되는 gradle

SpringBoot로 프로젝트를 만들 때 Build Tool을 고르는 부분이 있습니다.
Gradle 도 있고 maven 도 있습니다.

gradle로 선택하고 여러 의존성을 선택해 프로젝트를 만들면, 의존성이 주입될 때 사용되는 명령어들이 있습니다.

Compile VS implementation

compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.14.1'
implementation 'org.springframework.boot:spring-boot-starter-security'

의존성 주입이라는 것은 같지만, 명령어가 다릅니다.
차이점이 있을까요?

1. compile을 사용하는 경우 (중간그림)

A모듈을 수정하게 되면 A를 의존하는 모든 모듈이 rebuild 된다. (빌드를 하는만큼 시간이 걸린다.)

2. implementation을 사용하는 경우 (오른쪽그림)

A모듈을 수정하게 되면 A를 직접적으로 의존하는 모듈까지만 rebuild 한다.(A와 직접적으로 보이는 것만 빌드한다.)

이는 compile 보다 빠르며, 필요 이상의 API를 안 봐도 된다.
사용자에게 필요이상의 API를 노출하는 것은 불필요하다.(Facade 패턴)
compile을 사용하면 연결된 모든 모듈의 API가 노출된다.

3. 의존성 옵션들 정리

implementation: 의존 라이브러리 수정시 본 모듈까지만 재빌드한다.
본 모듈을 의존하는 모듈은 해당 라이브러리의 api 를 사용할 수 없음

api: 의존 라이브러리 수정시 본 모듈을 의존하는 모듈들도 재빌드
본 모듈을 의존하는 모듈들도 해당 라이브러리의 api 를 사용할 수 있음

compileOnly: 이름에서 알 수 있듯이 compile 시에만 빌드하고 빌드 결과물에는 포함하지 않는다.
runtime 시 필요없는 라이브러리인 경우 (runtime 환경에 이미 라이브러리가 제공되고 있는가 하는 등의 경우)

runtimeOnly: runtime 시에만 필요한 라이브러리인 경우

annotationProcessor: annotation processor 명시 (ex:lombok)

testImplementation : 테스트 코드를 수행할 때만 적용.