티스토리 뷰
Gradle은 JAVA 개발에 엄청난 도움을 주는 강력한 Build Tool이지만 생소한 groovy 문법과 설정 파일, 사용방법 때문에 오히려 신입 개발자 들을 헷갈리게 하기도 합니다. 다행인 점은 gradle 을 사용하기 위한 학습 곡선이 높지 않고 대부분의 팀에서 gradle을 어렵게 사용하지 않는다는 점입니다. 이 포스트에서는 웹 개발에 필요한 최소한의 gradle 지식을 알아 보도록 하겠습니다.
Build Tool
Gradle 은 일종의 build tool(빌드 도구) 입니다. 여기서 말하는 빌드라는 개념은 단순히 프로그램을 컴파일하여 애플리케이션을 생성하는 작업만을 의미하지는 않습니다. 개발한 소프트웨어가 제품으로 만들어지는 일련의 과정, 즉, 컴파일, 테스트, 배포, 문서화 등의 작업을 포함하는 절차를 의미합니다. 이 때, 빌드의 모든 과정을 자동으로 처리할 수 있도록 도와주는 것을 빌드 도구(build tool) 이라고 합니다.
빌드 도구로 불리는 프로그램은 많습니다. 자바에서 이용하는 주요 빌드 도구의 종류도 몇가지나 됩니다. 그 중에서도 최근 대세라고 할 수 있는 것이 Gradle 입니다.
Groovy, DSL(Domain-Specific Languages, 도메인 특화 언어)
Gradle은 groovy라고 하는 JVM기반의 동적 타이핑 언어를 사용해서 기술됩니다. groovy는 대부분의 자바 개발자들이 쉽게 배워서 사용할 수 있는 장점이 있습니다. 그런데 gradle은 groovy문법 그 자체를 그대로 사용하지는 않고 '그루비 기반의 DSL(Domain-Specific Languages)'을 사용합니다. DSL은 도메인 고유 언어라고 불리는데 특정한 용도에 한정된 언어를 가리킵니다. 기반이 언어가 있지만 그 언어 그 자체는 아니고 특정한 용도에 맞게 해당 언어를 기반으로 각색한 것입니다. 그레이들에 사용되는 언어는 그루비를 기반으로 작성된 gradle dsl입니다.
Gradle 에 대해서 어렵게 생각할 필요는 전혀 없습니다. 애초에 개발을 더 쉽게 할 수 있도록 도움을 주기 위해 탄생한 빌드 도구인 만큼 학습에 많은 시간을 필요로 하지 않기 때문입니다. 실제 웹 프로젝트에서 사용하는 기술을 바탕으로 gradle을 조금 더 알아 보도록 하겠습니다.
build.gradle
build.gradle 은 gradle에서 빌드 작업에 필요한 기본 설정, 동작 등을 정의하는 파일입니다. 아래는 IDEA(intellij) 에서 Spring-boot 프로젝트를 생성하고 몇 가지 dependency를 추가했을 때 기본적으로 생성해 주는 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'
}
dependenc를 추가하는 방법에는 위와같이 두 가지가 존재하는데, 후자는 축약형인데 의미의 차이는 없으므로, 자신이 선호하는 방법으로 기술하면 됩니다. 어느쪽을 이용하더라도 전혀 문제가 되지 않습니다.
ext
위 예시에서는 등장하지 않지만(아래 멀티모듈인 경우 사용 예시를 참고해주세요) ext 블록이 사용된 경우가 있습니다. 이 블록은 gradle 의 모든 task 에서 사용할 수 있는 일조의 전역 변수를 선언하는 블록이라고 생각하면 됩니다.
buildscript
역시 위 예시에서는 등장하지 않지만(아래 멀티모듈인 경우 사용 예시를 참고해주세요) buildscript 블록을 사용할 때가 있습니다. buildscript는 빌드하는 동안 필요한 처리를 모아놓는 곳입니다, 이 안에서 dependencies와 repositories가 포함 할 수 있습니다.
settings.gradle
또다른 그레이들 파일 중에 settings.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, subprojcets, project
멀티 모듈인 경우 이처럼 새로운 블록이 등장합니다. 상당히 직관적이지만 굳이 설명 하자면 allprojects는 전체 프로젝트에, subprojects는 하위 프로젝트에, 그리고 프로젝트 이름을 사용한 project 는 해당하는 프로젝트에만 동작하는 설정입니다.
task
마지막으로 사용자가 임의로 task를 작성해서 사용할 수 있습니다. task는 다양한 기능을 수행할 수 있고 다양한 문법을 가지고 있지만 아마 신입 개발자가 실무에서 작성하는 경우는 극히 제한적일 것입니다. 깊이 있는 내용을 담기에는 포스팅의 성격을 벗어나기 때문에 간단히 언급하고 넘어가겠습니다.
task exampleTest {
println 'Hello World!'
}
task 는 위 예시처럼 선언할 수 있으며 커맨들 라인에서 task [task 이름]으로 사용할 수 있습니다. 예시를 실행하면 다음과 같은 결과를 볼 수 있습니다.
이상으로 웹 개발에 필요한 최소한의 gradle 지식을 살펴 보았습니다. 부족한 부분이 많을 수도 있지만 신입 개발자가 팀에 합류한 어려움을 어느정도는 해소해 줄 수 있는 수준은 된다고 생각합니다. 갑사합니다.
참고서적
'framework > Spring' 카테고리의 다른 글
jpa 엔티티 클래스에 @EqualsAndHashCode 을 사용하는 경우 (0) | 2023.03.16 |
---|---|
Spring + Vault (0) | 2020.05.06 |
REST / RESTful API (0) | 2020.01.15 |
SPRING SECURITY + JWT 회원가입, 로그인 기능 구현 (16) | 2020.01.10 |
Thymeleaf 주석 (0) | 2019.05.28 |
- Total
- Today
- Yesterday
- 몰라서망신
- Spring in Action
- 코딩의 기술
- 전략패턴
- html
- restful api
- 클린코드
- was
- markov chain
- DP
- 유지보수
- 경고
- 로그
- 야근
- RESTful
- 동적계획법
- GROUP BY
- 마르코프
- Markov
- REST API
- 자바스크립트개론
- 디자인패턴
- java
- Count
- 크롬
- CONVENTIONS
- 문장 생성기
- Warning
- 자바스크립트 개론
- 마르코프 연쇄
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |