
예를 들어 주문 시스템이 있다고 가정해보자.
이 시스템은 회원 파트, 상품 파트, 주문 파트로 구성되어 있다.
사용자는 회원가입을 하고, 상품을 조회한 뒤, 주문을 넣는 세 가지 단계의 과정을 거치게 된다.
우리의 실습에서는 이를 모놀리식 구조로 관리했지만, 실제 현업에서는 서비스 단위별로(즉, 개발자가 정한 기준에 따라) MSA 아키텍처로 분리해 관리할 수도 있다.
MSA란 하나의 거대한 애플리케이션을 작고 독립적인 서비스로 나누어,
각각이 자신의 프로세스에서 독립적으로 실행되는 구조를 말한다.
모놀리식(Monolithic) ↔ MSA(Micro Service Architecture)
‘주문’을 넣는 과정은 재고 조회 → 주문 생성의 순서로 진행된다.
하지만 MSA 구조에서는 각 파트가 독립된 서버로 분리되어 있기 때문에,
주문 서버는 상품의 재고 정보를 직접 알 수 없다.
즉, 주문 서버가 상품 DB에 바로 접근하는 것은 불가능하고, 상품 서버를 통해서만 재고를 확인해야 한다.
이 경우 주문 서버에서는 다음과 같은 HTTP 요청 흐름이 발생한다.
GET 요청 → 재고 조회 POST 요청 → 주문 생성 PUT 또는 PATCH 요청 → 재고 감소 문제는 여기서 데이터 일관성 이슈가 생긴다는 점이다.
예를 들어 상품 서버에서 재고를 감소시키는 도중 에러가 발생한다면,
주문은 성공했는데 재고는 줄지 않은 상태가 될 수 있다.
이런 상황을 해결하기 위해 보상 트랜잭션(Compensating Transaction) 이라는 별도의 예외 처리 로직을 두어,
에러 발생 시 데이터의 불일치를 롤백하거나 복원하는 방식으로 처리해야 한다.
결과적으로 MSA는 유지보수성과 확장성 측면에서 큰 장점을 가지지만,
그만큼 복잡성과 통신 비용, 데이터 일관성 관리가 중요한 과제로 남는 구조다.