Gradle dependency를 작성하던 중 어느 곳은 compile을 어느 곳은 implementation을 사용하고 있었다. 둘 다 실행되기는 하겠지만 무슨 차이가 있는 건지 궁금했다.

'Compile' 사용 경우
A라는 모듈을 수정하게 되면, 이 모듈을 직접 혹은 간접 의존하고 있는 B와 C는 모두 재빌드 되어야 한다.
-> 해당 의존성을 직/간접적으로 의존하고 있는 모든 의존성을 재빌드한다.
-> 시간이 오래걸린다.
'implementation' 사용 경우
A라는 모듈을 수정하게 되면, 이 모듈을 직접 의존하고 있는 B만 rebuild or recompile 한다.
-> 해당 의존성을 직접 의존하고 있는 의존성만 재빌드한다.
(사용 예시)
compile group: 'org.apache.logging.log4j', name:'log4j-api',version: '2.14.1'
implementation 'org.projectlombok:lombok:1.18.20'
그런데 Gradle 3.0 부터는 Compile이 deprecated 되었다고 한다.
((21.11)내 버전은 7.2 이다.)
Implementation의 장점
- 빠르다
구조만 봐도 연결된 dependency가 확 줄어들고, change가 발생하더라도 recompile을 적게하니 소요 시간도 적다- API의 노출
Design Pattern에서 흔히 강조하듯, Transparency는 중요하다.
필요한 API만 노출하는 것이 중요하고, 사용자 입장에서 간편하게 사용할 수 있기 때문에 잘 관리하는 것이 중요하다.
만약 compile을 사용하게 되면 연결된 모든 모듈의 API가 노출된다고 한다.
다음과 같이 대체할 수 있다고 한다.
| compile | implementation |
|---|---|
| compile | implementation |
| testCompile | testImplementation |
| debugCompile | debugImplementation |
| androidTestCompile | androidTestImplementation |