💡 오늘 학습 키워드
- MSA
- Spring Cloud
🎯 학습 내용 정리
최근 많은 서비스가 MSA를 기반으로 개발되고 있다. 과거에는 하나의 애플리케이션에서 모든 기능을 처리하는 모놀리틱 구조가 일반적이었지만, 서비스 규모가 커지고 트래픽이 증가하면서 확장성과 유지보수 측면에서 한계가 나타났다. 이러한 문제를 해결하기 위해 등장한 것이 MSA이며, Spring Cloud는 이러한 마이크로서비스를 쉽게 구축하고 운영할 수 있도록 다양한 기능을 제공한다.
1. MSA
MSA는 Microservices Architecture의 약자로 하나의 애플리케이션을 여러 개의 독립적인 서비스로 분리하여 개발하고 운영하는 아키텍처이다. 각 서비스는 하나의 비즈니스 기능만 담당하며 독립적으로 배포되고 확장된다. 서비스 간에는 HTTP, REST API, gRPC, Message Queue(Kafka, RabbitMQ) 등의 방식으로 통신한다.
MSA의 가장 큰 특징은 서비스 간 결합도를 낮추고 독립성을 높이는 것이다.
대표적인 특징은 다음과 같다.
- 서비스별 독립적인 배포
- 필요한 서비스만 수평 확장 가능
- 서비스별 기술 스택 선택 가능
- 팀 단위 독립 개발 가능
그렇다면 MSA와 모놀리틱은 어떠한 차이가 있을까? 우선 모놀리틱 아키텍처에 대해서 먼저 알아보자.
모놀리틱 구조에서는 모든 기능이 하나의 프로젝트 안에 존재한다.
장점은 구조가 단순하고 초기 개발 속도가 빠르다는 것이다. 또한 하나의 데이터베이스를 사용하므로 트랜잭션 관리가 쉽다.
반면 일부 기능만 수정하더라도 전체 서비스를 다시 배포해야 하며, 규모가 커질수록 유지보수가 어려워진다.
장점
- 구조가 단순하다.
- 배포가 쉽다.
- 트랜잭션 관리가 쉽다.
단점
- 전체 서비스를 함께 배포해야 한다.
- 특정 기능만 확장하기 어렵다.
- 프로젝트 규모가 커질수록 개발 속도가 느려진다.
MSA는 기능별로 서비스를 분리한다.
예를 들어 쇼핑몰이라면 회원 서비스, 주문 서비스, 결제 서비스, 상품 서비스가 각각 독립적인 프로젝트가 된다.
장점
- 서비스별 독립 배포
- 필요한 서비스만 확장 가능
- 장애가 전체 서비스로 전파되지 않음
- 기술 선택의 자유
단점
- 서비스 간 통신이 필요하다.
- 분산 트랜잭션 관리가 어렵다.
- 운영 환경이 복잡하다.
- 모니터링 시스템이 필수적이다.
2. Spring Cloud
Spring Cloud는 Spring 기반 MSA 개발을 지원하는 프레임워크이다. MSA를 구축하려면 단순히 서비스를 분리하는 것만으로는 부족하다.
다음과 같은 기능이 반드시 필요하다.
- 서비스 등록 및 조회
- API Gateway
- Load Balancing
- Circuit Breaker
- 중앙 설정 관리
- 분산 추적
- 메시징
Spring Cloud는 이러한 기능을 모듈 형태로 제공한다.
MSA에서는 서비스의 IP가 계속 변경될 수 있다. 따라서 서비스의 위치를 관리하는 중앙 저장소가 필요하며 이를 서비스 디스커버리라고 한다.
Eureka Server는 모든 서비스 정보를 저장한다. 각 서비스는 실행될 때 Eureka에 자신을 등록하고 다른 서비스는 Eureka를 조회하여 원하는 서비스를 찾는다. 서비스가 종료되면 자동으로 Registry에서 제거된다.
서비스 호출 과정은 다음과 같다.
Order Service
↓
Eureka Server
↓
Product Service
서비스 이름만 알고 있으면 실제 IP를 몰라도 통신이 가능하다.
Spring Cloud에서는 서비스 간 통신을 위해 대표적으로 두 가지 방식으로 서비스를 호출한다.
RestTemplate
직접 HTTP 요청을 보내는 방식이다.
restTemplate.getForObject(
"http://product-service/products",
Product.class
);
현재는 신규 프로젝트에서 거의 사용하지 않는다.
OpenFeign
OpenFeign은 인터페이스만 작성하면 자동으로 HTTP Client를 생성해 준다.
@FeignClient(name = "product-service")
public interface ProductClient {
@GetMapping("/products")
List<Product> getProducts();
}
코드가 간결하고 유지보수가 쉬워 현재 가장 많이 사용하는 방식이다.
동일한 서비스가 여러 대 실행될 경우 요청을 적절히 분산해야 한다. 이를 로드밸런싱이라고 한다.
예를 들어 Product Service가 3대 실행 중이라면
Gateway
│
├──── Product-1
├──── Product-2
└──── Product-3
요청이 순차적으로 분배된다.
과거에는 Ribbon을 사용했지만 현재 Spring Cloud에서는 Spring Cloud LoadBalancer가 기본으로 사용된다.
대표적인 알고리즘은 다음과 같다.
- Round Robin
- Random
- Least Connections
- Weighted Round Robin
MSA에서는 다른 서비스를 호출하는 과정에서 장애가 발생할 수 있다. 예를 들어 Order Service가 Product Service를 호출한다고 가정해보자. Product Service가 계속 실패하면 Order Service도 함께 장애가 발생한다.
이를 방지하기 위해 Circuit Breaker를 사용한다. 대표적인 구현체는 Resilience4j이다.
Circuit Breaker는 다음과 같은 상태를 가진다.
Closed
정상적으로 요청을 전달한다.
Open
실패율이 일정 수준을 넘으면 모든 요청을 차단한다.
Half Open
일부 요청만 허용하여 복구 여부를 확인한다.
이 과정을 통해 장애가 다른 서비스로 전파되는 것을 막을 수 있다.
외부 사용자가 모든 서비스에 직접 접근하는 것은 바람직하지 않다. API Gateway는 모든 요청의 진입점 역할을 수행한다.
주요 역할은 다음과 같다.
- 인증 및 인가
- 요청 라우팅
- 로깅
- 모니터링
- 필터 처리
Spring Cloud Gateway는 Eureka와 연동하여 서비스 이름만으로 라우팅할 수 있다.
MSA에서는 서버가 세션을 공유하지 않기 때문에 JWT 기반 인증을 많이 사용한다.
로그인 성공 시 Access Token을 발급한다. 이후 클라이언트는 모든 요청마다 Authorization Header에 JWT를 포함한다.
Gateway 또는 각 서비스는 JWT를 검증하여 사용자를 인증한다.
Client
↓ Login
Auth Service
↓ JWT 발급
Client
↓ Authorization: Bearer Token
Gateway
↓
Service
서버가 별도의 세션을 저장하지 않아도 되므로 확장성이 뛰어나다.
MSA에서는 서비스마다 설정 파일이 존재한다. DB 주소가 변경될 때 모든 서비스를 수정하는 것은 비효율적이다.
Spring Cloud Config는 설정을 중앙 서버에서 관리한다.
Git Repository
│
Config Server
│
각 서비스
설정을 변경하면 모든 서비스가 동일한 설정을 사용할 수 있다.
하나의 요청은 여러 서비스를 거친다.
Gateway
↓
Order
↓
Product
↓
Payment
장애가 발생하면 어느 서비스에서 문제가 생겼는지 찾기 어렵다. 이를 해결하기 위해 분산 추적을 사용한다.
대표적으로
- Micrometer Tracing
- Zipkin
- Grafana
- Prometheus
등을 활용하여 요청 흐름을 추적한다.
서비스 간 동기 호출이 많아질수록 결합도가 높아진다. 이를 해결하기 위해 이벤트 기반 아키텍처(Event Driven Architecture)를 사용한다.
예를 들어 주문이 생성되면
Order Created
│
Kafka
├── Payment
├── Stock
└── Delivery
각 서비스는 이벤트를 받아 독립적으로 처리한다.
대표적인 메시지 브로커는 Kafka와 RabbitMQ가 있다.
Spring Cloud가 애플리케이션 레벨의 문제를 해결한다면 Kubernetes는 인프라를 관리한다.
| Spring Cloud | Kubernetes |
| 서비스 디스커버리 | Service |
| Config Server | ConfigMap |
| Gateway | Ingress |
| Load Balancer | Service |
| Circuit Breaker | 애플리케이션 구현 |
| 설정 관리 | Secret |
최근에는 Spring Cloud와 Kubernetes를 함께 사용하는 사례가 가장 많다.
📚 한줄 정리
1. MSA는 서비스를 기능별로 독립 분리하여 개발, 배포, 확장을 유연하게 만드는 현대적인 소프트웨어 아키텍처이다.
2. Spring Cloud는 MSA 환경에서 서비스 간 통신, 설정 관리, 장애 대응 등 분산 시스템 개발과 운영을 쉽게 지원하는 프레임워크이다.
'Bootcamp > Fundamentals' 카테고리의 다른 글
| Service Discovery와 Spring Cloud LoadBalancer (0) | 2026.07.01 |
|---|---|
| MSA와 Spring Cloud (0) | 2026.06.30 |
| Spring 심화 (0) | 2026.06.26 |
| Spring 숙련 - 2 (0) | 2026.06.25 |
| Spring 숙련 - 1 (0) | 2026.06.24 |