빌드 도구 Gradle
2024. 3. 2. 15:07ㆍBackend 취업준비/Spring
빌드도구 Gradle
- 거의 모든 유형의 소프트웨어를 빌드할 수 있을 만큼 유용한 빌드 자동화 도구
빌드
- 컴퓨터는 소스코드를 바로 실행할 수 없다
- 따라서 소스코드를 실행 가능한 파일로 변환 해주어야 하는데, 이것을 빌드 라고 한다.
- 소스 코드를 컴파일, 테스트, 정적분석 등을 실행하여 실행 가능한 애플리케이션으로 만들어주는 과정 ⇒ 빌드
빌드 도구
- 빌드 도구는 계속해서 늘어나는 라이브러리를 자동 추가 및 관리해준다. 시간이 흐르면 라이브러리 버전을 자동으로 동기화 해주기도 한다.
- 다양한 개발이 가능해지면서 필요한 라이브러리도 많아지게 되었다. 이 많은 라이브러리를 직접 다운받고 추가하는 방법도 있지만 번거로움과 개발자들 간의 버전관리, 다운받은 jar 파일의 보안 위험 등의 문제가 있었다. 그래서 탄생한 것이 빌드 도구
Gradle
- Groovy 기반의 스크립트 언어 이다
- 스크립트 언어
- 동적으로 실행 가능
- 추가적인 로직을 작성하고 싶을 때 스크립트 로직을 직접 작성할 수 있다
- 또는 Gradle이 지원하는 플러그인(Plugin)을 호출할 수도 있다
- Groovy 기반의 DSL
- 자바와 유사한 문법 구조를 가지며, 호환된다( Java 라이브러리를 그대로 사용하거나, Groovy 코드를 Java에서 호출하는 것이 가능)
- JVM에서 실행되는 스크립트 언어이다
Gradle 간단 예시
plugins {
id 'java'
id 'org.springframework.boot' version '3.2.3'
id 'io.spring.dependency-management' version '1.1.4'
}
group = 'com.estsoft'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '17'
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
- Plugin 이란 특정 작업을 위해 모아놓은 task들의 묶음
- 예) java 플러그인 ⇒ 자바 플러그인을 추가하면, 다음과 같은 태스크들이 추가 되어 수행할 수 있다.
- Dependencies (의존성 관리)
- 프로젝트에서 사용하는 라이브러리나 패키지를 의존성 이라고 한다
- 프로젝트별로 어떤 의존성을 갖는지 명시해 주어야 한다
- Dependencies Configuration
- 라이브러리를 추가하는 시점을 설정할 수 있다.
- 특정 시점에 불필요한 특정 라이브러리를 추가한다면 리소스 낭비이다
- 종류
- Implementation : 런타임 + 컴파일 시점 모두에서 사용
- ex) spring-boot-starter-web
- compileOnly : 컴파일할 때만 사용되고 런타임 때는 미사용
- ex) Lombok
- runtimeOnly : 런타임 때에만 사용
- ex) h2database
- testImplementation : 테스트할 때만 사용
- ex) spring-boot-starter-test
- Implementation : 런타임 + 컴파일 시점 모두에서 사용
- Repositories
- 라이브러리가 저장된 위치를 정의
- 대표적으로 mavenCentral(), Jcenter(), Google Android()
- 라이브러리 저장소를 명시해주면 Gradle이 해당 저장소에서 필요한 라이브러리를 가져온다
Gradle의 특징
- 유연성
- 동적 스크립트로 설정 파일을 작성함으로써 Ant의 유연함을 가져옴
- Maven의 pom.xml은 선언형으로 설정하는 정적인 문서. 반면에 Gradle의 build.gradle은 스크립트로 작성하는 동적인 소스 파일이다.
- 즉 Maven은 정적인 문서와 엄격한 규칙으로 인해 어떤 설정이 필요할 때 한계가 있지만 Gradle은 로직을 넣을 수 있으니 한계가 없다. 필요하다면 로직 안에 플러그인을 호출하거나 직접 코드를 짜면 된다
- 성능
- 점진적 빌드
- Gradle은 이전 빌드 실행 이후에 변경된 파일만 다시 컴파일하고 다시 빌드하는 것을 의미. 전체 빌드 시간을 크게 단축시키는 기능.
- 마지막 빌드 호출 이후에 task의 입력, 출력 혹은 구현이 변경됐는지 확인
- Gradle은 파일의 수정 시간 등을 사용하여 어떤 부분이 변경 되었는지를 식별하고 변경된 부분만 다시 빌드 (Build Cache로 변경여부를 식별하는 것이 아님)
- Build Cache
- task가 이미 다른 컴퓨터에서 실행된 경우 Gradle은 로컬 실행을 건너뛰고 Build Cache로부터 작업의 결과물을 가져올 수 있다
- 라이브러리 의존성을 캐시로 저장한 후 이전에 다운로드한 라이브러리 재사용
- Gradle Daemon
- 빌드하는 인스턴스를 유지, 빌드가 끝난뒤에도 사라지지 않고 백그라운드에서 대기하는 프로세스
- 초기 빌드 이후 빌드 실행 시 초기화 작업을 거치지 않음 ⇒ 한번 빌드된 프로젝트는 다음 빌드에 소요 시간이 적음
- 점진적 빌드
- 멀티 프로젝트 빌드 지원 (Configuration Injection 방식)
- 멀티 모듈 프로젝트에서 설정 정보를 변수에 값을 넣는 형태로 필요한 모듈에만 주입하는 Configuration Injection 방식을 사용 ⇒ Maven에서 공통 모듈을 상속할 때의 단점을 커버
- Gradle 해당 설정이 필요한 서브 모듈에만 설정을 주입할 수 있다 (프로젝트 별로 주입 되는 설정을 다르게 할 수 있다)빌드도구 Gradle
- 거의 모든 유형의 소프트웨어를 빌드할 수 있을 만큼 유용한 빌드 자동화 도구
- 컴퓨터는 소스코드를 바로 실행할 수 없다
- 따라서 소스코드를 실행 가능한 파일로 변환 해주어야 하는데, 이것을 빌드 라고 한다.
- 소스 코드를 컴파일, 테스트, 정적분석 등을 실행하여 실행 가능한 애플리케이션으로 만들어주는 과정 ⇒ 빌드
- 빌드 도구는 계속해서 늘어나는 라이브러리를 자동 추가 및 관리해준다. 시간이 흐르면 라이브러리 버전을 자동으로 동기화 해주기도 한다.
- 다양한 개발이 가능해지면서 필요한 라이브러리도 많아지게 되었다. 이 많은 라이브러리를 직접 다운받고 추가하는 방법도 있지만 번거로움과 개발자들 간의 버전관리, 다운받은 jar 파일의 보안 위험 등의 문제가 있었다. 그래서 탄생한 것이 빌드 도구
- Groovy 기반의 스크립트 언어 이다
- 스크립트 언어
- 동적으로 실행 가능
- 추가적인 로직을 작성하고 싶을 때 스크립트 로직을 직접 작성할 수 있다
- 또는 Gradle이 지원하는 플러그인(Plugin)을 호출할 수도 있다
- Groovy 기반의 DSL
- 자바와 유사한 문법 구조를 가지며, 호환된다( Java 라이브러리를 그대로 사용하거나, Groovy 코드를 Java에서 호출하는 것이 가능)
- JVM에서 실행되는 스크립트 언어이다
- Plugin 이란 특정 작업을 위해 모아놓은 task들의 묶음
- 예) java 플러그인 ⇒ 자바 플러그인을 추가하면, 다음과 같은 태스크들이 추가 되어 수행할 수 있다.
- Dependencies (의존성 관리)
- 프로젝트에서 사용하는 라이브러리나 패키지를 의존성 이라고 한다
- 프로젝트별로 어떤 의존성을 갖는지 명시해 주어야 한다
- Dependencies Configuration
- 라이브러리를 추가하는 시점을 설정할 수 있다.
- 특정 시점에 불필요한 특정 라이브러리를 추가한다면 리소스 낭비이다
- 종류
- Implementation : 런타임 + 컴파일 시점 모두에서 사용
- ex) spring-boot-starter-web
- compileOnly : 컴파일할 때만 사용되고 런타임 때는 미사용
- ex) Lombok
- runtimeOnly : 런타임 때에만 사용
- ex) h2database
- testImplementation : 테스트할 때만 사용
- ex) spring-boot-starter-test
- Implementation : 런타임 + 컴파일 시점 모두에서 사용
- Repositories
- 라이브러리가 저장된 위치를 정의
- 대표적으로 mavenCentral(), Jcenter(), Google Android()
- 라이브러리 저장소를 명시해주면 Gradle이 해당 저장소에서 필요한 라이브러리를 가져온다
- 유연성
- 동적 스크립트로 설정 파일을 작성함으로써 Ant의 유연함을 가져옴
- Maven의 pom.xml은 선언형으로 설정하는 정적인 문서. 반면에 Gradle의 build.gradle은 스크립트로 작성하는 동적인 소스 파일이다.
- 즉 Maven은 정적인 문서와 엄격한 규칙으로 인해 어떤 설정이 필요할 때 한계가 있지만 Gradle은 로직을 넣을 수 있으니 한계가 없다. 필요하다면 로직 안에 플러그인을 호출하거나 직접 코드를 짜면 된다
- 성능
- 점진적 빌드
- Gradle은 이전 빌드 실행 이후에 변경된 파일만 다시 컴파일하고 다시 빌드하는 것을 의미. 전체 빌드 시간을 크게 단축시키는 기능.
- 마지막 빌드 호출 이후에 task의 입력, 출력 혹은 구현이 변경됐는지 확인
- Gradle은 파일의 수정 시간 등을 사용하여 어떤 부분이 변경 되었는지를 식별하고 변경된 부분만 다시 빌드 (Build Cache로 변경여부를 식별하는 것이 아님)
- Build Cache
- task가 이미 다른 컴퓨터에서 실행된 경우 Gradle은 로컬 실행을 건너뛰고 Build Cache로부터 작업의 결과물을 가져올 수 있다
- 라이브러리 의존성을 캐시로 저장한 후 이전에 다운로드한 라이브러리 재사용
- Gradle Daemon
- 빌드하는 인스턴스를 유지, 빌드가 끝난뒤에도 사라지지 않고 백그라운드에서 대기하는 프로세스
- 초기 빌드 이후 빌드 실행 시 초기화 작업을 거치지 않음 ⇒ 한번 빌드된 프로젝트는 다음 빌드에 소요 시간이 적음
- 점진적 빌드
- 멀티 프로젝트 빌드 지원 (Configuration Injection 방식)
- 멀티 모듈 프로젝트에서 설정 정보를 변수에 값을 넣는 형태로 필요한 모듈에만 주입하는 Configuration Injection 방식을 사용 ⇒ Maven에서 공통 모듈을 상속할 때의 단점을 커버
- Gradle 해당 설정이 필요한 서브 모듈에만 설정을 주입할 수 있다 (프로젝트 별로 주입 되는 설정을 다르게 할 수 있다)
- Dependencies (의존성 관리)
출처
https://tecoble.techcourse.co.kr/post/2020-09-17-java-build-tool/
https://www.youtube.com/watch?v=V4knLFDG-ZM
'Backend 취업준비 > Spring' 카테고리의 다른 글
스프링 Data Jpa로 API 만들기 (0) | 2024.03.16 |
---|---|
HTTP응답을 처리하는 방식 (@Controller, @RestController) (0) | 2024.03.09 |
JDBC 흐름 정리 (0) | 2024.03.08 |
스프링 빈 (0) | 2024.03.03 |
스프링과 스프링 부트 (0) | 2024.02.29 |