Gradle 의존성 블록 키워드 설명

백엔드&인프라 추종자·2025년 3월 10일

스프링 공부

목록 보기
27/35

Gradle의 dependencies 블록에서 사용되는 implementation, runtimeOnly 등의 키워드는 의존성의 범위(Scope)를 설정하는 것입니다. 각 설정에 따라 컴파일 시점과 런타임 시점에서 의존성이 어떻게 동작하는지가 달라집니다.


🔥 각 키워드의 역할과 차이점

1️⃣ implementation

컴파일과 런타임 둘 다 필요한 경우

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

특징

  • 컴파일 시 필요
  • 런타임 시 필요
  • 다른 모듈에서는 이 의존성을 직접 사용할 수 없음 (캡슐화됨 → 성능 최적화 가능)

언제 사용?

  • 대부분의 일반적인 라이브러리 (Spring Boot, Hibernate, Gson 등)

2️⃣ api

현재 모듈을 사용하는 다른 모듈도 함께 이 의존성을 사용해야 할 때

dependencies {
    api 'com.google.guava:guava:31.1-jre'
}

특징

  • implementation과 비슷하지만, 이 모듈을 사용하는 다른 모듈도 해당 라이브러리를 함께 가져감
  • 즉, 공개적으로 제공해야 하는 라이브러리를 선언할 때 사용

언제 사용?

  • 라이브러리를 개발할 때 (예: 공통 유틸 모듈)
  • 특정 패키지를 여러 모듈에서 공유할 때

📌 implementation vs api 차이

  • implementation → 현재 모듈 내부에서만 사용됨
  • api → 다른 모듈에서도 함께 사용됨

3️⃣ runtimeOnly

컴파일할 때 필요 없지만, 실행할 때만 필요한 경우

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

특징

  • 컴파일 시 필요 없음
  • 런타임에만 필요함

언제 사용?

  • JDBC 드라이버 (MySQL, PostgreSQL)
  • 로깅 라이브러리의 구현체 (ex. logback, slf4j)
  • 별도로 실행할 때만 필요한 라이브러리

📌 예제:
Spring Boot에서 HikariCP 같은 DB 커넥션 풀을 사용하면 runtimeOnly으로 DB 드라이버만 추가하면 됨.

dependencies {
    implementation 'com.zaxxer:HikariCP:5.0.1'  // JDBC 커넥션 풀
    runtimeOnly 'org.postgresql:postgresql:42.3.3'  // 런타임에만 필요
}

4️⃣ compileOnly

컴파일할 때만 필요하고, 실행할 때는 필요 없는 경우

dependencies {
    compileOnly 'org.projectlombok:lombok:1.18.22'
}

특징

  • 컴파일 시 필요
  • 런타임에는 필요 없음
  • 애노테이션 프로세서나 인터페이스 정의에 주로 사용됨

언제 사용?

  • Lombok → 빌드할 때만 필요 (@Getter, @Setter 등)
  • Spring Boot Starter 패키지 중 인터페이스만 제공하는 경우
  • 애노테이션 프로세서

5️⃣ annotationProcessor

애노테이션 기반 코드 생성기

dependencies {
    annotationProcessor 'org.projectlombok:lombok:1.18.22'
}

특징

  • compileOnly처럼 컴파일 시점에만 필요
  • Java 애노테이션 프로세서를 실행하는 데 사용됨
  • Lombok 같은 라이브러리에서 사용됨

언제 사용?

  • Lombok
  • MapStruct (DTO 변환)

🔥 정리 (한눈에 비교)

키워드컴파일 시 필요런타임 시 필요설명 및 사용 예시
implementation기본적으로 사용 (대부분의 라이브러리)
api다른 모듈에서도 접근해야 하는 경우
runtimeOnlyDB 드라이버, 로깅 라이브러리
compileOnlyLombok, 애노테이션 프로세서
annotationProcessorLombok, MapStruct (컴파일 시 코드 생성)

🔥 실제 예제 (build.gradle.kts 기준)

dependencies {
    // 일반적인 라이브러리 (Spring, Hibernate 등)
    implementation("org.springframework.boot:spring-boot-starter-web")

    // 다른 모듈도 접근할 수 있는 라이브러리 (공유 라이브러리)
    api("com.google.guava:guava:31.1-jre")

    // 런타임에만 필요한 라이브러리 (JDBC 드라이버)
    runtimeOnly("mysql:mysql-connector-java")

    // 컴파일 시에만 필요한 라이브러리 (Lombok)
    compileOnly("org.projectlombok:lombok")
    annotationProcessor("org.projectlombok:lombok")
}

📌 결론

  • 대부분의 라이브러리는 implementation을 사용
  • 공유해야 하는 경우 api
  • JDBC 드라이버나 로깅 라이브러리는 runtimeOnly
  • 애노테이션 프로세서는 compileOnly + annotationProcessor

🚀 이제 Gradle 의존성 설정을 더 효율적으로 할 수 있습니다! 😊

profile
AI 답변 글을 주로 올립니다.

0개의 댓글