1. 모놀리식 아키텍처(Monolithic)란?
- 아키텍처는 전통적인 방식으로, 모든 애플리케이션을 하나의 단일 서비스로 구축하는 방식입니다. 이는 모든 기능이 하나의 애플리케이션에 포함되어 있고, 이 애플리케이션을 배포하고 확장하는 데 사용됩니다.

(1) 특징
- 하나의 주요 프로세스로 구성
- 모든 서비스가 하나의 DB endpoint를 사용
- 단 한줄만 코드 수정이 되더라도, 모든 어플리케이션의 재배포가 필요
- 싱글 혹은 멀티 모듈로 구성할 수는 있지만 CI의 단위가 달라질 뿐, CD의 범위는 여전히 전체
(2) 장/단점
장점
- 쉽다, 간단합니다
- 배포도 간단합니다
- 어디서 패키징해도 상관없고, 어떻게든 배포만 하면 됩니다.
- 유지보수가 비교적 쉽습니다.
- 비싼 서버 리소스를 최적화해서 사용이 가능합니다.
- 공통 모듈 등을 활용하기가 매우 쉽습니다.
단점
- 수평 확장이 너무 어렵다
- 규모가 커질 수록, 복잡성이 증가하여 수정에 대한 부담 증가
- 대규모 어플리케이션 환경에서는 단순한 수정 사항일지라도, 배포까지 시간이 오래걸릴 수 있다.
- 장애 시, 전체 어플리케이션에 영향을 크게 받게된다.
(3) 사용 예시
- 창업 혹은 새로운 서비스를 시작하는 경우
- 소수의 팀원으로 빠르게 서비스를 오픈해야하는 경우
- 클라우드 환경을 사용하기 어려운 경우
- 금융 등 보안과 안정성이 최고로 중요한 경우
- 개발자들의 역량이 비교적 낮을 경우
- Deveops 등 전문 인력이 부족할 경우
- CI / CD 파이프라인 등의 구축이 어려울 경우
2. 마이크로서비스 아키텍처(MSA)란?
여러 개의 작은 서비스로 구성되어 각 서비스가 독립적으로 개발되고 배포되는 구조입니다.
MSA로 구성되어 있는 애플리케이션의 경우 전체 시스템이 분산되어 있어 개발, 배포가 독립적으로 가능하며 확장성과 유지관리가 용이해집니다.
(1) 특징
- 비즈니스 로직의 재사용 지양
- 낮은 결합도로 변화에 애자일한 대응 가능
- 각 서비스는 각 서비스의 특성에 맞는 최적의 기술스택을 독립적으로 선택 가능
- 서비스 간 자유로운 방식으로 통신 가능
(2) MSA의 핵심
MSA 아케텍처는 소프트웨어 시스템을 독립적인 작은 서비스로 분해함으로써 유연성과 확장성을 극대화하고, 개발 및 유지보수를 간소화하는 것을 목표로 합니다.
- 독립적인 서비스
- 각 마이크로서비스는 특정 기능을 수행하며, 다른 서비스와 독립적으로 배포, 확장, 유지보수될 수 있어야 합니다.
- 분산 시스템
- 서비스 간의 통신은 네트워크를 통해 이루어지며, 서비스는 분산 시스템으로 구성됩니다.
- 경량성
- 각 서비스는 경량으로 유지되어야 하며, 필요한 경우에만 추가적인 리소스를 할당받아야 합니다.
- 자율성
- 각 서비스는 자체적으로 데이터 저장, 연산, 사용자 인터페이스를 관리할 수 있어야 합니다.
- 유연성과 확장성
- 마이크로서비스 아키텍처는 시스템을 쉽게 확장하고, 새로운 기능을 추가하거나 변경할 수 있도록 유연성을 제공해야 합니다.
(3) 서버간 통신
마이크로서비스 아키텍처에서는 각 서비스가 독립적으로 실행되기 때문에 서비스 간의 효과적인 통신이 필수입니다. 주로 REST와 gRPC, Event/Message 기반 통신 방법들이 있습니다.
Restful API와 gRPC 비교
(1) Restful API
- 간단하고 유연한 인터페이스: RESTful API는 HTTP 프로토콜을 기반으로 하며, 간단하면서도 유연한 인터페이스를 제공합니다. 이는 다양한 클라이언트와 서버가 상호 작용하기에 이상적입니다.
- 웹 기술의 표준 활용: RESTful API는 HTTP 프로토콜을 사용하므로, 웹 기술의 표준을 활용할 수 있습니다. 이는 HTTP 메소드를 통한 표준적인 CRUD 작업 및 상태 코드를 활용하는 등의 이점을 제공합니다.
- 간단한 구현과 디버깅: RESTful API는 간단한 URL 구조와 HTTP 메소드를 사용하므로, 구현이 간단하며 디버깅이 용이합니다.
- 기존 시스템과의 통합 용이성: RESTful API는 기존의 웹 기술과 호환성이 높아, 기존 시스템과의 통합이 용이합니다.
- 우리 강의의 주된 플랫폼: 수업에서 RESTful API를 사용하는 것은 학생들이 익숙한 웹 기술을 기반으로 하기 때문에 학습의 용이성을 고려한 선택입니다.
(2) gRPC
- 성능 및 효율성: gRPC는 Protocol Buffers를 사용하여 데이터를 직렬화하므로 효율적인 통신이 가능합니다. 그러나 이는 더 복잡한 설정과 구현이 필요하며, 특히 다양한 언어 간의 지원에서 RESTful API에 비해 제한이 있을 수 있습니다.
- 프로토콜과 데이터 포맷의 선택: gRPC는 HTTP/2 기반의 프로토콜을 사용하고, Protocol Buffers를 통한 바이너리 데이터 포맷을 사용합니다. 이는 효율적인 통신을 가능하게 합니다.
- 양방향 스트리밍 등의 고급 기능: gRPC는 양방향 스트리밍과 같은 고급 기능을 지원하여 실시간 통신이나 대용량 데이터 전송에 더 적합할 수 있습니다.
(4) 장/단점
장점
- 서비스 간 독립성으로 인해 확장성과 유연성이 높아집니다.
- 기능 고립성이라는 특징 때문에 일부 서비스가 실패하더라도 전체 시스템에 큰 영향을 미치지 않습니다.
단점
- 서비스 간 통신이 필요하며, 서로 간 연결 구축 및 관리의 복잡성이 증가합니다.
- 초기 개발 및 통신 등에 시간이 소요됩니다.
이미지 출처 : https://www.nginx.com/blog/introduction-to-microservices/