build.gralde에서 라이브러리를 적용시키는 키워드에는 implementation과 compile(api)가 있다.
예전 Gradle에서는 implementation이 없어서 compile을 사용했고 compile이 deprecated되면서 compile 대신에 api 키워드가 사용되었다고 한다.
그럼 이 두 키워드의 차이는 무엇일까?
compile과 implementation의 차이는 가져온 라이브러리의 적용 범위이다.
아래에서 자세히 알아보자.
compile은 build 시 implementation보다 더 많은 라이브러리를 가져온다.
예를 들어, Module A에서 compile로 Library를 가져온 다음 Module B에서 compile로 Module A를 가져올 경우 A가 가져왔던 Library도 같이 가져오게 된다. 이런 경우 아래와 같은 문제점들이 발생한다.
compile과 다르게 implementation은 모듈에서 implementation을 사용해 가져오는 라이브러리는 해당 모듈을 의존하는 모듈에는 가져오지 않는다.
예를 들어 Module A에서 implementation으로 Library를 가져온 다음 Module B에서 implementation을 사용해 module A를 가져와도 Library는 Module B로 가져와지지 않는다. 즉, Library는 Module A에 캡슐화되어 Module B에 노출되지 않게 된다. 이로인해 모듈 수준에서 공개되는 코드를 모듈의 인터페이스로 제한할 수 있어 모듈간 의존성을 줄일 수 있게 된다.
위와 같은 이유들로 Gradle에서는 아래와 같이 compile보단 implementation을 선호한다.
추가 내용
Gradle 7+ 부터는 아예 compile이 제거되었다.