지난 포스팅에서는 클라우드 네이티브 환경으로의 전환과 가상화 기술에 대해 간단히 살펴봤다.
이번 포스팅에서는 클라우드 네이티브의 핵심 요소 중 하나인 MSA(Microservices Architecture)에 대해서 나름대로 정리해보고자 한다!
기존의 모놀리식(Monolithic) 아키텍처는 하나의 큰 애플리케이션으로 구성되어 있는 걸 의미한다.
이러한 구성은 작은 규모의 프로젝트에서는 좋은 효용성을 보이지만, 프로젝트가 커질수록 유지보수와 예상치못한 사이드 이펙트가 발생할 수 있다는 문제가 존재한다.
위 사진처럼 블로그를 구성하는 4가지 기능이 있다고 가정해보자
Q. 만약 블로그의 일부 기능을 수정해야한다면 어떤 문제가 발생할까?
어느날 고객이 Comment의 기능을 업그레이드해달라는 요청을 한 상황을 생각해보자.
즉, 기존의 Comment를 New Comment로 변경을 해야하는 상황이 된 것이다.
이러한 상황에서 모놀리식 구조에서는 아래와 같은 문제를 생각하면서 수정을 해야한다:
전체 시스템 영향
- Comment 부분만 수정하고 싶어도, 전체 애플리케이션을 다시 빌드하고 배포해야 한다
- Nav Bar나 Search Bar 같은 관련 없는 기능에도 영향을 미칠 수 있다
- 만약, 수정한 New Comment에 문제가 있다면 모든 페이지에서 에러가 발생할 수 있다
리스크 증가
- 작은 변경이지만 전체 시스템에 영향을 주기 때문에 테스트 범위가 커진다
- 예상치 못한 버그가 다른 기능에서 발생할 수 있다
MSA는 이러한 모놀리식의 문제점들을 효과적으로 해결해준다.
위의 예시처럼 Comment 기능을 New Comment로 변경하고 싶다면, MSA에서는 아래 사진과 같이 해당 서비스만 교체해주면 된다.
이렇게 MSA를 도입하면 다음과 같은 장점들을 얻을 수 있다:
테스트와 배포가 쉬워진다!
- 각각의 서비스를 독립적으로 테스트할 수 있다
- 다른 서비스에 영향을 주지 않아 사이드 이펙트가 최소화된다
- 큰 변화도 부담 없이 시도할 수 있다
원하는 기술을 자유롭게 선택할 수 있다!
- 서비스별로 Java, Python 등 다양한 언어를 사용할 수 있다
- 각 서비스에 최적화된 데이터베이스를 선택할 수 있다
- 새로운 기술이 나오면 바로 적용해볼 수 있다
MSA의 장점을 제대로 활용하기 위해서는 한 가지 중요한 과제가 있다.
바로 효율적인 배포다. 그렇다면 왜 배포가 문제가 될까?
MSA에서는 하나의 큰 애플리케이션이 여러 개의 작은 서비스들로 나뉘어져있다.
우리가 생각해야할 것은 바로 각 서비스들이 독립적으로 개발되기 때문에, 서로 다른 개발 환경과 기술 스택을 가질 수 있다는 것이다.
예를 들어, 결제 서비스는 Java로, 검색 서비스는 Python으로 개발될 수 있다.
이렇게 독립적으로 개발된 여러 서비스들이 하나의 어플리케이션처럼 동작하기 위해서는 최소한 아래 두 가지의 목적을 달성해야 한다.
MSA 배포의 핵심 목표
- 각 서비스의 개발 환경 유지
- 서비스 간의 원활한 통신
위 조건을 갖추지 못한다면 막상 어플리케이션을 배포했으나, 특정 물리적 환경에서는 테스트와는 다르게 동작하지 않을수가 있다.
이를 해결하기 위해서는 각 서비스가 필요로 하는 모든 구성 요소들(애플리케이션 코드, 라이브러리, 환경 설정 등)이 정확히 갖춰져 있어야 한다.
바로 이 지점에서 컨테이너 기술이 중요한 해결책으로 등장하게 되는 것이다.
배포 문제를 해결하기 위한 핵심 기술로 '컨테이너'가 등장했다.
컨테이너는 어플리케이션과 그 실행에 필요한 모든 것(코드, 런타임, 시스템 도구, 라이브러리 등)을 하나의 패키지로 묶어주는 기술이다.
기존의 가상 머신은 각각 별도의 운영체제(OS)가 필요해 리소스 낭비가 있었다.
하지만, 컨테이너는 아래와 같은 특징으로 리소스 낭비 문제를 해결한다.
컨테이너의 특징
- 호스트 OS의 커널을 공유해서 사용
- 필요한 부분만 격리하여 실행 & 서비스 간의 격리를 통해 충돌을 방지
- 개발 환경과 동일한 실행 환경을 보장
- 결과적으로 리소스 효율성 극대화
컨테이너는 각 마이크로서비스와 그 실행 환경을 하나의 이미지로 패키징한다.
이렇게 구성된 여러개의 이미지를 사용해서 MSA를 구성하게 된다.
간단한 예시는 다음과 같다
이번 글에서는 MSA의 주요 특징과 이를 효과적으로 구현하기 위한 기술인 컨테이너에 대해서 살펴봤다.
MSA는 단순한 아키텍처 패턴을 넘어, 현대적인 애플리케이션 개발의 핵심 요소로 자리잡고 있는 상황이다.
특히 컨테이너 기술과 결합하여 더욱 강력한 클라우드 네이티브 환경을 만들어내고 있는 상황인 만큼, 관련 기술에 대한 지식을 쌓을 필요가 있어보인다.
(혹시라도 내용에 문제가 있다면 언제든지 답글로 말씀 부탁드립니다!)