← 모든 글
Spring

2-3. Nested Application Modules

Spring Modulith 1.3 부터는 애플리케이션 모듈 내부에 또 다른 모듈을 넣을 수 있는 중첩 모듈(Nested Modules) 기능을 지원해요.

by rati·

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 에는 다음과 같은 규칙들이 있어요.

  1. 부모의 내부(Internal) 영역 접근 허용 자식 모듈(nested) 안의 모든 코드는 부모 모듈(inventory)의 코드에 자유롭게 접근할 수 있어요. 심지어 부모의 내부 구현 공간인 inventory.internal 패키지에 있는 클래스(SomethingInventoryInternal)도 가져다 쓸 수 있어요.
  2. 부모 및 형제 모듈의 API 접근 자식 모듈은 부모 모듈이나 동일한 부모 밑에 있는 다른 형제(Sibling) 중첩 모듈들이 노출한(API) 타입들을 사용할 수 있어요.
  3. 다른 최상위 모듈의 API 접근 자식 모듈이라 하더라도 엄연히 모듈의 규칙을 따르므로, 외부의 다른 최상위 모듈(예: order)이 노출한 API(OrderManagement)에 직접 접근해서 협력할 수 있어요.

장점

  • 복잡한 모듈 내부의 설계를 부모-자식 관계의 계층형 모듈로 깔끔하게 나눌 수 있다.
  • 자식 모듈이 부모 모듈의 내부 구현(internal)을 참고할 수 있어서, 계층 간의 유연한 협력이 가능하다.

단점

  • 모듈의 계층이 깊어지면 아키텍처 구조를 이해하고 디버깅하는 데 더 높은 인지 부하(Cognitive Load)가 생길 수 있다.
  • 모듈의 의존성 흐름이 부모-자식 간에 얽힐 위험이 있으므로 주의 깊게 설계해야 한다.
끝까지 읽어주셔서 감사합니다.
DISCUSSION

이 글에 대해 이야기해요

질문이나 다른 관점을 남겨 주세요.