상세 컨텐츠

본문 제목

Gradle 멀티 모듈 프로젝트

SPRING

by jeonghojin 2022. 6. 9. 05:07

본문

독립적인 프로젝트가 두 개 혹은 N개가 있다고 가정할 때, N 개의 프로젝트에서 동일한 모델, 혹은 메서드가 추가될 경우가 있다.

예를 들어, 데이터베이스에 접근한다면 API 서버, 배치 서버 둘 다 Member라는 모델을 사용해서 DB에 접근해야 한다.

이 경우, API 서버에도 Member라는 모델을 생성하고, 배치 서버에도 Member라는 모델을 생성하게 된다.

중복 코드가 발생한 것이다. 모델이 아닌 메서드, dependency 등 설정에 대한 이야기이기도 하다.

 

이 경우, 멀티 모듈을 사용하여 프로젝트를 구성한다.


멀티 모듈이란?

오라클 자바 문서에서는 모듈을 패키지의 한 단계 위의 집합체이며, 관련된 패키지와 리소스들의 재사용할 수 있는 그룹이라고 정의하였다.

운영하던 서비스를 관리자 서버, 사용자 서버 분리하여 운영할 필요성이 있을 때, 하나의 모듈로 구현을 진행한다면, 각각 별도의 프로젝트를 만들고 많은 부분 코드를 [복사+붙여넣기] 를 통해 구현할 것이다.

이런 경우를 해결하기 위한 방식이다.


멀티 모듈 사용하는 이유

1. 코드의 중복을 줄일 수 있다.

 공통된 로직이 있는 여러 서비스를 운영하게 되었을 때, 공통된 부분을 모듈화하고, 이 의존성을 추가하여 공유할 수 있다.

2. 각 모듈의 기능을 파악하기 쉬워진다.

공통의 기능은 의존성 주입으로, 모듈별로 기능을 분리하여 작성하기 때문에, 코드의 이해가 쉬워진다.

3. 빌드를 쉽게 진행할 수 있다.

.gradlew :moduleName:build 의 명령어를 통해 빌드를 쉽게 진행할 수 있다. 멀티 프로젝트의 경우 별도로 빌드를 진행하는 반면 루트 프로젝트에서 각각의 모듈을 빌드할 수 있다.


멀티 모듈 만들기

https://start.spring.io/

 

루트 프로젝트

 

  • Gradle 프로젝트 생성

multi module 생성

  • 루트 프로젝트 > New > Module... 모듈 생성.(Gradle로 생성)

 

project 구조

  • 루트 프로젝트에 있던 src 삭제
  • 추가로 모듈 두개를 더 생성

setting.gradle

  • 모듈 생성 후, setting.gradle에 위와 같은 모듈이 추가된 것을 확인

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')
}
  • 기본적으로 gradle build 시 실행 가능한 jar 파일을 만드는데, commons 는 이를 자체적으로 실행시키지 않기 때문에 bootJar false, jar true로 설정을 추가한다.

module-api 의 build.gradle

  • 더보기
    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter-web'
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
    }

    test {
        useJUnitPlatform()
    }
  • module-api 는 api 서버 역할을 하기 때문에 web과 관련된 의존성을 추가한다.

루트 프로젝트 의 build.gradle

buildscript

 

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-apimodule-batchmodule-commons를 추가했다.

* 참고  : 는 디렉토리 path를 의미한다.

 

module-apimodule-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 형태로 묶어놓는다.

 


참고

더보기

https://velog.io/@sangwoo0727/Gradle%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%A9%80%ED%8B%B0-%EB%AA%A8%EB%93%88

 

Gradle을 이용한 멀티 모듈

안녕하세요, 이번 포스팅에서는 Gradle을 이용하여 멀티 모듈을 사용하는 부분에 대해 다루려고 합니다.틀린 부분이 있다면, 아래 댓글을 통해 알려주시면 감사드리겠습니다.코드는 이 곳에 있으

velog.io

https://velog.io/@mu1616/java-gradle-%EB%A9%80%ED%8B%B0%EB%AA%A8%EB%93%88-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0

 

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

https://velog.io/@yangju0411/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8-build.gradle-%EC%9E%91%EC%84%B1%ED%95%98%EA%B8%B0-%EA%B0%84%EB%8B%A8-%EC%A0%95%EB%A6%AC

 

스프링 부트 build.gradle 작성하기 간단 정리

스프링 부트 책을 보며 간단히 작성

velog.io

https://kotlinworld.com/323

 

[Gradle] Plugin이란 무엇인가? 플러그인 이해하고 Custom Plugin 만들기

Gradle Plugin이란? Plugin이란 Gradle Task의 집합이다. Gradle Task는 어플리케이션 빌드부터 테스트까지 다양한 작업을 수행하는 작업 단위를 뜻한다. *만약 Task에 대한 이해가 부족하다면 다음글을 참조

kotlinworld.com

 

 

 

관련글 더보기