
Dependency는 소프트웨어 개발에서 매우 중요한 개념입니다. 간단히 말해, 어떤 소프트웨어 모듈이나 컴포넌트가 제대로 작동하기 위해 다른 모듈이나 라이브러리에 의존하는 관계를 의미합니다.
Dependency는 프로젝트가 다른 소프트웨어의 기능을 사용하기 위해 필요로 하는 외부 라이브러리나 모듈을 의미합니다. Gradle과 같은 빌드 도구는 이러한 의존성을 효율적으로 선언하고, 자동으로 다운로드하며, 관리하여 개발 과정을 훨씬 더 쉽고 안정적으로 만들어줍니다. build.gradle.kts 파일의 dependencies 블록은 바로 이러한 의존성들을 정의하는 핵심적인 공간이며, 각 의존성 범위(Configuration)는 해당 라이브러리가 언제, 어떻게 사용될지를 Gradle에게 알려줍니다.
정의: 내 프로젝트(모듈, 컴포넌트)가 특정 기능이나 클래스 등을 사용하기 위해 다른 프로젝트나 외부 라이브러리에 필요로 하는 관계를 '의존한다'고 표현하며, 이 필요한 대상을 '의존성(Dependency)'이라고 부릅니다.
예시:
소프트웨어 개발에서 거의 모든 프로젝트는 외부 라이브러리에 의존합니다.
이유
안정성 및 신뢰성:
기능 확장:
유지보수 용이성:
표준화:
이러한 의존성들을 수동으로 관리하는 것은 매우 복잡하고 오류 발생 가능성이 높습니다. (어떤 라이브러리의 어떤 버전이 필요하고, 그 라이브러리는 또 다른 어떤 라이브러리에 의존하는지 등을 일일이 추적하기 어려움)
그래서 Gradle, Maven과 같은 빌드 자동화 및 의존성 관리 도구가 등장했습니다.
주요 역할:
build.gradle.kts 파일의 dependencies 블록은 "우리 프로젝트가 의존하는 라이브러리 목록"을 선언하는 곳입니다.
dependencies {
// 여기에 의존성을 추가합니다.
implementation("org.springframework.boot:spring-boot-starter-web") // 예시
testImplementation("org.junit.jupiter:junit-jupiter-api:5.10.0") // 예시
}
각 줄은 하나의 의존성을 나타냅니다.
implementation, testImplementation, developmentOnly, runtimeOnly 등은 Configuration(설정) 또는 Scope(범위)라고 불립니다. 이들은 의존성이 언제(컴파일 시, 런타임 시, 테스트 시 등) 필요한지, 그리고 다른 모듈로 전이될 때 어떻게 동작할지를 Gradle에게 알려주는 역할을 합니다.
implementation(실행):
컴파일 시점과 런타임 시점 모두에 필요합니다.
이 모듈을 사용하는 다른 모듈에게는 이 의존성이 숨겨집니다. 즉, 이 모듈을 라이브러리로 만들었을 때, 라이브러리 사용자가 이 implementation으로 추가된 의존성까지 직접 알 필요가 없습니다. (캡슐화)
가장 일반적으로 사용되는 의존성 범위입니다.
api: (주로 라이브러리를 만들 때 사용)
implementation과 유사하게 컴파일 시점과 런타임 시점 모두에 필요합니다.
implementation과 달리, 이 의존성을 사용하는 다른 모듈에게 이 의존성이 노출됩니다. 즉, 이 모듈을 라이브러리로 만들었을 때, 라이브러리 사용자도 이 api로 추가된 의존성을 직접 사용할 수 있게 됩니다.
API를 통해 특정 클래스나 인터페이스를 노출해야 할 때 사용합니다.
testImplementation:
오직 테스트 코드 컴파일 및 테스트 실행 시에만 필요합니다.
애플리케이션의 실제 런타임 빌드에는 포함되지 않습니다. (예: JUnit, Mockito)
developmentOnly:
오직 개발 환경에서만 필요한 의존성입니다.
spring-boot-devtools처럼 프로덕션 빌드에는 포함되면 안 되는 경우에 사용합니다.
runtimeOnly:
컴파일 시점에는 필요 없지만, 런타임 시점에 필요한 의존성입니다.
주로 JDBC 드라이버(예: MySQL Connector J)와 같이, 코드가 직접 호출하지는 않지만 애플리케이션 실행에 필요한 서비스 프로바이더 인터페이스(SPI) 구현체에 사용됩니다.
용도: 개발 생산성을 크게 향상시키는 도구 모음입니다.
주요 기능:
왜 사용해야 하나요?
build.gradle.kts 추가:
dependencies {
developmentOnly("org.springframework.boot:spring-boot-devtools")
}
용도: 웹 애플리케이션(RESTful API, Spring MVC 등)을 개발하기 위한 핵심 디펜던시입니다.
주요 포함 내용:
왜 사용해야 하나요?
build.gradle.kts 추가:
dependencies {
implementation("org.springframework.boot:spring-boot-starter-web")
}
Kotlin에서는 Lombok의 필요성이 거의 없으며, Kotlin의 언어 기능을 활용하는 것이 더 자연스럽고 권장되는 방법입니다.