
백엔드 아키텍처는 종종 여러분의 하루 업무가 얼마나 고통스러울지, 아니면 즐거울지를 결정합니다. 애플리케이션이 성장함에 따라 초기 선택의 균열이 보이기 시작하고, 여러분은 결정을 내려야 합니다: 믿음직한 모놀리스를 고수할 것인가, 아니면 모든 것을 마이크로서비스로 쪼갤 것인가?
만병통치약은 없습니다. 두 접근 방식 모두 장단점이 있으며, "올바른" 선택은 순수한 기술적 장점보다는 팀 구조와 비즈니스 단계에 더 많이 좌우됩니다. 두 가지 주요 경쟁자를 살펴보고, 종종 가장 효과적인 세 번째 실용적인 중도 방안을 알아보겠습니다.
마이크로서비스의 아이디어는 간단합니다: 하나의 거대한 애플리케이션을 구축하는 대신, 작고 독립적인 서비스들의 집합을 구축하는 것입니다. 각 서비스는 한 가지 일을 잘 수행합니다.
분산된 팀처럼 생각해보세요. 각 서비스는 자체 데이터베이스를 관리하며, 다른 서비스의 허락을 받을 필요 없이 준비되는 대로 배포할 수 있습니다. 결제 팀이 Go 언어를 사용하고 싶어 하고 인증 팀은 Rust를 좋아한다면, 두 팀 모두 원하는 대로 할 수 있습니다. 이러한 자율성은 혁신과 속도를 촉진합니다—적어도 이론상으로는요.
실제로는, 500명의 개발자가 하나의 릴리스를 조정하는 것이 악몽과 같은 대규모 조직에 아주 좋습니다.
모놀리스는 전통적인 접근 방식입니다: 하나의 코드베이스, 하나의 애플리케이션, 하나의 배포. 사용자 인터페이스부터 비즈니스 로직, 데이터 액세스까지 모든 것이 함께 존재합니다.
"모놀리스"가 일부 집단에서는 거의 금기어처럼 되었지만, 부정할 수 없는 장점들이 있습니다. 단순합니다. 함수가 어디에 정의되어 있는지 찾기 위해 지도가 필요하지 않습니다. 배포는 스크립트 하나면 됩니다. 중소규모 팀에게 이 단순함은 슈퍼파워입니다. 인프라 복잡성에 얽매이지 않고 빠르게 움직일 수 있게 해줍니다.
중소규모 기업에서 흔히 볼 수 있는 안티 패턴은 엔지니어 수보다 더 많은 마이크로서비스를 갖게 되는 것입니다. 저는 100명의 엔지니어가 300개 이상의 서비스를 유지보수하려고 노력하는 조직을 보았는데, 결과는 완전한 혼돈이었습니다.
임계점을 넘으면, 많은 서비스가 더 이상 명확한 소유자가 없거나, 소유자가 있더라도 조직 개편으로 인해 서비스를 물려받아 맥락을 전혀 모르는 경우가 생깁니다. 또한 모든 저장소의 의존성을 업데이트하여 취약점을 제거하는 데 더 많은 시간을 소비하게 됩니다. 마이크로서비스를 효과적으로 운영하려면 전담 플랫폼 팀과 도구에 대한 상당한 투자가 필요합니다. 대부분의 스타트업은 그런 인프라를 구축할 리소스가 없어, 그들의 "애자일" 아키텍처는 유지보수의 악몽으로 변합니다.
유행이라서 아키텍처를 선택하지 마세요. 현재의 문제를 해결해주기 때문에 선택하세요.
마이크로서비스를 선택하세요, 만약:
모놀리스를 선택하세요, 만약:
비밀을 알려드리죠: 바로 마이크로서비스로 점프할 필요는 없습니다. 사실, 아마 그렇게 해서는 안 될 겁니다.
**모듈형 모놀리스(Modular Monolith)**는 훌륭한 중도 방안입니다. 하나의 배포 가능한 단위를 구축하지만, 내부적으로는 모듈 간에 엄격한 경계를 강제합니다. 모듈 A의 코드는 모듈 B의 코드를 직접 임포트할 수 없으며, 정의된 공개 인터페이스를 거쳐야 합니다. 이는 인프라 오버헤드 없이 마이크로서비스의 코드 조직화 이점을 제공합니다.
애플리케이션이 성장함에 따라, 독립적이어야 할 필요가 있는 부분만 떼어내면 됩니다.
"마이크로서비스 vs 모놀리스" 논쟁은 종종 본질을 놓칩니다. 이론적으로 어떤 아키텍처가 우월한지가 중요한 것이 아니라, 현재 여러분이 감당할 수 있는 트레이드오프가 무엇인지가 중요합니다.
잘 구조화된 모놀리스로 시작하세요. 고통을 느낄 때 나누세요. 그 전에는 아닙니다. 미래의 당신(그리고 당신의 데브옵스 팀)이 고마워할 것입니다.
© Melvin Laplanche - All rights reserved.