들어가며
DB를 연동하면서 Gradle 에
runtimeOnly 'mysql:mysql-connector-java:8.0.28'
의존성을 추가해주었다. 아무 생각 없이 사용하였었는데 리뷰어인 토니로부터
이렇게 퀴즈를 받게 되었다 !
Classpath
클래스 혹은 Jar파일이 존재하는 위치이다.
gradle의 Dependencies는 compieClasspath, runtimeClasspath, testCompileClasspath, testRuntimeClasspath 로 구분이 된다.
앞 2개는 로직을 실행할 때, 뒤 2개는 test 로직을 수행할 때 사용된다.
CompileCalsspath
- 컴파일을 잘 수행하기 위해 필요한 클래스 및 jar을 나타낸다.
RuntimeClasspath
- 런타임시 애플리케이션이 잘 실행되기 위한 클래스와 jar을 나타낸다.
CompileOnly
컴파일 전용 종속성 지원이다. 이는 컴파일 시간에만 사용되는 비전이적 종속성을 선언할 수 있다.
이 종속성을 사용하는 사례는
- 컴파일 시간에는 필요하지만 런타임에는 필요하지 않은 종속성
- 컴파일 시간에 필요하고, 런타임에 특정 기능을 사용할때만 필요한 종속성
- 컴파일 시간에 필요하고, 라이브러리, 애플리케이션이 런타임환경에서 구현을 할 필요가 있을 때
compileClassPath에만 추가하겠다는 뜻이다.
이렇게 함으로써 빌드 결과물의 크기가 줄어드는 장점이 있다.
RuntimeOnly
런타임 전용 종속성 지원이다. 이는 런타임시에만 필요한 라이브러리의 종속성을 선언할 수 있다.
runtimeClassPath에만 추가하겠다.
해당 클래스에서 코드 변경이 발생해도 컴파일을 다시 할 필요가 없다.
dependencies {
runtimeOnly 'mysql:mysql-connector-java:8.0.28'
}
implementation
컴파일 시간에 다른 모듈에 대한 종속성을 드러내지 않으려고 할 때 사용된다. 사용할 경우 빌드 시스템이 컴파일할 양이 줄어들어서 빌드 시간이 향 상될 수 있다.
특정 api가 변경될 경우 gradle은 해당 종속성과 이에 직접 종속되는 모듈만 다시 컴파일한다.
현재 프로젝트 모듈에서만 해당 의존성을 사용하고, 해당 모듈이 의존하는 다른 모듈들과는 공유하지 않는다.
해당 모듈 내부에서만 의존성을 사용하고 다른 모듈에서는 사용하지 않는다면 Implementation을 사용하는 것이 좋다.
A모듈에서
implementation 'com.wooteco.ocean'
이와 같은 의존성을 설정하면 A모듈에서만 ocean라이브러리를 사용할 수 있다. A모듈이 B모듈을 의존하고 있는데, B모듈에서도 ocean라이브러리를 사용하고 싶다면 api를 사용하는 것이 옳다.
api
모듈에 api종속성이 포함되어 있으면 모듈이 해당 종속성을 다른 모듈로 내보려고 하는 것을 Gradle에 알리고 런타임과 컴파일 시간 모두에서 사용할 수 있다.
특정 api가 변경될경우 gradle이 컴파일 시간에 해당 종속성에 접근가능한 모든 모듈을 다시 컴파일 하기 때문에 빌드 시간이 오래 걸릴 수 있다.
api는 의존성을 현재 모듈뿐아니라 의존하는 다른 모듈에서도 사용할 수 있도록 공개하는 것이다.
해당 모듈이 다른 모듈에 의존하면서 해당의존성도 함께 사용한다면 api를 사용하는 것이 좋다
A모듈에서
api 'com.wooteco.ocean'
를 설정하면 A모듈 뿐아니라 A가 의존하는 B모듈에서도 ocean라이브러리를 사용할 수 있다.
나눈 이유
의존 라이브러리 수정 시 재빌드가 필요한 라이브러리를 선택적으로 할 수 있도록api, implementation으로 나누어 필요없는 경우 재빌드 하지 않도록 하였다.
Gradle3.0으로 넘어오면서 compil 과 api는 동일 한 역할을 한다 .
결론
의존성을 설정할 때 해당 모듈에서만 사용하는 경우 implementation을 사용하고, 다른 모듈에서도 함께 사용할 경우 api를 사용하는것이 좋다.
나가며
아무 생각없이 지나쳤던 것들도 다시 봐야겠다. 토니덕분에 알았다.
'코코코딩공부 > JAVA' 카테고리의 다른 글
나는 어떤 자바 버전을 선택해야 할까? (2) | 2023.07.02 |
---|---|
[JAVA] 정적 팩토리 메소드 (0) | 2023.04.07 |
[JAVA] 캐싱 (0) | 2023.03.19 |
[JAVA] 상속 과 조합 (0) | 2023.03.13 |
[JAVA] VO(Value Object) 란 무엇인가 ? (0) | 2023.03.12 |