애플리케이션의 메인 패키지는 메인 애플리케이션 클래스가 위치한 패키지에요. 메인 애플리케이션 클래스는 보통 다음과 같은 특징을 가지고 있어요.
package com.example.temp;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(ModularityStudyApplication.class, args);
}
}
@SpringBootApplication어노테이션이 붙어 있음.- 이를 실행하는 데 사용되는
main(…)메서드를 가지고 있음.
Spring Modulith 는 메인 패키지의 각 직속 하위 패키지를 하나의 애플리케이션 모듈 패키지로 간주해요.
각 애플리케이션 모듈 패키지가 하위 package를 포함하지 않는다면, simple application modules로 간주해요.
Example
╰─ src/main/java
├─ example
│ ╰─ Application.java
├─ example.inventory
│ ├─ InventoryManagement.java
│ ╰─ SomethingInventoryInternal.java
╰─ example.order
├─ OrderManagement.java
╰─ SomethingOrderInternal.java
이 방식에서는 Java Package Scope 를 사용해요.
// public이 없음! (package-private 상태)
class SomethingInventoryInternal { ... }
이렇게 SomethingInventoryInternal를 구성하면 example.order 폴더에서는 해당 클래스를 알 수 없고, 해당 클래스는 InventoryManagement.java 에서만 사용할 수 있어요.
반대로 example.order 과 example.inventory 는 협력을 해야할 때에도 있어요. 그런 경우에는 다음과 같이 클래스를 구성해야 해요.
// public을 붙임!
public class InventoryManagement { ... }
결국 public 클래스들이 모듈의 API, 즉, Provided Interface 가 되요
장점
Spring Modulith의 설정과 그 외 툴을 따로 설정하지 않아도 자바 컴파일러를 통해 캡슐화가 가능하다.- 낮은 복잡도
public를 통한 직관적인 api
단점
- 비즈니스 로직이 복잡해지면, 파일 관리의 어려움.
public클래스 생성 남발 시 경계가 모호해짐.
이 글에 대해 이야기해요
질문이나 다른 관점을 남겨 주세요.