api:
모듈 간의 의존성을 정의할 때 사용합니다.
api로 의존성을 추가하면 해당 모듈을 의존하는 모든 다른 모듈에서도 이 의존성을 접근할 수 있습니다.
즉, A 모듈이 B 모듈을 api로 의존하면, C 모듈이 A 모듈을 의존할 때 B 모듈의 클래스와 메서드도 접근 가능합니다.
implementation:
모듈 내에서만 의존성을 사용할 때 사용합니다.
implementation으로 의존성을 추가하면 해당 모듈 내에서만 접근할 수 있고, 다른 모듈에서는 접근할 수 없습니다.
즉, A 모듈이 B 모듈을 implementation으로 의존하면, C 모듈이 A 모듈을 의존하더라도 B 모듈의 클래스와 메서드는 접근할 수 없습니다.
왜 api를 사용하는가?
Kotlin Script에서 특정 모듈에 있는 jar 라이브러리를 사용하려면, 해당 라이브러리가 현재 스크립트에서도 접근 가능해야 합니다. api를 사용하면 이 접근성을 보장할 수 있습니다. 반면, implementation을 사용하면 의존성이 해당 모듈 내부에서만 사용 가능하므로, 스크립트에서 접근할 수 없습니다.
예제
예를 들어, build.gradle.kts에서 라이브러리를 추가하는 방법을 보면 다음과 같습니다:
dependencies {
api("com.example:library:1.0.0")
}
이렇게 하면 해당 모듈을 의존하는 모든 모듈에서 com.example:library의 클래스와 메서드를 사용할 수 있습니다.
반면에:
dependencies {
implementation("com.example:library:1.0.0")
}
이렇게 하면 현재 모듈 내부에서만 com.example:library를 사용할 수 있고, 다른 모듈에서는 접근할 수 없습니다.
따라서, Kotlin Script (kts) 파일에서 특정 모듈에 있는 jar 라이브러리를 사용하고 싶을 때는 api를 사용하여 해당 라이브러리를 추가하는 것이 적합합니다.
추가적인 고려사항
만약 프로젝트 구조가 복잡하고, 여러 모듈 간의 의존성이 많다면 api를 남용하는 것보다는 필요한 곳에서만 최소한으로 사용하는 것이 좋습니다. 불필요한 의존성을 줄이고 모듈 간의 결합도를 낮추는 것이 유지보수에 더 유리하기 때문입니다.