DevLog

엔지니어링 블로그를 한 곳에서 탐색하고, 최근 발행 흐름을 빠르게 파악할 수 있는 서비스 입니다.

Quick Links

  • Latest Feed
  • Engineering Directory

Support

  • 소개
  • 개인정보처리방침

Contribute

  • 원하는 블로그 추가 (준비 중)
  • Feedback

© 2026 DevLog Inc. All rights reserved.

본 사이트는 공개 RSS 피드를 통해 콘텐츠를 수집하며, 모든 콘텐츠의 저작권은 원저작자에게 있습니다.

Back to Feed
Read Original

Contents

Continue Reading

  • More from 여기어때
#Backend

MSA도, 모놀리스도 아닌 제3의 선택 — Spring Modulith

MSA도, 모놀리스도 아닌 제3의 선택 — Spring Modulith
01

Summary

MSA는 부담스럽고 모놀리스는 엉망이라면? 'Spring Modulith'가 답이다!

여기어때가 모놀리스의 단순함과 MSA의 유연함을 모두 잡은 비결, 모듈러 모놀리스 실전 적용기

복잡한 분산 시스템의 비용 없이도 깔끔한 아키텍처를 유지할 수 있는 Spring Modulith의 핵심 기능과 실무 적용 사례를 다룹니다. 코드 수준에서 모듈 경계를 강제하고 문서화까지 자동화하는 현대적인 백엔드 설계 전략을 제안하며, 실제 '여기어때' 서비스에서의 운영 경험을 상세히 공유합니다.

  • 01코드 리뷰 대신 CI 테스트로 아키텍처 의존성 위반을 실시간 자동 차단
  • 02동기식 직접 호출과 비동기 이벤트를 조합한 효율적인 모듈 간 통신 전략
  • 03event_publication 테이블을 통한 안정적인 이벤트 영속화 및 재처리 메커니즘 구축
  • 04헥사고날 아키텍처와 결합하여 모듈 내부와 외부의 의존성 방향을 모두 보호
  • 05Bean 이름 충돌 방지를 위한 커스텀 BeanNameGenerator 구현 사례 공유

+RECOMMENDATION

시스템 복잡도가 올라가기 시작한 초기 스타트업이나, 운영 리소스 부족으로 MSA 도입을 망설이는 백엔드 엔지니어들에게 강력 추천합니다. 특히 Spring Boot 기반 프로젝트에서 아키텍처 가이드라인을 강제하고 싶은 시니어 개발자에게 실질적인 도움이 됩니다.

The Problem

서비스가 성장하면서 모놀리스 아키텍처에서는 코드 간 의존성이 복잡하게 얽히는 'Big Ball of Mud' 현상이 발생하며, 이를 해결하기 위한 MSA는 분산 트랜잭션과 통신 비용 등 높은 운영 복잡성을 초래하는 문제가 있습니다.

The Solution

Spring Modulith를 도입하여 단일 애플리케이션 내에서 모듈 간 경계를 명확히 정의하고, 테스트 코드를 통해 의존성 규칙을 강제하며, 트랜잭션 경계에 따른 직접 호출과 이벤트 기반 비동기 통신을 혼합하여 구현했습니다.

The Result

아키텍처 위반 사항을 CI 단계에서 자동으로 검증하여 코드 품질을 유지하고, PlantUML 기반의 자동 문서 생성으로 코드와 문서의 괴리를 제거했으며, 향후 서비스 분리가 용이한 구조적 유연성을 확보했습니다.

Trade-off

여러 모듈이 하나의 Spring Context를 공유하므로 Bean 이름 충돌 가능성이 있어 커스텀 BeanNameGenerator 등의 추가 설정이 필요하며, 도메인에 적합한 계층과 경계를 설계하는 초기 학습 및 설계 비용이 발생합니다.

03

Key Concepts

Concept · 01

Spring Modulith

Spring Boot 애플리케이션 내에서 모듈 간의 논리적 경계를 정의하고 의존성 규칙을 검증하며, 이벤트 기반 통신과 자동 문서화를 지원하는 프레임워크입니다.

  • @ApplicationModule을 사용해 모듈의 가시성과 허용된 의존성을 명시적으로 선언함
  • verify() 메서드를 통해 아키텍처 규칙 위반 시 빌드를 실패시켜 품질을 강제함
Concept · 02

Modular Monolith

단일 배포 단위(Monolith)의 장점인 단순함을 유지하면서, 내부적으로는 MSA처럼 각 모듈이 독립된 도메인과 인터페이스를 가지도록 설계한 아키텍처입니다.

  • 모듈 간의 결합도를 낮추어 유지보수성을 높이고 향후 물리적 분리를 용이하게 함
  • 분산 시스템의 네트워크 비용과 복잡성 없이 MSA의 구조적 이점을 취함
Concept · 03

ApplicationModuleListener

Spring Modulith에서 제공하는 어노테이션으로, 트랜잭션 커밋 후 비동기적으로 실행되는 이벤트 리스너를 간결하게 정의합니다.

  • @TransactionalEventListener(AFTER_COMMIT)와 @Async의 조합을 단일 어노테이션으로 처리함
  • 발행 모듈의 트랜잭션 성공 여부에 따라 후속 처리를 독립적으로 수행하여 시스템 안정성을 높임
Continue reading · same source

여기어때More from 여기어때

View all posts from 여기어때
  • EKS 컨테이너 메모리 스파이크 추적기

    EKSPage CacheLogback
    3일 전
  • SRE 업무에 AI 녹여내기 — 2편: Alert Adviser로 장애 원인 분석 자동화

    GrafanaMCPSlack Bot
    6일 전
  • SRE 업무에 AI 녹여내기 — 1편: Smart RI Calc로 인프라 비용 산정 자동화

    SREAWS KarpenterCost Estimation
    6일 전
  • WebFlux 전환 부하 테스트를 다시 쓴 이야기

    WebFluxSpring BootLoad Testing
    1주 전
  • 데드락을 해결하려다, 락을 줄이게 된 이야기

    MySQL InnoDBDeadlockPessimistic Lock
    1주 전

Source

여기어때
여기어때
Engineering Blog

Published · May 19, 2026

Topics

Spring ModulithJavaArchitectureMicroservicesEvent-Driven