솔솔
[Gradle] Gradle 의존성 각 범위의 역할과 활용 방법 본문
🍀 시작하기에 앞서

Gradle로 이루어진 프로젝트를 진행하다 보면 의존성 주입 시 의존성 범위(scope)를 지정하는 부분을 자주 보게 된다. 사실 그동안 필요한 의존성을 공식 사이트에서 찾아 복사하여 붙여넣는 방식으로만 사용했기 때문에, 의존성 범위에 대해서는 잘 알지 못한 채로 작업을 해왔다. 그러던 중 최근에 끝난 프로젝트를 정리하면서 갑자기 의문이 생겼다. "각각의 의존성 범위는 어떤 차이가 있을까?" 그래서 이 부분을 공부해보았다.
🍀 의존성 범위란?
Gradle에서 의존성 범위는 특정 라이브러리가 어떤 시점에(컴파일, 실행, 테스트 등) 필요한지, 또는 어떤 환경에서만 필요한지를 정의하는 것. 이러한 범위를 설정함으로써, 프로젝트의 빌드 성능을 최적화하고, 불필요한 라이브러리의 포함을 방지할 수 있다.
🍀 의존성 범위 종류
* 사실 Gradle 공홈에 가서 번역기를 돌리면 '종속성 구성'이라고 번역되지만 나는 '의존성 범위'라고 칭하겠다.
의존성 범위 | 설명 | 사용 예시 |
api | 다른 모듈에서 이 의존성을 사용할 수 있도록 공개하는 의존성. 주로 라이브러리 개발 시 사용되며, 이 의존성은 해당 모듈을 사용하는 다른 모듈에도 포함됨. | 라이브러리 프로젝트에서 다른 프로젝트가 해당 라이브러리를 사용할 때 이 의존성이 자동으로 포함되도록 할 때 사용. |
implementation | 컴파일 시와 실행 시 모두 필요한 의존성. 애플리케이션에서 직접 사용하는 라이브러리나 모듈에 적합. 이 의존성은 다른 모듈에 노출되지 않으며 내부적으로만 사용. | 일반적인 애플리케이션에서 직접 사용하는 라이브러리나 모듈에 사용. |
compileOnly | 컴파일 시에만 필요한 의존성. 이 의존성은 실행 시에는 포함되지 않으며, 컴파일 시에만 사용됨. | 서버나 환경에서 이미 제공되는 라이브러리, 또는 컴파일 시에만 필요한 라이브러리에서 사용. |
compileOnlyApi | compileOnly와 비슷하지만, 이 의존성은 API 모듈에서만 사용되고, 해당 의존성을 다른 모듈에서도 사용할 수 있도록 공개. | 라이브러리 프로젝트에서 컴파일 시에만 필요한 의존성을 다른 프로젝트에서도 사용할 수 있도록 할 때 사용. |
runtimeOnly | 실행 시에만 필요한 의존성. 컴파일 시에는 필요하지 않지만, 애플리케이션이 실행될 때 필요한 라이브러리. | 데이터베이스 드라이버 같은 경우에 사용. |
testImplementation | 테스트 코드에서만 필요한 의존성. 테스트를 실행할 때만 필요하고, 애플리케이션 코드에는 포함되지 않음. | 단위 테스트나 통합 테스트에서만 사용하는 의존성에 사용. |
testCompileOnly | 테스트 컴파일 시에만 필요한 의존성. 이 의존성은 실행 시에는 포함되지 않으며, 오직 테스트 코드 컴파일 시에만 필요함. | 테스트 코드에서만 필요하지만, 실행 시에는 포함되지 않아야 하는 의존성에 사용 |
testRuntimeOnly | 테스트 실행 시에만 필요한 의존성. 이 의존성은 컴파일 시에는 필요하지 않으며, 테스트를 실행할 때만 필요한 라이브러리. | 테스트 실행 시에만 필요한 라이브러리나 모듈에 사용 |
그 외에도 다양한 의존성 범위와 사용자 정의 의존성 범위도 있다.
🍀 결론
의존성 범위를 잘 활용하면 프로젝트에서 필요한 라이브러리를 효율적으로 관리할 수 있을 것 같다. 예를 들어, compileOnly와 runtimeOnly를 사용해 불필요한 의존성을 빌드 과정에서 제외하고, testImplementation, testCompileOnly, testRuntimeOnly 등을 통해 테스트 환경을 분리하여 의존성 충돌을 방지할 수 있다. 이렇게 의존성 범위를 정확히 설정하면 프로젝트가 커져도 관리가 용이해지고, 빌드 성능을 최적화하는데도 좋을 것 같다.
🔹 참고 서적 및 자료
1. Gradle 공홈: https://docs.gradle.org/current/userguide/dependency_configurations.html
2. Chat GPT