
여기어때가 모놀리스의 단순함과 MSA의 유연함을 모두 잡은 비결, 모듈러 모놀리스 실전 적용기
복잡한 분산 시스템의 비용 없이도 깔끔한 아키텍처를 유지할 수 있는 Spring Modulith의 핵심 기능과 실무 적용 사례를 다룹니다. 코드 수준에서 모듈 경계를 강제하고 문서화까지 자동화하는 현대적인 백엔드 설계 전략을 제안하며, 실제 '여기어때' 서비스에서의 운영 경험을 상세히 공유합니다.
시스템 복잡도가 올라가기 시작한 초기 스타트업이나, 운영 리소스 부족으로 MSA 도입을 망설이는 백엔드 엔지니어들에게 강력 추천합니다. 특히 Spring Boot 기반 프로젝트에서 아키텍처 가이드라인을 강제하고 싶은 시니어 개발자에게 실질적인 도움이 됩니다.
서비스가 성장하면서 모놀리스 아키텍처에서는 코드 간 의존성이 복잡하게 얽히는 'Big Ball of Mud' 현상이 발생하며, 이를 해결하기 위한 MSA는 분산 트랜잭션과 통신 비용 등 높은 운영 복잡성을 초래하는 문제가 있습니다.
Spring Modulith를 도입하여 단일 애플리케이션 내에서 모듈 간 경계를 명확히 정의하고, 테스트 코드를 통해 의존성 규칙을 강제하며, 트랜잭션 경계에 따른 직접 호출과 이벤트 기반 비동기 통신을 혼합하여 구현했습니다.
아키텍처 위반 사항을 CI 단계에서 자동으로 검증하여 코드 품질을 유지하고, PlantUML 기반의 자동 문서 생성으로 코드와 문서의 괴리를 제거했으며, 향후 서비스 분리가 용이한 구조적 유연성을 확보했습니다.
Trade-off
여러 모듈이 하나의 Spring Context를 공유하므로 Bean 이름 충돌 가능성이 있어 커스텀 BeanNameGenerator 등의 추가 설정이 필요하며, 도메인에 적합한 계층과 경계를 설계하는 초기 학습 및 설계 비용이 발생합니다.
Spring Boot 애플리케이션 내에서 모듈 간의 논리적 경계를 정의하고 의존성 규칙을 검증하며, 이벤트 기반 통신과 자동 문서화를 지원하는 프레임워크입니다.
단일 배포 단위(Monolith)의 장점인 단순함을 유지하면서, 내부적으로는 MSA처럼 각 모듈이 독립된 도메인과 인터페이스를 가지도록 설계한 아키텍처입니다.
Spring Modulith에서 제공하는 어노테이션으로, 트랜잭션 커밋 후 비동기적으로 실행되는 이벤트 리스너를 간결하게 정의합니다.




