본문 바로가기
Gradle

[Gradle] Dependency Configuration 종류 및 기능

by 노력남자 2023. 2. 14.
반응형

Spring Boot로 개발 중 build.gradle에 dependencies에 들어가는 configuration들의 종류와 기능이 궁금해서 찾아봤다.

어떤 것들이 있는지 어떤 기능인지 이번 기회에 깔끔하게 정리 좀 해야겠다.

 

Dependency Configuration이란?

 


gradle 프로젝트를 만들면 위와 같이 build.gradle에 dependencies에 의존하고 있는 라이브러리들이 명시되어 있다.

밑줄로 표시해놓은 것들을 configuration이라고 공식 문서에서 부르고 있다.

어떤 것들이 있는지 알아보자.

 

Dependency Configuration 종류 및 기능

 

complieOnly

 

컴파일할 때만 사용

compileOnly로 의존성을 추가하면 jar에 포함되지 않아 가벼워진다.

 

dependencies {
    compileOnly 'org.springframework.boot:spring-boot-starter'
    compileOnly 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}


위와 같이 의존성을 추가한 후에 "gradle bootJar" 명령어로 jar를 만든 후 BOOT-INF - lib에 보니 compileOnly로 추가한 의존성 라이브러리는 추가가 되지 않은 것을 볼 수 있다. (jar로 빌드하는 방법은 아래 포스팅을 참고)

 

 

[Spring] Spring Boot Gradle 프로젝트를 JAR 파일로 빌드하기

1. gradle bootJar 명령어를 실행하거나 오른쪽 Gradle에서 Tasks - bootJar 클릭 2. Project 탭에서 build - libs - xxx.jar 파일 찾기 끝!

effortguy.tistory.com


현재는 전부 complieOnly라 기본 lib만 있는 게 정상이다.

 

 

runtimeOnly

 

런타임에만 사용 (ex. db-connector, mysql, h2)

컴파일할 때는 필요없는 라이브러리 의존성 추가할 때 사용한다.

 

dependencies {
    compileOnly 'org.springframework.boot:spring-boot-starter'
    compileOnly 'org.springframework.boot:spring-boot-starter-web'
    runtimeOnly 'com.h2database:h2:2.1.214'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}


h2를 runtimeOnly로 추가한 후에 bootJar로 빼서 봤더니 lib에 추가된 걸 볼 수 있다.

 

 

dependencies {
    runtimeOnly 'org.springframework.boot:spring-boot-starter'
    runtimeOnly 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}


컴파일할 때 필요한 라이브러리를 runtimeOnly로 등록하게 되면

 


코드 작성할 때 사용할 수 없어진다.

위처럼 라이브러리를 찾을 수 없어진다.

 

annotationProcessor

 

어노테이션 프로세서 사용하는 라이브러리인 경우 사용, 컴파일에만 적용 (ex. lombok)

옛날 버전에서는 compileOnly를 썼었는데 최신 버전에서는 사용이 불가능하다.

 

implementation


컴파일 + 런타임

컴파일에도 필요하고 런타임에도 필요할 때 사용

 

api


api로 추가한 라이브러리에서 의존하고 있는 라이브러리에 의존하고자 할 때 사용 (컴파일 + 런타임)

a가 b 라이브러리를 api로 추가하면 a는 b에서 사용 중인 라이브러리 c를 사용할 수 있다.

이 방법은 조심해야 하는데 b에서 사용하고 있는 라이브러리 c를 d로 바꾼다면? a가 사용하는 c가 사라졌기 때문에 문제가 발생할 수도 있다.

 

testCompileOnly


테스트 코드 컴파일할 때만 사용

 

testRuntimeOnly


테스트 런타임에 사용

 

testImplementation


테스트 컴파일 + 런타임에 사용

 

참고

 

 

The Java Library Plugin

The key difference between the standard Java plugin and the Java Library plugin is that the latter introduces the concept of an API exposed to consumers. A library is a Java component meant to be consumed by other components. It’s a very common use case

docs.gradle.org

 

 

The Java Plugin

If a dependent project has changed in an ABI-compatible way (only its private API has changed), then Java compilation tasks will be up-to-date. This means that if project A depends on project B and a class in B is changed in an ABI-compatible way (typicall

docs.gradle.org

반응형

댓글