Gradle 알아보기

Computer Science/Java
Gradle에 대해서 알아봅니다.

GOAL

  • Gradle의 구조와 하는 일을 이해한다.
  • Gradle의 작동 방식을 이해한다.

 

 

Gradle이란?

Spring Boot를 이용하여 개발하다보면 꼭 함께 보이는 것들이 있다. 바로 Gradle인데, build.gradle 파일로 프로젝트의 의존성을 관리하거나 ./gradlew 명령어로 build, compile, bootRun 등 프로젝트를 실행, 빌드하곤 했을 것이다. 이런 Gradle은 무엇일까?

 

Gradle은 간단하게 말하자면 빌드 자동화 도구이다. DSL(Groovy / Kotlin)로 빌드 과정을 스크립트처럼 작성하고 Task 단위로 실행하는 것이다. build.gradle와 settings.gradle에 의존성, 플러그인, 작업 순서 등을 코드처럼 작성하고 실행할 수 있다.

  • settings.gradle: 프로젝트의 구조(어떤 모듈이 있는지)를 정의
  • build.gradle: 각 프로젝트(모듈)의 설정(플러그인, 의존성 등)을 정의

 

Gradle이 하는 일

위에서 말했듯이 "빌드 자동화 도구"인 Gradle은 우리가 애플리케이션을 만들 때 반복적으로 하는 일들을 자동화해준다.

  • 소스 코드 컴파일 (.java > .class)
  • 테스트 실행
  • JAR / WAR / bootJar 만들기
  • 라이브러리 의존성 관리 (Spring Boot, Lombok, JPA 등)
  • 코드 스타일 체크, 코드 생성, 문서 생성 등
plugins {
    id 'java'
    id 'org.springframework.boot' version '3.5.8'
    id 'io.spring.dependency-management' version '1.1.7'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(21)
    }
}

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

프로젝트를 진행하면 흔히 볼 수 있는 일반적인 Spring Boot의 build.gradle구조이다.

 

Gradle의 핵심 개념은 다음 세가지로 나눌 수 있다.

1. 플러그인

  • 빌드에 기능을 넣어주는 모듈로 위 예시에서는 java, springboot, spring.dependency-management 세 개가 들어가 있다.
  • 기본적인 Task를 제공해주거나 의존성 버전 관리해주는 모듈을 불러온다.

2. 의존성, Configuration

  • 프로젝트를 진행하면서 가장 많이 수정하게 될 부분인데, 프로젝트에서 사용될 라이브러리들을 선언한다.
  • implementation, testImplementation 같은 것들을 Configuration이라고 하며 다음과 같이 적용된다.
    • implementation
      • main 코드에서 사용하는 라이브러리
      • 컴파일 + 런타임에 모두 필요
    • testImplementation
      • 테스트 코드에서만 사용하는 라이브러리
    • compileOnly, runtimeOnly
      • 컴파일 시에만 / 런타임 시에만 필요한 것

3. Task

  • 가장 핵심적인 부분으로, gradle은 모든 작업을 Task로 본다.
  • Task간의 의존 관계를 만들고 build를 실행하면 build가 필요한 Task들을 순서대로 실행한다.

./gradlew build 하면 내부적으로

  1. compileJava
  2. processResources
  3. test
  4. bootJar (또는 jar)
  5. 필요하면 check, assemble …

이런 Task들을 순서대로 실행한다.

 

또한 직접 Task를 만들 수도 있다.

tasks.register('hello') {
    doLast {
        println "Hello, Gradle!"
    }
}
gradlew란?
Gradle Wrapper의 약자로, 프로젝트마다 “어떤 버전의 Gradle을 써야 하는지”를 고정한다.

wrapper가 없다면 개발자마다 다른 gradle 버전을 설치하고 환경마다 실행이 되지 않는 문제가 발생할 수 있다. 따라서 wrapper는 프로젝트 안에 “Gradle 버전 정보 + 부트스트랩”을 포함하여 gradle이 없어도 지정된 Gradle 버전을 자동으로 다운로드하고 그 버전으로 빌드 실행할 수 있게 된다.

“Gradle 설치를 개발자/서버에 의존하지 않고, 프로젝트 안에 버전 정의를 포함시키는 것”이 핵심이다.

 

 

settings.gradle의 역할

위에서 간단하게 gradle의 구조에 대해서 살펴보았는데, 그 중 프로젝트 구조를 명시하는 settings.gradle을 알아보자.

 

Gradle이 실행되면 다음과 같은 작업을 거치게 된다.

  1. 현재 디렉토리에서 settings.gradle 또는 settings.gradle.kts 찾기
  2. 이 파일을 읽어서 “어떤 프로젝트들이 있는지” 파악
  3. 루트 프로젝트 / 서브 프로젝트 목록 만들기

 

// settings.gradle
rootProject.name = "my-app"

include("app", "common", "user", "order")

 

이런 settings.gradle이 있다고 한다면 Gradle은 다음과 같이 해석하게 된다.

 

:          (root project, 디렉토리 = .)
:app       (디렉토리 = ./app)
:common    (디렉토리 = ./common)
:user      (디렉토리 = ./user)
:order     (디렉토리 = ./order)

즉, settings.gradle은 "폴더 구조를 Gradle 프로젝트/모듈로 인식시키는 파일" 이라고 생각할 수 있다.

 

단일 모듈 프로젝트일 때는 보통 include 블록이 생략되고 rootProject.name만 명시되어있거나, 아예 settings.gradle을 없이 진행하는 경우가 많다.

 

그래서 단일 모듈로 프로젝트를 진행한다면 신경 쓰지 않아도 되고, 멀티모듈 할 때부터 settings.gradle이 중요해진다.

 

 

build.gradle의 역할

위에서도 간단하게 설명했듯이 build.gradle은 각 프로젝트의 설정과 빌드 방법을 명시한 파일이다.

 

settings.gradle에서 “어떤 프로젝트(모듈)가 있는지”를 정했다면, 각 프로젝트(모듈)가 “어떻게 빌드될지”는 build.gradle에서 정하게 된다.

 

멀티모듈일 때는 루트 build.gradle에 공통 설정을 명시하고 각 모듈의 build.gradle에서 모듈별 설정을 해주게 된다.

 

root
 ├─ settings.gradle
 ├─ build.gradle        # 공통 설정
 ├─ app
 │   └─ build.gradle    # app 모듈 설정 (Boot 플러그인 등)
 ├─ common
 │   └─ build.gradle    # common 모듈 설정
 └─ user
     └─ build.gradle    # user 모듈 설정

 

정리해보자면 Gradle은 다음과 같은 순서로 동작하게 된다.

  1. Init 단계
    • settings.gradle 읽어서 프로젝트 트리 구성
  2. Configuration 단계
    • 각 프로젝트의 build.gradle 읽어서 플러그인, 의존성, Task 그래프 구성
  3. Execution 단계
    • ./gradlew build 같은 명령에서 지정한 Task들 실제 실행

'Computer Science > Java' 카테고리의 다른 글

객체지향과 Java  (0) 2025.10.13
Java의 값 복사와 JVM 구조  (0) 2025.10.13
Java 21 Virtual Thread  (0) 2025.09.25
'Computer Science/Java' 카테고리의 다른 글
  • 객체지향과 Java
  • Java의 값 복사와 JVM 구조
  • Java 21 Virtual Thread
hojoo
hojoo
그냥 개발이 즐거운 사람
  • hojoo
    dev_record
    hojoo
  • 전체
    오늘
    어제
    • 분류 전체보기 (84)
      • Study (0)
        • 모든 개발자를 위한 HTTP 웹 기본 지식 (0)
        • Real MySQL 8.0 (0)
        • 친절한 SQL 튜닝 (0)
        • 도메인 주도 개발 시작하기 (0)
        • 대규모 시스템 설계 기초 (0)
      • Computer Science (68)
        • Problem Solving (30)
        • Data Structure (4)
        • Spring Boot (14)
        • DB (1)
        • Java (4)
        • OS (3)
        • Server (3)
        • Tech (0)
      • Security (16)
        • Reversing (15)
        • Assembly (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    소수상근수
    9421
    2539
    Lena tutorial
    리버싱
    Header
    백준
    16946
    DP
    12033
    프로그래머스
    DB
    Spring boot
    레나 튜토리얼
    19622
    서버 증설 횟수
    servlet
    n^2 배열 자르기
    13265
    PE header
    HTTP
    15973
    자료구조
    Reversing
    x64dbg
    bean
    n+1
    리버싱 핵심원리
    21278
    dreamhack.io
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
hojoo
Gradle 알아보기
상단으로

티스토리툴바