인트로

최근 개발 연합 동아리에서 새로운 프로젝트를 시작했다.

프로젝트 세팅부터 시작해야되는 상황이라 패키지 구조를 어떻게 가져갈까 고민하던 중 멀티 모듈을 적용해보기로 했다.

 

이전에 이미 멀티 모듈로 구성된 프로젝트에 들어가 개발을 해본 적은 있었으나 세팅부터 들어간 적은 처음이라

멀티 모듈 적용이 적절한 상황인지, 의미가 있을지에 대한 판단부터 필요했다.

그 과정에서 여러 레퍼런스들을 참고하며 많은 고민을 했는데,

입문자를 위한 레퍼런스가 적어 나와 같이 처음 멀티 모듈을 도입하는 사람들에게 내가 겪은 경험과 고민을 공유하고자 글을 쓰게 됐다.

 

멀티 모듈이란?

하나의 서비스나 프로젝트를 여러 개의 모듈로 나누어 개발하는 것

각 모듈을 독립적으로 빌드하고 배포할 수 있고, 다른 모듈과 의존성을 가지며 연결시킬 수 있다.

 

즉, 각각의 모듈들 중 필요한 모듈들만 의존성으로 연결해 원하는 서비스를 만들어낼 수도 있으며 여러 모듈이나 프로젝트에서 동일한 모듈을 중복 사용하며 코드의 중복을 피할 수 있다.

각각의 기준에 맞춰 모듈들이 분리돼있으므로 유지보수가 쉽다는 장점도 있다.

 

이 개념을 처음 알게 됐을 때 객체지향의 개념과 유사한 느낌을 받았다.

 

멀티 모듈 쓸까? 말까? 

멀티모듈은 보통 대규모 프로젝트에서 많이 쓰인다고 한다. 

모듈 단위로 개발을 분할하면 개발자들은 보다 집중적으로 각자 맡은 모듈을 개발할 수 있으며

모듈들을 쉽게 조합해 사용할 수 있기 때문에 프로젝트 확장성이 좋기 때문이다.

 

지금하고 있는 프로젝트가 3개월 안에 기획과 출시가 끝나야하는 말그대로 사이드 프로젝트라

멀티모듈을 적용할만한 사이즈인가 의문이 들었다.

처음에는 디렉토리만 잘 나누면되고 멀티 모듈까지 필요가 없다 생각해 적용을 안하려고 했다.

하지만, 기획 회의를 한 후 서비스가 점진적으로 더 규모가 커질 가능성이 있고

모듈로 분리돼있는 특성상 코드들의 응집성이 높아 개발할 때도 충분한 이점이 있다는 생각이 들어 도입하기로 했다.

 

모듈 분리 기준

그래, 멀티 모듈 좋네. 근데 이거 적용하려면 뭐 어떻게 나눠야하는거야? 

 

구글링으로 멀티 모듈 관련 글들을 쫙 봤는데 다들 멀티 모듈 적용하는 방법이나 적용 후 생겼던 문제점들을 해결하는 얘기만 있고 어떤 기준으로 모듈을 나눴는지에 대한 정보 찾기가 어려웠다.

그래서 멀티 모듈을 이미 구성한 글들, 깃헙 레포지토리들, chatgpt를 털어서 나름의 표준 기준을 역으로 분석했다.

 

결론부터 말하자면, 프로젝트의 특성과 개발자의 판단에 따라 다양한 기준이 존재했다.

정답은 없는 것 같으나 대체로 많이 보이는 구성은 존재했고 아래에서 설명한다.

 

먼저, 크게 도메인으로 나누거나 백엔드 개발의 관점에서 나누거나의 차이가 존재했다.

도메인 관점

예를 들어, 유저가 책을 주문하는 서비스의 경우 모듈을 유저, 책, 주문과 같은 형식으로 나누어 모듈을 분리한다.

도메인을 기준으로 나누는 것으로 DDD가 떠올랐다.

 

백엔드 개발 관점

이 경우 다시 또 2가지의 케이스가 존재했다.

 

첫 번째는 아키텍처를 기준으로 분리하는 것이다. 

예시로는 계층형 아키텍처를 사용할 경우 컨트롤러, 서비스, 레포지토리(+도메인)를 각각 다른 모듈로 분리한다.

 

두 번째는 관련된 서버(api 서버, 배치 서버 등)를 기준으로 분리하는 것이다.

예시로는 컨트롤러+서비스(api 서버), 레포지토리+도메인(db 서버), 배치 서버 등 관련된 서버를 기준으로 모듈을 분리한다.

 

이 중에서도 사이드 프로젝트에서 보통 많이 쓰는 구성은 백엔드 개발 관점에서 관련된 서버를 기준으로 분리하는 방식이었고

필자도 해당 방식을 택했다.

module-api (컨트롤러+서비스)

module-domain (레포지토리+엔티티)

module-infrastructure (외부 api)

module-batch (배치 서버)

 

여기서 좀 더 덧붙이면 core나 common과 같은 자주 쓰이는 모듈들이 존재하는데 이는 개발자의 판단에 따라 넣거나 다른 모듈에서 해당 기능들을 수행하면 될거라 판단한다.

얼마나 잘게쪼갤지도 개발자의 선택이었다.

 

common 모듈을 사용할 경우 아래 우아한 형제 블로그 글을 참고해 유의사항들을 인지 후 작업하면 좋을 것 같다.

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

 

멀티모듈 설계 이야기 with Spring, Gradle | 우아한형제들 기술블로그

{{item.name}} 멀티 모듈 설계 이야기 안녕하세요. 배달의민족 프론트 서버를 개발하고 있는 권용근입니다. 멀티 모듈의 개념을 처음알게 되었을 때부터 현재까지 겪었던 문제점들과 그것을 어떻게

techblog.woowahan.com

 

멀티모듈 적용법은 구글링하면 수두룩빽빽하게 나와서 글 하단에 참고했던 괜찮은 글들 링크로 대체한다.

작업하면서 팁이 있다면 주인장의 경우 인텔리제이에서 new module 기능을 사용해 모듈을 생성하려고하니 language로 kotiln이 안뜨는 에러가 있었고 구글링해보니 같은 오류를 겪는 사람들이 존재했으며 이슈로 등록돼있는 상태였다.

다른 방식으로 멀티모듈을 구성했고 아래 레퍼런스의 1, 2번째를 참고하면 된다.

 

다른 사람들이 이미 멀티 모듈을 구성한 레포지토리들을 보는 것도 많은 도움이 됐는데

주인장이 몇 개의 레포지토리를 특정해 올리는 것보단

깃헙에서 multimodule과 같은 검색어로 검색해 더 다양한 레포지토리를 비교해보시길 추천한다!

 

+기술 면접을 보면서 msa 아키텍처와 연관된 질문을 받았다.

멀티모듈은 무조건 msa이다 x 멀티모듈은 모놀리틱 아키텍처와 msa 둘다 적용가능하다. o

다만, 모놀리틱 아키텍처를 msa로 전환시 단일모듈보다 멀티모듈 구조가 전환에 더 친화적이라고한다.

 

+기술 면접을 보며 멀티모듈 얘기가 나왔는데 도메인으로 나누진않은거냐라는 질문을 받았다.

사이드프로젝트와 달리 해당 회사에선 도메인을 기준으로 분리하고있다는 뉘앙스로 질문을 주셨다.

참고하면 좋을 것 같다!

 

참고한 레퍼런스

https://www.youtube.com/watch?v=4dO2Wa2fAYI 

https://junuuu.tistory.com/627https://www.youtube.com/watch?v=4dO2Wa2fAYI

https://velog.io/@soyeon207/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8-%EB%A9%80%ED%8B%B0-%EB%AA%A8%EB%93%88-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0

https://velog.io/@tritny6516/Spring-Multi-Module

https://dkswnkk.tistory.com/691

https://velog.io/@msung99/%EB%A9%80%ED%8B%B0-%EB%AA%A8%EB%93%88Multi-Module-%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EA%B3%A0-%EC%99%9C-%EC%8D%A8%EC%95%BC%ED%95%A0%EA%B9%8C https://velog.io/@soyeon207/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8-%EB%A9%80%ED%8B%B0-%EB%AA%A8%EB%93%88-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0

 

 

 

+ Recent posts