MSA도 monolith도 아닌 제3의 선택, Spring Modulith
핵심 내용
여기어때는 Spring Modulith로 모듈 경계와 이벤트 흐름을 코드로 강제했다.
자세히 보기
서비스가 커질수록 monolith는 의존이 얽히고, MSA는 분산 복잡성이 커진다. 여기어때 상품개발팀은 그 중간 해법으로 Modular Monolith와 Spring Modulith를 택했다. Spring Modulith는 2022년 incubation을 거쳐 2023년 11월 1.0 GA가 나왔고, 현재 2.x 안정 버전까지 이어진다. 팀은 Spring Boot 3.4 위에서 1.3.x를 운영하며 Boot 4 전환 시 2.x로 올릴 계획이다.
모듈 경계는 @ApplicationModule과 allowedDependencies로 선언하고, ApplicationModules.of(...).verify()를 CI에 넣어 금지된 참조를 빌드 단계에서 막는다. 기본은 CLOSED지만 도입 초기는 OPEN으로 시작해 의존성 방향부터 고정하고, 공개 API는 @NamedInterface로만 노출한다.
모듈 간 통신은 트랜잭션 기준으로 나뉜다.
- 같은 트랜잭션 안에서 검증이 필요한 read는 query port를 직접 호출한다.
- 변경 이후 후속 처리는 이벤트로 발행하고 @ApplicationModuleListener로 커밋 후 비동기 처리한다.
- Search 모듈은 Room, RatePlan, RoomRate, CancellationPolicy, ChildPolicy의 변경 이벤트를 받아 read model을 갱신한다.
spring-modulith-events-jdbc는event_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-actuator와 spring-modulith-observability로 /actuator/modulith까지 확인한다.
이 한국어 요약은 AI가 자동으로 만들었습니다. 원문의 주장과 맥락은 원문에서 확인해 주세요. 저작권은 원저작자에게 있습니다.