자바와 Gradle

jhkim31·2024년 10월 16일
0

항상 Gradle을 사용해 편하게 프로젝트를 빌드해 왔는데, Gradle 이 어떤 역할을 해주고 만약 없다면 어떤 불편함이 있는지 궁금해졌다.

빌드 도구

빌드 도구는 코드의 컴파일, 의존성 관리, 패키징등의 작업을 편리하게 도와주는 도구다.

자바를 처음 배울때 자바를 컴파일해 클래스 파일을 만들고 실행해보는 경험을 해보게 된다.

이때는 하나의 자바 파일을 컴파일 하고 실행시킬때 이야기이고 파일이 많아지고 참조할 라이브러리가 많아진다면 컴파일 과정도 복잡해 지게 된다.

또한 라이브러리, 프레임워크의 의존성또한 직접 관리해야 하는데 우리가 편하게 사용하는 스프링 부트는 다음과 같은 의존을 가지며, 저 각각의 의존 또한 수많은 의존을 가진다.

만약 빌드 도구가 없다면 저 모든 의존 관계를 수동으로 직접 관리 해야 한다.

이러한 컴파일, 의존관리, 패키징등 작업을 도와주는것이 빌드 도구이며, Node 에는 npm 등이 있고, Java 에는 Maven, Gradle 등이 있다.

Gradle

Gradle 은 소프트웨어 오픈소스 빌드 도구다. 자바에 국한된 빌드 도구가 아니라 C++, Python과 같은 언어에서도 사용할 수 있다.

XML을 사용하는 기존 빌드 도구인 Ant, Maven과 다르게 Groovy는 스크립트를 사용해 빌드를 정의할 수 있다.

구조

Gradle 은 하나(멀티도 가능)의 프로젝트를 가지며 각 프로젝트는 빌드 스크립트, 태스크를 갖는다.

빌드 스크립트

빌드 스크립트는 상기했든 스크립트로 작성할 수 있다. Groovy 또는 Kotlin DSL을 사용한다.

프로젝트의 루트 디렉토리에 build.gradle 라는 이름의 파일에 작성한다.

멀티 프로젝트의 환경에서는 settings.gradle 라는 파일에 프로젝트의 구조를 설명할 수 있다.

Gradle Wrapper

시스템에 Gradle을 설치하지 않아도 Gradle 을 사용할 수 있게 해주는 스크립트다.

만약 Gradle Wrapper 가 없다면 모든 사용자가 자신의 시스템에 Gradle 을 설정 해야 하며 이 과정에서 버전 차이등의 문제가 발생할 수 있다.

또한 Gradle을 설치하며 필요한 복잡한 설정을 하지 않아도 된다.

유닉스 계열에서는 ./gradlew 로 사용하고, 윈도우 에서는 gradlew.bat 을 실행해 사용할 수 있다.

# ex
./gradlew build

build.gradle

build.gradle 은 Gradle 의 빌드 스크립트를 정의하는 파일이며 일반적으로 Groovy 를 사용해 작성한다.

plugins {
    id 'java'
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework:spring-core:5.3.12'
}

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

plugins

Gradle의 기능을 확장하기 위한 플러그인이다. 보통 자바 프로젝트에서는 java 플러그인을 사용한다.

자바 플러그인은 프로젝트 구조 관리 (src/main/java, src/main/test 등), 클래스 파일 관리, jar 패키징, 테스트등 작업을 추가로 도와준다.

상기했듯 Gradle은 자바를 위한 빌드 도구가 아니기 때문에 자바에서 사용하기 위해 자바 플러그인을 사용하는것이다.

repositories

dependencies 에 명시된 의존을 가져오는 저장소다.

Node 를 사용해 봤다면 npm 저장소를 생각하면 된다. 현재 메이저로 운영되는 저장소는 mavenCentral 이 있다.

https://central.sonatype.com/search?q=spring-boot

dependencies

프로젝트에 사용할 의존을 정의한다. Gradle 은 정의된 의존에서 필요한 다른 의존의 버전까지 해결해 가져온다.

Gradle 은 다양한 의존성 종류를 지원한다.

  • implementation : 컴파일, 런타임에서 필요하다.
  • testImplementation : 테스트의 컴파일, 런타임에서 필요하다.
  • compileOnly : 컴파일 단계에서만 필요로 한다. 주로 lombok 과 같은 어노테이션 프로세서가 사용함.
  • runtimeOnly : 런타임 단계에서만 필요로 한다. 주로 로깅이 사용한다.

task

Gradle을 사용해 작업할 내용을 정의할 수 있다.

Gradle 이 기본으로 제공하는 태스크가 있지만, 사용자가 추가로 태스크를 정의할 수 있다.

기존 태스크에 동작을 추가하거나 새로운 태스크를 만들 수 있다.

기존 태스크 동작 추가

test {
	useJUnitPlatform()
}

원래 존재하는 test 라는 태스크에 Junit 동작을 추가한다.

새로운 태스크 추가

task test2 {
	println "test2"
}

새로운 태스크 test2 를 정의한다.

실행은

./gradlew test2 로 할 수 있다.

profile
김재현입니다.

0개의 댓글

관련 채용 정보