Multi Module

Published on
3 mins read

Maven(maven) 멀티모듈( multi-module ) 활용

멀티 모듈이란?

한 프로젝트에 라이브러리처럼 사용 가능한 상태로 모듈들을 구성하고,

다른 모듈에서 사용할 수 있도록 설정하는 것을 말하는데요, 애플리케이션에서 여러 기능을 분할해서 여러 모듈로 나타낼 때 사용할 수 있습니다.


도입 이유

  • 초반 설계 시 우리 프로젝트는 각 기능의 성격이 뚜렷했다. admin(instagram-scheduler, kakao-scheduler)과 web을 실행 가능한 jar 파일로 각각 만들어 서버에 띄우기 위함과 insta관련 모듈들 kakao관련 모듈들 각 모듈들의 성격이 뚜렷해서 공통된 의존성이 별로 없이 각각 최소한의 의존성으로 분리시킬 수 있었다.

  • 멀티 모듈이 아닌 패키지로 구분했어도 admin과 web은 실행가능한 jar 파일로 각각 만들 수 있다. 하지만 필요없는 의존성을 가지게 된다. 관리 포인트가 늘어나게 된다. 자세히는 아래의 장점에서 확인하자. instagram-scheduler나 kakao-scheduler가 커졌을 때 유연하게 분리가 가능하다. 지금까지도 점점 커지고있는 admin관련 모듈들이 몸집이 더 거대해지면 똑 떼어서 실행 가능한 jar파일로 분리가 아주 용이하다. batch 모듈로 분리도 어렵지 않았을 것이다.

  • 프로젝트가 끝난게 아니다. 프로젝트가 더 커지면 MSA로 전환하기가 쉽다. 멀티 모듈은 모놀릭스와 MSA를 왔다 갔다 전환할 수 있게 해주는 구조가 되도록 도와준다. 쉽게 말하면 모놀릭스와 MSA로 언제든지 갈 수 있는 전략적 요충지 역할이다.


멀티모듈 장점

  • 재사용, 공유 할 수 있다. 멀티 모듈의 각 모듈들을 독립적이고 필요한 최소 의존성을 가지고 있기 때문에 다른 영향을 고려하지 않고 재사용이 가능하다. 만약 다른 프로젝트를 하는데 kakao API가 필요하다면 우리 프로젝트의 kakao-api 모듈을 의존성 추가해서 쉽게 재사용 할 수 있다. 반면 우리 프로젝트가 싱글 모듈이였다면 다른 프로젝트에서 우리 프로젝트 모듈 의존성을 추가할 수 없을 것이다. 해당 프로젝트에 쓸모없는 기능과 의존성이 너무 많기 때문이다.

  • 빌드를 쉽게 할 수 있다. 멀티 프로젝트의 경우에는 각 프로젝트마다 빌드를 해줘야 한다. 하지만 멀티 모듈은 최상위 모듈에서 전체 프로젝트를 빌드 할 수 있다는 점이 큰 장점이다. 모듈 별도 빌드와 테스트도 아주 큰 장점이다. 싱글 모듈인 경우에는 admin관련 기능만 수정했다해도 전체를 빌드해야한다. 전체 빌드 수행 시간과 한 모듈 빌드 수행 시간의 차이는 다들 잘 알것이다.

  • 변경으로 인한 영향 최소화. 버그를 발견하면 전체 시스템이 아닌 버그가 포함된 모듈만 업데이트하면 된다. 그로 인해 수정으로 인한 영향이 최소화 된다. 한 곳을 수정했는데 예상치 못한 곳에서 다른 에러가 터지는 불상사들이 다 얽히고 설킨 의존성 때문이다. 전체를 빌드, 재배포할 필요없이 편하게 버그 모듈만 빌드 재배포할 수 있는 장점도 있다.

  • 하나의 모듈을 업데이트할 때 관련 프로젝트 전체를 이해할 필요가 없다. 각 모듈이 갖는 책임과 역할이 명확해 리팩토링, 기능 변경 영향 파악하기가 쉬워졌기 때문이다. 우리 프로젝트를 처음 보는 사람이 kakao-scheduler를 수정한다면 전체 프로젝트를 이해할 필요없이 build.gradle에 가서 관련 모듈만 파악해도 충분하다.

  • 의존성을 최소화. 계속해서 언급했던 의존성 최소화이다. 의존성을 최소화하면 뭐가 좋을까? 앞서 언급했던 것들에서 생각해보면 우선 변경으로 인한 영향을 최소화할 수 있다. 즉 결합도가 낮아진다. 또한 각 모듈을 가볍게 유지해서 빌드 시간을 줄이고 생산성을 향상시킬 수 있다.

멀티모듈 단점

  • 멀티 모듈 학습에 대한 비용이 생긴다.

  • 익숙하지 않은 멀티 모듈로 인해 예상치 못한 에러가 나고 시간이 소요된다. 우리 프로젝트에서도 bootJar 설정 문제, implements/complie 문제 등이 있었음

  • 여러 모듈을 유지 관리하기가 더 어려울 수 있다. 많이 존재하고 충분히 문서화되지 않은 경우 필요한 의존성을 찾고 적는 것도 지루한 작업이 될 수 있다.

  • 기능이 추가될수록 처음 설계와 다르게 의존성이 꼬일 가능성이 높다.

참고사이트

  1. Spring Multi Module
  2. 멀티모듈 설계 이야기
  3. Maven Multi-Module Project 생성
  4. Maven 멀티 모듈 구성방법