제목: "[Gradle, JAVA, SPRING] 웹개발에 필요한 최소한의 Gradle"
작성자: tistory.com(webfirewood)
작성자 수정일: 2020년7월18일
링크: https://webfirewood.tistory.com/129
작성일: 2022년7월9일
build.gradle
파일에서 다양한 설정들을 하는 것을 볼 수 있다. 그 때마다 대충 gradle
이 어떤 역할을 하는지 인지만 하고 넘어가는 경우가 많았다. 문법도 잘모르겠고,별로 달갑지 않게 생겼다Gradle은 일종의 build tool(빌드 도구)이다. 여기서 말하는 빌드라는 개념은 단순히 프로그램을 컴파일하여 어플리케이션을 생성하는 작업만을 의미하지는 않는다.
빌드 도구로 불리는 프로그램은 많다. 자바에서 이용하는 주요 빌드 도구의 종류도 몇가지가 된다. 그 중에서도 최근 대세라고 할 수 있는 것이 Gradle이다.
Gradle에 대해서 어렵게 생각할 필요는 전혀 없다. 애초에 개발을 더 쉽게 할 수 있도록 도움을 주기 위해 탄생한 빌드도구 인 만큼 학습에 많은 시간을 필요로 하지 않는다.
build.gradle
은 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()
}
저장소가 뭐시오?
저장소는 가종 라이브러리 등이 등록된 일종의 소프트웨어 보관장소라고 할 수 있다. 저장소에는 각종 프로그램이 등록되어 있어 그래들은 저장소로부터 필요에 따라 프로그래믈 다운로드하여 이용할 수 있다. 또 다른 빌드 도구 중 하나인 메이븐은 메이븐 중앙 저장소를 제공하여 그래들에서도 이 메이븐 중앙 저장소에 접속해서 필요한 프로그램을 다운로드 할 수 있다. 이 중앙 저장소는 현재 아파치 재단에서 운영중이다.
만약 중앙저장소에 공개되지 않았거나 공개하기 힘든 라이브러리가 있을 수도 있다. 예를 들어 사내에서만 사용하는 라이브러리라면 중앙 저장소에 공개하기는 힘들것이다. 이런 경우는 로컬 저장소를 이용하면 된다.
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 {
appVersion = '1.0.0-SNAPSHOT'
}
buildscript
블록을 사용할 때가 있다.buildscript
는 빌드하는 동안 필요한 처리를 모아놓는 곳이다. 이 안에서 dependencies
와 repositories
를 포함할 수 있다setting.gradle
가 있다. 여러가지로 사용할 수 있지만 가장 많이 사용하는 것이 역시 멀티 모듈을 사용할 때 설정이다.rootProject.name = 'example'
include 'sub-example'
위 예시에서 rootProject.name
을 통해 루트프로젝트를 설정하고 include
를 통해 하위 모듈을 설정하였다.
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 {
...
}
}
task
는 다양한 기능을 수행할 수 있고 다양한 문법을 가지고 있다. 아마 신입 개발자가 실무에서 작성하는 경우는 극히 제한적일 것이다.task exampleTest {
println 'Hello World!'
}
task[task 이름]
으로 사용할 수 있다. 관련 서적