-
스프링 Gradle 동작원리spring 2025. 2. 21. 17:38
Gradle의 기본 개념
Gradle은 Groovy 또는 Kotlin DSL 기반의 빌드 자동화 도구로, 의존성 관리와 프로젝트 빌드를 효율적으로 수행할 수 있도록 설계되었습니다.
Spring Boot 프로젝트에서는 build.gradle 또는 build.gradle.kts 파일을 사용하여 프로젝트의 빌드 및 실행 환경을 설정합니다.Gradle 설정 파일(build.gradle)의 주요 요소
Gradle 설정 파일은 크게 다음과 같은 구조로 이루어져 있습니다.
✅ Maven Central 설정(Repository 설정)
repositories {
mavenCentral() // Maven Central 리포지토리 추가
}이 설정이 포함되면 Gradle은 Maven Central 리포지토리에서 의존성을 다운로드할 수 있게 됨.
✅ 플러그인 설정
플러그인이란?
플러그인은 **"빌드 도구"**에서 사용하는 작은 프로그램입니다. 간단히 말해, 어떤 작업을 수행하도록 설계된 모듈입니다. 예를 들어, 프로젝트를 컴파일하거나, 테스트를 실행하거나, 패키징을 만드는 작업을 플러그인이 수행합니다.
플러그인은 빌드 과정에서 의존성을 처리하거나 프로젝트의 특정 작업을 수행하도록 합니다. 예를 들어, spring-boot 플러그인은 spring-boot-starter 의존성을 기반으로 Spring Boot 애플리케이션을 빌드할 수 있게 해줍니다.plugins {
id 'org.springframework.boot' version '3.1.0'
id 'io.spring.dependency-management' version '1.1.0'
id 'java'
}- org.springframework.boot: Spring Boot 프로젝트를 빌드하고 실행하는 데 필요한 플러그인(Spring Boot 애플리케이션을 실행 가능한 JAR 파일로 만들어주는 역할을 합니다.)
- io.spring.dependency-management: 의존성 관리를 자동으로 최적화
- java: Java 프로젝트로 인식하도록 설정(Java 프로젝트를 컴파일하고 실행할 수 있도록 도와줍니다.)
✅ 의존성 관리
의존성 관리란?
의존성 관리는 프로젝트가 외부 라이브러리(다른 사람들이 만든 코드나 도구)를 사용할 수 있도록 도와주는 시스템입니다.
예시:
- spring-boot-starter-web: 웹 애플리케이션을 만들 때 필요한 Spring 라이브러리를 포함하는 의존성입니다.
- junit:junit:4.13.1: JUnit 라이브러리로 테스트를 실행할 수 있도록 해주는 의존성입니다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'mysql:mysql-connector-java'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}✅ 플러그인과 의존성 관리의 관계
plugins {
id 'org.springframework.boot' version '2.5.4' // Spring Boot 플러그인
}
repositories {
mavenCentral() // Maven Central에서 라이브러리를 다운로드
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web' // Spring Web 의존성
}- 플러그인: org.springframework.boot 플러그인은 Spring Boot 애플리케이션을 빌드하고 실행하는 작업을 수행합니다.
- 의존성 관리: spring-boot-starter-web 의존성은 Spring Boot 웹 애플리케이션을 만들 때 필요한 라이브러리들을 포함하고 있습니다. 이 의존성은 Maven Central에서 자동으로 다운로드됩니다.
✅ 받은 파일은 어떻게 관리되는가
Gradle과 Maven으로 생성된 JAR 파일은 실행 가능한 Fat JAR(Executable JAR) 형태로 만들어집니다.
Spring Boot에서는 Spring Boot Loader를 사용하여 내부 라이브러리를 실행할 수 있도록 설정my-application.jar
├── META-INF/
├── BOOT-INF/
│ ├── classes/ (내 프로젝트의 클래스 파일)
│ ├── lib/ (의존성 라이브러리 JAR 파일)
│ └── layers.idx
├── org/springframework/boot/loader/ (Spring Boot 실행 로더)
└── application.properties✅ Gradle에서 Maven Central을 설정시 다운받는 프로세스
Maven Central과의 연결 원리
- HTTP(S) 요청
Gradle은 Maven Central Repository가 제공하는 HTTP(S) 프로토콜을 통해 의존성 라이브러리를 다운로드합니다. 기본적으로 Maven Central의 URL은 https://repo.maven.apache.org/maven2/ 입니다. - 리포지토리 URL 해석
Gradle은 mavenCentral() 메서드 호출 시 Maven Central의 URL을 기본값으로 설정합니다. 이 URL을 사용하여 Gradle은 의존성 라이브러리를 검색하고 다운로드합니다.
- 의존성 검색 및 다운로드
의존성 라이브러리(예: spring-boot-starter-web)가 Gradle 빌드 파일에 추가되면, Gradle은 해당 의존성의 Group ID, Artifact ID, Version을 기반으로 Maven Central에 해당 라이브러리를 요청합니다.
- 예: org.springframework.boot:spring-boot-starter-web:2.5.4
Gradle의 의존성 캐시 메커니즘
- 로컬 캐시:
- Gradle은 처음 다운로드한 의존성 파일을 로컬 캐시(~/.gradle/caches/)에 저장합니다. 이후 동일한 의존성을 요청할 때마다 Maven Central을 다시 조회하지 않고 캐시에서 해당 파일을 가져옵니다.
- 캐시 만료 및 갱신:
- 의존성의 버전이나 해당 의존성이 수정되었을 경우, Gradle은 캐시된 파일을 다시 다운로드합니다. 이를 통해 항상 최신 버전의 라이브러리를 사용할 수 있습니다.
- 캐시를 강제로 갱신하려면 --refresh-dependencies 옵션을 사용할 수 있습니다:
./gradlew build --refresh-dependencies
'spring' 카테고리의 다른 글
Spring MVC에서 DispatcherServlet이 관리하는 Resolver의 종류와 실행 방식 (0) 2025.02.20 ApplicationContext의 EventListener 동작 원리 & ApplicationEventPublisher (0) 2025.02.18 ApplicationContext vs BeanFactory (0) 2025.02.18 Spring Boot 애플리케이션이 초기화되는 과정 (0) 2025.02.17