build.gradle 맛보기

Hyeokwoo Kwon·2022년 5월 7일
0


build.gradle 파일

작업 중인 프로젝트의 build.gradle 파일의 내용이 다음과 같다고 하자.

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

group = 'com.pllap'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-security'
	implementation 'org.springframework.boot:spring-boot-starter-validation'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'com.h2database:h2'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testImplementation 'org.springframework.security:spring-security-test'

	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'
}

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

가장 바깥쪽에는 plugins, configurations, repositories, dependencies 블럭이 보인다. 스프링 프로젝트를 진행하며 의존성을 추가할 때는 dependencies 블럭 내부만 손대면 된다. 따라서 다른 블럭은 무엇을 하는 블럭인지 정도만 간단하게 알아보고, dependencies 블럭에 대해서는 다른 블럭들보다 살짝 더 자세히 이야기해 보려고 한다.


plugins

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

plugins 블럭을 통해 프로젝트의 기능을 확장할 수 있다. 굳이 명시하지 않더라도 의존성을 추가해서 기능을 사용할 수는 있다. 하지만, 플러그인을 명시함으로써 보일러 플레이트 코드를 줄일 수 있다. 명시 가능한 플러그인의 목록은 gradle plugin repository에서 찾아볼 수 있다.

group, version, sourceCompatibility

group = 'com.pllap'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
  • group: 프로젝트의 groupId
  • version: 애플리케이션의 버전명
  • sourceCompatibility: 프로젝트 소스를 컴파일하는 JDK 버전
    • targetCompatibility: class 파일의 호환 JVM 버전

configurations

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

build.gradle 내부에서 사용되는 설정을 정의한다. 여기서는 compileOnlyannotationProcessor를 상속하도록 설정했다.

repositories

repositories {
	mavenCentral()
}

의존성을 가져올 중앙 저장소를 정의한다. mavenCentral()jcenter() 등의 메소드가 제공된다.

dependencies

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-security'
	implementation 'org.springframework.boot:spring-boot-starter-validation'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'com.h2database:h2'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testImplementation 'org.springframework.security:spring-security-test'

	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'
}

프로젝트에서 사용되는 의존성(라이브러리) 목록을 정의한다. 7.4.2 버전 공식 문서

gradle에서는 의존성을 가져오는 방법을 여러 가지 제공한다. 가져온 의존성을 컴파일 타임에만 사용하게 할 수도 있고, 런타임에만 사용하게 할 수도 있다. 의존성의 특성에 맞춰서 configuration을 잘 설정해 원하는 의존성을 적절하게 주입하면 배포 파일의 크기를 최적화할 수 있다.

configuration 목록은 문서에서 찾을 수 있다. 위에서 쓰인 것만 소개해 보자면 다음과 같다.

  • compileOnly: 컴파일 타임에만 의존성을 주입한다.
  • runtimeOnly: 런타임에만 의존성을 주입한다. (deprecated: runtime)
  • implementation: 컴파일 타임과 런타임에 모두 쓰이는 의존성을 주입한다. (deprecated: compile)
  • annotationProcessor: 어노테이션 프로세서로써 컴파일 시 사용되는 의존성을 주입한다.
  • testImplementation: 테스트 시에만 의존성을 주입한다. (deprecated: testCompile)

의존성은 그룹명:이름:버전 순으로 명시해서 주입할 수 있으며, 버전명은 optional로, 꼭 명시하지 않아도 된다. 또, 하단의 JWT 관련 설정들처럼 그룹명과 이름, 버전을 따로 명시할 수도 있다.

현재는 deprecated된 compile 등의 configuration도 존재하는데, 이것들에 대한 정보는 남아 있는 4.10.3 버전의 문서5.2.1 버전의 문서 등에서 확인할 수 있다.

task

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

test라는 이름의 task를 추가한다. 해당 task에서는 JUnit을 이용한다. 공식 문서

0개의 댓글