Gradle

허준기·2023년 12월 18일
0

스프링

목록 보기
2/7

Gradle

그루비(Groovy)를 기반으로 한 빌드 도구
Ant와 Maven과 같은 이전 세대 빌드 도구의 단점을 보완하고 장점을 취합하여 만든 빌드 도구

Ant

  • XML 기반으로 빌드 스크립트 작성
  • 자유롭게 빌드 단위 지정 가능
  • 간단하고 사용이 쉬움
  • 유연하지만 프로젝트가 커지는 경우 스크립트 관리나 빌드 과정이 복잡해짐
  • 생명주기를 갖지 않아 각각의 결과물에 대한 의존관계 등을 정의해야 함
  • 정해진 규칙이 없어 유지보수 어려움

Maven

  • XML 기반으로 작성
  • 생명주기와 프로젝트 객체 모델(POM) 개념 도입
  • Ant의 장황한 빌드 스크립트 개선
  • pom.xml에 필요한 라이브러리를 선언하면 자동으로 해당 프로젝트로 불러옴
  • 학습장벽이 높음
  • 라이브러리가 서로 의존하는 경우 복잡해짐

Gradle 특징

High performance

실행시켜야 하는 task만 실행시키고 다른 불필요한 동작은 하지 않고, build cache 를 사용함으로써 이전 실행의 task outpupt을 재사용. 서로 다른 기계에서도 build cache를 공유하여 성능 향상

  • build cache : 빌드 결과물을 캐싱하여 재사용
  • 라이브러리 의존성을 캐시로 저장 후 이전에 다운로드한 라이브러리 재사용

JVM foundation

JVM 에서 실행되기 때문에 JDK 설치 필요. Java Standard API 를 빌드 로직에 사용 사능, 다양한 플랫폼에서 실행

Conventions

컨벤션 을 따라 Java 프로젝트와 같은 일반적인 유형의 프로젝트를 쉽게 빌드 가능. 필요하다면 컨벤션을 오버라이딩 하거나 task를 추가하면서 컨벤션 기반의 빌드를 커스터마이징

Extensibility

Gradle을 확장하면 고유의 task 타입을 제공하거나 모델 빌드 가능

IDE, Build Scan support

Android Studio, IntelliJ IDEA, Eclipse 등의 IDE에서 Gradle을 임포트하여 사용 가능
빌드를 모니터링할 수 있는 Build Scan 지원

데몬 프로세스 사용

  • 다음 빌드 작업을 위해 백그라운드에서 대기하는 프로세스
  • 초기 빌드 이후 빌드 실행 시 초기화 작업 거치지 않음
  • 한 번 빌드된 프로젝트는 다음 빌드에서 적은 시간만 소요

멀티프로젝트 빌드 지원

  • 멀티프로젝트(멀티 모듈) : 공통되는 도메인을 사용하는 프로젝트를 하나의 프로젝트로 묶어서 관리
  • 각 프로젝트가 공통으로 사용하는 클래스를 모듈로 만들어 독립적인 각 프로젝트에서 사용

Configuration Injection

  • 필요한 정보(설정)를 직접 프로젝트에 주입
  • 공통되는 정보 묶어서 주입 가능
  • 프로젝트별 설정 다르게 주입 가능
  • Maven의 상속 구조와 비교했을 때 가독성 좋음

Gradle 구조

├─ gradle
│       └─ wrapper
│       ├─ gradle-wrapper.jar
│       └─ gradle-wrapper.properties
├─ gradlew
├─ gradlew.bat
├─ build.gradle
└─ settings.gradle
  • gradlew
  • 리눅스/맥OS 실행 쉘 스크립트 파일
  • gradlew.bat
  • 윈도우용 배치 스크립트 파일
  • gradle-wrapper.jar
  • JAR 형식으로 압축된 Wrapper 파일. gradlew나 gradlew.bat 파일이 프로젝트 안에 설치되는 이 파일을 사용해 Gradle task 실행
  • gradle-wrapper.properties
  • Gradle Wrapper 설정 정보 파일. Wrapper의 버전 등 설정
  • build.gradle
  • 프로젝트의 라이브러리 의존성, 플러그인, 라이브러리 저장소 등을 설정하는 빌드 스크립트 파일
  • settings.gradle
  • 프로젝트의 구성 정보 파일. 멀티 프로젝트를 구성해 프로젝트를 모듈화할 경우, 하위 프로젝트의 구성 설정

build.gradle

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.2.0'
	id 'io.spring.dependency-management' version '1.1.4'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
	sourceCompatibility = '17'
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	implementation 'org.springframework.boot:spring-boot-starter-aop'
}

tasks.named('test') {
	useJUnitPlatform()
}

build.gradle 에 작성한느 코드들은 모두 Project 오브젝트의 프로퍼티와 메서드가 되며, Project 오브젝트는 프로젝트 이름부터 변수, 메서드를 모두 포함하는 객체가 됨

build.gradle 메서드

이 메서드들은 build.gradle 속에 메서드로 존재 → 이 내부에 들어가는 람다식은 프로젝트가 빌드될 때 해당 메서드를 수행하는 task에 의해 수행

Repositories

  • 라이브러리(모듈)가 저장된 위치 정의
  • 대표적으로 Maven Central(), Jcenter(), Google Android()
  • 라이브러리의 저장소를 명시해주면 Gradle이 해당 저장소에서 필요한 라이브러리 가져옴
repositories {
	mavenCentral()
}

Dependencies(의존성 관리)

  • 의존성 : 프로젝트에서 사용하는 라이브러리나 패키지
  • 프로젝트별로 어떤 의존성을 갖는지 명시
dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	implementation 'org.springframework.boot:spring-boot-starter-aop'
}
  • Implementation : 런타임 + 컴파일 시점 모두 사용
  • compileOnly : 컴파일할 때만 사용
  • runtimeOnly : 런타임 때만 사용
  • testImplementation : 테스트할 때만 사용
profile
나는 허준기

0개의 댓글