gradle build 명령어를 실행하면, Gradle 빌드 도구는 프로젝트를 빌드하기 위해 여러 작업을 수행합니다. 이 명령어는 프로젝트의 소스 코드를 컴파일하고, 테스트를 실행하고, 아티팩트를 패키징하는 등의 일련의 빌드 단계를 거칩니다.
- 설정 단계 (Initialization Phase)
이 단계에서는 Gradle이 빌드를 준비하는 초기 작업을 수행합니다.
- Gradle Wrapper 실행: gradle build 명령어가 실행되면 먼저 Gradle Wrapper(gradlew)가 사용되는지 확인합니다. Gradle Wrapper는 프로젝트에 설정된 Gradle 버전을 자동으로 다운로드하고 실행하는 스크립트입니다.
- 프로젝트 설정 로드: Gradle은 settings.gradle 파일을 읽고, 멀티-프로젝트 빌드인 경우 각 서브 프로젝트를 구성합니다. 이 파일에서 프로젝트 이름과 프로젝트 간의 관계(예: 부모-자식 프로젝트)를 정의합니다.
- 구성 단계 (Configuration Phase)
설정 단계가 끝나면, Gradle은 구성 단계로 넘어갑니다. 이 단계에서는 빌드 스크립트(build.gradle)를 읽고, 빌드 로직을 설정합니다.
- 빌드 스크립트 로드: build.gradle 파일을 읽어서, 필요한 플러그인과 의존성, 그리고 빌드 스크립트에 정의된 모든 작업(Tasks)을 설정합니다. 이 과정에서 프로젝트에 정의된 모든 작업(Task)을 평가하고, 각 작업의 종속성도 구성합니다.
- 작업 그래프 생성: 빌드에 필요한 작업들의 그래프가 생성됩니다. 이 그래프는 작업들이 어떤 순서로 실행되어야 하는지를 결정합니다. 예를 들어, 소스 코드를 컴파일하기 전에 종속성이 해결되어야 하며, 테스트는 컴파일이 완료된 후에 실행되어야 합니다.
- 실행 단계 (Execution Phase)
구성 단계가 완료되면 Gradle은 실제로 작업을 실행합니다.
- 작업 실행: gradle build 명령어에 의해 요청된 작업들이 순서대로 실행됩니다. 기본적으로 build 작업은 다음과 같은 작업들로 구성될 수 있습니다:
- clean 작업: 이전 빌드 결과를 삭제하여 새로 빌드를 시작할 수 있게 합니다. 이 작업은 명시적으로 gradle clean build 명령어를 사용했을 때 수행됩니다.
- compileJava 작업: 자바 소스 파일을 컴파일합니다. src/main/java 디렉토리에 있는 모든 소스 파일이 대상이 됩니다.
- processResources 작업: 리소스 파일(예: src/main/resources)을 복사하거나 처리합니다.
- classes 작업: 컴파일된 클래스 파일들을 합칩니다.
- test 작업: 테스트 코드를 컴파일하고, 테스트 프레임워크(예: JUnit, TestNG 등)를 사용하여 테스트를 실행합니다.
- jar 작업: 최종적으로 컴파일된 코드와 리소스 파일들을 하나의 JAR 파일로 패키징합니다.
- assemble 작업: 패키징된 파일들을 모아 하나의 배포 가능한 결과물을 만듭니다.
- check 작업: 테스트와 코드 품질 검사(예: 정적 코드 분석 도구와 통합) 등을 수행합니다.
- build 작업: assemble과 check 작업을 모두 포함하는 최종 작업입니다.
- 의존성 관리: build.gradle에 정의된 의존성은 이 단계에서 다운로드되고 관리됩니다. Gradle은 build.gradle 파일의 dependencies 블록을 확인하여 필요한 라이브러리를 로컬 캐시 또는 원격 저장소에서 가져옵니다.
- 결과 출력
작업들이 모두 성공적으로 완료되면, Gradle은 빌드가 성공했음을 출력합니다. 만약 어떤 작업에서 에러가 발생하면 해당 작업은 실패로 표시되며, Gradle은 오류 메시지를 출력합니다. 기본적으로 빌드의 최종 결과는 build 디렉토리에 생성됩니다.
추가적인 정보
- 병렬 빌드: Gradle은 여러 작업을 병렬로 실행할 수 있습니다. 이를 통해 빌드 시간을 단축할 수 있습니다.
- 빌드 캐싱: Gradle은 동일한 입력을 가진 작업의 출력을 캐싱하여 다음 빌드에서 재사용할 수 있도록 합니다.
- 증분 빌드: Gradle은 변경된 부분만 빌드하도록 최적화할 수 있습니다. 예를 들어, 일부 코드만 수정되었다면 전체 프로젝트를 다시 빌드하지 않고 수정된 부분만 빌드합니다.
이렇게 gradle build 명령어는 프로젝트의 소스 코드에서 최종 빌드 결과물(예: JAR 파일 또는 다른 아티팩트)을 생성하기 위해 일련의 작업들을 순차적으로 또는 병렬로 실행하는 과정을 수행합니다.