gony-dev 님의 블로그

3. Maven에서 Gradle 본문

Goorm x Kakao Project/1회차 프로젝트

3. Maven에서 Gradle

minarinamu 2024. 12. 18. 11:01

지난 번에는 MSA 환경을 적용해보기 위해 MSA의 구조와 작동 원리를 학습하고 간단한 실습을 진행해보았다.
이제 본 프로젝트에 적용하기 위해 한 단계씩 나아가보도록 하자!

 

프로젝트를 진행하기 위해서는 사전 작업이 필요하다.

본 "piggyMetrics" 프로젝트를 살펴보면 maven으로 작업한 것을 볼 수 있는데 우리는 이것을 gradle로 변경할 계획이다.

Why Gradle?

단순히 Gradle로만 작업을 해왔다기에는 개발자로서의 체면이 서질 않는다.

Gradle이 더 편하다고 듣고 적용을 해왔지만 확실한 이유를 알고 싶어서 짚고 넘어가기로 하였다.

 

1. Maven과 Gradle

  • Maven과 Gradle은 빌드 관리 도구로 사용된다.
  • 소스코드 파일을 독립적인 형태로 변환하여 컴퓨터에서 실행할 수 있도록 한다.
  • 빌드 관리 도구로써 외부 라이브러리도 사용을 하는데 이때 사용자가 관리할 필요 없이 필요한 라이브러리들을 자동으로 관리한다!

2. Maven vs Gradle

Gradle을 선호하는 이유는 다음과 같다.

  1. 빌드 스크립트
    • Maven은 XML 파일 형식을 통해 설정을 사용하기 때문에 설정 항목이 많아질수록 가독성이 떨어진다.
    • Gradle은 Groovy나 Kotlin 기반으로 빌드 스크립트를 작성하기 때문에
      빌드 과정을 유연하고 가독성있게 작성하는 것이 가능하다!
  2. 캐싱
    • 아마 가장 큰 차이일 수도 있다. Gradle은 캐싱 기능을 사용할 수 있어서 변경 사항이 있을 시
      그 부분만 빌드하고 나머지는 재사용함으로써 시간을 단축할 수 있다.
  3. 의존성
    • Gradle은 의존성 관리가 탁월하여 멀티 모듈 프로젝트 시에 유용하다!
    • MSA에서 큰 이점을 발휘하는데 공통된 의존성을 하위 프로젝트에 쉽게 적용하고 이를 재사용할 수 있다!
    • 우리는 Spring Cloud를 Gradle을 통해 의존성을 주입하여 코드의 비효율적인 반복을 방지할 수 있다!
  4. 선언형과 명령형
    • Maven은 선언형 접근을 지향하기에 진행되는 과정보다는 결과물을 중시하여 나아간다.
    • 마찬가지로 Gradle은 기본적으로 선언형이지만 명령형 접근도 사용할 수 있기에 과정을 구체적으로 정하여 
      복잡한 로직을 구현하기에 이점을 가진다.

Maven To Gradle

이제 Maven의 프로젝트들을 Gradle로 변형해보자!

먼저 gradle을 설치해주자.

brew install gradle
  • 성공적으로 gradle 설치가 완료되었다면 그 다음으로 터미널에 다음 명령어를 입력하자.
gradle init --type pom
  • 이제 xml 형식을 gradle 형식으로 변형하면 된다.
  • xml은 서브 모듈에 적용하는 코드까지 모두 내포되어 있기에 이를 변형하기 위해서는
    의존성을 추가하는 build.gradle, 그리고 서브 모듈을 포함한다는 settings.gradle을 구성해야 한다.

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.piggymetrics</groupId>
	<artifactId>piggymetrics</artifactId>
	<version>1.0-SNAPSHOT</version>
	<packaging>pom</packaging>
	<name>piggymetrics</name>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.3.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
		<java.version>1.8</java.version>
	</properties>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>${spring-cloud.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>
	
	<modules>
		<module>config</module>
		<module>monitoring</module>
		<module>registry</module>
		<module>gateway</module>
		<module>auth-service</module>
		<module>account-service</module>
		<module>statistics-service</module>
		<module>notification-service</module>
		<module>turbine-stream-service</module>
	</modules>

</project>

build.gradle

plugins {
    id 'org.springframework.boot' version '3.3.6'
    id 'io.spring.dependency-management' version '1.1.3'
}

allprojects {
    group = 'server'
    version = '1.0-SNAPSHOT'

    repositories {
        mavenCentral()
    }
}

ext {
    set('springCloudVersion', '2023.0.4')
}


subprojects {
    apply plugin: 'java'
    apply plugin: 'org.springframework.boot'
    apply plugin: 'io.spring.dependency-management'

    java {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }

    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter'
    }

    dependencyManagement {
        imports {
            mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
        }
    }
}
  • 이때 주의해야 할 점은 "dependencyManagement"이다. 이는 Spring Cloud Version을 각 서브 모듈에도 주입해주는데 이를 subprojects 외부에 선언할 경우 메인 모듈에만 적용되므로 반드시 subprojects 내에 선언해야 한다!

settings.gradle

rootProject.name = 'piggymetrics'

include 'config', 'monitoring', 'registry', 'gateway', 'auth-service', 'account-service', 'statistics-service', 'notification-service', 'turbine-stream-service'

 

사실 코끼리 모양만 누르면 빌드가 되긴 하는데 원활한 진행 과정을 살펴보기 위해 작성해 보았다..

그러면 최종적으로 다음과 같은 구조가 만들어진다!

그리고 나머지 서브 모듈도 gradle로 적용되어 각 서브 모듈에 있는 pom.xml을 build.gradle로 변경해주기만 하면 된다!

 

다음 포스팅에서는 gradle로 적용된 서브 모듈 프로젝트들을 리팩터링 해보겠다.

'Goorm x Kakao Project > 1회차 프로젝트' 카테고리의 다른 글

2. Spring Cloud MSA  (0) 2024.12.18
1. MSA를 사용하는 이유  (1) 2024.12.13