SOA는 MSA보다 먼저 알려진 개념이다. 핵심 원리는 애플리케이션을 네트워크로 접근할 수 있는 기능 단위로 분리해서 각각 독립적인 작동과 업데이트가 가능하게 하는 것이다.
SOA 정의에 따르면, 각 기능 단위는 비즈니스의 한 측면을 담당하는 완전한 독립 서비스이며, 제공하는 기능은 인터페이스를 통해 노출한다.
각 서비스가 연동될 때 어떤 프로토콜을 사용하는지, 그리고 애플리케이션의 구성과 배포는 어떤 식으로 해야 하는지 모호하다.
SOA 연동 방법에는 소켓을 이용한 IPC(Inter-Process Communication), Shared-Memory, Message Queue, RPC(Remote Procedure Call) 등 사용 가능한 옵션이 매우 많으며, 결국 전체 애플리케이션이 하나의 프로세스 안에서 실행되지만 않는다면 어떤 형태라도 SOA가 될 수 있는 셈이다.
모놀리식 접근 방식
전통적인 모놀리식(monolithic) 애플리케이션이란 거대한 단일 구조의 애플리케이션을 뜻한다.
전체 애플리케이션이 단일 코드 기반(single code base)이므로 개발 초기에는 모든 것이 단순하고, 테스트 커버리지를 높이기 쉬우며, 코드는 깨끗이 구조화된 형태로 유지된다.
애플리케이션이 작은 규모로 계속 머문다면 이 방식은 충분히 좋은 방법이며, 소규모 팀에서 관리하기도 수월하다.
하지만 규모가 커지면 단일 코드로 만든 애플리케이션은 까다로운 문제를 쏟아내기 시작한다.
큰 범위의 수정이 발생하면 전체 애플리케이션이 매우 불안정한 상태가 되며, 새 버전을 배포하기 위해 많은 추가 테스트를 필요로 한다.
작은 범위의 변경 또한 이로 인해 발생한 문제가 시스템 전체로 퍼져나갈 수 있기 때문에 위험하다.
시간이 지나면서 새로운 기능이 추가되고, 개발자가 변경되면서 코드가 지저분해지고 테스트 속도도 느려지기 시작한다. 결국 유지보수가 어려운 스파게티 코드가 늘어나고 데이터 모델을 수정할 때마다 복잡한 마이그레이션 계획을 세워야만 한다.