Android Gradle Plugin 3.0의 Implementation과 api

2019. 2. 7. 11:29Programming/Android

반응형

Configuration ‘compile’ is obsolete and has been replaced with ‘implementation’ and ‘api’.

Android Studio 3.0에서 빌드를 시도하려고 하니, 위와 같은 오류가 발생했다. compile이 deplecated 됐으니, 대신 implementation이나 api를 사용하라는 내용이다. 그런데 deprecated된 키워드는 하나인데, 대체 키워드는 왜 두 개지? 궁금해서 검색하다가, 다음과 같은 글을 발견했다.

원문; Implementation Vs Api in Android Gradle plugin 3.0, Bedanta Bikash Borah
번역; Implementation Vs Api in Android Gradle Plugin, 오경식 님

위 글에는 Api와 Implementation의 차이가, 예제와 함께 자세히 설명되어 있다. 번역도 잘 되어있으므로, 꼭 한번 읽어보도록 하자.


implementation과 api의 차이

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

implementation과 api를 구분해서 사용하는 목적

compile이 api, implementation 두 개의 키워드로 구분된 이유는, 빌드에 소요되는 시간 때문이다. 위에 링크를 걸어놓은 글에서도 잘 설명되어있지만, Implementation vs API dependency, Jeroen Mols의 Problem situation과 빌드 구성, Android Developers을 읽어보도록 하자. compile과 api를 사용할 경우에는 항상 의존관계에 있는 모든 라이브러리까지 다시 빌드하므로, 빌드에 상당한 시간이 소요되게 된다.

하지만 implementations을 사용할 경우에는 직접 의존관계에 있는 모듈에만 사용하므로, 이러한 문제를 어느정도 해결할 수 있다. 위에서 예제로 든 main->LibraryA->LibraryB관계에서, LibraryB가 바꼈다고 가정하자. 이 때 api키워드를 사용했다면, main, LibraryA, LibraryB를 모두 다시 빌드해야 한다. 하지만 implementation를 사용하면, 변경된 LibraryB를 직접 참조하는 LibraryA만 빌드하면 된다. mainLibraryB를 직접 참조하지 않으므로, 빌드할 필요가 없다. 따라서 빌드에 소요되는 시간이 줄어들게 된다.

이러한 내용은 의존성이 복잡하면 복잡할수록, 빛을 발하게 된다.

반응형