Gradle 의존성 'implementation', 'runtimeOnly', 'compileOnly'의 차이

Gonee·2023년 11월 14일

삽질공간

목록 보기
3/6

Gradle 의존성을 관리하는 방법

implementation

설명

컴파일 시간과 런타임에 모두 사용되는 설정, 하지만 implementation으로 설정된 의존성은 모듈의 API에 포함되지 않으므로, 해당 모듈을 의존하는 다른 모듈은 이 의존성을 알 수 없음

언제 사용하는지?

모듈 내부에서만 사용되고, 모듈의 API를 구성하는 데 필요하지 않은 라이브러리에 주로 사용함, 이로 인해 모듈 간의 의존성을 최소화할 수 있고 컴파일 시간을 단축시킬 수 있음

예시 : JSON 파싱 라이브러리 또는 HTTP 클라이언트 라이브러리와 같이, 내부 구현에서 사용하는 라이브러리를 의존성을 추가하는 경우 사용하기에 적합함

complieOnly

설명

컴파일 시간에만 사용되며 런타임에는 포함되지 않음

언제 사용하는지?

컴파일 시에만 필요하고 런타임에는 필요없는 경우에 사용함, 주로 API 사양이나 컴파일 타임에만 필요한 어노테이션 프로레서와 같은 경우에 사용함

예시 : @Getter, @Setter와 같이 Lombok 어노테이션으로 코드를 작성한 경우 컴파일 시에만 사용되고 실제 런타임에는 생성된 getter, setter 메소드가 실행되므로 Lombok 과 같은 의존성은 컴파일 시에만 사용됨

runtimeOnly

설명

컴파일 시에는 의존성이 고려되지 않고, 런타임 시에만 사용되는 경우

언제 사용하는지?

어플리케이션 실행 시 필요한 라이브러리에 사용됨, 주로 드라이버나 구현체에 사용

예시 : DB드라이버 또는 SLF4J의 구현체(Logback)

dependencies {
    // SLF4J API
    implementation 'org.slf4j:slf4j-api:1.7.32' 

    // Logback Classic 구현체 (런타임 의존성)
    runtimeOnly 'ch.qos.logback:logback-classic:1.2.10'
}

위와 같이 Logback은 runtime에 사용하기 때문에 runtimeOnly로 의존성을 추가

profile
서버 개발자

2개의 댓글

comment-user-thumbnail
2023년 11월 14일

큰 도움이 되었습니다, 감사합니다.

1개의 답글