본문 바로가기
dev/spring

Spring - Modulith

by igooo 2024. 6. 3.
728x90

개요

Spring Modulith를 사용하면 잘 구주화된 Spring boot 애플리케이션을 구축할 수 있고, 도메인 기반의 애플리케이션 모듈을 찾고 작업할 수 있도록 가이드 해준다.

DDD를 위한 구조적인 코드 검증 및 문서화.

모듈식 모놀리스 아키텍처는 단순성과 유지관리 용이성의 장점.

 

Spring Boot Structuring Code

Spring Boot does not require any specific code layout to work. However, there ar some best practices that help.

If you wich to enforce a structure based on domains, take a look at Spring Modulith.

 

Locating the Main Appcation Class

애플리케이션 클래스는 다른 클래스 위의 루트 패키지에 배치하는 것을 추천한다.

예제에서도 도메인 가반으로 패키지를 분리하도록 되어있습니다.

com
 +- example
     +- myapplication
         +- MyApplication.java
         |
         +- customer
         |   +- Customer.java
         |   +- CustomerController.java
         |   +- CustomerService.java
         |   +- CustomerRepository.java
         |
         +- order
             +- Order.java
             +- OrderController.java
             +- OrderService.java
             +- OrderRepository.java

https://docs.spring.io/spring-boot/docs/3.2.1/reference/htmlsingle/#using.structuring-your-code.locating-the-main-class

 

Spring Boot Reference Documentation

This section goes into more detail about how you should use Spring Boot. It covers topics such as build systems, auto-configuration, and how to run your applications. We also cover some Spring Boot best practices. Although there is nothing particularly spe

docs.spring.io

 

Spring-petclinic Example

스프링 petclinic 예제에서도 도메인 기반으로 패키지를 분리되어있다.

 

Spring Modulith 적용

dependency 추가

dependencies {
	// spring modulith
    implementation 'org.springframework.modulith:spring-modulith-starter-core'
}

dependencyManagement {
	imports {
    	mavenBom "org.springframework.modulith:spring-modulith-bom:#{springModulithVersion}"
	}
}

 

Code 작성 가이드

  • 도메인 기준으로 패키지를 분리한다.
  • 외부 모듈과 연동할 기능만 공개하고 나머지는 모두 Encapsulation.
  • 모듈간 순환 참조 금지
  • 모듈안에 서브 모듈 참조 금지

Unit Test로 검증 가능

class ModularityTests {

	ApplicationModules modules = ApplicationModules.of(Application.class);

	@Test
	void verifiesModularStructure() {
		modules.verify();
	}

	@Test
	void createModuleDocumentation() {
		new Documenter(modules).writeDocumentation();
	}
}

 

 

참고

https://docs.spring.io/spring-modulith/reference/1.1/