빌드 도구 Gradle

2024. 3. 2. 15:07Backend 취업준비/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
  • 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 파일의 보안 위험 등의 문제가 있었다. 그래서 탄생한 것이 빌드 도구
      Gradle
      • Groovy 기반의 스크립트 언어 이다
      • 스크립트 언어
        • 동적으로 실행 가능
        • 추가적인 로직을 작성하고 싶을 때 스크립트 로직을 직접 작성할 수 있다
        • 또는 Gradle이 지원하는 플러그인(Plugin)을 호출할 수도 있다
      • Groovy 기반의 DSL
        • 자바와 유사한 문법 구조를 가지며, 호환된다( Java 라이브러리를 그대로 사용하거나, Groovy 코드를 Java에서 호출하는 것이 가능)
        • JVM에서 실행되는 스크립트 언어이다
      Gradle 간단 예시
      • Plugin 이란 특정 작업을 위해 모아놓은 task들의 묶음
      • 예) java 플러그인 ⇒ 자바 플러그인을 추가하면, 다음과 같은 태스크들이 추가 되어 수행할 수 있다.
        • Dependencies (의존성 관리)
          • 프로젝트에서 사용하는 라이브러리나 패키지를 의존성 이라고 한다
          • 프로젝트별로 어떤 의존성을 갖는지 명시해 주어야 한다
        • Dependencies Configuration
          • 라이브러리를 추가하는 시점을 설정할 수 있다.
          • 특정 시점에 불필요한 특정 라이브러리를 추가한다면 리소스 낭비이다
          • 종류
            • Implementation : 런타임 + 컴파일 시점 모두에서 사용
              • ex) spring-boot-starter-web
            • compileOnly : 컴파일할 때만 사용되고 런타임 때는 미사용
              • ex) Lombok
            • runtimeOnly : 런타임 때에만 사용
              • ex) h2database
            • testImplementation : 테스트할 때만 사용
              • ex) spring-boot-starter-test
        • 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 해당 설정이 필요한 서브 모듈에만 설정을 주입할 수 있다 (프로젝트 별로 주입 되는 설정을 다르게 할 수 있다)

 

 

출처

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