지금까지 빌드 툴을 사용하면서도 그 내용은 크게 신경 쓰지 않았다.
그래서 빌드란 무엇이고 각각의 특징을 정리하고자 한다.
그럼 빌드란? 무엇인가!
그레이들이란 오픈소스 빌드 자동화 도구로 주로 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' 블록은 프로젝트에 필요한 그레들 플러그인을 정의하고 추가한다. 플러그인은 빌드 프로세스에 추가적인 기능이나 작업을 제공
- 버전관리 : 각 플러그인에 대한 특정 버전을 지정할 수 있다. 이를 통해 빌드가 일관되고 예측 가능한 방식으로 수행될 수 있다.
- 자동 종속성 관리 : 일부 플러그인은 추가적인 종속성을 필요로 하며, 플러그인 블록을 사용하여 이러한 종속성이 자동으로 관리된다.
- 프로젝트 설정 시간 단축 : 플러그인 블록은 초기화 단계에서 처리되어 빌드 설정 시간을 줄여준다.
- 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 작업을 지원한다.
dependencies 블록은 프로젝트 빌드에 종속성을 정의하고 관리하는데 사용 된다.
주요 특징은 아래와 같다.
- 종속성 정의 : 프로젝트가 컴파일, 테스트, 런타임 등의 단계에서 필요로 하는 라이브러리나 모듈을 명시 한다. 예를들어, 자바 프로젝트에서 'dependencies' 블록을 사용하여 jar 파일이나 다른 프로젝트 종속성을 추가할 수 있다.
- 버전관리 : 종속성의 특정 버전을 지정할 수 있어 프로젝트가 일관된 라이브러리 버전을 사용하도록 보장한다. 버전 관리는 빌드의 아전성과 예측 가능성이 높여준다.
- 원격및 로컬 종속성 : 그레들은 메이븐 같은 원격 저장소 뿐만 아니라, 로컬 파일 시스템에서도 종속성을 가져올 수 있다.
- 동적 버전과 스냅샷 : 동적 버전 지정을 통해 최신 버전의 종속성을 자동으로 사용할 수 있습니다. 또한, 개발 중인 스냅샷 버전의 종속성을 사용할 수도 있다.
- 종속성 유형
- implementation : 이 유형의 종속성은 프로젝트의 컴파일과 런타임(실행)에 모두 사용하며, 프로젝트에서 해당 의존 라이브러리 코드를 직접 참조하여 사용하는 경우에 사용 됩니다.
- runtimeOnly : 코드를 실행할 때에만 의존성을 사용하며, 컴파일시에는 필요하지 않지만 어플리케이션이 실행될 때 필요한 라이브러리나 모듈을 지정하는데 사용된다.
- compileOnly : 컴파일 시에만 사용되고, 프로젝트 런타임이나 테스트시에는 필요하지 않는 경우에 사용한다, 예를들어 소스 코드에만 존재하는 어너테이션 프로세서나 특정 api의 컴파일 타임 구현에 사용된다.
- testimplementation : 테스트 코드를 컴파일 하거나 실행시킬 때 항시 사용한다.
- testCompileOnly : 테스트 코드 컴파일 시에만 해당 종속성을 사용한다.
- testRuntimeOnly : 테스트를 실행할 때 필요한 종속성을 지정한다.