이쪽 업종에서 일하는 분들이라면 Monolith으로 구현되어 있는 레거시 시스템을 마이크로서비스로 마이그레이션 하고자 하는 Needs가 있을 것이다.
비즈니스를 분석해서 새롭게 만드는 것이 가장 좋은 방법이겠지만, 레거시와 병행해서 개선을 해야 할 상황도 존재하기에 새롭게 만드는 것이 여의치 않은 경우도 많을 것이다.
나도 레거시 시스템을 분석하면서 어떻게 구조 개선을 할 것인지에 대한 고민이 있고, 새롭게 코드를 짜던 기존 코드를 마이그레이션을 하던 가장 유리한 방식을 채택할 계획이다.
위 관점에서 Dzone에 도움이 되는 글이 있길래, 번역을 하였다.
모놀리스 아키텍처
모놀리스 애플리케이션은 복잡도가 큰 단일 애플리케이션이다. 또한 유지 관리가 어렵고 잦은 배포를 하기가 쉽지 않다. 한 곳에 장애가 발생하면 전체 시스템이 다운 될 수 있는 확률도 높다.
모놀리스 아키텍처의 특징은 아래와 같다.
- 모든 유형의 브라우저, 모바일 앱등을 제공하는 큰 단일 애플리케이션이다.
- 매우 복잡하고 거대한 구조와 파일을 지니고 있다.
- 모놀리스 애플리케이션은 유지 보수가 어렵다. (코딩 표준, 버그 수정등의 측면)
- 대규모 애플리케이션을 자주 배포할 수 없기 때문에 지속적인 개발이 어려울 수 있다.
- 애플리케이션 확장이 어려울 수 있다.
- Scale-out이 매우 어렵다.
- 개발팀은 모놀리스 애플리케이션을 확장하는 것이 어렵다고 생각한다. 애플리케이션이 일정 크기를 넘어서면 단일팀으로는 유지 관리가 어렵기에 모듈 및 서비스를 현명하게 분할해야 하고 각 모듈간 간섭으로 인해 개발자가 폭넓게 이해를 해야 하기에 시간과 비용이 많이 소요된다. 이런 부분들이 생산성에도 영향을 미친다.
- 기술의 병목 현상이 존재한다. 애플리케이션이 특정 기술에서 개발을 시작하면 구식이 되어도 최초 사용한 기술을 고수해야 한다.
- 애플리케이션을 빌드하거나 배포하는데 많은 시간이 소요된다. 이에 개발자는 많은 시간을 할애해야 한다.
- 애플리케이션을 시작시 많은 시간이 걸리기에 배포에 영향을 미치고, 이는 생산성에 영향을 준다.
위의 이미지는 단일 애플리케이션에 모든 기능이 포함된 일반적인 아키텍처를 의미한다.
마이크로 서비스란?
서비스에 집중하고 각 서비스가 독립적으로 되는 방식이다. 전체 시스템을 조각으로 나누어 서비스를 개발하는 방법이다. 간단히 말해서 유지 관리가 어려운 하나의 거대한 시스템을 독립적이고 유지 관리가 가능한 더 작은 서비스로 나누는 것이다.
마이크로 서비스의 주요 특징은 다음과 같다.
- 각 서비스는 느슨하게 결합되어야 한다.
- 각 서비스는 유지 보수가 용이하고 확장 가능해야 한다.
- 각 서비스는 독립적으로 배포할 수 있어야 한다.
- 각 서비스는 비즈니스 기능에 따라 경계를 명확히 해야 한다.
- 각 서비스는 소규모 팀이 소유해야 한다.
아래 이미지를 보면 자체 데이터베이스가 있는 다양한 유형의 서비스가 있음을 식별 할 수 있다.
위 그림에서 각 서비스는 서로 간섭하지 않고 작동하는 여러 마이크로서비스로 나뉜다. 이것은 각 서비스가 다른 마이크로서비스와의 간섭을 최소화하면서 작동할 수 있는 하나의 작은 모듈이고 각 서비스가 책임을 가지며 개별적으로 배포할 수 있고 소규모 팀이 소유할 수 있는 마이크로 서비스 아키텍처의 모습이다.
레거시 애플리케이션을 마이크로서비스로 마이그레이션
모놀리스 애플리케이션을 마이크로서비스로 마이그레이션 하는 방법에는 두 가지가 존재한다.
- 별도의 마이크로서비스에서 새로운 기능을 구현
- 기존 모놀리스 코드 기반에서 새 마이크로서비스를 추출
단일 모놀리스 애플리케이션이 있는 경우 별도의 데이터베이스와 기능을 포함하는 마이크로서비스에서 새로운 기능을 개발해야 한다. 이 프로세스에서 모놀리스 애플리케이션의 데이터를 원하는 경우 모놀리스 애플리케이션 내부에 상대 API를 빌드하거나 제공할 수 있는 독립형 애플리케이션을 만들어야 한다.
이것을 모놀리스와 마이크로서비스 사이의 중재자가 될 Glue라고 한다. 이 후 개발자는 시간이 있을 때 모놀리스에서 새로운 마이크로서비스로 모듈을 이동할 수 있다. 일정 시간이 지나면 모놀리스 애플리케이션 없이 마이크로서비스만 가질 수 있게된다.
하나의 식품 주문 및 배달 관리 모놀리스 애플리케이션이 있다고 가정하자. 일부 기능을 마이크로서비스로 추출하여 해당 애플리케이션을 마이크로서비스로 만들려고 한다. 아래 그림은 모놀리스 애플리케이션에서 일부 기능을 마이크로서비스로 변환한 것이다.
1.먼저 모놀리스 애플리케이션 내에서 코드를 분할한다. 즉, 코드를 느슨하게 결합된 코드와 동일한 모놀리스 애플리케이션내에 위치한 주문 코드 및 배송 코드를 별도로 분할한다.
2.데이터베이스를 분할하고 추출된 서비스의 데이터베이스를 분리한다. 이때 접착제를 추가해야 한다. 즉, 개발자는 두 베이스베이스간에 동기화할 계획을 가지고 만들어야 한다. Trigger 또는 코드로 관리할 수 있다.
3.분리할 기능에 대한 별도 서비스를 정의한다. 해당 모듈에 대해 별도의 서비스를 만든다. (아래의 예저는 배송관리이다.)
4.Extracted Service를 독립적으로 사용한다. API 게이트웨이를 이용해 독립적으로 만들 수 있다.
5.기존 모놀리스 애플리케이션에서 전달 관리 코드를 제거한다.
끝으로
위 단계를 따르면 일반적인 모놀리스 애플리케이션을 마이크로서비스 기반 아키텍처로 마이그레이션 할 수 있다.