프로젝트를 진행하면서 코드를 클론해 받아오면 빌드가 잘 되지 않아 고역을 치룬 경험이 많다. 프로젝트에서 빌드에 필요한 파일과 그 역할을 분석해 보자. 빌드 툴은 Gradle 을 기반으로 한다.
build.gradle
프로젝트에서 필요한 종속성과 빌드 설정을 위해서 build.gradle 파일을 작성해야 한다. build.gradle 파일은 프로젝트의 컴파일, 패키징, 테스트 등의 빌드 과정을 정의한다. DSL(Domain-Specific Language) 을 사용하여 빌드 스크립트를 작성하며, 다양한 플러그인과 태스크를 구성할 수 있다. Gradle 빌드 스크립트의 주요 역할을 수행하며, 프로젝트의 구성, 종속성 관리, 작업 정의 등을 다룬다.
// build.gradle
buildscript{
/*
프로젝트 자체의 빌드에 필요한 종속성과 설정을 정의합니다.
예를 들어, 특정 플러그인을 사용하기 위해 필요한 Gradle 버전을 여기서 지정할 수 있습니다.
*/
repositories{
maven{
url ""
credentials {
username = ''
password = ''
}
allowInsecureProtocol = true
}
}
dependencies{
classpath('io.spring.gradle:dependency-management-plugin:1.0.11.RELEASE')
}
}
plugins{
/*
Gradle 플러그인을 추가하고 관리할 수 있습니다.
플러그인은 빌드 프로세스에 추가적인 기능을 제공하거나 특정 작업을 자동화하는데 사용됩니다.
플러그인을 식별하는 ID 또는 플러그인을 구성하는 설정을 지정할 수 있습니다.
해당 플러그인에 의해 정의된 태스크, 규칙, 설정 등을 사용할 수 있습니다.
*/
id 'io.spring.dependency-management' version '1.0.11.REALEASE'
}
ext{
/*
extension 의 줄임말로, 추가적인 프로젝트 속성을 정의하는데 사용됩니다.
주로 변수나 설정 값을 저장하는데 활용됩니다.
정의한 속성은 해당 Gradle 스크립트에서 참조할 수 있습니다.
*/
sampleProperty = "sample"
sampleVersion = "sampleVersion"
}
allprojects {
/*
프로젝트의 전체 구조에 적용되는 설정을 정의하는데 사용됩니다.
주로 모든 하위 프로젝트에 공통적으로 적용되는 설정을 설정하고자 할 때 사용됩니다.
루트 프로젝트와 모든 하위 프로젝트에 적용됩니다.
*/
group 'com.example'
// 프로젝트의 그룹 식별자 또는 네임스페이스를 나타냅니다.
// 프로젝트에서 생성되는 아티팩트를 고유하게 식별하는데 사용됩니다.
// 라이브러리를 게시하는 경우 위와 같은 값으로 라이브러리가 속한 패키지를 표시할 수 있습니다.
version sampleVersion
// 프로젝트 또는 아티팩트의 버전을 지정합니다.
configuration.all {
resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}
// 프로젝트에 사용되는 사용자 정의 구성을 정의할 수 있습니다.
}
subprojects {
/*
프로젝트의 하위 프로젝트에 대한 설정을 정의하는데 사용됩니다.
루트프로젝트의 하위 프로젝트에만 적용됩니다.
*/
apply plugin: 'java-library'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'maven-publish'
// 플러그인을 적용하는데 사용됩니다.
sourceCompatibility = '11'
// 소스 코드의 호환성을 나타내는 설정입니다. 주로 Java 프로젝트에서 사용되며,
// 사용하는 JDK 버전과 소스코드의 버전을 일치시키는 데 사용됩니다.
targetcompatibility = '11'
// 컴파일된 클래스 파일이 지정된 JDK 버전과 호환되도록 지정합니다.
repositories {
mavenLocal()
mavenCentral()
// 프로젝트 종속성이나 플러그인을 가져올 저장소를 정의하는데 사용됩니다.
// 일반적으로 중앙 저장소(mavenCentral()), JCenter(jcenter()) 와 같은 외부 저장소를 사용하거나,
// 로컬 디렉토리에 저장된 저장소(mavenLocal()) (m2 repository) 를 지정할 수 있습니다.
}
publishing{
repositories {
maven {
}
}
// 프로젝트를 배포하기 위한 설정을 정의하는데 사용됩니다.
// Maven 이나 Ivy 와 같은 저장소에 아티팩트를 배포하는데 사용될 수 있습니다.
}
dependencyManagement {
imports {
mavenBom "org.springframework.boot:spring-boot-dependencies:2.6.2"
}
// 프로젝트의 종속성 관리를 정의하는데 사용됩니다.
// 하위 프로젝트에 일관적으로 적용되므로 모든 하위 프로젝트에서 동일한 종속성 버전을 사용할 수 있고,
// 중복된 종속성 정의를 방지할 수 있습니다.
}
dependencies{
implementation("") // 주 프로덕션 코드에서 사용되는 종속성을 정의하는데 사용됩니다. 컴파일 및 런타임에 필요합니다.
testImplementation("") // 테스트 코드를 컴파일하고 실행할 때 해당 종속성이 필요합니다.
compileOnly("") // 컴파일 시에만 필요한 종속성을 정의합니다. 인터페이스 정의나 어노테이션 처리기와 같이 컴파일 타임에만 필요한 경우에 사용됩니다.
api("") // 공개 API로 노출되는 종속성을 정의하는데 사용됩니다. 다른 프로젝트가 이 프로젝트를 종속성으로 사용할 때, api 로 선언된 종속성도 함께 사용할 수 있습니다. 컴파일과 런타임에 모두 포함됩니다.
annotationProcessor("") // 어노테이션 처리기를 정의하는데 사용됩니다. 컴파일 시에 어노테이션에 기반하여 추가적인 코드를 생성하거나 변경하는데 사용됩니다.
runtimeOnly("") // 런타임 시에만 필요한 종속성을 정의합니다.
implementationOnly("") // 주 프로덕션 코드에서만 사용되는 종속성을 정의합니다.
testCompile("") // 테스트 코드에서 사용되는 종속성을 정의합니다.
}
test {
useJnitPlatform()
// 테스트 관련 설정을 정의하는데 사용됩니다.
// 테스트 프레임워크, 테스트 리포트, 테스트 실행방식 등과 관련된 설정을 여기에 포함할 수 있습니다.
}
clean {
delete file('src/main/sample')
// 빌드 결과물을 제거하는 태스크 입니다.
}
compileJava.options.encoding = 'UTF-8'
tasks.withType(JavaCompile){
options.encoding = 'UTF-8'
}
// 소스코드 경로, 클래스패스, 컴파일 옵션 등을 구성합니다.
// sourceSets, options 블록 내에서 컴파일 옵션을 설정 할 수 있습니다.
}
settings.gradle
Gradle 멀티 프로젝트 빌드의 루트 설정 파일이다. 프로젝트의 계층 구조, 서브 프로젝트 간의 의존성, 포함될 프로젝트 등을 정의한다. 프로젝트 계층 구조의 진입점으로 사용된다. 멀티 프로젝트 빌드에서 모든 프로젝트에 대한 공통 설정을 포함하며, 각 프로젝트의 build.gradle 파일을 참조한다. 파일의 위치는 루트 디렉토리에 위치해야 한다.
// settings.gradle
pluginManagement {
// 플러그인 관리 기능을 정의합니다.
// 플러그인을 설정하고, 플러그인의 버전 및 저장소 등을 관리할 수 있습니다.
plugins{
id 'com.example.plugin' version '1.0.0'
id 'org.gradle.another-plugin' version '2.3.0'
// 플러그인을 선언합니다.
}
resolutionStrategy {
force 'com.example.plugin:1.0.0'
// 버전 충돌을 해결하는 규칙 정의합니다.
}
repositories {
maven {
url "http://localhost/repository/sample/"
credentials {
username = ''
password = ''
}
allowInsecureProtocol = true
}
mavenCentral()
jcenter()
gradlePluginPortal()
// 플러그인 저장소 설정합니다.
}
}
rootProject.name = 'root-project' // 루트 프로젝트의 이름을 정의합니다. 빌드 스크립트에서 사용되며, 프로젝트 이름을 다른 곳에서 참조할 수 있도록 합니다.
include 'subproject1' // 현재 루트 프로젝트에 포함될 서브 프로젝트를 정의하는 데 사용됩니다.
include 'subproject2' // 멀티 프로젝트 구조에서 각 서브 프로젝트는 독립적인 빌드 스크립트(build.gradle) 를 가지며, 개별적으로 관리됩니다.
project(':subproject1').projectDir = new File('path/to/subproject1') // 서브 프로젝트 추가 설정을 정의합니다.
project(':subproject2').projectDir = new File('path/to/subproject2') // proejctDir 속성을 통해 해당 디렉토리 경로를 설정합니다.
includeBuild 'path/to/external-project' // 디렉토리에 위치한 외부 Gradle 빌드를 현재 프로젝트에 포함시킵니다.
gradle.properties
Gradle 빌드 도구에서 사용되는 프로퍼티(속성) 값을 설정하는 파일이다. 이 파일은 프로젝트 전체에 적용되는 전역 프로퍼티 값을 정의하는데 사용된다. 파일의 위치는 루트 디렉토리에 위치해야 한다. key = value 형식으로 프로퍼티를 정의한다. 대소문자를 구분하며, 공백이나 특수문자는 사용할 수 없다. 정의한 프로퍼티는 build.gradle 내에서 '$prop' 형식으로 참조할 수 있다. 이를 통해 빌드 스크립트 (build.gradle) 내에서 동일한 값을 반복해서 작성하지 않고도 필요한 곳에서 간편하게 참조할 수 있다.
또한 systemProp.http.proxyHost 와 같은 값은 build.gradle 파일에서 직접 참조하지 않더라도 자동으로 시스템 프로퍼티로 인식한다. 시스템 프로퍼티는 Gradle 실행 환경의 일부로써 시스템 수준에서 설정되는 프로퍼티이다. gradle.properties 파일은 Gradle 프로젝트 내에서만 유효한 프로퍼티이지만, 시스템 프로퍼티는 Gradle 실행환경 전체에 적용된다. 따라서, Gradle 이 실행될 때 해당 시스템 프로퍼티를 인식하고 HTTP 프록시 호스트를 참조하여 Gradle 빌들 작업을 수행한다. 이는 Gradle이 네트워크 연결 등에 필요한 프록시 설정을 자동으로 처리할 수 있도록 한다.
// gradle.properties
myProperty=myValue
versionCode=123
versionName=1.0.0
systemProp.http.proxyHost=11.11.111.11
systemProp.http.proxyPort=8080
systemProp.http.nonProxyHosts=12.12.12.12
각 프로젝트마다 빌드를 위한 환경과 사설망, 사설 저장소 등의 사용여부, 라이브러리 버전이 다른 상황에서 위와 같이 빌드에 필요한 스크립트의 역할과 구성요소를 인지하고 있다면 프로젝트를 빌드하는데 발생하는 시행착오를 줄이는데 도움이 될 것이다.
'Java' 카테고리의 다른 글
[Springboot + Kafka] 간단한 pub/sub 구현 예제 (0) | 2023.07.22 |
---|---|
[Spring] webclient + 406 error 문제 해결 (0) | 2023.06.26 |
[JPA] 영속성 컨텍스트 (Persistence context) (0) | 2023.05.16 |
[JPA] 정리 (2) | 2023.05.16 |