모놀리식 아키텍처의 경우 모든 프로세스가 긴밀하게 결합되고 단일 서비스로 실행된다. 따라서 애플리케이션의 한 프로세스에 대한 수요가 급증하면 해당 아키텍처 전체를 확장해야 한다.
장점
- 어떤 기능(서비스)든지 개발되어있는 환경이 같아서 복잡하지 않다.
- 쉽게 고가용성 서버 환경을 만들 수 있다. (같은 애플리케이션으로 하나 더 생성)
- End-to-End 테스트가 용이하다. (MSA의 경우 테스트에 필요한 서비스들을 모두 동작시켜야 한다.)
단점
- 한 프로젝트의 덩치가 너무 커져서 애플리케이션 구동시간이 늘어나면 빌드, 배포 시간도 길어진다.
- 조그마한 수정사항이 있어도 전체를 다시 빌드하고 배포를 해야한다.
- 많은 양의 코드가 몰려있어 개발자가 모두를 이해할 수 없고 유지보수도 힘들다.
- 일부분의 오류가 전체에 영향을 미친다.
- 기능별로 알맞는 기술, 언어, 프레임워크를 선택하기가 까다롭다.
서비스 지향 아키텍처(SOA)
서비스라는 소프트웨어 구성 요소를 사용해 비즈니스 애플리케이션을 생성하는 소프트웨어 개발 방식
각 서비스는 비즈니스 기능을 제공하며, 플랫폼과 언어를 넘나들며 서로 통신할 수 있다.
개발자는 SOA를 사용해 서로 다른 시스템 내의 서비스를 재사용하거나 독립적인 여러 서비스를 결합하여 복잡한 태스크를 수행한다.
SOA는 서비스를 개발하고, 이를 최대한 재가용한다. 재가용성이 늘어나면 서비스간 결합도가 늘어나기 때문에 아주 작은 서비스 단위를 독립적으로 나누어 구성함으로써 탄력적이고 유연한 구조를 가질 수 있다.
장점
- SOA는 서비스 단위로 기능을 분리하므로 이러한 서비스는 여러 프로젝트나 응용 프로그램에서 재사용할 수 있다. 이로써 개발 시간과 비용을 절감할 수 있다.
- 시스템의 서비스를 독립적으로 개발하고 업데이트할 수 있으므로 시스템의 일부를 변경하더라도 전체 시스템에 큰 영향을 미치지 않는다.
- SOA는 여러 시스템 간의 통합을 용이하게 만들어준다. 서비스 간의 표준화된 인터페이스를 사용하면 다양한 시스템을 쉽게 연결할 수 있다.
- 필요에 따라 서비스를 확장할 수 있으므로 시스템의 성능을 향상시키기 위해 추가 리소스를 할당하기 용이하다.
단점
- 다양한 서비스 간의 관계와 의존성을 다루기 때문에 복잡성이 증가할 수 있다. 이로 인해 설계, 구현, 유지보수가 어려울 수 있다.
- 서비스 간의 통신이 추가 오버헤드를 초래할 수 있으며, 효율적인 메시지 전달이 중요하다. 부적절한 설계나 느린 서비스 호출은 성능 문제를 초래할 수 있다.
- 서비스 간의 통신은 보안 문제를 야기할 수 있으며, 적절한 보안 메커니즘을 구현하려면 노력이 필요하다.
마이크로서비스 아키텍처(MSA)
하나의 큰 애플리케이션을 여러 개의 작은 서비스 유닛으로 쪼개어 변경과 조합이 가능하도록 만든 아키텍처
각 마이크로서비스는 상호 통신이 가능하며 이를 통해 전체 서비스를 구성한다. - 서비스는 비즈니스 기능을 위해 구축되며 서비스마다 한 가지 기능을 수행한다. - 서비스가 독립적으로 실행되기 때문에 애플리케이션의 특정 기능에 대한 수요를 충족하도록 각각의 서비스를 업데이트, 배포 및 확장할 수 있다.
장점
- 기능별로 마이크로서비스를 개발하고, 작업 할당을 서비스 단위로 하면 개발자가 해당 부분을 온전히 이해할 수 있다.
- 새로 추가되거나 수정사항이 있는 마이크로서비스만 빠르게 빌드, 배포가 가능하다.
- 해당 기능에 맞는 기술, 언어 등을 선택하여 사용할 수 있다.
- 일부분의 오류가 있으면 해당 기능에만 오류가 발생하고 그 부분만 빠르게 고쳐서 정상화가 가능하다.
단점
- 무엇보다 관리가 힘들다. 작은 여러 서비스들이 분산되어 있기 때문에 모니터링이 힘들다.
- 서로를 호출하여 전체 서비스가 이루어지기 때문에 무조건 다른 서비스를 호출하는 코드가 추가되는데 이부분이 모놀리식 아키텍쳐의 개발보다 까다롭다.
- 통신관련 오류가 잦을 수 있다. 마이크로 서비스들끼리 계속하여 통신을 하다보니 모놀리식 아키텍쳐에 비해 통신관련 오류가 잦다.
- 테스트가 불편하다. End-to-End 테스트를 위해 UI, Gateway 등등 여러개의 마이크로 서비스를 구동시켜야 한다.
현재 최종 프로젝트에서 MSA를 적용하며 기존에 사용했던 프레임워크인 express를 사용하지 않고 있다.
일단 적용한 아키텍처도 새로운 도전이고, 이에 따른 여러 고려 사항(서비스 간 통신, 데이터 관리, 보안, 모니터링 등)도 있기 때문에, 프레임워크를 사용하는데 추가 공부를 하는 것보다 MSA에 대한 정확한 이해도를 갖는게 중요하다 생각하여 기존 node.js에 내장된 모듈을 최대한 이용하여 진행하기로 했다.
express는 TCP 기반의 프레임워크이다.
express는 node.js를 기반으로 하며, 기본적으로 HTTP 프로토콜을 사용하여 웹 서버를 구축하고 관리한다. HTTP 프로토콜은 TCP/IP 프로토콜 스택 위에서 동작하므로 express를 사용하면 TCP 기반의 서버를 만들게 된다.