아키텍처 디자인 패턴은 소프트웨어 시스템의 큰 구조와 조직을 설계하고 관리하기 위한 일련의 원칙과 모범 사례를 포함하는 디자인 패턴이다. 이러한 패턴은 소프트웨어 아키텍처를 개발하는 데 유용하며, 시스템의 다양한 구성 요소와 그들 간의 상호 작용을 조직화하고 최적화하는 방법을 제시한다.
많은 목표들을 나열했지만 결국 유지보수성과 성능을 최적화하기 위함이다. 그렇다면 아키텍처 디자인 패턴의 종류에 대해 알아보자.
아키텍처 디자인 패턴의 종류는 수 없이 많고 그 중 많이 쓰이는 것으로는 다음과 같다. MVC, MVP, MVVM, FLUX, Layered Architecture, Microservices Architecture, Event-Driven Architecture, Service-Oriented Architecture, Hexagonal Architecture, CQRS 각각의 특징을 가볍게 살펴보자.
MVC(Model-View-Controller): Model에서 데이터와 비즈니스 로직을 관리하고, View에서 사용자 인터페이스를 표시하고 사용자 입력을 받는다. Controller에서 사용자 입력을 처리하고 Model과 View간의 중재자 역할을 한다. 각각의 결합을 줄여 개발할 수 있다는것이 장점이다.
MVP(Model-View-Presenter): MVC와 유사하지만, Presenter는 View와 Model의 인스턴스를 가지고 있어 View와 Model간의 의존성이 없앤것이 특징이다.(Presenter를 통해서만 데이터 전달)
MVVM(Model-View-ViewModel): MVC 모델의 확장 버전으로 View와 View Model 사이에 데이터 흐름을 데이터 바인딩으로 처리해 View와 View Model 사이의 의존성을 없앤것이 특징이다.
FLUX: 단방향 데이터 흐름 아키텍처로, 데이터의 단일 소스(Store)에서 변경되며, 뷰는 이 데이터를 표시한다. 사용자 입력은 액션(Action)으로 전달되어 데이터 흐름을 제어하며 주로 Vuex, Redux같은 상태관련 라이브러리에 쓰인다.
Layered Architecture (계층화 아키텍처): 응용 프로그램을 여러 계층으로 나누어 각 계층별로 관심사를 분리해 특정 역할을 수행하도록 하는 패턴입니다. 대표적으로는 4계층 아키텍처가 있다. (Presentation Layer-요청받기, Business Logic Layer-요청받은 로직을 수행, Persistence Layer-데이터베이스 접근및 상호작용 수행, Data Access Layer- 데이터베이스 그 자체)
Microservices Architecture(MSA, 마이크로서비스 아키텍처): 응용 프로그램을 작은 독립적인 서비스로 분해하고, 각 서비스가 자체 데이터베이스 및 비즈니스 로직을 가지는 아키텍처 패턴.
Event-Driven Architecture (이벤트 주도 아키텍처): 이벤트와 메시지를 사용하여 서비스 간 상호 작용을 구현하는 패턴으로, 비동기적인 통신과 느슨한 결합을 강조한다. 이벤트가 감지되면 이벤트 처리 플랫폼(Apache Kafka 등...)이 이벤트를 비동기적으로 처리해 이벤트 소비자에게 전송한다. 주로 MSA같은 분산 아키텍처에 쓰인다.
Service-Oriented Architecture (SOA, 서비스 지향 아키텍처): 응용 프로그램의 기능을 독립적인 서비스로 분할하고, 이러한 서비스들을 재사용 가능한 구성 요소로 구축하는 아키텍처 패턴이다. MSA와 비슷하지만 다른점은 상대적으로 서비스를 중심으로 분할하기 때문에 배포와 확장이 MSA에 비해 조금더 느릴 수 있으며 데이터 베이스도 중앙화로 관리하는 경우가 많다고 한다.
Hexagonal Architecture (헥사고날 아키텍처): 응용 프로그램을 내부 도메인 로직과 외부 시스템 간의 인터페이스를 분리하여 설계하는 패턴이다. (내부 도메인 로직 -> 어댑터로 외부와 통신 -> 외부에 대한 지식X, 외부 시스템 -> 외부시스템 혹은 내부 시스템과 통신을 어댑터 인터페이스로 요청)
CQRS (Command and Query Responsibility Segregation): 읽기와 쓰기 모델을 분리하여 데이터를 쓰는 명령과 데이터를 읽는 쿼리를 처리하는 패턴이다. 간단히 얘기하면 CRUD에서 CUD와 R을 구분하는 패턴이다. non-CQRS에 비해 Read에서 데이터 일관성이 떨어질 수 있으나 데이터 처리를 최적화할 수 있다.