인생을 코딩하다.

[Spring, Gradle] implementation와 api(compile) 본문

Spring

[Spring, Gradle] implementation와 api(compile)

Hyung1 2021. 5. 7. 22:10
728x90
반응형

프로젝트를 시작하며,

 

build.gradle에서 gradle plugin과 관련하여 implementation의 의미가 궁금하였다.

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

이리저리 오픈소스들을 보며 위의 implementation plugin외에

compile 'org.springframework.boot:spring-boot-starter-data-jpa'

 

compile(Api) plugin도 볼 수가 있었다.

 

대략 `implementation`는 상속과 관련이 있다고 추측하고 있었고, `compile`은 컴파일 시에 추가되는 의존성이라고 추측하고 있었다. 

 

추측만 하고있어서 확신을 해보고자 Gradle 공식 문서를 읽고 학습을 한 후, 기록을 남겨본다. 물론 학습 전에는 잘못된 추측이였다.

implementation 사용의 경우

A라는 모듈을 수정하게 되면, 이 모듈을 직접 의존하고 있는 B만 재빌드한다.

즉, implementation 키워드를 사용하는 경우에는, 직접적으로 참고하고 있는 라이브러리만 사용할 수 있다.

 

Main이 있다고 가정하자. 그리고  main -> LibraryA -> LibraryB로 참조가 이루어져 있다고 하자.

main에서는 LibraryA만 참조할 수 있고, LibraryB는 참조할 수 없다.

`Compile` or `api` 사용 경우

A라는 모듈을 수정하게 되면, 이 모듈을 직접 혹은 간접 의존하고 있는 BC는 모두 재빌드 되어야 한다.

즉, compile/api는 모두 직,간접 모두 참조하게 된다.

 

implementation 키워드를 사용하는 경우에는, 직접 참고하고 있는 라이브러리만 사용할 수 있다. 간단히 말해서 main이 LibraryA를 참조하고, LibraryA는 LibraryB를 참조하고 있는 경우, main에서는 LibraryA만 참조할 수 있고 LibraryB는 참조할 수 없다. 반면 api키워드는 compile과 동일하며, api/compile을 사용하는 경우에는 모두 참조할 수 있다.

implementation과 `Compile` or `api` 의 빌드에 소요되는 시간에 따른 차이

만약 LibraryB가 바꼈다고 가정했을때,

 

implementation 경우 직접적으로 의존 관계에 있는 모듈에만 사용하기 때문에 LibraryB를 직접 참조하는 LibraryA만 빌드하면 된다. main은 LibraryB를 직접 참조하지 않기 때문에, 빌드할 필요가 없다.

 

이는 compile/api에 비해서 빌드에 소요되는 시간이 줄어들게 된다고 생각한다.

 

만약 compile/api를 사용해을 경우, main, LibraryA, LibraryB를 모두 다시 빌드해야하기 때문에, implementation에 비해 빌드에 소요되는 시간이 증가할 것이다.

 

이 때문에 Gradle 3.4에서 compile에 관해 추후 지원을 중단한다고 한다.

728x90
반응형
Comments