Gradle 이란?
Gradle은 Maven을 대체하는 빌드 도구입니다.
Grooby 기반의 DSL(Domain Specific Language)를 사용합니다.
스프링 부트, 안드로이드 스튜디오에서는 Gradle을 사용되고 있습니다
Ant vs Maven vs Gradle
[1] Ant
Ant의 가장 큰 장점은 개발자가 자유롭게 빌드 단위(target)을 지정하고 빌드 단위간의 의존관계를 자유롭게 설정할 수 있다는 것입니다. 하지만 자유도가 높다는 것은 잘 활용할 경우 좋은 도구가 될 수 있지만, 잘 활용하지 못하면 그렇지 않을 수도 있습니다.
[2] Maven
Maven의 가장 큰 장점은 Convention Over Configuration 전략에 따라 프로젝트 빌드 과정에 대한 많은 부분이 이미 관례로 정해져 있다는 것입니다. 따라서 Maven 기반 프로젝트를 경험한 개발자는 Maven을 기반으로 하고 있는 새로운 프로젝트에서도 쉽게 적용 할 수 있다는 것입니다. 하지만 관례가 항상 좋은 것은 아니며, 특수한 상황이 발생하는 경우에는 맞지 않는 경우도 종종 발생합니다.
[3] Gradle
Gradle은 진화된 빌드툴로 빌드,테스트, 배포, 개발등을 자동화 할수있습니다. 또한 Ant의 유연성과 효과적인 빌드 툴인 Maven의 편리성을 조합하여 많은 오픈소스 프로젝트의 빌드 시스템으로 채택되고 있습니다. 그리고 Ant와 Maven빌드 툴 모두 가지고 있었던 가장 큰 단점인 XML에 대한 이슈도 Groovy언어를 사용해 해결하고 있습니다.
Gradle Wrapper란?
Gradle Wrapper는 Gradle을 각 개발자나 CI 서버에 깔지 않고, 프로젝트에 함께 포함시켜 배포할 수 있는 방법을 제공해준다.
이미 존재하는 프로젝트를 새로운 환경에 설치할때 별도의 설치나 설정과정없이 곧 바로 빌드할 수 있게 하기 위함(Java나 Gradle도 설치할 필요가 없음. 또한 로컬에 설치된 Gradle 또는 Java의 버전도 신경쓸 필요가 없음. 따라서 항상 Wrapper를 사용할 것을 권장.)
Gradle Build시 구성요소 설명 (Gradle Wrapper를 사용하는 경우)
1. gradlew 파일
- 유닉스용 실행 스크립트
- gradle 명령파일
2. gradle.bat 파일
- 원도우용 실행 배치 스크립트
- gradle 명령파일
3. gradle/wrapper/gradle-wrapper.jar 파일
- Wrapper 파일.
- gradlew나 gradlew.bat 파일이 프로젝트 내에 설치하는 이 파일을 사용하여 gradle task를 실행하기 때문에 로컬 환경의 영향을 받지 않음.(실제로는 Wrapper 버전에 맞는 구성들을 로컬 캐시에 다운로드 받음)
4. gradle/wrapper/gradle-wrapper.properties 파일
- Gradle Wrapper 설정 파일.
- 이 파일의 wrapper 버전 등을 변경하면 task 실행시, 자동으로 새로운 Wrapper 파일을 로컬 캐시에 다운로드 받음.
5. settings.gradle 파일
- 프로젝트의 구성 정보를 기록하는 파일.
- 어떤 하위프로젝트들이 어떤 관계로 구성되어 있는지를 기술.
- Gradle은 이 파일에 기술된대로 프로젝트를 구성함
6. gradle.build 파일
Spring Framework에서의 pom.xml에 해당하는 의존성 정리파일이 gradle.build 이다.
gradle.build의 각 블록에 대한 설명은 다음과 같다.
- buildscript :
- 소스코드를 빌드하고 실행하는데 필요한 글로벌 레벨의 depencies & repositories 설정
- build.gradle 파일 그 자체를 위한 것. Package Manager / Docker file / spirng-boot-gradle-plugin과 같이 빌드에 필요한 의존성 추가
- 따라서 소스코드 컴파일과 같은 빌드 작업을 시작하기 전에, 빌드 시스템 준비 단계에서 제일 먼저 실행되는 블록
- 결국 빌드 자체를 위한 의존성 & 레포를 설정하는 곳
- pugins
미리 구성해 놓은 task들의 그룹이며, 특정 빌드과정에 필요한 기본정보를 포함하고, 필요에 따라 정보를 수정하여 목적에 맞게 사용할 수 있다.
- repositories
이 저장소는 "어떤 저장소를 사용하는지"를 빌드 파일에 작성하여 설정할 수 있다. Gradle은 Maven Repository, JCenter Repository, Ivy Directory 등 다양한 저장소를 지원한다.
- dependencies
저장소에서 필요한 라이브러리를 사용하기위해 의존성 관리가 필요하다.
주로 다음의 문법으로 각 라이브러리가 참조되는 시기를 결정할 수 있다.
- implementation : 프로젝트 컴파일 과정에서 필요한 라이브러리
- providedCompile : compile시에는 필요하지만, 배포시에는 제외될 dependency를 설정한다.(war plugin이 결정된 경우에만 사용 가능하다.)
- providedRuntime : runtime시에만 필요하다. 실행환경에서 제공되는 dependency를 설정한다.(war plugin이 결정된 경우에만 사용 가능하다.)
- testImplementation : test에 필요한 dependency 관리
- test
Gradle은 test를 메인 빌드 프로세스에서 격리시켜 테스트를 진행한다. 테스트 범위(Filtering)도 결정할 수 있고 Reporting도 가능하다.
gradle.build 작성을 위한 Groovy문법의 이해
변수선언과 값 할당
동적타입 바인딩
def a=20 // 값을 할당할때 a 변수의 타입이 결정됨
a="문자열" // 다른 값을 할당하면 변수의 타입이 바뀜
정적타입 바인딩
int a=20 // 변수 a는 int로 데이터형이 고정됨
a="문자열" // 문자열 값을 할당하면 오류 발생
문자열과 자동 형 변환
String a="문자열" // 변수 a는 String으로 데이터형이 고정됨
a=20 // 정수값 20이 문자열 "20"으로 자동변환된 후 변수 a에 할당됨
자바 변수 선언
java.util.Data a = new java.util.Data() //자바 문법 사용가능
Date b=new Date() // 기본으로 java.util 패키지 임포트됨
리스트와 맵 데이터 다루기
리스트 데이터 할당과 사용
scoreList=[90, 80, 100, 87] //ArrayList 객체가 생성됨
println scoreList[2] //배열처럼 사용할 수 있음
println scoreList.get(2) //원래대로 ArrayList의 get()호출 가능
println scoreList.size() //결과는 4
nameList=["홍길동","임꺽정","장보고"]
emptyList=[] //빈 리스트 생성
맵 데이터 할당과 사용
scoreMap=["국어":100,"영어":90,"수학":100,"사회":89]
println scoreMap["수학"] //변수.[키] 형태로 값 추출
println scoreMap.수학 //변수.키 형태로 값 추출
println scoreMap.getClass() //java.util.LinkedHashMap 출력
scoreMap.수학 = 93 //맵의 값 변경
println scoreMap.수학 //결과는 93
emptyMap = [:] //빈 맵 생성
분기문
if-else 문
if(true 또는 false 조건){
...
}else if(~~){
...
}else{
...
}
조건연산자
age=17
title=(age<19)? "청소년":"성인"
switch 문
x="aaa"
result=""
switch(x){
case "aaa" : result = "aaa"
case "123" : result +="123"
case [1,20,3.14, true] : result="숫자,문자열,참거짓 값"; break
case 100..200 : result = "100~200 값"; break
case Number: result="기타 숫자 값"; break
default: result="기타"
}
println result
반복문
while 문
while (조건){...}
for 문
for (int i=0; i<5; i++){}
for (i in 0..9){}
for (i in [100, 90, 95, 80]){}
for (i in 배열) {}
for (entry in 맵) {}
for (c in 문자열) {}
목록.each({...})
맵.each({key, value -> ...})
목록.eachWithIndex({obj,i -> ...})
맵.eachWithIndex({obj,i -> ...})
매서드와 클로저
매서드 정의
def plus(a,b){
a + b
}
int minus(int a, int b){
return a-b
}
클로저 정의
plus={a,b -> a+b}
plus={int a, int b -> return a+b}
println plus(10, 20)
클로저 Free 변수
pi=3.14159 //pi는 자유변수
getCircleArea={radius->pi*radius*radius}
클로저 it 파라미터
plus={
it[0]+it[1]
}
println plus([10, 20])
클로저 리턴 값
plus={a,b->
a+b
}
//return 을 사용해도 됨
//마지막 문장의 실행값이 없으면 null
클래스
기본으로 Import하는 패키지
java.lang, java.io, java.math, java.net, java.util, groovy.lang, groovy.util
클래스 정의와 사용
class Test{
void hello(){
println "안녕하세요"
}
}
t = new Test()
t.hello()
프로퍼티 선언과 사용
Class Student {
Integer no
String name
Date regDate
}
s=new Student(no:1,name:"홍길동",regDate:new Date())
println s.no+","+s.name+","+s.regDate
'Programming > Java' 카테고리의 다른 글
SpringBoot Maven 컴파일러에서 Gradle로 변경 (0) | 2022.05.17 |
---|---|
SpringBoot+Gradle 설정파일 정리 (0) | 2022.05.17 |
(JAVA) SpringBatch 사용을 위한 예제 (0) | 2022.02.05 |
(JAVA, Gitlab) Git Submodule을 사용하여 멀티프로젝트를 진행해보자 (0) | 2022.01.21 |
(SpringFrameWork) Dependency 오류 시 봐야할것. dependencies could not be resolved (0) | 2022.01.20 |