Gradle의 dependencies 블록에서 사용되는 implementation, runtimeOnly 등의 키워드는 의존성의 범위(Scope)를 설정하는 것입니다. 각 설정에 따라 컴파일 시점과 런타임 시점에서 의존성이 어떻게 동작하는지가 달라집니다.
implementation컴파일과 런타임 둘 다 필요한 경우
dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' }✅ 특징
- 컴파일 시 필요
- 런타임 시 필요
- 다른 모듈에서는 이 의존성을 직접 사용할 수 없음 (캡슐화됨 → 성능 최적화 가능)
✅ 언제 사용?
Spring Boot, Hibernate, Gson 등) api현재 모듈을 사용하는 다른 모듈도 함께 이 의존성을 사용해야 할 때
dependencies { api 'com.google.guava:guava:31.1-jre' }✅ 특징
implementation과 비슷하지만, 이 모듈을 사용하는 다른 모듈도 해당 라이브러리를 함께 가져감- 즉, 공개적으로 제공해야 하는 라이브러리를 선언할 때 사용
✅ 언제 사용?
📌 implementation vs api 차이
implementation → 현재 모듈 내부에서만 사용됨 api → 다른 모듈에서도 함께 사용됨 runtimeOnly컴파일할 때 필요 없지만, 실행할 때만 필요한 경우
dependencies { runtimeOnly 'mysql:mysql-connector-java' }✅ 특징
- 컴파일 시 필요 없음
- 런타임에만 필요함
✅ 언제 사용?
MySQL, PostgreSQL) logback, slf4j) 📌 예제:
Spring Boot에서 HikariCP 같은 DB 커넥션 풀을 사용하면 runtimeOnly으로 DB 드라이버만 추가하면 됨.
dependencies {
implementation 'com.zaxxer:HikariCP:5.0.1' // JDBC 커넥션 풀
runtimeOnly 'org.postgresql:postgresql:42.3.3' // 런타임에만 필요
}
compileOnly컴파일할 때만 필요하고, 실행할 때는 필요 없는 경우
dependencies { compileOnly 'org.projectlombok:lombok:1.18.22' }✅ 특징
- 컴파일 시 필요
- 런타임에는 필요 없음
- 애노테이션 프로세서나 인터페이스 정의에 주로 사용됨
✅ 언제 사용?
Lombok → 빌드할 때만 필요 (@Getter, @Setter 등) annotationProcessor애노테이션 기반 코드 생성기
dependencies { annotationProcessor 'org.projectlombok:lombok:1.18.22' }✅ 특징
compileOnly처럼 컴파일 시점에만 필요- Java 애노테이션 프로세서를 실행하는 데 사용됨
Lombok같은 라이브러리에서 사용됨
✅ 언제 사용?
Lombok MapStruct (DTO 변환) | 키워드 | 컴파일 시 필요 | 런타임 시 필요 | 설명 및 사용 예시 |
|---|---|---|---|
implementation | ✅ | ✅ | 기본적으로 사용 (대부분의 라이브러리) |
api | ✅ | ✅ | 다른 모듈에서도 접근해야 하는 경우 |
runtimeOnly | ❌ | ✅ | DB 드라이버, 로깅 라이브러리 |
compileOnly | ✅ | ❌ | Lombok, 애노테이션 프로세서 |
annotationProcessor | ✅ | ❌ | Lombok, 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 runtimeOnly compileOnly + annotationProcessor 🚀 이제 Gradle 의존성 설정을 더 효율적으로 할 수 있습니다! 😊