반응형

Gradle 이란?

Gradle Build Tool is a fast, dependable, and adaptable open-source build automation tool with an elegant and extensible declarative build language.

 

이라고 공식 문서에서 이야기하고 있다

Gradle은 빌드 자동화를 위한 빌드 툴 이다

Gradle은 Groovy, kotlin으로 작성되며, 작성된 정보를 바탕으로 빌드, 테스트, 배포를 자동화 한다

Gradle의 핵심 Concepts

  • Projects 프로젝트는 단일, 멀티 모듈 프로젝트로 구성 할 수 있다
  • 단일 프로젝트의 경우 하나의 루트 프로젝트를 가진다
  • 멀티 모듈 프로젝트는 하나의 루트 프로젝트와 하위에 1개 이상의 서브 프로젝트를 가진다
  • Build Scripts Gradle이 프로젝트 빌드를 위해 수행할 내용을 작성하는 것으로 각 프로젝트는 하나 이상의 빌드 스크립트를 포함할 수 있다
  • Dependency Management 빌드에 필요한 외부 의존성을 자동으로 관리한다
  • Tasks Task는 Gradle에 의해 수행되는 것으로 코드 컴파일, 테스트 수행 등을 이야기하고, 각 프로젝트는 빌드 스크립트나 플러그인에서 정의한 하나 이상의 Task를 가진다
  • Plugins Gradle의 기능을 확장하는데 사용된다

Gradle Project 구조

 

1. Gradle Wrapper 등을 저장하는 gradle 디렉토리

2. Gradle의 의존성 관리를 위한 파일

3. Gradle Wrapper 스크립트

4. 루트 프로젝트 명, 서브 프로젝트 정의하는 설정 파일

5. 서브 프로젝트의 빌드 스크립트

6. 서브 프로젝트의 소스 코드가 있는 디렉토리

 

 

 

 

 

 

 

 

 

 

 

Gradle build 방법

Gradle build를 위해서는 두가지 방법이 있다

1. gradle build
2. gradlew build (window: gradlew.bat build)
  1. 설치된 Gradle을 통해 빌드를 수행시키는 방법
  2. 설치된 Gradle이 아닌 프로젝트에 선언된 Gradle을 통해 build를 수행(공식적으로 추천되는 방법)

 

Gradle 구조 및 동작 흐름

Gradle의 동작 흐름은 위 그림과 같다

 

여기서 Wrapper의 역할을 살펴 보면 Wapper 스크립트는 Gradle이 수행되기 전에 필요한 경우 Wrapper에 정의 된 Gradle 버전을 다운로드한 후에 수행한다

이를 통해 일관된 Gradle Version으로 수행이 가능하도록 한다

 

Gradle 프로젝트 설정

1. settings.gradle

settings.gradle은 Gradle 프로젝트의 시작 지점이다

주된 목적은 서브 프로젝트들을 빌드에 포함시키기 위해서 존재한다

해당 파일 내 root 프로젝트 명을 지정하고 모든 하위 프로젝트를 선언 한다

  • 단일 모듈 프로젝트에서 해당 파일을 설정하는 것은 선택 사항
  • 멀티 모듈 프로젝트에서는 필수이며, 모든 서브 프로젝트에 대해 선언해야 한다

settings.gradle 파일은 아래와 같이 구성된다

 

 

1. 루트 프로젝트 명을 지정

2. 루트 프로젝트 하위에 포함된 서브 프로젝트에 대한 포함 선언

 

 

 

 

 

 

settings.gradle 파일 내에서 사용할 수 있는 다양한 속성이 존재한다

속성명 설명
buildCache 빌드 캐시 속성
plugins 플러그인에 대한 속성
rootDir 빌드를 위한 루트 디렉토리 속성
rootProject 빌드를 위한 루트 프로젝트에 대한 속성
settings 설정과 관련된 속성

 

2. build.gradle

Gradle은 루트 프로젝트와 루트 프로젝트의 하위에 있는 서브 프로젝트를 settings.gradle을 통해 찾고, settings.gradle에 포함된 프로젝트에 대한 Project 인스턴스를 생성한 후 설정에 필요한 build.gradle 파일을 찾는다

속성명 타입 설명
name String 프로젝트 디렉토리 명
path String 프로젝트의 전체 이름
description String 프로젝트 설명
dependencies DependencyHandler 프로젝트의 종속성(의존성) handler 설정
repositories RepositoryHandler 프로젝트의 repository handler 설정
layout ProjectLayout 프로젝트의 중요한 위치에 대한 접근 제공
group Object 프로젝트 그룹
version Object 프로젝트 버전

 

 

 

1. 빌드에 적용된 플러그인들을 작성

  • Gradle을 확장하고 프로젝트 구성을 모듈화하고 재사용하는데 사용

2. 의존성들을 찾을 수 있는 위치들 정의

3. 빌드에 포함될 의존성들 작성

4. 속성 설정(앞서 1에서 설정한 plugin에 대한)

확장을 사용하는 프로젝트에 속성과 메소드 추가

5. 빌드 스크립트에 작업을 구성하는 것

- 작업은 클래스 컴파일, 단위 테스트 실행, WAR 압축 등의 기본작업을 수행

- 별도의 작업을 등록하면 해당 작업이 프로젝트에 추가 된다

 

Gradle이 동작하는데 있어서 주요한 요소는 Project와 Task이다

Gradle이 실행되면 Project객체를 초기화하고 필요한 properties를 configuration한 후에 task를 실행하게 된다

 

그러면 gradle파일을 분석해보자

아래는 multi module project의 root project의 build.gradle.kts파일이다

plugins { (1)
	id("java")
	id("org.springframework.boot") version "3.3.2"
	id("io.spring.dependency-management") version "1.1.4"
}

ext["springCloudVersion"] = "2023.0.0"

java { (2)
	toolchain {
		languageVersion.set(JavaLanguageVersion.of(21))
	}
}

allprojects { (3)
	group = "kr.co.kimga"
	version = "0.0.1-SNAPSHOT"

	repositories {
		mavenCentral()
	}

}

subprojects { (4)
	apply {
		plugin("java")
		plugin("org.springframework.boot")
		plugin("io.spring.dependency-management")
		plugin("java-library")
	}

	java {
		toolchain {
			languageVersion.set(JavaLanguageVersion.of(21))
		}
	}

	dependencies {
		compileOnly("org.projectlombok:lombok")
		annotationProcessor("org.projectlombok:lombok")

		testImplementation("org.junit.jupiter:junit-jupiter")
		testImplementation("org.springframework.boot:spring-boot-starter-test")
	}

	tasks.test {
		useJUnitPlatform()
	}
}

 

(1) gradle root 프로젝트에서 사용할 plugin들을 정의 java: java를 빌드하기 위한 plugin으로 코드 컴파일, test 수행, jar파일 생성 등의 역할 수행 org.springframework.boot: spring boot 어플리케이션 실행을 위한 필수적인 플러그인 io.spring.dependency-management: spring boot의 의존성 버전을 관리하는 플러그인으로 의존성의 버전을 명시하지 않아도 권장되는 버전으로 의존성 사용되도록 만들어준다

(2) 프로젝트에서 사용되는 java의 버전을 명시하여 특정 버전으로 프로젝트가 컴파일되고 실행되도록 하기 위함

(3) allprojects는 루트 및 서브 프로젝트에 공통적으로 적용하는데 사용 group, version property를 지정하고 프로젝트에서 mavenCentral 저장소를 사용하도록 설정

(4) subprojects는 모든 서브 프로젝트에 공통적으로 적용하는데 사용(루트 프로젝트는 적용안됨) 서브 프로젝트에서 사용할 plugin 및 의존성 등을 설정 tasks.test(gradle)에서 기존적으로 제공하는 테스트 작업에 JUnit5를 사용하여 테스트가 실행되도록 설정

 

서브프로젝트의 build.gradle.kts 파일이다

dependencies { (1)
    implementation("org.springframework.boot:spring-boot-starter-data-mongodb")
    implementation("org.springframework.boot:spring-boot-starter-data-redis")
    implementation("org.testcontainers:testcontainers:1.20.1")
    api("org.springframework.cloud:spring-cloud-starter-stream-kafka")
}

 

해당 build.gradle.kts파일에는 의존성에 대한 내용만 존재한다

(root 프로젝트에서 하위 서브 프로젝트에 대한 공통 항목을 이미 설정했기 때문)

 

(1) 서브 프로젝트에 필요한 의존성을 설정한다(공통 항목은 이미 root 프로젝트의 build.gradle.kts에 설정됨)

implementation

- 해당 의존성을 사용하는 모듈을 다른 모듈이 접근할 때 해당 의존성에 접근할 없다

- 의존성 전파 및 모듈 간 결합도를 낮춘다

api

- 해당 의존성을 사용하는 모듈을 사용하는 다른 모듈이 해당 의존성에 접근할 수 있음

반응형

+ Recent posts