[Gradle] implementation과 compile의 차이

김우진·2022년 8월 26일
0

들어가기 전

build.gralde에서 라이브러리를 적용시키는 키워드에는 implementation과 compile(api)가 있다.
예전 Gradle에서는 implementation이 없어서 compile을 사용했고 compile이 deprecated되면서 compile 대신에 api 키워드가 사용되었다고 한다.
그럼 이 두 키워드의 차이는 무엇일까?

implementation과 compile의 차이

compile과 implementation의 차이는 가져온 라이브러리의 적용 범위이다.
아래에서 자세히 알아보자.

compile(api)

compile은 build 시 implementation보다 더 많은 라이브러리를 가져온다.

예를 들어, Module A에서 compile로 Library를 가져온 다음 Module B에서 compile로 Module A를 가져올 경우 A가 가져왔던 Library도 같이 가져오게 된다. 이런 경우 아래와 같은 문제점들이 발생한다.

  • Module을 사용할 때 Module의 인터페이스만이 외부에 노출되어야 하는데, Library의 인터페이스까지 외부로 같이 노출된다.
  • Module A를 빌드할 때도 Library가 추가되기 때문에 Library가 중복으로 추가되어 Leak 문제가 발생한다.
  • 만약 직접적으로 Library를 사용할 필요가 없다면 빌드 시간만 오래 걸리게 된다.
  • 위와같은 문제로 유지보수성 측면에서 좋지 않다.

implementation

compile과 다르게 implementation은 모듈에서 implementation을 사용해 가져오는 라이브러리는 해당 모듈을 의존하는 모듈에는 가져오지 않는다.
예를 들어 Module A에서 implementation으로 Library를 가져온 다음 Module B에서 implementation을 사용해 module A를 가져와도 Library는 Module B로 가져와지지 않는다. 즉, Library는 Module A에 캡슐화되어 Module B에 노출되지 않게 된다. 이로인해 모듈 수준에서 공개되는 코드를 모듈의 인터페이스로 제한할 수 있어 모듈간 의존성을 줄일 수 있게 된다.

implementation vs compile

위와 같은 이유들로 Gradle에서는 아래와 같이 compile보단 implementation을 선호한다.

추가 내용
Gradle 7+ 부터는 아예 compile이 제거되었다.

출처

0개의 댓글