본문 바로가기
TIL(Today I Learned)

Spring-Boot multi-module setting

by kkkdh 2023. 5. 23.
728x90

MSA는 여러 개의 모듈이 협력해 하나의 큰 기능을 수행하는 형태

MSA(Micro-Service Architecture)는 다른 것이 아니라 독립적으로 배포 가능한 여러 개의 모듈이 복합적으로 동작해서 하나의 큰 기능을 수행하는 서비스 형태를 의미한다고 이해했다.

(명확한 사회적 합의에 따른 정의가 별도로 존재하지 않는다)

 

MSA와 대비되는 개념으로는 Monolithic Architecture(모놀리식 아키텍쳐)가 존재하는데, 이 개념은 면접 질문으로도 나왔던 개념으로 소프트웨어의 모든 구성 요소가 하나의 프로젝트로 통합된 형태를 의미한다.

 

두 아키텍쳐 각각의 장단점이 있지만, 이 글에서는 SpringBoot로 빌드하는 프로젝트에서 MSA와 같이 multi-module project 구조를 만드는 과정을 기록하려 한다.

 

multi-module 구조를 만들고 싶었던 프로젝트는 “스프링으로 시작하는 리액티브 프로그래밍 - 황정식” 책의 예제 코드이다.

 

 

GitHub - bjpublic/Spring-Reactive

Contribute to bjpublic/Spring-Reactive development by creating an account on GitHub.

github.com

[코드는 위의 링크에서 다운로드 가능]

 

프로젝트의 구성은 다음과 같다.

  • part1
    • chapter1
    • chapter2
    • chapter3
      • spring-mvc-branchoffice
      • spring-mvc-headoffice
      • spring-reactive-branchoffice
      • spring-reactive-headoffice
    • chapter4
  • part2
  • part3

나의 목표는 chapter3 내부의 spring-mvc-branchoffice, spring-mvc-headoffice, spring-reactivce-branchoffice, spring-reactive-headoffice 네 개의 모듈을 동시에 실행해서 서로 통신을 주고 받는 예제 코드 실행 결과를 확인하는 것이었다.

 

그런데, 각 모듈마다 build.gradle은 다 있고 jdk version도 맞췄는데 뭐가 문제인지 각각의 module에서 필요한 라이브러리가 설치되지 않는 문제가 발생했다.


Spring Guide 문서를 통해 문제 해결

MSA의 개념에 대해서도 알고 있고, MSA로 구현된 프로젝트도 접해 보아서 별도의 세팅이 뭐가 필요한지 알지 못했는데 spring guide 문서를 읽으면서 해답을 찾을 수 있었다.

 

해결법은 바로, settings.gradle에서 다음과 같이 include 명령어를 통해 subdirectory structure를 구성해야 하는 것이었다. (이상하게도 코드에 계층 구조 설정이 안되어서 github에 배포되고 있었다)

gradle project는 위의 setting.gradle 파일을 활용해서 include project를 생성할 수 있고, include project를 통한 계층 구조 생성으로 multi-module 형태의 설계가 가능한 것이라고 한다.

 

root project의 하위 프로젝트들은 root project의 하위에 복사되어야 한다. 따라서 다음과 같은 구조를 갖는 것이었다.

 

chapter3 project 하위에 위치한 4개의 프로젝트를 확인할 수 있다.

이에 따라 chapter3 project의 setting.gradle에 다음과 같이 하위 프로젝트로 등록 (include를 이용)

rootProject.name = 'chapter3'

include('spring-mvc-headoffice')
include('spring-mvc-branchoffice')
include('spring-reactive-headoffice')
include('spring-reactive-branchoffice')

include할 때 포함되는 이름은 각각의 하위 프로젝트에서 rootProject.name으로 등록한 이름으로 작성해야 하는 것으로 보인다.

multi-module 구조로 등록이 가능했다.


참고

https://spring.io/guides/gs/multi-module/

https://en.wikipedia.org/wiki/Microservices

728x90

댓글