모듈 간의 Gradle 의존성 키워드 간략 정리

차_현·2024년 11월 22일
1

1. 주요 의존성 키워드

1.1 implementation

  • 정의: 현재 모듈에서 사용되는 의존성을 추가한다.
  • 특징: 의존성이 현재 모듈 내부에서만 사용되며, 다른 모듈에 노출되지 않는다.
  • 사용 사례:
    • 다른 모듈에서 사용할 필요 없는 라이브러리.
    • 내부적으로만 사용하는 의존성.
  • 예시:
    dependencies {
        implementation("org.springframework.boot:spring-boot-starter-data-jpa")
    }
  • spring-boot-starter-data-jpa는 현재 모듈 내부에서만 사용됩니다. 이를 의존하는 다른 모듈은 이 라이브러리에 접근할 수 없다.

1.2 api

  • 정의: 현재 모듈에서 사용되고, 다른 모듈에서도 노출된다.
  • 특징:
    • 이 모듈을 의존하는 다른 모듈에서도 해당 의존성을 사용할 수 있다.
    • 라이브러리가 외부 API처럼 동작해야 할 때 사용.
  • 사용 사례:
    • 현재 모듈이 제공하는 기능에서 다른 모듈에서도 필요할 때.
    • 라이브러리 모듈에서 공통 기능을 제공할 때.
  • 예시:
    dependencies {
        api("org.springframework.boot:spring-boot-starter-data-jpa")
    }
    
    • spring-boot-starter-data-jpa는 현재 모듈뿐 아니라, 이 모듈을 의존하는 다른 모듈에서도 사용할 수 있다.

1.3 compileOnly

  • 정의: 컴파일 시에만 필요한 의존성을 추가한다.
  • 특징:
    • 런타임에는 의존성을 포함하지 않는다.
    • 주로 어노테이션 프로세서나 컴파일 타임에만 필요한 의존성에서 사용.
  • 사용 사례:
    • 프로젝트가 특정 어노테이션을 지원하지만, 해당 어노테이션은 컴파일 타임에만 필요하고 런타임에는 필요하지 않은 경우.
    • (예: @Entity, @Slf4j와 같은 Lombok 애너테이션)
  • 예시:
    dependencies {
        compileOnly("org.projectlombok:lombok:1.18.24")
    }
    
    • Lombok은 컴파일 시에만 필요하며, 런타임에는 포함되지 않는다.

1.4 runtimeOnly

  • 정의: 런타임 시에만 필요한 의존성을 추가한다.
  • 특징:
    • 컴파일 타임에는 사용되지 않고, 런타임 시에만 클래스패스에 포함된다.
    • 주로 드라이버, 플러그인, 테스트 런타임 라이브러리 등에서 사용.
  • 사용 사례:
    • 데이터베이스 드라이버, 로그 구현체 등 런타임에만 필요한 라이브러리.
  • 예시:
    dependencies {
        runtimeOnly("com.h2database:h2")
    }
    
    • H2 데이터베이스는 애플리케이션 실행 시 필요하지만, 컴파일 타임에는 필요하지 않다.

2. 비교

Scope컴파일 시런타임 시다른 모듈에 노출
implementationOOX
apiOOO
compileOnlyOXX
runtimeOnlyXOX

3. 언제 무엇을 사용해야 할까?

  1. 현재 모듈에서만 사용되고, 다른 모듈에 노출되지 않아야 하는 경우:
    • implementation
  2. 다른 모듈에서도 함께 사용해야 하는 경우 (공유 라이브러리):
    • api
  3. 컴파일 시에만 필요하고 런타임에는 필요 없는 경우:
    • compileOnly
    • 예: Lombok, 어노테이션 프로세서.
  4. 런타임 시에만 필요한 경우:
    • runtimeOnly
    • 예: H2, MySQL Driver.

0개의 댓글