멀티 모듈

Java에서 모듈이란 패키지의 한 단계 위의 집합체이며, 독립적으로 배포될 수 있는 코드의 단위를 이야기 합니다.

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

그렇기에 멀티 모듈 프로젝트의 각 모듈은 전체 서비스의 구성요소로서 동작합니다.

 

각 모듈은 독립적으로 빌드할 수 있는 것이 특징입니다.

즉, 한 프로젝트에서 특정 모듈은 자바 스프링 스택을 사용할 때, 다른 모듈은 코틀린 스프링 스택을 사용할 수도 있습니다.

또는 스프링 부트 버전을 모듈마다 다르게 사용할 수 있습니다.

우아한 기술 블로그의 멀티 모듈 구성하기

우아한 기술 블로그에 의하면

모듈 자체에 대한 특징에서는 공통적으로 어떠한 특징이 있습니다.

  • 모듈은 독립적인 의미가 갖습니다.
  • 모듈은 어떠한 추상화 정도에 대한 계층을 가지고 있습니다.
  • 계층 간 의존 관계에 대한 규칙이 있습니다.

이러한 특징들을 우리가 설계해야할 시스템에 적용한다면 아래와 같은 시스템에서 가져야할 계층 구조가 정의됩니다.

 

  • 독립 모듈 계층
  • 도메인 모듈 계층
  • 내부 모듈 계층
  • 공통 모듈 계층
  • 어플리케이션 모듈 계층

이러한 정의된 계층 구조를 갖음으로써 모듈이 어디까지 책임과 역할을 가질 수 있는지를 명확히할 수 있고, 의존 관계 또한 최소화하여 최적화된 프로젝트를 만들어낼 수 있습니다.

1. 독립 모듈 계층(independently available)

시스템과 무관하게 어디에서나 사용 가능한 라이브러리 성격의 모듈이 있는 계층입니다.

언제든 대처할 탄탄한 라이브러리가 나온다면 이 모듈은 제거 될 것이므로, 나머지 모듈 계층과 의존 관계가 없어야합니다.

 

예를 들어 시스템, 도메인의 비지니스와 전혀 별개로 자체 제작한 라이브러리 모듈이 있습니다.

2. 공통 모듈 계층(system core)

모든 모듈에서 사용될 수 있는 모듈이 있는 계층입니다.

시스템 내 모든 모듈들이 의존할 수 있을만큼 얇은 의존성을 제공해야 하기 때문에 프로젝트 내 어떠한 모듈도 의존하지 않아야 합니다.

가능하다면 사용하지 않는 것이 좋습니다.

 

예를 들어 시스템에서 정말 많이 쓰이는 Type 성격의 DTO나 기본적인 Util Class가 있습니다.

3. 도메인 모듈 계층(system domain)

시스템의 중심 도메인을 다루는 모듈이 있는 계층입니다.

내부 모듈 계층과 비슷한 성격의 계층이지만 저장소와 밀접한 중심 도메인을 다루는 계층은 더 견고하고 특별하게 격리되고 관리되어야 하기에 분리되어야 합니다.

 

이 계층은 다음과 같은 원칙이 있습니다.

  • 서비스 비지니스를 모른다.
  • 하나의 모듈은 최대 하나의 인프라스트럭처에 대한 책임만 갖는다.
  • 도메인 모듈을 조합한 더 큰 단위의 도메인 모듈이 있을 수 있다.

프로젝트 안의 어떠한 실행 가능한 어플리케이션에서도 사용 가능한 모듈이 위치해야 합니다.

그러기 위해서는 저장소 외 시스템 특성을 알지 않아야 하기 때문에 내부 모듈 계층을 의존하지 않습니다.

 

4. 내부 모듈 계층(in system available)

저장소, 도메인 외 시스템에서 필요한 모듈들이 있는 계층입니다.

시스템 전체적인 기능을 서포트하기 위한 기능 모듈이 만들어질 수 있습니다.

 

이 계층은 다음과 같은 원칙이 있습니다.

  • 어플리케이션, 도메인 비지니스를 모른다.

이 계층 역시 프로젝트 안의 어떠한 실행 가능한 어플리케이션에서도 사용 가능한 모듈이 위치해야 하므로, 도메인 계층을 의존하지 않습니다.

5. 어플리케이션 모듈 계층(application)

독립적으로 실행 가능한 어플리케이션 모듈 계층입니다.

하위 모듈들을 조립하여 서비스 비지니스를 완성시킵니다.

모든 계층을 사용성에 따라 의존성을 추가하여 사용하게 됩니다.

모듈 계층의 의존 관계 흐름

 

 

다른 글의 프로젝트 모듈 구조

1. 컨트롤러단을 위한 모듈 - Presentation Layer

2. 서비스(비즈니스 도메인)을 위한 모듈 - Business Layer

3. 레포지토리(영속성 계층)을 위한 모듈 - Persistence Layer

4. 외부 코드와 통신하기 위한 코드 모듈

 

멀티 모듈의 장점

1. 모듈화와 재사용성 강화

멀티 모듈의 기능들은 독립적이며 각자 필요한 최소 의존성을 가지고 있기 때문에 재사용에 용이합니다.

2. 팀 간 협업 및 병렬 개발

여러 개발 팀이 동시에 작업할 수 있도록 지원하고 각 팀은 프로젝트의 특정 모듈에 집중하여 병렬로 개발함으로써 개발 생산성을 향상시키고 프로젝트 일정을 단축시킬 수 있습니다.

3. 빌드 및 배포의 용이성

각 모듈은 독립적으로 빌드가능합니다.

그렇기에 특정 모듈만 업데이트하고 다시 빌드하면 전체 시스템을 갱신이 됩니다.

이는, 빠른 개발 주기와 유연한 배포가 가능케 합니다.

4. 테스트 용이성

각 모듈은 독립적으로 테스트 가능합니다.

이는, 버그를 더 쉽게 식별하고 수정 가능케 합니다.

5. 확장성

새로운 기능을 추가한다면 하나의 모듈을 추가하기만 하면 되기 때문에 쉽게 구조 변경이 가능합니다.

마치며...

아직 글로만 보는 것으로 다 이해하지 못했지만, 어느정도 길잡이 역할을 해줄 수 있는 글들을 읽어보니 프로젝트마다 나눌 수 있는 모듈들이 다를 것이라는 생각이 들었습니다.

실제로 도메인 별로 나누는 경우도 있다고합니다.

즉, 가로 계층이 아닌 세로 계층인 것이지요.

제 글은 최소한 정보만 넣었기에 참고용으로 봐주시면 좋겠습니다.

참고블로그

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

 

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

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

techblog.woowahan.com

https://velog.io/@jonghyun3668/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8-%EB%8B%A8%EC%9D%BC-%EB%AA%A8%EB%93%88-%EC%BD%94%EB%93%9C%EC%97%90-%EB%A9%80%ED%8B%B0-%EB%AA%A8%EB%93%88%EC%9D%84-%EC%A0%81%EC%9A%A9%ED%95%98%EC%97%AC-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B5%AC%EC%A1%B0-%EA%B0%9C%EC%84%A0%ED%95%98%EA%B8%B0

 

스프링 부트 단일 모듈 코드에 멀티 모듈을 적용하여 프로젝트 구조 개선하기

기존 단일 모듈 코드를 멀티 모듈로 적용해보고 뜯어고쳐봅시다!

velog.io

 

'채워가는 지식 > Java' 카테고리의 다른 글

Arrays.asList()와 List.of() 차이  (0) 2024.02.20
객체 지향 설계 - 프로그래밍 관점  (0) 2023.11.30
객체 지향 설계 - 이론  (0) 2023.11.30
Java에 대해..  (0) 2023.09.27

+ Recent posts