요즘 새롭게 스프링 부트를 공부하며 프로젝트를 만들어 보고있는데, build.gradle
파일의 dependencies
항목 앞에 붙는 단어들의 의미가 궁금해졌다.
아래는 내가 작성하고 있는 프로젝트의 build.gradle
파일이다.
plugins { id 'java' id 'org.springframework.boot' version '3.3.3' id 'io.spring.dependency-management' version '1.1.6' } group = 'com.dororok' version = '0.0.1-SNAPSHOT' java { toolchain { languageVersion = JavaLanguageVersion.of(17) } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'com.fasterxml.jackson.core:jackson-databind' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() }
오늘은 dependencies
의 implementation
, runtimeOnly
, compileOnly
, annotationProcessor
, testImplementation
항목의 의미를 알아보려고 한다.
build.gradle의 dependencies에서 각 항목의 용도는?
build.gradle
파일에서 dependencies
섹션에 사용되는 각 항목은 Gradle 빌드 도구에서 의존성의 범위와 목적을 지정하는 데 사용된다.
1. implementation
implementation
은 애플리케이션의 런타임과 컴파일 타임 모두에 필요한 의존성을 선언할 때 사용한다.
2. runtimeOnly
runtimeOnly
는 컴파일 시점에 사용하지 않고 애플리케이션 실행 시에만 사용하는 의존성.- 예를들어, 데이터베이스 드라이버는 애플리케이션이 컴파일될 때는 필요하지 않지만, 실행될 때는 필요하다.
3. compileOnly
compileOnly
는 컴파일 타임에만 필요한 의존성을 선언한다.- 주로 컴파일 타임에만 필요한 API를 제공하는 라이브러리나 애노테이션 프로세서 등을 추가할 때 사용된다.
4. annotationProcessor
annotationProcessor
는 주로 컴파일 타임에 애노테이션을 처리하기 위해 사용하는 의존성.- 애노테이션 프로세서가 애노테이션을 처리하여 코드 생성이나 문서화, 검사를 수행하는 데 필요한 의존성을 추가합니다. 예를 들어, Lombok과 같은 라이브러리의 경우, 이 항목에 추가되어야 한다.
5. testImplementation
testImplementation
은 테스트 코드에서 필요로 하는 의존성을 선언한다.- 이 의존성은 테스트 코드가 실행되는 동안에만 필요하며, 애플리케이션의 본문 코드에서는 필요하지 않다. 예를 들어, JUnit, Mockito와 같은 테스트 라이브러리를 이 항목에 추가한다.
의존성 범위를 설정하는 이유?
이러한 의존성 범위를 적절히 설정함으로써, 코드의 유지보수성과 빌드 성능을 향상시킬 수 있다. 각 의존성 항목이 프로젝트에서 어떻게 사용되는지 이해하면, 빌드 구성을 보다 효율적으로 관리할 수 있습니다 🙂