Gradle
Gradle이란
- 그루비(Grrovy) 문법을 기반으로 한 자바 빌드 도구
- 빌드 도구 : 소프트웨어 개발에 있어서 소스 코드를 실행 가능한 어플리케이션으로 만들어주는 도구
- Ant, Maven 등의 이전 세대의 단점을 보완하고 장점을 취합하여 만든 오픈소스
- 빌드 자동화 및 다국어 개발 지원에 중점을 둠
- 자동화 시키는 작업들
- Compile - Java 파일의 소스 코드를 컴퓨터가 이해할 수 있도록 바이트 코드로 변환
- Test - 유닛 테스트, UI 테스트
- Packaging - 스프링 코드를 패키징 해 .jar 파일이나 .war 파일로 생성
- Deploy & Run - 서버 실행
- 어떤 플랫폼에서든 소프트웨어를 구축, 테스트, 게시 및 배포하는 경우 코드 컴파일 및 패키징부터 웹 사이트 게시까지 전체 개발 수명주기를 지원할 수 있는 유연한 모델을 제공
- Java, Scala, Android, Kotlin, C/C++, Groovy를 포함한 여러 언어 및 플랫폼에서 빌드 자동화를 지원하도록 설계됨
- Eclipse, IntelliJ, Jenkins를 포함한 개발 도구 및 지속적인 통합 서버와 긴밀하게 통합됨
- Gradle 깃허브 : https://github.com/gradle/gradle?tab=readme-ov-file
- Gradle 홈페이지 : https://gradle.org/
Ant란
- XML 기반
- 자바 프로젝트 빌드 도구로 가장 널리 사용되던 빌드 도구
- Eclipse에 기본적으로 탑재
- 빌드 스크립트를 작성
- 자유롭게 빌드 단위를 지정
- 간단하고 사용하기 쉬움
- 유연하지만 프로젝트가 방대해지는 경우 스크립트 관리나 빌드 과정이 복잡해짐
- 생명주기를 갖지 않아 각각의 결과물에 대한 의존관계 등을 정의해야 함
- 최근에 나온 빌드 도구들과 달리 자동으로 라이브러리를 업데이트 하는 기능이 없어 현재는 주로 레거시 시스템에서만 사용
Maven이란
- XML 기반으로 작성
- 생명주기와 프로젝트 객체 모델(POM, Project Object Model)이란 개념이 도입
- Ant의 장황한 빌드 스크립트를 개선
- pom.xml에 필요한 라이브러리를 선언하면 자동으로 해당 프로젝트로 불러와 편리 (pom.xml 파일로 의존성을 관리)
- 상대적으로 학습 장벽이 높음
- 라이브러리가 서로 의존하는 경우 복잡해질 수 있음
- 라이프 사이클 개념이 도입되어 빌드 순서 등을 정의 할 수 있음
Gradle 구성
- 모든 Gradle script는 하나 이상의 project로 구성되며 모든 프로젝트는 하나 이상의 task로 구성됨
- project : 소스를 jar로 모으거나 자바 프로젝트를 컴파일하거나 테스트를 실행하고 어플리케이션을 배포하는 등의 업무로 구성
- task : 작업의 최소 단위, task 간 의존관계 설정과 함께 흐름에 따른 구성이 가능하며 동적인 테스크의 생성도 가능함
기본 생성 시 구조
├── build.gradle
├── .gradle
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
세부 구성 의미
이름 | 뜻 |
---|---|
.gradle | gradle 버전 별 엔진 및 설정 파일 |
.idea | 에디터 관련 파일들 |
gradle/wrapper | 사용자가 Gradle을 설치하지 않았어도 Gradle tasks를 실행할 수 있도록 도와줌 (프로젝트 생성자와 사용자가 동일한 버전의 Gradle 사용가능) |
gradle-wrapper.jar | Wrapper 파일로 실행 스크립트가 동작하면 Wrapper에 맞는 환경을 로컬 캐시가 다운로드 받은 뒤 실제 명령에 해당하는 task 실행 |
gradle-wrapper.properties | Gradle Wrapper 설정 파일 |
gradlew | Unix용 실행 스크립트, gradle 명령 파일 |
gradlew.bat | Windows용 실행 스크립트, gradle 명령 파일 |
build.gradle | 의존성이나 플러그인 설정 등 프로젝트 빌드에 대한 모든 기능 정의 |
settings.gradle | 빌드할 프로젝트 정보 설정 (트리 형태로 멀티 프로젝트 구성) |
/src | 자바 소스 파일 |
Gradle 특징
1. 간결한 스크립트
- Ant와 Maven은 XML 문법으로 스크립트를 작성
- XML은 태그 문법 때문에 복잡한 빌드 스크립트를 작성하기에는 까다로우며 가독성또한 떨어짐
- Gradle은 Groovy 문법으로 간결한 스크립트를 작성 가능
- 비교
- pom.xml
<project ... 생략 ...> <modelVersion>4.0.0</modelVersion> <groupId>그룹 ID</groupId> <artifactId>아티팩트 ID</artifactId> <version>버전</version> <packaging>jar</packaging> <name>이름</name> <properties> ... </properties> <dependencies> ... </dependencies> </project>
- groovy
plugins { id 'java' id 'org.springframework.boot' version '2.7.11' id 'io.spring.dependency-management' version '1.0.15.RELEASE' } group = 'hello' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { ... } tasks.named('test') { useJUnitPlatform() }
2. 빌드 속도
- 프로젝트 규모가 커지게 되면 빌드 속도 차이가 개발 생산성에 큰 영향을 미치게 됨
- 캐싱(caching)을 하기 때문에 Ant나 Maven같은 이전 빌드 도구보다 빌드 속도가 빠름
- 점진적 빌드를 통해 작업의 입출력을 추적하고, 변경된 파일만 처리하여 작업
- 이미 빌드된 파일을 모두 빌드하는 것이 아니라 변경된 내용만 빌드하는 것
3. 멀티 프로젝트 빌드
- 대규모 자바 프로젝트는 대부분 하나의 프로젝트 안에 여러 모듈이 동시에 개발되고 각 모듈이 공통으로 사용하는 모듈도 만들어지게 됨
- 여러 모듈이 동시에 개발되는 경우 각각 따로 빌드 작업을 하면 번거로울 뿐 아니라 실수가 발생할 수 도 있음
- Gradle은 멀티 프로젝트 빌드 기능을 제공하기 때문에 이런 번거로움과 실수를 줄일 수 있음
4. 데몬(Deamon) 프로세스 지원
- 데몬 프로세스 : 서비스 요청에 응답하기 위해서 메모리 상에 빌드 결과물을 보관하는 오래 지속되는 프로세스
- gradle의 데몬 프로세스는 메모리 상에 빌드 결과물을 보관
- 한 번 빌드된 프로젝트는 다음 빌드 시 시간이 단축
- 명령어 :
gradle build --deamon gradme build --no-deamon
참고 자료
- https://madplay.github.io/post/what-is-gradle
- https://github.com/gradle/gradle?tab=readme-ov-file
- https://hstory0208.tistory.com/entry/Gradle%EC%9D%B4%EB%9E%80-%EC%99%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%EC%A7%80%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84-%EB%B3%B4%EC%9E%90
- https://willbesoon.tistory.com/93
- https://hello-judy-world.tistory.com/214
- https://kotlinworld.com/311
- https://velog.io/@tjseocld/Gradle-%EC%9D%B4%EB%9E%80
- https://codecrafting.tistory.com/1
'공부 > 자바' 카테고리의 다른 글
[자바/Java] Java 8의 특징 (0) | 2024.08.27 |
---|---|
[자바/Java] Call by Value vs Call by Reference (0) | 2024.04.05 |