Gradle compile, implementation 차이점

박민희·2023년 5월 1일

의존성이란

클래스 A가 다른 클래스 (혹은 인터페이스) B를 사용할 때 A는 B에 의존한다고 이야기한다. 즉, 한 객체의 코드에서 다른 객체를 생성하거나 다른 객체의 메서드를 호출할 때, 그리고 파라미터로 객체를 전달받아 사용할 때 의존성이 발생한다고 할 수 있다.

implementation vs api(compile)

최근 버전에서는 compile은 deprecated 되었고, 같은 기능을 하는 api가 남아있다.
하지만 implementation 사용을 권장한다.

Module B <- Module A <- Library

만약 위와 같은 형태로 Module A가 Library에 의존하고 있고, 그 Module A를 Module B가 의존하고 있을 때

compile을 이용해 Module A를 Module B에 추가하는 경우, Module A의 상위 Module인 Library까지 함께 가져온다.

implementation을 이용해 Module A를 Module B에 추가하는 경우, Module A만 가져온다. 따라서 Library는 Module A 내부에서만 실행되고 Module B에서는 접근할 수 없다.

implementation의 장점

모듈 간의 의존성을 줄일 수 있다. 유지보수성을 높이기 위해 내부 구조를 숨기고 인터페이스를 제공하여 내부 동작과 상관없이 라이브러리를 사용할 수 있도록 하였지만, 상위 Module까지 함께 가져와 기능을 사용할 수 있다면 계층을 분리한 의미가 없어진다.

빌드 시간에 이점이 있다. 만약 상위 모듈인 Library가 변경되었을 때, compile을 사용하는 경우 Module A와 Module B 모두 Library를 의존하고 있어 모두 다시 빌드가 이뤄져야 한다.
하지만 implementation을 사용할 경우 Library를 직접 의존하는 Module A만 다시 빌드하고, Module A의 인터페이스는 바뀐 부분이 없으므로 Module B는 그대로 사용 가능하다.

참조

https://kotlinworld.com/317

profile
한 줄 소개

0개의 댓글