Gradle 이란❓

이상민·2021년 8월 2일
0

[오늘의 배움]

목록 보기
59/70
post-thumbnail

1. Build

빌드란 다음과 같은 동작을 수행하는 일을 말한다

  • 필요한 라이브러리를 다운 받고 *classpath에 추가

  • 소스 코드를 컴파일

  • 테스트를 실행

  • 컴파일된 코드를 패키지(jar, war, zip 등)

  • 패지키된 파일을 주로 artifact라고 부르고 서버나 레포지토리에 배포

*classpath : 사용자 정의 클래스 및 API 패키지의 경로를 지정하는 자바가상머신 또는 Java 컴파일러의 매개 변수

2. Build Tool

  • 수동으로 빌드하고 실행하는 과정을 정말 귀찮다. 이런 과정을 자동화하기 위해 빌드 툴이 고안됐다
    ex) Ant, Maven, Gradle

  • 자바에서는 이전에 Maven이 널리 사용되었지만, 다양한 언어를 지원하는 Gradle이 떠오르며 최근에는 Gradle이 널리 사용되고 있다

  • 빌드 툴은 프로젝트에서 필요한 xml, properties, jar 같은 파일들을 인식하여 빌드하고, 컴파일과 테스트하여 실행가능한 앱으로 빌드해준다

  • 프로젝트 정보 관리, 테스트 빌드, 배포 등의 작업도 진행해준다


3. Gradle

그루비를 이용한 빌드 자동화 시스템

3-1. 설치

  • 맥에선 homebrew, 윈도우와 리눅스에선 sdk 패키지 매니저를 통해 쉽게 설치할 수 있다
$ sdk install gradle
$ brew install gradle

3-2. 실행

3-2-1. gradle 프로젝트 생성

$ gradle init  # gradle로 프로젝트 생성. 몇가지 설정들을 선택해주면 된다 
$ tree  # 기본 gradle 생성 자바 프로젝트는 다음과 같은 구조를 가진다 
├── app  # 기본 프로젝트 명 
│   ├── build.gradle  # 빌드 스크립트를 작성하는 곳 
│   └── src  # 소스 코드
│       ├── main  # 프로그램 코드
│       │   ├── java
│       │   │   └── com
│       │   │       └── programmers
│       │   │           └── java
│       │   │               └── App.java
│       │   └── resources
│       └── test  # 테스트 코드
│           ├── java
│           │   └── com
│           │       └── programmers
│           │           └── java
│           │               └── AppTest.java
│           └── resources
├── gradle  # gradle 실행을 위한 런타임 
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle  # gradle 설정 파일 

3-2-2. 빌드와 실행

$ gradle build
Starting a Gradle Daemon (subsequent builds will be faster)

BUILD SUCCESSFUL in 5s
7 actionable tasks: 7 up-to-date

$ gradle run
> Task :app:run
Hello World!

BUILD SUCCESSFUL in 725ms
2 actionable tasks: 1 executed, 1 up-to-date

3-2-3. 태스크

  • gradle에서 작업의 단위는 태스크이다. 위의 build와 run 같은 것도 태스크이다. build.gradle 파일에는 이런 태스크들이 작성되어 있다.
(...생략...)

tasks.named('test') {
    // Use JUnit Platform for unit tests.
    useJUnitPlatform()
}
  • gradle init에서 application을 선택했다면 plugin에서 application이 추가되고 다음과 같은 task들이 자동으로 등록된다
$ gradle tasks
> Task :tasks

------------------------------------------------------------
Tasks runnable from root project 'HelloWorld'
------------------------------------------------------------

Application tasks
-----------------
run - Runs this project as a JVM application

Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend on it.
buildNeeded - Assembles and tests this project and all projects it depends on.
classes - Assembles main classes.
clean - Deletes the build directory.
jar - Assembles a jar archive containing the main classes.
testClasses - Assembles test classes.

Build Setup tasks
-----------------
init - Initializes a new Gradle build.
wrapper - Generates Gradle wrapper files.

Distribution tasks
------------------
assembleDist - Assembles the main distributions
distTar - Bundles the project as a distribution.
distZip - Bundles the project as a distribution.
installDist - Installs the project as a distribution as-is.

Documentation tasks
-------------------
javadoc - Generates Javadoc API documentation for the main source code.

Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'HelloWorld'.
dependencies - Displays all dependencies declared in root project 'HelloWorld'.
dependencyInsight - Displays the insight into a specific dependency in root project 'HelloWorld'.
help - Displays a help message.
javaToolchains - Displays the detected java toolchains.
outgoingVariants - Displays the outgoing variants of root project 'HelloWorld'.
projects - Displays the sub-projects of root project 'HelloWorld'.
properties - Displays the properties of root project 'HelloWorld'.
tasks - Displays the tasks runnable from root project 'HelloWorld' (some of the displayed tasks may belong to subprojects).

Verification tasks
------------------
check - Runs all checks.
test - Runs the unit tests.

To see all tasks and more detail, run gradle tasks --all

To see more detail about a task, run gradle help --task <task>

3-2-4. Injellij IDEA에서의 Gradle

  • idea는 gradle을 기본적으로 지원한다. 프로젝트 생성시 선택하면 쉽게 gradle 프로젝트를 생성한다

  • 코드 실행 시 gradle로 실행하는 것을 볼 수 있다.


4. Gradle을 통한 외부 Dependency 관리

  • 파이썬에서 pip로 외부 라이브러리를 설치하는 것처럼, Gradle에서는 build.gradle의 repositories와 dependencies 설정을 통해 설치할 수 있다.

  • 다음 build.gradle의 일부분은 mavenCentral 레포의 몇몇 외부 dependency를 불러온다

repositories {
    mavenCentral()
}

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
    implementation 'com.github.javafaker:javafaker:1.0.2'
}
import com.github.javafaker.Faker;

public class Main {
    public static void main(String[] args) {
        // 데모 등을 위해 다양한 랜덤 값을 생성하는 클래스
        Faker faker = new Faker();

        // 직함 생성
        String title = faker.name().title();
        System.out.println(title);
    }
}

지원 shell

아쉽게도 내가 현재 사용중인 fish를 지원하지 않는다 😢 posix compliant한 쉘들만 지원하는거 같은데, 앞으로 gradle을 직접 실행할 일이 많다면 zsh을 설치하던가 해야겠다 .

profile
편하게 읽기 좋은 단위의 포스트를 추구하는 개발자입니다

0개의 댓글