Gradle
거의 모든 유형의 소프트웨어를 빌드할 수 있는 유연한 빌드 자동화 도구
개발자가 짠 소스 코드는 컴퓨터가 바로 이해를 할 수 없다.
따라서 소스 코드를 컴파일하고 라이브러리 의존성을 추가한 뒤, jar이나 war과 같은 실행 가능한 파일로 패키징 해야 실행 가능하다.
소스 코드를 실행 가능한 파일로 변환하는 과정을 빌드라고 한다.
🛠 빌드 도구의 역할
- 빌드 : 소스 코드를 실행 가능한 파일로 만들기
- 라이브러리 관리
- 환경 변수 관리
- 테스트
- 배포
🧨 빌드 도구를 사용하지 않을 때의 문제점
- 라이브러리를 직접 다운로드 해줘야 되고 버전도 매번 업데이트 해야 하며, 버전 충돌이 날 가능성도 높다.
- 빌드와 테스트 작업을 수동으로 수행해야 한다.
- 프로젝트의 의존성을 파악하기 어렵다.
스크립트 언어로써 가지는 장점
- 동적으로 실행 가능(소스 코드를 컴파일하지 않고 직접 실행)
- 추가적인 로직을 작성하고 싶을 때 스크립트 로직을 직접 작성 가능하다.
Groovy
- JVM 상에서 실행되는 스크립트 언어
- 자바와 매우 유사해 자바와 호환성이 좋다.
📚 Gradle 구성
Plugin
- 특정 작업을 위해 모아놓은 task들의 묶음
- 보통 자바를 빌드할 때 컴파일을 하고 dependency를 추가하고 테스트를 하는 과정이 필요한데 자바 파일을 만들 때마다 매번 해줄 수 없기에 자바 플러그인을 사용한다.
의존성 관리(Dependencies Configuration)
Gradle Dependencies에서 라이브러리를 추가하는 시점을 설정할 수 있다. 왜냐하면 특정 시점에서 불필요한 라이브러리를 추가하는 것은 비효율적이기 때문이다.
Dependencies Configuration의 네 가지 종류
- implementation : 런타임과 컴파일 시점 모두에서 사용
- compileOnly : 컴파일 시점에서만 사용
- runtimeOnly : 런타임 시점에서만 사용
- testImplementation : 테스트할 때에만 사용
Repository
- 라이브러리(모듈)가 저장된 위치
- 대표적인게 mavenCentral()
- 라이브러리의 저장소를 명시해주면 Gradle이 해당 저장소에서 필요한 라이브러리를 가져온다.
Gradle 특징
1. 뛰어난 성능 (빠른 빌드 속도)
빌드 캐시 (Build Cache)
- 빌드 결과물을 캐싱하여 재사용
- 라이브러리 의존성을 캐시로 저장 후 다시 재사용하기 때문에 시간 단축
점진적 빌드 (Incremental Build)
- 마지막 빌드 이 후에 변경된 부분만 빌드
- 변경되지 않은 부분은 캐시에서 재사용
- 빌드 시작하기 앞서서 어떤 파일들이 수정, 변경되었는지 감지한다.
- 변경 사항이 없는 경우, 자바 컴파일을 하지 않는다.
데몬 프로세스 (Daemon Process)
- 다음 빌드 작업을 위해 백그라운드에서 대기하는 프로세스
- 서비스의 요청에 응답하기 위해 오래 살아있는 프로세스
- 초기 빌드 뒤에 다시 초기화하지 않아서 성능이 좋아진다.
- 다음 빌드부터는 매우 적은 시간만 소요됨
2. 멀티 프로젝트
필요성
- 만약 관리자 프로젝트와 회원 프로젝트가 나눠져 있으면서 각각의 똑같은 멤버 클래스를 가지고 있을 때, 관리자 프로젝트의 멤버 클래스에서 변경이 일어나면 똑같이 회원 프로젝트의 멤버 클래스에서도 변경이 일어나야 한다.
- 이런 번거로움을 없애기 위해, 공통되는 도메인을 사용하는 프로젝트를 하나의 프로젝트로 묶어서 관리한다.
- Gradle은 각 프로젝트가 공통으로 사용하는 클래스를 모듈로 만들어 독립적인 각 프로젝트에 사용 가능하도록 한다.
예시
- root 프로젝트에서는 관리자 프로젝트와 회원 프로젝트가 같이 있고, 두 프로젝트가 공통으로 사용하는 클래스들을 모은 모듈이 있다.
- settings.gradle에 하위 프로젝트 두 개와 공통 모듈 하나를 include 시킨다.
- build.gradle에서는 각 프로젝트가 어떤 모듈을 사용하는지에 대해서 의존성을 추가해준다.
- root 프로젝트는 관리자 프로젝트와 회원 프로젝트를 묶는 역할만 하지 main이 아니기 때문에 jar 파일 생성을 비활성화 시킨다.
3. 설정 주입(Configuration Injection)
정의 : 필요한 라이브러리를 프로젝트에 주입
- Maven의 상속 구조보다 가독성과 재사용성이 더 좋다(Groovy의 장점).
- 프로젝트 별로 설정을 다르게 할 수 있다.