본문 바로가기

Back-end

기존 서비스를 유지하며 신규 서비스를 어떻게 지원할 수 있을까?

안녕하세요. 이번에 다룰 내용은 기존 서비스를 유지하며 신규 서비스를 제공할 수 있는 방법에 대해 다뤄보려 합니다.

기존에 아래와 같은 서버가 존재한다고 가정해 봅시다.

해당 서버는 회원, 주문, 상품, 정산, 쿠폰, 문의 등등 여러 서비스의 관리 기능을 제공하고 있습니다.

한눈에 봐도 하나의 서버에서 많은 도메인 영역에 걸쳐 서비스를 제공하고 있다는 것을 알 수 있습니다.

위와 같은 상태에서는 개발자가 기존의 시스템을 유지 보수하거나 더 이상 어떤 기능을 추가하는 것이 쉽지 않은 상태일 것입니다.

그렇다면 어떻게 해야 할까요? 바로 서비스를 분리해 주어야 합니다.

하지만 기존 서버에서 제공하는 모든 서비스를 한 번에 분리하는 것은 너무 많은 리소스가 소모되고 또한, 리스크 하기 때문에 보통 아래와 같이 한 두 개씩(보통은 한 개씩) 점진적으로 분리하게 됩니다.

자 이제 스프링 기반으로 새롭게 개발된 회원관리와 주문관리 서비스를 각각 독립된 환경에 띄우고 클라이언트가 해당 서버들을 바라보게 하면 끝인 것일까요?

그렇지 않습니다.

어느 정도 규모가 있는 서비스에서는 해당 서비스를 이용하고 있는 모든 클라이언트를 파악하기가 쉽지 않고 파악했더라도 모든 클라이언트의 코드를 수정하도록 하는 것은 거의 불가능합니다.

그렇다면 클라이언트단에서의 수정 없이 새로운 서비스를 연결해 주어야 하는데 어떻게 할 수 있을까요?

이 문제는 스트랭글러 패턴이라는 패턴을 알아보면 해결할 수 있습니다.

스트랭글러 패턴이란 레거시 시스템을 점진적으로 새로운 시스템으로 마이그레이션 하기 위한 패턴으로 아래와 같이 Strangler Facade 라는 라우터를 두고 사용자의 요청을 Strangler Facade 가 받아서 신규 서비스와 기존 서비스에게 요청을 전달하여 사용자가 마이그레이션 된 사실을 모른 체 서비스를 이용할 수 있도록 하는 패턴을 말합니다.

그럼 위 패턴을 실제 서비스에 어떻게 적용시킬 수 있을까요?

Strangler Facade 역할을 하는 게이트웨이를 만들어 게이트웨이가 레거시와 새로운 서비스를 구분하여 요청을 전달하도록 하고 클라이언트가 해당 게이트웨이를 통해 서비스를 이용하게 만들면 됩니다.

Spring Cloud Gateway 등을 사용하는 게이트웨이 서버를 앞단에 두고 모든 사용자의 요청을 게이트웨이가 받도록 한 뒤 /api/v2 혹은 /api/user 와 같이 기존에 사용하던 path 중 새로운 서비스라는 것을 특정할 수 있는 path 로 들어오는 요청은 새로운 서비스로 보내고 그 외 요청은 기존 서버에 보내도록 합니다.

Strangler Facade는 Spring Cloud Gateway가 되고 Legacy System 은 php로 작성된 서버가, New System은 스프링 기반의 서버가 되는 것입니다.

이렇게 서버를 구성한 뒤 php 서버에 존재하는 서비스를 하나씩 분리하다 보면 언젠가 모든 서비스가 마이크로 서비스로 분리되어 있는 모습을 볼 수 있게 될 것입니다.

만약 레거시 시스템을 마이크로 서비스로 분리해야 한다면 위의 방법을 통해 해결해보는 것을 생각해 보시면 좋을 것 같습니다.