not bad 한 개발

[Spring] Gradle Dependency 설정 본문

Web/Spring

[Spring] Gradle Dependency 설정

leebean 2024. 10. 25. 18:26

공부하다가 dependencies를 쓰는데 implementation, compileOnly등의 속성이 있는데 어떤의미 인지 문득 궁금해져서 기록해봅니다.

그래서 공식사이트에서 찾아봤는데 위의 두 개의 속성의 뜻을 알기전에 runtimeClasspath가 무엇인지 compileClasspath가 무엇인지를 알아야 했습니다, (그런데 공식문서 보니까 속성이 많아서 영혼털렸습니다.) 

 

 Gradle Dependency Configuration 

The Java Library plugin configurations

 

  •  초록색  : 사용자가 의존성을 선언할 때 사용합니다.
  •  분홍색  : 구성요소가 라이브러리를 컴파일하거나 실행할 때 사용합니다.
  •  파란색  : 구성요소 자체를 사용하기 위해 구성 요소 내부에서 사용합니다. 

(초록색을 이해하기전에 분홍색과 파란색을 먼저 알필요가 있다.)

 apiElements 

  • 라이브러리의 컴파일(Compile)의미 
  • 해당 라이브러리를 컴파일하는 데 필요한 모든 요소를 검색할 때 사용한다.
  • default 설정과 다르게, implemenation이나 runtime 의존성에 대한 정보를 노출하지 않는다.

 runtimeElements

  • 라이브러리의 실행(Runtime)의미
  • 해당 라이브러리를 실행하는 데 필요한 모든 요소를 검색할 때 사용한다. 

 

 compileClasspath 

  • 프로젝트 컴파일에 필요한 모든 클래스 파일과 라이브러리들을 포함
  • 프로젝트가 컴파일 시간에만 포함 
  • 빌드결과물에 포함되지 않습니다.

 runtimeClasspath 

  • 프로젝트 실행에 필요한 모든 클래스 파일과 라이브러리들을 포함
  • 프로젝트가 실행될 때에만 포함 
  • 빌드결과물에 포함됩니다.
  • 일반적으로 compileClasspath에는 runtimeClasspath에 포함되는 대부분의 의존성이 포함되어 있습니다.

 

 impementation 

  • 전의 의존성(transitive dependency) 을 허가하지 않습니다.
  • 내부적으로만 사용되고 사용자에게는 의존성을 노출시키지 않게 선언합니다.
  • 의존 라이브러리를 수정해도 본 모듈까지만 재빌드합니다.

 api 

  • 전의 의존성(transitive dependency) 을 허가합니다.
  • 컴파일 타임과 런타임에 사용자에게 의존성을 노출시킵니다.
  • 의존 라이브러리가 수정되는 경우 본 모듈을 의존하는 모든 모듈들을 재빌드합니다.

 compileOnly 

  • 컴파일 시점에 필요한 라이브러리
  • 컴파일 시에만 빌드하고 빌드 결과물에는 포함하지 않습니다.
  • 대표적으로 Lombok dependency가 compileOnly 속성입니다.

 compileOnlyApi 

  • 사용자가 만든 모듈에 의해 컴파일 타임에 필요한 라이브러리입니다.
  • compileOnly와 동일하게 컴파일 시에만 빌드하고 빌드 결과물에는 제외됩니다.

 runtimeOnly 

  • 런타임 시점에만 필요한 라이브러리입니다.
  • 대표적으로 DB관련 dependency가 runtimeOnly 속성입니다.

 annotationProcessor 

  • annotation processor를 명시하기 위해 사용

 

여기까지가 gradle Dependency 설정의 대략적인 설명입니다, 그런데 정리를 하다가 전의 의존성(transitive dependency) 을 보게되었습니다, 그래서 정리를 하자면 아래의 그림처럼 표현할 수 있습니다.

A, B,C 프로젝트가 있는데 A가 B를 의존하고 있고, B가 C를 의존하고 있을 때 C도 A를 의존하고있는 것이 전의 의존성이고 implementation과 api는 이러한 전의 의존성을 허용하냐 안하냐로 나눌수도 있습니다.

api와 implementation 속성의 차이점을 보다 자세하게 나타내자면 아래의 그림으로 나타낼 수 있습니다.

 

참고 게시글

https://twinparadox.tistory.com/630

 

Gradle의 라이브러리 의존성 옵션 정리

익숙함 문득 웹 프로젝트 관련 내용들을 정리해나가면서, gradle 파일을 보니까 다음과 같은 부분이 눈에 들어왔다. dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'or

twinparadox.tistory.com

https://mangkyu.tistory.com/296

 

[Gradle] Gradle Java 플러그인과 implementation와 api의 차이

이번에는 Gradle(그레이들)이 제공하는 Java 플러그인과 implementation와 api의 차이에 대해 알아보도록 하겠습니다. 1. Gradle Java 플러그인, Java-Library 플러그인 [ Java 플러그인이란? ] Gradle(그레이들)에서

mangkyu.tistory.com

 

Comments