Spring Modulith 1.3 부터는 애플리케이션 모듈 내부에 또 다른 모듈을 넣을 수 있는 중첩 모듈(Nested Modules) 기능을 지원해요.
하나의 거대한 모듈 안에서 논리적인 구조를 더 명확하게 나누고 싶을 때 아주 유용해요.
Example
├─ [example.order]
│ └─ OrderManagement.java
│
└─ [example.inventory]
├─ InventoryManagement.java
│
├─ [internal]
│ └─ SomethingInventoryInternal.java <-- 자식은 여기 접근 가능!
│
└─ [nested]
├─ package-info.java (@ApplicationModule)
├─ NestedApi.java
│
└─ [internal]
└─ NestedInternal.java <-- 부모는 여기 접근 불가!
중첩 모듈을 정의하려면, 중첩하고자 하는 패키지의 package-info.java 파일에 @ApplicationModule 어노테이션을 명시적으로 붙여주면 되요.
// example/inventory/nested/package-info.java
@ApplicationModule
package example.inventory.nested;
import org.springframework.modulith.ApplicationModule;
Nested Application Modules 에는 다음과 같은 규칙들이 있어요.
- 부모의 내부(Internal) 영역 접근 허용
자식 모듈(
nested) 안의 모든 코드는 부모 모듈(inventory)의 코드에 자유롭게 접근할 수 있어요. 심지어 부모의 내부 구현 공간인inventory.internal패키지에 있는 클래스(SomethingInventoryInternal)도 가져다 쓸 수 있어요. - 부모 및 형제 모듈의 API 접근 자식 모듈은 부모 모듈이나 동일한 부모 밑에 있는 다른 형제(Sibling) 중첩 모듈들이 노출한(API) 타입들을 사용할 수 있어요.
- 다른 최상위 모듈의 API 접근
자식 모듈이라 하더라도 엄연히 모듈의 규칙을 따르므로, 외부의 다른 최상위 모듈(예:
order)이 노출한 API(OrderManagement)에 직접 접근해서 협력할 수 있어요.
장점
- 복잡한 모듈 내부의 설계를 부모-자식 관계의 계층형 모듈로 깔끔하게 나눌 수 있다.
- 자식 모듈이 부모 모듈의 내부 구현(internal)을 참고할 수 있어서, 계층 간의 유연한 협력이 가능하다.
단점
- 모듈의 계층이 깊어지면 아키텍처 구조를 이해하고 디버깅하는 데 더 높은 인지 부하(Cognitive Load)가 생길 수 있다.
- 모듈의 의존성 흐름이 부모-자식 간에 얽힐 위험이 있으므로 주의 깊게 설계해야 한다.
이 글에 대해 이야기해요
질문이나 다른 관점을 남겨 주세요.