작성이유
최근 팀 프로젝트를 진행하면서 모놀로틱으로 구성을 진행하였었다. 다만 추후에 MSA로의 마이그레이션 작업을 할 수도 있을 것 같다는 생각에 구조는 MSA 구조와 유사하게 작업을 하였었다. 그렇게 작업을 하다가 문득 MSA가 어떤 아키텍쳐길래 다들 선호하는 것이며, 어떤 장점과 단점들을 가지고 있는지, 어떤 관점으로 설계를 해야되는지에 대해 궁금증을 풀기 위하여 작성을 하게 되었다.
모놀리틱(Monolithic) 란?
우선 MSA를 알기 전에 과거부터 존재해오던 모놀리스(Molith) 구조를 먼저 알아야 한다.
모놀리스는 하나의 단위로 개발되는 일체식 어플리케이션 이다.
즉, 소프트웨어의 모든 구성요소(사용자 인터페이스, 데이터베이스, 어플리케이션 3티어)가 한 프로젝트에 통합 되어 있는 형태 이다.

모놀리틱의 장점과 단점?
장점
1. 어떤 서비스에서든지 개발 환경이 유사하며, 전체적인 서비스 로직이 하나의 프로젝트 안에 들어가있어서 개발이 복잡하지 않다.
2. 하나의 war/jar에 모든 내용이 들어가있어서 배포가 간단하다.
3. 똑같은 환경을 복사해서 만들면 되기때문에 고가용성 서버를 만들기 용이하다.
4. End-To-End (사용자관점) 테스트가 용이하다
단점
1. 프로젝트 하나에 모든 기능이 들어가있다보니 용량이 무거워지고, 구동 시간 및 배포시간이 길어진다. (서비스가 지연됨)
2. 소스 일부분이 수정되면 전체 서비스를 중지 후 배포를 해야한다.
3. 많은 양의 코드가 몰려있어서 유지보수가 용이하지 않다.
4. 기능별로 알맞는 언어를 골라서 적용시킬 수 없다.
- 예시로, 일부 기능은 python만 지원하는경우 spring boot 에서 작업할 수가 없다
이제 MSA 란 어떤 것인지에 대해 알아보자
MSA (MicroService Architecture) 란?
하나의 큰 어플리케이션을 여러개의 작은 서비스로 쪼개어 변경, 조합이 가능하도록 만든 아키텍처
각 서비스들은 서로 통신이 가능하며, 전체 서비스를 구성한다.
또한 각 서비스들은 독립적인 구성 요소로 기동된다.

MSA 장점과 단점?
장점
1. 각 서비스들이 기능단위로 구현되어있기 때문에, 소스의 유지보수가 편리하며 이해하기 수월하다.
2. 서비스, DB의 저장소가 분리되어 구축되므로 언어의 선택에 있어서 자유도가 올라간다.
3. 각 서비스들이 별도로 배포가 되므로 장애가 있는 경우 해당 기능만 빠르게 수정/배포가 가능하다.
단점
1. MSA 아키텍쳐를 명확하게 이해하지 못하고 분리를 하게되면, 모놀리틱보다 유지보수 및 사용성이 떨어진다.
2. 각 서비스들이 분리되어있기 때문에 모니터링, 인프라 등 관리가 힘들어진다.
3. End-To-End 테스트를 진행하는 경우 해당 기능에 연동된 서비스들을 다 기동시켜야 하므로 테스트가 힘들어진다.
4. 비용이 적은 RCP, API 통신으로 진행하기 때문에 통신 관련 장애가 많이 발생할 수 있다.
5. 각 서비스들이 개별 서비스/DB로 구축되다보니 트랜잭션 관리가 어려워진다. (모놀리틱은 @Transactional 어노테이션으로 처리해도 됬었음!)
언제 MSA 를 사용해야 하는 것인가?
초기 프로젝트들은 작은 서비스로 시작해서 점점 확장해나가는 경우가 많다.
그러다보니 초기에는 모놀리틱으로 빠르게 구축하여 서비스를 납품하고, 아래의 관점들을 확인하여 MSA 적용 시점을 정하면 될 것 같다.
- 비용 : MSA 아키텍처를 도입할 경우, 모놀리식 아키텍처에 비해 비용을 얼마나 절감할 수 있는가?
- MSA를 구축하기 위하여는 외부(인프라) 아키텍처 구축에도 많은 비용이 든다. (CI/CD, k8s 등..)
- 개발 생산성 : 마이크로 서비스를 요구할 만큼 시스템 복잡도가 높은가? 또는 복잡도를 지나치게 높인 마이크로 서비스가 생산성을 저해하고 있진 않는가?
- 운영 : 개발 팀에게 개발과 운영을 동시에 할 만큼 인프라가 준비되어 있는가? 또는 개발 인력이 마이크로서비스를 관리할 역량이 있는가?
- 개발 및 운영 둘중 한곳이라도 MSA 관련 지식이 없으면 서비스의 장애 및 스파게티 소스가 될 확률은...😂
- 배포 : 배포를 충분히 자주 하고 있는가? MSA는 빠른 변화에 대응하기 위해 도입하는 것인데, 회사마다 배포 일이 정해져 있고, 배포가 가끔 일어난다면 효율이 떨어진다.
JAVA 멀티모듈이란?
하나의 큰 프로젝트를 여러 개의 모듈로 나누어 관리하는 방식
* 모듈이란?
- 패키지 한 단계 위의 집합체로서 독립적으로 배포될 수 있는 코드의 단위
멀티모듈 프로젝트의 장점?
1. 코드의 재사용성
- 각 모듈을 독립적인 기능 단위로 구성함으로써, 필요한 기능을 다른 프로젝트에서도 쉽게 사용 가능
2. 개발 및 테스트의 효율성
- 각 모듈을 독립적으로 개발하고 테스트할 수 있기 때문에, 전체 프로젝트의 개발 속도와 품질을 향상시킬 수 있다.
3. 팀 간의 협업 용이
- 각 팀이 독립적으로 모듈을 개발하고 관리할 수 있다. 그로인해 프로젝트의 복잡성을 줄이고 효율적인 협업이 가능
4. 유지보수 용이
- 각 모듈을 독립적으로 관리함으로써, 특정 모듈의 변경이나 업데이트가 전체프로젝트에미치는 영향을 최소화 할 수 있다.
멀티모듈 프로젝트의 단점?
1. 모듈 간의 의존성 관리 복잡도 증가
- 각 모듈이 서로 다른 모듈의 기능을 필요로 할 때, 의존성 관리가 중요해진다.
2. 프로제트 초기 설정이 복잡해질 수 있다.
- 멀티모듈 프로젝트 초기 구축 시 단일 모듈보다 복잡해질 수 있다.
멀티모듈은 MSA 인가?
내가 가장 궁금해하던 부분이다.
멀티모듈 특성상 서비스별 분리가 되어있고, 개별로 배포할수 있기 때문에 MSA 이지 않을까? 싶었다.
결론부터 말하자면, 공통점은 있지만 개념과 구조가 다르다.
구조
MSA - API Gateway를 통하여 각 서비스들과 분리/통신
Multi Module - Common Module에 있는 공통코드를 각 Module에서 사용
개념
MSA - 서비스별 분리를 통한 관리 및 빠른 장애 대응
Multi Module - module 분리를 통한 코드의 재사용성, 개발 효율성 증가
Molonithic이 여러개 모여서 MSA가 될 수 있고, Multi Module이 여러개 모여서 MSA가 될 수는 있다.
또한 Monolithic 프로젝트를 MSA로 변환하는 과정에서, Multi Module을 사용하면 조금 수월하게 만들어주는 역할을 하기는 한다.
다만 둘의 개념과 구조는 명확히 MSA라고 보기에는 어렵다.
느낌점
여기까지 MSA와 Monolithic , Multi Module 의 차이를 정리하면서 느낀점은 정말 단순히" MSA 가 다방면에서 Monolithic보다 뛰어나니까 MSA만 쓰자!" 라는 고집은 조금 줄어든 것 같다.
또한 이전까지 간단하게 Multi Module을 사용하여 테스트를 진행했던 프로젝트가 있다. (여기)
원했던 기능을 다 구축하지는 못하였고, 서비스별 분리가 아닌 기능별 분리여서 수정이 더 필요한 부분은 있지만, 필요한 분들은 들어가서 확인해보는것도 괜찮을 것 같다.
현재 진행 할 프로젝트 및 회사의 성향에 맞게 구축해야한다는 부분을 확실하게 깨닫게 되었고, 개인적으로 MSA 프로젝트를 진행해보면서 몸으로 조금 더 명확한 차이점을 느껴보려한다. (관련 서적들을 읽으면서 개념을 이해하면서 진행해야할 것 같다!)
ps) 미흡한 부분이 있을 수도 있으니 부족하거나 잘못된 정보는 댓글 부탁드립니다.
refs
(마이크로 서비스 vs 모놀리식 아키텍처) MicroService vs Monolithic Architecture 간단 소개 및 주관적 의견
모놀리식 아키텍처 (Monolithic Architecture) 장점 1. 어떤 기능(서비스)이든지 개발되어있는 환경이 같아서 복잡하지않다. 2. 쉽게 고가용성 서버 환경을 만들 수 있다. ( 같은 어플리케이션으로 하나
lion-king.tistory.com
모놀리식 아키텍처, 마이크로서비스 아키텍처
모놀리식 아키텍처는 MSA와 반대되는 개념으로, 애플리케이션의 모든 구성 요소가 한 프로젝트에 통합되어 있는 형태를 말한다.개발 초기에 단순한 아키텍처 구조로 인해 개발에 용이하다.어떤
velog.io
https://f-lab.kr/insight/understanding-multi-module-projects
멀티 모듈 프로젝트의 이해와 적용
멀티 모듈 프로젝트는 하나의 큰 프로젝트를 여러 개의 모듈로 나누어 관리하는 방식입니다. 이 글에서는 멀티 모듈 프로젝트의 개념, 장점, 단점 및 해결 방안, 그리고 적용 사례를 소개합니다.
f-lab.kr
https://velog.io/@vpdls1511/Multi-Module-VS-MSA
Multi Module VS MSA
Multi Module은 무엇이고, MSA랑은 무엇이 다를까?
velog.io
참고할 서적 : https://product.kyobobook.co.kr/detail/S000001766464
도메인 주도 설계로 시작하는 마이크로서비스 개발 | 한정헌 - 교보문고
도메인 주도 설계로 시작하는 마이크로서비스 개발 | 넷플릭스, 우버, 아마존, 쿠팡 등의 대규모 인터넷 서비스를 제공하는 회사들의 애플리케이션은 어떤 구조로 만들어졌을까? 가상화되고 유
product.kyobobook.co.kr