implementation과 compileOnly는 Gradle 프로젝트에서 의존성 관리를 하는 데 사용되는 두 가지 다른 종류의 종속 항목을 정의하는 데 사용되는 Gradle 구성(Configuration)의 일부입니다. 이 두 구성은 목적과 범위에 따라 다릅니다.
implementation
- implementation 구성은 주요 의존성을 정의하는 데 사용됩니다. 이러한 의존성은 컴파일 시에 프로젝트 코드와 함께 컴파일되고 런타임에 클래스패스에 포함됩니다.
- 주로 프로덕션 코드와 관련된 의존성을 정의할 때 사용합니다.
- 장점: 프로젝트 코드와 함께 컴파일되므로 코드 작성 및 테스트에 편리하게 사용할 수 있습니다.
- 단점: 프로젝트 크기가 커질 수 있으며, 모든 의존성이 런타임 클래스패스에 포함되므로 배포 파일 크기가 커질 수 있습니다.
compileOnly
- compileOnly 구성은 컴파일 시에만 필요한 의존성을 정의하는 데 사용됩니다. 이러한 의존성은 런타임 클래스패스에 포함되지 않으며 컴파일이 끝난 후에는 필요하지 않습니다.
- 주로 테스트 의존성 또는 플러그인 의존성을 정의할 때 사용합니다.
- 장점: 런타임 클래스패스에 불필요한 의존성을 추가로 가져오지 않아 불필요한 런타임 오버헤드를 줄일 수 있습니다.
- 단점: 테스트 시에만 사용되는 의존성을 정의하는 경우, 테스트 코드에만 접근이 가능하고 실제 프로덕션 코드에서 사용할 수 없습니다.
장단점 비교
-
implementation 장점
- 사용하기 편하고 간편하게 프로젝트 코드에서 의존성에 접근할 수 있습니다.
- 런타임 클래스패스에 필요한 의존성이 포함되므로 실행 시에 사용 가능합니다.
-
implementation 단점
- 모든 의존성이 프로젝트 크기에 영향을 미치며, 배포 파일 크기가 증가할 수 있습니다.
-
compileOnly 장점
- 불필요한 런타임 클래스패스 오버헤드를 줄이고 배포 파일 크기를 최적화할 수 있습니다.
-
compileOnly 단점
- 프로젝트 코드에서 의존성에 직접 접근할 수 없으며, 주로 테스트 코드나 플러그인과 같이 컴파일 시에만 필요한 경우에 적합합니다.
따라서 implementation과 compileOnly는 프로젝트의 의존성 관리를 세밀하게 제어하기 위한 Gradle의 강력한 기능 중 하나입니다. 선택은 프로젝트 요구 사항 및 성능 최적화 목표에 따라 달라질 수 있습니다.