본문 바로가기
Gradle

다양한 빌드 도구 & 그레이들

by 이상한나라의개발자 2023. 12. 5.

지금까지 빌드 툴을  사용하면서도 그 내용은 크게 신경 쓰지 않았다.

그래서 빌드란 무엇이고 각각의 특징을 정리하고자 한다.

 

그럼 빌드란? 무엇인가!

 

그레이들이란 오픈소스 빌드 자동화 도구로 주로 Java, C/C+ 개발에 널리 사용된다. 빌드 도구에는 ant, maven, gradle 등이 있다.

빌드 도구란 소스 코드 파일을 컴퓨터에서 실행할 수 있는 독립 소프트웨어 가공물로( Artifact ) 로 변환 시키는 과정 이다.

 

빌드를 세분화 하면...

  • 소스 코드를 컴파일 한다.
  • 테스트 코드를 컴파일 한다.
  • 테스트 코드를 실행한다.
  • 테스트 코드 리포트를 작성한다.
  • 기타 추가 설정한 작업들을 진행한다.
  • 패키징을 수행한다.
  • 최종 결과물 Artifact 를 만들어 낸다.

빌드를 한번 하는게 쉬운게 아니다.. 

 

그래서 나온게 빌드 툴!!!!!!! ( build tool ) 

 

  • 소스크드의 빌드 과정을 자동으로 처리 해주는 프로그램
  • 외부 소스 코드 ( 외부 라이브러리 ) 자동 추가, 관리 -> 빌드 툴을 사용하는 가장 중요한 이유이다.!!

 

빌드 툴의 종류는 Ant, Maven, Gradle

 

 

빌드 툴

 

 

Ant ( 사용해본적 없음 )

  • 설정을 위해 xml을 사용한다.
  • 간단하고 사용하기 쉽다고 한다.
  • 대규모 프로젝트에서 복잡해지는 경향이 있음 
  • 외부 라이브러리를 관리하는 구조가 없다. ( 빌드 기능만 가능 )

 

Maven 이란?

  • 설정을 위해 xml을 사용한다.
  • 자바의 대표적인 관리 도구였단 ant를 대체하기 위해 개발됨
  • 외부 라이브러리를 관리할 수 있다. ( pom.xml )
    • 참조한 외부 라이브러리에 연관된 다른 라이브러리도 자동으로 관리됨
  • 복잡한 빌드 스크립트 문제가 해결 되었다.
  • 특정한 경우에 xml이 복잡해진다.
  • pom.xml로 편하게 Dependency 관리

 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>example</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>studyolle</name>
    <description>example management web service</description>

    <properties>
        <java.version>11</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

 

 

 

Gradle

  • 설정을 위해 groovy 언어를 사용하는 빌드 관리 도구 이다.
  • 안드로이드 프로젝트의 표준 빌드 시스템으로 채택
  • 멀티 프로젝트의 빌드에 최적화 하여 설계됨
  • Maven에 비해 더 빠른 처리속도를 가지고 있음. ( 최대 100배 정도 차이가 난다고 하네요 )
  • Maven에 비해 더 간결한 구성이 가능함.

 

buildscript {
    ext {
        queryDslVersion = "5.0.0"
    }
    repositories {
        mavenCentral()
    }
}

plugins {
    id 'java'
    id 'org.springframework.boot' version '2.7.17'
    id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
    id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}

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

java {
    sourceCompatibility = '11'
}

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-validation'
    implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect:3.0.0'

    implementation 'org.springframework.boot:spring-boot-starter-data-redis'
    implementation 'org.springframework.session:spring-session-data-redis'

    implementation 'com.fasterxml.jackson.core:jackson-databind'

    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5'

    implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
    annotationProcessor "com.querydsl:querydsl-apt:${queryDslVersion}"

    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'com.h2database:h2'
    annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.springframework.security:spring-security-test'
}

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

//querydsl 추가 시작
def querydslDir = "$buildDir/generated/querydsl"

querydsl {
    jpa = true
    querydslSourcesDir = querydslDir
}
sourceSets {
    main.java.srcDir querydslDir
}
configurations {
    querydsl.extendsFrom compileClasspath
}
compileQuerydsl {
    options.annotationProcessorPath = configurations.querydsl
}
//querydsl 추가 끝

 

 

그럼 최신 빌드도구인 그레이들에 대해서 좀더 알아보자!

 

프로젝트를 설정 주입(Configuration Injection) 방식으로 정의

 

  • Maven의 상속 구조보다 재사용에 용이
  • 프로젝트의 조건을 체크할 수 있어서 프로젝트별로 주입되는 설정을 다르게 할 수 있다.
  • Maven 보다 가독성이 좋다.

 

// maven

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>


// gradle

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

 

 

멀티 프로젝트 빌드

 

하나의 repository내에 여러개의 하위 프로젝트를 구성할 수 있다.

예를들어 관리자 서버와 사용자 서버를 분리해서 진행해야 될 경우 하나의 모듈로 개발하면 중복되는 코드들이 다수 발생하게 된다. 이때 그레이들을 사용하면 중복을 피할 수 있다.

 

rootProject.name = 'project'
include 'admin'
include 'user'

 

멀티 프로젝트의 구성은 범위가 작지 않기 때문에 다음에 좀더 디테일하게 기록하기로 하고.. build.gradle 파일의 구성을 살펴 보자!

 

 

plugins 블록

 

  • 플러그인 추가 : 'plugins' 블록은 프로젝트에 필요한 그레들 플러그인을 정의하고 추가한다. 플러그인은 빌드 프로세스에 추가적인 기능이나 작업을 제공 
  • 버전관리 : 각 플러그인에 대한 특정 버전을 지정할 수 있다. 이를 통해 빌드가 일관되고 예측 가능한 방식으로 수행될 수 있다.
  • 자동 종속성 관리 : 일부 플러그인은 추가적인 종속성을 필요로 하며, 플러그인 블록을 사용하여 이러한 종속성이 자동으로 관리된다.
  • 프로젝트 설정 시간 단축 : 플러그인 블록은 초기화 단계에서 처리되어 빌드 설정 시간을 줄여준다.

 

  • id 'org.springframework.boot version '2.7.17'
    • 스프링을 빌드했을 때 실행 가능한 jar 파일이 나오게 도와준다.
    • 스프링 어플리케이션을 실행할 수 있게 도와 준다.
    • 또다른 플러그인들이 잘 적용될 수 있게 해준다.
  • id io.spring.dependency-management' version '1.0.15.RELEASE'
    • 외부 라이브러리, 프레임워크의 버전관리에 도움을 준다.
    • 서로 얽혀 있는 의존성을 처리하는데 도움을 준다.
  • id 'java'
    • 자바 프로젝트를 개발하는데 필요한 기능을 추가해준다.
    • 다른 JVM 언어 Gradle 플러그인을 사용할 수 있는 기반을 마련해준다.
  • id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10'
    • ewerk에서 제공하는 querydsl 플러그인을 지정하며, 이 플러그인은 gradle 빌드에서 querydsl 작업을 지원한다.

 

 

그룹, 버전, jdk 버전 지정

 

 

외부 라이브러리/프레임워크 가져오는 저장소 설정(maven 중앙 저장소로 설정)

 

 

의존성 블록

 

dependencies 블록은 프로젝트 빌드에 종속성을 정의하고 관리하는데 사용 된다.

주요 특징은 아래와 같다.

 

  • 종속성 정의 : 프로젝트가 컴파일, 테스트, 런타임 등의 단계에서 필요로 하는 라이브러리나 모듈을 명시 한다. 예를들어, 자바 프로젝트에서 'dependencies' 블록을 사용하여 jar 파일이나 다른 프로젝트 종속성을 추가할 수 있다.
  • 버전관리 : 종속성의 특정 버전을 지정할 수 있어 프로젝트가 일관된 라이브러리 버전을 사용하도록 보장한다. 버전 관리는 빌드의 아전성과 예측 가능성이 높여준다.
  • 원격및 로컬 종속성 : 그레들은 메이븐 같은 원격 저장소 뿐만 아니라, 로컬 파일 시스템에서도 종속성을 가져올 수 있다.
  • 동적 버전과 스냅샷 : 동적 버전 지정을 통해 최신 버전의 종속성을 자동으로 사용할 수 있습니다. 또한, 개발 중인 스냅샷 버전의 종속성을 사용할 수도 있다.
  • 종속성 유형
    • implementation : 이 유형의 종속성은 프로젝트의 컴파일과 런타임(실행)에 모두 사용하며, 프로젝트에서 해당 의존 라이브러리 코드를 직접 참조하여 사용하는 경우에 사용 됩니다.
    • runtimeOnly : 코드를 실행할 때에만 의존성을 사용하며, 컴파일시에는 필요하지 않지만 어플리케이션이 실행될 때 필요한 라이브러리나 모듈을 지정하는데 사용된다.
    • compileOnly :  컴파일 시에만 사용되고, 프로젝트 런타임이나 테스트시에는 필요하지 않는 경우에 사용한다, 예를들어 소스 코드에만 존재하는 어너테이션 프로세서나 특정 api의 컴파일 타임 구현에 사용된다.
    • testimplementation : 테스트 코드를 컴파일 하거나 실행시킬 때 항시 사용한다.
    • testCompileOnly : 테스트 코드 컴파일 시에만 해당 종속성을 사용한다.
    • testRuntimeOnly :  테스트를 실행할 때 필요한 종속성을 지정한다.

 

테스트 수행시 Junit5를 사용한다.