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) 통신으로 살짝만 교체하면 매끄럽게 분리될 수 있습니다.
성공적인 모듈러 모놀리스 설계 체크리스트
- 결제 로직을 수정했는데 주문 코드가 망가지는가? (Yes라면 실패)
- 회원 모듈이 주문 테이블에 직접 Select 쿼리를 날리는가? (Yes라면 실패)
- 상품 정보를 가져오기 위해 카탈로그 모듈의 5개 내부 클래스를 다 알아야 하는가? (Yes라면 실패)
- 특정 모듈 폴더 하나만 복사해서 새 서버로 옮겨도 동작할 수 있는가? (Yes라면 성공)
개념 퀴즈
퀴즈 답을 맞춰야 학습 완료가 됩니다.다음 중 모듈러 모놀리스의 핵심 설계 원칙을 올바르게 설명한 것을 고르시오.
3줄 요약
- 1모듈러 모놀리스는 서버 인프라 복잡도를 늘리지 않고도 마이크로서비스 수준의 코드 품질과 독립성을 확보하는 아키텍처입니다.
- 2비즈니스 도메인 단위로 폴더를 나누고, 데이터베이스 스키마와 테이블 접근 권한까지 완벽하게 분리해야 합니다.
- 3내부 인터페이스와 이벤트 기반 통신을 통해 모듈 간 결합을 끊어내면, 향후 필요할 때 언제든 안전하게 마이크로서비스로 전환할 수 있습니다.