01.모놀리식 지옥

Part 1. 모놀리식 지옥에서 벗어나라

모놀리식 아키텍처의 장점

  • 개발이 간단하다: IDE 등 개발 툴은 단일 애플리케이션 구축에 초점이 맞추어져 있다.

  • 애플리케이션을 쉽게 변경할 수 있다: 코드, DB 스키마를 변경해서 빌드/배포하기 용이하다.

  • 테스트하기 쉽다: 개발자가 애플리케이션을 띄우고, REST API를 호출하고, 셀레늄으로 UI를 시험하는 종단 간 테스트를 작성합니다.

  • 배포하기 쉽다: 개발자는 서버에 접속하여 톰캣 설치 경로에 WAR 파일을 복사하면 그만입니다.

  • 확장하기 쉽다: 부하 분산기 뒷면에 애플리케이션 인스턴스를 여러 개 실행합니다.

모놀리식 아키텍처의 단점

  • 너무 복잡해서 개발자가 주눅 들다.

  • 개발이 더디다.

  • 커밋부터 배포에 이르는 길고 험난한 여정.

  • 확장하기 어렵다.

  • 확실하게 전달하기 어렵다.

  • 갈수록 한물간 기술 스택에 발목이 붙잡히다.

마이크로서비스 아키텍처의 장점

  • 크고 복잡한 애플리케이션을 지속적으로 전달/배포할 수 있다.

    • 자동하 테스트

    • 독립적인 배포

    • 여러 기술 조직의 꾸림

  • 서비스 규모가 작아 관리하기 쉽다.

  • 서비스를 독립적으로 배포/확장할 수 있다.

  • 마이크로서비스 아키텍처 덕분에 팀이 자율적으로 움직인다.

  • 결함 격리가 잘 된다.

  • 새로운 기술을 실험하고 도입하기 쉽다.

마이크로서비스 아키텍처의 단점

  • 딱 맞는 서비스를 찾기 쉽지 않다.

  • 분산 시스템은 너무 복잡해서 개발, 테스트, 배포가 어렵다.

  • 여러 서비스에 걸친 기능을 배포할 때에는 잘 조정해야 한다.

  • 마이크로서비스 아키텍처 도입 시점을 결정하기 어렵다.

마치며

  • 모놀리식 아텍처 패턴은 애플리케이션을 하나의 배포 단위로 구성합니다.

  • 마이크로서비스 아키텍처 패턴은 독립적으로 배포 가능하면서 자체 DB를 보유한 서비스들로 시스템을 분해합니다.

  • 단순한 애플리케이션은 모놀리식 아키텍처가, 크고 복잡한 애플리케이션은 마이크로서비스 아키텍처가 더 적합한 선택입니다.

  • 마이크로서비스 아키텍처를 채택하면 자율적인 소규모 팀들이 작업을 병행할 수 있어서 소프트웨어 개발 속도가 빠릅니다.

  • 마이크로서비스 아키텍처는 만병통치약이 아닙니다. 복잡성을 비록하여 중요한 단점도 있습니다.

  • 마이크로서비스 아키텍처 패턴 언어는 마이크로서비스 아키텍처로 애플리케이션을 설계할 때 유용한 패턴들의 모음집입니다. 패턴 언어는 마이크로서비스 아키텍처 도입 여부 결정 시 유용하며, 마이크로서비스 아키텍처를 효과적으로 적용하는 충실한 안내자입니다.

  • 소프트웨어 전달 속도를 높이려면 마이크로서비스 아키텍처만으로는 부족합니다. 소프트웨어를 성공적으로 개발하려면 데브옵스 및 자율적인 소규모 팀들이 있어야 합니다.

  • 마이크로서비스를 검토할 때 인간적인 측면도 고려해야 합니다. 직원들이 느끼는 감정도 충분히 반영되어야 성공적인 전환이 가능합니다.

Part 2. 분해 전략

마이크로서비스 아키텍처란 무엇인가?

마이크로서비스 아키텍처의 핵심 사상은 기능 분해

  • 대규모 단일 애플리케이션을 개발하는 대신 애플리케이션을 여러 서비스로 구정하자는 의미

소프트웨어 아키텍처의 정의와 중요성

소프트웨어 아키텍처의 정의

컴퓨팅 시스템의 소프트웨어 아키텍처는 소프트웨어 엘리먼트와 그들 간의 관계, 그리고 이 둘의 속성으로 구성된 시스템을 추론하는 데 필요한 구조의 집합이다.

  • 핵심은 애플리케이션 아키텍처가 여러 파트(엘리먼트)로의 분해와 이런 파트 간의 관계(연관성)이라는 것

분해가 중요한 이유

  • 업무와 지식의 분리로 전문 지식을 보유한 사람들이 함께 생산적으로 애플리케이션 작업을 할 수 있다.

  • 소프트웨어 엘리먼트가 어떻게 상호 작용하는지 밝힌다.

.

소프트웨어 아키텍처의 4+1 뷰 모델

  • 논리 뷰: 개발자가 작성한 소프트웨어 엘리먼트. 객체지향 언어라면 클래스, 패키지가 해당되며 결국 상속, 연관, 의존 등 클래스와 패키지의 관계를 말합니다.

  • 구현 뷰: 빌드 시스템의 결과물, 모듈과 컴포넌트로 구성됩니다. 자바에서 모듈은 보통 JAR 파일, 컴포넌트는 WAR 파일이나 실행 가능한 JAR 파일입니다. 모듈 간 디펜던시와 컴포넌트/모듈 간 조합 관계도 이 뷰에 포함됩니다.

  • 프로세스 뷰: 런타임 컴포넌트. 각 엘리먼트는 개별 프로세스고, IPC는 프로세스 간 관계를 나타냅니다.

  • 배포 뷰: 프로세스가 머신에 매핑되는 방법. 이 뷰의 엘립먼트는 머신 및 프로세스고, 머신 간의 관계가 바로 네트워킹입니다. 프로세스와 머신 사이의 관계도 이 뷰에서 기술됩니다

아키텍처 스타일 개요

아키텍처 스타일은 체계적인 조직 관점에서 시스템 군을 정의한다.

아키텍처 스타일은 그 스타일로 만든 인스턴스에서 사용 가능한 컴포넌트와 커넥터의 용어집, 그리고 이들을 조합할 수 있는 제약 조건을 결정한다.

계층화 아키텍처 스타일

  • 계층마다 명확히 정의된 역할을 분담하며, 계층 간 디펜던시는 아키텍처로 제한

  • 어떤 계층은 바로 하위에 있는 계층에만 의존하거나, 하위에 위치한 어느 한 계층에 의존

  • 3계층 아키텍처

    • 표현 계층: 사용자 인터페이스 또는 외부 API가 구현된 계층

    • 바즈니스 로직 계층: 비즈니스 로직이 구현된 계층

    • 영속화 계층: DB 상호 작용 로직이 구현된 계층

  • 계층화 아키텍처의 문제점

    • 표현 계층이 하나뿐이다.

    • 영속화 계층이 하나뿐이다.

    • 비즈니스 로직 계층을 영속화 계층에 의존하는 형태로 정의한다.

육각형 아키텍처 스타일

  • 논리 뷰를 비즈니스 로직 중심으로 구성하는 계층화 아키텍처 스타일의 대안

  • 비즈니스 로직에는 하나 이상의 포트(자바라면 인터페이스)가 존재하고 포트 종류는 인바운드/아웃바운드 두 가지

    • 인바운드 포트: 비즈니스 로직이 표출된 API로 외부 애플리케이션은 이 API를 통해 비즈니스 로직을 호출(ex. 서비스 인터페이스)

    • 아웃바운드 포트: 비즈니스 로직이 외부 시스템을 호출하는 방법에 관한 것(ex. 리포지토리 인터페이스)

  • 어댑터도 포트처럼 인바운드/아웃바운드 두 종류가 존재

    • 인바운드 어댑터: 외부에서 들어온 요청을 인바운드 포트를 호출해서 처리(ex. MVC Controller, Message Broker Client)

    • 아웃바운드 어댑터: 비즈니스 로직에서 들어온 요청을 외부 애플리케이션/서비스를 호출해서 처리(ex. DAO Class, Proxy Class, 이벤트 발행)

  • 육각형 아키텍처 스타일의 가장 큰 장점은 비즈니스 로직에 있던 표현/데이터 접근 로직이 어댑터와 분리되었기 때문에 비즈니스 로직이 표현/데이터 접근 로직 어디에도 의존하지 않는다는 점

    • 비즈니스 로직만 따로 테스트하기 쉽고, 현대 애플리케이션 아키텍처(마이크로서비스)를 좀 더 정확하게 반영 가능

마이크로서비스 아키텍처는 일종의 아키텍처 스타일이다

모놀리식 아키텍처: 애플리케이션을 실행/배포 가능한 단일 컴포넌트로 구성한 아키텍처 스타일

마이크로서비스 아키텍처: 애플리케이션을 느슨하게 결합된, 독립적으로 배포 간으한 여러 서비스로 구성한 아키텍처 스타일

Last updated