1703 단어
9 분
[ Spring ] Gradle

Gradle이란?#

거의 모든 유형의 소프트웨어를 빌드할 수 있을 만큼 유연한 빌드 자동화 도구이다.

빌드 자동화 도구란?#

image

우리는 어떤 소스코드를 실행해달라고 요청하면 컴퓨터는 이해하지 못한다. 따라서 소스코드를 실행가능한 파일로 변환해주어야 하는데, 이것을 “빌드”라고 한다.

image

image

빌드 도구는 코드를 실행 가능한 파일로 만들어주는 과정 및 라이브러리 관리, 테스팅 등을 ‘자동화’하여 수행한다.

빌드 도구를 사용하지 않을 때의 문제점#

  1. 반복적인 작업을 수작업으로 진행해야 하므로 비효율적이다.
  2. 라이브러리를 직접 다운로드 및 버젼 업데이트해야 한다.
  3. 프로젝트의 의존성을 파악하기 어렵다.

Gradle의 장점#

Gradle은 Groovy 기반의 스크립트 언어이다.

스크립트 언어#

  • 동적으로 실행 가능하다.
  • 추가적인 로직을 작성하고 싶을 때 스크립트 로직을 직접 작성할 수 있다.
  • 또는 Gradle이 지원하는 플러그인(Plugin)을 호출할 수도 있다.

Groovy 기반의 DSL#

  • Groovy 기반으로, 자바와 유사한 문법 구조를 가지며 Java와 호환된다.
  • JVM에서 실행되는 스크립트 언어이다.
  • DSL: 특정 도메인을 대상으로 만들어진 특수 프로그래밍 언어

Gradle 빌드 스크립트#

  • build.gradle을 빌드 스크립트라고 한다.

아래 코드는 전 프로젝트에서 쓰였던 빌드 스크립트이다.

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.0.6'
	//id 'org.springframework.boot' version '2.7.7'
	id 'io.spring.dependency-management' version '1.1.0'
}

group = 'earth.defense.corps'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
	implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server'

	implementation 'org.springframework.boot:spring-boot-starter-validation'
	implementation 'org.springframework.boot:spring-boot-starter-web'

	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'com.mysql:mysql-connector-j'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'

	implementation 'org.springframework.security:spring-security-test'
	implementation 'org.springframework.boot:spring-boot-starter-security'

	implementation group: 'com.auth0', name: 'java-jwt', version: '3.18.3'


	implementation 'io.springfox:springfox-boot-starter:3.0.0'
}

tasks.named('test') {
	useJUnitPlatform()
}

Plugins#

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.0.6'
	//id 'org.springframework.boot' version '2.7.7'
	id 'io.spring.dependency-management' version '1.1.0'
}
  • Plugin이란 특정 작업을 위해 모아놓은 task들의 묶음이다.

image

자바 플러그인을 추가하면, 다음과 같은 태스크들이 추가되어 수행할 수 있다.

Dependencies(의존성 관리)#

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
	implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server'

	implementation 'org.springframework.boot:spring-boot-starter-validation'
	implementation 'org.springframework.boot:spring-boot-starter-web'

	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'com.mysql:mysql-connector-j'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'

	implementation 'org.springframework.security:spring-security-test'
	implementation 'org.springframework.boot:spring-boot-starter-security'

	implementation group: 'com.auth0', name: 'java-jwt', version: '3.18.3'


	implementation 'io.springfox:springfox-boot-starter:3.0.0'
}
  • 프로젝트에서 사용하는 라이브러리나 패키지를 ‘의존성’이라고 한다.
  • 프로젝트별로 어떤 의존성을 갖는지 명시해주어야 한다.

의존성의 종류#

  • implementation: 런타임 + 컴파일 시점 모두에서 사용
  • compileOnly: 컴파일할 때만 사용되고 런타임 때에는 미사용
  • runtimeOnly: 런타임때에만 사용
  • testImplementation: 테스트할 떄만 사용

Dependencies Configuration#

  • 라이브러리를 추가하는 시점을 설정할 수 있다.
  • 특정 시점에서 불필요한 특정 라이브러리를 추가한다면 리소스 낭비이다.

Repositories#

repositories {
	mavenCentral()
}
  • Repositories는 라이브러리(모듈)가 저장된 위치를 정의한다.
  • 대표적으로 Maven Central(), Jcenter(), Google Android()가 있다.
  • 라이브러리의 저장소를 명시해주면 Gradle이 해당 저장소에서 필요한 라이브러리를 가져온다.

Gradle의 특징#

image

뛰어난 성능#

build Cache#

  • 빌드 결과물을 캐싱하여 재사용
  • 라이브러리 의존성을 캐시로 저장한 후 이전에 다운로드한 라이브버리 재사용

점진적 빌드#

  • 마지막 빌드 호출 이후 변경된 부분만 빌드
  • 변경되지 않은 부분은 캐시 결과를 검색해 재사용
  • 태스크의 입력, 출력 혹은 변경되지 않은 부분은 빌드하지 않음

데몬 프로세스 사용#

image

image

  • 다음 빌드 작업을 위해 백그라운드에서 대기하는 프로세스
  • 초기 빌드 이후 빌드 실행 시 초기화 작업을 거치지 않음
  • 이로 인해 한 번 빌드된 프로젝트는 다음 빌드에서 매우 적은 시간만 소요됨

멀티 프로젝트 빌드 지원#

image

관리자 프로젝트, 일반 회원 프로젝트 모두 멤버 클래스를 추가하는 방식이 있지만, 관리가 어렵다는 단점이 있다. 따라서 Gradle을 활용해 공통모듈을 관리할 수 있다.

멀티프로젝트(멀티모듈)이란?#

image

  • 공통되는 도메인을 사용하는 프로젝트를 하나의 프로젝트로 묶어서 관리하는 것이다.
  • Gradle은 각 프로젝트가 공통으로 사용하는 클래스를 모듈로 만들어 독립적인 각 프로젝트에서 사용할 수 있어야 한다.

image image

  • root프로젝트: 공통 모듈 ‘멤버’를 사용하는 관리자, 일반 회원 프로젝트를 묶는 프로젝트
  • 공통모듈: 각 프로젝트에서 사용되는 클래스를 하나의 모듈로 저장한다.

Gradle은 독립적인 두 프로젝트에서 멤버 모듈을 사용할 수 있도록 도와준다.

Root 프로젝트 설정#

image


image image

Configuration Injection#

dependencies {
    Compile('org.springframework.boot:spring-boot-starter')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}
  • 필요한 정보(설정)를 직접 프로젝트에 주입하는 방식
  • 공통되는 정보는 묶어서 주입 가능
  • 프로젝트별로 설정을 다르게 주입 가능
  • Maven의 상속 구조와 비교했을 떄 가독성 측면에서 우월

Jar 생성 비활성화#

image

  • root 프로젝트와 common-project는 main 없이 라이브러리의 역할을 하는 모듈이기 때문에 실행하지 않는다는 것을 명시해주기 위해 bootJar.enabled = false 해준다.

정리#

  • Gradle이란
    • 프로그래머가 작성한 코드를 실행가능한 파일로 변환해주고, 라이브러리, 테스트, 배포 등을 자동화하여 관리해주는 빌드 자동화 도구이다.
  • Gradle은
    • Groovy 기반의 스크립트 언어로서 유연성을 갖는다.
    • 성능 측면에서 유리한 빌드 도구이다.
    • Configuration Injection 방식을 통해 편리한 멀티프로젝트 빌드를 지원한다.

출처

[ Spring ] Gradle
https://blog-full-of-desire-v3.vercel.app/posts/spring/spring-gradle/
저자
SpeculatingWook
게시일
2023-06-08
라이선스
CC BY-NC-SA 4.0