개발 일기

[Spring Boot] 멀티 모듈 (단일) 프로젝트 (Multi-Module Single Project): 역할과 책임이 명확한 모듈 설계 본문

Back-End/Spring

[Spring Boot] 멀티 모듈 (단일) 프로젝트 (Multi-Module Single Project): 역할과 책임이 명확한 모듈 설계

개발 일기장 주인 2024. 10. 10. 22:47

 

피우다 프로젝트라는 공모전의 본선에 붙게되어 실제 프로젝트에 적용시키기 전에 멀티 모듈을 왜 쓰는 것이 좋은지에 대해 알아보고자 작성하게됐다. 전에 개인적으로 멀티모듈 프로젝트를 구성해봤는데 그때 느낀점을 바탕으로 작성하고자 한다.

느낀점을 가독성을 포기하고 줄글로 쭉 풀어 써보고자 한다.


모듈(Module)이란?

우선 모듈이 뭔지 짚고 넘어가보자. 바로 독립적으로 운영될 수 있는 의미를 가지는 구성요소 단위

 

왜 멀티 모듈(Multi-Module)을 도입하는지 장점 살펴보기?

우선은 왜 사람들이 멀티 모듈 구조를 선택하려고 하는지 장점에 대해 고민해봤다.

사실 처음에는 MSA(마이크로 서비스 아키텍처) 처럼 독립적인 배포가 가능한 것도 아니고 더 복잡해지기만 하는 것만 같고 왜 써야하는지 이해가 안갔다. 그래서 다양한 래퍼런스와 개인 프로젝트를 진행하면서 느낀점을 정리해보게 됐다.

  1. 모듈화로 인한 코드 관리 효율성(유지보수성 및 가독성 향상)
    : 실제로 Fledge라는 자립 준비 청년을 돕는 프로젝트를 진행한 적이 있는데, 주요 기능 몇 가지만 구현해도 관련 도메인들이 너무 많아지고, 소스코드를 보면 내가 원하는 코드를 찾는 데 시간이 오래 걸리는 경험을 한 적이 있다. 그러나 멀티 모듈로 구성할 시에 아래와 같은 장점을 얻을 수 있다.
    • 유지보수 용이성: 모듈이 독립적이기 때문에 특정 모듈만 수정해도 전체 프로젝트에 영향을 주지 않도록 관리할 수 있다. 특정 기능을 개선하거나 수정할 때, 다른 모듈과의 의존성을 최소화할 수 있어 유지보수가 훨씬 용이해진다. 예를 들어, 배치 기능을 수정해야 하는 상황에서, 하나의 모듈 내에서 배치 관련 코드를 찾아 수정하는 것보다 배치 기능을 'module-batch'로 분리해 두면 관리가 훨씬 쉬워지고, 다른 모듈과의 의존성도 분리되어 있어 더 효과적인 유지보수가 가능한 것 같다.
    • 가독성 향상: 코드가 독립적인 모듈로 분리되면 프로젝트 구조가 명확해져 가독성이 높아진다.
  2. 의존성 분리(최소 의존성)로 각각의 모듈에 독립성 증가  협업 시 충돌 감소
    : 하나의 모듈로 개발할때 하나의 모듈안에 소스코드가 다 모여 있기 때문에 이는 협업 시에 충돌로 이어질 수 있다. 그러나 서로 다른 모듈로 분리하는 경우 독립적으로 개발될 수 있기 때문에, 하나의 팀에서 여러 팀원들이 각각의 모듈을 동시에 작업하면서도 충돌을 줄일 수 있다고 판단된다.
    • 의존성 분리로부터 비롯되는 독립성: 모듈 간 의존성을 최소화하면 각 모듈이 독립적으로 기능을 수행할 수 있게 된다. 이를 통해 각 팀은 자신이 맡은 모듈만 집중적으로 개발하고, 다른 모듈의 변화에 크게 신경 쓰지 않아도 된다. 이 과정에서 모듈 간 의존성이 분리되었기 때문에, 하나의 모듈 수정이 다른 모듈에 영향을 미치지 않아 협업 과정에서의 충돌 가능성을 감소시킬 수 있다.
    • MSA와의 차이점: 다만, 이 경우 멀티 모듈 구조는 MSA(Microservices Architecture)와는 차이가 있다. MSA에서는 각 서비스가 완전히 독립적으로 배포되고 운영될 수 있지만, 멀티 모듈 프로젝트는 각 모듈이 독립적으로 개발될 수는 있어도 배포는 전체 프로젝트 단위로 이루어진다
    • 성능적 이득은 없다: 우아한 기술 블로그 피셜 '자바에서 성능적으로 본다면 사실 그렇게 큰 성능 차이는 아닐 것 이다.'라고 했고 그래도 의존성 분리를 하지 않으면 무엇이든 끌어다쓸 수 있게 된다는 측면에서는 초기에는 빠르게 개발을 할 수도 있지만, 그로인해 만들어지는 스파게티 의존으로 점차 개발 생산성이 떨어진다고 햇다.
  3. 재사용성 증가(코드 중복 감소)
    : 사실 이 부분은 직접 경험하보진 못했지만 충분히 가능한 장점 같아 기록하게 됐다. 각 모듈이 독립적으로 개발되기 때문에, 동일한 모듈을 여러 프로젝트에서 재사용할 수 있다.
    • Utils(StringUtils, DateUtils, HttpClientUtils)
    • 공통 예외 처리(Custom Exception, Global Exception Handler)
    • ApiResponse 공통 응답 구조
    • Application Constants 공통 상수(AppConstants.DEFAULT_PAGE_SIZE 등)
    등 과 같이 매번 만들기 귀찮지만 다양한 프로젝트에서 공통적으로 쓰일 수 있는 코드들을 한번 만들어 놓고 모듈화 하여 따로 빼놓으면 여러 새로운 프로젝트에서 해당 모듈을 가져다 사용하는 것이 간편해질 수 있다고 판단된다.

  4. 역할 및 의존성 분리를 통해 시스템의 분리 및 통합을 유연하게 만들어 준다. by 권용근

추후에 멀티 모듈을 실제 프로젝트에 적용하면서 어떻게 모듈을 분리하면 좋을지 추가 포스팅을 통해 정리할 예정이며 추가적인 장점 등은 해당 게시글에 추가하도록하겠다.