독립적인 프로젝트가 두 개 혹은 N개가 있다고 가정할 때, N 개의 프로젝트에서 동일한 모델, 혹은 메서드가 추가될 경우가 있다.
예를 들어, 데이터베이스에 접근한다면 API 서버, 배치 서버 둘 다 Member라는 모델을 사용해서 DB에 접근해야 한다.
이 경우, API 서버에도 Member라는 모델을 생성하고, 배치 서버에도 Member라는 모델을 생성하게 된다.
중복 코드가 발생한 것이다. 모델이 아닌 메서드, dependency 등 설정에 대한 이야기이기도 하다.
이 경우, 멀티 모듈을 사용하여 프로젝트를 구성한다.
오라클 자바 문서에서는 모듈을 패키지의 한 단계 위의 집합체이며, 관련된 패키지와 리소스들의 재사용할 수 있는 그룹이라고 정의하였다.
운영하던 서비스를 관리자 서버, 사용자 서버 분리하여 운영할 필요성이 있을 때, 하나의 모듈로 구현을 진행한다면, 각각 별도의 프로젝트를 만들고 많은 부분 코드를 [복사+붙여넣기] 를 통해 구현할 것이다.
이런 경우를 해결하기 위한 방식이다.
1. 코드의 중복을 줄일 수 있다.
공통된 로직이 있는 여러 서비스를 운영하게 되었을 때, 공통된 부분을 모듈화하고, 이 의존성을 추가하여 공유할 수 있다.
2. 각 모듈의 기능을 파악하기 쉬워진다.
공통의 기능은 의존성 주입으로, 모듈별로 기능을 분리하여 작성하기 때문에, 코드의 이해가 쉬워진다.
3. 빌드를 쉽게 진행할 수 있다.
.gradlew :moduleName:build 의 명령어를 통해 빌드를 쉽게 진행할 수 있다. 멀티 프로젝트의 경우 별도로 빌드를 진행하는 반면 루트 프로젝트에서 각각의 모듈을 빌드할 수 있다.
module-commons 의 build.gradle
bootJar {
enabled = false
}
jar {
enabled = true
}
dependencies {
implementation('mysql:mysql-connector-java')
implementation('org.springframework.boot:spring-boot-starter-data-jpa')
}
module-api 의 build.gradle
루트 프로젝트 의 build.gradle
buildscript {
ext {
springBootVersion = '2.7.0'
dependencyManagementVersion = '1.0.11.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
dependencies {
classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}"
classpath "io.spring.gradle:dependency-management-plugin:${dependencyManagementVersion}"
}
}
}
subprojects {
group('org.example')
version('0.0.1-SNAPSHOT')
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
sourceCompatibility = 11
repositories {
mavenCentral()
}
}
project(':module-api') {
dependencies {
implementation project(':module-commons')
}
}
project(':module-batch') {
dependencies {
implementation project(':module-commons')
}
}
subprojects 는 settings.gradle 에 include된 프로젝트를 전부 관리하는 공간이다.
이때 만약, 루트 프로젝트까지 적용을 하고 싶을 때는 subprojects 대신 allprojects로 등록하면 된다.
project() 는 하위 프로젝트의 의존성을 관리하기 때문에, module-api 와 module-batch에 module-commons를 추가했다.
* 참고 : 는 디렉토리 path를 의미한다.
module-api 와 module-batch 에서 module-commons 를 사용할 수 있게 된다.
ext :
build.gradle 내에서 쓸 전역 변수를 선언하는 키워드이다.
dependencies 에서 spring-boot-gradle-plugin을 전역 변수로 선언한 springBootVersion의 값으로 설정하여 의존성을 받는다.
repositories :
mavenCeltral()과 jcenter()는 오픈 소스 라이브러리를 저장하는 저장소로 이 프로젝트에서 해당 저장소를 사용해 라이브러리를 불러오겠다는 뜻이다.
jcenter저장소는 intellij에 작성하면 경고가 뜨는데 좀 있으면 서비스를 종료한다고 한다.
buildscript 밖의 dependencies에서 프로젝트 개발에 필요한 의존성들을 선언해준다.
compile 메서드 안에 라이브러리 명을 넣어 선언해준다. 버전을 명시할 수 있지만 명시하지 않아야 buildscript에서 작성한 spring-boot-gradle-plugin의 버전을 따라간다.
plugin :
미리 구성해놓은 task 들의 그룹이며 특정 빌드 과정에 필요한 기본정보들을 포함하고 있다.
프로젝트에 플러그인을 적용하면 플러그인이 프로젝트의 기능을 확장할 수 있다.
예를 들어, 안드로이드 어플리케이션을 개발하기 위해서는 필요한 라이브러리들을 받아온 후 해당 라이브러리들을 사용해 코틀린이나 자바코드를 컴파일하고, 컴파일된 바이트 코드의 묶음을 패키징 해 apk나 aab파일로 만들어야 한다.
추가적으로 DB 와 통신하는 부분들에 문제가 없는지, 서버와 통신하는 부분들에 문제가 없는지에 대한 테스트를 돌리기도 해야한다.
이러한 작업들을 일일히 Gradle 파일에 정의해놓으면 매우 비효율적이므로 이를 미리 안드로이드 개발사 인 구글이나 IDE 개발사인 JetBrains에서 미리 만들어 Plugin 형태로 묶어놓는다.
참고
Gradle을 이용한 멀티 모듈
안녕하세요, 이번 포스팅에서는 Gradle을 이용하여 멀티 모듈을 사용하는 부분에 대해 다루려고 합니다.틀린 부분이 있다면, 아래 댓글을 통해 알려주시면 감사드리겠습니다.코드는 이 곳에 있으
velog.io
java, gradle 멀티모듈 프로젝트 구축하기
얼마전에 멀티모듈 구조를 가지는 java 프로젝트를 시작하게 되었는데, 환경구축 과정에서 겪었던 내용들에 대해서 정리해보려고 합니다. 모듈 생성 방법 모듈 생성 자체는 매우 간단합니다. inte
velog.io
https://tecoble.techcourse.co.kr/post/2021-09-06-multi-module/
멀티 모듈 적용하기 with Gradle
이번 글에서는 프로젝트를 구성하는 데 있어 멀티 모듈 활용했을 때의 장점과 간단한 설정 방법을 알아본다. 멀티 모듈의 개념을 처음 접하는 사람들이 읽어보기를 추천한다.
tecoble.techcourse.co.kr
http://honeymon.io/tech/2019/06/17/spring-boot-2-start.html
[spring-boot] 스프링 부트 2.x 준비하는 개발자를 위한 안내서 - I'm honeymon(JiHeon Kim).
1 2 3 4 5 6 7 8 9 10 11 public static PageRequest of(int page, int size) { return of(page, size, Sort.unsorted()); } public static PageRequest of(int page, int size, Sort sort) { return new PageRequest(page, size, sort); } public static PageRequest of(int
honeymon.io
스프링 부트 build.gradle 작성하기 간단 정리
스프링 부트 책을 보며 간단히 작성
velog.io
[Gradle] Plugin이란 무엇인가? 플러그인 이해하고 Custom Plugin 만들기
Gradle Plugin이란? Plugin이란 Gradle Task의 집합이다. Gradle Task는 어플리케이션 빌드부터 테스트까지 다양한 작업을 수행하는 작업 단위를 뜻한다. *만약 Task에 대한 이해가 부족하다면 다음글을 참조
kotlinworld.com
의존성 주입(생성자 주입, 필드 주입, 수정자 주입) (0) | 2022.06.13 |
---|---|
gradle build.gradle compile, implementation 차이점 (0) | 2022.06.11 |
그레이들(Gradle) build.gradle (빌드 스크립트) (0) | 2022.06.08 |
메이븐(Maven) 다중 모듈 프로젝트 (0) | 2022.06.06 |
maven ignored pom.xml (0) | 2022.06.06 |