-
[PROGRAMMING] Gradleprogramming 2020. 7. 25. 18:14
Gradle
groovy 언어를 사용한 빌드툴. ( 빌드, 테스트, 배포 자동화 )
- Ant처럼 유연한 범용 빌드 도구
- 멀티 프로젝트에 사용하기 좋음
- Apache Ivy에 기반한 강력한 의존성 관리
- 원격 저장소나 pom, ivy 파일없이 연결되는 의존성 관리 지원
구성
모든 빌드는 하나 이상의 project로 구성. 또한 project는 하나 이상의 task로 구성됨 ( task는 빌드를 수행할 때 하나의 작업 단위를 의미 )
- Projects : Tasks의 집합체. build.gradle을 일컫기도 하며 단일 혹은 멀티 프로젝트로 구성할 수 있음
- Tasks : 프로젝트에는 하나 이상의 태스크가 필요함. 각각의 태스크는 빌드를 수행하는 작업의 일부라고 볼 수 잇으며 상호 의존한다. 하나의 태스크는 특정 순서대로 실행되는 Action들을 포함
- Plugin : 태스크와 Convention (관례)의 집합으로 프로젝트에 적용될 수 있음. 예를 들어 프로젝트에 java 플러그인을 적용하면 class 컴파일, jar 파일만들기 혹은 빌드 결과물을 repository에 배포하는 작업 등을 할 수 있음.
build.gradle 파일
1. repositories
repositories{ //maven 중앙 저장소 mavenCentral() //JCenter 저장소 jcenter() }
- gradle이 필요한 라이브러리를 자동으로 다운로드 하기 위해 사용하는 저장소
- jcenter()와 mavenCentral()이 주로 사용됨.
2. Dependencies
- 저장소에 필요한 라이브러리를 사용하기 위한 문장
dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.projectlombok:lombok' compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' implementation 'mysql:mysql-connector-java' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' }
compile 프로젝트를 컴파일할 때 필요한 의존성 라이브러리 추가 runtime 프로젝트를 실행할 때 필요한 의존성 라이브러리 추가(기본적으로 컴파일 타임을 포함한다) testCompile 테스트 소스 프로젝트에서 컴파일 시 필요한 의존성 추가(기본적으로 컴파일 된 클래스와 컴파일 의존성을 포함한다) testRuntime 테스트가 실행될 때 필요한 의존성을 추가한다(기본적으로 컴파일, 런타임, 테스트 컴파일의 의존성을 포함한다 - 라이브러리 지정법
testImplementation 'org.mockito:mockito-junit-jupiter:2.17.2' //그룹 : org.mockito //이름 : mockito-junit-jupiter //버전 : 2.17.2
1) 그룹 : 해당 라이브러리가 속해있는 기업 및 단체
2) 이름 : 라이브러리의 이름
3) 버전 : 라이브러리의 버전
생명주기
DAG(Directed Acyclic Graph, 단방향 비순환 그래프)를 만들어서 실행 순서를 결정
태스크 실행은 depensOn과 더불어, Gradle 생명주기도 고려 됨- 초기화 단계 : settings.gradle를 분석하고, 각 모듈의 태스크를 조사하여 어떤 모듈이 우선 빌드되어야 하는지를 결정. 이 후, project build.gradle에 해당하는 proejct 인스턴스를 생성
- 설정 단계 : project 인스턴스의 세부 값을 설정. 하위 프로젝트에 공통 적용되는 내용은 allprojects()를 통해 전달. 사용자 정의 태스크에서 doFirst()가 이때 실행
- 실행 단계 : DAG에 결정된 순서에 따라 순차적 실행
마무리
Gradle의 한 줄 정의
Groovy 언어를 이용한 빌드 자동화 시스템
Gradle을 사용해야 하는 경우 및 이유 ( 장점 )
1. 상속 구조를 이용한 멀티 모듈 구현이 가능 (멀티 프로젝트에 용이)
2. 지금까지의 빌드 툴이 가진 장점들을 모두 모아서 만듦
3. JVM언어인 Groovy언어를 사용하여 Maven 의 xml 관련 이슈를 없앰
4. 빌드 스크립트를 간략히 해주는 DSL을 제공
5. Gradle wrapper를 통해 Gradle이 설치되지 않은 환경에서도 빌드 가능
Gradle vs. Maven
1. Maven의 xml에 비해 Gradle의 groovy가 복잡한 내용을 작성할 경우에 가독성이 높고 사용하기 용이함 ( 확장성이 용이 )
2. Gradle이 캐시를 사용하여 Maven보다 좀 더 빠르다.
규모가 커질수록 gradle을 사용하는 것이 체감상 유리
gradle이 멀티모듈에서 강한 이유
allprojects { repositories { jcenter() } } subprojects { apply(plugin = "org.springframework.boot") apply(plugin = "io.spring.dependency-management") apply(plugin = "org.jetbrains.kotlin.plugin.spring") apply(plugin = "com.gorylenko.gradle-git-properties") group = "com.test.boot" version = "1.0.0" dependencies { ... } tasks { ... } }
Maven과 달리 하위 프로젝트에 대한 정의를 최상위 프로젝트에서 allprojects, subprojects 속성을 통해서 각 프로젝트의 공통 속성과 작동을 정의할 수 있다.
하위 프로젝트 빌드 구성을 살펴보기 위해 하위 프로젝트의 빌드 스크립트를 열어볼 필요가 없음.
DSL(Domain Specific Language)
특정 영역을 타겟하고 있는 언어
예를 들어 SQL
DB의 데이터를 참조하기 위해 날리는 query는 말 그대로 "DB에 데이터를 참조하기 위한 목적"으로만 사용되며 SQL로 웹 애플리케이션 서버를 만드는 것은 절대 불가능 하다.
반면 JAVA는 SQL을 만들어 낼 수도 있고 (사실상 SQL은 특정한 문법을 가진 문자열이기 때문이다) 웹 애플리케이션 서버를 만들 수도 있고, 그 외 원하는 모든 것을 만들어 낼 수 있다. 단지 다른 분야에선 다른 언어가 더 좋을 뿐이지 가능은 할 것이다.
이렇게 SQL처럼 어떤 목적이 있고 그 목적만 달성할 수 있는 언어를 DSL이라고 한다.
참고
https://woowabros.github.io/tools/2019/04/30/gradle-kotlin-dsl.html
https://lannstark.tistory.com/13
'programming' 카테고리의 다른 글
[PROGRAMMING] RESTful API설계 (0) 2020.07.26 [PROGRAMMING] 라이브러리, 프레임워크 용어 간단 정리 (0) 2020.07.26 [PROGRAMMING] Maven (0) 2020.07.25 [PROGRAMMING] 빌드와 빌드 도구 (0) 2020.07.25 [PROGRAMMING] 아파치와 톰캣, 드디어 이해했다. (0) 2019.09.30