MMeshOps
마이크로서비스의 함정: 쪼개기 전에 알아야 할 아키텍처 설계
9예상 3중급

[요약] Part 2. 마이크로서비스로 가는 징검다리, 모듈러 모놀리스

Part 2. 쪼개기 전에 준비해야 할 모듈러 모놀리스의 핵심 내용을 불릿 포인트로 정리하고 복습하는 요약 회차입니다.

Part 2에서는 스파게티 모놀리스의 단점과 마이크로서비스의 복잡성을 모두 해결할 수 있는 강력한 대안, 모듈러 모놀리스(Modular Monolith)에 대해 학습했습니다. 이 에피소드에서는 서버를 물리적으로 쪼개지 않으면서도 시스템을 깔끔하게 유지하기 위해 반드시 지켜야 할 아키텍처 설계 원칙들을 핵심 위주로 빠르게 복습합니다.

1. 모듈러 모놀리스의 개념과 장점

  • 서버는 하나, 코드는 분리: 물리적인 서버 인프라는 1개로 단순하게 유지하면서, 내부 코드는 마이크로서비스처럼 도메인별로 완벽하게 격리하는 아키텍처 패턴입니다.
  • 분산 시스템의 고통 제거: 네트워크 지연(Latency), 분산 트랜잭션, 복잡한 로깅 추적 등 마이크로서비스의 고질적인 인프라 문제를 겪지 않습니다.
  • 안전한 확장성 확보: 모듈이 잘 격리되어 있으므로, 훗날 트래픽이 몰릴 때 필요한 모듈만 쉽게 분리하여 마이크로서비스로 전환할 수 있는 '징검다리' 역할을 합니다.
  • 바이브코딩 최적화: 코드가 한 저장소에 모여 있고 모듈 경계가 명확하여, AI가 전체 시스템을 망가뜨리지 않고 특정 모듈의 컨텍스트에 집중해 코드를 작성하기 좋습니다.

2. 도메인 주도 설계와 코드 경계 설정

  • 비즈니스 도메인 기준 분리: `controllers`, `services` 같은 기술적 계층이 아니라 `users`, `payments`, `orders`와 같은 비즈니스 기능(도메인) 단위로 최상위 폴더를 구성해야 합니다.
  • 바운디드 컨텍스트(Bounded Context): 모든 곳에서 쓰는 거대한 범용 모델(예: 거대한 Product 클래스)을 만들지 말고, 각 모듈의 문맥에 맞게 작게 분리된 데이터 모델을 각각 정의해야 합니다.
  • 직접 참조 금지: 다른 모듈의 내부 함수나 내부 클래스를 절대 `import` 해서는 안 되며, 린트(Lint) 도구를 활용해 이를 엄격하게 강제해야 스파게티 코드를 막을 수 있습니다.

3. 데이터베이스 분리와 독립성 보장

  • 테이블 소유권 독점: 특정 데이터베이스 테이블은 반드시 하나의 담당 모듈만이 쓰고 읽어야 합니다. 다른 모듈이 남의 테이블에 직접 SQL 쿼리나 ORM으로 접근하는 것은 최악의 안티 패턴입니다.
  • 외래 키(Foreign Key) 제약 최소화: 모듈을 넘나드는 외래 키를 걸면 모듈 간 강결합이 발생하므로 데이터베이스 레벨의 참조 무결성보다는 애플리케이션 레벨의 처리를 지향합니다.
  • 조인(Join) 대신 인메모리 조합: 거대한 JOIN 쿼리 대신, 각 모듈에서 독립적으로 데이터를 가져온 후 백엔드 서버의 메모리 상에서 데이터를 조립(In-Memory Join)하는 방식을 사용해야 합니다.

4. 내부 API와 통신 설계

  • 퍼블릭 인터페이스(Inbound Port): 각 모듈은 외부 모듈과 소통하기 위한 공식적인 API 파일(Facade 등) 단 하나만을 열어두고, 내부 구현의 복잡성을 완벽하게 숨겨야(캡슐화) 합니다.
  • 동기 통신 vs 비동기 통신:
  • 즉각적인 결과 확인과 강력한 트랜잭션이 필요할 때는 공개 인터페이스 함수를 직접 호출(동기식)합니다.
  • 실행 시점의 결합도를 끊고 독립적인 흐름을 유지하려면 시스템 내부 이벤트 발행/구독(Event-Driven) 방식을 사용합니다.
  • 마이크로서비스로의 전환 준비: 내부 API와 이벤트로 잘 설계된 시스템은, 향후 코드를 뜯어낼 때 로컬 함수 호출을 HTTP API나 카프카(Kafka) 통신으로 살짝만 교체하면 매끄럽게 분리될 수 있습니다.

성공적인 모듈러 모놀리스 설계 체크리스트

  1. 결제 로직을 수정했는데 주문 코드가 망가지는가? (Yes라면 실패)
  2. 회원 모듈이 주문 테이블에 직접 Select 쿼리를 날리는가? (Yes라면 실패)
  3. 상품 정보를 가져오기 위해 카탈로그 모듈의 5개 내부 클래스를 다 알아야 하는가? (Yes라면 실패)
  4. 특정 모듈 폴더 하나만 복사해서 새 서버로 옮겨도 동작할 수 있는가? (Yes라면 성공)

개념 퀴즈

퀴즈 답을 맞춰야 학습 완료가 됩니다.

다음 중 모듈러 모놀리스의 핵심 설계 원칙을 올바르게 설명한 것을 고르시오.

3줄 요약

  1. 1모듈러 모놀리스는 서버 인프라 복잡도를 늘리지 않고도 마이크로서비스 수준의 코드 품질과 독립성을 확보하는 아키텍처입니다.
  2. 2비즈니스 도메인 단위로 폴더를 나누고, 데이터베이스 스키마와 테이블 접근 권한까지 완벽하게 분리해야 합니다.
  3. 3내부 인터페이스와 이벤트 기반 통신을 통해 모듈 간 결합을 끊어내면, 향후 필요할 때 언제든 안전하게 마이크로서비스로 전환할 수 있습니다.