Project/Buy me If you can

Buyme TIL240816 모노리스 서비스를 MSA 로 구조화하기 - 멀티모듈화 / (트러블슈팅) 콘텐츠 루트 충돌 문제

Albosa2lol 2024. 8. 17. 03:02

유저 / 상품 / 주문 으로 구성된 현재의 모노리스 서비스를 마이크로서비스로 분리하고, 각 마이크로서비스 간의 통신 및 데이터베이스 연동을 구현하고자 한다.

 

그러기 위해서, 첫번째로 멀티 모듈 디펜던시 관리를 하고자 하였다.

 

즉, 첫번째로 해야 할 작업은 모노리스 서비스를 멀티 모듈화 하는 것이다.

 

멀티 모듈 디펜던시 관리는 큰 규모의 프로젝트에서 모듈 간의 의존성을 체계적으로 관리하기 위해 필요하다.

 

모듈화는 코드의 재사용성과 유지보수성을 향상시키지만, 각 모듈이 서로 올바르게 의존하고 독립적으로 배포되려면 모듈 간의 의존성을 효과적으로 관리해야 한다. 여기서 모듈은 하나의 실행 또는 배포 가능한 어플리케이션 일 수도 있고, 특정 기능을 담은 컴포넌트일 수도 있다.

 

모든 코드를 user-service / product-service / order-service / app 으로 크게 네가지로 나누어서 멀티모듈화를 진행하였다.

리팩토링을 완료하였으나, 멀티 모듈로 인한 디팬던시 관리가 되어야 하는데 관리가 되지 않았다.

 

롬북등이 정상적으로 실행되지 않았기에, 직접적으로 모듈을 이어주려고 하였다.

 

File > Project Structure > Modules

여기서 각 디팬던시가 루트 build.gradle 을 상속받게 하기 위해서, 각 멀티 모듈을 클릭하고 Dpendencies 를 클릭

 

여기서 + 를 클릭 후 , 루트 모듈인 buyme 를 추가하였다.

 

이후 ok를 누르면 완료가 되는데, 여기서 오류가 발생했다.

"Content root '/Users/gimhuiseog/IdeaProjects/buyme/app' is defined for modules 'app' and 'buyme.app'. Two modules in a project cannot share the same content root." ("콘텐츠 루트 '/Users/gimhuiseog/IdeaProjects/buyme/app'는 모듈 'app' 및 'buyme.app'에 대해 정의되어 있습니다. 프로젝트의 두 모듈은 동일한 콘텐츠 루트를 공유할 수 없습니다.")

 

오류의 원인 1  : 두 개의 모듈이 동일한 콘텐츠 루트를 공유하려고 시도할 때 발생한다. 즉, 두 개의 모듈이 동일한 디렉터리를 루트 디렉터리로 사용하려고 하고 있어서 발생하는 충돌이었다. 즉, 기존에 있던 모노리스 서비스 때문에 모듈 간에 충돌이 일어나는 것 이었다.

 

오류의 원인 2 : 루트 build.gradle 에 설정이 잘못되었다.

 

오류 해결 방법 1 기존에 있던 모노리스 서비스의 src를 삭제한다.

 

오류 해결 방법 2 루트 build.gradle 설정 오류

build.gradle 을 다음과 같이 설정했어야 했다.

 

루트 build.gradle 의 subproject 설정 부분

이를 통해, 하위 모듈들이 루트 build.gradle 을 상속받을 수 있게 되었다.