
모놀리식 아키텍처 (Monolithic Architechture)
- 마이크로서비스 아키텍처의 반대 개념으로, 애플리케이션의 모든 구성 요소가 한 프로젝트에 통합되어 있는 형태를 말합니다.
- 전통적인 개발 방식으로 하나의 프로젝트에 모든 기능을 함께 포함하기 때문에 기능이 많아질수록 개발 및 배포에 복잡성이 증가합니다.
- 단기/사이드 프로젝트, 프로토타입 제작 등 소규모인 경우에 적합합니다.
장점
- 개발 초기에 단순한 아키텍처 구조로 인해 개발에 용이
- 배포가 간단
- 확장성이 쉽고, 고가용성 서버 환경을 쉽게 구축 가능
- 필요한 모든 기능을 한 번만 호출하기 때문에 복잡한 통신 없이 직접 사용
단점
- 프로젝트 규모가 커짐에 따라 애플리케이션 구동 시간이 늘어나고 빌드 및 배포 시간이 길어짐
- 일부 기능을 수정하거나 업데이트를 하려면 전체 애플리케이션을 재배포해야 하므로 유지보수가 어려움
- 많은 양의 코드가 몰려 있어 개발자가 모든 코드를 이해하기 어려움
- 전체 애플리케이션 확장은 쉽지만 부하 분산을 위해 각 컴포넌트를 독립적으로 확장하기 어려움
MSA ?
- 대규모 애플리케이션을 작고 독립적인 서비스로 나누어 개발, 배포, 운영하는 아키텍처 방식입니다. 각 서비스는 독립적으로 개발되고 배포될 수 있으며 특정 기능을 담당합니다.
- 여러 개의 작은 서비스로 구성되어 각 서비스가 독립적으로 개발되고 배포되는 구조입니다.
- 전체 시스템이 분산되어 있어 개발과 배포가 독립적으로 가능하기 때문에 확장성과 유지관리가 용이합니다.
- 대규모 프로젝트, 시스템을 독립적으로 개발하고 확장해야 하는 경우에 적합합니다.
주요 특징
- 독립적 배포
- 독립적 스케일링
- 모듈화
- 다양한 기술 스택 허용
- API 통신
장점
- 배포 관점
- 서비스 간 개별 배포 가능
- 확장 관점
- 클라우드 사용에 적합
- 확장성 용이
- 장애 관점
- 장애가 전체 서비스로 확장될 가능성이 적음
- 유지 보수 용이
단점
- 성능 관점
- API 호출이 많아 비용 및 시간 증가
- 데이터 관리 관점
- 독립 구조로 데이터도 여러 서비스에 걸쳐 분산되므로 한 번에 조회가 어려움
- 트랜잭션 관점
- 서비스 별로 DB가 있기 때문에 트랜잭션 구현하기 어려움
MSA? 모놀리식?
어느 상황에 아키텍처를 사용해야 하는가?
- 비용
MSA 아키텍처를 도입할 경우 모놀리식 아키텍처에 비해 비용을 얼마나 절감할 수 있는지?
- 개발 생산성
- 시스템 복잡도가 높은가?
- 운영
- 개발 인력이 MSA를 관리할 수 있는가?
- 개발과 운영을 동시에 할 인프라가 구축되어 있는가?
- 배포
- 배포를 자주 하는가?

Inner Architecture
- 내부 서비스를 어떻게 잘 쪼개는지에 대한 설계
<고려해야할 부분>
- 마이크로 서비스를 어떻게 정의할 것인가?
- DB 접근 구조를 어떻게 설계할 것인가?
- 서비스 내 API를 어떻게 설계할 것인가?
Outer Architecture
1. External Gateway
- 전체 서비스 외부로부터 들어오는 접근을 내부 구조를 드러내지 않고 처리하기 위한 요소입니다. 사용자 인증(Consumer Identity Provider)과 권한 정책관리(Policy Management)를 수행하며 API Gateway가 여기서 가장 핵심적인 역할을 담당합니다.
- API Gateway는 서버 최앞단에 위치하여 모든 API 호출을 받습니다. 받은 API 호출을 인증한 후 적절한 서비스들에 메세지를 전달될 수 있도록 합니다.
2. Service Mesh
- 마이크로 서비스 구성 요소간의 네트워크를 제어하는 역할을 합니다.
- 서비스 간에 통신을 하기 위해서 Service Discovery, Service Routing, 트래픽 관리 및 보안 등을 담당하는 요소가 있어야 합니다.
- Service Mesh는 언급된 기능 모두 수행합니다.
3. Container Management
- 컨테이너 기반 어플리케이션 운영은 유연성과 자율성을 가지며 개발자가 손쉽게 접근 및 운영할 수 있는 인프라 관리 기술로 MSA에 적합하다는 평가를 받고 있습니다.
- 대표적인 컨테이너 관리 환경 : Kubernetes
4. Backing Service
- 어플리케이션이 실행되는 가운데 네트워크를 통해서 사용할 수 있는 모든 서비스
- MySQL과 같은 데이터베이스, 캐시 시스템, SMTP 서비스 등 어플리케이션과 통신하는 Attached Resource들을 지칭하는 포괄적인 개념
- 그 중 Message Queue는 MSA에서 메세지의 송신자와 수신자가 직접 토신하지 않고 Message Queue를 활용하여 비동기적으로 통신하는 것을 선호합니다.
- MSA를 적용한 프로젝트에서 장애가 발생한 경우
- 마이크로서비스 오케스트레이션이 진행되면서 새로운 마이크로 서비스를 생성/재생성 등의 작업을 진행하게 됩니다.
- 만약 Message Queue를 사용하지 않는 강한 결합 구조의 경우
- 여러 서비스를 걸치는 실시간 트랜잭션을 처리할 때 하나의 서비스가 죽어버린다면 트랜잭션이 끊어지기 때문에 해당 서비스 요청을 보존할 수 없고 큰 에러가 발생합니다.
- REST 통신으로 트랜잭션 실패에 대한 처리를 구현하는 것은 매우 복잡합니다.
MSA에서 데이터 변경이나 보상 트랜잭션과 같은 처리를 Message Queue를 활용한 비동기 처리가 효율적입니다.
5. Telemetry
- 실시간으로 먼 거리에서 원격으로 측정할 수 있다는 의미입니다.
- MSA에서는 상당수의 마이크로 서비스가 분산환경에서 운영되기 때문에 서비스들의 상태를 모니터링하고 이슈에 대응하는 시간이 오래 걸립니다.
- Telemetry는 서비스들을 모니터링하고 서비스별로 발생하는 이슈들에 대응할 수 있도록 환경을 구성하는 역할을 합니다.
6. CI/CD Automation
- 어플리케이션 개발 단계를 자동화하여 어플리케이션을 보다 짧은 주기로 고객에게 제공하는 방법
- 지속적인 통합(Continuous Integration), 지속적인 전달(Continuous Delivery), 지속적인 배포(Continuous Deployment)가 CI/CD의 기본 개념
- 이를 자동화하는 것은 배포가 잦은 MSA 시스템에 필요한 요소 중 하나
[참고]
https://steady-coding.tistory.com/595
https://mozzi-devlog.tistory.com/34
https://velog.io/@tedigom/MSA-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-2-MSA-Outer-Architecure
[이미지 출처]
https://www.samsungsds.com/kr/insights/msa_architecture_edm.html
https://www.msaschool.io/operation/design/design-five/