웹개발에 필요한 최소한의 Gradle

dragonappear·2022년 7월 9일
1

Gradle

목록 보기
2/5

출처

제목: "[Gradle, JAVA, SPRING] 웹개발에 필요한 최소한의 Gradle"
작성자: tistory.com(webfirewood)
작성자 수정일: 2020년7월18일
링크: https://webfirewood.tistory.com/129
작성일: 2022년7월9일

글 작성 계기

  • 스프링을 개발하다 보면, build.gradle 파일에서 다양한 설정들을 하는 것을 볼 수 있다. 그 때마다 대충 gradle이 어떤 역할을 하는지 인지만 하고 넘어가는 경우가 많았다. 문법도 잘모르겠고,별로 달갑지 않게 생겼다
  • 그래서 대충이라도 훑고 가고 싶어서 구글링을 한 결과 출처글을 보고 글을 작성하게 되었다.

Build Tool

  • Gradle은 일종의 build tool(빌드 도구)이다. 여기서 말하는 빌드라는 개념은 단순히 프로그램을 컴파일하여 어플리케이션을 생성하는 작업만을 의미하지는 않는다.

    • 개발한 소프트웨어가 제품으로 만들어지는 일련의 과정, 즉 컴파일,테스트,배포,문서화 등의 작업을 포함하는 절차를 의미한다. 이 때, 빌드의 모든 과정을 자동으로 처리할 수 있도록 도와주는 것을 빌드 도구(build tool) 이라고 한다.
  • 빌드 도구로 불리는 프로그램은 많다. 자바에서 이용하는 주요 빌드 도구의 종류도 몇가지가 된다. 그 중에서도 최근 대세라고 할 수 있는 것이 Gradle이다.

Groovy,DSL(Domain-Specific Languages,도메인 특화 언어)

  • Gradle은 groovy라고 하는 JVM 기반의 동적 타이핑 언어를 사용해서 기술된다.
  • groovy는 대부분의 자바 개발자들이 쉽게 배워서 사용할 수 있는 장점이 있다. 그런데 gradle은 groovy 문법 그 자체를 그대로 사용하지는 않고 그루비 기반의 DSL을 사용한다. DSL은 도메인 고유 언어라고 불리는데 특정한 용도에 한정된 언어를 가리킨다.
  • **간단히 말해서, 기반인 언어가 있지만 그 자체는 있지만 그 언어 그 자체는 아니고 특정한 용도에 맞게 해당 언어를 기반으로 각색한 것이다. 그래들에 사용되는 언어는 그루비를 기반으로 작성된 gradle DSL 이다.

Gradle에 대해서 어렵게 생각할 필요는 전혀 없다. 애초에 개발을 더 쉽게 할 수 있도록 도움을 주기 위해 탄생한 빌드도구 인 만큼 학습에 많은 시간을 필요로 하지 않는다.

build.gradle

  • build.gradle은 gradle에서 빌드 작업에 필요한 기본 설정, 동작 등을 정의하는 파일이다.
  • 아래는 인텔리제이에서 스프링부트 프로젝트를 생성하고 라이브러리를 추가했을 때 기본적으로 생성해주는 build.gradle 파일이다
plugins {
        id 'org.springframework.boot' version '2.3.1.RELEASE'
        id 'io.spring.dependency-management' version '1.0.9.RELEASE'
        id 'java'
    }
    
    group = 'com.example'
    version = '0.0.1-SNAPSHOT'
    sourceCompatibility = '1.8'

    configurations {
        compileOnly {
            extendsFrom annotationProcessor
        }
    }

    repositories {
        mavenCentral()
    }

    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
        implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
        implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
        implementation 'org.springframework.boot:spring-boot-starter-security'
        implementation 'org.springframework.boot:spring-boot-starter-web'
        implementation 'org.springframework.kafka:spring-kafka'
        compileOnly 'org.projectlombok:lombok'
        runtimeOnly 'com.h2database:h2'
        runtimeOnly 'mysql:mysql-connector-java'
        annotationProcessor 'org.projectlombok:lombok'
        testImplementation('org.springframework.boot:spring-boot-starter-test') {
            exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
        }
        testImplementation 'org.springframework.kafka:spring-kafka-test'
        testImplementation 'org.springframework.security:spring-security-test'
    }

    test {
        useJUnitPlatform()
    }

plugins

  • 프로젝트를 빌드하기 위해서 여러가지 작업을 처리해줘야 한다. (컴파일이나 jar 파일의 생성 같은 작업들)
  • 이런 작업들을 해주는 플러그인들이 존재한다. plugins 블록 안에 필요한 플러그인을 지정해주고 이런 플러그인들은 필요한 과정들을 task로 포함하고 있다.
    • 빌드시에는 필요한 모든 과정을 플러그인의 내부 task가 진행해 주게 된다.

repositories

  • repositories는 저장소 정보를 관리하는 프로퍼티이다. 소프트웨어를 등록하여 관리하는 장소를 가리킨다.
  • 로컬 환경이나 네트워크에 라이브러리를 공개하고 그 주소를 저장소로 등록하면 저장소에 있는 라이브러리를 그래들이 취득하여 이용할 수 있다.
  • 위에 기술된 repositories에는 mavenCentral() 이라는 메서드를 통해 중앙저장소를 사용하고 있다.
  • jcenter() 메서드를 사용해 jCenter 저장소를 이용할 수도 있다. jCenter()는 그래들에서 중앙 저장소로 이용하는 저장소이다.

저장소가 뭐시오?
저장소는 가종 라이브러리 등이 등록된 일종의 소프트웨어 보관장소라고 할 수 있다. 저장소에는 각종 프로그램이 등록되어 있어 그래들은 저장소로부터 필요에 따라 프로그래믈 다운로드하여 이용할 수 있다. 또 다른 빌드 도구 중 하나인 메이븐은 메이븐 중앙 저장소를 제공하여 그래들에서도 이 메이븐 중앙 저장소에 접속해서 필요한 프로그램을 다운로드 할 수 있다. 이 중앙 저장소는 현재 아파치 재단에서 운영중이다.

만약 중앙저장소에 공개되지 않았거나 공개하기 힘든 라이브러리가 있을 수도 있다. 예를 들어 사내에서만 사용하는 라이브러리라면 중앙 저장소에 공개하기는 힘들것이다. 이런 경우는 로컬 저장소를 이용하면 된다.

dependencies

  • Dependencies는 의존성에 관한 설정을 관리하는 프로퍼티이다. 여기에 필요한 라이브러리 등의 정보를 기술하면 그 라이브러리를 참조할 수 있다.

  • 위 예시 코드에서는 implementation,testImplementation 이라고 기술되어 있다. 컴파일 할때는 implementation에 지정한 라이브러리에 그리고 테스트를 컴파일할때는 testImplementation에 지정한 라이브러리에 각각 접근할 수 있다는 의미이다.

  • 이외에 compileOnly는 컴파일시에만, runtimeOnly는 런타임시에만 사용한다는 의미이다.

dependencies {
    compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.7.Final'
    // 짧게 쓰면 "group:name:version"
    compile 'org.hibernate:hibernate-core:3.6.7.Final'
}

의존성을 추가하는 방법에는 위와 같이 두가지가 존재한다. 자신이 선하는 방법으로 기술하면 된다. 어느ㅉ고을 사용하더라도 전혀 문제가 되지 않는다.

ext

ext {
	appVersion = '1.0.0-SNAPSHOT'
}
  • 이 블록은 gradle의 모든 task에서 사용할 수 있는 일종의 전역 변수를 선언한느 블록이라고 생각하면 된다.

buildscript

  • 위 예시에서는 등장하지는 않지만 buildscript 블록을 사용할 때가 있다.
  • buildscript는 빌드하는 동안 필요한 처리를 모아놓는 곳이다. 이 안에서 dependenciesrepositories를 포함할 수 있다

setting.gradle

  • 또다른 그래들 파일 중에 setting.gradle가 있다. 여러가지로 사용할 수 있지만 가장 많이 사용하는 것이 역시 멀티 모듈을 사용할 때 설정이다.
rootProject.name = 'example'
include 'sub-example'

위 예시에서 rootProject.name 을 통해 루트프로젝트를 설정하고 include를 통해 하위 모듈을 설정하였다.

멀티모듈일때 build.gradle

buildscript {
    ext {
        springBootVersion = '2.1.3.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath "io.spring.gradle:dependency-management-plugin:1.0.6.RELEASE"
    }
}

allprojects {
    group 'com.example'
    version '1.0-SNAPSHOT'
}

subprojects {
    apply plugin: 'java'
    apply plugin: 'org.springframework.boot'
    apply plugin: 'io.spring.dependency-management'

    sourceCompatibility = 1.8

    repositories {
        mavenCentral()
    }

    dependencies {
        testCompile group: 'junit', name: 'junit', version: '4.12'
    }
}

project(':example') {
    dependencies {
        ....
    }
}

project(':sub-example') {
    dependencies {
        ...
    }
}

allprojects,subprojects,project

  • 멀티모듈인 경우 이처럼 새로운 블록이 등장한다.
  • allProjects는 전체 프로젝트에, subProject는 하위 프로젝트에, 그리고 프로젝트 이름만 사용한 project는 해당하는 프로젝트에만 동작하는 설정이다.

task

  • 마지막으로 사용자가 임의로 task를 작성해서 사용할 수 있다.
  • task는 다양한 기능을 수행할 수 있고 다양한 문법을 가지고 있다. 아마 신입 개발자가 실무에서 작성하는 경우는 극히 제한적일 것이다.
task exampleTest {
    println 'Hello World!'
}
  • task는 위 예시 처럼 선언할 수 있으며 커맨드 라인에서 task[task 이름]으로 사용할 수 있다.
  • 예시를 실행하면 다음과 같은 결과를 볼 수 있다.

관련 서적


추가 공부해야 할 부분

  • 멀티 모듈일때 gradle 설정하는 방법

0개의 댓글