MSA 프로젝트를 진행하면서,
폴더 구조에 대한 고민을 많이 해왔다.
보통 나는 Spring initializer 를 통해서 스프링 프로젝트를 만들고 다운받아서 사용하는 편인데
MSA에서는 그 프로젝트를 여러개 만들어서 관리해야 하나? 라는 의문점이 들었다.
모노레포, 멀티레포
현재 진행하는 MSA 프로젝트 전, 또 다른 MSA 프로젝트에서는
실제로 하나의 폴더 안에 여러개의 프로젝트를 넣어서 관리하고 있었다.
이렇게 하면 치명적인 문제점이 있다.
1. 프로젝트를 생성할때 마다 공통 객체(글로벌에러, 공통응답 객체 등)를 복붙 해줘야 한다.
2. 각 프로젝트 마다 담당자가 다르면, 코드 컨벤션 통일이 어렵다.
3. 각 프로젝트 별로 사용하는 모듈 및 버전이 달라질 수 있다.
지금 까지 설명한 개념은,
각 도메인 및 기능 시스템을 하나의 레포지토리로 만들어서, 여러 레포지토리를 운영하는 "멀티레포" 방식이다.
이렇게 멀티레포 방식으로 진행하다가 관리하기가 힘들어서 새로운 프로젝트에서는 멀티모듈 방식을 사용해보기로 했다.
추가적으로, 여기서 멀티 레포와 반대되는 개념인, "모노레포"가 있는데
모노레포는 우리가 평상시 모놀리식 구조로 개발할 때 자주 사용하는 방식이다.
하나의 저장소 안에 여러 프로젝트나 모듈을 통합해서 관리하는 방식으로, 모든 코드가 한 곳에 모여 있는 방식으로 생각하면 된다.
멀티모듈을 사용하게 된 이유
멀티모듈이란, 하나의 큰 프로젝트를 여러 개의 모듈로 나누어 관리하는 방식을 말한다.
이 방식은 프로젝트의 복잡성을 줄이고, 유지보수를 용이하게 하며, 재사용성을 높이는 데 도움이 된다!!

아무래도 멀티모듈 방식을 사용하는 이유는 프로젝트 유지보수, 재사용성이 가장 큰 이유가 아닐까?
해당 이유만으로도 수많은 프로젝트를 관리해야하는 MSA에서 멀티모듈을 도입해야겠다고 생각했다.
나는 아래와 같이 각 서비스별 모듈 만들고, 각 모듈에서 공통적으로 사용하는 코드를 Common 모듈로 만들어두었다.
이러면 각 모듈별로 각자의 기능만 유지보수를 해주면 되고, 공통 코드는 common 모듈로 만들어서 각 모듈에서 사용해주면 된다!!
(Common 모듈을 각 모듈에서 사용하기 위해서는 bootjar, jar 설정을 해주어야 하는데, 그건 따로 찾아보시길!!)

그리고 각 모듈을 생성할 때, 주의할 점은 src와 build.gradle 파일만 남겨두어야 하는데 (gitattributes, .gitignore 등등 삭제)
나머지 파일은 필요가 없기도하고, 나중에 하위 모듈에서 빌드할때, 문제가 발생할 수 있다.
(아래 그림과 같이, 해당 폴더를 제외하고 모두 삭제!)
주의할 점
모듈이 너무 많아지면, 각 모듈들이 서로 의존관계를 가질 수 있기 때문에 주의하면서 설계를 해야한다.
그리고, Common 모듈에 각 서비스별로 겹치는 의존성, 핵심 로직 등을 계속해서 추가하다 보면,
Common 모듈은 나중에는 돌이킬 수 없이 커지게 될 것이고, 나중에는 Common에서만 개발하고 있는 나 자신을 발견하게 될 것이다.

Common 모듈이 공통 코드를 관리해서 재사용성을 높여주는 것은 좋지만,
그만큼 Common 모듈은 모든 모듈에 영향을 끼치게 되고,
리팩토링을 진행해도 모든 모듈에 영향을 끼쳐서 어떤 부분에서 장애포인트가 발생할지 가늠할 수 없다.
그러니 조심하면서 멀티모듈 개발을 하자!
'Back-End' 카테고리의 다른 글
Kafka를 사용하는 이유 (0) | 2025.03.28 |
---|---|
MSA에서 SAGA Pattern을 사용하는 이유 (0) | 2025.03.28 |
Path Variable과 Request Param 의도는 다르다 (차이점) (0) | 2025.03.19 |
대규모 시스템을 설계하기 전에 고려해봐야 할 것들 (0) | 2025.03.12 |
MSA란 무엇일까? (spring cloud, eureka, feignclient, ribbon, resilience4j (0) | 2025.02.15 |