Spring Modulith의 모듈들은 기본적으로 닫힌(Closed) 상태에요. 즉, 우리가 노출하기로 결정한 API 패키지만 외부 모듈에 제공하고 나머지는 감추게 되죠.
하지만 거대한 레거시 애플리케이션에 Spring Modulith를 처음 적용할 때는 모든 내부 패키지를 감추는 것이 현실적으로 어려울 수 있어요.이럴 때 사용할 수 있는 것이 바로 Open Application Modules이에요.
애플리케이션 모듈을 열린 상태로 전환하려면, 모듈의 루트 패키지에 있는 package-info.java 파일에 다음과 같이 @ApplicationModule(type = Type.OPEN)을 선언해주면 되요.
// example/inventory/package-info.java
@ApplicationModule(type = ApplicationModule.Type.OPEN)
package example.inventory;
import org.springframework.modulith.ApplicationModule;
이렇게 모듈을 열린 상태로 선언하면 Verification 시 다음과 같은 변화가 생겨요:
- 다른 모듈에서 열린 모듈의 내부(
internal) 패키지에 있는 타입들에 마음대로 접근할 수 있게 되요. - 베이스 패키지와 그 아래의 모든 하위 패키지에 존재하는 타입들이
이름 없는 기본 인터페이스(Unnamed Named Interface)에 자동으로 추가되어 전체 노출되요. (단, 특정 인터페이스에 명시적으로 지정한 경우는 제외)Named Interface에 대해서는 3. Named Interfaces에서 다루고 있어요
**NOTE · > 이 기능은 기존 프로젝트의 코드베이스를 Spring Modulith가 권장하는 패키징 구조로 **점진적으로 이주(Migration)할 때 아주 유용해요.
장점
- 레거시 시스템을 모듈화 구조로 마이그레이션할 때 점진적인 접근이 가능해진다.
- 캡슐화를 당장 강제하기 힘든 복잡한 패키지 의존성을 일시적으로 우회할 수 있다.
단점
- 모듈화의 핵심인 정보 은닉(Capsulation)이 무너져 의존성이 복잡해질 수 있다.
- 장기적으로 열린 모듈 구조를 방치하면 모듈화 설계의 의미가 퇴색된다.
이 글에 대해 이야기해요
질문이나 다른 관점을 남겨 주세요.