AI Briefing

MSA도 monolith도 아닌 제3의 선택, Spring Modulith

·2026.05.19 15:16

여기어때는 Spring Modulith로 모듈 경계와 이벤트 흐름을 코드로 강제했다.

서비스가 커질수록 monolith는 의존이 얽히고, MSA는 분산 복잡성이 커진다. 여기어때 상품개발팀은 그 중간 해법으로 Modular MonolithSpring Modulith를 택했다. Spring Modulith는 2022년 incubation을 거쳐 2023년 11월 1.0 GA가 나왔고, 현재 2.x 안정 버전까지 이어진다. 팀은 Spring Boot 3.4 위에서 1.3.x를 운영하며 Boot 4 전환 시 2.x로 올릴 계획이다.

모듈 경계는 @ApplicationModuleallowedDependencies로 선언하고, ApplicationModules.of(...).verify()를 CI에 넣어 금지된 참조를 빌드 단계에서 막는다. 기본은 CLOSED지만 도입 초기는 OPEN으로 시작해 의존성 방향부터 고정하고, 공개 API는 @NamedInterface로만 노출한다.

모듈 간 통신은 트랜잭션 기준으로 나뉜다.

  • 같은 트랜잭션 안에서 검증이 필요한 read는 query port를 직접 호출한다.
  • 변경 이후 후속 처리는 이벤트로 발행하고 @ApplicationModuleListener로 커밋 후 비동기 처리한다.
  • Search 모듈은 Room, RatePlan, RoomRate, CancellationPolicy, ChildPolicy의 변경 이벤트를 받아 read model을 갱신한다.
  • spring-modulith-events-jdbcevent_publication 테이블에 상태를 남겨 미처리 이벤트 재발행을 가능하게 한다.

Stay Product Service는 property/shared를 Layer 0, room/cancellationpolicy/childpolicy를 Layer 1, rateplan/inventory를 Layer 2, roomrate를 Layer 3, rate를 Layer 4, search/booking을 Layer 5로 두고 참조 방향과 변경 빈도를 함께 통제했다. 각 모듈 내부는 hexagonal architecture로 짜고, 문서는 Documenter로 PlantUML과 AsciiDoc를 자동 생성한다. 같은 클래스명 충돌은 커스텀 BeanNameGenerator로 풀었고, 테스트는 Scenario API로 비동기 이벤트 흐름을 검증하며, spring-modulith-actuatorspring-modulith-observability/actuator/modulith까지 확인한다.

이 요약은 원문 이해를 돕기 위한 큐레이션입니다. 저작권은 원저작자에게 있으며, 정확한 내용과 맥락은 원문을 확인하세요.

요약 오류, 출처 표기 문제, 삭제 요청은 문의 · 건의로 알려주세요.