Project

[Project] 멀티 모듈을 왜 쓸까? (멀티 모듈 도입 전)

woo0doo 2024. 1. 15. 16:48

서론

IT 연합동아리 DND에 참가하게 되어서 새로운 사이드 프로젝트를 진행하게 되었습니다. 백엔드는 2명으로 이루어져 있는데, 소통을 하다보니 자연스럽게 이번 프로젝트에 대해 고민하게 되었습니다. 이번 프로젝트로 얻어가는 것으로 두가지 주제가 있었는데 하나는 멀티 모듈, 나머지 하나는 TDD 였습니다 ! 이번 글에서는 멀티 모듈에 대해 얘기해 보려고 합니다.


모듈은 무엇인가?

Oracle Java 문서에서 모듈이란 패키지의 한단계 위의 집합체이며, 관련된 패키지와 리소스의 재사용할 수 있는 그룹이라고 정의하고 있습니다.
이때 각 모듈은 독립적으로 개발, 빌드, 테스트, 배포가 가능합니다.

멀티 모듈

멀티 모듈 프로젝트는 상호 연결된 여러 개의 모듈로 구성된 프로젝트를 의미합니다. 즉 멀티 모듈 단일 프로젝트입니다.


멀티 모듈 왜 쓸까?

사실 백엔드 개발자라면 멀티 모듈은 지나가면서 한번쯤은 들어 봤을 것 같습니다. 들어보기만 했지 멀티 모듈이 왜 유행인지가 궁금했습니다. 그 이유는?

단일 모듈의 한계

  • 서로 다른 프로젝트에서 공통된 코드가 사용된다면, 코드를 복붙해서 사용해야한다.
  • 여러 프로젝트에서 사용하기 위해 IDE, 인스턴스를 N개 실행해야 한다.
  • 패키지끼리 의존성이 강해서 하나의 수정이 N개의 오류를 발생시킬 수 있다.

위의 그림처럼 Member라는 도메인이 Member API, Member Admin API, Member Batch 프로젝트에 모두 사용되고 있을 경우를 가정해봅시다. 만약 Member 도메인에 새로운 Column이 추가된다고 생각해봅시다. 그러면 Member API, Memeber Admin API, Member Batch를 각각 IDE를 띄워서 3개 모두 손수 수정해주어야 합니다. 위의 단일 모듈의 한계가 드러나는 단점입니다. 또 사람이 직접 변경하다보니 휴먼 에러의 가능성이 높아지게 됩니다.

 

만약 멀티 모듈을 도입하게 된다면?

 

우선 멀티 모듈의 장점부터 알아보겠습니다.

멀티 모듈의 장점

  • 중복 코드가 많이 사라진다.
  • 여러 프로젝트를 모듈화 시켜 하나의 IDE, 인스턴스에서 실행할 수 있다.
  • 각각의 모듈과 패키지가 독립적인 역할을 해서 의존성이 낮아진다.
  • 한가지 기능의 수정으로 모든 프로젝트를 빌드 할 필요가 없다. 수정한 기능 모듈만 리빌드 한다.
  • 디버깅에 용이하다. 버그가 발생했다면, 전체 시스템이 아닌 버그 발생 모듈만 검토한다.

멀티 모듈을 도입하게 된다면 Domain 단에 있는 Member만 수정 후 리빌드를 하면 전체에 적용이 됩니다. 

 

레이어 구상

 

참고:https://hyeon9mak.github.io/woowahan-multi-module/

 

위의 그림처럼 모듈간의 역할을 분명히 나누어야 멀티 모듈의 진가를 발휘할 수 있다고 합니다.

더 자세한 부분은 https://hyeon9mak.github.io/woowahan-multi-module/를 참고해주시면 됩니다.

 

 

여러 깃허브 레포를 간단히 살펴 본 결과를 토대로 정리한 build.gradle 입니다.

API(어플리케이션) 모듈에 들어가는 build.gradle

  • spring-boot-starter-web
  • security
  • redis
  • springdoc(스웨거)
  • 다른 모듈(도메인 모듈 or common)

도메인 모듈에 들어가는 build.gradle

  • db 연결
  • querydsl
  • 등등..

주의해야 할 점

  • 어플리케이션 모듈을 의존하면 안된다
  • 도메인 비즈니스 로직이 들어가는 모듈
  • 데이터 베이스에 연결되는 모듈
    • jpa
    • queryDsl
    • jdbcTemplate

Infra 모듈에 들어가는 build.gradle

주의해야 할 점

  • 다른 모듈에 의존할 수 없도록
  • 애플리케이션에서 runtimeOnly 로 실행시 포함
  • infra는 인터페이스가 존재하는 모듈을 complieOnly로 의존
  • 이렇게 의존관계를 가져가야 인프라에 있는 코드가 다른 모듈에 전염되지 않는다.

최상위 모듈 or common 모듈

  • lombok
  • test 관련

등등.. 위와 같이 정리할 수 있었습니다. 절대 이게 정답은 아니고, 각 팀마다 세운 규칙마다 나누는 방식이 많이 달라 직접 사용해보고 고민해봐야 느낌이 올 것 같습니다.


 

결론

간단하게 알아보았는데 장점이 명확했고, 왜 MSA와 함께 인기를 이끌고 있는지 어느정도 감이 온 것 같습니다. 단순해 보이지만 조금의 이해력 가지고 도입하면 오히려 복잡해진다는 안좋은 결과를 이끌 수도 있겠다는 생각이 듭니다. 역할을 잘못나누게 된다면 단일 모듈로 한 것보다 못할 것이라는 생각이 크게 들기도 합니다. 만약 도입하게 된다면 계층을 명확히 하는 게 중요한 부분이 될 것 같습니다.

 

후기를 작성할 기회가 있다면 바로 작성하겠습니다 !

 

참고:

https://techblog.woowahan.com/2637/

https://hyeon9mak.github.io/woowahan-multi-module/

https://hello-judy-world.tistory.com/204

https://jojoldu.tistory.com/123

https://cjw-awdsd.tistory.com/55