Files
2nd/10_Wiki/Topics/Architecture/Software_Architecture_Patterns.md
T

104 lines
16 KiB
Markdown

---
category: Unified
tags: [auto-consolidated, technical-documentation]
title: [[Software Architecture Patterns]]
last_updated: 2026-05-02
---
# [[Software Architecture Patterns]]
## 📌 Brief Summary
소프트웨어 아키텍처 패턴(Software Architecture Patterns)은 소프트웨어 시스템의 기본 구성 요소와 상호작용, 전반적인 레이아웃을 정의하는 청사진이자 고수준의 구조적 설계 지침입니다[1-3]. 이는 개발 과정에서 반복적으로 발생하는 설계 문제에 대해 검증되고 재사용 가능한 해결책을 제공하여, 시스템의 확장성, 유지보수성, 성능 및 보안을 보장합니다[1, 2, 4]. 아키텍처 패턴의 선택은 프로젝트의 예산, 리소스 할당, 개발 속도 등 소프트웨어 개발 생명주기(SDLC) 전반에 지대한 영향을 미치는 전략적 의사결정입니다[5-7].
---
> "코드를 작성하기 전에 지식과 기능의 '지도(Map)'를 먼저 그려라. 올바른 패턴 선택은 복잡성이라는 파도 앞에서 시스템을 지탱하는 가장 견고한 닻이 된다" — 소프트웨어 시스템의 구조적 문제를 해결하기 위해 반복적으로 사용되는 검증된 설계 원칙과 골격.
## 📖 Core Content
**1. 아키텍처 패턴의 전략적 역할 및 평가**
아키텍처 패턴은 단일 모듈 내의 문제를 해결하는 '디자인 패턴'과 달리 거시적인 시스템 레벨의 구조를 다룹니다[4, 8-10]. 완벽한 아키텍처는 존재하지 않으며 모든 아키텍처 결정에는 타협(Trade-off)이 수반됩니다[11, 12]. 따라서 ISO 25010과 같은 품질 모델을 기반으로 확장성, 성능, 유지보수성 등의 요구사항을 우선순위화하고, **ATAM(Architecture Tradeoff Analysis Method)**과 같은 기법을 통해 아키텍처가 비즈니스 목표를 어떻게 지원하는지 시나리오 기반으로 평가해야 합니다[12-16]. 의사결정의 이력은 **ADR(Architecture Decision Record)**로 명확히 문서화되어야 합니다[7, 17].
**2. 주요 아키텍처 패턴의 종류와 특징**
* **계층형 아키텍처 (Layered Architecture):** 시스템을 프레젠테이션, 비즈니스 로직, 데이터 액세스 등 수평적 계층으로 분할하여 '관심사의 분리'를 실현합니다[18-20]. 개발이 직관적이지만, 규모가 커질수록 변경이 어려워지고 성능 병목이 발생할 수 있습니다[21, 22].
* **마이크로서비스 아키텍처 (Microservices Architecture, MSA):** 거대한 애플리케이션을 도메인 주도 설계(DDD) 기반으로 분리하여, 독립적으로 배포 및 확장이 가능한 작은 서비스들의 집합으로 구축합니다[23-31]. 각 서비스는 독립적인 데이터베이스를 가지며 높은 자율성을 확보하지만 분산 시스템 관리가 복잡해집니다[31-33].
* **이벤트 기반 아키텍처 (Event-Driven Architecture, EDA):** 이벤트(상태 변화)를 생성하고 감지하는 방식으로 구성 요소들이 비동기적으로 상호작용합니다[34-36]. 중앙 통제 없는 **브로커(Broker)** 모델과 중앙에서 흐름을 조정하는 **메디에이터(Mediator)** 모델로 나뉘며, 실시간 데이터 처리와 높은 확장성이 필요한 시스템에 적합합니다[37, 38].
* **마이크로커널 아키텍처 (Microkernel / Plug-in Architecture):** 핵심 기능만 담은 코어 시스템과 특화된 기능을 제공하는 플러그인 컴포넌트로 분리됩니다[39-41]. 핵심 코드 변경 없이 유연하게 기능을 추가할 수 있어 IDE, 운영체제(OS), 브라우저 등에 주로 사용됩니다[41-43].
* **도메인 중심 아키텍처 (Hexagonal, Onion, Clean Architecture):** 비즈니스 로직을 아키텍처 중앙에 배치하고 외부 의존성(DB, UI 등) 방향을 안쪽으로 향하게 하는 의존성 역전을 적용합니다[44-46]. '포트와 어댑터'를 통해 외부 인프라 변경에도 핵심 비즈니스 로직을 완벽하게 보호합니다[46-48].
* **공간 기반 아키텍처 (Space-Based Architecture):** 데이터베이스 병목 현상을 제거하기 위해 인메모리 데이터 그리드(IMDG)와 같은 분산 공유 메모리를 사용하여 트래픽 급증을 처리하는 고성능 패턴입니다[49-52].
* **서버리스 아키텍처 (Serverless Architecture):** 클라우드 공급자가 서버 자원을 동적으로 할당하고 함수(Function) 단위로 코드를 실행하는 모델입니다[32, 53]. 트래픽 변동이 심한 애플리케이션에 매우 경제적입니다[32, 54].
* **모듈형 모놀리스 (Modular Monolith):** 단일 배포 단위를 유지하면서도 내부적으로는 도메인 경계를 엄격히 나누어 마이크로서비스의 장점(구조화)과 모놀리식의 장점(단순성)을 결합한 대안적 접근 방식입니다[55-58].
---
- **추출된 패턴:** "[[_뇌와 팔다리의 분리_ - 관심사의 분리 (Separation of Concerns)|Separation of Concerns]] and Structural [[Modularity|Modularity]]" — 시스템의 책임을 명확히 분리하여 변경의 파급 효과를 최소화하고, 특정 요구사항(확장성, 성능, 배포 속도 등)에 최적화된 컴포넌트 간 배치 방식을 결정하는 패턴.
- **주요 아키텍처 패턴:**
- **Layered (N-tier):** 역할을 수평으로 분리 (UI-[[business|business]]-Data). 가장 범용적이고 단순함.
- **Event-driven:** 비동기 이벤트를 통해 통신. 높은 확장성과 유연성 제공.
- **Microservices:** 비즈니스 단위로 서비스를 완전히 쪼개어 독립적 배포와 확장이 가능하게 함.
- **Microkernel (Plugin):** 핵심 코어에 기능을 추가/제거할 수 있는 플러그인 구조. 확장성 우수.
- **Hexagonal (Ports & Adapters):** 핵심 로직을 외부 환경(DB, UI 등)으로부터 고립시켜 테스트 용이성 극대화.
- **의의:** 개발팀이 동일한 설계 언어를 공유하게 하며, 초기 결정이 향후 시스템의 생존 여부와 비용에 결정적인 영향을 미치는 '소프트웨어의 뼈대' 구축 과정.
## ⚖️ Trade-offs & Caveats
* **분산 시스템의 복잡성 증대:** MSA와 EDA는 구성 요소 간 결합도를 낮추고 개별 확장성을 높여주지만, 네트워크 지연(Latency), 분산 트랜잭션 관리(예: Saga 패턴을 통한 최종 일관성 유지), 서비스 간 통신 장애 시의 대응(Circuit Breaker 적용) 등 운영 및 디버깅의 복잡성을 크게 높입니다[33, 36, 37, 59, 60].
* **콜드 스타트와 벤더 종속성:** 서버리스 아키텍처는 유휴 상태의 함수가 처음 실행될 때 응답 지연이 발생하는 콜드 스타트(Cold Start) 문제가 있으며, 특정 클라우드 벤더(AWS, Azure 등)의 인프라에 시스템이 강하게 종속(Vendor Lock-in)되는 위험이 존재합니다[58, 61-63].
* **오버엔지니어링(Over-engineering)의 위험:** 단순한 CRUD 기반의 애플리케이션이나 빠른 MVP 검증이 필요한 스타트업 프로젝트에 클린/헥사고날 아키텍처나 MSA를 도입하면, 초기 설정의 복잡성, 보일러플레이트 코드 증가, 급격한 학습 곡선으로 인해 오히려 개발 생산성과 시장 진입 속도를 저하시킬 수 있습니다[24, 64-66].
* **데이터 일관성과 동기화:** 공간 기반 아키텍처는 데이터베이스 병목을 제거하지만 대규모 분산 메모리 환경에서 데이터를 동기화하고 캐싱하는 작업이 매우 복잡하며 일시적인 불일치가 발생할 수 있습니다[55, 67]. 피어-투-피어(P2P) 아키텍처 역시 탈중앙화로 인해 데이터 일관성 및 보안 통제를 강제하기 어렵다는 단점이 있습니다[68, 69].
---
- **과거 데이터와의 충돌:** "무조건 마이크로서비스가 최고다"라는 유행에서 벗어나, 시스템의 규모와 팀의 역량에 맞춰 단순한 모놀리식(Monolithic)이나 모듈형 모놀리식(Modular Monolith)이 더 효율적일 수 있다는 실용주의적 접근이 다시 강조되고 있음.
- **정책 변화:** Antigravity 프로젝트는 핵심 에이전트 엔진은 마이크로커널 패턴으로 설계하여 기능을 유연하게 확장하고, 전체 서비스 배포는 독립성을 위해 마이크로서비스 지향적 패턴을 준수함.
## 🔗 Knowledge Connections
### Related Concepts
#### [아키텍처 평가 및 관리]
- [[ATAM (Architecture Tradeoff Analysis Method)]]
- 연결 이유: 아키텍처가 비즈니스 요구사항과 품질 속성(가용성, 보안, 성능 등)을 얼마나 잘 지원하는지 구체적인 시나리오를 바탕으로 평가하고, 타협점(Trade-offs)을 식별하는 표준 방법론이기 때문입니다[12, 13, 16].
- 이 개념을 통해 더 깊게 이해할 수 있는 부분: 아키텍처 결정 과정에서 성능과 보안 등 상충하는 품질 속성 간의 우선순위 결정과 위험(Risk)을 체계적으로 도출하는 방법을 이해할 수 있습니다.
- [[ADR (Architecture Decision Record)]]
- 연결 이유: 구조적 결정을 내릴 때 해당 결정의 컨텍스트, 채택한 대안과 거절한 이유, 장기적 결과를 기록하는 공식 문서화 기법이기 때문입니다[7, 17].
- 이 개념을 통해 더 깊게 이해할 수 있는 부분: 시간이 흐르고 조직이 변경되어도 아키텍처가 침식(Architecture Erosion)되지 않도록 기술적 의사결정의 일관성을 유지하는 운영 전략을 파악할 수 있습니다.
#### [분산 시스템 통신 및 트랜잭션 패턴]
- [[Saga Pattern]]
- 연결 이유: 마이크로서비스 아키텍처에서 각 서비스가 고유한 데이터베이스를 가질 때(Database per Service), 분산된 트랜잭션 처리를 로컬 트랜잭션의 연속적인 이벤트(최종 일관성)로 해결하는 필수 패턴이기 때문입니다[36, 70].
- 이 개념을 통해 더 깊게 이해할 수 있는 부분: ACID 트랜잭션을 포기하는 대신 대규모 분산 환경에서 어떻게 데이터의 정합성을 안전하게 보장하고 실패를 보상(Compensating Transaction)하는지 이해할 수 있습니다.
- [[CQRS (Command Query Responsibility Segregation)]]
- 연결 이유: 시스템의 상태를 변경하는 명령(Command)과 데이터를 조회하는 질의(Query)의 책임을 분리하여, 데이터 집약적인 애플리케이션의 읽기/쓰기 성능을 극대화하는 아키텍처 패턴이기 때문입니다[70, 71].
- 이 개념을 통해 더 깊게 이해할 수 있는 부분: 이벤트 소싱(Event Sourcing)이나 이벤트 기반 아키텍처(EDA)와 결합하여 데이터 모델을 어떻게 최적화하고 독립적으로 확장하는지 파악할 수 있습니다.
#### [설계 패러다임 및 방법론]
- [[DDD (Domain-Driven Design)]]
- 연결 이유: 시스템을 비즈니스 도메인 역량별로 분리하는 원칙을 제공하여, 마이크로서비스의 이상적인 경계(Bounded Context)를 식별하고 클린 아키텍처를 설계하는 근본적인 가이드를 제시하기 때문입니다[31, 72, 73].
- 이 개념을 통해 더 깊게 이해할 수 있는 부분: 기술적 복잡성이 아닌 비즈니스 규칙과 모델을 중심으로 아키텍처를 추상화하고 설계하는 본질적 접근법을 학습할 수 있습니다.
### Deeper Research Questions
- 마이크로서비스 아키텍처(MSA)에서 개별 서비스가 독립적인 데이터베이스를 사용할 때 발생하는 '데이터 일관성' 문제를 Saga 패턴과 Event Sourcing 패턴은 각각 어떤 원리로 해결하며 그 한계는 무엇인가?
- 이벤트 기반 아키텍처(EDA) 내의 브로커(Broker) 토폴로지와 메디에이터(Mediator) 토폴로지는 워크플로우 제어와 에러 복구 관점에서 어떤 결정적 차이와 트레이드오프를 갖는가?
- 서버리스(Serverless) 컴퓨팅 환경에서 함수 활성화 지연을 의미하는 콜드 스타트(Cold Start) 문제를 기술적으로 완화하고, 벤더 종속성(Vendor Lock-in) 리스크를 회피하기 위한 아키텍처 수준의 전략은 무엇인가?
- 초기 스타트업의 MVP 제품을 모놀리식 아키텍처로 빠르게 구축한 후, 비즈니스 성장에 따라 마이크로서비스 혹은 모듈형 모놀리스(Modular Monolith)로 안전하고 점진적으로 전환하는 리팩토링 전략(예: Strangler Fig Pattern)은 어떻게 적용되는가?
- 도메인 중심 아키텍처(Hexagonal, Clean Architecture)의 '포트와 어댑터' 개념을 레거시 시스템 현대화(Modernization) 작업에 적용할 때 실무적으로 겪게 되는 보일러플레이트 코드 증가와 성능 오버헤드 문제는 어떻게 타협점을 찾아야 하는가?
### Practical Application Contexts
- **Implementation:** 비즈니스 핵심 로직과 외부 인프라(DB, 웹 프레임워크)의 강한 결합을 끊어내야 할 때, 헥사고날 아키텍처를 적용하여 포트와 어댑터를 구현함으로써 추후 데이터베이스나 외부 API 제공자가 변경되더라도 도메인 코드의 수정을 방지합니다[46-48].
- **System Design:** 블랙프라이데이 등 예측 불가한 극단적 트래픽 스파이크가 예상되는 이커머스나 스트리밍 플랫폼 설계 시, 상태를 분산 인메모리에 저장하는 공간 기반 아키텍처(Space-based)나 이벤트 기반 시스템을 설계하여 동적 확장을 지원합니다[49-51, 74, 75].
- **Operation / Maintenance:** 개발 조직의 규모가 커지고 잦은 퇴사/입사가 발생할 때, 과거의 기술적 선택(예: 특정 DB 도입, 아키텍처 분리 기준)을 ADR(Architecture Decision Record)로 문서화하여 시스템 유지보수와 신규 인력 온보딩을 위한 단일 진실 공급원(Single Source of Truth)으로 운영합니다[7, 17, 76, 77].
- **Learning Path:** 주니어 개발자가 전통적인 계층형 아키텍처(N-Tier, MVC)를 통해 기초적인 관심사 분리를 학습한 뒤, 도메인 중심 설계(DDD), 메시지 브로커를 활용한 비동기 통신(EDA), 최종적으로 복잡한 클라우드 네이티브 마이크로서비스 설계(MSA) 순으로 분산 시스템 개념을 확장해 나가는 로드맵을 구성합니다.
- **My Project Relevance:** 현재 소규모 인력과 예산으로 시작하는 프로젝트라면 마이크로서비스의 복잡성을 피하면서도 향후 확장이 용이하도록 '모듈형 모놀리스(Modular Monolith)' 패턴을 1차적으로 채택하여 시스템의 구조적 안전성과 배포 효율성을 극대화합니다[56-58].
### Adjacent Topics
- [[Micro Frontends]]
- 확장 방향: 백엔드에서 출발한 마이크로서비스(MSA)의 철학과 아키텍처 원리를 프론트엔드 영역까지 확장하여, 대규모 웹 애플리케이션의 UI 컴포넌트를 독립적인 팀이 개발하고 배포할 수 있게 만드는 프론트엔드 통합 아키텍처를 연구합니다.
- [[Service Mesh]]
- 확장 방향: 마이크로서비스 환경에서 수많은 서비스 간 통신의 복잡성(서비스 디스커버리, 로드 밸런싱, 트래픽 라우팅, 보안 등)을 애플리케이션 코드에서 분리하여 인프라(사이드카 프록시 등)에서 전담하게 하는 분산 통신 제어 기술을 조사합니다[78-81].
---
*Last updated: 2026-05-02*
---
- [[Service-oriented-Architecture|Service-oriented-Architecture]], Microservices-Foundations, [[Scalability-in-AI-Systems|Scalability-in-AI-Systems]], API-Design-[[Principles|Principles]]
- **Raw Source:** 10_Wiki/Topics/AI/Software-Architecture-Patterns.md