티스토리 뷰

728x90
반응형

Goals

  • compileClasspath vs runtimeClasspath
  • compileOnly vs runtimeOnly vs implementation

 

compileClasspath vs runtimeClasspath


compileClasspath와 runtimeClasspath는 Gradle에서 프로젝트의 의존성 관리를 위해 사용되는 두 가지 중요한 속성입니다.

compileClasspath

프로젝트 소스 코드를 컴파일하는 동안 필요한 모든 클래스 파일과 라이브러리를 포함합니다.

컴파일 시간에만 필요한 의존성이 포함되며, 런타임에는 필요하지 않습니다. 이러한 의존성은 빌드 결과물에 포함되지 않습니다.

runtimeClasspath

프로젝트를 실행할 때 필요한 모든 클래스 파일과 라이브러리를 포함합니다.

로젝트가 실행될 때 필요한 모든 의존성이 포함되며, 이러한 의존성은 빌드 결과물에 포함됩니다.

일반적으로, compileClasspath에는 runtimeClasspath에 포함되는 대부분의 의존성이 포함되어 있습니다.

compileOnly vs runtimeOnly vs implementation


Gradle에서 runtimeOnly, compileOnly, implementation은 모두 의존성을 관리하기 위해 사용되는 옵션입니다.

runtimeOnly

라이브러리가 런타임에만 필요하다는 것을 나타냅니다. 이 옵션을 사용하면 프로젝트 빌드 시점에 해당 라이브러리를 클래스 패스에 추가하지 않고, 런타임에 필요한 경우에만 라이브러리를 프로젝트에 포함합니다.

런타임 시에 라이브러리가 필요한 경우, runtimeOnly로 설정된 라이브러리를 프로젝트에 추가해주어야 합니다.

예를 들어, 스프링 부트 프로젝트에서 JDBC 드라이버를 runtimeOnly로 설정하여, 빌드 시점에는 포함하지 않고, 런타임에 필요한 경우에만 드라이버를 프로젝트에 포함시킬 수 있습니다.

dependencies {
    runtimeOnly 'mysql:mysql-connector-java:8.0.27'
}

compileOnly

라이브러리가 컴파일 시점에만 필요하다는 것을 나타냅니다. 이 옵션을 사용하면 프로젝트 빌드 시점에 해당 라이브러리를 컴파일에 사용하고, 빌드된 결과물에는 포함하지 않습니다. 즉, 컴파일 시점에만 라이브러리를 참조할 수 있습니다.

예를 들어, 프로젝트에서 테스트 코드를 작성할 때, junit 라이브러리를 compileOnly로 설정하여, 테스트 코드 컴파일 시에만 해당 라이브러리를 참조하도록 할 수 있습니다.

dependencies {
    compileOnly 'junit:junit:4.13.2'
    testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
}

implementation

라이브러리가 컴파일 및 런타임 모두 필요하다는 것을 나타냅니다. 이 옵션을 사용하면 프로젝트 빌드 시점에 해당 라이브러리를 컴파일에 사용하고, 빌드된 결과물에도 포함됩니다. 라이브러리와 관련된 클래스 및 메서드를 프로젝트에서 직접 참조할 수 있습니다.

예를 들어, 스프링 부트 프로젝트에서 스프링 프레임워크를 사용할 때, implementation으로 설정하여 컴파일 시에 해당 라이브러리를 참조하고, 빌드된 결과물에도 포함시킬 수 있습니다.

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web:2.6.3'
}

이들 옵션을 적절히 사용하여 프로젝트의 빌드 속도와 크기를 최적화할 수 있습니다.

 

Reference

728x90
반응형
댓글