Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- kakao
- codedeploy
- Docker
- spring
- backend
- 스터디
- orm
- CodeCommit
- backenddeveloper
- Spring Boot
- DynamoDB
- rds
- jpa
- mapping
- QueryDSL
- s3
- sqs
- 오블완
- 티스토리챌린지
- CICD
- 백엔드
- goorm
- serverless
- codebuild
- 자격증
- Redis
- 개발자
- aws
- ec2
- MSA
Archives
- Today
- Total
gony-dev 님의 블로그
3. Maven에서 Gradle 본문
지난 번에는 MSA 환경을 적용해보기 위해 MSA의 구조와 작동 원리를 학습하고 간단한 실습을 진행해보았다.
이제 본 프로젝트에 적용하기 위해 한 단계씩 나아가보도록 하자!
프로젝트를 진행하기 위해서는 사전 작업이 필요하다.
본 "piggyMetrics" 프로젝트를 살펴보면 maven으로 작업한 것을 볼 수 있는데 우리는 이것을 gradle로 변경할 계획이다.
Why Gradle?
단순히 Gradle로만 작업을 해왔다기에는 개발자로서의 체면이 서질 않는다.
Gradle이 더 편하다고 듣고 적용을 해왔지만 확실한 이유를 알고 싶어서 짚고 넘어가기로 하였다.
1. Maven과 Gradle
- Maven과 Gradle은 빌드 관리 도구로 사용된다.
- 소스코드 파일을 독립적인 형태로 변환하여 컴퓨터에서 실행할 수 있도록 한다.
- 빌드 관리 도구로써 외부 라이브러리도 사용을 하는데 이때 사용자가 관리할 필요 없이 필요한 라이브러리들을 자동으로 관리한다!
2. Maven vs Gradle
Gradle을 선호하는 이유는 다음과 같다.
- 빌드 스크립트
- Maven은 XML 파일 형식을 통해 설정을 사용하기 때문에 설정 항목이 많아질수록 가독성이 떨어진다.
- Gradle은 Groovy나 Kotlin 기반으로 빌드 스크립트를 작성하기 때문에
빌드 과정을 유연하고 가독성있게 작성하는 것이 가능하다!
- 캐싱
- 아마 가장 큰 차이일 수도 있다. Gradle은 캐싱 기능을 사용할 수 있어서 변경 사항이 있을 시
그 부분만 빌드하고 나머지는 재사용함으로써 시간을 단축할 수 있다.
- 아마 가장 큰 차이일 수도 있다. Gradle은 캐싱 기능을 사용할 수 있어서 변경 사항이 있을 시
- 의존성
- Gradle은 의존성 관리가 탁월하여 멀티 모듈 프로젝트 시에 유용하다!
- MSA에서 큰 이점을 발휘하는데 공통된 의존성을 하위 프로젝트에 쉽게 적용하고 이를 재사용할 수 있다!
- 우리는 Spring Cloud를 Gradle을 통해 의존성을 주입하여 코드의 비효율적인 반복을 방지할 수 있다!
- 선언형과 명령형
- 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 |