
스프링 프로젝트를 생성하기 위해 Spring Initializr를 실행하면 의존성 (Dependencies)을 이라는 걸 설정하는 파트가 나온다. 그냥 지나칠 수도 있지만 해당 개념이 뭔지 정확히 알아보자.
의존성 (Dependencies)은 간단히 말해, 프로젝트가 정상적으로 동작하기 위해 필요한 외부 라이브러리나 모듈을 의미한다. 예를 들어, 웹 애플리케이션을 개발할 때 스프링 MVC, 데이터베이스 연결, 보안 기능 등을 구현하기 위해 다양한 라이브러리가 필요하다. 이러한 라이브러리들이 바로 의존성이다.
소프트웨어 개발에서는 이미 잘 만들어진 기능들을 재사용하는 것이 효율적이다. 모든 기능을 처음부터 직접 구현하면 시간이 많이 걸리고 오류가 발생할 가능성이 높아진다. 그러므로 모든 걸 직접 스스로 구현하기보다는 필요한 기능을 제공하는 라이브러리를 의존성으로 추가하여 기존의 검증된 코드를 활용할 수 있다.
스프링부트는 의존성 관리를 매우 쉽게 만들어 주는데 주로 Gradle이나 Maven과 같은 빌드 도구를 사용하여 의존성을 관리하게 된다. 해당 글에서는 Gradle을 기준으로 설명한다.
프로젝트 생성 후, build.gradle 파일에는 프로젝트에 필요한 의존성이 명시되어 있으며 초기 Spring Initializr에서 프로젝트를 생성할 때, 의존성 (Dependencies)부분을 설정해주면 프로젝트 생성후 build.gradle파일에 설정한 라이브러리들이 포함되어 있다. 예를 들어, build.gradle 파일은 다음과 같은 형식으로 작성되어 있다.

해당 파일에서 다음 단락이 해당 프로젝트의 dependencies를 설정하는 부분이다. 해당 부분을 자세히 살펴보자
✍️ 작성
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
여기에서 implementation, developmentOnly 등의 키워드들이 눈에 들어온다. 해당 키워드들을 가리켜 Gradle 의존성 구성(Configuration)이라고 부르며 특정 라이브러리를 어떤 용도로 언제 사용할지를 정의한다. 이를 통해 빌드 도구는 필요한 라이브러리를 적절한 시점에 다운로드하고, 클래스패스에 포함시킨다. 구성의 종류는 다음과 같다.
| 구성 (Configuration) | 설명 |
|---|---|
| implementation | 프로젝트의 컴파일 및 런타임에 모두 필요한 의존성을 선언할 때 사용 ※ 전이 의존성 (Transitive Dependencies)으로 외부에 노출되지 않음 |
| developmentOnly | 개발 중에만 필요한 의존성을 선언할 때 사용합니다. 배포 시에는 포함되지 않음 |
| testImplementation | 테스트 작성 및 실행에 필요한 의존성을 선언할 때 사용 ※ 전이 의존성 (Transitive Dependencies)으로 외부에 노출되지 않음 |
| testRuntimeOnly | 테스트 실행 시에만 필요한 의존성을 선언할 때 사용 |
| compileOnly | 컴파일할 때만 필요한 의존성을 선언할 때 사용하며 런타임에는 필요하지 않음 |
| runtimeOnly | 런타임에만 필요한 의존성을 선언할 때 사용하며 컴파일 시에는 필요하지 않음 |
| api | implementation과 유사함 ※ 전이 의존성(Transitive Dependencies)으로 외부에 노출되며 implementation과의 차이점 주로 라이브러리를 개발할 때 사용 |
이러한 방식으로 선언된 의존성은 프로젝트를 빌드 (Build)하거나 실행 (Run)할 때, 실제로 필요한 의존성이 다운로드되고 프로젝트에 포함된다. 어디서 다운로드 받는 지 궁금할 텐데 이는 다음 글에서 알아보자.
멋쟁이사자처럼 강의자료
gradle(Q. build.gradle에서 사용되는 키워드 뜻은 뭐야?/Q. compile vs implementation의 차이는?)