본문 바로가기

Spring Boot

[Spring Boot] build.gradle 이란?

Gradle?


Gradle은 Groovy를 기반으로 한 오픈소스 빌드 도구이다. Ant의 자유도와 Maven의 관례를 통한 접근성을 바탕으로 이전 빌드툴의 단점을 보완하여 개선된 서비스를 제공한다.

 

 

 

 

 

특징


  • Ant처럼 매우 유연한 범용 빌드 도구.
  • Maven과 같은 구조화 된 build프레임워크 (구조의 전환이 가능).
  • Maven, Ivy등의 기존 저장소 인프라 또는 pom.xml 파일과 ivy.xml 파일에 대한 migration의 편이성 제공
  • 멀티 프로젝트 빌드 지원.
  • 의존성 관리의 다양한 방법 제공
  • Build script를 xml이 아닌 Groovy 기반의 DSL(Domain Specific Language)을 사용
  • 기존 Build를 구성하기 위한 풍부한 도메인 모델 제공.
  • Gradle 설치 없이 Gradle Wrapper를 이용하여 빌드 지원

장점 

Ant, Maven과 같은 기존의 빌드툴은 xml형식을 이용하여 정적인 설정정보를 구성했다.
Gradle은 Groovy라는 언어를 이용하여 코드로서 설정정보를 구성하기 때문에 구조적인 장점이 있다.

  • xml의 구조적인 틀을 벗어나 코딩에 의한 간결한 정의가 가능하다.
  • 프로젝트를 설정주입방식으로 정의하기 때문에 maven의 상속 구조보다 재사용에 용이하다.

 

 

 

기본구조


  • 모든 Gradle script는 하나 이상의 project로 구성되며, 모든 프로젝트는 하나이상의 task로 구성된다.
    • Project : 소스를 jar로 모으거나, 자바 프로젝트를 컴파일하거나, 테스트를 실행하고, 어플리케이션을 배포하는 등의 업무로 구성된다.
    • Task : 작업의 최소단위이다.
      Task간 의존관계 설정과 함께 흐름에 따른 구성이 가능하며, 동적인 테스크의 생성도 가능하다. Gradle Tasks
  • Gradle은 자바6버전 이상의 VM환경에서 사용이 가능하며, 설치를 하거나 gradle wrapper를 이용하여 실행환경을 구성할 수 있다.

 

- Build Lifecycle -

Build 3단계

  1. 초기화(Initialization) : 빌드 대상 프로젝트를 결정하고 각각에 대한 Project 객체를 생성.
    settings.gradle 파일에서 프로젝트 구성 (멀티프로젝트, 싱글프로젝트 구분)
  2. 구성(Configuration) : 빌드 대상이 되는 모든 프로젝트의 빌드 스크립트를 실행. (프로젝트 객체 구성)
    configured Task 실행
  3. 실행(Execution) : 구성 단계에서 생성하고 설정된 프로젝트의 태스크 중에 실행 대상 결정.
    gradle 명령행에서 지정한 태스크 이름 인자와 현재 디렉토리를 기반으로 태스크를 결정하여 선택된 Task들을 실행

 

- Build 설정파일 -

  • settings.gradle : 프로젝트 구성 설정.(싱글프로젝트의 경우 생략 가능)
    • Gradle은 멀티프로젝트를 구성하여 프로젝트간의 의존성 및 서브프로젝트, 교차 프로젝트를 구성할 수 있다.
  • build.gradle : 빌드에 대한 모든 기능 정의.
  • 표준프레임워크에 적용한 Gradle 빌드환경의 폴더구조
    gradle은 다양한 방식으로 시스템을 구성할 수 있으나, java플러그인을 이용한 표준 리소스 구성을 적용하여 기존 메이븐 프로젝트의 구성을 유지할 수 있다.

 

디렉토리 구조 디렉터리 / 파일  설명
/settings.gradle 빌드할 프로젝트의 정보를 설정
- 트리형태로 멀티프로젝트 정보 구성
/build.gradle 프로젝트 빌드정보를 구성
/gradlew
/gradlew.bat
gradle 명령파일
/.gradle
/gradle
gradle 버전별 엔진 및 설정파일
/src/main/java 자바 소스 파일 위치
/src/main/resource 배포할 리소스, XML, properties...

 

 

 

사용법


build.gradle 파일에 빌드정보를 정의하여 프로젝트에서 사용하는 환경 설정, 빌드방법, 라이브러리 정보 등을 기술함으로서 빌드 및 프로젝트의 관리환경을 구성한다.

 

plugin 설정

 

plugins {
	id 'java'
	id 'org.springframework.boot' version '2.7.11'
	id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}

 

repositories 설정

프로젝트에 사용되는 종속 라이브러리를 가져오기 위한 저종소를 등록하는 부분이다.

 

repositories {
	mavenCentral()
}

 

dependencies 설정

프로젝트에 필요한 라이브러리를 등록하는 부분이다.

라이브러리를 지정할 때는 ' 그룹:이름:버전 ' 형태를 사용한다.

버전이 생략된 경우는 plugins 에서 dependency-management 를 설정했기 때문에 자동으로 호환되는 버전을 알아서 등록해 준다.

 

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-security'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'

	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testImplementation 'org.springframework.security:spring-security-test'
    
    //jjwt
	implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.2'
	runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.2'
	runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.2'
}

 

dependency configuration 의미
compileOnly 컴파일 하는데는 필요하지만 런타임 클래스 패스에는 포함되지 않는 종속성을 나타낸다.
implementation 기존의 compile 을 대체하며 컴파일과 런타임에 사용된다.
runtimeOnly 기존의 runtime 을 대체하며 컴파일 타임이 아닌 런타임에만 사용된다.
testComplieOnly test 에서만 적용되는 complieOnly 속성이다.
testImplementation test 에서만 적용되는 implementation 속성이다.
testRuntimeOnly test 에서만 적용되는 runtimeOnly속성이다.

 

 

 

기타

group = 'com.security'           프로젝트의 groupId
version = '0.0.1-SNAPSHOT'       스프링 부트 버전
sourceCompatibility = '17'       자바 버전

 

 

 

 

전체구조

plugins {
	id 'java'
	id 'org.springframework.boot' version '2.7.11'
	id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}

group = 'com.security'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-security'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'

	//jjwt
	implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.2'
	runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.2'
	runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.2'


	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testImplementation 'org.springframework.security:spring-security-test'
}

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

 

 

 

 

 

참조


https://www.egovframe.go.kr/wiki/doku.php?do=show&id=egovframework%3Adev3.6%3Adep%3Abuild_tool%3Agradle 

https://goodteacher.tistory.com/334