Chapter 1에서 JDK와 함깨 포함되어 있는 java, javac 명령어에 대하여 살펴보았습니다. Java로 만들어지는 어플리케이션은 기본적으로 이 두가지 명령어를 이용해 실행하고, 만들어진다고 볼 수 있습니다.
하지만 일반적인 Java 프로젝트는 한두개의 소스코드 파일로 이뤄지지 않습니다. Java는 객체지향을 이야기할때 빠지지 않는 언어인 만큼, 수많은 class 로 이뤄진 프로젝트로 만들어집니다. 이런 프로젝트를 단순히 java, javac 만 가지고 관리하기는 어려운 것이 사실입니다. 또한 프로젝트를 만드는데 필요한 다양한 외부 라이브러리들을 같이 사용하는데 있어서도, 일일이 라이브러리를 다운로드 하며 javac 명령어에 전달하는 것은 피곤한 과정입니다.
그래서 Java 프로젝트를 관리하기 위한 Maven, Gradle등의 소프트웨어가 등장하게 됩니다. 이들은 Java 언어를 사용하는 프로젝트에서, 외부 라이브러리를 가져오거나, 산출물의 형태를 결정, 기타 Testing이나 Deploy과정을 도와주는 용도의 Build Automation Tool 입니다.
Spring Boot, 또는 그 원본 프레임워크인 Spring Framework의 경우 하나의 기능에 대한 프레임워크가 아닙니다. 그래서 산출물의 형태, 사용하는 언어, 사용 가능한 라이브러리 등 여러가지 면에서 다양한 설정이 가능합니다. 이런 설정을 위해 Maven과 Gradle이 많이 활용되는 만큼, 완벽한 이해를 통해 다루는 정도는 아니라도 기초적인 작동 원리에 대하여 알아볼 필요가 존재합니다.
Maven
Maven은 Java를 위한 Build Automation Tool이지만, C#, Ruby등 다른 언어를 기반으로 하는 다른 프로젝트를 위해서도 사용할 수 있습니다. HTML의 DOM, 브라우저의 BOM과 유사하게, Project Object Model이라는 용어를 가지고 프로젝트를 구성하며, 그 설정을 pom.xml 파일을 통해 조정하게 됩니다. 일반적인 Java 프로젝트를 살펴볼때, pom.xml 파일이 존재하면 Maven으로 관리되는 프로젝트라고 생각하면 됩니다.
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.8</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>dev.aquashdw</groupId>
<artifactId>maven-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>maven-demo</name>
XML
복사
기본적으로 현재의 프로젝트에 대한 정보를 제공하기 위한 부분입니다. <parent> element의 경우 상속받을 프로젝트를 정의하기 위한 부분입니다. 그 아래의 <groupId> 와 <artifactId> 는 Spring Initialzr의 그것과 역할이 동일합니다. groupId 는 프로젝트 관리자의 구분자, aritfactId 는 개별 프로젝트의 구분자의 역할을 합니다.
<properties>
<java.version>11</java.version>
</properties>
XML
복사
properties 의 경우, pom.xml 내부에서 사용할 변수를 정의하기 위해 사용하는 부분입니다. 여기서 정의한 변수는 ${java.version} 과 같은 형태로 사용할 수 있습니다.
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
XML
복사
Maven은 또한 흔히 라이브러리라고 부르는, 프로젝트 의존성 관리의 측면에서 편리함을 제공하게 됩니다. pom.xml 의 구조상에서, <dependecies> 의 하위 element는 artifact 단위로 외부 라이브러리 사용 여부를 작성하도록 합니다. 개별 <dependency> 의 경우, 라이브러리의 배포자를 구분하기 위한 groupId 와 개별 기능에 대한 구분자인 artifactId 와 함께, 버전, 프로젝트의 어느단계에서 사용할지를 정의하기 위한 부분입니다. 만일 Spring Boot의 다른 하위 프로젝트 의존성이 필요할 경우 <dependency> 가 하나 추가된다고 보시면 됩니다.
여기서 추가하게 되는 의존성은, 실제로 프로젝트를 진행하는 컴퓨터에 물리적 파일로 존재합니다. macos 기준으로, $HOME 환경변수에 저장된 폴더의 .m2 라는 숨겨진 폴더에 존재합니다. 햇갈리면, 터미널을 열고 cd .m2 를 하면 확인할 수 있습니다.
여기의 repository 폴더 내부에 Java의 패키지 단위로 정리된 수많은 폴더를 확인할 수 있습니다. 여기에 있는 파일들이, 실제로 사용하게 되는 라이브러리 파일들입니다.
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
XML
복사
마지막에 정의하는 build element의 경우 실제 프로젝트의 산출물을 만드는 과정에서의 기능을 위한 설정이 들어가게 됩니다. 여기는 일반적으로 프레임워크나 기술 스택에 따라 추가되는 부분들이 있습니다. Spring Boot 과정에서는 위의 예시에서 크게 벗어날 필요가 없습니다.
Gradle
Gradle은 Maven과 마찬가지로 Java를 위한 Build Automation Tool로서, Java, C, C++, Javascript 기반의 프로젝트를 위해서도 사용할 수 있습니다. Maven에서 사용하는 의존성 관리 체계를 유사하게 사용하며, groovy라는 언어를 이용해 설정을 관리합니다. 기술적인 관점에서는 Gradle은 maven에 비해 증분적 빌드(필요한 작업 추적)와 빌드 캐시를 활용하여 더 큰 프로젝트를 진행할때 중복 작업을 줄인다는 성능적 장점을 가지고 있습니다. pom.xml 이란 구조적 언어가 아닌, 스크립트 언어를 활용함으로서 유연성이 더 높다는 장점도 있습니다.
Gradle의 경우 build.gradle 이라는 스크립트와 settings.gradle 이라는 스크립트로 기본적인 설정을 하게 됩니다. settings.gradle 의 경우 복수의 프로젝트를 빌드할 때 중요한 역할을 하게 됩니다.
// build.gradle
group = 'dev.aquashdw'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
// settings.gradle
rootProject.name = 'gradle-demo'
Groovy
복사
Maven과 마찬가지로 프로젝트의 배포자, 이름 등이 설정되는 부분입니다.
plugins {
id 'org.springframework.boot' version '2.5.8'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
Groovy
복사
프로젝트 빌드를 위해 필요한 플러그인 설정 부분입니다. 여기의 내용은 크게 건드릴 필요 없습니다.
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
Groovy
복사
의존성을 관리하는 부분입니다. 여기에서 선언하게 되는 의존성은 maven과 유사하게 관리됩니다. 라이브러리 파일이 저장되는 폴더도 maven과 동일한 .m2 폴더입니다. 여기에 repositories 항목에 추가적인 외부 라이브러리 저장소를 지정할 수도 있습니다. 이 경우 각 회사에서 별개로 관리하는 저장소를 추가하는 등으로 회사 내부의 라이브러리 관리도 가능합니다.
Maven을 사용하던 Gradle을 사용하던, Spring Initilzr를 사용하게 되면 크게 설정할 부분이 많지 않습니다. 하지만 각 pom.xml 과 build.gradle 의 항목이 무슨 역할을 하는지 알아 두는 것은 앞으로 새로운 프로젝트를 하거나, 프로젝트를 확장해 나갈때 도움이 되니, 기본적인 항목만 알아두도록 합시다.