Monolithic vs Microservices
시스템을 구축하는 방식은 크게 모놀리식 아키텍처와 마이크로서비스 아키텍처(Microservice Architecture, MSA)로 나눌 수 있다.
모놀리식 아키텍처(Monolithic Architecture)
모놀리식 아키텍처는 시스템의 모든 기능이 하나의 애플리케이션에 통합된 구조로, 모든 로직이 단일 프로세스 내에서 실행되며, 배포 단위도 하나다.
초기 개발 속도가 빠름
모든 코드가 한곳에 있어 로직 추적과 통합 테스트 용이
하지만 시스템 규모가 커지고 비즈니스가 복잡해지면 모놀리식 구조는 여러 한계에 부딪힌다.
배포의 경직성: 작은 코드 수정으로 전체 시스템의 빌드, 테스트, 배포를 다시 유발
비효율적인 확장성: 특정 기능(예: 검색)에만 트래픽이 몰려도 시스템 전체를 복제하여 확장(Scale-out) 필요
기술 스택의 종속성: 한번 정해진 기술 스택 변경 및 새로운 기술을 도입의 어려움
개발 병목: 여러 팀이 하나의 거대한 코드베이스를 동시에 수정으로 인한 충돌과 조정 비용 증가
마이크로서비스 아키텍처(Microservice Architecture, MSA)
마이크로서비스 아키텍처는 하나의 큰 애플리케이션을 여러 개의 작은 서비스로 분리하는 접근 방식이다.
핵심 원칙
단일 책임 원칙: 각 서비스는 고유한 비즈니스 영역(도메인)에 대한 책임을 가짐
도메인 주도 설계(DDD)의 바운디드 컨텍스트(Bounded Context) 개념과 유사
독립적인 배포: 서비스는 서로 독립적으로 개발, 테스트, 배포 가능
데이터베이스 분리: 각 서비스는 자신만의 데이터베이스를 소유하는 것을 지향(서비스 간 강한 결합 방지)
기술 다양성: 각 서비스에 가장 적합한 프로그래밍 언어, 프레임워크, 데이터베이스를 자유롭게 선택 가능
장점
선택적 확장성: 트래픽이 몰리는 특정 서비스(예: 결제)만 선택적으로 확장할 수 있어 자원 효율성 극대화
빠른 배포 주기: 각 팀이 맡은 서비스를 독립적으로 빠르게 배포 가능
장애 격리: 하나의 서비스에 장애가 발생하더라도, 해당 장애가 시스템 전체의 중단으로 이어지는 것을 방지 가능
팀의 자율성: 작은 팀이 특정 서비스의 전체 라이프사이클을 책임지며, 의사결정 속도 향상
MSA가 마주하는 새로운 도전 과제
MSA가 모놀리식의 문제를 해결하지만, 분산 시스템 고유의 복잡성을 새롭게 만들어낸다.
분산 트랜잭션과 데이터 일관성
서비스마다 데이터베이스가 분리되면, 여러 서비스에 걸친 데이터 변경을 하나의 트랜잭션으로 묶을 수 없음
SAGA 패턴을 사용해 최종 일관성(Eventual Consistency)을 맞추거나, 트랜잭셔널 아웃박스 패턴 등 활용
네트워크 통신과 장애 전파
REST API나 gRPC 같은 동기식 호출은 하나의 서비스 지연이나 장애가 호출한 서비스에 연쇄적으로 전파 가능
장애가 발생한 서비스를 일시적으로 차단하는 서킷 브레이커 패턴 도입 필요
서비스 탐색 (Service Discovery)
수많은 서비스가 동적으로 생성되고 지는 환경에서 각 서비스의 위치(IP, Port)를 관리하는 메커니즘 필요
Eureka, Consul 같은 서비스 디스커버리 도구 활용
운영 및 모니터링의 복잡성
배포, 모니터링, 로깅, 설정 관리가 모두 분산되어 복잡도가 기하급수적으로 증가
하나의 요청을 추적하기 위해 여러 서비스의 로그를 연결하는 분산 추적 시스템 필요
Last updated
Was this helpful?