스프링으로 개발을 하면서 항상 사용했던 빌드 툴은 gradle 이였다.
Maven보다 간결하고 가독성이 좋다고 생각했기 때문인데, 이번 미션을 하면서 자주 사용해왔던 gradle의 기본적인 기능에 대해 학습해보고자 글을 작성하게 되었다.
Gradle이란?
소프트웨어의 빌드, 테스트, 배포를 자동화하는 도구로 주로 JVM 프로젝트를 빌드할 때 사용된다.
Gradle 주요 개념
- Build Scripts
- Gradle이 프로젝트를 빌드하는 방법을 정의하는 스크립트를 말한다.
- Dependency Management
- 프로젝트에 필요한 외부 리소스를 자동으로 관리해준다.
- Tasks
- 코드 컴파일, 테스트 실행 등의 기본 작업 단위를 말한다.
- Plugins
- Gradle의 기능을 확장하는 플러그인, 선택적으로 기능을 추가할 수 있다.
Java Build Task Graph
gradle로 java를 빌드할 때 실행되는 작업들이다.
상위 Task 실행 시 의존하는 하위 Task들이 자동 실행된다.
Gradle 주요 Task
주요 태스크는 아래와 같다.
# 컴파일, 테스트, JAR 패키징 등을 수행
./gradlew build
# build 디렉토리를 삭제하여 이전 빌드 결과물을 제거
./gradlew clean
# 단위 테스트 실행
./gradlew test
# Spring Boot 애플리케이션을 실행 가능한 JAR 파일로 패키징
./gradlew bootJar
jar vs bootJar vs build
jar
- 컴파일된 클래스와 리소스만 포함하는 기본 JAR 파일을 생성
- 의존성 라이브러리는 포함하지 않음
- 주로 라이브러리 프로젝트나 다른 프로젝트의 의존성으로 사용될 JAR를 만들 때 사용
- java -jar 명령으로 직접 실행 불가능
bootJar
- Spring Boot 전용 태스크
- 실행 가능한 "fat JAR"를 생성
- 컴파일된 클래스와 리소스
- 모든 의존성 라이브러리
- 내장 서버(Spring Web 사용 시)
- java -jar 명령으로 직접 실행 가능
- 기본적으로 파일명에 'boot' 포함
build
- 검증, 컴파일, 테스트, 패키징 등 모든 빌드 과정을 실행하는 수명주기 태스크
- jar, bootJar 태스크 실행
- 테스트 실행
- 문서 생성 등 기타 설정된 빌드 단계 수행
Gradle 프로젝트의 구조
gradle 프로젝트는 대게 아래와 같은 구조로 이루어져있는데, 각 파일들과 디렉토리가 어떤 역할을 하는지 살펴봐보자.
project
├── gradle
│ ├── libs.versions.toml
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle(.kts)
├── subproject-a
│ ├── build.gradle(.kts)
│ └── src
└── subproject-b
├── build.gradle(.kts)
└── src
- /gradle (gradle 디렉토리)
- 래퍼 파일 등을 저장하는 Gradle 디렉토리로, 관련 설정 파일들을 포함한다.
- /wrapper (wrapper 디렉토리)
- Gradle Wrapper 관련 파일들이 있어 프로젝트에 특정 Gradle 버전을 지정할 수 있게 한다.
- gradlew 또는 gradlew.bat
- Gradle을 설치하지 않아도 프로젝트를 실행할 수 있게 해주는 Gradle Wrapper 스크립트
- 각각 Unix 계열과 Windows용에서 사용
- settings.gradle
- 루트 프로젝트 이름과 하위 프로젝트를 정의하는 Gradle 설정 파일
- build.gradle
- 하위 프로젝트의 Gradle 빌드 스크립트로 해당 프로젝트의 빌드 구성을 정의하는 파일
'우아한테크코스 6기 > 2단계' 카테고리의 다른 글
테스트 시 데이터베이스 격리 성능 개선하기 (+ AbstractTestExecutionListener) (0) | 2024.07.17 |
---|---|
난 레벨 2 동안 어떤 경험들을 했을까? (0) | 2024.07.08 |
JPQL new 연산은 지양해야 할까? JPQL은 어떻게 동작할까? (0) | 2024.06.04 |
[방탈출 사용자 예약] @Bean, @Component, 그리고 POJO (0) | 2024.05.14 |
영속성 entity 와 domain entity 분리해보기 (0) | 2024.05.12 |