Programming

Spring boot MSA 설계 (4) 멀티 모듈 구성하기

송코딩 songcoding 2024. 6. 21. 08:00

오늘 아티클은 내일 오전 8시에 오픈됩니다!!

찾아주셔서 감사드리구, 조금만 기다려주세요🫶🏻

 

 

 

안녕하세요 여러분~! 비가 올 것 같은 토요일입니다☔️

토요일 글은 처음인가요..?

 

뭔가 신선한거 같은걸요..?

 

 

지난 아티클에서 멀티 모듈이 왜 필요한지 알게 되었단 말이죠!!

기억 나시나요?

 

[언그래머] 여든아홉번째 아티클_Spring boot MSA 설계 (3) 멀티 모듈의 장점

안녕하세요 려어분~! (금요일이라 신남)김송아입니다.  또 다시 돌아온 금요일이에요🎉금요일!!!!!!!!!! 금!!!!요!!!!!!일!!!!!!!!!!   tmi.사실 프리랜서를 하고나서부터는 이렇게 금요일이 신나지

songacoding.tistory.com

 

그래서 오늘은 기다리고 기다리던 Spring boot 멀티 모듈 구현하기 시간입니다.

 

 

모듈이라 하면 독립적으로 배포될 수 있는 코드의 단위라 하였고,

그렇다는 건 하나의 프로젝트를 말하는 거다! 라고 알아왔죠?

 

그래서 우리는 일단 프로젝트를 생성하러 가겠습니다.

Root Module 1개와 Sub Module 2개로 구성해볼게요!

 

 

ps. 사실 지난 시간에 같이 그린 그림대로 구성하려면

Sub Module로 회원 서비스 1개, 상품 서비스 1개, 유틸성 패키지 1개 이렇게 총 3개 만들었어야 한답니다!

여러분들은 3개 만드셔도 되는거 알죠? (찡긋)

 

 

 

start.spring.io에 가서 다음 구성으로 Root Module을 하나 만들어보겠습니다.

특별한 건 없고 dependency에 Spring Web을 추가해봤어요.

 

 

Sub Module 2개는 이름만 달리 하고, dependency를 모두 제거하고 생성하도록 할게요!

(저는 이름을 a-module, b-module이라고 했습니다)

 

 

💡여기서 잠깐

🤔왜 Sub Module은 dependency를 모두 제거해도 되는 걸까요?

 

멀티 모듈은 Root Module과 Sub Module로 역할을 나눌 수 있습니다. 

Root Module이 Sub Module의 모든 설정을 대신 해준다고 생각해주시면 됩니다.

Root Module에 Sub Module로 포함되는 순간,

 

✔️ Root Module에게 Sub Module의 build와 setting을 맡긴다는 거죠!

 

이 부분에서 특히 오해하시는 부분이 있는데,

Root Module을 Sub Module이 받아가는 듯한 느낌을 갖고 계시더라구요?!

 

하지만 아닙니다.

Root Module은 Sub Module끼리 그런 역할을 할 수 있도록 울타리를 쳐주는 역할이라고 생각해주세요!!

✔️ Sub Module끼리 서로의 객체를 사용할 수 있는 것이 바로 멀티 모듈의 주요 특징입니다.

 

 

이제 Root Module이 되어줄 multi-module 프로젝트를 켜고,

드래그앤드롭으로 a-module과 b-module을 통째로 multi-module에 넣어주세요!

 

 

 

아직까지는 multi-module이 sub module들을 인식하지 못했네요!

이제 인식시켜보도록 할까요?

 

 

인식시키는 방법은 간단합니다!

root module의 settings.gradle에 다음과 같이 sub module을 적어주는 거에요.

'include 프로젝트명' 이렇게 적어주고 gradle을 새로고침 하면

 

root module이 인지하게 되고!!!

 

 

다시 프로젝트 구조를 보면, sub module들에 파란 네모 아이콘이 만들어진 것을 볼 수 있습니다.

(실행이 가능한 module 상태라는 뜻입니다)

 

 

 

그 다음 해주셔야 하는 일들은 딱 2가지 입니다.

 

첫번째. sub module들의 build.gradle과 setting.gradle을 모두 지운다.
                root module이 모든 설정을 대신 해줄겁니다!

두번째. root module의 build.gradle에서 다음과 같이 allprojects (또는 subprojects)라는 키워드로

            sub module들의 설정을 잡아준다.

 

 

(아래는 root module의 build.gradle 전체! 입니다)

plugins {
   id 'java'
   id 'org.springframework.boot' version '3.2.6'
   id 'io.spring.dependency-management' version '1.1.5'
}

repositories {
   mavenCentral()
}

allprojects {
   group = 'com.example'
   version = '0.0.1-SNAPSHOT'
   sourceCompatibility = '17'

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

   repositories {
      mavenCentral()
   }

   dependencies {
      implementation 'org.springframework.boot:spring-boot-starter-web'
      testImplementation 'org.springframework.boot:spring-boot-starter-test'
      testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
   }

   tasks.named('test') {
      useJUnitPlatform()
   }
}

 

 

오늘의 성공 지점은 이 곳입니다.

이제 sub module들을 실행하면, 각각 잘 실행되면 되세요!!!!

 

각 모듈에서 application 클래스가 잘 돌아간다면 성공이라는 겁니다!!🎉🎉🎉

 

 

+ 실행하는데 다음과 같은 에러가 나시는 분들은

FAILURE: Build failed with an exception.
 
* What went wrong:
Cannot locate tasks that match ':b-module:BModuleApplication.main()' as project 'b-module' not found in root project 'b-module'.

 

sub module들의 build.gradle과 settings.gradle을 안 지우신 겁니다!!!!

지우셔야 해요🔥

 

 

-

 

 

다음 시간에는 이제 드디어!!

sub module들끼리 서로의 객체를 사용할 수 있는 것을 build와 함께 알아보려해요!!

build.gradle의 키워드도 다시 볼 테니, 혼자 먼저 공부하고 오셔도 좋습니다!

 

고생 많으셨습니다~~~

 

 

 

마음만은 조용한 주말 되세요 여러분😊

 

감사합니다.

김송아 드림