들어가기
앞서 CI/CD를 구축하면 gradlew build와 gradlew test를 사용했다.
어느 정도 gradlew build를 실행 시 test도 진행한다는 것을 알고는 있었지만,
자세히 build와 test 일어나는 과정에 대해 알지는 못하기에 이번에 정리하면서 그 차이를 알아보려고 한다.
그전에 우선은 Gradle Wrapper에 대해 알아보려고 한다.
Gradle Wrapper(gradlew)란
- Gradle wrapper는 프로젝트와 함께 제공되는 스크립트와 라이브러리 모음으로, 사용자가 Gradle을 사전에 설치하지 않아도 지정된 버전의 Gradle 빌드를 사용할 수 있게 해주는 툴이다.
- 이를 통해 프로젝트가 특정 버전의 Gradle을 요구할 때, 모든 사용자가 동일한 빌드 환경을 갖출 수 있도록 보장해준다.
- 더불어 Gradle Wrapper를 사용하면 빌드 프로세스의 일관성을 유지하고, 빌드 환경을 더 쉽게 관리할 수 있다.
Gradle Wrapper의 주요 특징
- 버전 호환성 보장: 프로젝트마다 필요한 Gradle 버전이 다를 수 있다. Wrapper를 사용하면 프로젝트에 필요한 특정 버전의 Gradle을 자동으로 다운로드하고 사용하므로, 호환성 문제를 방지할 수 있디.
- 사전 설치 필요 없음: Gradle을 미리 설치할 필요 없이, Wrapper를 통해 빌드 명령을 실행하기만 하면 된다. 이는 새로운 개발자가 프로젝트에 참여할 때 환경 설정 시간을 단축시켜준다.
- 빌드 환경의 일관성: 모든 개발자와 CI/CD 시스템이 동일한 Gradle 버전을 사용함으로써, 빌드 과정의 일관성을 유지할 수 있다.
- 쉬운 업그레이드: 프로젝트의 gradle/wrapper/gradle-wrapper.properties 파일에서 Gradle 버전을 간단히 변경함으로써 Wrapper를 업그레이드할 수 있다. 이를 통해 새로운 Gradle 버전으로의 전환을 손쉽게 관리할 수 있다.
Gradle Wrapper 사용법
- gradle wrapper: 프로젝트 디렉토리에서 해당 명령을 실행하면 Wrapper 관련 파일들을 프로젝트에 추가한다.
- ./gradlew build (gradlew.bat build):필요한 Gradle 버전을 다운로드하고, 빌드를 실행한다.
Gradle wrapper를 프로젝트에 설정하고 초기화한 후, 프로젝트 디렉토리 구조
프로젝트 루트 디렉토리/
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── (기타 프로젝트 파일 및 디렉토리)
- gradle/wrapper/gradle-wrapper.jar: Gradle Wrapper 실행에 필요한 자바 코드가 포함된 JAR 파일이며, 실제로 Gradle 배포판을 다운로드 하는 역할을 한다.
- gradle/wrapper/gradle-wrapper.properties: Gradle Wrapper의 구성 설정을 포함하는 프로퍼티 파일이며, 사용할 Gradle 버전과 다운로드 URL 등의 정보가 들어있다.
- gradlew: 유닉스 및 유사 시스템을 위한 실행 스크립트.
- gradlew.bat: 윈도우 시스템을 위한 실행 스크립트.
Gradle Wrapper 동작 원리
앞서 Gradle Wrapper의 특징 중 하나인 사전 설치가 필요없다는 부분이 의문이 들어 조금 더 자세히 알아보려고 한다.
1. Gradle Wrapper 호출: 프로젝트 빌드 시, 개발자는 각 OS에 맞는 ./gradlew 혹은 gradlew.bat 스크립트를 호출한다.
2. Gradle 다운로드:그러면 Gradle Wrapper는 gradle/wrapper/gradle-wrapper.properties 파일에 지정된 URL에서 해당 버전의 Gradle을 다운로드한다. 이 과정은 처음 프로젝트를 빌드할 때 한 번만 발생하며, 이후에는 다운로드한 Gradle을 재사용한다.
3. 빌드 실행: 다운로드한 Gradle을 사용해서 프로젝트 빌드를 실행한다. 이는 직접 Gradle을 설치하고 실행하는 것과 같은 결과를 보여준다.
정리하면
프로젝트 빌드 시 Gradle Wrapper를 호출하게 되고,
Gradle Wrapper가 gradle/wrapper/gradle-wrapper.properties 파일에서 해당 버전의 Gradle을 다운로드한 뒤,
다운로드한 Gradle을 바탕으로 프로젝트를 빌드한다.
gradle build와 gradle test의 차이
우선, 두 명령 모두 공통으로 초기화와 구성 단계를 거친다.
둘의 차이는 실행 단계에서 보이기에 공통된 부분부터 살펴보고 차이를 살펴보자
gradle build와 test의 공통으로 거치는 과정
- 초기화 단계 (Initialization): 프로젝트 설정 파일(settings.gradle)을 통해 프로젝트의 구조를 결정한다.
- 구성 단계(Configuration): 프로젝트의 build.gradle 파일을 평가하여 사용될 태스크, 플러그인, 의존성 등을 구성한다. 이 단계는 실제 태스크가 실행되지는 않고, 빌드를 위한 준비만 이루어진다.
gradle build의 실행(Execution) 단계
gradle build는 프로젝트의 전체 빌드 프로세스를 관리한다.
- 컴파일: 프로젝트의 소스 코드(ex. src/main/java)를 컴파일하여 바이너리(ex.class 파일)로 변환한다. 프로젝트가 제대로 컴파일되는지를 확인한다.
- 테스트 실행: 프로젝트에 정의된 모든 테스트(단위 테스트와 통합 테스트)를 실행한다. 테스트 실패가 있을 경우, 이 단계에서 빌드 프로세스가 중단될 수 있다.
- 패키징: 컴파일된 바이너리, 리소스 파일, 그리고 기타 필요한 파일들을 포함하여 배포 가능한 아티팩트(예: Jar파일)를 생성한다. 여기서 생성된 아티팩트는 배포 또는 다른 환경에서도 실행할 수 있다.
- 추가 태스크: 필요에 따라 정적 리소스 처리 등 추가적인 태스크가 실행된다.
+ 결과물 생성: 모든 태스크가 성공적으로 완료되면, 최종적으로 패키징된 아티팩트가 생성되어 지정된 위치(예: build/libs 디렉토리)에 저장된다.
gradle test의 실행(Execution) 단계
gradle test는 프로젝트의 테스트 케이스를 실행하는데에만 집중한다.
- 테스트 컴파일: 테스트 소스 코드(ex. src/test/)를 컴파일한다. 이는 프로젝트의 테스트 코드가 올바르게 컴파일되는지 확인한다.
- 테스트 실행: 컴파일된 테스트 케이스를 실행하고, 각 테스트의 성공 여부를 검증한다. 이 단계는 주로 단위 테스트와 통합 테스트에 초점을 맞춘다.
- 결과 리포팅: 실행된 테스트의 결과를 분석하고, 성공 또는 실패한 테스트에 대한 상세 리포트를 생성한다. 이 리포트는 주로 HTML 형식으로 제공되고 build/reports/tests에 생성되며, 이 리포트를 통해 테스트의 성공 실패 여부와 실패한 경우의 원인 등을 확인할 수 있다.
gradle build -x test의 진실
gradle build의 실행(Execution)단계에서 테스트 실행 과정을 생략한다는 뜻이다.
앞서 작성했던 CI/CD yml 파일에서 빌드 실행 시 테스트 실행을 하지 않고,
test만 따로 실행하게끔 하여 빌드와 테스트의 명시적으로 구분하는데에는 큰 문제가 없음을 확실하게 알 수 있다.
다만, 테스트 후 빌드 혹은 빌드 후 테스트는 각 프로젝트의 상황에 따라 달라질 수 있다.
가장 중요한 건 빌드와 테스트 과정을 모두 자동화하여 지속적으로 코드 품질을 관리하고 개선해야 한다는 점이다.
# Spring Boot Build & test
- name: Build with Gradle Wrapper
run: ./gradlew build -x test
- name: 단위 테스트, 통합 테스트
run: ./gradlew test
정리
gradle build 명령의 실행 단계에서 이루어지는 테스트 실행 과정은 애플리케이션 코드의 빌드 완료 후에 테스트 코드를 컴파일하고, 이를 실행한 뒤, 결과를 리포팅하는 작업으로 구성되어 있다. 이는 gradle test 명령을 별도 실행했을 때와 같은 과정이고 gradle test는 테스트에 초점을 둔 작업이라 할 수 있다.
요약하면, gradle build의 실행단계에서 진행하는 테스트 실행은 gradle test의 실행 단계의 과정과 같으며, 그 과정이 들어가 있는 것이다.
https://docs.gradle.org/current/userguide/gradle_wrapper.html
Gradle Wrapper Reference
It is always recommended to execute a build with the Wrapper to ensure a reliable, controlled, and standardized execution of the build. Using the Wrapper looks like running the build with a Gradle installation. Depending on the operating system you either
docs.gradle.org
3. gradlew (gradle wrapper) - spring 사용하기
source code: https://github.com/kgmhk/spring-boot-tutorial/tree/gradlew gradlew (gradle wrapper) 란 gradle wrapper 줄여서 gradlew 는 새로운 환경에서 프로젝트를 설정할 때 java나 gradle을 설치하지 않고 바로 빌드할 수 있게
gihyun.com